    
var EQUAL = 'equal';
var GREATER = 'greater';
var SMALLER = 'smaller';

var DATE_SEPARATOR = '/'
var PREVIOUS_MONTH_IMG = "/main/inc/calendar/arrowleftmonth.gif";
var NEXT_MONTH_IMG = "/main/inc/calendar/arrowrightmonth.gif";

var CALENDAR_ID = 'fc';

var SetDateRange = 1;




var startDate = dateToString(new Date());
var maxDate = "1/1/2100";

var IsToField = 0;
var MinStartDays = -1;
var MaxStartDays = -1;

var MinToDays = -1;
var MaxToDays = -1;

var MaxAddDays = -1;
var MinAddDays = -1;

var container;

var currentMonth = 1;
var currentYear = 2008;
var currentDay = 0;

var dateField1;
var dateField2;
var dropDowns = new Array();

drawCalendar();

function openCalendar(containderId){

    container = getObj(containderId);
    container.style.display='block';
    CALENDAR_ID = 'fc_' +  containderId;
    
    container.innerHTML = drawCalendar();
    getObj(CALENDAR_ID).style.display='block';
   
}

function HideCalendar(){
    if(getObj(CALENDAR_ID)) getObj(CALENDAR_ID).style.display='none';
    if(container){
       container.innerHTML = "";
       container.style.display='none';
    } 
    
    for(var k=0; k<dropDowns.length;k++){
        getObj(dropDowns[k]).style.display="";
    }
}

function SelectDate(containderId,field1){
    SetDateRange=0;
    HideCalendar();
    startDate = (new Date().getDay() + 1) + DATE_SEPARATOR + (new Date().getMonth() + 1) + DATE_SEPARATOR + new Date().getFullYear() 
    if (!isValidDate(field1.value)) field1.value=startDate;

    if (field1.value != ""){
        var dtParts = field1.value.toString().split(DATE_SEPARATOR) 

        for(var i=1; i<10; i++){
            if(dtParts[0]==("0"+i)) dtParts[0]=i;
            if(dtParts[1]==("0"+i)) dtParts[1]=i;
        }

        currentDay = parseInt(dtParts[0]);
        currentMonth = parseInt(dtParts[1]) - 1;
        currentYear = parseInt(dtParts[2]); 
    }


    openCalendar(containderId);

    dateField1 = field1; 
    setCalendarValues();
}

function SelectDates(containderId, field1, field2, minStartDays, maxStartDays, maxAddDays, isToField) {
    
    MinStartDays = minStartDays;
    MaxStartDays = maxStartDays;
    IsToField = isToField;
    MaxAddDays = maxAddDays;

    HideCalendar();
    if (!isValidDate(field1.value)) field1.value=startDate;
    if (!isValidDate(field2.value)) field2.value=startDate;

     if (field1.value != ""){
        var dtParts = field1.value.toString().split(DATE_SEPARATOR) 

        for(var i=1; i<10; i++){
            if(dtParts[0]==("0"+i)) dtParts[0]=i;
            if(dtParts[1]==("0"+i)) dtParts[1]=i;
        }

        currentDay = parseInt(dtParts[0]);
        currentMonth = parseInt(dtParts[1]) - 1;
        currentYear = parseInt(dtParts[2]); 
    }

    openCalendar(containderId);

    dateField1 = field1;
    dateField2 = field2;

    if (!isValidDate(field2.value)) {
        if (isToField != 1) {
            field2.value = addDaysToDate(dateToString(new Date()), MinStartDays);
        } else {
        field2.value = addDaysToDate(dateToString(new Date()), MaxStartDays);
        }
    }
    
    
    
    if (MinStartDays >= 0 ){
        if (isToField == 1 ){
            startDate = addDaysToDate(field2.value, MinStartDays );
        }else{
            startDate = addDaysToDate( dateToString(new Date()), MinStartDays);
        }
    }    
    
    if (MaxStartDays >= 0){
        maxDate=addDaysToDate(startDate, MaxStartDays );
    }

   
    setCalendarValues();
}

document.all?document.attachEvent('onclick',checkClick):document.addEventListener('click',checkClick,false);


function SetObjectsToHide(){
    for(var i=0;i<arguments.length;i++){
        dropDowns.push(arguments[i]);        
    }
}

