/*
 * cf_form javascript library file
 *
 ************************************************************/

var cf_form = {};

var undefined;

/* Validation functions 
*******************************/

cf_form.required = function(formField) {
	if (formField.length && formField[0].type == 'radio') {
		for(var i=0; i<formField.length; i++) {
			if (formField[i].checked) {
				return true;
			}
		}
		cf_form.field_alert(formField, 'This is a required field');
		return false;
	} else if (formField.type == 'checkbox') {
		if(formField.checked == 0) {
			cf_form.field_alert(formField, 'This is a required field');
			return false;
		} else {
			return true;
		}
	} else if (formField.type == 'select-one' 
				|| formField.type == 'select-multiple') {
		if(! formField[formField.selectedIndex].value.length) {
			cf_form.field_alert(formField, 'This is a required field');
			return false;
		} else {
			return true;
		}
	} else {
		if(! formField.value.length) {
			cf_form.field_alert(formField, 'This is a required field');
			return false;
		} else {
			return true;
		}
	}
}

cf_form.validate = function(formField, validation, rexp, message) {
	if(formField.value.length && window.RegExp) { // Only if there is content and the browser supports Regexp
		var rexp;

		switch (validation) {
			case 'date':
				rexp = /^[0-3]{0,1}[0-9][ \/](jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[ \/]([0-9]{2}|)[0-9]{2}$/;
				var dateNow = new Date();
				var monthNames = new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')
				message = 'This is not a recognised date format. Try: ' + dateNow.getDate() + ' ' + monthNames[dateNow.getMonth()]  + ' ' + dateNow.getFullYear();
				break;	
			case 'time':
				rexp = /^[0-2][0-9]:[0-5][0-9]:[0-5][0-9]$/;
				message = 'This is not a recognised time format. Try: 12:15:22';
				break;	
			case 'integer':
				rexp = /^\-{0,1}[0-9]*$/;
				message = 'This should be a whole number. Please do not use commas, spaces or dots.';
				break;	
			case 'float':
				rexp = /^\-{0,1}[0-9]*(\.[0-9]*){0,1}$/;
				message = 'This should be a number. Please do not use commas or spaces.';
				break;
			case 'regular_expression':
				// Use the rexp passed in to the function
				// Only override message if not passed in
				if(message == undefined) {message = 'This is incorrect format'}
				break;
			case 'email':
				rexp = /^[^ \(\)\<\>\@\,\;\:\\\""\[\]]*@([A-Za-z0-9-]+\.)+[A-Za-z]{2,6}$/;
				message = 'This is not a valid email address';
				break;
			case 'url':
				rexp = /^https{0,1}:\/\/([^\.@]+\.[^ @]+){0,1}$/;
				message = 'This is not a valid URL. It should start with http:// or https:// and contain no spaces.';
				break;
			default:
				return true;
				break;	
		}
		if (! rexp.exec(formField.value.toLowerCase())) {
			cf_form.field_alert(formField, message);
			return false;
		} else {
			return true;
		}
	} else {
		return true;
	}
}

cf_form.range = function(formField, min, max) {
	if(formField.value.length && (formField.value < min || formField.value > max)) {
		cf_form.field_alert(formField, 'This should be a number between ' + min + ' and ' + max);
		return false;
	} else {
		return true;
	}
}

cf_form.maxlength = function(formField, maxLength) {
	if(formField.value.length > maxLength) {
		cf_form.field_alert(formField, 'This is too long. It should be no longer than ' + maxLength + ' characters (is currently ' + formField.value.length + ' characters)');
		return false;
	} else {
		return true;
	}
}

/* Alert functions 
*******************************/

cf_form.form_alert = function(thisForm, message) {
	var errorId = '_cf_form_form_alert_' + thisForm.name;
	document.getElementById(errorId).style.color = 'red';
	document.getElementById(errorId).style.fontWeight = 'bold';
	document.getElementById(errorId).innerHTML = message;
	// scroll back up to the alert
	window.location.hash = 'cf_form.form_' + thisForm.name;
}

cf_form.submit_alert = function(thisForm, message) {
	var errorId = '_cf_form_submit_alert_' + thisForm.name;
	if (message != undefined) { // set alert
		document.getElementById(errorId).className = '_cf_form_alert_submit';
		document.getElementById(errorId).innerHTML = message;
	} else { // reset alert
		document.getElementById(errorId).className = 'none';
		document.getElementById(errorId).innerHTML = '';	
	}
}

cf_form.submit_status = function(thisForm, message) {
	thisForm['_cf_form_submit'].value = message;
}

cf_form.field_alert = function(formField, message) {
	if (!cf_form.fieldgroup_alert(formField, message)) { // First try to alert at group level
		if (formField.length && formField[0].type == 'radio') {
			var alertId = '_cf_form_field_alert_' + formField[0].name;
		} else {
			var alertId = '_cf_form_field_alert_' + formField.name;
		}
		if (message != undefined) { // set alert
			if (formField.type != undefined) { // not radios
				//Restyle input box
				//formField.style.border = '3px solid red';
				//formField.style.background = '#ffefef';
				formField.className = '_cf_form_alert_field';
			}
			//Set text properties
			document.getElementById(alertId).className = '_cf_form_alert_text';
			document.getElementById(alertId).innerHTML = message;
		} else { // reset alert
			if (formField.type != undefined) { // not radios
				formField.className = '';
			}
			document.getElementById(alertId).className = '';
			document.getElementById(alertId).innerHTML = '';
		}
	}
}

cf_form.fieldgroup_alert = function(formField, message) {
	if (formField.length == undefined) {
		var groupId = '_cf_form_fieldgroup_' + formField.name;
		var alertId = '_cf_form_fieldgroup_alert_' + formField.name;
	} else {
		var groupId = '_cf_form_fieldgroup_' + formField[0].name;
		var alertId = '_cf_form_fieldgroup_alert_' + formField[0].name;
	}
	if (document.getElementById(groupId) != undefined) { // group exists
		if (message != undefined) {
			document.getElementById(groupId).className = '_cf_form_alert_group';
			document.getElementById(alertId).className = '_cf_form_alert_text';
			document.getElementById(alertId).innerHTML = message;
		} else { // reset alert
			document.getElementById(groupId).className = '';
			document.getElementById(alertId).innerHTML = '';
		}
		return true;
	} else { // no group found
		return false;
	}
}



/* Submit functions 
*******************************/

var timeLastClicked = false;
cf_form.checkdoubleclick = function(timeout, timeoutMessage) {
	if (! timeLastClicked) {
		var time = new Date();
		timeLastClicked = time.getTime();
		return true;
	} else {
		//Already clicked - check how long ago
		var time = new Date();
		var elapsedTimeSeconds = (time.getTime() - timeLastClicked) / 1000;
		if(elapsedTimeSeconds <  timeout) {
			alert(timeoutMessage);
			return false;
		} else {
			//Allow to resubmit
			var time = new Date();
			timeLastClicked = time.getTime();
			return true;
		}
	}
}


