var posx = 0;
var posy = 0;
var year, month, weekday;
var lastY, lastM, lastD;
var _Cclasses = Array();
var _CdaysArr = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);



function CalHighlight(id) {
	var daug = id - (id % 7 == 0 ? 7 : id % 7);
	for(i=1;i<=7;i++){
		el = document.getElementById(daug + i)
		_Cclasses[i] = el.className;
		if(daug + i == id) { el.className = "_Ccell _CthisDay"; }
		else if(i==6 || i==7) { el.className = "_Ccell _ChighlightWeekend"; }
		else { el.className = "_Ccell _ChighlightDay"; }
	}
}

function CalReverseClass(id){
	var daug = id - (id % 7 == 0 ? 7 : id % 7);
	for(i=1;i<=7;i++) {
		el = document.getElementById(daug + i).className = _Cclasses[i];		
	}
}

function CalShowDate(day){
	s = CalMakeDate(day);
	document.getElementById("_CdateEl").innerHTML = s;
}

function CalInsertDate(day) {
	if(!day) {
		var d;
	    day = CalGetDate(d);	
	}
	if (_CshowClock) {
		hour = document.getElementById("_Chours").value;
		minute = document.getElementById("_Cminutes").value;
	}
	document.getElementById(_CinputField).value = CalMakeDate(day, 1);
	CalHide();	
	if(_CnewLocation) {
		var loc = _CnewLocation;
		if(_CaditionalGet) {
			var d = new Date(year, month, day);
			loc += "&" + _CaditionalGet + "=" + (d.getTime()/1000);
		}
		window.location = loc;
	}
}

function CalMakeDate(day, insert) {
	
	if (insert) {
		date = _Cformat;
		//date.replace(/%Y/i, year);			
		while (date.lastIndexOf("%") != -1) {
			a = date.substr(date.lastIndexOf("%")+1, 1);
			date = CalReplace(a, date, day);
		}
	} else {
		date = year + "-" + (month+1<10 ? '0' + (month+1) : (month+1)) + "-" + (day<10 ? '0'+day : day);
	}
	return date;
}

function CalReplace(n, date, day) {
	
	switch (n) {
	case "Y":
		date = date.replace(/%Y/, year);
	break;
	case "M":
		date = date.replace(/%M/, (month+1<10 ? '0' + (month+1) : (month+1)));
	break;
	case "D":
		date = date.replace(/%D/, (day<10 ? '0' + day : day));
	break;
	case "H":
		date = date.replace(/%H/, hour);
	break;
	case "I":
		date = date.replace(/%I/, minute);
	break;
	}
	return date;
	
}

function CalReverse(date) {
	
	var a = _Cformat;
	var pos, count; 
	hour = 0;
	minute = 0;
	while (a.indexOf("%") != -1) {	
		pos = a.indexOf("%")
		a = a.substr(pos, a.length);
		date = date.substr(pos, date.length);
		n = a.substr(1, 1);		
		switch(n) {
		case "Y":
			count = 4;
			year = date.substr(0, count);
		break;
		case "M":
			count = 2;
			month = date.substr(0, count)-1;
		break;
		case "D":
			count = 2;
			day = date.substr(0, count);
		break;
		case "H":
			count = 2;
			hour = date.substr(0, count);
		break;
		case "I":
			count = 2;
			minute = date.substr(0, count);
		break;
		}
		date = date.substr(count, date.length);
		a = a.substr(2, a.length);
	}
	return new Date(year, month, day, hour, minute);
	
}

function CalCheckTime(count, id){
	var el = document.getElementById(id).value;
	var nums = "0123456789";
	if(parseInt(el)>count || parseInt(count)<0 || nums.indexOf(el.substr(0, 1))==-1 || nums.indexOf(el.substr(1, 1))==-1) {
		document.getElementById(id).value = '00';
	} else if(el.length==1) document.getElementById(id).value = '0' + el;
}

