var dateFmt=new String('m/d/y');
var days=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
var daysAbbrv=new Array('S','M','T','W','Th','F','S');
var months=new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
var lengths=new Array(31,28,31,30,31,30,31,31,30,31,30,31);
var now=new Date();
var calendarDate=new Date();
dest=false;

function isLeap(y) {
    if(((y % 400) == 0) || (((y % 4) == 0) && ((y % 100) != 0))) return true;
    else return false;
}
function formatDate(Y,M,D) {
    try {
        var y=Y.toString();
        var d=calendarDate.getDay();
        var date='';
        var chars=dateFmt.length;
        for (var i=0; i < chars; ++i) {
	        var thisChar=dateFmt.charAt(i);
	        switch (thisChar) {
	            case "M": date += months[M]; break;
	            case "m": date += (M<9)?("0"+(++M)):++M; break;
	            case "Y": date += y; break;
	            case "y": date += y.substring(2); break;
	            case "d": date += ((dateFmt.indexOf("m")!=-1)&&(D<10))?("0"+D):D; break;
	            case "D": date += days[d]; break;
	            default: date += thisChar;
	        }
        }
        return unescape(date);
    }
    catch(e) {}
}
function createCalendar(DEST,Y,M)	{
    try {
        if(document.getElementById('wXcalendar'))  hideCalendar();
        if((DEST) && (DEST.id)) dest=DEST;
        else  return(false);
        var wrapper=document.createElement('div');
        wrapper.setAttribute('id','wXcalendar');
        wrapper.setAttribute('name','wXcalendar');
        wrapper.setAttribute('class','wXcalendar');
        wrapper.setAttribute('className','wXcalendar');
        dest.parentNode.insertBefore(wrapper,dest);
        var iframe=document.createElement('iframe');
        iframe.setAttribute('id','wXcalendar-frame');
        iframe.setAttribute('src','javascript:false;');
        iframe.style.display='block';
        iframe.style.position='absolute';
        iframe.style.top=10;
        iframe.style.left=10;
        iframe.style.zIndex=wrapper.style.zIndex - 1;
        dest.parentNode.insertBefore(iframe,dest);
        if(Y == null) var y=now.getFullYear();
        else var y=Y;
        if(M == null) var m=now.getMonth();
        else var m=M;
        var yCount=y;
        if(m == 1) lengths[1]=(isLeap(y))?29:28;
        var control=document.createElement('table');
        control.setAttribute('id','wXcalendarcontroltable');
        control.setAttribute('name','wXcalendarcontroltable');
        var THEAD=control.appendChild(document.createElement('thead'));
        var TR=THEAD.appendChild(document.createElement('tr'));
        var mBack=document.createElement('th');
        var back=document.createElement('a');
        back.setAttribute('id','back');
        back.setAttribute('name','back');
        back.setAttribute('class','wXcalendar-plain');
        back.setAttribute('className','wXcalendar-plain');
        back.setAttribute('href','javascript:moveMonth("back")');
        back.appendChild(document.createTextNode(' < '));
        var currentMonth=new Date().getMonth();
        if(m != currentMonth) mBack.appendChild(back);
        var mSelector=document.createElement('th');
        var selector=document.createElement('select');
        var opts=selector.options;
        selector.setAttribute('name','wXcalendar-months');
        selector.setAttribute('id','wXcalendar-months');
        selector.onchange=moveMonth;
        opts.length=0;
        var cycle=0;
        try {
            // added this try statement because the below fails in safari causing the whole script to die
	        // this way in safari the whole calendar works in safari except the month drop down selector
            for(var i=m; i <= months.length; i++)	{
                if(i > 11)	{
                    i=0;
	                yCount++;
	            }
	            opts[opts.length]=new Option(yCount + ' ' + months[i],yCount + ' ' + i);
	            if((yCount + ' ' + i) == (y + ' ' + m)) opts[opts.length - 1].selected=true;
	            cycle++;
	            if(cycle >= 12) break;
            }
        } catch(e) {
            //alert(e);
        }
        mSelector.appendChild(selector);
        var mForward= document.createElement('th');
        var forward=document.createElement('a');
        forward.setAttribute('id','forward');
        forward.setAttribute('name','forward');
        forward.setAttribute('class','wXcalendar-plain');
        forward.setAttribute('className','wXcalendar-plain');
        forward.setAttribute('href','javascript:moveMonth("forward")');
        forward.appendChild(document.createTextNode(' > '));
        mForward.appendChild(forward);
        TR.appendChild(mBack);
        TR.appendChild(mSelector);
        TR.appendChild(mForward);
        var calendar=document.createElement('table');
        calendar.setAttribute('id','wXcalendartable');
        calendar.setAttribute('name','wXcalendartable');
        var THEAD=calendar.appendChild(document.createElement('thead'));
        var TR=THEAD.appendChild(document.createElement('tr'));
        for(var day in daysAbbrv)	{
	        var TH=document.createElement('th');
	        TH.appendChild(document.createTextNode(daysAbbrv[day]));
	        TR.appendChild(TH);
        }
        var TBODY=calendar.appendChild(document.createElement('tbody'));
        var TR=TBODY.appendChild(document.createElement('tr'));
        var firstOfTheMonth=new Date((parseInt(m) + 1) + '/1/' + y).getDay();
        var monthLength=lengths[m];
        for(var i=0; i < firstOfTheMonth; i++)	{
	        TR.appendChild(document.createElement('td'));
	        if(i == 6) var TR=TBODY.appendChild(document.createElement('tr'));
        }
        var dCount=firstOfTheMonth;
        for(var i=0; i < monthLength; i++)	{
	        var date=new Date((parseInt(m) + 1) + '/' + (i + 1) + '/' + y);
	        var thisDay=date.getDay();
	        var TD=document.createElement('td');
            TD.setAttribute('id',date);
            TD.setAttribute('name',date);
            TD.appendChild(document.createTextNode(date.getDate()));
            TR.appendChild(TD);
            TD.onclick=clickDate;
            TD.style.cursor="pointer";
            TD.onclick=clickDate;
	        TR.appendChild(TD);
	        dCount++;
	        if(dCount == 7)	{
	            dCount=0;
	            var TR=TBODY.appendChild(document.createElement('tr'));
	        }
        }
        wrapper.appendChild(control);
        wrapper.appendChild(calendar);
        var hide=document.createElement('a');
        hide.setAttribute('href','javascript:hideCalendar()');
        hide.appendChild(document.createTextNode('[Hide]'));
        wrapper.appendChild(hide);
    }
    catch(e) {}  
}
function hideCalendar()	{
    try {
        if(document.getElementById('wXcalendar')) 	{
	        document.getElementById('wXcalendar').parentNode.removeChild(document.getElementById('wXcalendar'));
        }
        if(document.getElementById('wXcalendar-frame')) 	{
	        document.getElementById('wXcalendar-frame').parentNode.removeChild(document.getElementById('wXcalendar-frame'));
        }
    }
    catch(e) {}
}
function moveMonth(DIR)	{
    try {
        var months=document.getElementById('wXcalendar-months');
        var opt=months.options[months.selectedIndex]
        var y=opt.value.split(/\s/)[0];
        var m=opt.value.split(/\s/)[1];
        if(typeof DIR == 'string')	{
	        if(DIR.toUpperCase() == 'BACK')	{
	            if(m == 0)	{
		            m=11;
		            y--;
	            } else {
		            m--;
	            }
	        } else if(DIR.toUpperCase() == 'FORWARD')	{
	            if(m == 11)	{
		            y++;
		            m=0;
	            } else {
		            m++;
	            }
	        }
        }
        createCalendar(dest,y,m);
    }
    catch(e) {}
}
function clickDate()	{
    try {
        var y=new Date(this.id).getFullYear();
        var m=new Date(this.id).getMonth();
        var d=new Date(this.id).getDate();
        if(dest) {
	        dest.value=formatDate(y,m,d);
        } else {
	        hideCalendar();
        }
        hideCalendar();
    }
    catch(e) {}
}
