var winCal;
var dtToday=new Date();
var Cal;
//var docCal;
var divCal;

var MonthName = ["January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December"];
var WeekDayName = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
var exDateTime;//Existing Date and Time

//Configurable parameters
var cnTop="200";//top coordinate of calendar window.
var cnLeft="500";//left coordinate of calendar window
var WindowTitle ="DateTime Picker";//Date Time Picker title.
var WeekChar=2;//number of character for week day. if 2 then Mo,Tu,We. if 3 then Mon,Tue,Wed.
var CellWidth=20;//Width of day cell.
var DateSeparator="-";//Date Separator, you can change it to "/" if you want.
var TimeMode=24;//default TimeMode value. 12 or 24

function NewCalDiv(pCtrl,pFormat,pShowTime,pTimeMode, calId)
{
	Cal=new Calendar(dtToday);
	if ((pShowTime!=null) && (pShowTime))
	{
		Cal.ShowTime=true;
		if ((pTimeMode!=null) &&((pTimeMode=='12')||(pTimeMode=='24')))
		{
			TimeMode=pTimeMode;
		}
	}
	if (pCtrl!=null)
		Cal.Ctrl=pCtrl;
	if (pFormat!=null)
		Cal.Format=pFormat.toUpperCase();

	exDateTime=document.getElementById(pCtrl).value;

	if (exDateTime!="")//Parse Date String
	{
		var Sp1;//Index of Date Separator 1
		var Sp2;//Index of Date Separator 2
		var tSp1;//Index of Time Separator 1
		var tSp1;//Index of Time Separator 2
		var strMonth;
		var strDate;
		var strYear;
		var intMonth;
		var YearPattern;
		var strHour;
		var strMinute;
		var strSecond;
		//parse month
		Sp1=exDateTime.indexOf(DateSeparator,0)
		Sp2=exDateTime.indexOf(DateSeparator,(parseInt(Sp1)+1));

		if ((Cal.Format.toUpperCase()=="DDMMYYYY") || (Cal.Format.toUpperCase()=="DDMMMYYYY"))
		{
			strMonth=exDateTime.substring(Sp1+1,Sp2);
			strDate=exDateTime.substring(0,Sp1);
		}
		else if ((Cal.Format.toUpperCase()=="MMDDYYYY") || (Cal.Format.toUpperCase()=="MMMDDYYYY"))
		{
			strMonth=exDateTime.substring(0,Sp1);
			strDate=exDateTime.substring(Sp1+1,Sp2);
		}
		if (isNaN(strMonth))
			intMonth=Cal.GetMonthIndex(strMonth);
		else
			intMonth=parseInt(strMonth,10)-1;
		if ((parseInt(intMonth,10)>=0) && (parseInt(intMonth,10)<12))
			Cal.Month=intMonth;
		//end parse month
		//parse Date
		if ((parseInt(strDate,10)<=Cal.GetMonDays()) && (parseInt(strDate,10)>=1))
			Cal.Date=strDate;
		//end parse Date
		//parse year
		strYear=exDateTime.substring(Sp2+1,Sp2+5);
		YearPattern=/^\d{4}$/;
		if (YearPattern.test(strYear))
			Cal.Year=parseInt(strYear,10);
		//end parse year
		//parse time		
		if (Cal.ShowTime==true)
		{
			tSp1=exDateTime.indexOf(":",0)
			tSp2=exDateTime.indexOf(":",(parseInt(tSp1)+1));
			strHour=exDateTime.substring(tSp1,(tSp1)-2);
			Cal.SetHour(strHour);
			strMinute=exDateTime.substring(tSp1+1,tSp2);
			Cal.SetMinute(strMinute);
			strSecond=exDateTime.substring(tSp2+1,tSp2+3);
			Cal.SetSecond(strSecond);
		}
	}
	//winCal=window.open("","DateTimePicker","toolbar=0,status=0,menubar=0,fullscreen=no,width=195,height=245,resizable=0,top="+cnTop+",left="+cnLeft);
	//docCal=winCal.document;
	divCal = document.getElementById('cal');
	//alert(divCal);

	var pos = getPosition(document.getElementById(calId));
	divCal.style.position = 'absolute';
    divCal.style.top = pos.y+"px";
    divCal.style.left = pos.x+"px";


	divCal.style.display = 'block';
	RenderCal();
}

