var Forms = Array();

function FormValidator(name) {
	this.name = name;
	this.elements = new Array();
	this.submit_buttons = new Array();
	this.validator = "plugin/form_validator.php";
	this.error_msg = "The form is not valid!";
}

FormValidator.prototype.init = function() {
	form = $(this.name);
	buttons = form.getElementsByTagName('button');
	for(i=0;i<buttons.length;i++) {
		if(buttons[i].type=='submit') {
			//buttons[i].type.value = 'button';
			buttons[i].setAttribute('type','button');
			this.submit_buttons.push(buttons[i]);
			buttons[i].onclick = this.submit.bindAsEventListener(this,buttons[i]);
		}
		if(buttons[i].type == 'reset') {
			buttons[i].onclick = this.reset.bindAsEventListener(this,buttons[i]);
		}
	}
	legends = form.getElementsByClassName('form_group_legend');
	for(i=0;i<legends.length;i++) {
		legends[i].onclick = this.legend_click.bindAsEventListener(this,legends[i]);
	}
}

FormValidator.prototype.setError_msg = function(error_msg) {
	this.error_msg = error_msg;
}

FormValidator.prototype.setValidator = function(validator) {
	this.validator = validator;
}

FormValidator.prototype.setName = function(name) {
	this.name = name;
}

FormValidator.prototype.addElement = function(name,type,require,validation_need,validation_type,data_type,autocomplete) {
	element = {
		'name'				: name,
		'type'				: type,
		'require'			: require,
		'validation_need'	: validation_need,
		'validation_type'	: validation_type,
		'data_type'			: data_type,
		'autocomplete'		: autocomplete
	}
	this.elements.push(element);
	if(element.type=='text' || element.type=='password' || element.type=='file' || element.type=='textarea') {
		if(element.validation_type=='js' && $(element.name)) {
			$(element.name).onkeyup = this.elementHandler.bindAsEventListener(this,element.name);
		}
		else {
			$(element.name).onchange = this.elementHandler.bindAsEventListener(this,element.name);
		}
	}
	if(element.type=='select-one' || element.type=='select-multiple' || element.type=='checkbox-one') {
		$(element.name).onchange = this.elementHandler.bindAsEventListener(this,element.name);
	}
	if(element.type=='radio') {
		radios = document.getElementsByName(element.name);
		for(j=0;j<radios.length;j++) {
			radios[j].onchange = this.elementHandler.bindAsEventListener(this,element.name);
		}		
	}
	if(element.type=='checkbox-multiple') {
		chkbxs = document.getElementsByName(element.name+'[]');
		for(j=0;j<chkbxs.length;j++) {
			chkbxs[j].onchange = this.elementHandler.bindAsEventListener(this,element.name);
		}		
	}
	if(element.type.indexOf('tinymce')!=-1) {
		_theme = "simple";
		if(element.type.indexOf('_')!=-1) {
			_theme = element.type.substr(element.type.indexOf('_')+1);
		}
		tinyMCE.init({
			mode : "exact",
			elements: element.name,
			theme : _theme
		});
	}
	if(element.type.indexOf('calendar')!=-1) {
		cd = element.type.split('_');
		_calendar(element.name,element.name,cd[1]);
	}
	if(element.autocomplete!="") {
		element_append_element($(element.name).parentNode.parentNode.parentNode,'div',element.name+'_autocomplete','autocomplete');
		new Ajax.Autocompleter(element.name,element.name+'_autocomplete',element.autocomplete,{});
	}
	//alert(element.name);
	this.require(element.name);
	this.validate(element.name);
}

FormValidator.prototype.require = function(el) {
	is_valid = true;
	for(i=0;i<this.elements.length;i++) {
		element = this.elements[i];
		if(element.require && (el=='all' || element.name==el) && (document.getElementsByName(element.name) || document.getElementsByName(element.name+'[]'))) {
			//alert(element.type);
			r = false;
			if(element.type=='text' || element.type=='password' || element.type=='file' || element.type=='textarea' || element.type=='select-multiple') {
				value = $F(element.name);
				if(value=="") {
					r = true;
				}
			}
			if(element.type.indexOf('tinymce')!=-1) {
				/*
				value = tinyMCE.get(element.name).getContent();
				if(strlen(value)==0) {
					r = true;
				}
				*/
				r = false;
			}
			if(element.type=='checkbox-one') {
				r = !$(element.name).checked;
				_parent = $(element.name).parentNode.parentNode;
			}
			if(element.type=='select-one') {
				index = $(element.name).selectedIndex;
				if(!index) {
					r = true;
				}
			}
			if(element.type=='radio') {
				radios = document.getElementsByName(element.name);
				r = true;
				for(j=0;j<radios.length;j++) {
					if(radios[j].checked) {
						r = false;
					}
				}				
				_parent = radios[0].parentNode.parentNode;
			}
			if(element.type=='checkbox-multiple') {
				chkbxs = document.getElementsByName(element.name+'[]');
				r = true;
				for(j=0;j<chkbxs.length;j++) {
					if(chkbxs[j].checked) {
						r = false;
					}
				}				
				_parent = chkbxs[0].parentNode.parentNode;
			}
			if(r) {
				Element.addClassName(element.name,'form_value_require');
				if(element.type=='radio' || element.type=='checkbox-one' || element.type=='checkbox-multiple') {
					Element.addClassName(_parent,'form_value_require');
				}
				is_valid = false;
			}
			else {
				Element.removeClassName(element.name,'form_value_require');
				if(element.type=='radio' || element.type=='checkbox-one' || element.type=='checkbox-multiple') {
					Element.removeClassName(_parent,'form_value_require');
				}
				//alert(element.name);
			}
		}
	}

	return is_valid;
}

