function validate(){
	this.formName = 'formname';
	this.alertType = 0;						//  0-> Show all and focus 1st 	1-> Show only 1 & focus
	this.errorType = 2;						//  0-> alert				1-> Display			2-> different looks alert
	this.width = 200;				
	this.height = 200;				
	this.mandCaptions = new Array();
	this.mandFields = new Array();
	this.mandEQ = new Array();
	this.mandReg = new Array();
	this.mandOR = new Array();
	this.mandNUM = new Array();
	this.mandMAXLIMIT = new Array();
	this.mandMAXLEN = new Array();
	this.mandMINLEN = new Array();
	this.mandLT = new Array();
	this.mandDATE = new Array();
	this.mandEXT = new Array();
	this.mandMULTIEXT = new Array();
	this.mandEDITOR = new Array();
	this.mandEMAIL = new Array();
	this.errStr = '';
	
	
	this.errArr = new Array('cannot be left blank',
							'is invalid',
							'is not selected',
							'mismatch',
							'form incomplete',
							'should be numeric',
							'should be less than initial end date',
							'cannot be more than ',
							'select is invalid',
							'supports only a-z,0-9,_ and -',
							'cannot have charaters more than ', 
							'is not checked',
							'cannot be less than ',
							'should contain more than ',
							'invalid email address ');
							
	this.errorCode = -1;

	this.validateForm = function(){
		var frmObj = document.forms[this.formName];
		for(var i=0; i<this.mandFields.length; i++){
			var fldObj = frmObj.elements[this.mandFields[i]];
			
			if(fldObj){
				switch(fldObj.type){
					case 'password':
					case 'textarea':
					case 'text':					
						if(this.mandOR[i]){
							if(!(fldObj.value) && !(document.forms[this.formName].elements[this.mandOR[i]].value)){
								this.errorCode = 4;
							}
						}else if(!fldObj.value || fldObj.value == ' '){
							this.errorCode = 0;
						}else if(this.mandEQ[i]){
							if(fldObj.value != document.forms[this.formName].elements[this.mandEQ[i]].value){
								this.errorCode = 3;
							}
						}else if(this.mandNUM[i]){
							if(isNaN(fldObj.value)){
								this.errorCode = 5;
							}
						}else if(this.mandMAXLIMIT[i]){
							if((fldObj.value) && parseInt(fldObj.value) > parseInt(this.mandMAXLIMIT[i],10)){
								this.errorCode = 7;
								this.errArr[7] += parseInt(this.mandMAXLIMIT[i],10);
							}
						}else if(this.mandMAXLEN[i]){
							if((fldObj.value) && fldObj.value.length > parseInt(this.mandMAXLEN[i],10)){
								this.errorCode = 10;
								this.errArr[10] += parseInt(this.mandMAXLEN[i],10);
							}
						}else if(this.mandMINLEN[i]){
							if((fldObj.value) && fldObj.value.length < parseInt(this.mandMINLEN[i],10)){
								this.errorCode = 12;
								this.errArr[12] += parseInt(this.mandMINLEN[i],10) + ' characters';
							}
						}else if(this.mandDATE[i]){
							if(this.compareDate(frmObj, 'LT', fldObj.value, document.forms[this.formName].elements[this.mandLT[i]].value) == false){
								this.errorCode = 6;
							}
						}else if(this.mandReg[i]){
							var pattern = eval(this.mandReg[i]); 
							var patternMatch = pattern.test(fldObj.value);	
							if(patternMatch == false){
								this.errorCode = 9;
							}
						}else if(this.mandEDITOR[i]){
							var count = this.mandEDITOR[i]; 
							var tmpValue = stripHTML(fldObj.value);	
							if(tmpValue.length < count){
								this.errorCode = 13;
								this.errArr[13] += count + ' characters'
							}
						}else if(this.mandEMAIL[i]){
							var pattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/; 
							var patternMatch = pattern.test(fldObj.value);	
							if(patternMatch == false){
								this.errorCode = 14;
							}
						}
					break;
					case 'select-one':
					case 'select':
						if(!fldObj.value || fldObj.value == 0){
							this.errorCode = 2;
						}
					break;
					case 'checkbox':
						if(!fldObj.checked){
							this.errorCode = 11;
						}
					break;
					case 'file':
						if(!fldObj.value){
							this.errorCode = 0;
						}else if(this.mandEXT[i]){
							var contStr = fldObj.value;
							var comStr = contStr.substring(contStr.length - 4);
							if(comStr != this.mandEXT[i]){
								this.errorCode = 8;
							}
						}else if(this.mandMULTIEXT[i]){
							var contStr = fldObj.value;
							var comStr = contStr.substring(contStr.length - 4);
							comStr = comStr.toLowerCase();
							var passStr = this.mandMULTIEXT[i];
							var passStrArr = passStr.split(' ');
							for(var m=0; m<passStrArr.length;m++){
								if(comStr != passStrArr[m]){
									this.errorCode = 8;
									break;
								}
							}
						}
					break;
					case 'hidden':
						// only if its an editor
						if(this.mandEDITOR[i]){
							var count = this.mandEDITOR[i]; 
							var oEditor = FCKeditorAPI.GetInstance(this.mandFields[i]);
							var contents = oEditor.GetXHTML(true);							
							var tmpValue = stripHTML(contents);	
 							
							if(tmpValue.length < count){
								this.errorCode = 13;
								this.errArr[13] += count + ' characters'
							}
						}
					break;
					default:
						//alert(fldObj.type);
					break;
				}
				if(this.errorCode >= 0){
					switch(this.errorType){
						case 1:
							this.markField(i, fldObj, 0);
						break;
						case 2:
							this.errStr += '<b>' + this.mandCaptions[i] + "</b> ("+this.errArr[this.errorCode]+")<br />";
						break;
						default:
							this.errStr += this.mandCaptions[i] + " ("+this.errArr[this.errorCode]+")\n";
						break;
					}
					if(this.alertType == 1){
						fldObj.focus();
						return false;
					}
					this.errorCode = -1;
				}
			}
		}
		if(this.errStr){
			switch(this.errorType){
				case 1:
				break;
				case 2:
					talert("<div class=\"f15\">Looks like following fields are either blank or filled incorrectly<br /><br />" + this.errStr + '</div>', this.width, this.height);
				break;
				default:
					alert("Looks like following fields are either blank or filled incorrectly\n\n" + this.errStr);
				break;
			}		
			return false;
		}else{
			return true;
		}
	};
	this.markField = function(failIndex, fldObj, errType){
		if(fldObj.errBox){
			fldObj.parentNode.removeChild(fldObj.errBox);
			fldObj.errBox = null;
		}
		var errBox = document.createElement('div');
		errBox.innerHTML = '<div class="abs">'+this.mandCaptions[failIndex] + this.errArr[errType] + '</div>';
		errBox.style.fontSize = '10px';
		errBox.className = 'cboth error';
		fldObj.parentNode.appendChild(errBox);
		fldObj.errBox = errBox;
		fldObj.failIndex = failIndex;
		fldObj._self = this;
		
		if(fldObj){
			switch(fldObj.type){
				case 'select-one':
				case 'select':
					fldObj.oldonchange = fldObj.onchange;
					fldObj.onchange = function(e){
						if(this.errBox && this.value){
							this.parentNode.removeChild(this.errBox);
							this.errBox = null;
						}
						if(this.oldonchange) this.oldonchange();
					};
				break;	
				case 'file':
					fldObj.onchange = function(e){
						if(this.errBox && this.value){
							this.parentNode.removeChild(this.errBox);
							this.errBox = null;
						}
					};
				break;
				default:
					fldObj.onkeydown = function(e){
						if(this.errBox && this.value){
							this.parentNode.removeChild(this.errBox);
							this.errBox = null;
						}
					};
				break;	
			}
		}
	}
	
	this.compareDate = function(frmname, cmpType, cmpStr, pasDate){
		var todate = formatDate(pasDate);
		var fromdate = formatDate(cmpStr);
		if(cmpType == 'LT') {
			if(todate <= fromdate) {
				return false;
			}else{
				return true;
			}
		}
	};

}

/* function to strip html elements*/
function stripHTML(oldString) {
   var newString = "";
   var inTag = false;
   for(var i = 0; i < oldString.length; i++) {   
        if(oldString.charAt(i) == '<') inTag = true;
        if(oldString.charAt(i) == '>') {
             if(oldString.charAt(i+1)=="<"){  	
				//dont do anything
			  }else{
				inTag = false;
				i++;
			}
        }
        if(!inTag) newString += oldString.charAt(i);
   }
   return newString;
}