/**
 * This file is part of w@w.
 *
 * W@W web application framework.
 * Copyright (C) 2007 Catholic University of Louvain (Belgium)
 * <blambeau@info.ucl.ac.be>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301 USA
 */

/**
 * Provides html form validation and management
 * 
 * @since 1.0
 * @author llambeau
 */
 
var WAWFormManager = Class.create();
WAWFormManager.prototype = {
	
	form: "",
	
	fields : "",
	
	initialize: function(form, fields) {
		this.form = $(form);
		fields = $H(fields);
		fields.each(function(el) {
			if (el.key == "") {
				return;
			}
			element = this.form.elements.namedItem(el.key);
			if (element) {
				this.fields[el.key] = $A(element, el.value);
				params = el.value;
				type = params["type"];
				if (type) {
					eval("this._"+type+"(element, el.value)");;
				} else {
					eval("this._char(element, el.value)");;					
				}
			}
		}.bindAsEventListener(this));
	},
	
	_char : function(element, params) {
		params = $H(params);
		element = $(element);
		Event.observe(element, "blur", function(ev){this.charChanged(Event.element(ev), params)}.bindAsEventListener(this));
	},

	_int : function(element, params) {
		params = $H(params);
		element = $(element);
		Event.observe(element, "blur", function(ev){this.intChanged(Event.element(ev), params)}.bindAsEventListener(this));
	},

	_decimal : function(element, params) {
		params = $H(params);
		element = $(element);
		Event.observe(element, "blur", function(ev){this.decimalChanged(Event.element(ev), params)}.bindAsEventListener(this));
	},
	
	charChanged : function(element, params) {
		if (params["size"] != null) {
			if (element.getValue().length > params["size"]) {
				this.indicateError(element, params);
				return false;
			}
		}
		this.indicateSane(element, params);
	},
	
	intChanged : function(element, params) {
		var anum=/(^\d+$)|(^\d+\+$)/
		if (!anum.test(element.getValue())) {
			this.indicateError(element, params);
			return false;
		}
		if (params["size"] != null) {
			if (element.getValue().length > params["size"]) {
				this.indicateError(element, params);
				return false;
			}
		}
		this.indicateSane(element, params);
	},

	decimalChanged : function(element, params) {
		var anum=/(^\d+$)|(^\d+\.\d+$)/
		if (!anum.test(element.getValue())) {
			this.indicateError(element, params);
			return false;
		}
		if (params["precision"] != null) {
			precision = element.getValue().split(".")[0];
			if (precision.length > params["precision"]) {
				this.indicateError(element, params);
				return false;
			}
		}
		if (params["scale"] != null) {
			scale = element.getValue().split(".")[1];
			if(scale) {
				if (scale.length > params["scale"]) {
					this.indicateError(element, params);
					return false;
				}
			}
		}
		this.indicateSane(element, params);
	},
	
	indicateError : function(element, params) {
		element.addClassName("error");
	},
	
	indicateSane : function(element, params) {
		if (element.hasClassName("error")) {
			element.removeClassName("error");
		}
	}
	
};
