/*
    Author: Omar Ellis
    Subject: Javascript Validation and Formatting library.
    Date Created: 6/28/2006

    For examples, documentation, and your own free copy, go to:
    http://www.dev.zerostech.com
    Note: You can copy and use this script for free and you can make changes
    to the code, but you cannot remove the above comment.
*/
var Validate = {
    IsAlphaChar: function (sString){
        return /^([a-zA-Z])+$/.test(sString);
    },
	IsDate: function (sDate){
	    return /^(\d){2}[/](\d){2}[/](\d){4}$/.test( sDate );
    },
    IsDecimal: function(sDecimal){
        return /^\d+$|^\d+\.\d{2}$/.test(sDecimal); 
    },
    IsDsi: function (sDSI){
	    return /^[D|d](\d){8}/.test( sDSI );
    },
    IsEmail: function (sEmail){
	    return /^[\w\.-]+@[\w\.-]+\.[a-z]{2,3}|[A-Z]{2,3}$/.test(sEmail);
    },
    IsExist: function (sString, sValue){
	    return (arguments[2] == true || arguments[2] == null) ? (sString.toUpperCase().match(/sValue.toUpperCase()/) != -1) ? true : false  : (sString.match(/sValue/) != -1);
    },
    IsPhoneNumber: function (sPhoneNumber){
	    return (sPhoneNumber.indexOf("(")) ? /^[((](\d){3}[))](\d){3}[-|\s]{1}(\d){4}$/.test(sPhoneNumber) : /^(\d){3}[-|\s]{1}(\d){3}[-|\s]{1}(\d){4}$/.test(sPhoneNumber);
    },
    IsSsn: function(sSSN){
        return (sSSN.indexOf("-")) ? /^(\d){3}[-](\d){2}[-](\d){4}$/.test( sSSN ) : /^(\d){3}[-|\s](\d){2}[-|\s](\d){4}$/.test( sSSN );
    },
    IsTime: function (sTime){
	    return /^(\d){1,2}[:](\d){2}$/.test( sTime );
	},
    IsUsaCurrency: function (sCurrency){
	    return /^(\d){1,}[.](\d){2,}$/.test( sCurrency );
    },
    IsUsaZipcode: function (sZipCode){
	    return /^(\d){5}([-](\d){4})?$/.test(sZipCode);
    },
    IsYear: function (sYear){
	    return /^(\d){4}$/.test( sYear );
    },
    IsNull: function (sString){
        return (sString==null) ? true : false;
    },
    IsNullOrEmpty: function (sString){
        return (sString==null||sString=="") ? true : false;
    },
    IsNumeric: function (sString){
        return /^(\d){1,}$/.test(sString);
    },
    IsSpecialChar: function (sString){
        return /^([^a-zA-Z\d])+$/.test(sString);
    }
}

var Format = {
    RemoveAllSpaces: function (sString){
       return sString.replace(/\s/g,"");
    },
    SingleSpace: function (sString){
       return sString.replace(/\s{2,}/g," ");
    },
    SsnDashed: function (sSSN){
        if(/^[-]{1,}$/.test(sSSN)) return sSSN;
        sSSN = this.RemoveAllSpaces(sSSN);
        if(/^(\d){10,}$/.test(sSSN)) return sSSN;
        return sSSN.substring(0,3) + "-" + sSSN.substring(3,5) + "-" + sSSN.substring(5,sSSN.length+2);
    },
    PhoneNumber: function (sPhoneNumber,Seperator,IsAreaCode){
        if( /^[-]{1,}$/.test(sPhoneNumber) ) return sPhoneNumber;
        sPhoneNumber = this.RemoveAllSpaces(sPhoneNumber);
        if(IsAreaCode){
            if( /^(.){8,}$/.test(sPhoneNumber) ) return sPhoneNumber;
            return sPhoneNumber.substring(0,3) + Seperator + sPhoneNumber.substring(3,sPhoneNumber.length+2);
        }
        else{
            if( /^(.){11,}$/.test(sPhoneNumber) ) return sPhoneNumber;
            return sPhoneNumber.substring(0,3) + Seperator + sPhoneNumber.substring(3,6) + Seperator + sPhoneNumber.substring(6,sPhoneNumber.length+2);        
        }
    },
    FormattedText: function (osWord){
	    var iLEN = osWord.length;
	    var nsWord = "";   	
	    for(var i=0;i<iLEN;i++){
		    if(i == 0){ nsWord+=osWord.charAt(i).toUpperCase(); }
		    else if(osWord.charAt(i) == '-' || osWord.charAt(i) == ' ' || osWord.charAt(i) == '\''){
			    nsWord+=osWord.charAt(i);
			    nsWord+=osWord.charAt((i+1)).toUpperCase();
			    i++;  // skip uppercased letter	
		    }
		    else{ nsWord+=osWord.charAt(i).toLowerCase(); }
	    }
	    return nsWord;
    },
    TextArea: function (sString){
        var d=sString,iSpaceCount = 0, sTextArea="";
        for(var i=0;i<d.length;i++){
            if(d.charAt(i) == "\n"){ sTextArea+="<br>"; }
            else if(d.charAt(i) == " "){
	            if(iSpaceCount == 2){
		            sTextArea+="&nbsp;";			
		            iSpaceCount = 0; // reset space counter
	            }
	            else{
		            sTextArea+=d.charAt(i);
		            if(d.charAt(i-1) == " " && i != 0){ iSpaceCount++; }
	            }
            }
            else{ sTextArea+=d.charAt(i); }
        }
        return sTextArea;
    }
}

