function initformmonitor () {
	for (x=0;x<document.forms.length;x++)
	{
		document.forms[x].onsubmit = function () { return formmonitor(this); }
		var ccnum = getFormElemByName (document.forms[x], 'ccnum');
		if (ccnum != null)
		{
			ccnum.onblur = function() { ccnumCheckType(this); };
		}
		var action = getFormElemByName (document.forms[x], 'setformactionto');
		if (action != null)
		{
			document.forms[x].action = action.value;
		}
	}
	if (document.location.hash == '#error')
	{
		if (getElem('error') != null)
		{
			getElem('error').style.display = "block";
		}
	}
	
	if (getElem('arr_cal_input'))
	{
		new Calendar({
			inputField: "arr_cal_input",
			dateFormat: "%d/%m/%Y",
			trigger: "arr_cal_btn",
			bottomBar: true,
			onSelect: function() {
				this.hide();
				getElem("arr_cal_input").focus();
				getElem("arr_cal_input").blur();
			}
		});	
	}
	if (getElem('dep_cal_input'))
	{
		new Calendar({
			inputField: "dep_cal_input",
			dateFormat: "%d/%m/%Y",
			trigger: "dep_cal_btn",
			bottomBar: true,
			onSelect: function() {
				this.hide();
				getElem("dep_cal_input").focus();
				getElem("dep_cal_input").blur();
			}
		});
	}
	
};

function formmonitor (form) {
	var formelemvals = new Array();
	var formelems = new Array();
	for (x=0;x<form.elements.length;x++)
	{
		formelemvals[form.elements[x].name] = form.elements[x].value;
		formelems[form.elements[x].name] = form.elements[x];
		if (form.elements[x].nodeName == 'SELECT')
		{
			formelemvals[form.elements[x].name] = form.elements[x][form.elements[x].selectedIndex].value;
		}
	}
	if (typeof(formelemvals['ccexp']) !== 'undefined')
	{
		var month = getFormElemByName(form, 'ccexp_month');
		var year = getFormElemByName(form, 'ccexp_year');
		var ccexp = getFormElemByName(form, 'ccexp');
		if ((!isNaN(Number(month.value)) && !isNaN(Number(month.value)))
			&& ((Number(month.value) <= 12) && (Number(month.value) >= 1) && (Number(year.value) >= 2011)))
		{
			ccexp.value = month.value + '/' + year.value;
			formelemvals['ccexp'] = ccexp.value;
		} else {
			ccexp.value = '';
			formelemvals['ccexp'] = '';
		}
	}
	if ((typeof(formelemvals['hostel']) !== 'undefined') && (typeof(formelemvals['recipient']) !== 'undefined'))
	{
		getFormElemByName(form, 'hostel').value = formelemvals['recipient'];
		formelemvals['hostel'] = formelemvals['recipient'];
	}
	if (typeof(formelemvals['required']) !== 'undefined')
	{
		var required = formelemvals['required'].split(',');
		var returnvalue = true;
		for (x=0;x<required.length;x++)
		{
			if ((formelemvals[required[x]] == '') || (formelemvals[required[x]] == null))
			{
				if (getElem('error') != null)
				{
					getElem('error').style.display = "block";
				}
				formelems[required[x]].style.backgroundColor = "#FF0000";
				formelems[required[x]].onfocus = function () { this.style.backgroundColor = ""; };
				returnvalue = false;
			}
			if (((required[x] == 'arrival') || (required[x] == 'departure')) && (!isValidDate(formelemvals[required[x]])))
			{
				if (getElem('error') != null)
				{
					getElem('error').style.display = "block";
				}
				formelems[required[x]].style.backgroundColor = "#FF0000";
				formelems[required[x]].onfocus = function () { this.style.backgroundColor = ""; };
				returnvalue = false;
			}
			if ((required[x] == 'ccexp') && (formelemvals['ccexp'] == ''))
			{
				if (getElem('error') != null)
				{
					getElem('error').style.display = "block";
				}
				if ((isNaN(Number(formelemvals['ccexp_month']))) || (Number(formelemvals['ccexp_month']) > 12) || (Number(formelemvals['ccexp_month']) < 1))
				{
					formelems['ccexp_month'].style.backgroundColor = "#FF0000";
					formelems['ccexp_month'].onfocus = function () { this.style.backgroundColor = ""; };
				}
				if ((isNaN(Number(formelemvals['ccexp_month']))) || (Number(formelemvals['ccexp_year'].value) < 2011))
				{
					formelems['ccexp_year'].style.backgroundColor = "#FF0000";
					formelems['ccexp_year'].onfocus = function () { this.style.backgroundColor = ""; };
				}
				returnvalue = false;
			}
			if ((required[x] == 'ccnum') && (cardType(formelemvals['ccnum']) == 'Invalid'))
			{
				if (getElem('error') != null)
				{
					getElem('error').style.display = "block";
				}
				formelems[required[x]].style.backgroundColor = "#FF0000";
				formelems[required[x]].onfocus = function () { this.style.backgroundColor = ""; };
				returnvalue = false;
			}
			if ((required[x] == 'email') && !(/^[a-zA-Z0-9\.\-_]+@[a-zA-Z0-9\.\-_]+\.\w{2,4}$/.test(formelemvals['email'])))
			{
				if (getElem('error') != null)
				{
					getElem('error').style.display = "block";
				}
				formelems[required[x]].style.backgroundColor = "#FF0000";
				formelems[required[x]].onfocus = function () { this.style.backgroundColor = ""; };
				returnvalue = false;
			}
		}
		return returnvalue;
	} else {
		return true;
	}
};

