var validator = {

    ajax_con:false,
    error_string:'',
    required_validation_successfull: false,
    ajax_validation_successfull: false,
    form:false,
    debug:false,
    php_controler:'/validate/model',
    existing_div_class:'required',
    is_valid:true,
    id_prefix:'',
    error_class:'error',
    ajax_error_class:'ajax_error',

    init:function()
    {
        validator.ajax_con = new XHConn();
        validator.form = false;
        validator.is_valid = true;
        validator.id_prefix = "";

        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(respText);

            if(respText == 'true' && validator.form.nodeName == 'FORM' && validator.required_validation_successfull)
                 validator.form.submit();//validator.ajax_validation_successfull = true;
            else
            	validator.ajax_validation_successfull = false;

            var respDoc = oXML.responseXML;

            //some problems with form
            //Reset the error string so we only show each error once and they dont build up
			validator.error_string = '';
			
			//Clear any ajax errors
        	$('#errors').html('');
        	
            if(!respDoc) 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);
                    //$('input, select, textarea',parent_div).css('background-color','#FFCCCC');
                    validator.error_string += '<li>'+message+'</li>';
                }
            }
            
       		//If we had any errors, display them
       		if(!validator.ajax_validation_successfull)
            	$('#errors').html('<ul class="errorList">' + validator.error_string + '</ul>');
        }
        
        //Do basic validation by checking all required fields are there
        validator.required_validation_successfull = validator.validate_el_required();

        var model_id;
        	
        try{
        	model_id = '&id=' + frm.id.value;
        }
        catch(e){}
        	
        var params = "ajax=t&_model_name=" + model_name + model_id + validator.fields_to_params();

        if(validator.debug)
        	alert(params);

        validator.ajax_con.connect(validator.php_controler,"POST",params, display);

		if(validator.required_validation_successfull && validator.ajax_validation_successfull)
			 validator.form.submit();
		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)
    {
   		if(message == 'Required')
	        $(div).find('input, textarea, select').addClass(validator.error_class); //Signal a required field	   
	    else
	    	$(div).find('input, textarea, select').addClass(validator.ajax_error_class); //Show a validation error
	   	
	   	validator.is_valid = false;
    },

    clear_error: function(div){
		 $(div).find('input, textarea, select').removeClass(validator.error_class);
		 $(div).find('input, textarea, select').removeClass(validator.ajax_error_class);
    },

    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++)
            {

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