var Forms = function(){
    this.ErrMsg = { 
        EMAIL: "Please Enter A Valid Email Address.",
        NUMERIC: "Please Enter A Valid Numeric Value.",
        DECIMAL: "Please Enter A Valid Numeric/Decimal Value.",
        PHONE: "Please Enter A Valid Phone Number.",
        DATE: "Please Enter A Valid Date.",
        YEAR: "Please Enter A Valid Four Digit Year.",
        TIME: "Please Enter A Valid Time.",
        SSN: "Please Enter A Valid Social Security.",
        DSI: "Please Enter A Valid Structure DSI (e.g. DXXXXXXXX).",
        CURRENCY: "Please Enter A Valid Currency (e.g. X.XX)"
    }                   
}
Forms.prototype.ValidateForm = function (FormName){
	df = document.getElementById(FormName).elements;
	len = arguments.length;
	for(i=1;i<len;i++){
		Obj = arguments[i].split(';');
		ID = Obj[0];
		Type =  Obj[1].toUpperCase();
		
		try{
		    switch(Type){
			    case 'DECIMAL': 
						    if(!Validate.IsDecimal(df[ID].value)) throw this.ErrMsg.DECIMAL;
						    break;
			    case 'EMAIL': 
						    if(!Validate.IsEmail(df[ID].value)) throw this.ErrMsg.EMAIL;
						    break;
			    case 'NUMERIC': 
						    if(!Validate.IsNumeric(df[ID].value)) throw this.ErrMsg.NUMERIC;
						    break;
			    case 'PHONE':
						    if(!Validate.IsPhone(df[ID].value)) throw this.ErrMsg.PHONE;
						    break; 
			    case 'DATE':
						    if(!Validate.IsDate(df[ID].value)) throw this.ErrMsg.DATE;
						    break; 
			    case 'FOURDIGITYEAR':
						    if(!Validate.IsYear(df[ID].value)) throw this.ErrMsg.YEAR;
						    break; 
			    case 'TIME':
						    if(!Validate.IsTime(df[ID].value)) throw this.ErrMsg.TIME;
						    break; 
			    case 'SSN':
						    if(!Validate.IsSsn(df[ID].value)) throw this.ErrMsg.SSN;
						    break;
			    case 'DSI':
						    if(!Validate.IsDsi(df[ID].value)) throw this.ErrMsg.DSI;
						    break;
			    case 'CURRENCY':
						    if(!Validate.IsUsaCurrency(df[ID].value)) throw this.ErrMsg.CURRENCY;
						    break;	
		    }
		}
		catch(e){
		    alert(e);
			df[ID].focus();
		    return false;
		}
	}
	return true;
}
Forms.prototype.FormatForm = function (FormName){
	df = document.getElementById(FormName).elements;
	len = arguments.length;
	for(i=1;i<len;i++){
		Obj = arguments[i].split(';');
		ID = Obj[0];
		Type =  Obj[1].toUpperCase();
		switch(Type){
			case 'TEXT': 
						df[ID].value=Format.FormattedText(df[ID].value);
						break;
			case 'TEXTAREA': 
						df[ID].value=Format.TextArea(df[ID].value);
						break;
			case 'PHONE':
						df[ID].value = Format.PhoneNumber(df[ID].value);
						break; 
			case 'SSN':
						df[ID].value = Format.SsnDashed(df[ID].value);
						break;
		}
	}
	return true;	
}