/* Copyright 2012 Virtual Interconnect Software, LLC.  All rights reserved. */
function FormCheck(fieldName)
{
	var formEl, allLabels, fieldID, curField, throwError;
	var i, j;
	
	//look for required fields
	formEl = document.getElementById("Form_" + fieldName);
	if(formEl)
	{
		allLabels = formEl.getElementsByTagName("label");
		if(allLabels)
		{
			for(i=0; i<allLabels.length; ++i)
			{
				fieldID = allLabels[i].htmlFor;
				if(allLabels[i].className && allLabels[i].className.indexOf("RequiredField") >= 0)
				{
					throwError = false;
					if(fieldID)
					{
						curField = document.getElementById(fieldID);
						switch(curField.getAttribute("type").toLowerCase())
						{
							case "text":
							case "email":
							case "number":
							case "date":
							{
								if(curField.value == "")
								{
									throwError = true;
								}
							} break;
							case "radio":
							{
								//run through the radio buttons and make sure one of them is selected
								while(fieldID.charAt(fieldID.length - 1) >= "0" && fieldID.charAt(fieldID.length- 1) <= "9")
								{
									fieldID = fieldID.substring(0, fieldID.length-1);
								}
								throwError = true;
								j = 0;
								while(curField = document.getElementById(fieldID + j))
								{
									if(curField.checked)
									{
										throwError = false;
									}
									++j;
								}
							} break;
							case "checkbox":
							{
								if(!curField.checked)
								{
									alert("You must fill in the " + allLabels[i].innerHTML + " checkbox to continue");
									return false;
								}
							} break;
							case "file":
							{
								if(!curField.value || curField.value == "")
								{
									throwError = true;
								}
							} break;
						}
					}
					if(throwError)
					{
						alert("Please fill in the " + allLabels[i].innerHTML + " field");
						return false;
					}
				}
				
				//validate field values
				if(fieldID)
				{
					curField = document.getElementById(fieldID);
					switch(curField.getAttribute("type").toLowerCase())
					{
						case "text":
						{
							if(curField.hasAttribute("pattern"))
							{
								var re = new RegExp("^" + curField.getAttribute("pattern") + "$");
								if(!re.test(curField.value))
								{
									alert("Please make sure the " + allLabels[i].innerHTML + " is in the right format");
									return false;
								}
							}
						} break;
						case "email":
						{
							if(curField.value != "")
							{
								var re = new RegExp("^[a-zA-Z0-9\-_\.]+@[a-z-A-Z0-9\-_\.]+\.[a-zA-Z]{2,3}$");
								if(!re.test(curField.value))
								{
									alert("Please enter an e-mail address in the " + allLabels[i].innerHTML + " field");
									return false;
								}
							}
						} break;
						case "number":
						{
							//make sure the value is within the range
							if(curField.value != "" && (/[^-\.0-9]/).test(curField.value))
							{
								alert("Please make sure the " + allLabels[i].innerHTML + " field is a number");
								return false;
							}
							if(curField.hasAttribute("step") && curField.value % curField.getAttribute("step") != 0)
							{
								alert("Please make sure the " + allLabels[i].innerHTML + " field is a whole number and not a decimal");
								return false;
							}
							if(curField.hasAttribute("min") && curField.value * 1 < curField.getAttribute("min") * 1)
							{
								alert("The " + allLabels[i].innerHTML + " field must be set to " + curField.getAttribute("min") + " or higher");
								return false;
							}
							if(curField.hasAttribute("max") && curField.value * 1 > curField.getAttribute("max") * 1)
							{
								alert("The " + allLabels[i].innerHTML + " field must be set to " + curField.getAttribute("max") + " or lower");
								return false;
							}
						} break;
					}
				}
			}
		}
	}
	
	return true;
}

function FormAddCalendars()
{
	if(navigator.userAgent.indexOf("iPad") >= 0 || navigator.userAgent.indexOf("iPhone") >= 0 || navigator.userAgent.indexOf("iPod") >= 0)
	{
		//not needed for iOS
		return false;
	}
	
	var allInputEls = document.getElementsByTagName("input");
	
	for(var i = 0; i < allInputEls.length; ++i)
	{
		if(allInputEls[i].getAttribute("type").toLowerCase() == "date")
		{
			//activate calendar for this field
			allInputEls[i].addEventListener("focus", FormCalendarPopup, false);
			allInputEls[i].addEventListener("click", FormCalendarPopup, false);
		}
	}
	window.addEventListener("click", FormCalendarPopdown, false);
}

