
// variable declarations
var w_d = new Date()
var w_monthname;
var w_dayname;
var ObjControlID;
var ObjWeeklyCal;
var format;
var w_StartOfWeek = 1; // Monday

// image title
var prev_month_title = "Previous month";
var next_month_title = "Next month";
var close_title = "Close";

var objBtnToSetFocus; // to save the id of button to set focus.

// set the default position
// for the week end days (Staurday,Sunday)
var weekend_pos = new Array(6,0);


var w_min_year = 1901;
var w_max_year = 2060;

var gx = 0;
var gy = 0;

var w_linkedInputText_1;
var w_linkedInputText_2;


var HideWeekCol = true;

//For Postion of calendar.
function findPos(obj)
{
var curleft = curtop = curBottom = curRight = 0;
    if (obj.offsetParent)
     {  curleft = obj.offsetLeft;
        curtop = obj.offsetTop;
        while (obj = obj.offsetParent)
        {
            curleft += obj.offsetLeft
            curtop += obj.offsetTop
        }
      }
    return [curleft,curtop];
}
function w_funMouseMove(evnt) 
{   
	gx = evnt.pageX;
	gy = evnt.pageY;
	return true;   
}

//
// handle mousemove
//
if ((navigator.appName.indexOf("Netscape") != -1) || (navigator.appName.indexOf("Opera") != -1))
{
    if (document.onmousemove == undefined)
	    document.onmousemove = w_funMouseMove;
}

//
//
function w_changeMonth(id)
{
    id = ObjControlID + '_'+id;
    var box = document.getElementById(id);
    var mm = box.options[box.selectedIndex].value;    
    w_d.setMonth(mm);
    w_renderCalendar(0);
}

//
function w_changeYear(id)
{
     id = ObjControlID + '_'+id;
    var box = document.getElementById(id);
    var yy = box.options[box.selectedIndex].value;    
    w_d.setFullYear(yy);
    w_renderCalendar(0);
}


//
function w_getWeek(year,month,day){
    //Find JulianDay 
    month += 1; //use 1-12
    var a = Math.floor((14-(month))/12);
    var y = year+4800-a;
    var m = (month)+(12*a)-3;
    var jd = day + Math.floor(((153*m)+2)/5) + 
                 (365*y) + Math.floor(y/4) - Math.floor(y/100) + 
                 Math.floor(y/400) - 32045;      // (gregorian calendar)
    
    //now calc weeknumber according to JD
    var d4 = (jd+31741-(jd%7))%146097%36524%1461;
    var L = Math.floor(d4/1460);
    var d1 = ((d4-L)%365)+L;
    NumberOfWeek = Math.floor(d1/7) + 1;
    return NumberOfWeek;        
}

