/*config*/
var monthname = new Array("Januar", "Februar", "März", "April", "Mai", "Juni", "Juli","August", "September", "Oktober", "November", "Dezember");
var weekday = new Array("Mo","Di","Mi","Do","Fr","Sa","So");
var prev_month_title="voriger Monat";
var next_month_title="nächster Monat";
var prev_year_title="voriges Jahr";
var next_year_title="nächstes Jahr";
var field_bg_neutral="white";
var field_bg_ok="#CFFFD5";
var field_bg_error="#FFB2B2";
var kalender_bg_today="#55f";
/*end config*/

var DieserTag,DieserMonat,DiesesJahr;
var id_mouse_on_table='';
var prevent_show=false;

function create_kalender(id){
    init_field(id);
    write_table(id);
    kalender(id,DiesesJahr,DieserMonat);
    document.getElementById(id+"_table").onclick = table_click_event;
}
function write_field(id,value,attributes){
    document.write('<input id="'+id+'" type="text" value="'+value+'" style="background-color:'+field_bg_neutral+'" onblur="handle_blur(\''+id+'\')" onclick="show_kal(\''+id+'\')" onfocus="show_kal(\''+id+'\')" '+attributes+' />');
}
function init_field(id){
    document.getElementById(id).onclick=function(e){show_kal(id);}
    document.getElementById(id).onfocus=function(e){show_kal(id);}
    document.getElementById(id).onblur=function(e){handle_blur(id);}
    document.getElementById(id).onkeydown = field_key_event;
}
function show_kal(id){
    if(prevent_show){
        prevent_show=false;
        return;
    }
    var date_field=isDate(id);
    if(date_field){
        var input=date_field.split('.');
        kalender(id,input[2],input[1]);
    }
    document.getElementById(id+'_table').style.display="block";
}
function handle_blur(id){
    if(id_mouse_on_table==id){return;}
    close_kal(id);
    correct_date_field(id);
    prevent_show=false;
}
function table_mouseover(id){
    id_mouse_on_table=id;
}
function table_mouseout(id){
    id_mouse_on_table='';
}
function close_kal(id){
    document.getElementById(id+'_table').style.display="none";
}
function field_key_event(e){
    e = e || window.event;
    var usrkeycode=e.which || e.keyCode;
    var id=this.id.split('_');
    if(usrkeycode==27 || usrkeycode==9){
        close_kal(id[0]);
    }
}
function table_click_event(e){
    e = e || window.event;
    var target=e.target || e.srcElement;
    if(target.nodeName.toUpperCase()!='A' || target.nodeName.toUpperCase()!='EM'){
        prevent_show=true;
        document.getElementById(this.id).focus();
    }
}
function write_table(id){
    document.write('<div><table id="'+id+'_table" class="kalender" style="display:none" onmouseout="table_mouseout(\''+id+'\')" onmouseover="table_mouseover(\''+id+'\')">');
    document.write('<thead>');
    document.write('<tr><th><a href="javascript:change_kal(\''+id+'\',\'prev_year\')" title="'+prev_year_title+'">&larr;</a></th>');
    document.write('<th id="'+id+'_year" colspan="5">Jahr</th>');
    document.write('<th><a href="javascript:change_kal(\''+id+'\',\'next_year\')" title="'+next_year_title+'">&rarr;</a></th></tr>');
    document.write('<tr><th><a href="javascript:change_kal(\''+id+'\',\'prev_month\')" title="'+prev_month_title+'">&larr;</a></th>');
    document.write('<th id="'+id+'_month" colspan="5">Monat<input type="hidden" value="" /></th>');
    document.write('<th><a href="javascript:change_kal(\''+id+'\',\'next_month\')" title="'+next_month_title+'">&rarr;</a></th></tr>');
    document.write('<tr>');
    for(var i=0;i<7;i++){document.write('<th>'+weekday[i]+'</th>');}
    document.write('</tr>');
    document.write('</thead>');
    document.write('<tbody id="'+id+'_tbody">');
    for(var i=1;i<=6;i++){
        document.write('<tr>');
        for(var j=1;j<=6;j++){
            document.write('<td>&nbsp;</td>');
        }
        document.write('<td><em>&nbsp;</em></td></tr>');
    }
    document.write('</tbody></table></div>');
}
function kalender(id,Jahr,Monat){
    create_FTag(Jahr);
    document.getElementById(id+'_year').firstChild.data=Jahr;
    document.getElementById(id+'_month').firstChild.data=monthname[Monat-1];
    var month_number=document.createAttribute("value");
    month_number.nodeValue=Monat;
    document.getElementById(id+'_month').childNodes[1].setAttributeNode(month_number);

    var Zeit = new Date(Jahr, Monat - 1, 1);
    var Start = Zeit.getDay();
    if (Start > 0) {Start--;}
    else {Start = 6;}
    var Stop = 31;
    if (Monat == 4 || Monat == 6 || Monat == 9 || Monat == 11){--Stop;}
    if (Monat == 2) {
        Stop = Stop - 3;
        if (Jahr % 4 == 0){Stop++;}
        if (Jahr % 100 == 0){Stop--;}
        if (Jahr % 400 == 0){Stop++;}
    }
    var Tageszahl = 1;
    for (var i = 0; i <= 5; i++) {
        for (var j = 0; j <= 5; j++) {
            if ((i == 0) && (j < Start)) {clear_cell(id,i,j);}
            else {
                if (Tageszahl > Stop) {clear_cell(id,i,j);}
                else {
                    if ((Jahr == DiesesJahr) && (Monat == DieserMonat) && (Tageszahl == DieserTag)) {
                        write_cell(id,i,j,Tageszahl,Monat,Jahr);
                        set_attribute(id,i,j);
                    }
                    else {
                        write_cell(id,i,j,Tageszahl,Monat,Jahr);
                    }
                Tageszahl++;
                }
            }
        }
        if (Tageszahl > Stop) {
            clear_cell(id,i,j);
        }
        else {
            if ((Jahr == DiesesJahr) && (Monat == DieserMonat) && (Tageszahl == DieserTag)) {
                write_cell(id,i,j,Tageszahl,Monat,Jahr,1);
                set_attribute(id,i,j);
            }
            else {write_cell(id,i,j,Tageszahl,Monat,Jahr,1);}
        Tageszahl++;
        }
    }
}
function clear_cell(id,i,j){
    var node=document.getElementById(id+'_tbody').childNodes[i].childNodes[j].firstChild;
    if(node){
        document.getElementById(id+'_tbody').childNodes[i].childNodes[j].removeChild(node);
    }
    document.getElementById(id+'_tbody').childNodes[i].childNodes[j].style.backgroundColor="transparent";
}
function write_cell(id,i,j,Tageszahl,Monat,Jahr,lastcolumn){
    var cell=document.createElement("a");
    var content=document.createTextNode(Tageszahl);
    var Feiertag=ist_Feiertag(Jahr,Monat,Tageszahl);
    if(Feiertag!='no'){
        var strong=document.createElement("strong");
        var title=document.createAttribute("title");
        title.nodeValue=FTag[Feiertag][1];
        strong.setAttributeNode(title);
        strong.appendChild(content);
        cell.appendChild(strong);
    }
    else{
        if(lastcolumn){
            var em=document.createElement("em");
            em.appendChild(content);
            cell.appendChild(em);
        }
        else{cell.appendChild(content);}
    }
    var href = document.createAttribute("href");
    href.nodeValue="javascript:date_to_field(\'"+id+"\',"+Tageszahl+","+Monat+","+Jahr+")";
    cell.setAttributeNode(href);
    clear_cell(id,i,j);
    document.getElementById(id+'_tbody').childNodes[i].childNodes[j].appendChild(cell);
}
function set_attribute(id,i,j){
    document.getElementById(id+'_tbody').childNodes[i].childNodes[j].style.backgroundColor=kalender_bg_today;
}
function date_to_field(id,day,month,year){
    document.getElementById(id).value=day+'.'+month+'.'+year;
    document.getElementById(id).style.backgroundColor=field_bg_ok;
    prevent_show=true;
    close_kal(id);
    document.getElementById(id).focus();
}
function change_kal(id,mode){
    var month=document.getElementById(id+'_month').childNodes[1].getAttribute("value");
    var year=document.getElementById(id+'_year').firstChild.nodeValue;
    year=parseInt(year);
    month=parseInt(month);
    if(mode=="next_year"){
        new_month=month;
        new_year=year+1;
    }
    if(mode=="prev_year"){
        new_month=month;
        new_year=year-1;
    }
    if(mode=="prev_month"){
        new_month=month-1;
        new_year=year;
        if(new_month==0){
            new_month=12;
            new_year=year-1;
        }
    }
    if(mode=="next_month"){
        new_month=month+1;
        new_year=year;
        if(new_month==13){
            new_month=1;
            new_year=year+1;
        }
    }
    kalender(id,new_year,new_month);
    prevent_show=true;
    document.getElementById(id).focus();
}
function correct_date_field(id){
    if(document.getElementById(id).value.length==0){
        document.getElementById(id).style.backgroundColor=field_bg_neutral;
    }
    else{
        corr_date=guess_date(id);
        if(corr_date){
            document.getElementById(id).value=corr_date;
            document.getElementById(id).style.backgroundColor=field_bg_ok;
        }
        else{document.getElementById(id).style.backgroundColor=field_bg_error;}
    }
}
function guess_date(id){
    var input=get_field_value(id);
    var now=new Date();
    if(input[2]){
        if(input[2].length>3){
            var y=check_year(input[2]);
            if(!y){y=now.getFullYear();}
        }
        else{
            y=parseFloat(input[2]);
            if(y<100){y+=2000;}
        }
    }
    else{y=now.getFullYear();}
    input[2]=y;
    if(!input[1]){input[1]=1+now.getMonth();}
    return check_date(input);
}
function isDate(id){
    var input=get_field_value(id);
    return check_date(input);
}
function check_date(input){
    var y=check_year(input[2]);
    if(!y){return;}
    var m=check_month(input[1]);
    if(!m){return;}
    var d=check_day(input[0],m,y);
    if(!d){return;}
    return d+'.'+m+'.'+y;
}
function check_year(y){
    y=parseFloat(y);
    if(y>=1583){return y;}
}
function check_month(m){
    m=parseFloat(m);
    if(m<13 && m>0){return m;}
}
function check_day(d,m,y){
    d=parseFloat(d);
    if(d>31 || d<1){return;}
    if ((m == 4 || m == 6 || m == 9 || m == 11)&&(d>30)){return;}
    if (m == 2) {
        var max = 28;
        if (y % 4 == 0){max++;}
        if (y % 100 == 0){max--;}
        if (y % 400 == 0){max++;}
        if(d>max){return;}
    }
    return d;
}
function get_field_value(id){
    var input=document.getElementById(id).value;
    return input.split('.');
}
//Feiertage mit festem Datum new Array(Tag,Monat,Name)
var FFeiertg=new Array()
FFeiertg[0]=new Array(1,5,'Tag der Arbeit');
FFeiertg[1]=new Array(3,10,'Tag der deutschen Einheit');
FFeiertg[2]=new Array(25,12,'1. Weihnachtstag');
FFeiertg[3]=new Array(26,12,'2. Weihnachtstag');
FFeiertg[4]=new Array(1,1,'Neujahr');
//Osterabhaengige Feiertage new Array(Anzahl Tage nach Ostersonntag,Name)
var OFeiertg=new Array()
OFeiertg[0]=new Array(-2,'Karfreitag');
OFeiertg[1]=new Array(0,'Ostersonntag');
OFeiertg[2]=new Array(1,'Ostermontag');
OFeiertg[3]=new Array(39,'Christi Himmelfahrt');
OFeiertg[4]=new Array(49,'Pfingstsonntag');
OFeiertg[5]=new Array(50,'Pfingstmontag');
OFeiertg[6]=new Array(60,'Fronleichnam');
function create_FTag(year){
    FTag=new Array();
    for(var i=0;i<FFeiertg.length;i++){
        var dof=day_of_year(year,FFeiertg[i][1],FFeiertg[i][0]);
        FTag[i]=new Array(dof,FFeiertg[i][2]);
    }
    var easter_array=OsterSonntag(year);
    var easter_sunday=day_of_year(easter_array[0],easter_array[1],easter_array[2]);
    for (i=0;i<OFeiertg.length;i++){
        FTag.push(new Array(easter_sunday+OFeiertg[i][0],OFeiertg[i][1]));
    }
}
function ist_Feiertag(year,month,day){
    var dof=day_of_year(year,month,day);
    var result='no';
    for(var i=0;i<FTag.length;i++){
        if(FTag[i][0]==dof){
            result=i;
            break;
        }
    }
    return result;
}
function day_of_year(year,month,day){
    this_date=new Date(year,month-1,day);
    date_1=new Date(year,0,1);
    return Math.round((this_date.getTime()-date_1.getTime())/(1000*3600*24));
}
function OsterSonntag(Jahr)
{
    var a = Jahr % 19; 
    var b = Jahr % 4; 
    var c = Jahr % 7; 
    var d = Math.floor(( ( (Jahr / 100) * 8 ) + 13 ) / 25 - 2); 
    var e = Math.floor(Jahr / 100) - Math.floor(Jahr / 400) - 2; 
    var f = (15 + e - d) % 30; 
    var g = (6 + e) % 7; 
    var h = (19 * a + f) % 30; 
    var i = h; 
    if (h == 29) { i = 28; }
    if ( (h == 28) && (a > 10) ) { i = 27; }
    var j = ( (2 * b) + (4 * c) + (6 * i) + g ) % 7; 
    var OSTERN_GAUSS = i + j + 22; 
    var Tag;
    var Monat;
    if (OSTERN_GAUSS>31){
        Tag=OSTERN_GAUSS-31;
        Monat=4;    
    }
    else{
        Tag=OSTERN_GAUSS;
        Monat=3;
    }
    return new Array(Jahr,Monat,Tag);
}
