var Validation = Class.create();

Validation.prototype = {
    initialize: function(form) {
        this.form = $(form);
        this.MasterError = "";
		this.highlight_box = "";
		this.normal_box = "";
	pic1= new Image(32,32); 
	pic1.src="/images/ajax/ajax-load.gif"; 
	this.ProcessingMsg="<table><tr><td><img src=\""+pic1.src+"\" height=\"32\" width=\"32\"></td><td>Processing...</td></tr></table>";
        Event.observe(this.form, 'submit', this.onSubmit.bindAsEventListener(this), false);
    },
    processing: function() {
	if (this.MasterError.length > 0) {
            $(this.MasterError).innerHTML = this.ProcessingMsg;
            val_name = this.MasterError;
            if (typeof Effect == 'undefined') { ($(val_name).style.display) = 'block';
            } else {
                new Effect.Appear(val_name, {duration: 1 });
	    }
        }

    },
    get_nodes: function() {
        allNodes = Form.getElements(this.form);
        done = false;
        tag = 0;
        var rt = new Array();
        while (!done) {

            if (!document.forms[this.form.id]) break;
            if (!document.forms[this.form.id][tag]) break;

            var item_name = (document.forms[this.form.id][tag].id);
            rt[rt.length] = item_name;

            tag = tag + 1;
        }
        return (rt);
    },
    set_highlight_box: function(norm,high) {
        this.highlight_box = high;
        this.normal_box=norm;
    },
    set_master_error: function(fname) {
        this.MasterError = fname;
    },
    set_pre_error: function(info) {
       allNodes=info.split(',');
       for (i = 0; i < allNodes.length; i++) {
       	 if (this.hightlight_box!="") {
       	 			$(allNodes[i]).setStyle({
			  		backgroundColor: this.highlight_box,
			  		});
		 }

	   }
       
	},
    process_individual_errors: function(jsinput) {
	                                
        var errors = 0;
        
        var allNodes = this.get_nodes();
        for (i = 0; i < allNodes.length; i++) {
           var error_set=false;    
           var exists_set=false;
            nodename = (allNodes[i]);   
            if (jsinput[nodename]) {
               exists_set=true;
               if (jsinput[nodename][1] == 0) {
               	    error_set=true;
               	    errors = errors + 1;
			   }
			}
			
			if (this.hightlight_box!="" && error_set==true) {

			$(nodename).setStyle({
			  backgroundColor: this.highlight_box,
			  });
			} else if(this.normal_box != "" && exists_set==true) {
			$(nodename).setStyle({
			  backgroundColor: this.normal_box,
			  });
			}
			
			if ($('apply_form_error')) ($('apply_form_error').style.display) = 'none';
                    
            if ($(nodename + '-validate')) {
                val_name = (nodename + '-validate'); ($(val_name).style.display) = 'none';
                if (error_set==true) {
                    
                    sval = (jsinput[nodename][2].length);
                    if (sval > 0) {
                        $(val_name).innerHTML = jsinput[nodename][2];
                    }
                                            
                    if (typeof Effect == 'undefined') { ($(val_name).style.display) = 'block';
                    } else {
                        new Effect.Appear(val_name, {
                            duration: 1
                        });
                    }      
                }

            }                               
        }
        return (errors);
    },
    process_master_errors: function(jsinput) {
        if (this.MasterError.length > 0) if (jsinput['master_error']) {
            $(this.MasterError).innerHTML = jsinput['master_error'];
            val_name = this.MasterError;
            if (typeof Effect == 'undefined') { ($(val_name).style.display) = 'block';
            } else {
                new Effect.Appear(val_name, {
                    duration: 1
                });
            }

        }

    },
    process_404_errors: function() {
		if (this.MasterError.length > 0) {
			val_name = this.MasterError;
			$(val_name).innerHTML="There was a communication error with the server, please try again";
		        if (typeof Effect == 'undefined') { 
				($(val_name).style.display) = 'block';
				} 
				else 
				{
				new Effect.Appear(val_name, {duration: 1 }); 
				}

			}
			else 
			{
				alert("There was a communication error with the server");
			}
    },
    pause: function(numberMillis) {
        var now = new Date();
        var exitTime = now.getTime() + numberMillis;
        while (true) {
            now = new Date();
            if (now.getTime() > exitTime) return;
        }
    },
    AjaxComplete: function(response) {
       
	if (response.status == 404) {
		alert("Submitting Form: Ajax 404");
		this.form.submit();
		}

	if (response.responseText.isJSON()==false) {
		alert("Submitting Form: Without JSON");
		this.form.submit();
		}

		
        if (response.status == 200) var jsinput = (response.responseText.evalJSON());
        else var jsinput = new Array();

        var errors = 0;
        if (this.eventname && $('form_type')) $('form_type').value = this.eventname;

        if (response.status != 200) errors = errors + 1;

        errors = errors + this.process_individual_errors(jsinput);
        
        if (errors == 0) {
			this.processing();
			this.form.submit();
			}

	if (response.status===200) this.process_master_errors(jsinput);
	else this.process_404_errors();
    },
    HideAll: function() {
		if (this.MasterError.length > 0) {
				val_name = this.MasterError;
				if ($(val_name).style.display!='none') {
				$(val_name).innerHTML=this.ProcessingMsg;
			}
			}



    },
    onClick: function(tag, method) {
	this.HideAll();
        this.eventname = method;
        this.validate();
    },
    onSubmit: function(ev) {

	this.HideAll();
        Event.stop(ev);
        var buttonClicked = document.activeElement || ev.explicitOriginalTarget;
	if (buttonClicked) {
		var eventElementName = Element.readAttribute(buttonClicked, 'id');
		this.eventname = eventElementName;
	}
        this.validate();
	return(false);

    },
    validate: function() {
        allNodes = this.get_nodes();
        var poststr = "";

        acount = 0;
        var parms = new Array();
        for (i = 0; i < allNodes.length; i++) {
            nodename = (allNodes[i]);
            if ($(nodename).type=="submit") continue;
                parms[acount] = new Array(nodename, $(nodename).value);
                
                acount++;
        }

        for (i = 0; i < parms.length; i++) {
            poststr = poststr + parms[i][0] + '=' + parms[i][1] + '&';
        }

        new Ajax.Request('/ajax/validate/' + this.form.id, {
            method: 'post',
            parameters: poststr,
            onComplete: this.AjaxComplete.bind(this)
        });
	
    }
};