function w_writeDayNumber(d)
{
    var dd = new Date(d);
	var temp = new Date(d);
	// reset data array
	for (i=0;i<6;i++)
	{
 		for (j=0;j<7;j++)
 		{
			document.getElementById(ObjControlID+"_w_c" +i+""+j).innerHTML= "";
			document.getElementById(ObjControlID+"_w_c" +i+""+j).className = "day_out";
 	    }
        document.getElementById(ObjControlID+"_week_" +i).innerHTML = '';
	}
	
	// set to the first day of the month
	dd.setDate(1);
	
	// fill data array
	i = 0;
	j = 0;

    // previous month's days
    j = dd.getDay() - w_StartOfWeek;
    if (j<0)
        j = 7 + j;
    
    if (j > 0)
    {
        temp.setDate(dd.getDate()-1);
        for (k=j-1; k>=0; k--)
        {
			document.getElementById(ObjControlID+"_w_c" +i+""+k).innerHTML= temp.getDate();
		    if ((weekend_pos[0] == k) || (weekend_pos[1] == k))
		        document.getElementById(ObjControlID+"_w_c" +i+""+k).className = "day_out";
		    else
			    document.getElementById(ObjControlID+"_w_c" +i+""+k).className = "day_out";

            temp.setDate(temp.getDate()-1);
        }
    }

	var week = -1;
    var iStartWeek = -1;
    var iEndWeek = -1;
    var weekEl;
    var dayval;

	do 
	{
	    // get the position according to
	    // StartOfWeek
	    j = dd.getDay() - w_StartOfWeek;
	    if (j<0)
	        j = 7 + j;
	
	    if (iStartWeek==-1)
	        iStartWeek = j;
        iEndWeek = j;
        	        
		dayval = dd.getDate();

	    // get the week number
	    if (week < 0)
	        week = w_getWeek(w_d.getFullYear(), w_d.getMonth(), dayval);
	        
		document.getElementById(ObjControlID+"_w_c" +i+""+j).innerHTML='<input type="button" id="'+ObjControlID+'_btn_w_c'+i+""+j+'" value="' + dayval + '"  style="border-style:none;width:35px" class="date">';
		
		// set week ends layout
		if ((weekend_pos[0] == j) || (weekend_pos[1] == j))
		{
		    document.getElementById(ObjControlID+"_w_c" +i+""+j).className = "weekends";

		   
		    }
		else
		    document.getElementById(ObjControlID+"_w_c" +i+""+j).className = "day";
        {
            // set today layout 
            var today;
            
            // To Set the border of the current Date.
             if (document.getElementById(ObjControlID + '_hidDate').value != "" )
            {
                var dtObj = document.getElementById(ObjControlID + '_hidDate').value.split("/");  
                var dtDD = parseInt(dtObj[1], 10);
                var dtMM = parseInt(dtObj[0], 10) - 1;
                var ddYY = parseInt(dtObj[2], 10);
                today  = new Date(ddYY,dtMM,dtDD);
                
            }
            else
            {
                today  = new Date();   
            }
			
			if ((today.getDate() ==  dayval) && (today.getMonth() == w_d.getMonth()) && (today.getFullYear() == w_d.getFullYear()) )
			    {
				    document.getElementById(ObjControlID+"_w_c" +i+""+j).className = "today";
				    objBtnToSetFocus = ObjControlID+"_btn_w_c" +i+""+j
				}
        }

        ////////
        // dynamically set the onclick event
        // only on the day of the selected month
        ////////

        var object = document.getElementById(ObjControlID + "_btn_w_c" +i+""+j);
        object.rownumber = i;
        object.colnumber = j;

        if(window.addEventListener){ // Mozilla, Netscape, Firefox
	        object.addEventListener('click', w_setDate, false);
        } else { // IE
	        object.attachEvent('onclick', w_setDate);
        }

        ///////
                
	    if (week < 0)
	        document.getElementById(ObjControlID+"_week_" +i).innerHTML = '';
	    else if (w_StartOfWeek != 1)
	        document.getElementById(ObjControlID+"_week_" +i).innerHTML = "&lt;";
	    else
	        document.getElementById(ObjControlID+"_week_" +i).innerHTML = week;

        weekEl = document.getElementById(ObjControlID+"_week_" +i);

        // if HideWeekCol change the class
        // hide the week col and its header
        if (HideWeekCol) 
        {
            weekEl.className = "weekhidden";
            document.getElementById(ObjControlID+"_weekHeader").className = "weekhidden";
        }
        else
        {
            document.getElementById(ObjControlID+"_weekHeader").className = "week";
            weekEl.className = "weeksel";
        }
        
		if (j == 6) 
		{
            ////////
            // dinamically set the onclick event
            // on the week number
            ////////
            weekEl.startweek = iStartWeek;
            weekEl.endweek = iEndWeek;
            weekEl.rowweek = i;

            if(window.addEventListener){ // Mozilla, Netscape, Firefox
                weekEl.addEventListener('click', w_SetWeekDate, false);
            } else { // IE
                weekEl.attachEvent('onclick', w_SetWeekDate);
            }
            ///////

		    week = -1;
		    iStartWeek = -1;
		    iEndWeek = -1;
		    i++;
		}
	
		dd.setDate(dd.getDate() + 1);
	
	} while (dd.getDate() != 1);
	
	if ((iStartWeek!=-1) && (iEndWeek!=-1))
	{
        weekEl = document.getElementById(ObjControlID+"_week_" +i);
        
        ////////
        // dinamically set the onclick event
        // on the week number
        ////////
        weekEl.startweek = iStartWeek;
        weekEl.endweek = iEndWeek;
        weekEl.rowweek = i;

        if(window.addEventListener){ // Mozilla, Netscape, Firefox
            weekEl.addEventListener('click', w_SetWeekDate, false);
        } else { // IE
            weekEl.attachEvent('onclick', w_SetWeekDate);
        }
        ///////
    }
    
    // next month's days
    if ((j < 7))
    {
        temp = dd;
        for (k=j+1; k<7; k++)
        {
			document.getElementById(ObjControlID+"_w_c" +i+""+k).innerHTML= temp.getDate();
	        if ((weekend_pos[0] == k) || (weekend_pos[1] == k))
	            document.getElementById(ObjControlID+"_w_c" +i+""+k).className = "day_out";
	        else
			    document.getElementById(ObjControlID+"_w_c" +i+""+k).className = "day_out";
            temp.setDate(temp.getDate()+1);
        }
    }


}