function drawCalendar(){
    if(IsOldBrowser()) {
        for(var k=0; k<dropDowns.length;k++){
            getObj(dropDowns[k]).style.display="none";
        }
    }

    var chtml="";
    
    chtml+=('<table id="'+CALENDAR_ID+'" class="CalendarFrame" border="0" style="position:absolute;display:none;z-index:1000" cellpadding=2>');
    chtml+=('<tr><td style="cursor:pointer" class="MonthHead" onclick="GotoPreviousMonth()"><img src="' + PREVIOUS_MONTH_IMG + '">');
    chtml+=('</td><td colspan=5 id="ttl" class="MonthHead">'+ monthName[currentMonth] + ' ' + currentYear +'</td>');
    chtml+=('<td align="right" style="cursor:pointer"  class="MonthHead" onclick="GotoNextMonth()"><img src="'+ NEXT_MONTH_IMG + '"></td></tr>');

    for (var i=0; i<dayName.length; i++){
        chtml+=('<td class="dayHead">' + dayName[i] + '</td>');
    }
    chtml+=('</tr>');

    for(var raw=1;raw<=6;raw++) {
	    chtml+=('<tr id="r' + raw + '" >');
	    for(var col=1;col<=7;col++) {
		    num=7 * (raw-1) + col;
		    chtml+=('<td id="val' + num + '" style="width:18px;height:18px;">&nbsp;</td>');
	    }
	    chtml+=('</tr>');
    }
    
    chtml+=('<tr><td colspan="7" align="center" ><a onclick="HideCalendar()" style="cursor:default" >Close</a><br/><div id="deb" style="display:none"><div/></td></tr>');
        
    chtml+=('</table>');
    
    return chtml;
}


function setCalendarValues(){
   // var newDate = new Date("1" + DATE_SEPARATOR + (currentMonth + 1) + DATE_SEPARATOR + currentYear);
    var newDate = new Date(currentYear, currentMonth,1);
    //alert(newDate.getDay())
    //document.getElementById('deb').innerHTML = "startDate=" + startDate + ", maxDate=" + maxDate
    
    var val = 0;   
    var rawHasValues=0; 
    for(var raw=1;raw<=6;raw++) {
        rawHasValues=0;

	    for(var col=1;col<=7;col++) {
		    num=7 * (raw-1) + col;
		    
		    var dayObj = document.getElementById('val' + num)
            dayObj.className="dayNormal";
		    if ((raw == 1 && ((col-1) < newDate.getDay())) || val  >= GetMonthLastDay(currentMonth, currentYear)){
	            dayObj.innerHTML = "&nbsp;";
		    }else{
		        rawHasValues=1;
                val++;
	            dayObj.innerHTML = val;
	            //dayObj.innerHTML = val + DATE_SEPARATOR + (currentMonth + 1);
	            
	            var d1 = val + DATE_SEPARATOR + (currentMonth + 1) + DATE_SEPARATOR + currentYear;
	            //|| dateDiff(d1,maxDate)<0 
	            //if ((SetDateRange==1) && ((dateDiff(startDate,d1) < 0) ) ){
	            if ((SetDateRange==1) && (( CompareDates(d1,startDate) == SMALLER || CompareDates(d1, maxDate) == GREATER  ) ) ){
                    disableDay(dayObj);
                }else{
                    enableDay(dayObj);
                    if (val>0 && val==currentDay){
                        markDay(dayObj);
                    }
	            }
	            
	        }
	    }
	    
	    document.getElementById('r' + raw).style.display=""
	    if(rawHasValues==0) document.getElementById('r' + raw).style.display="none";
    }
}


function disableDay(obj) {
    obj.className="dayDisabled"
	
	obj.onmouseover=null;
    obj.onmouseout=null;
    obj.onclick=null;
}

function enableDay(obj) {
    obj.className="dayNormal"

    obj.onmouseover=onDateOver;
    obj.onmouseout=onDateOut;
    obj.onclick=onDateSelect;
}

function markDay(obj) {
    obj.className="dayMarked"
    obj.onmouseover=onDateOver;
    obj.onmouseout=onDateOver;
    obj.onclick=onDateSelect;

}

function GetMonthLastDay(mm,yyyy){
    var isLeap = new Date(yyyy,1,29).getDate() == 29;
    var vals = new Array('31','28','31','30','31','30','31','31','30','31','30','31');
    if (isLeap) vals[1] = 29;
    return vals[mm]
}

