/*************************************************************************************************************
 * Traitement des formulaires
 ************************************************************************************************************/
function form_parseAll() {
	for (var i = 0; i < document.forms.length; i++) {
		var oForm = document.forms[i];
		if (!oForm.attributes["ajaxParsed"]) {
			oForm.setAttribute("ajaxParsed", "true");
			oForm.setAttribute("method", "post");
			$(oForm).observe("submit", function() {
						return false;
					});

			var oLiTextarea = oForm.getElementsByTagName("TEXTAREA");
			for (var j = 0; j < oLiTextarea.length; j++) {
				oLiTextarea[j].value = oLiTextarea[j].value.replace(/<br\/>/g, '\r\n');
			}

			if (!Object.isUndefined(oForm.validate)) {
				if (Object.isUndefined(oForm.validate.onclick) || !oForm.validate.onclick) {
					$(oForm.validate).observe("click", function() {
								(new Form(this.form)).submit();
							});
				}
			}
			$(oForm).observe("keypress", function(e) {
				if (e.keyCode == Event.KEY_RETURN) {
					var oSrc = Event.element(e);
					if ("TEXTAREA" == oSrc.tagName
							|| ("INPUT" == oSrc.tagName && -1 < ["BUTTON", "SUBMIT", "FILE"].indexOf(oSrc.type
									.toUpperCase()))) {
						return;
					}
					e.stop();
					if (!Object.isUndefined(oSrc.form) && !Object.isUndefined(oSrc.form.validate)) {
						oSrc.form.validate.click();
					}
				}
			});
		}
	}
}