// 
// render calendar accordint to the selected
// month (k)
//
function w_renderCalendar(k) 
{
    var monthsel_html='';

	w_d.setMonth(w_d.getMonth() + k);
    
    monthsel_html += '<select class="nav" id="'+ ObjControlID +'_w_sel_month"  onchange="w_changeMonth(\'w_sel_month\')">';
    for (im=0; im < 12; im++)
    {
        monthsel_html += '<option value="' + im + '" ' + ((im == w_d.getMonth())?'selected ':'')+ '>'+ w_monthname[im] + '</option>';
    }
    monthsel_html += '</select>';
    monthsel_html += ' ';


    monthsel_html += '<select class="nav" id="'+ObjControlID+'_w_sel_year"  onchange="w_changeYear(\'w_sel_year\')">';

    for (im = w_min_year; im <= w_max_year; im++)
    {
        monthsel_html += '<option value="' + im + '" ' + ((im == w_d.getFullYear())?'selected ':'')+ '>'+ im + '</option>';
    }
    monthsel_html += '</select>';
    monthsel_html += ' ';

	document.getElementById(ObjControlID + '_w_month_year').innerHTML = monthsel_html;

    w_writeDayNumber(w_d);
 }

//
// set clicked date
//
function w_setDate(evt)
{
	var m="";
	var g="";
	var mMonth;
	var mDay;
	var i,j;
	

	var e_out;
	var ie_var = "srcElement";
	var moz_var = "target";
	var prop_var = "rownumber";
	
	var year;
	var month;

	// "target" for Mozilla, Netscape, Firefox et al. ; "srcElement" for IE
	evt[moz_var] ? e_out = evt[moz_var][prop_var] : e_out = evt[ie_var][prop_var];
	i = e_out;
	prop_var = "colnumber";
	evt[moz_var] ? e_out = evt[moz_var][prop_var] : e_out = evt[ie_var][prop_var];
	j = e_out;

		mMonth = (w_d.getMonth()+1);
				
		mDay = document.getElementById(ObjControlID+ "_btn_w_c"+i+j).value;  
			
		
		if(mMonth<10)
			m = "0" + mMonth
		else
			m = mMonth
	
		if (mDay<10)
			g = "0" + mDay
		else
			g = mDay	
		
        // set the selected date
        try
        {
        year = w_d.getFullYear().toString();
        month = w_monthname[mMonth-1];
        
                switch(format.toLowerCase())
                {
                 case "dd/mmm/yyyy":
                      document.getElementById(w_linkedInputText_1).value = g + "/" + month + "/" + year;
                      break;
                 case "mmm/dd/yyyy":
                      document.getElementById(w_linkedInputText_1).value = month + "/" + g + "/" + year;
                      break;
                 case "dd/mmm/yy":
                      document.getElementById(w_linkedInputText_1).value = g + "/" + month + "/" + year.substring(2,4);
                      break;         
                 case "mmm/dd/yy":
                      document.getElementById(w_linkedInputText_1).value = month + "/" + g + "/" + year.substring(2,4);
                      break;
                 case "dd/mm/yyyy":
                      document.getElementById(w_linkedInputText_1).value = g + "/" + m + "/" + year;
                      break;
                 case "dd/mm/yy":
                      document.getElementById(w_linkedInputText_1).value = g + "/" + m + "/" + year.substring(2,4);
                      break;
                 case "mm/dd/yy":
                      document.getElementById(w_linkedInputText_1).value = m + "/" + g + "/" + year.substring(2,4);
                      break;
                 case "dd/mm/yyyy":
                      document.getElementById(w_linkedInputText_1).value = g + "/" + m + "/" + year;
                      break;                               
                 default:
                      document.getElementById(w_linkedInputText_1).value = m + "/" + g + "/" + year;        
                }
             document.getElementById(w_linkedInputText_2).value = m + "/" + g + "/" + w_d.getFullYear();
             document.getElementById(ObjControlID+'_txtDatehidden').value = document.getElementById(w_linkedInputText_1).value;  
 		}
 		
 		catch(e)
 		{}
	    w_hiddenCalendar();
}