function FormCalendarPopup(e)
{
	if(!e) e = window.event;
	
	if(e.target.nextSibling && e.target.nextSibling.className == "FormCalendar")
	{
		//already have a calendar
		e.preventDefault();
		e.stopPropagation();
		return true;
	}
	
	var calEl = e.target.parentNode.insertBefore(document.createElement("div"), e.target.nextSibling);
	calEl.className = "FormCalendar";
	calEl.parentNode.onclick = function(e) { e.preventDefault(); e.stopPropagation(); return false; };
	calEl.style.top = (e.target.offsetTop + e.target.offsetHeight) + "px";
	calEl.style.left = e.target.offsetLeft + "px";
	var calTableEl = calEl.appendChild(document.createElement("table"));
	calTableEl.setAttribute("cellpadding", 0);
	calTableEl.setAttribute("cellspacing", 0);
	
	var theadEl = calTableEl.appendChild(document.createElement("thead"));
	var trEl = theadEl.appendChild(document.createElement("tr"));
	var prevButtonCellEl = trEl.appendChild(document.createElement("th"));
	var monthCellEl = trEl.appendChild(document.createElement("th"));
	monthCellEl.setAttribute("colspan", 5);
	var monthSelEl = monthCellEl.appendChild(document.createElement("select"));
	var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
	for(var m = 0; m < 12; ++m)
	{
		var optionEl = monthSelEl.appendChild(document.createElement("option"));
		optionEl.setAttribute("value", m);
		optionEl.appendChild(document.createTextNode(months[m]));
	}
	monthSelEl.selectedIndex = (new Date()).getMonth();
	monthSelEl.onclick = function(c) { return function(e) { FormCalendarUpdateMonth(c); }; }(calEl);
	monthSelEl.onchange = monthSelEl.onclick;
	
	var yearSelEl = monthCellEl.appendChild(document.createElement("select"));
	var curYear = (new Date()).getFullYear();
	for(var y = 1900; y <= curYear + 50; ++y)
	{
		var optionEl = yearSelEl.appendChild(document.createElement("option"));
		optionEl.setAttribute("value", y);
		optionEl.appendChild(document.createTextNode(y));
	}
	yearSelEl.selectedIndex = curYear - 1900;
	yearSelEl.onclick = monthSelEl.onclick;
	yearSelEl.onchange = monthSelEl.onclick;
	
	var nextButtonCellEl = trEl.appendChild(document.createElement("th"));
	
	//add scripts for handling the prev and next buttons
	var prevButtonEl = prevButtonCellEl.appendChild(document.createElement("span"));
	prevButtonEl.onclick = function(e) {
				if(monthSelEl.selectedIndex == 0)
				{
					--yearSelEl.selectedIndex;
					monthSelEl.selectedIndex = 11;
				}
				else
				{
					--monthSelEl.selectedIndex;
				}
				FormCalendarUpdateMonth(calEl);
				return false;
			};
	prevButtonEl.appendChild(document.createTextNode("<"));
	var nextButtonEl = nextButtonCellEl.appendChild(document.createElement("span"));
	nextButtonEl.onclick = function(e) {
				if(monthSelEl.selectedIndex == 11)
				{
					++yearSelEl.selectedIndex;
					monthSelEl.selectedIndex = 0;
				}
				else
				{
					++monthSelEl.selectedIndex;
				}
				FormCalendarUpdateMonth(calEl);
				return false;
			};
	nextButtonEl.appendChild(document.createTextNode(">"));
	
	var tbodyEl = calTableEl.appendChild(document.createElement("tbody"));
	for(var y = 0; y < 6; ++y)
	{
		trEl = tbodyEl.appendChild(document.createElement("tr"));
		for(var x = 0; x < 7; ++x)
		{
			trEl.appendChild(document.createElement("td"));
		}
	}
	
	FormCalendarUpdateMonth(calEl);
	
	e.preventDefault();
	e.stopPropagation();
	return true;
}

function FormCalendarPopdown(e)
{
	var allDivEls = document.getElementsByTagName("div");
	for(var d = 0; d < allDivEls.length; ++d)
	{
		if(allDivEls[d].className == "FormCalendar")
		{
			allDivEls[d].parentNode.removeChild(allDivEls[d]);
			--d;
		}
	}
	return true;
}

function FormCalendarUpdateMonth(calEl)
{
	//update the calendar to display the selected month
	var selectEls = calEl.getElementsByTagName("select");
	var month = selectEls[0].options[selectEls[0].selectedIndex].value;
	var year = selectEls[1].options[selectEls[1].selectedIndex].value;
	var startDate = new Date(year, month, 1);
	var firstDay = startDate.getDay();
	var tdEls = calEl.getElementsByTagName("td");
	for(var t = 0; t < tdEls.length; ++t)
	{
		//clear days before the start of the month
		if(t < firstDay)
		{
			while(tdEls[t].firstChild)
			{
				tdEls[t].removeChild(tdEls[t].firstChild);
			}
		}
		
		//add numbers
		if((new Date(year, month, t - firstDay + 1)).getMonth() == month)
		{
			while(tdEls[t].firstChild)
			{
				tdEls[t].removeChild(tdEls[t].firstChild);
			}
			var dayEl = tdEls[t].appendChild(document.createElement("span"));
			var dayNum = t - firstDay + 1;
			var dayElDate = year + "-" + ("0" + (month * 1 + 1)).slice(-2) + "-" + ("0" + dayNum).slice(-2);
			dayEl.onclick = function(dayElDate) { return function(e) {
						var oldValue = calEl.previousSibling.value;
						calEl.previousSibling.value = dayElDate;
						calEl.previousSibling.focus();
						if(calEl.previousSibling.onchange && calEl.previousSibling.onchange({target:calEl.previousSibling}) == false)
						{
							calEl.previousSibling.value = oldValue;
						}
						FormCalendarPopdown();
					}; }(dayElDate);
			dayEl.className = (calEl.previousSibling.value == dayElDate ? "Selected" : "");
			dayEl.appendChild(document.createTextNode(dayNum));
		}
		else
		{
			//we're past the number of days in the month
			//clear it
			while(tdEls[t].firstChild)
			{
				tdEls[t].removeChild(tdEls[t].firstChild);
			}
		}
	}
}

RegisterInit("FormAddCalendars();");

