//constants
var REQUIRED_CHECK_FAILED = 1;
var MAXLENGTH_CHECK_FAILED = 2;
var DATATYPE_CHECK_FAILED = 3;
var EMAIL_CHECK_FAILED = 4;
var RANGE_CHECK_FAILED = 5;
var OTHER_ERROR = 6;
var MINLENGTH_CHECK_FAILED = 7;
var CHECK_PROFANITY_FAILED = 8;
var ALLOWED_FILE_TYPE_CHECK_FAILED = 9;
var MIN_VALUE_CHECK_FAILED = 10;
var MAX_VALUE_CHECK_FAILED = 11;
var CC_CHECK_FAILED = 12;

var errorPage;

//declare name space for error
passenger.error = function(){}

/**
 * Get the error message for the given message id and element array
 */
passenger.error.getMessage = function(messageCode, elementArray) {
	var findString ="";
	var messageString = eval(messageCode);
	if (elementArray == null){
		elementArray = new Array();
	}	
	messageString = new dojo.string.Builder(messageString)
	for(var i=0; i < elementArray.length; i++) {
		findString = "{" + i + "}";
  		messageString.replace(findString, elementArray[i]);
	}
	return messageString;
}

/**
 * Instance of this object represents error on an element. These elements can be
 * used by an error page to display the error messages for any given page
 * @param elementId - id of the element that has error
 * @param aCode - code for the error string. This code should match the codes in JS error messages
 * @param anArguments - arguments that needs to be substituted in error message
 * @param aTitleElement - title element that needs to be changed with new style as we are displaying the error text
 * @param aType - type of error . Example: Mandatory failure, data type failure etc. 
 * @param aChangeElementStyle - set true changes the corresponding element style else false. Default value is false
 */
 passenger.error.errorElement = function (anElementId, aCode, anArguments, aTitleElement, aType, aChangeElementStyle){
 	
 	var code = aCode;
 	var errorArguments = anArguments;
 	var titleElement = aTitleElement;
 	var errorType = aType;	
 	var elementId = anElementId
 	var changeElementStyle = aChangeElementStyle;
 	if (aChangeElementStyle == null){
 		changeElementStyle = false;
 	}

 	this.getElementId = function() {
 		return elementId;
 	}
 	 	
 	this.getCode = function() {
 		return code;
 	}

 	this.setCode = function(aCode) {
 		code = aCode;
 	}
 	
 	this.getArguments = function() {
 		return errorArguments;
 	}

 	this.getTitleElement = function() {
 		return titleElement;
 	}

 	this.getErrorType = function() {
 		return errorType;
 	} 	

 	this.setErrorType = function(aType) {
 		errorType = aType;
 	} 	
 	
 	this.getChangeElementStyle = function() {
 		return changeElementStyle;
 	}

 	this.setChangeElementStyle = function(changeStyle) {
 		changeElementStyle = changeStyle;
 	}
 	
 	this.getMessage = function() {
 		return passenger.error.getMessage(this.getCode(), this.getArguments());
 	}
 }

/**
 * Instance of this objects represents the error page. This object can be used
 * to generate the HTML content for error block.
 * 
 * For required failure errors: we will not generate multiple messages we are only going to 
 * generate on generic message and change the style for element titles. 
 */ 
 passenger.error.errorPage = function(){
 	var errorElements = new Array();
 	var processedMandatoryErrors = false;
 	var errorDivContent = "";
 	var arrayMessages = new Array();
 	var errorDiv;
 	
 	this.getErrorElements = function() {
 		return errorElements;
 	}
 	
 	//adds an element with error to the page
 	this.addErrorElement = function(anElement){
 		errorElements[errorElements.length] = anElement;
 	}
 	
 	//returns true if the error page has errors else returns false
 	this.hasErrors = function(){
 		if(errorElements.length > 0){
 			return true;
 		}else{
 			return false;
 		}	
 	}
 	
 	/*
 	 * generates the error page based on the current error elements 	 
 	 * Generate error page is set as innerHTML to the given errorDivID
 	 * @parram errorDivId - id of the div which needs to be changed with error content
 	 */ 	
 	this.generateErrorPage = function(errorDivId){
 		errorDiv = errorDivId;
 		//initialize
 		var titleElement; 		
 		var errorElement;
 		processedMandatoryErrors = false;
 		errorDivContent = "";
 		arrayMessages = new Array();
 		
 		//Identify list of error message sneeds to be displayed and also set the error style for required elements
		for(var i=0; i < errorElements.length; i++){
			errorElement = errorElements[i];
			//for elements that has failed required check change the element title class to error class
			if (errorElement.getErrorType() == REQUIRED_CHECK_FAILED){
				titleElement = errorElements[i].getTitleElement();
				if (titleElement != null && errorElement.getChangeElementStyle()){
					//set the current class as normal class
					titleElement.setAttribute("normalClass", titleElement.getAttribute("class"));					
					titleElement.className = titleElement.getAttribute("errorClass");
				}	
				if(!processedMandatoryErrors){
					arrayMessages[arrayMessages.length]= passenger.error.getMessage("REQUIRED_ELEMENTS_FAILED");
				}
				processedMandatoryErrors = true;
			}else{
				arrayMessages[arrayMessages.length]= errorElement.getMessage();
			}			
		}
 		
 		//generate DIV content
 		for(var j=0; j < arrayMessages.length; j++){
 			if(j==0){
 				errorDivContent = arrayMessages[j] ;
 			}else{
 				errorDivContent = errorDivContent + "<br/><span class='errorMessageLineTwo'>"+arrayMessages[j]+"</span>";
 			}
 		}
 		
 		//set the error div content
 		document.getElementById(errorDivId).style.display = "block";
 		document.getElementById(errorDivId).innerHTML = errorDivContent;
 		
 		//resize the window if required
 		try {
 			passenger.util.adjustFrame('content', false);
 		}catch(Exception) {
 			//do nothing
 		}
 	}
 	
 	//reset the class for existing errors
 	this.resetErrors = function(errorDivId){ 
 		
 		//reset the styles for all elements
		for(var i=0; i < errorElements.length; i++){
			errorElement = errorElements[i];
			titleElement = errorElements[i].getTitleElement();
			if (titleElement != null && errorElement.getChangeElementStyle()){
				//set the current class as error class
				titleElement.className = titleElement.getAttribute("normalClass");
			}	
		}
		
		if (document.getElementById(errorDiv) != null ) { 	
	 		document.getElementById(errorDiv).style.display = "none";
	 		document.getElementById(errorDiv).innerHTML = errorDivContent;
		} 		
 	}
 }
  
/**
 * Function to initialize the error page
 */
passenger.error.initializeErrorPage = function() {
	//reset the elements if any 
	if (errorPage != null){
		errorPage.resetErrors();	
	}	
	errorPage = new passenger.error.errorPage();	
	return errorPage;
} 

/**
 * Get the current error page object
 */
passenger.error.getErrorPage = function() {
	return errorPage;
}


passenger.exception = function(){}

passenger.exception.UIException = function(description) {
	this.description = description;
}
