﻿var __CalendarClassName="aui_calendar";
var stringCalendarWeekDay=new Array(new Array("Su","Mo","Tu","We","Th","Fr","Sa"),
                                    new Array("日","一","二","三","四","五","六"),
                                    new Array("月","火","水","木","金","土","日"),
                                    new Array("Mo","Di","Mi","Do","Fr","Sa","So"));
var stringCalendarMonth  =new Array(new Array("January","February","March","April","May","June","July","August","September","October","November","December"),
                                    new Array("年一月","年二月","年三月","年四月","年五月","年六月","年七月","年八月","年九月","年十月","年十一月","年十二月"),
                                    new Array("年一月","年二月","年三月","年四月","年五月","年六月","年七月","年八月","年九月","年十月","年十一月","年十二月"),
                                    new Array("Januar", "Februar", "M\u00E4rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"));
                                    
                                    
var constDayofMonth=new Array(31,31,29,31,30,31,30,31,31,30,31,30,31);

var _CalendarSelectPool=new Array();
var _CalendarEnablePool=new Array();



function setProperty(objectName,propertyName,value)
{
    var d=document.getElementById(objectName+"_"+propertyName);
    if (NullOrMissing(d)){
        d=document.createElement("div");
        d.className="aui_propetry"; 
        d.id=objectName+"_"+propertyName;   
        document.getElementById(objectName).appendChild(d);
    }
    d.innerHTML=value;
}

function getProperty(objectName,propetryName)
{
    var d=document.getElementById(objectName+"_"+propetryName);
    if (NullOrMissing(d)){
        d=document.createElement("div");
        d.className="aui_propetry"; 
        d.id=objectName+"_"+propetryName;   
        document.getElementById(objectName).appendChild(d);
    }
    return d.innerHTML;
}


function inArray(el,ar) {
    if (ar.length==0) return -1;
    for (var i=0;i<=ar.length;i++) 
        if (ar[i]==el) return i;
    return -1;
}

function cutString(s,c){
    while (s.indexOf(c)>=0){
        var p=s.indexOf(c);
        var s0=s.substring(0,p);
        var s1="";
        if (p+c.length<s.length)
            s1=s.substring(p+c.length,s.length);            
        s=s0+s1;
    }
    return s;
}

function NullOrMissing(thing)
{
	if (typeof thing == "undefined" ||
		thing == null ||
		thing == "")
		return true;

	return false;
}



onCellMouseOver=function(bname,cellid) {
    if (document.getElementById(bname+"_cell"+cellid).className.indexOf("aui_calendar_content_daycell_mouseover")<0)
        document.getElementById(bname+"_cell"+cellid).className+=" aui_calendar_content_daycell_mouseover";   
}

onCellMouseOut=function(bname,cellid) {
    document.getElementById(bname+"_cell"+cellid).className=cutString(document.getElementById(bname+"_cell"+cellid).className," aui_calendar_content_daycell_mouseover");
}

newCalendar=function(bname, bview, btheme,blang,bfather){
    _CalendarSelectPool[bname]=new Array();
    _CalendarEnablePool[bname]=new Array();

	var calendarObj=document.createElement("div");
	with (calendarObj) {
		id=bname;
		className=__CalendarClassName+" aui_calendar_position_"+bview+" aui_calendar_style_"+btheme;		
	}	
	


    var content=document.createElement("table");
    with (content){
        className="aui_calendar_content";
        id=bname+"_content";
        setAttribute("cellSpacing","0");
    }

    var tablehead=document.createElement("thead");
    tablehead.id=bname+"_contenthead";        

    var tablebody=document.createElement("tbody");
    tablebody.id=bname+"_contentbody";

    
    var calheaddiv=document.createElement("div");
    calheaddiv.className="aui_div_center";
    
    
    var navleft=document.createElement("a");
    navleft.className="aui_calendar_navmonthleft";
    navleft.onclick=new Function("goMonth('"+bname+"',-1);");
    var divtitle=document.createElement("div");
    divtitle.className="aui_calendar_title";
    divtitle.id=bname+'_title';
    var navright=document.createElement("a");
    navright.className="aui_calendar_navmonthright";
    navright.onclick=new Function("goMonth('"+bname+"',1);");
    var calheadrow=document.createElement("tr");
    var calhead=document.createElement("th");
    calhead.className="aui_calendar_content_head";
    calhead.setAttribute("colSpan",7); 

    var calweekdayrow=document.createElement("tr");
    calweekdayrow.className="aui_calendar_content_weekdayrow";
    calweekdayrow.id=bname+"_contenthead_weekdayrow";
    for (var i=0;i<=6;i++){
        var qth=document.createElement('th');
        qth.className="aui_calendar_content_weekday";
        qth.id=bname+"_contenthead_weekday"+i;
        calweekdayrow.appendChild(qth);
    }
    calheaddiv.appendChild(navleft);
    calheaddiv.appendChild(divtitle);
    calheaddiv.appendChild(navright);
    calhead.appendChild(calheaddiv);
    calheadrow.appendChild(calhead);
    tablehead.appendChild(calheadrow);
    tablehead.appendChild(calweekdayrow);
    content.appendChild(tablehead);

    var q=0;
    for (var i=0;i<=5;i++){
        var qtr=document.createElement("tr");
        qtr.id=bname+"_week"+i;
        qtr.className="aui_calendar_content_weekline";
        for (var j=0;j<=6;j++){
            var p="aui_calendar_content_daycell";
            if (i==0) p+=" aui_calendar_content_daycell_top";
            if (i==5) p+=" aui_calendar_content_daycell_bottom";
            if (j==0) p+=" aui_calendar_content_daycell_left";
            if (j==6) p+=" aui_calendar_content_daycell_right";
            qtd=document.createElement("td");
            qtd.id=bname+"_cell"+q;
            qtd.className=p;
            qtr.appendChild(qtd);
            q++;
        }
        tablebody.appendChild(qtr);
    }    
    content.appendChild(tablebody);
    calendarObj.appendChild(content);	
    
	if (NullOrMissing(bfather)) {
		document.body.appendChild(calendarObj);	
	} else {
		document.getElementById(bfather).appendChild(calendarObj);
	}    
    var now=new Date();
    var yy=now.getYear();
    if (yy<1900) yy+=1900;
    //setDisable(bname,1);        
    setProperty(bname,"month",now.getMonth()+1);     
    setMultiSelect(bname,0);
    setProperty(bname,"year",yy);        
    setCalLanguage(bname,blang); 
}