//
// set week start and end date
// in the selected month
//
function w_SetWeekDate(evt)
{
	var m="";
	var g="";
	var mMonth;
	var mDay;
	var result = '';
	var startW = '';
	var endW = '';

	var e_out;
	var ie_var = "srcElement";
	var moz_var = "target";
	var prop_var = "startweek";
    var istartWeek, iendWeek;
    var rowWeek;
    
	// "target" for Mozilla, Netscape, Firefox et al. ; "srcElement" for IE
	evt[moz_var] ? e_out = evt[moz_var][prop_var] : e_out = evt[ie_var][prop_var];
	istartWeek = e_out;
	prop_var = "endweek";
	evt[moz_var] ? e_out = evt[moz_var][prop_var] : e_out = evt[ie_var][prop_var];
	iendWeek = e_out;

	prop_var = "rowweek";
	evt[moz_var] ? e_out = evt[moz_var][prop_var] : e_out = evt[ie_var][prop_var];
	rowWeek = e_out;


    mMonth = (w_d.getMonth()+1);

    if(mMonth<10)
        m = "0" + mMonth
    else
        m = mMonth

    mDay = document.getElementById(ObjControlID+"_w_c"+rowWeek+istartWeek).innerHTML;  	
    if (mDay<10)
	    g = "0" + mDay
    else
	    g = mDay	
    		
    startW = m + "/" + g + "/" + w_d.getFullYear();

    mDay = document.getElementById(ObjControlID+"_w_c"+rowWeek+iendWeek).innerHTML;  	
    if (mDay<10)
	    g = "0" + mDay
    else
	    g = mDay	

    endW = m + "/" + g + "/" + w_d.getFullYear();
    
    // set the selected date
    try
    {
    document.getElementById(w_linkedInputText_1).value = startW;
    document.getElementById(w_linkedInputText_2).value = endW;
    }
    catch(e)
    {};
	
    w_hiddenCalendar();
}

//
// display date picker
// hide the col week
//
function w_displayDatePicker(linkedId1)
{

	w_linkedInputText_1 = linkedId1;
	w_linkedInputText_2 = null;

    HideWeekCol = false;//true;	
    w_displayCal(); 
}

//
// display calendar
//
function w_displayCalendar(obj,linkedId1, linkedId2) 
{

    if(ObjControlID != null)
    {
         w_hiddenCalendar();
    }
    
     w_min_year = 1901;
     w_max_year = 2060;
       
    ObjControlID=obj;
    ObjWeeklyCal=obj+'_weeklyCalendar';
	w_linkedInputText_1 = linkedId1;
	w_linkedInputText_2 = linkedId2; 

    HideWeekCol = true;//false;	

    // To Show the current date or last selected date in the calendar.
    if (document.getElementById(linkedId2).value != "" )
    {
        var dtObj = document.getElementById(linkedId2).value.split("/");  
        var dtDD = parseInt(dtObj[1], 10);
        var dtMM = parseInt(dtObj[0], 10) - 1;
        var ddYY = parseInt(dtObj[2], 10);
        w_d  = new Date(ddYY,dtMM,dtDD);
        
    }
    else
    {
        w_d  = new Date();   
    }
    
    w_displayCal(linkedId1,obj+'_imgCalender',ObjWeeklyCal);    
}

