var calDayTitle=new Array('Su','M','Tu','W','Th','F','Sa');
var calMonthTitle = new Array('January','February','March','April','May','June','July','August','September','October','November','December');
var lastcal;

function poDateSelect(name,dayheight,daywidth,titlebarheight,calmaincss,monthtitlecss,daytitlecss,yeartitlecss,nodaycss,daycss,currentdaycss,todaycss,monthselectcss,maintitlecss)
{    
	var img;
    if (typeof event !== 'undefined') {
	     img = event.srcElement;
	     if (!img) img = event.currentTarget;
	 }
	 else
         img = $(name);
 
     
	if(lastcal) {
		lastcal.caldiv.style.visibility = 'hidden';
		lastcal.caldiv.style.display = 'none';
		poShowListBoxes(lastcal.listboxes);
	}
	lastcal = this;

	if(!maintitlecss) maintitlecss = 'calMainTitle';
		
    this.calName = name;
    this.calBarH = titlebarheight;
    this.calDayW = daywidth;
    this.calDayH = dayheight;
    this.calMainCSS = calmaincss;
    this.mainTitleCSS = maintitlecss;
    this.monthTitleCSS = monthtitlecss;
    this.dayTitleCSS = daytitlecss;
    this.yearTitleCSS = yeartitlecss;
    this.noDayCSS = nodaycss;
    this.dayCSS = daycss;
    this.todayCSS = todaycss;    
    this.currentDayCSS = currentdaycss;
    this.monthSelectCSS = monthselectcss;
        
    this.caldiv = $('cal'+this.calName);
    this.caldiv.className = this.calMainCSS;
    this.calWidth = ((this.calDayW*7)+10);
    this.calHeight = (this.calDayH*6)+(3*this.calBarH)+24;
    this.caldiv.style.width=this.calWidth+'px';
    this.caldiv.style.height=this.calHeight+'px';

	var posX = poFindPosX(img);
	var posY = poFindPosY(img)+img.offsetHeight;
    this.caldiv.style.left=posX+'px';;
    this.caldiv.style.top=posY+'px';

    var n = new Date();
    var dte = new Date(n.getFullYear(),n.getMonth(),1);
	var dte2;
    
    var fld = $(this.calName);
    if(fld) {
		if (fld.value) {
			if (dte2 = parseDate(fld.value)) {
				dte = dte2;
				this.currentDte = dte2;
			} else {
				return;
			}
		}
    }
    
    this.listboxes = poHideListBoxes(posX,posY,this.calWidth,this.calHeight);
    this.buildCal(this.caldiv,dte);
    
    this.caldiv.style.visibility = 'visible';
    this.caldiv.style.display = '';
} 

