DHL.JS.require('dhl.validation.exception');
DHL.JS.require('dhl.validation.string');
DHL.JS.require('dhl.validation.state');
DHL.JS.require('dhl.validation.datev2');
DHL.JS.require('dhl.validation.int');
DHL.JS.require('dhl.validation.validation');
DHL.JS.require('dhl.validation.email');
DHL.JS.require('dhl.validation.creditcardnumber');
	
if (DHL == undefined) var DHL = {};
if (DHL.VALIDATION == undefined) DHL.VALIDATION = {};
if (DHL.VALIDATION.VERIFICATION == undefined) DHL.VALIDATION.VERIFICATION = {};
(DHL.VALIDATION.VERIFICATION = function (){

	//Private Member Variable - Default Configuration {{{
	this.arrConfig = new Object();
	this.arrConfig.intAuthMin = 6;
	this.arrConfig.intAuthMax = 12;
	this.arrConfig.objNamePattern = /^[a-zйакиповз\-\']([a-zйакиповз\-\' 0-9]+)*$/i;
	this.arrConfig.objAddressPattern = /^([0-9a-zйакиповз\#\']+)([0-9a-zйакиповз\#\.\'\ \-\,]+)$/i;
	this.arrConfig.objAuthPattern = /^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i;
	this.arrConfig.objNumPattern = /^([0-9])*$/;
	this.arrConfig.objLbAuthPattern = /^([a-z0-9\-\_\/\.\'\;\#\&]+)$/i;
	this.arrConfig.objStringPattern = /^.*$/i;
	this.arrConfig.objUrlPattern = /^((ftp|http|https):\/\/)?(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
	//}}}
	
	// "Constants" {{{
		// Config {
		DHL.VALIDATION.VERIFICATION.DEFAULTCONFIG = 1;
		DHL.VALIDATION.VERIFICATION.LBCONFIG = 41;
		// }
	//}}}
	
	// Static Instanciation of object (including configuration) {{
	DHL.VALIDATION.VERIFICATION.getInstance = function(intId) {
		if (typeof intId == 'undefined') {
			intId = DHL.VALIDATION.VERIFICATION.DEFAULTCONFIG;
		}
		var objInstance = new DHL.VALIDATION.VERIFICATION();
		
		switch (intId) { // CONFIG ID
			/* Template to modify and set values.. */
			case 41 :
				objInstance.arrConfig.intAuthMin = 6;
				objInstance.arrConfig.intAuthMax = 255;
				objInstance.arrConfig.objAuthPattern = /^([a-z0-9\-\_\/\.\'\;\#\&]+)$/i;
				objInstance.arrConfig.objNamePattern = /^[a-zйакиповз\&\-\.\$\!\#]([a-zйакиповз\&\-\.\!\$\# 0-9]+)*$/i;
			break;
			default :
				// Do nothing..
			
		}
		return objInstance;
	}
	// }}

	/**
	 * Auth validation (Login, password) 
	 * @params STRING strToValidate 
	 * @returns DHL_EXCEPTION exception if not valid
	 */
	DHL.VALIDATION.VERIFICATION.prototype.auth = function(strToValidate){
		var objValidation = new DHL.VALIDATION.STRING();
		objValidation.setMin(this.arrConfig.intAuthMin);
		objValidation.setMax(this.arrConfig.intAuthMax);
		objValidation.setPattern(this.arrConfig.objAuthPattern);
		// String pattern verification {{
		try {
			if(strToValidate == '') {
				throw(new DHL.VALIDATION.EXCEPTION(this, 'STRING_EMPTY', 'Is empty'));
			}
			if(!this.arrConfig.objAuthPattern.test(strToValidate)) {
				throw(new DHL.VALIDATION.EXCEPTION(this, 'STRING_AUTH_PATTERN', 'must contain both letters and numbers'));
			}
		} catch( objException ) { return objException; }
		
		try { objValidation.validate(strToValidate);
		} catch( objException ) { return objException; }
		// }}
		return true;
	}
	// }}
	
	/**
	 * No-Match validation (Login != password) 
	 * @params STRING strLogin 
	 * @params STRING strPassword 
	 * @returns DHL_EXCEPTION exception if not valid
	 */
	DHL.VALIDATION.VERIFICATION.prototype.authMatch = function(strLogin,strPassword){
		// Auth verification {{
		try {
			if( strLogin == strPassword ) {
				throw(new DHL.VALIDATION.EXCEPTION(this, 'AUTH_IDENT', 'Login and password must be different'));
			}
		} catch( objException ) {
			return objException;
		}
		// }}
		return true;
	}
	// }}
	
	/**
	 * Name validation (First name, last name, city name, etc...) {{
	 * @params STRING strToValidate
	 * @returns Boolean; Throws Object exception if not valid
	 */
	DHL.VALIDATION.VERIFICATION.prototype.name = function(strToValidate){
		var objValidation = new DHL.VALIDATION.STRING();
		objValidation.setMin(2);
		objValidation.setMax(255);
		objValidation.setPattern(this.arrConfig.objNamePattern);
		
		strToValidate = strToValidate.replace(/^\s+|\s+$/g,"");
		// String pattern verification {{
		try {
			objValidation.validate(strToValidate);
		} catch( objException ) {
			return objException;
		}
		// }}
		return true;
	}
	// }}
	
	/**
	* Address validation (number, letters) {{
	* @params STRING strToValidate
	* @returns Boolean; Throws Object exception if not valid
	*/
	DHL.VALIDATION.VERIFICATION.prototype.address = function(strToValidate){
		var objValidation = new DHL.VALIDATION.STRING();
		objValidation.setMin(2);
		objValidation.setMax(100);
		objValidation.setPattern(this.arrConfig.objAddressPattern);
		
		// String pattern verification {{
		try {
			objValidation.validate(strToValidate);
		} catch( objException ) {
			return objException;
		}
		// }}
		return true;
	}
	// }}
	
	/**
	* Zip Code validation (number) {{
	* @params STRING strToValidate
	* @params STRING strCountry 
	* @returns Boolean; Throws Object exception if not valid
	*/
	DHL.VALIDATION.VERIFICATION.prototype.zip = function(strToValidate, strCountry){
		DHL.JS.require('dhl.validation.zip');
		// Zip Contains everything
		var objValidation = new DHL.VALIDATION.ZIP();
		objValidation.setCountry(strCountry);
		
		// Validation
		try {
			objValidation.validate(strToValidate);
		} catch( objException ) {
			return objException;
		}
		return true;
	}
	// }}
	
	/**
	* Phone validation (number) {{
	* @params STRING strToValidate
	* @returns Boolean; Throws Object exception if not valid
	*/
	DHL.VALIDATION.VERIFICATION.prototype.phone = function(strToValidate){
		var objValidation = new DHL.VALIDATION.STRING();
		objValidation.setMin(7);
		objValidation.setMax(100);
		
		//objReg = /^([0-9 ]{8})|\+?[0-9]?\s*\(?-?[0-9]{3}\)?-?\s*[0-9]{3}-?\s*[0-9]{4}$/;
		//objReg = /^([0-9 ]{8})|([0-9]{7})|\+?[0-9]?\s*\(?-?[0-9]{3}\)?-?\s*[0-9]{3}-?\s*[0-9]{4}$/
		//objReg = /^([0-9 ]{8})|\+?[0-9]?\s*\(?-?[0-9]{3}\)?-?\s*[0-9]{3}-?\s*[0-9]{4}$/;
		objReg = /^(\(?\+?[0-9]*\)?)?[0-9_\- \(\)]*$/;
		
		objValidation.setPattern(objReg);
		
		// Validation
		try {
			objValidation.validate(strToValidate);
		} catch( objException ) {
			return objException;
		}
		return true;
	}
	// }}
	
	/**
	* Cvv validation {{
	* @params STRING strToValidate
	* @params STRING strCCType 
	* @returns Boolean; Throws Object exception if not valid
	*/
	DHL.VALIDATION.VERIFICATION.prototype.cvv = function(strToValidate, strCCType){
		var objValidation = new DHL.VALIDATION.STRING();
		objValidation.setMin(3);
		objValidation.setMax(3);
		objValidation.setPattern(this.arrConfig.objNumPattern);
		
		try {
			if(!this.arrConfig.objNumPattern.test(strToValidate)) {
				throw(new DHL.VALIDATION.EXCEPTION(this, 'STRING_PATTERN_NUMERIC', 'must contain only numbers'));
			}
		} catch( objException ) { return objException; }
		
		// Validation
		try {
			objValidation.validate(strToValidate);
		} catch( objException ) {
			return objException;
		}
		return true;
	}
	// }}
	
	/**
	* Email validation (number) {{
	* @params STRING strToValidate
	* @returns Boolean; Throws Object exception if not valid
	*/
	DHL.VALIDATION.VERIFICATION.prototype.email = function(strToValidate){
		var objValidation = new DHL.VALIDATION.EMAIL();
		// Validation
		try {
			objValidation.validate(strToValidate);
		} catch( objException ) {
			return objException;
		}
		return true;
	}
	// }}
	
	/**
	* Country / State validation () {{
	* @params STRING strState
	* @params STRING strCountry
	* @returns Boolean; Throws Object exception if not valid
	*/
	DHL.VALIDATION.VERIFICATION.prototype.state = function(strState, strCountry){
		var objValidation = new DHL.VALIDATION.STATE();
		objValidation.setCountry(strCountry);
		// Validation
		try {
			objValidation.validate(strState);
			objValidation.validateAgainstCountry(strState);
		} catch( objException ) {
			return objException;
		}
		
		return true;
	}
	// }}
	
	/**
	* CC number validation () {{
	* @params STRING strToValidate
	* @returns Boolean; Throws Object exception if not valid
	*/
	DHL.VALIDATION.VERIFICATION.prototype.ccNum = function(strToValidate){
		var objValidation = new DHL.VALIDATION.CREDITCARD_NUMBER();
		// Validation
		try {
			objValidation.validate(strToValidate);
		} catch( objException ) {
			return objException;
		}
		return true;
	}
	// }}
	
	/**
	* Age  validation () {{
	* @params DateTime dtValidate - 18
	* @returns Boolean; Throws Object exception if not valid
	*/
	DHL.VALIDATION.VERIFICATION.prototype.birthdate = function(dtValidate, intMinAge){
		var objValidation = new DHL.VALIDATION.DATE();
		objValidation.setMinDate('1900-01-01');
		
		// Set Max Date {{
			if (isNaN(intMinAge))  {
				intMinAge = 18;
			}
			var dtToday = new Date();
			dtToday.setFullYear(dtToday.getFullYear() - intMinAge);
			var dtMax = dtToday.getFullYear() + '-' + (dtToday.getMonth() + 1) + '-' + dtToday.getDate();
			objValidation.setMaxDate(dtMax);
		// }}

		// Validation
		try {
			objValidation.validate(dtValidate);
		} catch( objException ) {
			return objException;
		}
		
		return true;
	}
	// }}
	
	/**
	* CC expiration date  validation () {{
	* @params DateTime 
	* @returns Boolean; Throws Object exception if not valid
	*/
	DHL.VALIDATION.VERIFICATION.prototype.expDate = function(dtValidate){
		var objValidation = new DHL.VALIDATION.DATE();
		// Set Min Date {{
			var dtToday = new Date();
			var dtMin = dtToday.getFullYear() + '-' + (dtToday.getMonth() + 1) + '-01';
			objValidation.setMinDate(dtMin);
		// }}
		/*
		// Set Max Date {{
			var dtToday = new Date();
			dtToday.setFullYear(dtToday.getFullYear() + 15);
			var dtMax = dtToday.getFullYear() + '-' + (dtToday.getMonth() + 1) + '-01';
			objValidation.setMaxDate(dtMax);
		// }}
		*/
		// Validation
		try {
			objValidation.validate(dtValidate);
		} catch( objException ) {
			return objException;
		}
		
		return true;
	}
	// }}
	
	
	
	/**
	* Livebucks Methods validation -  Auth verif {{
	* @params STRING strToValidate
	* @returns Boolean; Throws Object exception if not valid
	*/
	DHL.VALIDATION.VERIFICATION.prototype.lbAuth = function(strToValidate){
		var objValidation = new DHL.VALIDATION.STRING();
		objValidation.setMin(6);
		objValidation.setMax(255);
		objValidation.setPattern(this.arrConfig.objLbAuthPattern);
		
		// String pattern verification {{
		try {
			objValidation.validate(strToValidate);
		} catch( objException ) {
			return objException;
		}
		// }}
		return true;
	}
	// }}
	
	
	/**
	* TOS check validation () {{
	* @params Boolean, Check Box 
	* @returns Boolean; Throws Object exception if not valid
	*/
	DHL.VALIDATION.VERIFICATION.prototype.tos = function ( blnCheckBox ) {
		try {
			if( blnCheckBox == false ) {
				throw(new DHL.VALIDATION.EXCEPTION(this, 'TOS_NOTACCEPTED', 'You must accept the terms and conditions to continue'));
			}
		} catch( objException ) {
			return objException;
		}
		// }}
		return true;
		
	}
	
	/**
	* String validation () {{
	* @params STRING strToValidate
	* @returns Boolean; Throws Object exception if not valid
	*/
	DHL.VALIDATION.VERIFICATION.prototype.string = function(strToValidate){
		var objValidation = new DHL.VALIDATION.STRING();
		objValidation.setMin(2);
		objValidation.setMax(255);
		objValidation.setPattern(this.arrConfig.objStringPattern);
		
		strToValidate = strToValidate.replace(/^\s+|\s+$/g,"");
		// String pattern verification {{
		try {
			objValidation.validate(strToValidate);
		} catch( objException ) {
			return objException;
		}
		// }}
		return true;
	}
	// }}
	
	/**
	* Url validation () {{
	* @params STRING strToValidate
	* @returns Boolean; Throws Object exception if not valid
	*/
	DHL.VALIDATION.VERIFICATION.prototype.url = function(strToValidate){
		var objValidation = new DHL.VALIDATION.STRING();
		objValidation.setMin(2);
		objValidation.setMax(255);
		objValidation.setPattern(this.arrConfig.objUrlPattern);
		
		// String pattern verification {{
		try {
			objValidation.validate(strToValidate);
		} catch( objException ) {
			return objException;
		}
		// }}
		return true;
	}
	// }}
	
	/**
	 * This Method format the validation error to a user freindly message
	 * @param object objValidate DHL.VALIDATION.VALIDATION
	 * @param string strFieldName
	 * @return string
	 */
	// {{
	DHL.VALIDATION.VERIFICATION.prototype.formatStringError = function(objException, strFieldName){
		strReturn = "";
			
		var objValidator = objException.getObject();
		if(objException)
		{
			switch(objException.getKey())
			{
				//String Handle {{{
				case 'STRING_TOOSHORT':
					strReturn += "The " + strFieldName + " is too short, string must be ";
					if(objValidator.getMin() == objValidator.getMax())
						strReturn += "exactly " + objValidator.getMin() + " character long.\n";
					else {
						if ( objValidator.getMax() >= 50) {
							strReturn += "at least " + objValidator.getMin() + " characters long\n";
						} else {
							strReturn += "between " + objValidator.getMin() + " and " + objValidator.getMax() + " characters long\n";
						}
					}
					
				break;
				case 'STRING_TOOLONG':
					strReturn += "The  " + strFieldName + " is too long, string must be ";
					if(objValidator.getMin() == objValidator.getMax())
						strReturn += objValidator.getMin() + " character long.\n";
					else
						strReturn += "between " + objValidator.getMin() + " and " + objValidator.getMax() + " characters long\n";
				break;
				case 'STRING_FAILNUMERIC':
						strReturn += "The " + strFieldName + " must be numeric \n";
				break;
				case 'STRING_EMPTY':
					strReturn += "The " + strFieldName + " cannot be empty \n";
				break;
				case 'STRING_PATTERN_NUMERIC':
					strReturn += "The " + strFieldName + " need to contain only numbers \n";
				break;
				case 'STRING_AUTH_PATTERN':
				case 'STRING_PATTERN_AUTH':
					strReturn += "The " + strFieldName + " must contain both letters (a-z) and numbers (0-9)\n";
				break;
				case 'STRING_PATTERN_USERDEFINED':
					strReturn += "The " + strFieldName + " is incorrect.\n";
				break;
				case 'AUTH_IDENT':
					strReturn += "The login and password must be different.\n";
				break;
				case 'ZIP_PATTERN_USERDEFINED':
					strReturn += "The zip/postal code is incorrect for the selected country.\n";
				break;
				//}}}
				//Int Handle {{{
				case 'INT_EMPTY':
					strReturn += "The " + strFieldName + " is Empty \n";
				break;
				case 'INT_LESSTHANMIN':
				case 'INT_MORETHANMAX':
					strReturn += "The " + strFieldName + " need to be between " + objValidator.getMin() + " and " + objValidator.getMax() + "\n";
				break;
				//}}}
				//Email Ahndle {{{
				case 'EMAIL_INVALID':
					strReturn = "The " + strFieldName + " is invalid\n";
				break;
				case 'EMAIL_EMPTY':
					strReturn = "The " + strFieldName + " is Empty\n";
				break;
				//}}}
				//State Validation{{{
				case 'STATE_INVALIDSTATEINCOUNTRY':
					strReturn = "The " + strFieldName + " is not a valid state for the selected country.\n";
				break;
				case 'STATE_INVALIDCOUNTRY':
					strReturn = "The selected country is not valid.\n";
				break;
				case 'STATE_INVALID':
					strReturn = "The selected state is not valid.\n";
				break;
				//}}}
				//CC Validation{{{
				case 'DATE_SMALLER':
					strReturn = "The Date on the credit card is expired.\n";
				break;
				case 'DATE_GREATER':
					strReturn = "You must be at least 18 to join this site.\n";
				break;
				case 'DATE_NOTEXIST':
					strReturn = "The birth Date does not exists.\n";
				break;
				//}}}
				//CC Validation{{{
				case 'CREDITCARD_NUMBER_EMPTY':
				case 'CREDITCARD_NUMBER_NAN':
				case 'CREDITCARD_NUMBER_NOTSUPPORTED':
				case 'CREDITCARDNUMBER_BADNUMBER':
					strReturn = "Please enter a valid credit card number\n";
				break;
				case 'TOS_NOTACCEPTED':
					strReturn = "You must accept the terms and conditions to continue\n";
				break;
				//}}}
				default:
					strReturn = "Invalid Field : " + strFieldName + ' ' + "\n";
			}
		}
		return strReturn;
	}
	// }}
	
	if (DHL.VALIDATION.VERIFICATION.prototype.className == undefined) {
		DHL.VALIDATION.VERIFICATION.prototype.className = 'DHL.VALIDATION.VERIFICATION';
		DHL.VALIDATION.VERIFICATION.prototype.jsClass = DHL.VALIDATION.VERIFICATION;
	}
	
})();