/**
 *
 * Forms
 *
 * Requirements: Prototype et Scriptaculous (effects)
 *
 */
 
var regexp = new Object;
regexp.url = new RegExp(/(((https?)|(ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i);
regexp.email = new RegExp("^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$");
regexp.alpha = new RegExp("^[a-zA-Z]+$");
regexp.alphanum = new RegExp("^\\w+$");
regexp.integer = new RegExp("^-?\\d+$");
regexp.positiveinteger = new RegExp("^\\d+$");
regexp.number = new RegExp("^-?(\\d+(\\.|\\,)\\d*$)|(^-?\\d+$)|(^-?(\\.|\\,)\\d+$)");
regexp.civicnumber = new RegExp("^\\d+(-([1,3]\\/[2,4]|[a-zA-Z]))?$");
/*
regexp.postalcode = new RegExp("^([a-zA-Z]\\d[a-zA-Z])\\s?(\\d[a-zA-Z]\\d)$");
regexp.zipcode = new RegExp("^(\\d{5}(( |-)\\d{4})?)$");
regexp.postalzipcode = new RegExp("(^([a-zA-Z]\\d[a-zA-Z])\\s?(\\d[a-zA-Z]\\d)$)|(^(\\d{5}(( |-)\\d{4})?)$)");
*/

regexp.postalcode_part1 = new RegExp("^([a-zA-Z]\\d[a-zA-Z])$");
regexp.postalcode_part2 = new RegExp("^(\\d[a-zA-Z]\\d)$");

// 1 caractere ou plus...
regexp.date = new RegExp("^([0-9]{4})\\/([0-9]{2})\\/([0-9]{2})$");
regexp.postalcode = new RegExp("[a-zA-Z0-9]");
regexp.zipcode = new RegExp("[a-zA-Z0-9]");
regexp.postalzipcode = new RegExp("[a-zA-Z0-9]");

regexp.phone = new RegExp("^(\\d{3})( |-)?(\\d{3})( |-)?(\\d{4})$");
regexp.creditcard = new RegExp("^3(?:[47]\\d([ -]?)\\d{4}(?:\\1\\d{4}){2}|0[0-5]\\d{11}|[68]\\d{12})$|^4(?:\\d\\d\\d)?([ -]?)\\d{4}(?:\\2\\d{4}){2}$|^6011([ -]?)\\d{4}(?:\\3\\d{4}){2}$|^5[1-5]\\d\\d([ -]?)\\d{4}(?:\\4\\d{4}){2}$|^2014\\d{11}$|^2149\\d{11}$|^2131\\d{11}$|^1800\\d{11}$|^3\\d{15}$");

var error_msg;
var val_out;

var Forms =
{
	/**
	 *
	 * Valid given form
	 *
	 * form = name of the form to validate
	 * target = name of the div to place the errors in
	 *
	 */
	Validate: function(form, target, doReturn, goHash, current_lang)
	{
		var validation_errors = [];
		
		/* Reset error buffer */
		val_out = null;
		var nodes = $(form).getElements();
		var validation_value, is_required, field_label, value;
		var offset = 0;
		
		for (a = 0; a < nodes.length; a++) {
			if (nodes[a].getAttribute('js:validation') != null) {	
				/* Password check up */
				if (nodes[a].getAttribute('js:validation') == "password") {
					var pass = nodes[a].value;
					field_label = nodes[a].getAttribute('js:label');
					if (pass.length < 6) {
						if (nodes[a].getAttribute('js:required') == "true") {
							validation_errors[offset] = {type: validation_value, error: 'invalid', field: nodes[a].id, label: field_label};
							offset++;
						}
					} else {
						if (!regexp['alphanum'].test(pass)) {
							validation_errors[offset] = {type: validation_value, error: 'invalid', field: nodes[a].id, label: field_label};
							offset++;
						}
					}
				} else if (nodes[a].getAttribute('js:validation') == "confpassword") {
					/* Confirm that confpassword matches password */
					var conf = nodes[a].getAttribute('js:match');
					is_required = nodes[a].getAttribute('js:required');
					field_label = nodes[a].getAttribute('js:label');
					if (nodes[a].value != $(conf).value) {
						validation_errors[offset] = {type: validation_value, error: 'notmatch', field: nodes[a].id, label: field_label};
						offset++;
					}
				} else {
					/* Handle text and textarea tags (the other ones don't have a value or the value is set by the programmer so no invalid data can be set, use checkOptionValue or checkCheckValue methods instead) */
					if (nodes[a].getAttribute('type') != 'submit' && nodes[a].getAttribute('type') != 'button' && nodes[a].getAttribute('type') != 'checkbox' && nodes[a].getAttribute('type') != 'radio') {			
						validation_value = nodes[a].getAttribute('js:validation');
						is_required = nodes[a].getAttribute('js:required');
						field_label = nodes[a].getAttribute('js:label');
								
						/* Work only with fields that have the js:validation param */
						if (validation_value != "any" && validation_value != "selected") {
							value = nodes[a].value;
							
							if (regexp[validation_value] == undefined) {
								alert('The validation rule ' + validation_value + ' is not valid for field ' + nodes[a].getAttribute('name') + '!');
								return false;
							}
							
							/* Required? */				
							if (is_required) {
								if (value == '') {
									validation_errors[offset] = {type: validation_value, error: 'required', field: nodes[a].id, label: field_label};
									offset++;
								} else {
									/* Validate */
									if (!regexp[validation_value].test(value)) {
										validation_errors[offset] = {type: validation_value, error: 'invalid', field: nodes[a].id, label: field_label};
										offset++;
									}
								}
							} else {
								/* Validate */
								if (!regexp[validation_value].test(value)) {
									validation_errors[offset] = {type: validation_value, error: 'invalid', field: nodes[a].id, label: field_label};
									offset++;
								}
							}
						} else {
							/* Validate that the field is at least filled */
							value = nodes[a].value;
							if (validation_value == "any") {
								if (is_required) {
									if (value == '') {
										validation_errors[offset] = {type: validation_value, error: 'required', field: nodes[a].id, label: field_label};
										offset++;
									}
								}
							} else if (validation_value == "selected") {
								/* Specific to dropdowns */
								validation_value = nodes[a].getAttribute('js:validation');
								field_label = nodes[a].getAttribute('js:label');
								
								if (validation_value = 'selected') {
									if (nodes[a].value == "none" || nodes[a].value == "null") {
										validation_errors[offset] = {type: validation_value, error: 'required', field: nodes[a].id, label: field_label};
										offset++;
									}
								}
							}
						}
					}
				}
			}
		}
		
		/* Everything has been checked, show messages if required or invalid */
		for (var i = 0; i < validation_errors.length; i++) {
			if (current_lang == undefined || current_lang == 'fr') {
				if (validation_errors[i].error == 'required') {
					error_msg = 'Le champ ' + validation_errors[i].label + ' est obligatoire, veuillez le remplir.';
				} else if (validation_errors[i].error == 'notmatch') {
					error_msg = 'Le champ ' + validation_errors[i].label + ' ne peut \u00EAtre confirm\u00e9.';
				} else {
					error_msg = 'Le champ ' + validation_errors[i].label + ' est manquant ou invalide.';
				}
			} else {
				if (validation_errors[i].error == 'required') {
					error_msg = 'The field ' + validation_errors[i].label + ' is required.';
				} else if (validation_errors[i].error == 'notmatch') {
					error_msg = 'The field ' + validation_errors[i].label + ' could not be confirmed.';
				} else {
					error_msg = 'The field ' + validation_errors[i].label + ' is missing or is invalid.';
				}
			}
				
			alert(error_msg);
					
			if (val_out == null) {
				val_out = '<li>' + error_msg + '</li>';
			} else {
				val_out += '<li>' + error_msg + '</li>';
			}
		}
		
		/* Show error */
		if (val_out != null) {
			//$(target).innerHTML = '<ul>' + val_out + '</ul>';
		
			/* Show the error box */
			if ($(target).style.display == 'none') {
				new Effect.BlindDown(target, {duration: 0.3});
			}
			if (goHash == undefined) {
				window.location.hash = '#content';
			}
		} else {
			/* Submit */
			if (doReturn == true) {
				return true;
			} else {
				$(form).submit();
			}
		}
	}
}
