var lastOpenedCalendar = null;
var calendarElement = null;
var calendarElementMonth = null;
var calendarElementYear = null;
var dateTimePickerFooter = null;
var calendarElementIsDisplayed = false;
var calendarElementsIDs = new Array();
var calendarMonths = new Array("jan", "feb", "mar", "apr", "máj", "jún", "júl", "aug", "sep", "okt", "nov", "dec");
var calendarDaysInMonths = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var calendarDateObject = new Date();
var calendarDateOld = 0;
var dateTimePickerCalendarTBody = null;
var calendarIsDateTime = true; // DateTime alebo iba Date
var calendarValueElement = null;
var calendarTextElement = null;
var calendarMinYear = calendarDateObject.getFullYear() - 100;
var calendarMaxYear = calendarDateObject.getFullYear() + 100;
var debugMilliseconds = 0;

function createCalendar(elementID, minYear, maxYear, e) {
	var dateTimePicker = DOM.gI("dateTimePicker_" + elementID);
	var topValue = 0;
	var leftValue = 0;
	calendarMinYear = minYear;
	calendarMaxYear = maxYear;
	
	if(minYear > maxYear) {
		alert("ERROR 05 - minimálny rok (" + minYear.toString() + ") je menší ako maximálny (" + maxYear.toString() + ")!");
		return false;
	}

	calendarDateObject = createCalendarText(elementID);
	calendarDateOld = calendarDateObject.getDate();
	//debugMilliseconds = calendarDateObject.getMilliseconds();
	
	while(calendarElementYear.options.length > 0) {
    	calendarElementYear.remove(0);
    }
    
    for(var i = minYear; i <= maxYear; i++) {
    	var optionElement = new Option(i, i);
		calendarElementYear.options.add(optionElement);
		if(calendarDateObject.getFullYear() == i) {
			optionElement.selected = true;
    	}
    }	
	
	for(var i = 0; i < calendarElementMonth.options.length; i++) {
		if(calendarDateObject.getMonth() == i) {
			calendarElementMonth.options[i].selected = true;
		}
    }
    
    calendarElementHours.value = calendarDateObject.getHours();
    calendarElementMinutes.value = calendarDateObject.getMinutes();
    
    // BEGIN Populate calendar table
    var populateDate = new Date(calendarDateObject.getFullYear(), calendarDateObject.getMonth(), 1, 0, 0, 0);
    populateCalendarTable(populateDate);
    // END Populate calendar table
	
	topValue = getCalendarOffsetTop(dateTimePicker);
	leftValue = getCalendarOffsetLeft(dateTimePicker);
	
	//alert(topValue + " " + leftValue);
	
	if(calendarElementIsDisplayed == false || lastOpenedCalendar != elementID) {
		calendarElement.style.display = "block";
		calendarElementIsDisplayed = true;
		lastOpenedCalendar = elementID;
	} else {
		calendarElement.style.display = "none";
		calendarElementIsDisplayed = false;
		return false;
	}
	
	var windowSize = newGetWindowSize();
	var windowScroll = newGetWindowScroll();
	
	newTopValue = topValue + dateTimePicker.offsetHeight + 1;
	if((newTopValue + calendarElement.offsetHeight) > (windowSize["height"] + windowScroll["top"])) {
		calendarElement.style.top = topValue - calendarElement.offsetHeight - 2 + "px";
	} else {
		calendarElement.style.top = newTopValue + "px";
	}
	
	if((leftValue + calendarElement.offsetWidth) > windowSize["width"]) {
		calendarElement.style.left = windowSize["width"] - calendarElement.offsetWidth - 1 + "px";
	} else {
		calendarElement.style.left = leftValue + "px";
	}
	
	if (!e) var e = window.event;
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
}

function getCalendarOffsetTop(element) {
	var curtop = 0;
	curtop = element.offsetTop;
	while(element = element.offsetParent) {
		curtop += element.offsetTop;
	}
	return curtop;
}

function getCalendarOffsetLeft(element) {
	var curleft = 0;
	curleft = element.offsetLeft;
	while (element = element.offsetParent) {
		curleft += element.offsetLeft;
	}
	return curleft;
}

function myStopPropagation(e) {
	if (!e) var e = window.event;
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
}

