/**
 * Class Form
 * @param {Object} form Form Element reference
 * Obtain this by the magic Mootools fct : new Form($('id));
 */
var Form = new Class({
	initialize: function(form){
		if (typeof form == "string")
			this.form = $(form);
		else
			this.form = form;
		this.id = this.form.get('id');
		this.defaultValues = {};
		this.resultBox = null;
		this.resultClasses = {};
		this.specificFct = null;
	},

	/**
	 * Permit to submit any form
	 * @param {Object} Form Element reference
	 */
	submit: function(){
		this.form.submit();
	},

	/**
	 * Delete and Save the input default value
	 * @param {Object} el
	 * @param {String} Optionnal specify wich type it should be
	 */
	fill: function(el){
		this.intervalIe = null;

		if (!ExtObj.keyExists(this.defaultValues, el.get('name'))) {
			this.defaultValues[el.get('name')] = {};
			this.defaultValues[el.get('name')]['value'] = el.get('value');
			if (arguments.length > 1)
				this.defaultValues[el.get('name')]['type'] = el.get('type');



		}
		if (this.defaultValues[el.get('name')]['value'] == el.get('value')) {
			el.set('value', '');
			if (ExtObj.keyExists(this.defaultValues[el.get('name')], 'type'))
				if (Browser.Engine.trident){
					var newEl = new Element(el.tagName);
					newEl.type = arguments[1];
					for (key in el)
					{
						if (key != 'type' && key != 'height' && key != 'width'){
							try{
								eval("newEl."+key+" = el."+key+";");
							}
							catch(e){
							 // Because Ms Developers have smoke weed during development, Fucking properties can't be set !!
							}

						}
					}
					newEl.replaces(el);
					newEl.focus();
					//this.intervalIe=setInterval(this.checkInject(), 500, newEl.name);
				}
				else
					el.setProperty('type', arguments[1]);
		}

	},

	checkInject: function(elementName)
	{
		if (this.form.elements[elementName] != null){
				clearInterval(this.intervalIe);
				this.form.elements[elementName].focus();
		}
	},

	/**
	 * Restore the input default value
	 * @param {Object} el
	 */
	restore: function(el){
		var finalEl = el;
		if (this.defaultValues[el.name]['value'] == "undefined")
			return false;
		if (el.value == '') {
			if (ExtObj.keyExists(this.defaultValues[el.name], 'type'))
			{
				if (Browser.Engine.trident){
					var newEl = new Element(el.tagName);
					newEl.type = this.defaultValues[el.name]['type'];
					for (key in el)
					{
						if (key != 'type' && key != 'height' && key != 'width'){
							try{
								eval("newEl."+key+" = el."+key+";");
							}
							catch(e){
							 // Because Ms Developers have smoke weed during development, Fucking properties can't be set !!
							}

						}
					}
					newEl.replaces(el);
					finalEl = newEl;
				}
				else
					el.setProperty('type', this.defaultValues[el.name]['type']);

			}
			finalEl.value = this.defaultValues[el.name]['value'];
		}
	},

	/**
	 * Add a listener on a Key
	 * @param {Int} keyCode
	 * @param {String} userFunction
	 */
	setKey: function(keyCode, userFunction){
		this.form.addEvent('keydown', function(e){
			if (window.event) {
				if (window.event.keyCode == keyCode)
				{
					eval(userFunction);
					e.stop();
				}
			}
			else if (e)
				if (e.code == keyCode)
				{
					eval(userFunction);
					e.stop();
				}

		});
	},

	/**
	 * Set the box to show all the form Results (Success and errors)
	 * @param {Object} item
	 */
	setResultBox: function(item){
		if (typeof item == "string")
			item = $(item);
		this.resultBox = item;

	},
	/**
	 * Set the classes which been called for the form box result
	 * @param {String} error
	 * @param {string} success
	 */
	setResultClasses: function(error, success){
		this.resultClasses['error'] = error;
		this.resultClasses['success'] = success;
	},

	/**
	 * Display a result message for the current form
	 * @param {String} str
	 * @param {String} type [error||success]
	 */
	displayGlobalMsg: function(str, type){
		if (type != "error" && type != "success")
			return false;
		if (!ExtObj.keyExists(this.resultClasses, 'error') || !ExtObj.keyExists(this.resultClasses, 'success'))
			return false;
		if (this.resultBox == null)
			return false;
		this.resultBox.set('class', this.resultClasses[type]);
		this.resultBox.set('html', str);
		return;
	},

	/**
	 * Reset the Form box result
	 */
	resetGlobalMsg: function(){
		this.displayGlobalMsg('', 'success');
		this.resultBox.set('class', '');
		return;
	},
	/**
	 * Return an form element object
	 * @param {String} name
	 */
	get: function(name){
		if (this.form[name] == "undefined")
			return false;
		var el = $$('#'+this.form.get('id')+' [name='+name+']');
		if (el.length == 1)
			return el[0];
		return el;
	},

	/**
	 * Return an input's label by the input name
	 * @param {String} name
	 */
	getLabel: function(name){
		if (this.form[name] == "undefined")
			return false;
		var idinput = this.form[name].get("id");
		if (!$chk(this.form.getElement('label[for='+idInput+']')))
			return false;
		return this.form.getElement('label[for='+idInput+']');
	},

	/**
	 * Return value of form element
	 * @param {String} name
	 */
	getValue: function(name){
		if (this.form[name] == "undefined")
			return false;
		return this.get(name).value;
	},
	
	loadInputsText : function (exclude){	
		this.form.getElements('input').each(function(el, index){
			var embed = true;	
			if (typeof(exclude) == 'object' && (exclude instanceof Array)) {
				for (key in exclude) {
					if (exclude[key] === el.get('id') || exclude[key] === el.get('name'))
						embed = false;        
				}
			}
			if ((el.get('type') == "text" || el.get('type') == "password") && embed){
				el.addEvent('focus', function(element){
					this.fill(element);
				}.bind(this, [el]));
				el.addEvent('blur', function(element){
					this.restore(element);
				}.bind(this, [el]));
				el.set('autocomplete', 'off');
			}
		}.bind(this));
	}


});