function ccnumCheckType(field)
{
	var type = cardType (field.value);
	if (type == 'Invalid')
	{
		getElem('cctype-disp').innerHTML = '<strong style="color: #ff0000;">Invalid Card Number or Invalid Card Type</strong><br />Only Mastercard and Visa are accepted!';
	} else {
		getElem('cctype-disp').innerHTML = type;
	}
	getFormElemByName(field.form, 'cctype').value = type;
};

function cardType (num)
{
	var num = num.replace (/\s/g, "");
	var regex = /^[0-9]{13,19}$/;
	var checksum = 0;
	var j = 1;
	
	if (!regex.exec(num))
		return 'Invalid';
	
	var calc;
	for (i = num.length - 1; i >= 0; i--) {
		
		calc = Number(num.charAt(i)) * j;
		if (calc > 9) {
			checksum = checksum + 1;
			calc = calc - 10;
		}
		checksum = checksum + calc;
		if (j ==1) {j = 2} else {j = 1};
	}
	
	if (checksum % 10 != 0)
		return 'Invalid';
	
	/* Visa */
	if ((num.length == 16) || (num.length == 13))
	{
		regex = /^4/;
		if (regex.exec(num))
			return 'Visa';
	}
	
	/* Maestro */
	/*if ((num.length == 16) || (num.length == 18))
	{
		regex = /^(5020|5038|56|67|63)/;
		if (regex.exec(num))
			return 'Maestro';
	}*/
	
	/* MasterCard */
	if (num.length == 16)
	{
		regex = /^(51|52|53|54|55)/;
		if (regex.exec(num))
			return 'MasterCard';
	}
	
	/* other */
	return 'Invalid';
};

// Checks a string to see if it in a valid date format
// of (D)D/(M)M/(YY)YY and returns true/false
// http://www.qodo.co.uk/blog/javascript-checking-if-a-date-is-valid/
function isValidDate(s) {
	// format D(D)/M(M)/(YY)YY
	var dateFormat = /^\d{1,4}[\.|\/|-]\d{1,2}[\.|\/|-]\d{1,4}$/;
	if (dateFormat.test(s)) {
		// remove any leading zeros from date values
		s = s.replace(/0*(\d*)/gi,"$1");
		var dateArray = s.split(/[\.|\/|-]/);
		// correct month value
		dateArray[1] = dateArray[1]-1;
		// correct year value
		if (dateArray[2].length<4) {
			// correct year value
			dateArray[2] = (parseInt(dateArray[2]) < 50) ? 2000 + parseInt(dateArray[2]) : 1900 + parseInt(dateArray[2]);
		}
		var testDate = new Date(dateArray[2], dateArray[1], dateArray[0]);
		if (testDate.getDate()!=dateArray[0] || testDate.getMonth()!=dateArray[1] || testDate.getFullYear()!=dateArray[2]) {
			return false;
		} else {
			return true;
		}
	} else {
		return false;
	}
}

function getFormElemByName (form, elname) {
	for (y=0;y<form.elements.length;y++)
	{
		if (form.elements[y].name == elname)
		{
			return form.elements[y];
		}
	}
	return null;
};

document.observe('dom:loaded', function () { initformmonitor(); });