function CalWriteMonth() {

	var id = 0;
	var ret = '<tr>';
	for(i=1;i<weekday;i++) {
		id++;
		ret += '<td id="' + id + '" class="_Ccell _CemptyTd">&nbsp</td>';
	}
	days = CalGetDays();
	for(i=1;i<=days;i++) {
		id++;
		css = (id % 7 == 0 || (id + 1) % 7 == 0) ? "weekendDay" : "day";
		if (lastY == year && lastM == month && lastD < i) 
			ret += '<td id="' + id + '" class="_CdisabledCell _C' + css + '">' + i + '</td>';
		else
			ret += '<td id="' + id + '" class="_Ccell _C' + css + '" onmouseover="CalHighlight(' + id + '); CalShowDate(' + i + ')" onmouseout="CalReverseClass(' + id + ')" + onclick="CalInsertDate(' + i + ')" >' + i + '</td>';
		if(id % 7 == 0) ret += '</tr><tr>';
	}
	if(id % 7 != 0) {
		for(i=id%7;i<7;i++){
			id++;
			ret += '<td id="' + id + '" class="_Ccell _CemptyTd">&nbsp</td>';
		}
	}
	return '</tr>' + ret; 
}

function CalGetDays(){
	if(month==1) { return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)) ? 29 : 28;} 
	else return _CdaysArr[month];
}

function CalGetDate(d){
	if(!d) var d = new Date();
	year = d.getFullYear();
	month = d.getMonth();
	day = d.getDate();
	hour = d.getHours();
	minute = d.getMinutes();
	if(hour.toString().length<2) hour = '0' + hour;
	if(minute.toString().length<2) minute = '0' + minute;
	//alert('h=' + hour+ ' m=' + minute);
	var w = new Date(year, month, 1);
	(w.getDay()==0) ? weekday = 7 : weekday = w.getDay();
	CalWriteBody(); 
	CalShowDate(day);
	CalShow();
	return day;
}

function CalWriteBody(){
	var ret = '<div class="_Cmain" id="_Cmain"><table border="0" cellspacing="1" cellpadding="1"><tr>';
	ret += '<td>&nbsp;</td><td colspan="5"><div id="_CdateEl" class="_CdateEl">&nbsp;</div></td>';
	ret += '<td><input class="_Cinput" type="button" value="x" onclick="CalHide()" /></td></tr><tr>';
	ret += '<td><input class="_Cinput" type="button" value="<<" onclick="CalGetDate(new Date('+(year-1)+', '+month+', '+day+', '+hour+', '+minute+'))" /></td>';
	ret += '<td><input class="_Cinput" type="button" value="<" onclick="CalGetDate(new Date('+year+', '+(month-1)+', '+day+', '+hour+', '+minute+'))" /></td>';
	ret += '<td colspan="3" class="_CdateEl" style="cursor:pointer;" onclick="CalInsertDate()">' + _CtodayName + '</td>';
	var d = new Date(year, month+1);
	var tm = d.getTime();
	if (!(_CdisableFuture && tm>today)) {
		ret += '<td><input class="_Cinput" type="button" value=">" onclick="CalGetDate(new Date('+year+', '+(month+1)+', '+day+', '+hour+', '+minute+'))" /></td>';
	} else ret += '<td>&nbsp;</td>';
	var d = new Date(year+1, month);
	var tm = d.getTime();
	if (!(_CdisableFuture && tm>today)) {
		ret += '<td><input class="_Cinput" type="button" value=">>" onclick="CalGetDate(new Date('+(year+1)+', '+month+', '+day+', '+hour+', '+minute+'))" /></td></tr>';
	} else ret += '<td colspan="2">&nbsp;</td>';
	ret += '<tr>';
	ret += '<td colspan="7"></td>';
	ret += '</tr><tr>';
	for (i=0; i<7; i++) {
		ret += '<td class="_Cheader">' + _CweekdayNames[i] + '</td>'; 
	}
	ret += '</tr>';
	ret += CalWriteMonth();
	if (_CshowClock) {
		ret += '<tr><td colspan="7" class="_CtimeRow">';
		ret += '<input type="text" class="_CtimeInput" id="_Chours" onchange="CalCheckTime(23, \'_Chours\')" value="' + hour + '" maxlength="2" />'
  		ret += '<span style="font-size:12px;">:</span>'
  		ret += '<input type="text" class="_CtimeInput" id="_Cminutes" onchange="CalCheckTime(59, \'_Cminutes\')" value="' + minute + '" maxlength="2" />'
		ret += '</td></tr>';
	}
	ret += '</table></div>';
	//document.body.innerHTML += '<div id="_Cmain"></div>';
	document.getElementById(_Cparent).innerHTML = ret; //error
	
}

