// Uses Analyse object //
// Checker types //
/*

email, file, text, select

*/

var scriptdebug = false;
function debug(obj , str){
	if (scriptdebug){
		alert("Object: "+obj+"\nDebug string: "+str);
	}
}

function FormElement( name , type , error )
{

	// reprecents one form element //
	this.name = name;
	this.type = type;
	this.error = error;
	
};

function FormArray( _name , _type , _elementtype , _subtype , _error , _AllHasToBe )
{
	debug(this, "FormArray initalizing");
	// Reprecents an array of form elements //
	this.name = _name;
	this.type = _type;
	this.elementtype = _elementtype;
	this.error = _error;
	this.subtype = _subtype;
	this.AllHasToBe = _AllHasToBe;
	
	debug(this, "FormArray created");
	
};

function FormChecker()
{
	debug(this,"FormChecker created");
	// Set elements object //
	this.Elements = new Array();
	
	// Set analyse object to find elements in page //
	this.aObj = new Analyse();
	
	// Set error acoured //
	this.Error = false;
	
	// Set ErrorText //
	this.ErrorText = "";
	
	// Set NewLine constant //
	this.newLine = "\n";
	
};

FormChecker.prototype.ErrorHeader = function( str ){

	debug(this,"FormChecker.ErrorHeader()");
	
	// Set error header ( this must happen before check is envoked ) //
	this.ErrorText = str + this.newLine;
	
};

FormChecker.prototype.addFormArray = function( value )
{

	debug(this,"FormChecker.addFormArray()");
	
	// FormArray pushed to elements //
	this.Elements.push( value );

};

FormChecker.prototype.addElement = function( name , type , errormsg )
{
	debug(this,"FormChecker.addElement()");
	
	// Store types in form element //
	var ele = new FormElement( name , type , errormsg );
	
	// Push it in to check element //
	this.Elements.push( ele );

};

FormChecker.prototype.EmailHandle = function( ele )
{
	debug(this,"FormChecker.EmailHandle()");
	
	// Get the element from page //
	debug(this,"FormChecker.EmailHandle()->Email: "+ele.name);
	var obj = this.aObj.getElement( ele.name , window );
	debug(this,"FormChecker.EmailHandle()->EmailObject: "+obj);
	// Check if value of element contains '@' '.' and is not '' //
	if (obj.value == "" || obj.value.indexOf("@",0) == -1 || obj.value.indexOf(".",0) == -1){
	debug(this,"FormChecker.EmailHandle()->EmailObject.value: "+obj.value);
		// if failed //
		this.Error = true;
		
		// Set error message //
		this.ErrorText += ele.error + this.newLine;
		
	}
	
};

FormChecker.prototype.TextHandle = function( ele )
{
	debug(this,"FormChecker.TextHandle()");
	
	// Get the element from page //
	var obj = this.aObj.getElement( ele.name , window );
	
	// Check if value of element contains '@' '.' and is not '' //
	if (obj.value == ""){
	
		// if failed //
		this.Error = true;
		
		// Set error message //
		this.ErrorText += ele.error + this.newLine;
		
	}
	
};

FormChecker.prototype.SelectHandle = function( ele )
{
	debug(this,"FormChecker.SelectHandle()");
	
	// Get the element from page //
	var obj = this.aObj.getElement( ele.name , window );
	
	// Check if value of element contains '@' '.' and is not '' //
	if (obj.selectedIndex == -1){
	
		// if failed //
		this.Error = true;
		
		// Set error message //
		this.ErrorText += ele.error + this.newLine;
		
	}
	
};