function RenderCal()
{
    
    
    
    var pref = ""+
    "<table cellpadding=\"0\" cellspacing=\"0\" >"+
	    "<tr>"+
	        "<td class=\"top-right\"></td>"+
	        "<td style=\"background-color: #e6e6e6; height: 6px;\"></td>"+
	        "<td class=\"top-left\"></td>"+
	    "</tr>"+
	    "<tr>"+
	        "<td style=\"background-color: #e6e6e6;\"></td>"+
			"<td style=\"background-color: #e6e6e6;\">"+
            "<div style=\"width: 165px; height: 124px;\">";

    var post = ""+
            "</div>"+
			"</td>"+
			"<td style=\"background-color: #e6e6e6;\"></td>"+
	    "</tr>"+
	    "<tr>"+
	        "<td class=\"bottom-right\"></td>"+
	        "<td style=\"background-color: #e6e6e6; height: 6px;\"></td>"+
	        "<td class=\"bottom-left\"></td>"+
	    "</tr>"+
	"</table>";









	var vCalHeader;
	var vCalData;
	var vCalTime;
	var i;
	var j;
	var SelectStr;
	var vDayCount=0;
	var vFirstDay;

	var monthsText = "";
	var optSel = "";

    //fill motths select
	for (i = 0; i < 12; i++) {
        if (i == Cal.Month) {optSel = " selected=\"selected\" ";}
        else {optSel = "";}
        monthsText+="<option value=\""+i+"\" "+optSel+">"+MonthName[i]+"</option>\n";
	}

    //show week days
	var weekDaysText = "";
	for (i = 0; i < 7; i++) {
        weekDaysText += "<td class=\"weekDayName\">"+WeekDayName[i].substr(0, WeekChar)+"</td>";
    }

    //show month days


    CalDate=new Date(Cal.Year, Cal.Month);
	CalDate.setDate(1);
	vFirstDay = getDay(CalDate);

    var monthDaysText = "";

    for(i = 0; i < vFirstDay;i++) {
        monthDaysText += "<td></td>";
        vDayCount++;
    }

    for (i = 1; i <= Cal.GetMonDays(); i++) {
		var strCell;
		vDayCount++;

		if ((i==dtToday.getDate())&&(Cal.Month==dtToday.getMonth())&&(Cal.Year==dtToday.getFullYear())){
			strCell=GenCell(i, "today");//Highlight today's date
		} else
		{
			if (i==Cal.Date)
			{
				strCell=GenCell(i, "selectedDay");
			}
			else
			{
				if (vDayCount%7==0)
					strCell=GenCell(i, "sunday");
				else if ((vDayCount+1)%7==0)
					strCell=GenCell(i, "saturday");
				else
					strCell=GenCell(i, "weekday");
			}
		}
		monthDaysText += strCell;
		if((vDayCount%7==0)&&(i<Cal.GetMonDays())){monthDaysText += "</tr>\n<tr>\n";}
	}

    //alert(weekDaysText);
	//alert(monthDaysText);

    tableEl = ""+
            "<table cellpadding=\"0\" cellspacing=\"0\" class=\"calendarTable\">\n"+
                "<tr>\n"+
                    "<td colspan=\"7\">\n"+
                        "<table cellpadding=\"0\" cellspacing=\"0\">\n"+
                            "<tr>\n"+
                                "<td>\n"+
                                    "<select name=\"MonthSelector\" onchange=\"javascript: Cal.SwitchMth(this.selectedIndex); RenderCal();\">\n"+
                                        monthsText+
                                    "</select>\n"+
                                "</td>\n"+
                                "<td class=\"year\">\n"+
                                    "<a style=\"border: 1px solid #e6e6e6;\" href=\"javascript:Cal.DecYear(); RenderCal();\">&lt;</a>\n"+
                                "</td>\n"+
                                "<td class=\"year\">\n"+
                                    Cal.Year+"\n"+
                                "</td>\n"+
                                "<td class=\"year\">\n"+
                                    "<a style=\"border: 1px solid #e6e6e6;\" href=\"javascript:Cal.IncYear(); RenderCal();\">&gt;</a>\n"+
                                "</td>\n"+
                            "</tr>\n"+
                        "</table>"+
                    "</td>"+
                "</tr>"+
                "<tr>\n"+
                    weekDaysText+
                "</tr>\n"+
                 "<tr>\n"+
                    monthDaysText+
                 "</tr>"+
            "</table>\n";
    divCal.innerHTML = pref+tableEl+post;
}

function GenCell(pValue, pClass) { //Generate table cell with value
    /*
    tdEl = document.createElement("td");
    tdEl.setAttribute("class", pClass);
    aEl = document.createElement("a");
    if(!pValue)pValue = "";
    aEl.setAttribute("href","javascript: setSelectedValue("+pValue+")");
    textEl = document.createTextNode(pValue);
    aEl.appendChild(textEl);
    tdEl.appendChild(aEl);
     */

    if(!pValue) pValue = "";
    tdEl = ""+
           "<td class=\""+pClass+"\">"+
                "<a href=\"javascript: setSelectedValue("+pValue+")\" >"+
                    pValue+""+
                "</a>"+
            "</td>";
    return tdEl;
}

function setSelectedValue(curVal) {
    document.getElementById(Cal.Ctrl).value = Cal.FormatDate(curVal);
    divCal.style.display = "none";
}


function removeChildrenFromNode(node)
{
	while (node.hasChildNodes())
	{
	  node.removeChild(node.firstChild);
	}
}


//experimental
function getPosition(elimend){
	var leftNum = 0;
	var topNum  = 0;
	try {
		while (elimend.offsetParent){

				leftNum += elimend.offsetLeft;
				topNum  += elimend.offsetTop;
				elimend = elimend.offsetParent;

		}
	} catch(ex) {}

	leftNum += elimend.offsetLeft;
	topNum  += elimend.offsetTop;

	return {x:leftNum, y:topNum};
}