function hideCalendarElement() {
	if(calendarElement) {
		calendarElement.style.display = "none";
		calendarElementIsDisplayed = false;
	}
}

function calendarInit() {
	calendarElement = DOM.gI("dateTimePickerCalendar");
	calendarElementMonth = DOM.gI("dateTimePickerCalendarMonth");
	calendarElementYear = DOM.gI("dateTimePickerCalendarYear");
	calendarElementHours = DOM.gI("dateTimePickerCalendarHours");
	calendarElementMinutes = DOM.gI("dateTimePickerCalendarMinutes");
	dateTimePickerFooter = DOM.gI("dateTimePickerFooter");
	for(var i = 0; i < calendarElementsIDs.length; i++) {
		createCalendarText(calendarElementsIDs[i]);
	}
	dateTimePickerCalendarTBody = DOM.gI("dateTimePickerCalendarTBody");
}

function createCalendarText(ID) {
	calendarValueElement = DOM.gI(ID);
	calendarTextElement = DOM.gI(ID + "_Text");
	
	var calendarValue = calendarValueElement.value.split(" ");
	if(calendarValue.length == 1) {
		// DATE
		calendarIsDateTime = false;
		dateTimePickerFooter.style.display = "none";
		var dateValue = calendarValue[0].split("-");
		if(dateValue.length == 3) {
			calendarTextElement.value = parseInt(dateValue[2], 10) + ". " + calendarMonths[parseInt(dateValue[1], 10) - 1] + " " + parseInt(dateValue[0], 10);
			return new Date(parseInt(dateValue[0], 10), (parseInt(dateValue[1], 10) - 1), parseInt(dateValue[2], 10)); // -1 kvôli tomu, že object Date má číslovanie mesiacov od 0
		} else {
			alert("ERROR 02 - chyba pri parsovaní dátumu / nesprávny formát dátumu YYYY-MM-DD");
			return new Date();
		}
	} else if(calendarValue.length == 2) {
		// DATETIME
		calendarIsDateTime = true;
		dateTimePickerFooter.style.display = "block";
		var dateValue = calendarValue[0].split("-");
		if(dateValue.length == 3) {
			calendarTextElement.value = parseInt(dateValue[2], 10) + ". " + calendarMonths[parseInt(dateValue[1], 10) - 1] + " " + parseInt(dateValue[0], 10);
		} else {
			alert("ERROR 03 - chyba pri parsovaní dátumu / nesprávny formát dátumu YYYY-MM-DD HH:MM:SS");
			return new Date();
		}
		
		var timeValue = calendarValue[1].split(":");
		if(timeValue.length == 3) {
			calendarTextElement.value += ", " + parseInt(timeValue[0], 10) + ":" + (parseInt(timeValue[1], 10) < 10 ? "0" + parseInt(timeValue[1], 10) : parseInt(timeValue[1], 10));
		} else {
			alert("ERROR 04 - chyba pri parsovaní dátumu / nesprávny formát dátumu YYYY-MM-DD HH:MM:SS");
			return new Date();
		}
		
		return new Date(parseInt(dateValue[0], 10), (parseInt(dateValue[1], 10) - 1), parseInt(dateValue[2], 10), parseInt(timeValue[0], 10), parseInt(timeValue[1], 10), parseInt(timeValue[2], 10)); // -1 kvôli tomu, že object Date má číslovanie mesiacov od 0
	} else {
		alert("ERROR 01 - chyba pri parsovaní dátumu / nesprávny formát dátumu YYYY-MM-DD HH:MM:SS alebo YYYY-MM-DD");
		return new Date();
	}
}

