var validator = {

	ajax_con:false,
	form:false,
	php_controler:'/validate/model',
	existing_div_class:'required',
	is_valid:true,
	id_prefix:'',
	error_class:'required error',
	debug:false,

	init:function(){

		validator.ajax_con = new XHConn();

		if (!validator.ajax_con){

			if(validator.debug){
				alert('no XHconn');
			}

		}

	},

	validate_form:function (frm,model_name){

		if (!validator.ajax_con){
			validator.init();
		}

		validator.form = frm;

		//clear all existing error messages if any
		validator.clear_all_errors();

		// this will be called when ajax request completes
		var display = function(oXML){

			validator.is_valid = true;

			var respText = oXML.responseText;

			if(validator.debug){
				alert(oXML.responseXML);
				alert(respText);
			}

			if(respText == 'true'){// && validator.form.nodeName == 'form'){

				validator.form.submit();
			}

			var respDoc = oXML.responseXML;

			//some problems with form

			if(!respDoc)
			{
				if(validator.debug)
				alert('no ajax responce');

				//return;
			}

			//firstChild.nodeValue;
			var val_result = respDoc.getElementsByTagName('validate-result').item(0);

			var fields = val_result.getElementsByTagName('field');

			for(var i =0; i<fields.length; i++){

				//var value = fields.item(i).getElementsByTagName('valid').item(0).firstChild.nodeValue;
				var name = fields.item(i).getElementsByTagName('name').item(0).firstChild.nodeValue;
				var parent_div = document.getElementById('el_'+validator.id_prefix+name);


				var message = fields.item(i).getElementsByTagName('message').item(0).firstChild.nodeValue;

				if(parent_div){
					//this fields is invalid and we need to say why');
					validator.show_error(parent_div, message);
				}
			}
		}

		validator.is_valid = validator.validate_el_required();

		if(validator.is_valid)
		{
			var model_id;

			try{
				model_id = '&id=' + frm.id.value;
			}
			catch(e){}

			//basic validation is ok, now do ajax validation
			var params = "ajax=t&_model_name="+model_name + model_id + validator.fields_to_params();

			if(validator.debug)
			{
				alert(params);
				alert('trying to get to controller '+validator.php_controler);
			}



			validator.ajax_con.connect(validator.php_controler,"POST",params, display);
			return false;
		}
		else
		return false;
	},

	validate_el_required: function(frm)
	{
		var valid = true;

		if(frm)
		{
			validator.form = frm;
			validator.clear_all_errors();
		}

		try
		{
			var arr_form_elements = validator.form.getElementsByTagName('LI');

			for(var x=0; x<arr_form_elements.length; x++)
			{
				if(arr_form_elements[x].className == 'required' || arr_form_elements[x].className==validator.error_class)
				{
					var input;

					if(input = arr_form_elements[x].getElementsByTagName('input').item(0))
					{
						if(input.value == "")
						{
							validator.show_error(arr_form_elements[x],'Required');
							valid = false;
						}
					}
					else if(input = arr_form_elements[x].getElementsByTagName('textarea').item(0))
					{
						if(input.value == "")
						{
							validator.show_error(arr_form_elements[x],'Required');
							valid = false;
						}
					}
					else if(input = arr_form_elements[x].getElementsByTagName('select').item(0))
					{
						if(input.value == "")
						{
							validator.show_error(arr_form_elements[x],'Required');
							valid = false;
						}
					}
				}
			}
		}
		catch(e)
		{
			if(validator.debug)
			{
				alert(e);
				valid = false;
			}
		}

		return valid;
	},

	show_error: function (div,message){

		validator.is_valid = false;

		if(div.className == validator.error_class) return;

		validator.existing_div_class = div.className;

		div.className = validator.error_class;

		p = document.createElement('P');
		p.setAttribute('id',div.id+'error');
		p.appendChild(document.createTextNode(message));

		div.appendChild(p);
	},

	clear_error: function(div){

		if(div.className == validator.error_class)
		div.className = validator.existing_div_class

		if(p_error = document.getElementById(div.id+'error')){
			div.removeChild(p_error);
		}
	},

	clear_all_errors: function()
	{
		$(validator.form).find('li').each(function(i){
			validator.clear_error(this);
		});
	},

	fields_to_params: function(){

		var param_string  = "";

		var getparams = function(els){

			for(i=0; i<els.length; i++)
			{
				if(els[i].type != 'hidden')
				{
					var name = els[i].name;

					if(name.indexOf('[')>0){

						validator.id_prefix = name.substring(0,name.indexOf('['));

						//look for html array syntax, if we have it get the content between brakets
						name = name.substring(name.indexOf('[')+1,name.indexOf(']'));

						// validator.id_prefix allows us to reference the valid id for an html array element,
						// eg shipping[first_name]
						//
						// name = first_name
						// validator.setformat = shipping
						//
						// so Id should be shippingname
					}
					param_string += "&"+name+"="+els[i].value;
				}
			}
		}

		getparams(validator.form.getElementsByTagName('input'));
		getparams(validator.form.getElementsByTagName('select'));
		getparams(validator.form.getElementsByTagName('textarea'));

		return param_string;
	}
}