poDateSelect.prototype.buildCal = function buildCal(par,dte) 
{
    this.currentWorkDte = dte;
    var n = new Date();
    var fom = new Date(dte.getFullYear(),dte.getMonth(),1);
    var dayOfWeek = fom.getDay()+1;
    var days = 0;
    
    while(par.childNodes.length>0)
        par.removeChild(par.childNodes[0]);
    
    for(var i=0;i<7;i++) {
        this.createDayTitle(this.caldiv,this.dayTitleCSS,i,(i*(this.calDayW+1))+1,this.calBarH+16,calDayTitle[i]);
    }
    
    var monthDays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
    var ldom = monthDays[dte.getMonth()];
    if (dte.getMonth()==1) { // February
        var theYear = dte.getYear();
        if (theYear%400==0 || (theYear%4 == 0 && theYear%100!=0) ) ldom+=1;
    }    
        
    for(var j=0;j<6;j++) {
        for(var i=1;i<8;i++) {
            if(days==0 && i==dayOfWeek) days=1;
            if(days==0 || days>ldom) {
				this.createDay(par,this.noDayCSS,j+'_'+i,((i-1)*(this.calDayW+1))+1,(j*(this.calDayH+1))+(this.calBarH*2)+16,'');
			} else if(this.currentDte && days==this.currentDte.getDate() && dte.getYear()==this.currentDte.getYear() && dte.getMonth()==this.currentDte.getMonth()) {
				this.createDay(par,this.currentDayCSS,j+'_'+i,((i-1)*(this.calDayW+1))+1,(j*(this.calDayH+1))+this.calBarH+this.calBarH+16,days++);
            } else if(days==n.getDate() && dte.getYear()==n.getYear() && dte.getMonth()==n.getMonth()) {
				this.createDay(par,this.todayCSS,j+'_'+i,((i-1)*(this.calDayW+1))+1,(j*(this.calDayH+1))+this.calBarH+this.calBarH+16,days++);
            } else this.createDay(par,this.dayCSS,j+'_'+i,((i-1)*(this.calDayW+1))+1,(j*(this.calDayH+1))+this.calBarH+this.calBarH+16,days++);
        }
    }
    this.createDiv(par,this.monthTitleCSS,'month',1,17,this.calWidth-4,this.calBarH,calMonthTitle[dte.getMonth()],'ms');
    this.createDiv(par,this.monthTitleCSS+'Arrows','month0',1,17,15,this.calBarH,'&lt;&lt;','mc|0');
    this.createDiv(par,this.monthTitleCSS+'Arrows','monthM1',20,17,10,this.calBarH,'&lt;','mc|'+(dte.getMonth()-1));
    this.createDiv(par,this.monthTitleCSS+'Arrows','month11',this.calWidth-18,17,15,this.calBarH,'&gt;&gt;','mc|11');
    this.createDiv(par,this.monthTitleCSS+'Arrows','monthP1',this.calWidth-34,17,10,this.calBarH,'&gt;','mc|'+(dte.getMonth()+1));
	this.createDiv(par,this.mainTitleCSS,'xClose',0,0,this.calWidth-15,12,'Choose A Date','');
	this.createDiv(par,this.mainTitleCSS,'xClose',this.calWidth-16,0,14,12,'X','close');

    var h = this.calHeight-this.calBarH-3;
    this.createDiv(par,this.yearTitleCSS,'year',1,h,this.calWidth-4,this.calBarH,dte.getFullYear(),'');
    var y = dte.getYear();
    if(y>9) this.createDiv(par,this.yearTitleCSS+'Arrows','yearM5',1,h,15,this.calBarH,'&lt;&lt;','yc|'+(dte.getYear()-10));
    if(y>0) this.createDiv(par,this.yearTitleCSS+'Arrows','yearM1',20,h,10,this.calBarH,'&lt;','yc|'+(dte.getYear()-1));
    if(y<1900 || (y>1900 && y<2090)) this.createDiv(par,this.yearTitleCSS+'Arrows','yearP5',this.calWidth-18,h,15,this.calBarH,'&gt;&gt;','yc|'+(dte.getYear()+10));
    if(y<1900 || (y>1900 && y<2099)) this.createDiv(par,this.yearTitleCSS+'Arrows','yearP1',this.calWidth-34,h,10,this.calBarH,'&gt;','yc|'+(dte.getYear()+1));
}

poDateSelect.prototype.bindMonthSelect = function bindMonthSelect(nothing){ 
	var obj = this;
	var temp = nothing;
	return function(){ 
		obj.monthSelect(temp); 
	} 
} 

poDateSelect.prototype.bindClose = function bindClose(){ 
	var obj = this;
	return function(){ 
		poShowListBoxes(obj.listboxes);
		obj.caldiv.style.visibility = 'hidden';
		obj.caldiv.style.display = 'none';
	} 
} 

poDateSelect.prototype.monthSelect = function monthSelect(nothing)
{
    var width=this.calWidth/2;
    this.monthselect = this.createDiv(this.caldiv,this.calMainCSS,'monthS',width/2,1,width,16*12,'');
    for(var i=0;i<12;i++) {
        var mdiv = this.createDiv(this.monthselect,this.monthSelectCSS,'monthS'+i,-1,(i*16),width,15,calMonthTitle[i]);
        mdiv.onclick = this.bindMClick(i);
        mdiv.onmouseover = this.bindMOverOut(mdiv, this.monthSelectCSS+'Over');
        mdiv.onmouseout = this.bindMOverOut(mdiv, this.monthSelectCSS);
    }
}

poDateSelect.prototype.bindDClick = function bindDClick(thing){ 
var temp = thing; 
var obj = this;
return function(){ 
obj.dayClick(temp); 
} 
} 

poDateSelect.prototype.dayClick = function dayClick(day)
{
	var y = this.currentWorkDte.getYear();
	if(y<1900) y+=1900;
    var dte = new Date(y,this.currentWorkDte.getMonth(),day);
    this.caldiv.style.visibility = 'hidden';
    this.caldiv.style.display = 'none';
    poShowListBoxes(this.listboxes);
    
    var fld = $(this.calName);
    var sdte = (dte.getMonth()+1)+'/'+(dte.getDate())+'/'+y;
    fld.value = sdte;
}