FormValidator.prototype.validate = function(el) {
	is_valid = true;
	for(i=0;i<this.elements.length;i++) {
		element = this.elements[i];
		if(element.type=='text' || element.type=='password' || element.type=='file' || element.type=='textarea') {
			//alert(element.name);
			if(element.validation_need && (el=='all' || element.name==el) && (document.getElementsByName(element.name) || document.getElementsByName(element.name+'[]'))) {
				value = $F(element.name);
				if(element.validation_type=='php') {
					var pars = 'data_type='+element.data_type+'&name='+element.name+'&value='+value;
					var myAjax = new Ajax.Request(
						this.validator, 
						{
							method: 'get', 
							parameters: pars, 
							onComplete: this.phpvalidate
						}
					);
				}
				if(element.validation_type=='js') {
					v = this.check_format(value,element.data_type);
					if(!v && value!="") {
						Element.addClassName(element.name,'form_value_notvalid');
						error_msg = $(element.name).parentNode.getElementsByClassName('form_element_error_msg');
						for(ei=0;ei<error_msg.length;ei++) {
							Element.addClassName(error_msg[ei],'form_element_error_msg_show');
						}
						is_valid = false;
					}
					else {
						Element.removeClassName(element.name,'form_value_notvalid');					
						error_msg = $(element.name).parentNode.getElementsByClassName('form_element_error_msg');
						for(ei=0;ei<error_msg.length;ei++) {
							Element.removeClassName(error_msg[ei],'form_element_error_msg_show');
						}
					}
				}
			}
		}
	}
	
	return is_valid;
}

FormValidator.prototype.phpvalidate = function(originalRequest) {
	is_valid = true;
	v = parseInt(originalRequest.responseText);
	//alert(originalRequest.responseText);
	if(res = originalRequest.responseText.match("([\\w]+):(\\d)")) {
		name = res[1];
		v = parseInt(res[2]);
		if(!v && value!="") {
			Element.addClassName(name,'form_value_notvalid');
			error_msg = $(element.name).parentNode.getElementsByClassName('form_element_error_msg');
			for(ei=0;ei<error_msg.length;ei++) {
				Element.addClassName(error_msg[ei],'form_element_error_msg_show');
			}
			is_valid = false;
		}
		else {
			Element.removeClassName(name,'form_value_notvalid');
			error_msg = $(element.name).parentNode.getElementsByClassName('form_element_error_msg');
			for(ei=0;ei<error_msg.length;ei++) {
				Element.removeClassName(error_msg[ei],'form_element_error_msg_show');
			}
		}
	}

	return is_valid;
}

FormValidator.prototype.elementHandler = function(e,el) {
	this.require(el);
	this.validate(el);
}

FormValidator.prototype.reset = function(e,button) {
	$(this.name).reset();	
	require = this.require('all');
	valid	= this.validate('all');
}


FormValidator.prototype.submit = function(e,button) {
	require = this.require('all');
	valid	= this.validate('all');
	if(!require || !valid) {
		alert(this.error_msg);
		return false;
	}
	else {
		$(this.name).submit();
	}
}

FormValidator.prototype.legend_click = function(e,legend) {
	switch_display($(legend.parentNode.parentNode.id+'_content'));
	//switch_display($(legend.id+'_content'));
}

FormValidator.prototype.check_format = function(s,format) {
	patterns = new Array();
	patterns['string']	= "^.+$";
	patterns['word']	= "^[\\w]+$";
	patterns['email']	= "^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,4}$";
	patterns['url']		= "^((ht|f)tp(s?)\\:\\/\\/|~/|/)?([\\w]+:\\w+@)?(([a-zA-Z]{1}([\\w\\-]+\\.?)*(\\.[\\w]{2,5})?)(:[\\d]{1,5})?)?((/?\\w+/)+|/?)(\\w+\\.[\\w]{3,4})?([,]\\w+)*((\\?\\w+=\\w+)?(&\\w+=\\w+)*([,]\\w*)*)?$";
	patterns['ip']		= "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$";
	patterns['phone']	= "^[+]{0,1}[0-9-]*$";
	patterns['date']	= "^[0-9]{2,4}[\\.\\- ][0-9]{1,2}[\\.\\- ][0-9]{1,2}$";
	patterns['time']	= "^[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}$";
	patterns['datetime']= "^[0-9]{2,4}[\\.\\- ][0-9]{1,2}[\\.\\- ][0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}$";
	patterns['int']		= "^[-]{0,1}[0-9]+$";
	patterns['double']	= "^[-]{0,1}[0-9]+[\\.]{0,1}[0-9]*$";

	if(patterns[format]) {
		return s.toLowerCase().match(patterns[format]);
	}
	return false;
}