if (!document.getElementsByClassName) {
  	document.getElementsByClassName = function (cn) {
		var rx = new RegExp("\\b" + cn + "\\b"), allT = document.getElementsByTagName("*"), allCN = [], i = 0, a;
			while (a = allT[i++]) {
			  if (a.className && a.className.indexOf(cn) + 1) {
				if(a.className===cn){ allCN[allCN.length] = a; continue;   }
				rx.test(a.className) ? (allCN[allCN.length] = a) : 0;
			  }
			}
		return allCN;
	}
}

validation = function(arg) { 

	this.init(arg);

};

validation.prototype = {
	
	init : function(isDebug){
		
		this.isDebug = false;
		
		if (isDebug) {
			this.isDebug = true;
		}
		
		this.reponse = true;
		this.message = new Array();
	
		var thisPointer = this;
		
		var objFields = document.getElementsByClassName("error");
		
		for (var i = 0; i < objFields.length; i = i + 1) {
			this.removeClass(objFields[i].className,"error");
		}
		
	},
	
	setField : function(fieldNames, type, required, message){
		
		testList = fieldNames.indexOf(",");
		
		if(testList != -1){
			fieldName = fieldNames.split(",");
			var objField = document.getElementById(fieldName[0]);
		}
		else {
			var objField = document.getElementById(fieldNames);	
		}
		
		if(objField != null){
		
			switch(type){
				case "phone":
					if(required || (!required && objField.value.length != 0)){
						if(objField.value.replace(/[0-9]+/,"").length != 0 || objField.value.length != 10)
							this.setError(objField,message + " - Phone number needs to be correctly formatted. eg 0212345678");
					}
					break;
				case "mobile":
					if(required || (!required && objField.value.length != 0)){
						if(objField.value.replace(/[0-9]+/,"").length != 0 || objField.value.length != 10)
							this.setError(objField,message + " - Phone number needs to be correctly formatted. eg 0212345678");
					}
					break;
				case "email":
					if((required && !objField.value.length) || objField.value.replace(/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/,"").length)
						this.setError(objField,message + " - Incorrect e-mail format.");
					break;
					
				case "money":
					if((required && !objField.value.length) || objField.value.replace(/[0-9]*[.]?[0-9]?[0-9]?/,"").length)
						this.setError(objField,message + " - Value must be a valid currency entry (no $ sign, max 2 decimal places).");
					break;
					
				case "int" :
					if((required && !objField.value.length) || objField.value.replace(/[0-9]+/,"").length)
						this.setError(objField,message + " - Value must be a valid integer (non-decimal number).");
					break;
					
				case "decimal" :
					if((required && !objField.value.length) || objField.value.replace(/[0-9]*[.]?[0-9]*/,"").length)
						this.setError(objField,message + " - Value must be a valid decimal number.");
					break;
					
				case "select":
					if(required && (!objField.options.length || (!objField.options[objField.selectedIndex].value.length || objField.options[objField.selectedIndex].value == 0)))
						this.setError(objField,message);
					break;
		
				case "multiselect":
					if(required && objField.selectedIndex == -1)
						this.setError(objField,message);
					break;
					
				case "datetime":
					if(required && !objField.value.replace(/\s*/,"").length)
						this.setError(objField,message);
				break;
				
				case "password":
					if(required && objField.value.replace(/\s*/,"").length == 0)
						this.setError(objField,"Your must enter a password.");
				break;
				
				case "passwordConfirm":
					if(required && objField.value !=  document.getElementById(fieldName[1]).value)
						this.setError($(fieldName[1]),"Your confirm password does not match");
				break;
				
				case "creditCard":
					if(required && objField.value.replace(/[^0-9]+/g,'').length < 16)
						this.setError(objField,message);
				break;
				
				default:
					if(required && !objField.value.replace(/\s*/,"").length)
						this.setError(objField,message);
				break;
			}
			
		}
		else {
			
			if(this.isDebug){
				alert('Cannot find '+ fieldNames + ' field');
			}
		}
	},
	
	setError : function(objField,message){
		
		this.reponse = false;
		this.message.push(message);
		this.addClass(objField,"error");
	
	},
	
	validate : function(){
		
		var strMessage = '';
		var isAlert = 0;
		
		if(document.getElementById('alert')){
			isAlert = 1;
		}
		
		for(var i=0; i<this.message.length; i=i+1){
			if(isAlert){
				strMessage = strMessage + '<li>';
			}
			strMessage = strMessage + this.message[i];
			if(isAlert){
				strMessage = strMessage + '</li>';
			}
			else {
				strMessage = strMessage + '\n';
			}
		}
		
		if(strMessage.length){
			if(isAlert){
				
				strMessage = '<h2>Warning</h2><ul>' + strMessage;
				strMessage = strMessage + '</ul>';
				document.getElementById('alert').style.display = 'block';
				document.getElementById('alert').innerHTML = strMessage;
				
			}
			else {
				
				alert(strMessage);
				
			}
		}
		
		return this.reponse;
		
	},
	
	addClass : function(objElement, strClass){
		
		if ( objElement.className ) {
		
		  	var arrList = objElement.className.split(' ');
	        var strClassUpper = strClass.toUpperCase();
	
			for (var i = 0; i < arrList.length; i++) {
				if ( arrList[i].toUpperCase() == strClassUpper ) {
					arrList.splice(i, 1);
					i--;
				}
			}
		
			arrList[arrList.length] = strClass;
			objElement.className = arrList.join(' ');
		
		}
		else { 
		
			objElement.className = strClass;
			
		}
		
	},
	
	removeClass : function(objElement, strClass){
		
		if (objElement.className) {
		
			var arrList = objElement.className.split(' ');
			var strClassUpper = strClass.toUpperCase();
		
			for (var i = 0; i < arrList.length; i++) {
				if ( arrList[i].toUpperCase() == strClassUpper ) {
					arrList.splice(i, 1);
					i--;
				}
			}
		
			objElement.className = arrList.join(' ');
		
		}
		
	}
	
}
