// *** input can be text /password / check / radio ***

var form_type = new Array("input","textarea","hidden","select");

var window_objects = new Array(); // *** store window objects ***

function form_object(){
	
	this.form_name = "general_form";
	this.form_element_no = 1;
	this.form_status = (check_element(this.form_name) != false)? true : false;
	this.feedback = new Array();
	this.form_element_objects = new Array();
	this.focus_element = "";

}

form_object.prototype.reset_form = function(){

	for(var element_no in this.form_element_objects)
		
		var element = this.form_element_objects[element_no].reset_form_element();

}

form_object.prototype.set_focused_element = function(element){

	if(this.focus_element != element){

		// *** reset previous element ***
	
		var old_element = check_element(this.focus_element);
		if(old_element != false) old_element.style.background = "#FFFFFF";

		// *** set new element ***
		
		this.focus_element = element;
		
		var new_element = check_element(this.focus_element);
		if(new_element != false) new_element.style.background = "#FFFFCC";
		
	}

}

form_object.prototype.get_focused_element = function(){
	
	return (this.focus_element.match(/^[0-9a-z_-]{4,}$/i))? check_element(this.focus_element) : false;

}

form_object.prototype.focus_form_element = function(){

	var focus_element = this.get_focused_element();
	
	if(focus_element != false){
	
		if(focus_element.type != "hidden"){
	
			if(tab_menu.length != 0) change_tab("general"); // Reset tab navigation where used
	
			focus_element.focus();
			
		}
	
	}
		
}

form_object.prototype.capture_form_elements = function(){

	if(this.form_status == true){
		
		for(var type in form_type){

			var form_elements = eval("document."+this.form_name+".getElementsByTagName('"+form_type[type]+"');");
				
			for(var element_no in form_elements){
			
				var radio_element = check_element(element_no+"0");
				var element = (radio_element == false)? form_elements[element_no] : radio_element;
				var element_name = (ie)? element_no : element.id;
				var element_type = (form_type[type] == "input")? element.type : form_type[type];
				
				if(typeof(element_name) == "string"){	
					
					if(element_name.match(/^[a-z]{3}[0-9]{1}[0-9a-z_\[\]]{2,}$/i)){
						
						if(typeof(focus_form_element) == "function"){
						
							// *** updated 22/02/08 to remove select dbl click issue ***
						
							if(element.addEventListener){
								
								element.addEventListener( (element_type == "select")? "mouseover" : "focus" ,focus_form_element,false);
								element.addEventListener("blur" ,blur_form_element,false);
							
							}else if(element.attachEvent){
								
								element.attachEvent( (element_type == "select")? "onmouseover" : "onfocus", focus_form_element );
								element.attachEvent("onblur",blur_form_element);
								
							}
								
						}
						
						if(!this.form_element_objects[element_name]){

							// *** only reference first element in any grouping ***
							
							this.form_element_objects[element_name] = new form_element_object(element,element_type);
	
							if(this.form_element_no == 1 && type != "hidden")
								
								this.set_focused_element(element_name);
						
							this.form_element_no ++;
								
						}
						
					}
					
				}
					
			}
			
		}
	
		this.focus_form_element();
		
	}

}

form_object.prototype.validate_form_elements = function(){

	this.reset_status();
	
	for(var object_element in this.form_element_objects){

		var form_element = this.form_element_objects[object_element];
		form_element.validate_element();

        if(form_element.get_status() == false){
	
			this.feedback[this.feedback.length] = form_element.get_feedback();
                        
			this.form_status = false;
        
	    }
	
	}
	
	return this.form_status;

}

form_object.prototype.compose_request_body = function(){
	
	// *** compose form object parameters for submission ***
	
	var params = new Array();
	
	for(var object_element in this.form_element_objects){
	
		var form_element = this.form_element_objects[object_element];
		
		var param = encodeURIComponent((form_element.get_form_element()).id);
		param += "="+encodeURIComponent(form_element.get_value());
        params.push(param);
	
	}
    
	return "obj="+encodeURIComponent(element_object)+"&"+params.join("&");

}

form_object.prototype.get_form_element_objects = function(){

	return this.form_element_objects;

}

form_object.prototype.get_form_element = function(element_name){

	return (this.form_element_objects[element_name])? this.form_element_objects[element_name] : false;
	
}

form_object.prototype.override_form_element = function(element_name,element_value){

	if(this.form_element_objects[element_name])
	
		this.form_element_objects[element_name].set_value(element_value);
	
}

form_object.prototype.get_status = function(){return this.form_status;}

form_object.prototype.reset_status = function(){

	this.form_status = true;
    this.feedback = new Array();

}

form_object.prototype.get_form_name = function(){return (this.form_status == true)? check_element(this.form_name) : false;}

// *** feedback ***

form_object.prototype.get_feedback = function(){

	return "The following elements need to be completed - "+this.feedback.join(", ");
	
}

form_object.prototype.set_feedback = function(feedback_text){

	this.feedback[this.feedback.length] = feedback_text;
	
}