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) {
	var _name = name;
	var i = 0;
	while(1) {
		if(!$(_name)) {
			name = _name+':'+i++;
		}
		if($(_name+'_1')) {
			name = _name;
		}
		if(!$(name) && !$(_name+'_1')) {
			break;
		}
		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.replace(this.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.replace(this.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);
			}
			if(_theme=='extreme') {
				tinyMCE.init({
					mode : "exact",
					elements: element.name,
					theme : 'advanced',
					plugins : "safari,spellchecker,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,imagemanager,filemanager",
					theme_advanced_buttons1 : "save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect,fontselect,fontsizeselect",
					theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview",
					theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen",
					theme_advanced_buttons4 : "insertlayer,moveforward,movebackward,absolute,|,styleprops,spellchecker,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,template,blockquote,pagebreak,|,insertfile,insertimage,|,forecolor,backcolor"
				});
			}
			else {
				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);

		if(name==_name || $(_name+'_1')) {
			break;
		}
	}
}

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+'[]' || document.getElementsByName(element.name.replace(this.name+'_','')+'[]')))) {
			//alert(element.type);
			r = false;
			if(element.type=='text' || element.type=='password' || element.type=='file' || element.type=='textarea' || element.type=='select-multiple' || element.type.indexOf('calendar')!=-1) {
				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.replace(this.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.replace(this.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.childNodes;
						for(ei=0;ei<error_msg.length;ei++) {
							if(error_msg[ei].className && error_msg[ei].className.indexOf('form_element_error_msg')!=-1) {
								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.childNodes;
						for(ei=0;ei<error_msg.length;ei++) {
							if(error_msg[ei].className && error_msg[ei].className.indexOf('form_element_error_msg')!=-1) {
								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 {
		mode = $F('mode_'+this.name);
		if(mode=='ajax') {
			action		= $(this.name).action;
			method		= $(this.name).method;
	
			var pars = $(this.name).serialize();
			//alert(pars);

			var myAjax = new Ajax.Updater(
			$(this.name).parentNode,
			action, 
			{
				method: method, 
				parameters: pars,
				evalScripts: true,
				onComplete: this.submit_response
			});
		}
		else {
			$(this.name).submit();
		}
	}
}

FormValidator.prototype.submit_response = function(originalRequest) {
	//alert(originalRequest.responseText);
	lista_id = this.name+'_lista';
	if($(lista_id)) {
		lista_submit(lista_id);
	}
}

FormValidator.prototype.clear = function(el) {
	mode = $F('mode_'+this.name);
	if(mode=='ajax') {
		$(this.name+'_save_'+this.name).value="";
		this.submit();
	}
	else {
		for(i=0;i<this.elements.length;i++) {
			element = $(this.elements[i].name);
			if(element && !element._cleared) {
				element.clear();
			}
		}
	}
}

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;
}