FormChecker.prototype.Arrayhandle = function( arr )
{
	debug(this,"FormChecker.Arrayhandle()");
	
	// Get values from FormArray object //
	var name = arr.name;
	debug(this,"FormChecker.Arrayhandle()->name: "+ name);
	var type = arr.type;
	debug(this,"FormChecker.Arrayhandle()->type: "+ type);
	var elementtype = arr.elementtype;
	debug(this,"FormChecker.Arrayhandle()->elementtype: "+ elementtype);
	var subtype = arr.subtype;
	debug(this,"FormChecker.Arrayhandle()->subtype: "+ subtype);
	var AllHasToBe = arr.AllHasToBe;
	debug(this,"FormChecker.Arrayhandle()->AllHasToBe: "+ AllHasToBe);
	var currentCheck = 0;
	debug(this,"FormChecker.Arrayhandle()->currentCheck: "+ currentCheck);
	
	// Get the element from page //
	var obj = this.aObj.getElementArray( name , elementtype , window );
	
	// Loop throu array //
	var OLength = obj.length;
	for (var i=0; i<obj.length; i++){
		
		// Kick element to its rigthfull Handler //
		switch(subtype){
			
			case "select":
				currentCheck += this.ArraySelectHandle( obj[i] );
			break;
			
			case "text":
				currentCheck += this.ArrayTextHandle( obj[i] );
			break;
			
			case "radio":
				currentCheck += this.ArrayRadioHandle( obj[i] );
			break;
			
			case "email":
				currentCheck += this.ArrayEmailHandle( obj[i] );
			break;
			
			default:
				currentCheck += this.ArrayTextHandle( obj[i] );
			break;
			
		}
		debug(this,"FormChecker.Arrayhandle()->currentCheck: "+ currentCheck);
		
	}
	debug(this,"FormChecker.Arrayhandle()->currentCheck: "+ currentCheck +"\n"+"FormChecker.Arrayhandle()->obj.length: "+ OLength);
	if (AllHasToBe){
	// If Checking on all to be filled //
		if (0 < currentCheck){
		
			// if failed //
			this.Error = true;
			
			// Set error message //
			this.ErrorText += arr.error + this.newLine;
		}
	} else {
	// If checking that only one has to be filled /
		
		if (currentCheck == OLength){
		
			// if failed //
			this.Error = true;
			
			// Set error message //
			this.ErrorText += arr.error + this.newLine;
		}
	}
	
};
// Handles Select box in a array // 
FormChecker.prototype.ArraySelectHandle = function( ele )
{

	debug(this,"FormChecker.ArraySelectHandle()");
	debug(this,"FormChecker.ArraySelectHandle()->selectedIndex: "+ ele.selectedIndex);
	
	if (ele.selectedIndex == -1 || ele.selectedIndex == 0){
		return 1;
	} else {
		return 0;
	}
};
// Handles input field 'text' , 'file' in a array // 
FormChecker.prototype.ArrayTextHandle = function( ele )
{
	debug(this,"FormChecker.ArrayTextHandle()");
	if (ele.value == ""){
		return 1;
	} else {
		return 0;
	}
};
// Handles Radio buttons in a array // 
FormChecker.prototype.ArrayRadioHandle = function( ele )
{
	debug(this,"FormChecker.ArrayRadioHandle()");
	alert("ArrayRadioHandle not made yet");
};
// Handles special email fields // 
FormChecker.prototype.ArrayEmailHandle = function( ele )
{
	if (ele.value == "" || ele.value.indexOf("@") == -1 || ele.value.indexOf(".") == -1){
		return 1;
	} else {
		return 0;
	}
};

FormChecker.prototype.Check = function()
{
	debug(this, "FormChecker.Check()");
	// Loop throu elements in list //
	for (var i=0; i<this.Elements.length; i++){
		
		switch(this.Elements[i].type){
			
			// If case type email send to EmailHandle function //
			case "email":
				this.EmailHandle( this.Elements[i] );
			break;
			
			// If case type email send to TextHandle function //
			case "text":
				this.TextHandle( this.Elements[i] );
			break;
			
			// If case type email send to SelectHandle function //
			case "select":
				this.SelectHandle( this.Elements[i] );
			break;
			
			// If case type email send to RadioChecker function //
			case "radio":
				alert("FormChecker.RadioChecker not set jet");
			break;
			
			// If case type array send to Arrayhandle function //
			case "array":
				this.Arrayhandle( this.Elements[i] );
			break;
			
			// If case type not found send to TextHandle function //
			default:
				this.TextHandle( this.Elements[i] );
			break;
		}
		
	}
	if (this.Error){
		
		// If process failed to approve the form return the error to the user //
		alert(this.ErrorText);
		// Reset engine //
		this.ErrorText = "";
		this.Error = false;
		// Return that it failed //
		return false; 
		
	} else {
		// Reset engine //
		this.ErrorText = "";
		this.Error = false;
		
		// Else approve the process // 
		return true;
		
	}

};