var Form = Class.create();
Form.setEmptyValue = function(field, emptyValue) {
	field = $(field);
	field.emptyValue = emptyValue;
	var fOnFocus = function() {
		if (this.emptyValue == this.value) {
			this.value = "";
			this.toggleClassName('emptyValue');
		}
	}
	var fOnBlur = function() {
		if ("" == this.value) {
			this.value = this.emptyValue;
			this.toggleClassName('emptyValue');
		}
	}
	field.observe('focus', fOnFocus);
	field.observe('blur', fOnBlur);
	fOnBlur.call(field);
}
Form.convertToInt = function(elm, defVal) {
	var currentValue = parseInt(elm.value, 10);
	return (isNaN(currentValue) ? (defVal||0) : currentValue);
}
Form.increaseAdjacent = function(elm, valueToAdd) {
	var input = $(elm).adjacent('input')[0];
	input.value = Form.convertToInt(input) + valueToAdd;
}
Form.prototype = {
	oHtml : null,
	err : null,
	iElmIndex : 0,

	initialize : function(v) {
		switch (typeof(v)) {
			case 'string' :
			case 'number' :
				this.oHtml = document.forms[v];
				break;
			case 'object' :
				this.oHtml = v;
				break;
		}
		this.err = [];
	},

	getForm : function() {
		return this.oHtml;
	},

	/**
	 * return form elements collection by name
	 *
	 * @param {}
	 *          sElmName
	 * @return {}
	 */
	getElm : function(sElmName, single) {
		var aElm = $A(document.getElementsByName(sElmName)).select(function(elm) {
					return elm.form == this.oHtml;
				}.bind(this));

		// if (aElm.length==0) {
		// throw "elements['" + sElmName + "'] inexistant";
		// }

		return single ? (aElm.length > 0 ? aElm[0] : null) : aElm;
	},

	/**
	 * set or get input value
	 *
	 * @param {}
	 *          sElmName
	 * @param {}
	 *          sVal
	 */
	val : function(sElmName, sVal) {
		var aElm = this.getElm(sElmName);
		if (aElm.length == 0 || Object.isUndefined(aElm[0])) {
			return;
		}

		// Récupération des caractéristiques de l'élément
		var sType = (aElm[0].tagName.toUpperCase() == "INPUT" ? aElm[0].type : aElm[0].tagName).toUpperCase();
		bMulti = ("CHECKBOX" == sType || (aElm.length > 1 && "RADIO" != sType));

		if (Object.isUndefined(sVal)) {
			// get value
			var aVal = [];
			for (var i = 0; i < aElm.length; i++) {
				switch (sType) {
					case "TEXT" :
					case "FILE" :
					case "PASSWORD" :
					case "HIDDEN" :
					case "TEXTAREA" :
						var val = aElm[i].value;
						var emptyValue = aElm[i].emptyValue;
						if (emptyValue && emptyValue == val) {
							val = "";
						}
						aVal.push(val);
						break;
					case "RADIO" :
					case "CHECKBOX" :
						if (aElm[i].checked) {
							aVal.push(aElm[i].value);
						}
						break;
					case "SELECT" :
						aVal.push(aElm[i].options[aElm[i].selectedIndex].value);
						break;
				}
			}
			return (bMulti ? aVal : aVal[0]);
		} else {
			// set value
			if (sType == "RADIO" || sType == "CHECKBOX") {
				for (var i = 0; i < aElm.length; i++) {
					if (null == sVal) {
						aElm[i].checked = false;
					} else if (aElm[i].value == sVal + '') {
						aElm[i].checked = true;
						break;
					}
				}
			} else {
				sVal = (null == sVal ? '' : sVal + '');
				var i = 0; // (bMulti ? parseInt(sElmName.substring(sElmName.indexOf("[")+1, sElmName.length-1)) :
				// 0);
				switch (sType) {
					case "TEXT" :
					case "PASSWORD" :
					case "HIDDEN" :
					case "TEXTAREA" :
					case "BUTTON" :
					case "SUBMIT" :
						aElm[i].value = sVal;
						break;
					case "SELECT" :
						var oLiOpt = aElm[i].getElementsByTagName("option");
						for (var j = 0; j < oLiOpt.length; j++) {
							if ((!Object.isUndefined(oLiOpt[j].value) && oLiOpt[j].value == sVal)
									|| (Object.isUndefined(oLiOpt[j].value) && oLiOpt[j].text == sVal)) {
								oLiOpt[j].selected = true;
								break;
							}
						}
						break;
				} // end switch
			} // end if
		} // end if
	}, // end function

	/**
	 * if condition add error
	 *
	 * @param {}
	 *          b
	 * @param {}
	 *          sErr
	 * @return {}
	 */
	addErrIf : function(b, sErr, aParams) {
		if (b) {
			this.addErr(sErr, aParams);
		}
		return b;
	},

	/**
	 * add error
	 *
	 * @param {}
	 *          sErr
	 */
	addErr : function(sErr, aParams) {
		this.err.push([sErr, aParams]);
	},

	/**
	 * clear all error
	 */
	clearErr : function() {
		this.err = [];
	},

	/**
	 * verify error
	 *
	 * @param {}
	 *          callback
	 * @return {Boolean}
	 */
	verify : function(callback) {
		if (this.err.length > 0) {
			var sErr = ti("form.errIntro") + "<br/><ul>" + $A(this.err).collect(function(err) {
						var code = err[0];
						var params = err[1];
						var txt = tf('errText.' + code, null, params);
						return "<li>" + (form_checkFormat(code, 'num') && !Object.isUndefined(txt) ? txt : code)
								+ '</li>';
					}.bind(this)).join('');
			Dialog.alert(sErr, {
						title : ti("form.errTitle"),
						onOk : Object.isFunction(callback) ? callback : null
					});
			return false;
		} else {
			return true;
		}
	},

	/**
	 * verify error and submit form
	 *
	 * @return {Boolean}
	 */
	verifyAndSend : function() {
		if (this.verify()) {
			this.send();
			return true;
		} else {
			return false;
		}
	},

	/**
	 * begin form submit
	 */
	send : function() {
		this.sendFile(true);
	},

	/**
	 * submit file
	 *
	 * @param {}
	 *          bStart
	 */
	sendFile : function(bStart) {
		this.iElmIndex = (bStart ? 0 : this.iElmIndex + 1);

		for (this.iElmIndex; this.iElmIndex < this.oHtml.elements.length; this.iElmIndex++) {
			var oElm = this.oHtml.elements[this.iElmIndex];
			if (oElm.tagName.toUpperCase() == "INPUT" && oElm.type.toUpperCase() == "FILE") {
				// Ajout du formulaire
				var oHTMLForm = $('sendFile_form');
				if (oHTMLForm == null) {
					oHTMLForm = document.createElement("form");
					oHTMLForm.style.display = "none";
					oHTMLForm.setAttribute("id", "sendFile_form");
					oHTMLForm.setAttribute("method", "post");
					oHTMLForm.setAttribute("enctype", "multipart/form-data");
					oHTMLForm.setAttribute("target", "sendFile_iframe");
					oHTMLForm.setAttribute("action", SERVER_PATH + UPLOADSCRIPT_PATH);
					document.body.appendChild(oHTMLForm);
				} else {
					while (oHTMLForm.childNodes.length > 0) {
						oHTMLForm.removeChild(oHTMLForm.childNodes[0]);
					}
				}

				// Ajout de l'IFRAME
				var oHTMLIframe = $('sendFile_iframe');
				if (oHTMLIframe == null) {
					oHTMLIframe = document.createElement("iframe");
					oHTMLIframe.style.width = '300px';
					oHTMLIframe.style.height = '300px';
					oHTMLIframe.style.display = "none";
					oHTMLIframe.setAttribute("id", "sendFile_iframe");
					oHTMLIframe.setAttribute("name", "sendFile_iframe");
					document.body.appendChild(oHTMLIframe);
				}

				// Ajout de l'INPUT file
				oHTMLForm.appendChild(oElm.cloneNode(true));

				oHTMLIframe.onload = function() {
					this.sendFile(false);
				}.bind(this);
				oHTMLForm.submit();
				return;
			} // end if
		} // end for
		// window.stop();
		this.sendData();
	},

	/**
	 * submit form
	 *
	 * @return {Boolean}
	 */
	submit : function() {
		if (this.getForm().hasAttribute('submitting')) {
			return false;
		}
		this.getForm().setAttribute('submitting', 'true');

		var def = m_sThisPage + '_' + this.oHtml.attributes["name"].value;
		var sJS = null;
		if (!(this.oHtml.attributes["validatedUrl"] || this.oHtml.attributes["validatedFn"])) {
			sJS = (this.oHtml.attributes["js"] ? this.oHtml.attributes["js"].value : def);
			if ("" == sJS || "false" == sJS || "null" == sJS) {
				sJS = null;
			}
		}
		var sText = null != sJS ? sJS : def;

		var f = function(text) {
			mfText = m_text[sText];
			if (mf && Object.isFunction(mf.test)) {
				if (false === mf.test(this)) {
					this.getForm().removeAttribute('submitting');
					return;
				}
			}
			this.verifyAndSend();
		}.bind(this);
		if (sJS) {
			new LoadDoc(f.bind(this), new DocToLoad('js', sJS));
		} else {
			mf = null;
			f();
		}
	},

	/**
	 * submit form data
	 */
	sendData : function() {
		var aLiParam = [];
		var url;
		if (this.oHtml.attributes["url"]) {
			sUrl = this.oHtml.attributes["url"].value;
		} else {
			sUrl = m_sThisPage + '_' + this.oHtml.attributes["name"].value;
			$H(m_aThisParam).each(function(pair) {
						aLiParam.push([pair.key, pair.value]);
					});
		}
		if ("" == sUrl || "false" == sUrl || "null" == sUrl) {
			this.submitFinished(null);
		} else {
			for (var i = 0; i < this.oHtml.elements.length; i++) {
				var oElm = this.oHtml.elements[i];
				var sType = (oElm.tagName.toUpperCase() == "INPUT" ? oElm.type : oElm.tagName).toUpperCase();
				var sName = null;
				var sVal = null;

				switch (sType) {
					case "TEXT" :
					case "PASSWORD" :
					case "HIDDEN" :
					case "TEXTAREA" :
					case "FILE" :
						var emptyValue = oElm.emptyValue;
						sName = oElm.attributes["name"].value;
						sVal = (oElm.emptyValue && oElm.emptyValue == oElm.value) ? "" : oElm.value;
						break;
					case "RADIO" :
					case "CHECKBOX" :
						if (oElm.checked) {
							if (oElm.attributes["name"]) {
								sName = oElm.attributes["name"].value;
								sVal = oElm.value;
							}
						}
						break;
					case "SELECT" :
						sName = oElm.attributes["name"].value;
						oElm = oElm.options[oElm.selectedIndex];
						sVal = (!Object.isUndefined(oElm.attributes["value"]) ? oElm.value : oElm.text);
						break;
					case "OPTION" :
						sName = oElm.parentNode.attributes["name"].value;
						sVal = (!Object.isUndefined(oElm.attributes["value"]) ? oElm.value : oElm.text);
						break;
					case "BUTTON" :
					case "FIELDSET" :
						break;
					default :
						alert('element inconnu : ' + sType);
						break;
				}

				if (sName != null) {
					aLiParam.push([sName, sVal]);
				}
			}

			new LoadDoc(this.submitFinished.bind(this), new DocToLoad('api', sUrl, aLiParam));
		}
	},

	/**
	 * verify form result
	 *
	 * @param {}
	 *          data
	 */
	submitFinished : function(data) {
		if (!Object.isUndefined(this.oHtml.validate)) {
			this.oHtml.validate.blur();
		}
		this.getForm().removeAttribute('submitting');

		var bError = false;
		if (data != null) {
			var readErrs = data["_formErr"] || [];
			if (readErrs.length > 0) {
				bError = true;
				for (var i = 0; i < readErrs.length; i++) {
					this.addErr(readErrs[i][0], readErrs[i][1]);
				}
				this.verify(function() {
							if (mf && Object.isFunction(mf.canceledFn)) {
								mf.canceledFn(data, this);
							}
							return true;
						}.bind(this));
			}
		}

		if (!bError) {
			var validatedMsg = tf("validatedMsg") || false;
			if (validatedMsg) {
				Dialog.alert(validatedMsg, {
							title : ti("alert.confirmTitle"),
							onOk : function(win) {
								win.close();
								this.submitFinishedStep2(data);
							}.bind(this)
						});
			} else {
				this.submitFinishedStep2(data);
			}
		}

	},

	submitFinishedStep2 : function(data) {
		var validatedUrl = null;
		if (mf && Object.isString(mf.validatedUrl)) {
			validatedUrl = mf.validatedUrl;
		} else if (this.oHtml.attributes["validatedUrl"]) {
			validatedUrl = this.oHtml.attributes["validatedUrl"].value;
		}
		if (null != validatedUrl) {
			PageManager.goTo(validatedUrl);
		} else {
			var validatedFn = null;
			if (mf && Object.isFunction(mf.validatedFn)) {
				validatedFn = mf.validatedFn;
			} else if (this.oHtml.attributes["validatedFn"]) {
				validatedFnCode = eval(this.oHtml.attributes["validatedFn"].value);
			}
			if (null != validatedFn) {
				validatedFn.apply(mf, [data, this]);
			}
		}
	}
};