setCalLanguage=function(bname,blang){
    setProperty(bname,"lang",blang);    
    var s="";
    var q=0;
    if (blang=="en") q=0;
    else if ((blang=="ch")||(blang=="cn")) q=1;
    else if (blang=="jp") q=2; 
    else if (blang=="ge") q=3
    var t=document.getElementById(bname+"_contenthead_weekdayrow");
    for (var i=0;i<=6;i++){
        var qth=document.getElementById(bname+"_contenthead_weekday"+i);
        qth.innerHTML=stringCalendarWeekDay[q][i];
    }
    goMonth(bname,0);
}

goMonth=function(bname,c){
    setCalMonth(bname,Number(getProperty(bname,"year")),Number(getProperty(bname,"month"))+c);
}

setCalMonth=function(bname,y,m){
    var needdisable=getProperty(bname,"disable");
    if (m<1) {m=12;y--;}
    if (m>12) {m=1;y++;}
    var firstday=getWeekDay(y,m,1);
    var blang=getProperty(bname,"lang");
    if ((blang=="jp")||(blang=="ge")){
        firstday--;
        if (firstday<0) firstday=6;
    }

    setProperty(bname,"firstday",firstday);
    var p=constDayofMonth[m-1];
        if (m==3){
          	if (y%4!=0) p=28;
  	        if ((y%100==0)&&(y%400!=0)) p=28;
        }    
    var pm=constDayofMonth[m];
        if (m==2){
          	if (y%4!=0) pm=28;
  	        if ((y%100==0)&&(y%400!=0)) pm=28;
        }      
           
    for (var i=0;i<42;i++){
        d=document.getElementById(bname+"_cell"+i);
        with (d){
            className=cutString(className," aui_calendar_content_daycell_outofmonth");
            className=cutString(className," aui_calendar_content_daycell_selected");
            className=cutString(className," aui_calendar_content_daycell_disable");
            d.onmouseover=null;
            d.onmouseout=null;  
            d.onmousedown=null;          
            if (i<firstday){//lastmonth
                className+=" aui_calendar_content_daycell_outofmonth";
                innerHTML=p-(firstday-i-1);
            } else if (i>=firstday+pm) {//nextmonth
                className+=" aui_calendar_content_daycell_outofmonth";
                innerHTML=i-(firstday+pm)+1;
            } else {//thismonth
                if (/*(!needdisable)||*/(inArray(y+"-"+m+"-"+(i-firstday+1),_CalendarEnablePool[bname])>=0)){
                    d.onmouseover=new Function('onCellMouseOver("'+bname+'",'+i+')');
                    d.onmouseout=new Function('onCellMouseOut("'+bname+'",'+i+')');           
                    d.onmousedown=new Function('onCellClick(\''+bname+'\','+y+','+m+','+(i-firstday+1)+')');
                } else {
                    className=cutString(className," aui_calendar_content_daycell_mouseover");
                    className+=" aui_calendar_content_daycell_disable";
                }
                innerHTML=(i-firstday+1);
                if (inArray(y+"-"+m+"-"+(i-firstday+1),_CalendarSelectPool[bname])>=0)
                    className+=" aui_calendar_content_daycell_selected";            
                    
            }
        }
    }    
    
    setProperty(bname,"year",y);        
    setProperty(bname,"month",m);        
    redrawCalTitle(bname);
}


getSelectDay=function(bname) {
    if (getProperty(bname,"multiselect")==0) {
        if (_CalendarSelectPool[bname].length>0) return _CalendarSelectPool[bname][0];
                                            else return null;
    } else {
        return _CalendarSelectPool[bname];
    }
}

setMultiSelect=function(bname,v) {
    setProperty(bname,"multiselect",v);    
}

