// :: kForm object
// - constructor
function kForm() {
	
}
kForm.prototype = {
	// - variables
	customValidators: {
		required: {
			name: "required",
			defaultMessage: "This field is mendatory.",
			regExp: /^.+$/
		},
		numeric: {
			name: "numeric",
			defaultMessage: "This field must have a numerical value.",
			regExp: /^[-]?\d+(\.\d+)?$/
		},
		email: {
			name: "email",
			defaultMessage: "This field must contain a valid email address.",
			regExp: /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/
		},
		creditcard: {
			name: "creditcard",
			defaultMessage: "This field must contain a valid credit card number.",
			regExp: /^((4\d{3})|(5[1-5]\d{2})|(6011))([- ])?\d{4}([- ])?\d{4}([- ])?\d{4}|3[4,7]\d{13}$/
		},
		alphabetical: {
			name: "alphabetical",
			defaultMessage: "This field must contain only letters.",
			regExp: /^[a-zA-Z\s]+$/
		},
		//alphanumerical: {
		//	name: "alphanumerical",
		//	defaultMessage: "This field must contain only letters or numbers.",
		//	regExp: /^[a-zA-Z0-9ÀÂÇÈÉÊËÎÔÙÛàâçèéêëîôùû\s]+$/
		//},
		checked: {
			name: "checked",
			defaultMessage: "This field must be checked.",
			regExp: /^.+$/
		},
		notfirst: {
			name: "notfirst",
			defaultMessage: "An option must be chosen.",
			regExp: /^.+$/
		}
	},
	// - methods
	//
	displayFormMessageValidation: function (formName, element, element_label, validator)
	{
		if (typeof(element) == "object" && typeof(validator) == "object") {
			// - get the error message
			// custom value for this element
			if (typeof(window["message_validation_" + validator.name + "_" + element_label]) != "undefined") {
				var message = window["message_validation_" + validator.name + "_" + element_label];
			}
			// custom value
			else if (typeof(window["message_validation_" + validator.name]) != "undefined") {
				var message = window["message_validation_" + validator.name];
			}
			// default value
			else {
				var message = validator.defaultMessage;
			}
			// - format the html response
			var color = "#FF0000";
			var span_message_id = formName + "_" + "error_message_" + element_label;
			if ($(span_message_id)) {
				$(span_message_id).style.display = "none";
				$(span_message_id).innerHTML = message;
			}
			else {
				var html = '&nbsp;&nbsp;<span id="' + span_message_id + '" style="color:' + color + ';display:none">' + message + '</span>';
				// print the response
				element.insertAdjacentHTML("afterend", html);
			}
			// - display it
			new Effect.Appear(span_message_id);
		}
	},
	//
	getButtons: function (buttons) {
		var htmlbuttons = "";
		if (buttons) {
			for (var i in buttons) {
				if (buttons[i].label && buttons[i].action) {
					var parameters = "";
					if (buttons[i].parameter) {
						parameters = buttons[i].parameter;
					}
					htmlbuttons += '<input type="button" value="' + buttons[i].label + '" onclick="' + buttons[i].action + '(' + parameters + ')" />';
				}
			}
		}
		return htmlbuttons;
	},
	//
	getContentWithoutButton: function (formName, flagButton) {
		if ($(formName)){
			var content = $(formName).innerHTML;
			var regExp = new RegExp('<li.*class=.*formHolderButton(\n|\r|.)*?type="button"(\n|\r|.)*?</li>',"im");
			if (flagButton) {
				var replaceWith = "%flagButton%";
			}
			else {
				var replaceWith = "";
			}
			return content.replace(regExp, replaceWith);
		}
	},
	//
	getElements: function (form)
	{
		if (typeof(form) != "object") {
			form = $(form);
		}
		// form 
		if (typeof(form) == "object") {
			var len = form.elements.length;
			var elements = new Array();
			for (var i=0;i<len;i++) {
				elements[i] = form.elements[i];
			}
			return elements;
		}
	},
	//
	getElementAsParameter: function(form)
	{
		var elements = this.getElementsNamesValues(form);
		var len = elements.length;
		var response = "";
		for (var i in elements) {
			if (i != "extend" && i != "undefined") {
				response += ("&" + i + "=" + elements[i] );
			}
		}
		return response;
	},
	//
	getElementsNames: function (form)
	{
		var elements = this.getElements(form);
		var len = elements.length;
		var elements_to_return = new Array();
		for (var i=0;i<len;i++) {
			if (elements[i].name == "") {
				elements_to_return[i] = elements[i].id;
			}
			else {
				elements_to_return[i] = elements[i].name;
			}
		}
		return elements_to_return;
	},
	//
	getElementsNamesValues: function (form)
	{
		var elements = this.getElements(form);
		var len = elements.length;
		var element_name = "";
		var elements_to_return = new Object();
		for (var i=0;i<len;i++) {
			// get the name or id
			if (elements[i].name == "") {
				element_name = elements[i].id;
			}
			else {
				element_name = elements[i].name;
			}
			// get the value
			if (element_name != "") {
				switch (elements[i].type) {
					case "checkbox":
						var value = "";
						if (elements[i].checked) {
							value = elements[i].value;
						}
						elements_to_return[element_name] = value;
						break;
					default:
						elements_to_return[element_name] = elements[i].value;
						break;
				}
			}
		}
		return elements_to_return;
	},
	//
	getElementsValidators: function (form)
	{
		var elements = this.getElements(form);
		var elements_to_return = new Object();
		if (elements) {
			var length   = elements.length;
			for (var i=0;i<length;i++)
			{
				// get label
				var label = elements[i].id;
				var label_type = "id";
				if (label == "") {
					label = elements[i].name;
					label_type = "name"; 
				}
				// get validator
				if (label != "") {
					var validators = elements[i].getAttribute("validator");
					if (validators != null) {
						validators = validators.split(" ");
						var to_return = new Object();
						to_return["label"]        = label;
						to_return["label_type"]   = label_type;
						to_return["validators"]   = validators;
						elements_to_return[label] = to_return;
					}
				}
			}
		}
		// return 
		return elements_to_return;
	},
	//
	hideFormMessageValidation: function (formName, element_label)
	{
		var span_message_id = formName + "_" + "error_message_" + element_label;
		if ($(span_message_id))
		{
			$(span_message_id).style.display = "none";
		}
	},
	hideFormMessagesValidation : function (formName) 
	{
		var form = $(formName);
		if (form) {
			var elements = this.getElementsValidators(form);
			for (var i in elements) {
				this.hideFormMessageValidation(formName, i);
			}
		}
	},
	//
	populateFormFromAjax: function (form, fields, serverLocation, options) {
		// - get values
		// options
		var callback = options['onComplete'];
		options['onComplete'] = function (t) {
			kForm.populateFormFromJSON(t.kJSON, form, fields);
			callback(t);
		};
		if (form.parameters) {
			var formParameters = "";
			for (var i in form.parameters) {
				formParameters += ("&" + i + "=" + form.parameters[i]);
			}
			options.parameters += formParameters;
		}
		// call
		kAjax.call(serverLocation, null, options);
	},
	//
	populateFormFromJSON: function (json, form, fields) {
		var formUpdate = $(form.name);
		if (typeof(fields) == "object") {
			for (var i in fields) {
				var element = fields[i];
				if (formUpdate[i]) {
					switch (element.type) {
						case "text":
						case "select":
							formUpdate[i].value = json[element.label];
							break;
						case "checkbox":
							var checked = false;
							if (json[element.label] == 1) {
								checked = true;
							}
							formUpdate[i].checked = checked;
							break;
						case "hidden":
							html = '<input type="hidden" id="' + i + '" name="' + i + '" value="' + json[element.label] + '" />';
							formUpdate.insertAdjacentHTML("beforeEnd", html);
							break;
					}
				}
			}
		}
	},
	//
	populateSelectFromJSON: function (json, select) {
		if (typeof(json) == "object" && typeof(select) != undefined) {
			if ($(select)) {
				// create the select content
				var html = "";
				for (var i in json) {
					html += '<option value="' + i + '">' + json[i] + '</option>\n';
				}
				// affect it to the element
				$(select).innerHTML = html;
			}
			else {
				//console.log(select + "is not defined");
				return false;
			}
		}
		else {
			//console.log("json array is undefined");
			return false;
		}
	},
	//
	showElementsNames: function (form, display)
	{
		// - get the names
		var elements = this.getElementsNames(form);
		// - display the result
		// display default value
		if (display == undefined)
			display = "console";
		// display
		var len = elements.length;
		if (display == "console") {
			error_log("elements in form '" + form.name + "'");
			for (var i=0;i<len;i++) {
				error_log((i+1) + ". " + elements[i]);
			}
		}
		else if (display = "alert") {
			var msg = "elements in form '" + form.name +"'>\n";
			for (var i=0;i<len;i++) {
				msg += ((i+1) + ". " + elements[i] + "\n");
			}
			alert(msg);
		}
	},
	//
	showElementsNamesValues: function (form, display)
	{
		// - get the names
		var elements = this.getElementsNamesValues(form);
		// - display the result
		// display default value
		if (display == undefined)
			display = "console";
		// display
		var len = elements.length;
		if (display == "console") {
			error_log("elements in form '" + form.name + "'");
			for (var i in elements) {
				if (i != "extend") {
					error_log((i) + " => " + elements[i]);
				}
			}
		}
		else if (display = "alert") {
			var msg = "elements in form '" + form.name +"'>\n";
			for (var i in elements) {
				if (i != "extend") {
					msg += ((i) + " => " + elements[i] + "\n");
				}
			}
			alert(msg);
		}
	},
	//
	validate: function (form)
	{
		if (typeof(form) != "object") {
			form = $(form);
		}
		var elements = this.getElementsValidators(form);
		var an_error_has_occured = false;
		for (var label in elements) {
			var label_type  = elements[label]["label_type"];
			var validators  = elements[label]["validators"];
			var length = validators.length;
			if (length > 0) {
				// get element
				var element = $(label);
				var value   = element.value;
				// check validator
				for (var i=0;i<length;i++) {
					var validator_name = elements[label]["validators"][i];
					var validator = eval("this.customValidators." + validator_name);
					if (typeof(validator) == "object") {
						switch (validator.name) {
							case 'notfirst' :
								if (value == element.options[0].value) {
									var error = true;
								}
								else {
									var error = false;
								}
								break;
							case 'checked':
								if (!element.checked){
									var error = true;
								}
								else {
									var error = false;
								}
								break;
							default:
								if (!validator.regExp(value)) {
									var error = true;
								}
								else {
									var error = false;
								}
								break;
						}
						// handle error
						if (error) {
							length = 0; // reset counter 
							this.displayFormMessageValidation(form.name, element, label, validator);
							an_error_has_occured = true;
						}
						else {
							this.hideFormMessageValidation(form.name, label);
						}
					}
				}
			}
		}
		return !an_error_has_occured;
	}
}
var kForm = new kForm();