function GotoNextMonth(){
    currentMonth++;
    if(currentMonth > 11 ) {
        currentMonth = 0;
        currentYear++;
    }
    setCalendarValues();
    getObj("ttl").innerHTML = monthName[currentMonth] + ' ' + currentYear;
}

function GotoPreviousMonth(){
    currentMonth--;
    
    if(currentMonth < 0 ) {
        currentMonth = 11;
        currentYear--;
    }
    setCalendarValues()
    getObj("ttl").innerHTML = monthName[currentMonth] + ' ' + currentYear;
}

function CompareDates(date1Str,date2Str){
    var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
    
    var dtParts = date1Str.toString().split(DATE_SEPARATOR) 
    for(var i=1; i<10; i++){
        if(dtParts[0]==("0"+i)) dtParts[0]=i;
        if(dtParts[1]==("0"+i)) dtParts[1]=i;
    }

    var dd1 = parseInt(dtParts[0]);
    var mm1 = parseInt(dtParts[1]);
    var yy1 = parseInt(dtParts[2]);
    
    dtParts = date2Str.toString().split(DATE_SEPARATOR) 
    for(var i=1; i<10; i++){
        if(dtParts[0]==("0"+i)) dtParts[0]=i;
        if(dtParts[1]==("0"+i)) dtParts[1]=i;
    }

    var dd2 = parseInt(dtParts[0]);
    var mm2 = parseInt(dtParts[1]);
    var yy2 = parseInt(dtParts[2]);
    
    if(dd1==dd2 && mm1==mm2 && yy1==yy2) return EQUAL
    if (yy1>yy2) return GREATER
    if (yy1==yy2 && mm1>mm2) return GREATER
    if (yy1==yy2 && mm1==mm2 && dd1>dd2) return GREATER
    
    return SMALLER
}


function dateDiff(date1Str,date2Str){
    var one_day=1000*60*60*24
    var sDate = new Date(date1Str);
    var eDate = new Date(date2Str);
    return  Math.abs(Math.round((sDate-eDate)/one_day));

/*
    var one_day=1000*60*60*24
    var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/; // requires 4 digit year

    //date1
    var matchArray = date1Str.match(datePat);
    month = parseInt(matchArray[3]); // parse date into variables
    day = parseInt(matchArray[1]);
    year = parseInt(matchArray[4]);
    var date1=new Date( year, month, day);

    //date2
    matchArray = date2Str.match(datePat);
    month = parseInt(matchArray[3]); // parse date into variables
    day = parseInt(matchArray[1]);
    year = parseInt(matchArray[4]);
    var date2=new Date( year, month, day);


    //Calculate difference btw the two dates, and convert to days
    var days = Math.ceil((date2.getTime()-date1.getTime())/(one_day));

    return days;
    
    */
}

function addDaysToDate(dateStr, days) {
    //if(days == 0) return dateStr;
    var dtParts = dateStr.toString().split(DATE_SEPARATOR) 
    
    for(var i=1; i<10; i++){
        if(dtParts[0]==("0"+i)) dtParts[0]=i;
        if(dtParts[1]==("0"+i)) dtParts[1]=i;
    }

    var dd = parseInt(dtParts[0]);
    var mm = parseInt(dtParts[1]);
    var yy = parseInt(dtParts[2]);
    days = parseInt(days) 
 
    //alert('dd='+dd+',mm='+mm+',yy='+yy+',ld='+  GetMonthLastDay(mm,yy))
    for(var j=1; j<=days;j++){
        if (dd<GetMonthLastDay(mm-1,yy)){
            dd++;
        }else{
            dd=1;
           
            if (mm<12){
                mm++;
            }else{
                mm=1;
                yy++;
            }
        }
        
    }
    
    return ((dd>9)?dd:"0"+dd) + DATE_SEPARATOR + ((mm>9)?mm:"0"+mm) + DATE_SEPARATOR + yy; 
    
   //var newDate = new Date(yy,mm,dd);
    //return dateToString(newDate);

    //newDate.setDate( parseInt(newDate.getDate()+ days) );   
    
    //return dateToString(newDate);
}