var form_inputFileNo = 0;
function form_inputFileAdd(sElmName) {
	form_inputFileNo++;

	var sElmNameSub = (sElmName.indexOf("[") == -1 ? sElmName : sElmName.substr(0, sElmName.indexOf("[") - 1));

	var s = '<div style="position:relative;">'
			+ '<input type="file" style="position:relative;z-index:2;-moz-opacity:0;-ms-filter:\'alpha(opacity=0)\';filter:alpha(opacity: 0);opacity:0;" name="'
			+ sElmName
			+ '" id="'
			+ sElmNameSub
			+ '_file_'
			+ form_inputFileNo
			+ '" onchange="$(\''
			+ sElmNameSub
			+ '_text_'
			+ form_inputFileNo
			+ '\').value=this.value;" readonly="1" />'
			+ '<input type="text" style="position:absolute;z-index:1;left:0px;width:145px" class="text" id="'
			+ sElmNameSub
			+ '_text_'
			+ form_inputFileNo
			+ '" />'
			+ '<input type="button" style="position:absolute;z-index:1;left:147px;margin-left:0px;" class="button" value="Parcourir..." />'
			+ '<input type="button" style="position:absolute;z-index:1;left:242px;margin-left:0px;" class="button" value="Annuler" onclick="this.parentNode.innerHTML=form_inputFileAdd(\''
			+ sElmName + '\')" />' + '</div>';

	return s;
}

function form_checkFormat(sToCheck, sType) {
	var sPattern;
	switch (sType.toLowerCase()) {
		case 'num' :
			sPattern = '[0-9]+';
			break;
		case 'alphanum' :
			sPattern = '[0-9a-z_ ]+';
			break;
		case 'text' :
			sPattern = '[-0-9a-z_ \(\)\'\.\n\r\?!,;\:@àâéèêïöüùç]*';
			break;
		case 'mail' :
			sPattern = '[0-9a-z_\.-]+@[0-9a-z_\.-]{3,}(\.)[a-z]{2,4}';
			break;
	}
	var oReg = new RegExp('^' + sPattern + '$', "gi");
	return oReg.test(sToCheck);
}

/** ************************************************************************** */