setDisable=function(bname,v) {
    setProperty(bname,"disable",v);
    goMonth(bname,0);    
}

addEnableDay=function(bname,y,m,d) {
    var s=new Array(y+'-'+m+'-'+d);    
    addEnableDayStrArray(bname,s);
}

addEnableDayStrArray=function(bname,s) {
    for (var i=0;i<s.length;i++){
        if (inArray(s[i],_CalendarEnablePool[bname])>=0){
             return;
        }
        _CalendarEnablePool[bname][_CalendarEnablePool[bname].length]=s[i];
    }
}
addSelectToday=function(bname){
    var now=new Date();
    var yy=now.getYear();
    if (yy<1900) yy+=1900;
    addSelectDay(bname,yy,now.getMonth()+1,now.getDate());
}

addSelectDay=function(bname,y,m,d) {
    var multi=getProperty(bname,"multiselect");
    var s=y+'-'+m+'-'+d;
    var yy=getProperty(bname,"year");
    var mm=getProperty(bname,"month");
    if (multi==0){
        if (_CalendarSelectPool[bname].length>0) {
            var ss=_CalendarSelectPool[bname][0];
            if (ss.indexOf(yy+'-'+mm+'-')==0){
                var dd=ss.substring(ss.lastIndexOf('-')+1,ss.length);
                q=document.getElementById(bname+"_cell"+(getProperty(bname,"firstday")-1+(dd-1+1)));
                q.className=cutString(q.className," aui_calendar_content_daycell_selected");
            }
        }
        _CalendarSelectPool[bname][0]=s;
        if ((yy==y)&&(mm==m)){
            document.getElementById(bname+"_cell"+(getProperty(bname,"firstday")-1+d)).className+=" aui_calendar_content_daycell_selected";                    
        }
    } else {
        if (inArray(s,_CalendarSelectPool[bname])>=0){
             return;
        }
        _CalendarSelectPool[bname][_CalendarSelectPool[bname].length]=s;
        if ((yy==y)&&(mm==m))
            document.getElementById(bname+"_cell"+(getProperty(bname,"firstday")-1+d)).className+=" aui_calendar_content_daycell_selected";                    
    }
}

onCellClick=function(bname,y,m,d){
    var dd=getProperty(bname,"dir");
    var s="";
    if (!NullOrMissing(dd)){
        s=s+dd+"/";
    }
    if (m<10) m='0'+m;
    if (d<10) d='0'+d;
    s=s+y+m+d+'.htm';
    document.location.href=s;
    /*var multi=getProperty(bname,"multiselect");
    var s=y+'-'+m+'-'+d;
    if (multi==0){
        addSelectDay(bname,y,m,d);
    } else if (multi==1) {
        var p=inArray(s,_CalendarSelectPool[bname]);
        if (p<0) {
            _CalendarSelectPool[bname][_CalendarSelectPool[bname].length]=s;
            document.getElementById(bname+"_cell"+(getProperty(bname,"firstday")-1+d)).className+=" aui_calendar_content_daycell_selected";            
        } else {
            var q=document.getElementById(bname+"_cell"+(getProperty(bname,"firstday")-1+d));
            q.className=cutString(q.className," aui_calendar_content_daycell_selected");
            _CalendarSelectPool[bname][p]=_CalendarSelectPool[bname][_CalendarSelectPool[bname].length-1];
            _CalendarSelectPool[bname].length--;       
        }
    }*/
}

redrawCalTitle=function(bname) {
    var y=getProperty(bname,"year");
    var m=getProperty(bname,"month");
    var blang=getProperty(bname,"lang");
    var q="";
    if (blang=="en") q=stringCalendarMonth[0][m-1]+" "+y;
    else if ((blang=="ch")||(blang=="cn")) q=y+stringCalendarMonth[1][m-1];
    else if (blang=="jp") q=y+stringCalendarMonth[2][m-1];
    else if (blang=="ge") q=stringCalendarMonth[3][m-1]+" "+y;
    document.getElementById(bname+"_title").innerHTML=q;
}




checkValidDay=function(y,m,d)
{
  if ((m>12)||(m<1)) return false;
  if (d>constDayofMonth[m]) return false;
  if (d<1) return false;
  if ((m==2)&&(d==29))
  {
  	if (y%4!=0) return false;
  	if ((y%100==0)&&(y%400!=0)) return false;  	
  }
  return true;
}

  
getDateCountInYear=function(y,m,d)
{ 
  var monL=new Array(0,31,28,31,30,31,30,31,31,30,31,30,31); 
  if((y%100!=0&&y%4==0)||(y%400==0)) monL[2]+=1; 
  var v=0; 
  for(var i=0;i<=m-1;i++){ 
    v+=monL[i]; 
  } 
  v+=d; 
  return v; 
} 
  
getDateCount=function(y,m,d)
{ 
  var v=(y-1)*365+Math.floor((y-1)/4)+getDateCountInYear(y,m,d)-2;
  v+=-Math.floor((y-1)/100)+Math.floor((y-1)/400)+2; 
  return v; 
} 
  
  
getWeekDay=function(y,m,d)
{ 
  return getDateCount(y,m,d)%7; 
} 
  