function dateToString(dt){
    dt = new Date(dt);
    
    var dd = dt.getDate();
    dd = dd>9?dd:'0'+dd; 
    
    var mm = parseInt(dt.getMonth() + 1);
    mm = mm>9?mm:'0'+mm; 
    
    return dd + DATE_SEPARATOR + mm + DATE_SEPARATOR +  dt.getFullYear();
}
/*
function  stringToDate(dateStr){
    
    var dtParts = dateStr.toString().split(DATE_SEPARATOR) 
    var dd = parseInt(dtParts[0]);
    var mm = parseInt(dtParts[1]);
    var yy = parseInt(dtParts[2]);
    
    var newDate = new Date;
    newDate.setDate(dd);
    newDate.setMonth(mm - 1); // January = 0
    newDate.setFullYear(yy);  
    
    return newDate;
}
*/
function isValidDate(dateStr) {
    // Date validation function courtesty of 

    // Checks for the following valid date formats:
    // DD/MM/YY   DD/MM/YYYY   DD-MM-YY   DD-MM-YYYY

    var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/; // requires 4 digit year

    var matchArray = dateStr.match(datePat); // is the format ok?
    if (matchArray == null) {
        //alert(dateStr + " Date is not in a valid format.")
        return false;
     }
  
    month = matchArray[3]; // parse date into variables
    day = matchArray[1];
    year = matchArray[4];

    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 isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
        if (day>29 || (day==29 && !isleap)) {
            alert("February " + year + " doesn't have " + day + " days!");
            return false;
        }
    }
    return true;
}//isValidDate

function checkClick(e) {
	e?evt=e:evt=event;
	CSE=evt.target?evt.target:evt.srcElement;
	if (getObj(CALENDAR_ID))
		if (!isChild(CSE,getObj(CALENDAR_ID)))
		      HideCalendar(); 

			//getObj(CALENDAR_ID).style.display='none';
			
			
}

function isChild(s,d) {
	while(s) {
		if (s==d) 
			return true;
		s=s.parentNode;
	}
	return false;
}

function Left(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;
}

function Top(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;
}


/*Event handlers*/

function getObj(objID)
{
    if (document.getElementById) {return document.getElementById(objID);}
    else if (document.all) {return document.all[objID];}
    else if (document.layers) {return document.layers[objID];}
}

function evtTgt(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;
}
function EvtObj(e){if(!e)e=window.event;return e;}

function onDateOver(e) {

	evtTgt(EvtObj(e)).className="dayHover";
}

function onDateOut(e) {
	evtTgt(EvtObj(e)).className="dayNormal";
}

function onDateSelect(e) {
    var dd = parseInt(evtTgt(EvtObj(e)).innerHTML)>9?evtTgt(EvtObj(e)).innerHTML:'0'+evtTgt(EvtObj(e)).innerHTML;
    var mm = parseInt(currentMonth) + 1 ;
    mm = mm>9?mm:'0'+mm; 
    
    dateField1.value = dd + DATE_SEPARATOR + mm + DATE_SEPARATOR + currentYear;
    
    if (!IsToField && dateField2){
        if (!isValidDate(dateField2.value)) dateField2.value = addDaysToDate(dateField1.value,MaxAddDays)
        
         datesDiff=dateDiff(dateField1.value,dateField2.value);
         if(datesDiff < MaxAddDays || datesDiff > MaxAddDays){
            dateField2.value = addDaysToDate(dateField1.value,MaxAddDays);
         }
    }
    HideCalendar();
 }
 
 function IsOldBrowser(){
    if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)){ 
         var ffversion=new Number(RegExp.$1) 
         if (ffversion>=2) return false;
    }
    
    if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)){ 
         var ieversion=new Number(RegExp.$1) 
         if (ieversion>=7) return false;
    }
    return true;
}


var STR_PAD_LEFT = 1;
var STR_PAD_RIGHT = 2;
var STR_PAD_BOTH = 3;


function pad(str, len, pad, dir) {

    if (typeof (len) == "undefined") { var len = 0; }
    if (typeof (pad) == "undefined") { var pad = ' '; }
    if (typeof (dir) == "undefined") { var dir = STR_PAD_RIGHT; }

    if (len + 1 >= str.length) {

        switch (dir) {

            case STR_PAD_LEFT:
                str = Array(len + 1 - str.length).join(pad) + str;
                break;

            case STR_PAD_BOTH:
                var right = Math.ceil((padlen = len - str.length) / 2);
                var left = padlen - right;
                str = Array(left + 1).join(pad) + str + Array(right + 1).join(pad);
                break;

            default:
                str = str + Array(len + 1 - str.length).join(pad);
                break;

        } // switch

    }

    return str;

}