/* --- Swazz Javascript Calendar ---
/* --- v 1.0 3rd November 2006
By Oliver Bryant
http://calendar.swazz.org */

Date.prototype.getWeek = function() {
    var year = this.getFullYear();
    var newYear = new Date(year,0,1);
    var modDay = newYear.getDay();
    if (modDay == 0) modDay=6; else modDay--;
    var daynum = ((Date.UTC(year,this.getMonth(),this.getDate(),0,0,0) - Date.UTC(year,0,1,0,0,0)) /1000/60/60/24) + 1;

    if (modDay < 4 ) {
        var weeknum = Math.floor((daynum+modDay-1)/7)+1;
    } else {
        var weeknum = Math.floor((daynum+modDay-1)/7);
        if (weeknum == 0) {
            year--;
            var prevNewYear = new Date(year,0,1);
            var prevmodDay = prevNewYear.getDay();
            if (prevmodDay == 0) prevmodDay = 6; else prevmodDay--;
            if (prevmodDay < 4) weeknum = 53; else weeknum = 52;
        }
    }

    return + weeknum;
};

var swazz = {
    // Calendar script
    now: null,
    sccm: null,
    sccy: null,
    ccm: null,
    ccy: null,
    updobj: null,
    left: null,
    top: null,
    mnn: null,
    mnl: null,
    calvalarr: null,
    valobjarr: null,
    delay: null,
    minDayDiff: null,
    printWeek: null,
    dy: null,
    mn: null,
    g_PopupIFrame: null,
    activeCal: null,
    
    init: function() {
        this.now = new Date;
        this.sccm = this.now.getMonth();
        this.sccy = this.now.getFullYear();
        this.ccm = this.now.getMonth();
        this.ccy = this.now.getFullYear();
        this.updobj = new Array(2);
        this.updobj[0] = new Array(2);
        this.updobj[1] = new Array(2);
        
        /* THESE should already be set!! if not define default values */
        this.delay = window.delay?delay:3;
        this.minDayDiff = window.minDayDiff?minDayDiff:0;
        this.tripLength = window.tripLength?tripLength:7;
        this.printWeek = window.printWeek?printWeek:false;
        this.yoffset = window.yoffset?yoffset:0;
        this.dy = window.dy?dy:new Array('M', 'T', 'W', 'T', 'F', 'S', 'S');
        this.mn = window.mn?mn:new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
        
        this.mnn = new Array('31','28','31','30','31','30','31','31','30','31','30','31');
        this.mnl = new Array('31','29','31','30','31','30','31','31','30','31','30','31');
        this.calvalarr = new Array(42);
        this.calobjarr = new Array(42);
        this.weekobjarr = new Array(6);
        
        document.write('<table id="fc" class="fc_container" style="display:none">');
        document.write('<tr><td class="fc_container_td">');
        document.write('<table class="fc"><tr>');
        if ( this.printWeek ) document.write('<td class="fc_element fc_week_title"  onclick="swazz.csubm()">&nbsp;</td>');
        document.write('<td class="fc_element fc_title" onclick="swazz.csubm()"><div class="fc_element fc_subm"></div></td><td id="mns" class="fc_element fc_title" colspan=5 align="center"></td><td class="fc_element fc_title" align="right" onclick="swazz.caddm()"><div class="fc_element fc_addm"></div></td></tr><tr>');
        if ( this.printWeek ) document.write('<td class="fc_element fc_week_dayOfWeek">&nbsp;</td>');
        document.write('<td class="fc_element fc_dayOfWeek">'+this.dy[0]+'</td><td class="fc_element fc_dayOfWeek">'+this.dy[1]+'</td><td class="fc_element fc_dayOfWeek">'+this.dy[2]+'</td><td class="fc_element fc_dayOfWeek">'+this.dy[3]+'</td><td class="fc_element fc_dayOfWeek">'+this.dy[4]+'</td><td class="fc_element fc_dayOfWeek">'+this.dy[5]+'</td><td class="fc_element fc_dayOfWeek">'+this.dy[6]+'</td></tr>');

        for(var kk=1;kk<=6;kk++) {
	        document.write('<tr>');
	        if ( this.printWeek ) document.write('<td id="w' + kk + '" class="fc_element fc_weekNo">.</td>');
	        for(var tt=1;tt<=7;tt++) {
		        num=7 * (kk-1) - (-tt);
		        document.write('<td id="v' + num + '" class="fc_element">&nbsp;</td>');
		        this.calobjarr[num] = this.getObj("v"+num);
	        }
	        document.write('</tr>');
        }
        document.write('</table>');
        document.write('</td></tr>');
        document.write('</table>');

        var ptr = this;
        var chkClick = function(ev) { ptr.checkClick(ev, ptr)  };
        document.all?document.attachEvent('onclick',chkClick):document.addEventListener('click',chkClick,false);
        //this.prepcalendar('',this.ccm,this.ccy);
    }, 
    
    // day selected
    prepcalendar: function(hd,cm,cy) {
        var cd, sd, td, htd, dip, obj, marr;
        var calNo = this.activeCal;
	    this.now=new Date();
	    sd = this.now.getDate(); // sd = now
	    td = new Date();
	    td.setDate(1);
	    td.setFullYear(cy);
	    td.setMonth(cm);
	    cd=(td.getDay()+6) % 7; // shift so monday is first day, not sunday
	    this.getObj('mns').innerHTML=this.mn[cm]+ ' ' + cy;
	    marr=((cy%4)==0)?this.mnl:this.mnn;

        if ( this.printWeek ) {
            var weekNo = td.getWeek();
            for (var d=1;d<7;d++) {
                if (this.weekobjarr[d] == null) {
                    this.weekobjarr[d] = document.getElementById("w"+d);
                }
                this.weekobjarr[d].innerHTML = weekNo + d - 1;
            }
        }
        
	    for(var d=1;d<=42;d++) { // d = counter (1-42)
    	    obj = this.calobjarr[d];
		    if ((d >= (cd -(-1))) && (d<=cd-(-marr[cm]))) {
			    obj.innerHTML=d-cd;
			    this.calvalarr[d]=''+(d-cd)+'/'+(cm-(-1))+'/'+cy;
		    } else {
			    obj.innerHTML='&nbsp;';
			    this.calvalarr[d]='';
		    }
		    this.setCss(obj, this);
	    }
    },
    
    setCss: function(obj, ptr) {
        var ptr = this;
        var click0 = function(ev) { ptr.cs_click0(ev, ptr) };
	    var click1 = function(ev) { ptr.cs_click1(ev, ptr) };
        var cs_over = function(ev) { ptr.cs_over(ev, ptr) };
        var cs_out = function(ev) { ptr.cs_out(ev, ptr) };
        
        var calNo = ptr.activeCal;
        
        var date1 = ptr.getElementDate(0, ptr);
        var date2 = ptr.getElementDate(1, ptr);
        
        var strDate = ptr.calvalarr[obj.id.substring(1,obj.id.length)];
        var arrDate = strDate.split('/');
        
        var date = new Date((new Date).getFullYear(), (new Date).getMonth(), (new Date).getDate());
        date.setFullYear(arrDate[2], (arrDate[1] - 1), arrDate[0]);
        
        var datetemp = new Date((new Date).getFullYear(), (new Date).getMonth(), ((new Date).getDate() + this.delay));
        datetemp.setFullYear((new Date).getFullYear(), (new Date).getMonth(), ((new Date).getDate() + this.delay));
        
        if ( calNo == 0 ) {
            obj.onclick = click0;
        } else {
            obj.onclick = click1;
        }
        obj.onmouseover = cs_over;
	    obj.onmouseout = cs_out;
        if ( date < datetemp ) {
            obj.onclick = null;
            obj.onmouseover=null;
			obj.onmouseout=null;
            obj.className = 'fc_element fc_datePast';
        } else if (date.getDate() == date1.getDate() && date.getMonth() == date1.getMonth() && date.getFullYear == date1.getFullYear) {
            obj.className = 'fc_element fc_date1';
        } else if (date.getDate() == date2.getDate() && date.getMonth() == date2.getMonth() && date.getFullYear == date2.getFullYear) {
            obj.className = 'fc_element fc_date2';
        } else if ( date < date1 ) {
            obj.className = 'fc_element fc_dateBefore';
        } else if ( date > date2 ) {
            obj.className = 'fc_element fc_dateAfter';
        } else {
	        obj.className = 'fc_element fc_dateRegular';
        }
        
        //alert("date1:" + date1 + "\ndate2:" + date2 + "\nstrdate: "+strDate+"\ndate:" + date);
    },

    lcs: function (ielem1, ielem2, calNo) {
        var curdtarr, isdt;
        this.activeCal = calNo;

        if ( this.updobj[0][0] == null ) {
            this.updobj[0][0] = this.getObj(ielem1);
            this.updobj[1][0] = this.getObj(ielem2);
        }

	    // First check date is valid
	    curdtarr = this.updobj[calNo][0].value.split('/');
	    isdt = true;
	    for(var k=0;k<curdtarr.length;k++) {
		    if (isNaN(curdtarr[k]))
			    isdt=false;
	    }

     //use the date from the textbox to fill the calendar
	    if (isdt&(curdtarr.length==3)) {
		    this.ccm=curdtarr[1]-1;
		    this.ccy=curdtarr[2];
		    this.prepcalendar(curdtarr[0],curdtarr[1]-1,curdtarr[2]);
	    } else {
	        this.prepcalendar('',this.ccm, this.ccy);
	    }
	
	    this.ShowPopupDiv('fc', this.Left(this.updobj[calNo][0]), this.Top(this.updobj[calNo][0])+this.updobj[calNo][0].offsetHeight);
    },

    // dayDD as dd, monthDD as mm/yy
    ddlcs: function (dayDD1, monthDD1, dayDD2, monthDD2, calNo) {
        var curdtarr;
        if ( this.updobj[0][0] == null ) {
            this.updobj[0][0] = this.getObj(dayDD1);
            this.updobj[0][1] = this.getObj(monthDD1);
            this.updobj[1][0] = this.getObj(dayDD2);
            this.updobj[1][1] = this.getObj(monthDD2);
        }
        
        this.activeCal = calNo;
        
        curdtarr=this.updobj[calNo][1].options[this.updobj[calNo][1].selectedIndex].value.split('/');

        if (isNaN(this.updobj[calNo][0].options[this.updobj[calNo][0].selectedIndex].value) == false && isNaN(curdtarr[0]-1) == false && isNaN(curdtarr[1]) == false) {
            this.ccm=curdtarr[0]-1;  //use date from dropdowns 1(3)
            this.ccy=curdtarr[1];  //use date from dropdowns 2(3)
            this.prepcalendar(this.updobj[calNo][0].options[this.updobj[calNo][0].selectedIndex].value,curdtarr[0]-1,curdtarr[1]);  //use date from dropdowns 3(3)
        } else {
            this.prepcalendar('',this.ccm,this.ccy);
        }
    
        this.ShowPopupDiv('fc', this.Left(this.updobj[calNo][0]), this.Top(this.updobj[calNo][0])+this.updobj[calNo][0].offsetHeight);
    },
    
    IsIE: function() {
        return ( navigator.appName=="Microsoft Internet Explorer" );
    },
    HidePopupDiv: function(divID) {
        var divPopup;
        divPopup = this.getObj(divID);
        divPopup.style.display = 'none';

        if (this.IsIE() && this.g_PopupIFrame) {
            document.body.removeChild(this.g_PopupIFrame);
            this.g_PopupIFrame = null;
        }
    },
    ShowPopupDiv: function(divID, left, top) {
        var divPopup = this.getObj(divID);
        top = top + this.yoffset;
        divPopup.style.left = left + "px";
        divPopup.style.top = top + "px";
        
        if (!this.IsIE()) {
            //Just display the div
            divPopup.style.display = '';
            return;
        }
        if (this.g_PopupIFrame) {
            this.HidePopupDiv(divID);
        }

        //Increase default zIndex of div by 1, so that DIV appears before IFrame
        divPopup.style.zIndex=divPopup.style.zIndex+1;
        divPopup.style.display = '';

        var iFrame = document.createElement("IFRAME");
        iFrame.setAttribute("src", "");
        //Match IFrame position with divPopup
        iFrame.style.position = "absolute";
        iFrame.style.left = left + 'px';
        iFrame.style.top = top + 'px';
        iFrame.style.width = divPopup.offsetWidth + 'px';
        iFrame.style.height = divPopup.offsetHeight + 'px';

        document.body.appendChild(iFrame);

        //Store iFrame in global variable, so it can get removed when divPopup is hidden 
        this.g_PopupIFrame = iFrame;
        divPopup.style.display = '';
    },
        
    selectValue: function(val, dd) {
        for (var i = 0; i < dd.length; i++) {
            if ( dd[i].value == val) {
                dd.selectedIndex = i;
                return 1;
            }
        }
        return 0;
    },
    isChild: function(s,d) {
	    while(s) {
		    if (s==d) 
			    return true;
		    s=s.parentNode;
	    }
	    return false;
    },
    
    caddm: function() {
	    marr=((this.ccy%4)==0)?this.mnl:this.mnn;
	    this.ccm+=1;
	    if (this.ccm>=12) {
		    this.ccm=0;
		    this.ccy++;
	    }
	    this.cdayf();
	    this.prepcalendar('',this.ccm,this.ccy);
    },
    csubm: function() {
	    marr=((this.ccy%4)==0)?this.mnl:this.mnn;    	
	    this.ccm-=1;
	    if (this.ccm<0) {
		    this.ccm=11;
		    this.ccy--;
	    }
	    this.cdayf();
	    this.prepcalendar('',this.ccm,this.ccy);
    },
    cdayf: function() {
        if ((this.ccy>this.sccy)|((this.ccy==this.sccy)&&(this.ccm>=this.sccm)))
	        return;
        else {
	        this.ccy=this.sccy;
	        this.ccm=this.sccm;
        }
    },
    Left: function(obj) {
	    var curleft = 0;
	    if (obj.offsetParent)
	    {
		    while (obj.offsetParent)
		    {
			    curleft += obj.offsetLeft
			    obj = obj.offsetParent;
		    }
	    }
	    else if (obj.x)
		    curleft += obj.x;
	    return curleft;
    },
    
    Top: function(obj) {
	    var curtop = 0;
	    if (obj.offsetParent)
	    {
		    while (obj.offsetParent)
		    {
			    curtop += obj.offsetTop
			    obj = obj.offsetParent;
		    }
	    }
	    else if (obj.y)
		    curtop += obj.y;
	    return curtop;
    }, 
    checkClick: function(e, ptr) {
        var obj = ptr.getObj('fc');
	    e?evt=e:evt=event;
	    CSE=evt.target?evt.target:evt.srcElement;
	    if (obj) {
		    if (!ptr.isChild(CSE,obj)){
			    ptr.HidePopupDiv('fc');
            }
        }
    },
    cs_over: function(e, ptr) {
        var date = ptr.calvalarr[ptr.evtTgt(ptr.EvtObj(e)).id.substring(1,ptr.evtTgt(ptr.EvtObj(e)).id.length)];
        
	    if (ptr.evtTgt(ptr.EvtObj(e)).className == 'fc_element fc_dateHighlighted') {
            return;
        } else {
	        ptr.evtTgt(ptr.EvtObj(e)).className = 'fc_element fc_mouseOver';
            //ptr.setCss( ptr.evtTgt(ptr.EvtObj(e)), ptr);
	    }
    },
    cs_out: function(e, ptr) {
	   var date = ptr.calvalarr[ptr.evtTgt(ptr.EvtObj(e)).id.substring(1,ptr.evtTgt(ptr.EvtObj(e)).id.length)];
	    
	    if (ptr.evtTgt(ptr.EvtObj(e)).className == 'fc_element fc_dateHighlighted') {
            return;
        } else {
    	    ptr.evtTgt(ptr.EvtObj(e)).className = 'fc_element fc_dateRegular';
            ptr.setCss( ptr.evtTgt(ptr.EvtObj(e)), ptr);
        }
    },
    cs_click0: function(e, ptr) {
        var curdtarr;

        if (ptr.updobj[0][0].length > 3) {
            var date = ptr.calvalarr[ptr.evtTgt(ptr.EvtObj(e)).id.substring(1,ptr.evtTgt(ptr.EvtObj(e)).id.length)];
            
            curdtarr=date.split('/');
            ptr.selectValue((curdtarr[0]), ptr.updobj[0][0]);
            ptr.selectValue((curdtarr[1] + "/" + curdtarr[2]), ptr.updobj[0][1]);

        } else {
            ptr.updobj[0][0].value=ptr.calvalarr[ptr.evtTgt(ptr.EvtObj(e)).id.substring(1,ptr.evtTgt(ptr.EvtObj(e)).id.length)];

        }
        var date1 = ptr.getElementDate(0, ptr)
        var date2 = ptr.getElementDate(1, ptr)
        if (date1 > date2) {
            date1.setDate(date1.getDate()+ptr.tripLength);
            ptr.setElementDate(1, ptr, date1);
        }
        
	    ptr.HidePopupDiv('fc');
        
        if ( ptr.updobj[0][0].onchange ) {
            ptr.updobj[0][0].onchange();
        }
    },
    cs_click1: function(e, ptr) {
        var curdtarr;
        
        if (ptr.updobj[1][0].length > 3) {
            var date = ptr.calvalarr[ptr.evtTgt(ptr.EvtObj(e)).id.substring(1,ptr.evtTgt(ptr.EvtObj(e)).id.length)];
            
            curdtarr=date.split('/');
            ptr.selectValue((curdtarr[0]), ptr.updobj[1][0]);
            ptr.selectValue((curdtarr[1] + "/" + curdtarr[2]), ptr.updobj[1][1]);
        } else {
            ptr.updobj[1][0].value=ptr.calvalarr[ptr.evtTgt(ptr.EvtObj(e)).id.substring(1,ptr.evtTgt(ptr.EvtObj(e)).id.length)];
        }

        var date1 = ptr.getElementDate(0, ptr)
        var date2 = ptr.getElementDate(1, ptr)
        if (date1 > date2) {
            date2.setDate(date2.getDate() - ptr.tripLength);
            
            date1 = new Date;
            date1.setDate(date1.getDate() + ptr.delay);
            if (date2 < date1) {
			    date2 = date1;
			}
            ptr.setElementDate(0, ptr, date2)
        }
        
	    ptr.HidePopupDiv('fc');
	    
	    if ( ptr.updobj[1][0].onchange ) {
            ptr.updobj[1][0].onchange();
        }
    },
    getElementDate: function(cal, ptr) {
        var curdtarr;
        var returnDate = null;

        if (ptr.updobj[1][0].length > 3) {
            curdtarr=ptr.updobj[cal][1].value.split('/');
            returnDate = new Date( curdtarr[1], (curdtarr[0]-1), (parseInt(ptr.updobj[cal][0].value)+parseInt(ptr.minDayDiff)) );
        } else {
            curdtarr=ptr.updobj[cal][0].value.split('/');
            returnDate = new Date( curdtarr[2], (curdtarr[1]-1), curdtarr[0] );
        }
        return returnDate;
    },
    setElementDate: function(cal, ptr, newDate) {
        if (ptr.updobj[cal][0].length > 3) {
            ptr.selectValue(newDate.getDate(), ptr.updobj[cal][0]);
            ptr.selectValue(((newDate.getMonth()+1) + "/" + newDate.getFullYear()), ptr.updobj[cal][1]);
        } else {
            ptr.updobj[cal][0].value = newDate.getDate() + "/" + (newDate.getMonth()+1) + "/" + newDate.getFullYear();
        }
    },
    
    EvtObj: function(e){
        if(!e)
            e=window.event;
        return e;
    }, 
    evtTgt: function(e)
    {
	    var el;
	    if(e.target)
	        el=e.target;
	    else if(e.srcElement)
	        el=e.srcElement;
	    if(el.nodeType==3)
	        el=el.parentNode; // defeat Safari bug
	    return el;
    }, 
    getObj: function(objID) {
        if (document.getElementById) {
            return document.getElementById(objID);
        } else if (document.all) {
            return document.all[objID];
        } else if (document.layers) {
            return document.layers[objID];
        }
    }
};

swazz.init();