function w_displayCal(linkedId1,linkedId3,linkedId4)
{       
        
	    w_renderCalendar(0);
        var myObj = document.getElementById(linkedId3);
        var pos = findPos(myObj);
        var iWeeklyCalWidth = document.getElementById(linkedId4).offsetWidth;
        if (screen.width > (pos[0]+iWeeklyCalWidth))
        {
            document.getElementById(linkedId4).style.left=pos[0] + 22 + 'px';
        }
        else
        {
            document.getElementById(linkedId4).style.left=pos[0] + 22 - iWeeklyCalWidth + 'px';
        }
        //Dynamic Height Setting
        var iWeeklyCalHeight = document.getElementById(linkedId4).offsetHeight;
        if (screen.height -40  > (pos[1]+iWeeklyCalHeight))
        {
          document.getElementById(linkedId4).style.top=pos[1] + 20 +'px';
        }
        else
        {
           document.getElementById(linkedId4).style.top=pos[1] + 20 - iWeeklyCalHeight +'px';
        }


		document.getElementById(linkedId4).style.visibility = "visible";
		document.getElementById(objBtnToSetFocus).focus();// To Set The Focus on button.
}

//
// hidden calendar
//                                                                                                                                                                  
function w_hiddenCalendar() 
{   
	document.getElementById(ObjWeeklyCal).style.visibility='hidden';
		
    // remove the attached events	
    var i, j;
    var week;
    var daycol;
    
    for (i = 0; i < 7; i++)
    {
        // detach event from week element
        try
        {
            week = document.getElementById(ObjControlID+"_week_" +i);
            if(window.removeEventListener()){ // Mozilla, Netscape, Firefox
	            week.removeEventListener('click', w_SetWeekDate, false);
            } else { // IE
	            week.detachEvent('onclick', w_SetWeekDate);
            }
        }
        catch(e){};

        // detach event from each day col
        try
        {
            for (j=0; j <7; j++)
            {
                daycol = document.getElementById(ObjControlID+"_btn_w_c" +i+""+j);
                if(window.removeEventListener()){ // Mozilla, Netscape, Firefox
	                daycol.removeEventListener('click', w_setDate, false);
                } else { // IE
	                daycol.detachEvent('onclick', w_setDate);
                }
            }
        }
        catch(e){};
    }
	ObjControlID =null;
}


function w_writeDayname(controlID)
{
    var mDay;
    document.write('<tr>');
    for(wd =0; wd < 7; wd++)
    {
        mDay = wd + w_StartOfWeek;

        if (mDay > 6)
            mDay = mDay-7;
        document.write('<td class="wd">' + w_dayname[mDay] + '</td>');
      
        if (w_dayname[mDay] == w_dayname[mDay])
            weekend_pos[0] = wd;
        if (w_dayname[mDay] == w_dayname[mDay])
            weekend_pos[1] = wd;

    }
    document.write('<td class="week" id="'+ controlID + '_weekHeader">Week</td>');

    document.write('</tr>');

}