function populateCalendarTable(populateDate) {
	var firstDay = populateDate.getDay();
	var dayCSSClass = "";
    var currentRow = 0;
    var currentMonthDays = calendarDaysInMonths[populateDate.getMonth()];
    if(populateDate.getMonth() == 1 && (populateDate.getFullYear() % 4) == 0) { // Február a prechodný rok
    	currentMonthDays = currentMonthDays + 1;
    }
    var selectedYear = populateDate.getFullYear();
    var selectedMonth = populateDate.getMonth();
    
    if(calendarDateOld > currentMonthDays) {
    	var oldDate = currentMonthDays;
    } else {
    	var oldDate = calendarDateOld;
    }
    
    if(selectedMonth == 11) {
    	var nextMonthYear = selectedYear + 1;
    	var nextMonthMonth = 0;
    } else {
    	var nextMonthYear = selectedYear;
    	var nextMonthMonth = selectedMonth + 1;
    }
    
    switch(selectedMonth) {
    	case 11:
    		var nextMonthYear = selectedYear + 1;
	    	var nextMonthMonth = 0;
	    	var prevMonthYear = selectedYear;
	    	var prevMonthMonth = selectedMonth - 1;
	    	break;
	    case 0:
	    	var nextMonthYear = selectedYear;
	    	var nextMonthMonth = selectedMonth + 1;
	    	var prevMonthYear = selectedYear - 1;
	    	var prevMonthMonth = 11;
	    	break;
	    default:
	    	var nextMonthYear = selectedYear;
	    	var nextMonthMonth = selectedMonth + 1;
	    	var prevMonthYear = selectedYear;
	    	var prevMonthMonth = selectedMonth - 1;
	    	break;
    }
    
    var nextMonthDay = 1;
    if(prevMonthMonth == 1 && (prevMonthYear % 4) == 0) { // Február a prechodný rok
    	var prevMonthDay = calendarDaysInMonths[prevMonthMonth] + 1;
    } else {
    	var prevMonthDay = calendarDaysInMonths[prevMonthMonth];
    }
    if(firstDay == 0) {
    	prevMonthDay = prevMonthDay - 5;
    } else {
	    prevMonthDay = prevMonthDay - firstDay + 2;
    }
    
    var currentDayIter = 1;
    var startMonth = false;
    for(var i = 0; i < dateTimePickerCalendarTBody.rows.length; i++) {
    	for(var y = 0; y < dateTimePickerCalendarTBody.rows[i].cells.length; y++) {
    		dayCSSClass = "";
    		if(i == 0) {
    			if(dateTimePickerCalendarTBody.rows[i].cells[y].id == "CALCell_0_" + firstDay.toString()) {
    				startMonth = true;
    			}
    		}
    		
    		if(currentDayIter == oldDate) {
    			dayCSSClass = "oldDate";
    		}
    		
    		if(startMonth == true && currentDayIter <= currentMonthDays) {
    			dateTimePickerCalendarTBody.rows[i].cells[y].innerHTML = "<a href=\"javascript:returnDateTime(" 
    												+ selectedYear + ", " 
    												+ selectedMonth + ", " 
    												+ currentDayIter + ", " 
    												+ "0, 0, 0);\" class=" + dayCSSClass + "><span>" + currentDayIter + "</span></a>";
	    		currentDayIter = currentDayIter + 1;
    		} else {
    			if(currentDayIter == 1) {
    				dateTimePickerCalendarTBody.rows[i].cells[y].innerHTML = "<a href=\"javascript:returnDateTime(" 
    												+ prevMonthYear + ", " 
    												+ prevMonthMonth + ", " 
    												+ prevMonthDay + ", " 
    												+ "0, 0, 0);\" class=\"prevNextMonth\"><span>" + prevMonthDay + "</span></a>";
    				prevMonthDay = prevMonthDay + 1;
    			} else {
	    			dateTimePickerCalendarTBody.rows[i].cells[y].innerHTML = "<a href=\"javascript:returnDateTime(" 
    												+ nextMonthYear + ", " 
    												+ nextMonthMonth + ", " 
    												+ nextMonthDay + ", " 
    												+ "0, 0, 0);\" class=\"prevNextMonth\"><span>" + nextMonthDay + "</span></a>";
	    			nextMonthDay = nextMonthDay + 1;
    			}
    		}
    	}
    }
}

function changeCalendarMonth(selectElement) {
	calendarDateObject.setMonth(selectElement[selectElement.selectedIndex].value);
	var populateDate = new Date(calendarDateObject.getFullYear(), calendarDateObject.getMonth(), 1, 0, 0, 0);
    populateCalendarTable(populateDate);
}

function changeCalendarYear(selectElement) {
	calendarDateObject.setYear(selectElement[selectElement.selectedIndex].value);
	var populateDate = new Date(calendarDateObject.getFullYear(), calendarDateObject.getMonth(), 1, 0, 0, 0);
    populateCalendarTable(populateDate);
}

