// JavaScript Document
// rdo_formHandler.js ---- v1.0
// 	note: overwrites form item id. Do use other scripts that rely on form items with id's.
//  Netscape 4 and Ie 4+ compatible.


	// Base Class
	function rdo_formHandler() {
		// public properties and interfaces------------------------------------------------
		this.formName = null
		this.formItem = new Array();		
		this.addFormItem = rdo_addFormObj;
		this.validate = rdo_validate;		
		baseClass = this;
		
		
		// Methods-----------------------------------------------------------------------
		function rdo_addFormObj(strFormName, strFormTitle, bIsRequired) {			
			var oTmpFormObj = eval("document.forms[this.formName]."+strFormName+";");						
			var oTmpObj = new Object();
			oTmpObj.id = oTmpFormObj;
			if(oTmpFormObj.name) {
				oTmpObj.type = oTmpFormObj.type;
				oTmpObj.name = oTmpFormObj.name;				
			} else {
				oTmpObj.type = oTmpFormObj[0].type;
				oTmpObj.name = oTmpFormObj[0].name;							
			}
			oTmpObj.title = strFormTitle;
			oTmpObj.isRequired = bIsRequired;
			oTmpObj.ruleSet = new Array();			
			
			// NS4 hack
			if(document.layers && !document.getElementById) {
				oTmpObj.addRule = rdo_addFormObj.rdo_addFormObj_addRule;  //netscape 4.0
			} else {
				oTmpObj.addRule = rdo_addFormObj_addRule;
			}					
						
			oTmpObj.id.id = this.formItem.length;
			this.formItem[this.formItem.length] = oTmpObj;						
			
			// inherits from Form Object (oTmpObj)
			function rdo_addFormObj_addRule(strEvent, strMask, strError) {				
				var oTmpRule = new Object();
				oTmpRule.mask = strMask;
				oTmpRule.error = strError;
				oTmpRule.action = strEvent
				this.ruleSet[this.ruleSet.length] = oTmpRule;				
				if((strEvent!='') && (strEvent != "validate") && (strEvent != "OR") ) {					
					eval("this.id."+strEvent+"=rdo_addFormObj_checkMask;");
				}													
			}
			
			// inherits from input event, base class scope
			function rdo_addFormObj_checkMask() {			
				for( var i in baseClass.formItem[this.id].ruleSet) {
					var strMaskValue = baseClass.formItem[this.id].ruleSet[i].mask
					var strItemValue = this.value
					var strMaskAction = baseClass.formItem[this.id].ruleSet[i].action
					
					switch(strMaskValue) {
						case "numeric" :
							strItemValue.isNumeric(baseClass.formItem[this.id])
							break;
						case "alpha" :
							var bAlpha = strItemValue.isAlpha();						
							break;
						default :						
							if(baseClass.formItem[this.id].ruleSet[i].action != "OR") {
								strItemValue.compareMask(strMaskValue, baseClass.formItem[this.id]);
							}
							break;						
					}													
				}
			}			
			return oTmpObj;
		}	
		
		String.prototype.compareMask = function(strMask, baseObj) {
			
			var arMaskChecks = new Array();
			var arCharChecks = new Array();
			
			//Build masks your going to check against
			arMaskChecks[0] = strMask			
			for(i in baseObj.ruleSet) {				
				if(baseObj.ruleSet[i].action == "OR") {
					arMaskChecks[arMaskChecks.length] = baseObj.ruleSet[i].mask
				}
			}
			
			for(var j in arMaskChecks) {
				var arMaskRules = new Array();				
				for(var i = 0; i < arMaskChecks[j].length; i++) {
					if(arMaskChecks[j].charAt(i) != "x") {
						var oMask = new Object();
						oMask.character = arMaskChecks[j].charCodeAt(i);
						oMask.location = i;
						arMaskRules[arMaskRules.length] = oMask;
					}
				}
				arCharChecks[arCharChecks.length] = arMaskRules;					
			}
			
			var bError = false;
			for(var j in arMaskChecks) {				
				//length only check
				if((this.length!=arMaskChecks[j].length) && (arCharChecks[j].length==0)) {
					alert(baseObj.title+" field must be "+strMask.length+" characters long");
					return false;
				} else { // Mask and length check					
					for(var i in arCharChecks[j]) {					
						
						if(this.charCodeAt(arCharChecks[j][i].location) != arCharChecks[j][i].character) {
							bError = true;													
						} else if(this.length!=arMaskChecks[j].length) {
							bError = true;														
						} else {
							return true;
						}
					}														
				}
			}
			
			if(bError == true) {
				var alertString				
				if(arMaskChecks.length > 1) {
					alertString = baseObj.title+" field must be formatted as: \n";
				} else {
					alertString = baseObj.title+" field must be "+arMaskChecks[0].length+" characters and formatted as: \n";
				}
				
				
				for(var k in arMaskChecks) {					
					if(k==arMaskChecks.length-1) {
						alertString += arMaskChecks[k] + "\n";
					} else {
						alertString += arMaskChecks[k] + ",\n";
					}
				}
				alert(alertString);
				return false;				
			} else { return true; }
					
		}
		
		String.prototype.isAlpha = function(baseObj) {			
			for(var i = 0; i < this.length; i++) {
				if((this.charCodeAt(i)>=48) && (this.charCodeAt(i)<=57)) {
					alert(baseObj.title+" field must be alpha characters only");
					return false;
					break;
				} else { return true; }				
			}
		}
		
		String.prototype.isNumeric = function(baseObj) {			
			if(isNaN(this)) {
				alert(baseObj.title+" field must be numeric only");				
				return false;				
			} else { return true; }			
		}			
		
		// Validates all created form objects
		function rdo_validate() {			
			var arNotFilled = new Array();
			
			for(var i in this.formItem) {
				if(this.formItem[i].isRequired == true) {
					if((this.formItem[i].type == "text") && (this.formItem[i].id.value == "")) {						
						arNotFilled[arNotFilled.length] = this.formItem[i]
					} else if((this.formItem[i].type == "radio") || (this.formItem[i].type == "checkbox")) {
						for(var j = 0; j<this.formItem[i].id.length; j++) {						
							if(this.formItem[i].id[j].checked == true) {
								var bChecked = true;
								break;								
							}							
						}
						!bChecked?arNotFilled[arNotFilled.length] = this.formItem[i]:0;
					}
				}
			}
			
			function rdo_validate_required() {			
				if(arNotFilled.length > 0) {	
					var strErrorReq = "Please fill in all required fields: \n";
					for(var i in arNotFilled) {
						if((arNotFilled.length!=1) && (arNotFilled.length!=Number(i)+1)) {						
							strErrorReq += arNotFilled[i].title+", ";
						} else { 
							strErrorReq += arNotFilled[i].title;
						}						
					}
					alert(strErrorReq);
					return false;
				} else {
					return true;					
				}
			}
			
			function rdo_validate_masks() {			
				var isValid = true;
				for(var i in baseClass.formItem) {
				
					if( (baseClass.formItem[i].ruleSet.length != 0) && (baseClass.formItem[i].isRequired == true) ) {						
						for(var j in baseClass.formItem[i].ruleSet) {							
							switch(baseClass.formItem[i].ruleSet[j].mask) {
								case "numeric" :
									bCheck = baseClass.formItem[i].id.value.isNumeric(baseClass.formItem[i]);
									bCheck==false?isValid=false:0;
									break;
								case "alpha" :
									bCheck = baseClass.formItem[i].id.value.isAlpha(baseClass.formItem[i]);
									bCheck==false?isValid=false:0;
									break;
								default :								
									bCheck = baseClass.formItem[i].id.value.compareMask(baseClass.formItem[i].ruleSet[j].mask, baseClass.formItem[i]);									
									bCheck==false?isValid=false:0;
									break;
							}						
						}
					}
				}				
				return isValid;
			}			
			
			var bMask = rdo_validate_masks();
			var bRequired = rdo_validate_required();
			
			if((bMask==false) || (bRequired==false)) {
				return false;
			} else {
				return true;
			}			
		}	
	
	}