function CalShow(){
	s = document.getElementById(_Cparent).style;
	s.display = 'block';
	s.position = 'absolute';
	s.top = posy + 'px';
	s.left = posx + 'px';
	s.border = 'none';
}

function CalHide(){
	document.getElementById(_Cparent).style.display = 'none';
}

function CalGetObj(obj,name){
	var x = obj.layers;
	var foundLayer;
	for (var i=0;i<x.length;i++){
		if (x[i].id == name) foundLayer = x[i];
		else if (x[i].layers.length)
			var tmp = CalGetObj(x[i],name);
		if (tmp) foundLayer = tmp;
	}
	return foundLayer;
}


function CalGetElementDim(Elem) {
	if (document.layers) {
		var elem = CalGetObj(document, Elem);
		return [elem.clip.width,elem.clip.height,elem.pageX,elem.pageY];
	} else {
		var elem;
		if(document.getElementById) {
			var elem = document.getElementById(Elem);
		} else if (document.all){
			var elem = document.all[Elem];
		}
		xPos = elem.offsetLeft;
		yPos = elem.offsetTop;
		tempEl = elem.offsetParent;
		while(tempEl != null) {
			xPos += tempEl.offsetLeft;
			yPos += tempEl.offsetTop;
			tempEl = tempEl.offsetParent;
		}
		if (navigator.userAgent.indexOf("Opera") > -1) {
			elWidth = elem.style.pixelWidth;
			elHeight = elem.style.pixelHeight;
		} else {
			elWidth = elem.offsetWidth;
			elHeight = elem.offsetHeight;
		}
		return [elWidth,elHeight,xPos,yPos];
	}
}


function CalPosition(e) {
	if(_CpositionByMouse) {
		if (!e) var e = window.event;
		if (e.pageX || e.pageY) {
			posx = e.pageX;
			posy = e.pageY;
		}
		else if (e.clientX || e.clientY) {
			posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
			posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
		}
	} else {
		temp = CalGetElementDim(_CinputField);
		inpWidth = temp[0];
		inpHeight = temp[1];
		inpLeft = temp[2];
		inpTop = temp[3];
		temp = CalGetElementDim("_Cmain");
		calWidth = temp[0];
		calHeight = temp[1];	
		posx = inpLeft + Math.round((inpWidth - calWidth)/2);
		posy = (calHeight < inpTop - 10 ? inpTop - calHeight- 10 : inpTop + inpHeight + 10);
	}
}

function ShowCalendar(e, inp) {
	if(_CdisableFuture) {
		var d = new Date();
	 	lastY = d.getFullYear();
		lastM = d.getMonth();
		lastD = d.getDate();
		today = d.getTime(); 
	}
	if (inp) _CinputField = inp;
	val = document.getElementById(_CinputField).value;
	if (val) {
		CalGetDate(CalReverse(val));	
	} else {
		CalGetDate();
	}
	/*if (val) {
		data = val.split(_Cseparator);
		var d = new Date(parseInt(data[0]),  parseInt(data[1])-1, parseInt(data[2]));
		CalGetDate(d);
	} else CalGetDate();*/
	CalPosition(e);
	CalShow();
}