function buildWeeklyCalendar(WeekStart, controlID, Format, Days, Months, sPath)
{
 var imgLeft = sPath + "/inc/img/arrow_left.gif";
 var imgRight = sPath + "/inc/img/arrow_right.gif";
 var imgClose = sPath + "/inc/img/close.jpg";

 format = Format;

if(Days != null && Days != "")
    w_dayname = Days.split(";");
else
    w_dayname = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");
    
if(Months != null && Months != "")
    w_monthname =Months.split(";");
else
    w_monthname = new Array("January","February","March","April","May","June","July","August","September","Octber","November","December");      
    
    if (WeekStart != undefined)
        w_StartOfWeek = WeekStart;
    
    document.write('<div id="' + controlID + '_weeklyCalendar" class="calendar" style="left:384px;top:512px" >');
    document.write('<table class="calendar">');
    document.write('<tr><td colspan="8">');
    // header table
    document.write('<table width="100%" cellpading="0" cellspacing="0">');

    document.write('<tr class="firstrow"><td width="8px" onClick="w_renderCalendar(-1);" align="right" ><img src="'+imgLeft+ '"title="' + prev_month_title + '" border="0"></td>');
    document.write('<td width="8px" onClick="w_renderCalendar(1);" align="left" ><img src="'+imgRight+ '"title="' + next_month_title + '" border="0"></td>');
    document.write('<td colspan="4" id="'+controlID+'_w_month_year" align="center">');

    document.write('<select id="'+controlID+'_w_sel_month">');

    for (im=0; im < 12; im++)
    {
        document.write('<option value="' + im + '" ' + ((im == w_d.getMonth())?'selected ':'')+ '>'+ w_monthname[im] + '</option>');
    }
    document.write('</select>');
    document.write(' ');
    document.write('<select id="'+controlID+'_w_sel_year">');
    
     w_min_year = 1901;
     w_max_year = 2060;
    
    for (im = w_min_year; im <= w_max_year; im++)
    {
        document.write('<option value="' + im + '" ' + ((im == w_d.getFullYear())?'selected ':'')+ '>'+ im + '</option>');
    }
    document.write('</select>');

    document.write('</td>');

    document.write('<td align="center" onClick="w_hiddenCalendar()"><img src="'+imgClose+ '"title="' + close_title + '" border="0"></td>');

    document.write('</tr>');

    document.write('</table>');
    // end header table

    document.write('</td></tr>');

    w_writeDayname(controlID);

    // init day/week number
    for (i=0;i<6;i++) 
    {
	    document.write('  <tr>');
	    
	    for (j=0;j<7;j++)
	    {
	      document.write('<td  class="day_out" onmouseover="return escape(\'This is area 1\')" id="'+controlID+'_w_c' + i + j + '">&nbsp;</td>');
	    }
	    
	    document.write('<td class="weeksel" id="'+controlID+'_week_'+ i + '">&nbsp;Select&nbsp;</td>');
	    document.write('  </tr>');
    }
    document.write('</table></div>');

}


// Start: Checks the valid date on the blur event
function isValidDateCal(dateStr, msg1,msg2,msg3,msg4,msg5,msg6,msg7,msg8,msg9) 
{
	var dateval = dateStr.value;
	if(dateval == "")
	{
		return true ; 
	}
	else
	{                                           
		var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{2,4})/;
		var matchArray = dateval.match(datePat);     // FORMAT OK ?

	if (matchArray == null) 
	{//Check date value
		//alert("Date is not in a valid format. Please enter date in mm/dd/yyyy Format.")
		alert(msg1); 
		
		return false;
	} 

		day = matchArray[3];                         // PARSE DATE INTO VARIABLES
		month = matchArray[1];
		year = matchArray[4];
	if (day < 1 || day > 31) 
	{                                              // CHECK DAY RANGE
		//alert("Day must be between 1 and 31.");  
		alert(msg2); 
		
		return false;
	}
	if (month < 1 || month > 12) 
	{                                              // CHECK MONTH RANGE
		//alert("Month must be between 1 and 12."); 
		alert(msg3); 
		
		return false;
	}
	if ((month==4 || month==6 || month==9 || month==11) && day==31) 
	{                                              // CHECK 30 DAYS MONTHS RANGE
		//alert("Month "+month+" doesn't have 31 days!");
		alert(msg4+" "+month+" " +msg5); 
		
		return false
	}
	if(year < 1900 || year > 2050) 
	{
		//alert("Please enter year between 1900 & 2050.");
		alert(msg6); 
		
		return false;
	}
	if (month == 2) 
	{                                              // CHECK FEB,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!");
		alert(msg7+", " +year+" "+msg8+" "+day+" "+msg9); 
		
		return false;
		}
	}
	  
	return true;                                  // DATE IS VALID
	}
}
// End: Checks the valid date on the blur event