function changeCalendarMonthPlus() {
	//debugMilliseconds = new Date().getMilliseconds();
	if(calendarDateObject.getMonth() == 11) {
		if(calendarDateObject.getFullYear() < calendarMaxYear) {
			calendarDateObject.setMonth(0);
			var newYear = calendarDateObject.getFullYear() + 1;
			calendarDateObject.setYear(newYear);
			calendarElementYear.selectedIndex = newYear - calendarMinYear;
		} else {
			return false;
		}
	} else {
		calendarDateObject.setDate(1);
		calendarDateObject.setMonth(calendarDateObject.getMonth() + 1);
	}
	
    populateCalendarTable(calendarDateObject);
    calendarElementMonth.selectedIndex = calendarDateObject.getMonth();
    //alert(debugMilliseconds + "\n" + new Date().getMilliseconds());
}

function changeCalendarMonthMinus() {
	if(calendarDateObject.getMonth() == 0) {
		if(calendarDateObject.getFullYear() > calendarMinYear) {
			calendarDateObject.setMonth(11);
			var newYear = calendarDateObject.getFullYear() - 1;
			calendarDateObject.setYear(newYear);
			calendarElementYear.selectedIndex = newYear - calendarMinYear;
		} else {
			return false;
		}
	} else {
		calendarDateObject.setDate(1);
		calendarDateObject.setMonth(calendarDateObject.getMonth() - 1);
	}
	
    populateCalendarTable(calendarDateObject);
    calendarElementMonth.selectedIndex = calendarDateObject.getMonth();
}

function changeCalendarHours(element) {
	var elementNumberValue = parseInt(element.value, 10);
	if(!(elementNumberValue >= 0 && elementNumberValue <= 23)) {
		element.value = 0;
	} else {
		element.value = elementNumberValue;
	}
	return element.value;
}

function changeCalendarMinutes(element) {
	var elementNumberValue = parseInt(element.value, 10);
	if(!(elementNumberValue >= 0 && elementNumberValue <= 59)) {
		element.value = 0;
	} else {
		element.value = elementNumberValue;
	}
	return element.value;
}

function returnDateTime(year, month, day, hours, minutes, seconds) {
	month = month + 1;
	
	if(parseInt(month, 10) < 10) {
		month = "0" + month.toString();
	}
	
	if(parseInt(day, 10) < 10) {
		day = "0" + day.toString();
	}
	
	if(calendarIsDateTime == true) {
		hours = changeCalendarHours(DOM.gI("dateTimePickerCalendarHours"));
		minutes = changeCalendarMinutes(DOM.gI("dateTimePickerCalendarMinutes"));
	}
	
	if(parseInt(hours, 10) < 10) {
		hours = "0" + hours.toString();
	}
	
	if(parseInt(minutes, 10) < 10) {
		minutes = "0" + minutes.toString();
	}
	
	if(parseInt(seconds, 10) < 10) {
		seconds = "0" + seconds.toString();
	}
	
	if(calendarIsDateTime == true) {
		calendarValueElement.value = year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds;
	} else {
		calendarValueElement.value = year + "-" + month + "-" + day;
	}
	
	//alert(calendarValueElement.value);
	createCalendarText(calendarValueElement.id);
	hideCalendarElement();

	var calendarElementText = DOM.gI(calendarValueElement.id + "_Text");
	calendarElementText.onchange();
	calendarElementText.focus();
}

function newGetWindowSize() {
	var getWindowSize = new Array();
	var myWidth = 785, myHeight = 550;
	if( typeof( window.innerWidth ) == 'number' ) {
		//Non-IE
		myWidth = window.innerWidth - 1;
		myHeight = window.innerHeight - 1;
	} else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
		//IE 6+ in 'standards compliant mode'
		myWidth = document.documentElement.clientWidth;
		myHeight = document.documentElement.clientHeight;
	} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		//IE 4 compatible
		myWidth = document.body.clientWidth;
		myHeight = document.body.clientHeight;
	}
	
	getWindowSize['width'] = myWidth;
	getWindowSize['height'] = myHeight;
	return 	getWindowSize;
}

function newGetWindowScroll() {
  var getWindowScroll = new Array();
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  
  getWindowScroll["left"] = scrOfX;
  getWindowScroll["top"] = scrOfY;
  return getWindowScroll;
}

DOM.aE(window, "load", calendarInit, true);
DOM.aE(window.document, "click", hideCalendarElement, false);