poDateSelect.prototype.bindMOverOut = function bindMOverOut(thing,cname){ 
var temp = thing; 
var temp2 = cname;
var obj = this;
return function(){ 
obj.monthOverOut(temp,temp2); 
} 
} 

poDateSelect.prototype.monthOverOut = function monthOverOut(div,cname) 
{
    div.className = cname;
}

poDateSelect.prototype.bindMClick = function bindMClick(thing){ 
var temp = thing; 
var obj = this;
return function(){ 
obj.monthClick(temp); 
} 
} 

poDateSelect.prototype.monthClick = function monthClick(month)
{
	var y = this.currentWorkDte.getYear();
	if(y<1900) y+=1900;
    var dte = new Date(y,month,1);
    this.buildCal(this.caldiv,dte);
}

poDateSelect.prototype.bindYClick = function bindYClick(thing){ 
var temp = thing; 
var obj = this;
return function(){ 
obj.yearClick(temp); 
} 
} 

poDateSelect.prototype.yearClick = function yearClick(year)
{
	year=year*1;
	if(year<1900) year+=1900;
    var dte = new Date(year,this.currentWorkDte.getMonth(),1);
    this.buildCal(this.caldiv,dte);
}

poDateSelect.prototype.createDiv = function createDiv(parent,classname,id,left,top,width,height,txt,onclick)
{
    var div = document.createElement('div');
    div.ID = 'day'+id;
    div.className=classname;
    div.style.width=width+ 'px';
    div.style.height=height+ 'px';
    div.style.left=left + 'px';
    div.style.top=top+ 'px';
    div.innerHTML=txt;
    if(onclick) {
        if(onclick=='ms') div.onclick = this.bindMonthSelect(1);
        if(onclick=='close') div.onclick = this.bindClose();
        if(onclick.substr(0,2)=='mc') {
            var param = onclick.split('|');
            div.onclick = this.bindMClick(param[1]);
        }
        if(onclick.substr(0,2)=='yc') {
            var param = onclick.split('|');
            div.onclick = this.bindYClick(param[1]);
        }
    }
    if(parent) parent.appendChild(div);
    return div;
}

poDateSelect.prototype.createDay = function createDay(parent,classname,id,left,top,txt)
{
    var div = document.createElement('div');
    div.ID = 'day'+id;
    div.className=classname;
    div.style.width=this.calDayW + 'px';
    div.style.height=this.calDayH + 'px';
    div.style.left=left+ 'px';
    div.style.top=top+ 'px';
    div.innerHTML=txt;
    
    if(classname!=this.noDayCSS) {
        div.onmouseover = this.bindMOverOut(div,classname+'Over');
        div.onmouseout = this.bindMOverOut(div,classname);        
        div.onclick = this.bindDClick(txt);
    }
    
    parent.appendChild(div);
}

poDateSelect.prototype.createDayTitle = function createDayTitle(parent,classname,day,left,top,txt)
{
    var div = document.createElement('div');
    div.ID = 't'+day;
    div.className=classname;
    div.style.height=this.calBarH + 'px';
    div.style.width=this.calDayW+ 'px';
    div.style.left=left+ 'px';
    div.style.top=top+ 'px';
    div.innerHTML=txt;
    parent.appendChild(div);
}

function parseDate(str) {
	var pattern = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
	var matches = new String(str).match(pattern); // is format OK?

	if (matches == null) {
		alert("Please enter date as either mm/dd/yyyy or mm-dd-yyyy.");
		return false;
	}

	// parse date into variables
	month = matches[1];
	day = matches[3];
	year = matches[5];

	if (month < 1 || month > 12) { // check month range
		alert("Month must be between 1 and 12.");
		return false;
	}

	if (day < 1 || day > 31) {
		alert("Day must be between 1 and 31.");
		return false;
	}

	if ((month==4 || month==6 || month==9 || month==11) && day==31) {
		alert("Month " + month + " doesn't have 31 days!")
		return false;
	}

	if (month == 2) { // check for february 29th
		var leapyear = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
		if (day > 29 || (day==29 && !leapyear)) {
			alert("February " + year + " doesn't have " + day + " days!");
			return false;
		}
	}
	var dt = new Date();
	dt.setFullYear(year);
	dt.setMonth(month-1);
	dt.setDate(day);
	return dt;  // date is valid
}
//Date validation 
function ValidateInput(vDate)
{
    var elm;
    elm = document.getElementById(vDate);
    if(elm.value !='')
    {
        if (!parseDate(elm.value))
        {
            elm.value = '';
            elm.focus();
        }
    }
}
