document.write("<"  + 'script language=javascript src="js/functions.js"></script' +">" )
/*
	Used names are
	$formname
	name
	must
	mustnot
	error
	value
	def
*/
RegExp.Multiline=true;
function FormException(desc)
{
	this.description=desc;
}
//----------------------------------------------------------------------------------------
function Form()
{
	var argv=Form.arguments;
	this.$fields=new Array();
	this.$validators = new Array();
	var rx=/(\$\w+)\s*=\s*(.*)/;
	for (var i=0;i<argv.length;i++)
	{
		if (rx.test(argv[i]))
			this[RegExp.$1]=RegExp.$2;
		else
			this.addField(argv[i]);
	}
	this.$form=document.forms[this.$formname];
}
//---------------------------------------------------------------------------------------
//####################   This function parses definition #################################
function __Form_Add_Field__(str)
{
	var arr = String(str).split("&");
	var eqrx = new RegExp("([^=]+)\\s*=\\s*((.|\\n)*)","");
	var obj = new Object();
	var name,val;
	for (var i=0;i<arr.length;i++)
	{
		eqrx.exec(arr[i]);
		name=RegExp.$1;
		val=RegExp.$2;
		if (!name) 
			continue;
		obj[name]=String(val).replace(/##__ampersand__##/g,"&");
	}
	if (obj.must)
		obj.must=new  RegExp(obj.must,"");
	if (obj.mustnot)
		obj.mustnot=new  RegExp(obj.mustnot,"");
	this.$fields[this.$fields.length]=obj;
}
//---------------------------------------------------------------------------------------
//####################   This function reads values from form fields #####################
function __Form_Read_Fields__()
{
	var form=this.$form;
	var val,obj;
	for (var i=0;i<this.$fields.length;i++)
	{
		obj=this.$fields[i];
		this.$objname=obj.name;
		if (!form[obj.name])
		{
			alert("Error: " + obj.name + " does not exist on the form");
			return false;
		}
		//alert(obj.name + " |  " + form[obj.name].type);
		switch (form[obj.name].type){
			case "textarea":
			case "input":
			case "text":
			case "hidden":
			case "password":
				val=form[obj.name].value;
				break;
			case "select-one":
			case "select-multiple":
			case "select":
				val=GetSelectValue(form[obj.name]);
				break;
			default:
				if (form[obj.name].length){
					//alert(obj.name + " -  array");
					obj.array = true;
				}
				val=GetCheckValue(form[obj.name]) || obj.undef;
		}
		obj.value=val;
		//alert(obj.name + " | " + form[obj.name].type + " | " + obj.value)
		if (obj.value == "undefined" || obj.value == null) 
				obj.value="";
		this[obj.name]=obj.value;
	}
	return true;
}
//---------------------------------------------------------------------------------------
//####################   This function checks if values are right #########################
function __Form_Check_Fields__() {
	this.$form.errors = false;
	if (this.$form.already_submitted){
		alert("Your request was already submitted.\n Please, wait while it is being processed");
		return false;
	}
	if(!this.readFields()){
		return false;
	}
	var obj;
	this.$updated = [];
	for (var i=0;i<this.$fields.length;i++) {
		obj=this.$fields[i];
		if (/\n/.test(obj.value))
			obj.value = obj.value.replace(/\r/g,"")
		if (obj.value != obj.def){
			if (obj.array){
				vals = obj.value.split(/\s*,\s*/).sort();
				defs = obj.def.split(/\s*,\s*/).sort();
				if (vals.toString() != defs.toString())
					this.$updated.push(obj)
			} else
				this.$updated.push(obj)
		}
//		alert(obj.name + " | " + obj.value);
		if (obj.must && !obj.must.test(obj.value)){
			this.$form.errors = true;
			return this.error(obj);
		}
		if (obj.mustnot && obj.mustnot.test(obj.value)){
			this.$form.errors = true;
			return this.error(obj);
		}
	}
	var o,v;
	if (this.$validators.length){
		for(var i = 0;i< this.$validators.length; i++){
			v=this.$validators[i];
			str = "o = " + v.func + "(this.$form," + v.params + " );";
			eval(str);
//			alert((o || {}).dump());
			if (o && o.error){
				o.error = v.error;
				return this.error(o);
			}
		}
	}
// alert(dump(this.$updated,"updated"));
	ret_val = this.$aftercheck  ? this.$aftercheck(this.$formname,this) : true;
	if (ret_val)
		this.$form.already_submitted = 1;
	return ret_val;
}
//----------------------------------------------------------------------------------------
function __Form_Reset_Fields__(start)
{
	var form=this.$form;
	var what = start ? "def" : "undef"
	var val,obj;
	for (var i=0;i<this.$fields.length;i++)
	{
		obj=this.$fields[i];
		if (typeof(obj) == "function" || obj.def == null)
			continue;
		if (!form[obj.name]) {
			alert("unknown:" + obj.name);
			continue;
		}
		
//		alert(obj.name + " | " + obj.def + " | " + form[obj.name].type);
		switch (form[obj.name].type)
		{
			case "textarea":
			case "input":
			case "text":
			case "password":
			case "hidden":
				form[obj.name].value=obj[what];
				break;
			case "select-multiple":
			case "select-one":
			case "select":
				SetSelectValue(form[obj.name],obj[what]);
				break;
			case "checkbox":
			case "radio":
			case "undefined":
			default:
				SetCheckValues(form[obj.name],obj[what]);
				break;
		}
	}
	return false;
}
//------------------------------------------------------------------------
function __Form_Error__(obj)
{
	alert("Error: " + obj.error);
	switch (this.$form[obj.name].type)
	{
		case "hidden":
			break;
		case "radio":
		case "textarea":
		case "text":
		case "input":
		case "select-one":
		case "select-multiple":
		case "select":
		case "password":
		case "checkbox":
			this.$form[obj.name].focus();
			break;
		default: if (this.$form[obj.name].length)
						this.$form[obj.name][0].focus();
			break;
	}
	return false;
}
//---------------------------------------------------------------------------------------
function __Form_Add_Validator__(func,params,error){
	this.$validators[this.$validators.length]={'func':func,'params':params,'error':error};
}
//------------------------------------------------------------------------
Form.prototype = {};
Form.prototype.addField=__Form_Add_Field__;
Form.prototype.checkFields=__Form_Check_Fields__;
Form.prototype.resetFields=__Form_Reset_Fields__;
Form.prototype.readFields=__Form_Read_Fields__;
Form.prototype.error=__Form_Error__;
Form.prototype.addValidator= __Form_Add_Validator__;
//-------------------------------------------------------------------------
