var Hartwell;
if(!Hartwell){ Hartwell = {}; }
if(!Hartwell.util){ Hartwell.util = {}; }

Hartwell.util.formdata = {
		// form validation function
		validate:function(form){
			function createAlert(elem,message){
				var alert = document.createElement('span');
				alert.className="formAlert";
				alert.innerHTML=message;
				var par = elem.parentNode;
				var parName = elem.parentNode.nodeName.toLowerCase();
				if(parName == 'form' || parName == 'fieldset'){
					alertbox = YAHOO.util.Dom.getElementsByClassName('alertBox','div',par);
					if(alertbox.length){
						alertbox[0].appendChild(alert); 
					}else{
						var div = document.createElement('div');
						div.className = "alertBox";
						div.appendChild(alert);
						par.insertBefore(div,par.firstChild);
						
					}
				}else{ par.appendChild(alert) }
			}
			function removeAlerts(form){
				alerts = YAHOO.util.Dom.getElementsByClassName('formAlert','span',form)
				for (var i=0; i < alerts.length; i++) {
					alerts[i].parentNode.removeChild(alerts[i]);
				};
			}	
			function validateFields(fields,method,message){
				for (var i=0; i < fields.length; i++) {
					var field = fields[i]
					if(field.value.length == 0){continue;}
					if(!method(field)){
						createAlert(field,message);
						errors=true;
					}
				};
			}
			removeAlerts(form);
			var errors = false;
			// check required fields
			var reqInput = YAHOO.util.Dom.getElementsByClassName('required','input',form);
			var reqSelect =  YAHOO.util.Dom.getElementsByClassName('required','select',form);
			var required = reqInput.concat(reqSelect);
			for (var i=0; i < required.length; i++) {
				req = required[i];
				if(req.value.length == 0){
					createAlert(req,"Required Field")
					errors=true;
				}
			};
			// validate content of completed fields
			var numFields = YAHOO.util.Dom.getElementsByClassName('numeric','input',form)
				validateFields(numFields,this.isNumeric," Entry must contain numbers only! ");
			var alphaFields = YAHOO.util.Dom.getElementsByClassName('alpha','input',form)
				validateFields(alphaFields,this.isAlphabet," Entry must contain letters only! ");
			var alphanumFields = YAHOO.util.Dom.getElementsByClassName('alphanum','input',form)
				validateFields(alphanumFields,this.isAlphanumeric," Entry must contain numbers and letters only! ");

			var varcharFields = YAHOO.util.Dom.getElementsByClassName('varchar','input',form)
				//validateFields(varcharFields,this.illegalChars," Entry invalid, please remove any quotes, ampersands, brackets, etc. ");

			var emailFields = YAHOO.util.Dom.getElementsByClassName('email','input',form)
				validateFields(emailFields,this.emailValidator," Please enter a valid email address! ");
			var phoneFields = YAHOO.util.Dom.getElementsByClassName('phone','input',form)
				validateFields(phoneFields,this.phoneValidator," Please enter a valid 10-digit phone number! ");
			var zipcodeFields = YAHOO.util.Dom.getElementsByClassName('zipcode','input',form)
				validateFields(zipcodeFields,this.zipcodeValidator," Please enter a valid zip code! ");
	
			if(!errors){
				return true;
			}else{
				return false;
			}
		},
		// value validation functions
		isNumeric:function(elem){
			var numericExpression = /^[0-9]+$/;
			if(elem.value.match(numericExpression)){
				return true;
			}else{
				return false;
			}
		},
		isAlphabet:function(elem){
			var alphaExp = /^[0-9a-zA-Z\s]+$/;
			if(elem.value.match(alphaExp)){
				return true;
			}else{
				return false;
			}
		},
		isAlphanumeric:function(elem){
			var alphaExp = /^[0-9a-zA-Z\s]+$/;
			if(elem.value.match(alphaExp)){
				return true;
			}else{
				return false;
			}
		},
		lengthRestriction:function(elem, min, max){
			var uInput = elem.value;
			if(uInput.length >= min && uInput.length <= max){
				return true;
			}else{
				return false;
			}
		},
		emailValidator:function(elem){
			var emailExp = /^[\w\-\.\+]+\@[a-zA-Z0-9\.\-]+\.[a-zA-z0-9]{2,4}$/;
			if(elem.value.match(emailExp)){
				return true;
			}else{
				return false;
			}
		},
		zipcodeValidator:function(elem) {
			var zipExp = /(^\d{5}$)|(^\d{5}-\d{4}$)/;
			if(elem.value.match(zipExp)){
				return true;
			}else{
				return false;
			}
		},
		phoneValidator:function(elem){
			var val = elem.value;
			var phoneExp = /^[0-9]{10}$/;
			val = val.replace(/[^0-9]/g,"");
			if(val.match(phoneExp)){
				return true;
			}else{
				return false;
			}
		},
		// cleanup functions
		htmlentities:function( string ){
	    // http://kevin.vanzonneveld.net
	    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	    // +   improved by: nobbler
	    // +    tweaked by: Jack
	    // %          note: table from http://www.the-art-of-web.com/html/character-codes/
	    // *     example 1: htmlentities('Kevin & van Zonneveld');
	    // *     returns 1: 'Kevin &amp; van Zonneveld'
    
	    var histogram = {}, code = 0, tmp_arr = [], i = 0;
	    var stringl = 0;
    
	    histogram['34'] = 'quot';
	    histogram['38'] = 'amp';
	    histogram['60'] = 'lt';
	    histogram['62'] = 'gt';
	    histogram['160'] = 'nbsp';
	    histogram['161'] = 'iexcl';
	    histogram['162'] = 'cent';
	    histogram['163'] = 'pound';
	    histogram['164'] = 'curren';
	    histogram['165'] = 'yen';
	    histogram['166'] = 'brvbar';
	    histogram['167'] = 'sect';
	    histogram['168'] = 'uml';
	    histogram['169'] = 'copy';
	    histogram['170'] = 'ordf';
	    histogram['171'] = 'laquo';
	    histogram['172'] = 'not';
	    histogram['173'] = 'shy';
	    histogram['174'] = 'reg';
	    histogram['175'] = 'macr';
	    histogram['176'] = 'deg';
	    histogram['177'] = 'plusmn';
	    histogram['178'] = 'sup2';
	    histogram['179'] = 'sup3';
	    histogram['180'] = 'acute';
	    histogram['181'] = 'micro';
	    histogram['182'] = 'para';
	    histogram['183'] = 'middot';
	    histogram['184'] = 'cedil';
	    histogram['185'] = 'sup1';
	    histogram['186'] = 'ordm';
	    histogram['187'] = 'raquo';
	    histogram['188'] = 'frac14';
	    histogram['189'] = 'frac12';
	    histogram['190'] = 'frac34';
	    histogram['191'] = 'iquest';
	    histogram['192'] = 'Agrave';
	    histogram['193'] = 'Aacute';
	    histogram['194'] = 'Acirc';
	    histogram['195'] = 'Atilde';
	    histogram['196'] = 'Auml';
	    histogram['197'] = 'Aring';
	    histogram['198'] = 'AElig';
	    histogram['199'] = 'Ccedil';
	    histogram['200'] = 'Egrave';
	    histogram['201'] = 'Eacute';
	    histogram['202'] = 'Ecirc';
	    histogram['203'] = 'Euml';
	    histogram['204'] = 'Igrave';
	    histogram['205'] = 'Iacute';
	    histogram['206'] = 'Icirc';
	    histogram['207'] = 'Iuml';
	    histogram['208'] = 'ETH';
	    histogram['209'] = 'Ntilde';
	    histogram['210'] = 'Ograve';
	    histogram['211'] = 'Oacute';
	    histogram['212'] = 'Ocirc';
	    histogram['213'] = 'Otilde';
	    histogram['214'] = 'Ouml';
	    histogram['215'] = 'times';
	    histogram['216'] = 'Oslash';
	    histogram['217'] = 'Ugrave';
	    histogram['218'] = 'Uacute';
	    histogram['219'] = 'Ucirc';
	    histogram['220'] = 'Uuml';
	    histogram['221'] = 'Yacute';
	    histogram['222'] = 'THORN';
	    histogram['223'] = 'szlig';
	    histogram['224'] = 'agrave';
	    histogram['225'] = 'aacute';
	    histogram['226'] = 'acirc';
	    histogram['227'] = 'atilde';
	    histogram['228'] = 'auml';
	    histogram['229'] = 'aring';
	    histogram['230'] = 'aelig';
	    histogram['231'] = 'ccedil';
	    histogram['232'] = 'egrave';
	    histogram['233'] = 'eacute';
	    histogram['234'] = 'ecirc';
	    histogram['235'] = 'euml';
	    histogram['236'] = 'igrave';
	    histogram['237'] = 'iacute';
	    histogram['238'] = 'icirc';
	    histogram['239'] = 'iuml';
	    histogram['240'] = 'eth';
	    histogram['241'] = 'ntilde';
	    histogram['242'] = 'ograve';
	    histogram['243'] = 'oacute';
	    histogram['244'] = 'ocirc';
	    histogram['245'] = 'otilde';
	    histogram['246'] = 'ouml';
	    histogram['247'] = 'divide';
	    histogram['248'] = 'oslash';
	    histogram['249'] = 'ugrave';
	    histogram['250'] = 'uacute';
	    histogram['251'] = 'ucirc';
	    histogram['252'] = 'uuml';
	    histogram['253'] = 'yacute';
	    histogram['254'] = 'thorn';
	    histogram['255'] = 'yuml';
    
	    stringl = string.length
	    for (i = 0; i < stringl; ++i) {
	        code = string.charCodeAt(i);
	        if (code in histogram) {
	            tmp_arr[i] = '&'+histogram[code]+';';
	        } else {
	            tmp_arr[i] = string.charAt(i);
	        }
	    }
    
	    return tmp_arr.join('');
	},
	htmlspecialchars:function(string, quote_style) {
	    // http://kevin.vanzonneveld.net
	    // +   original by: Mirek Slugen
	    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	    // +   bugfixed by: Nathan
	    // +   bugfixed by: Arno
	    // *     example 1: htmlspecialchars("<a href='test'>Test</a>", 'ENT_QUOTES');
	    // *     returns 1: '&lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;'
    
	    string = string.toString();
    
	    // Always encode
	    string = string.replace(/&/g, '&amp;');
	    string = string.replace(/</g, '&lt;');
	    string = string.replace(/>/g, '&gt;');
    
	    // Encode depending on quote_style
	    if (quote_style == 'ENT_QUOTES') {
	        string = string.replace(/"/g, '&quot;');
	        string = string.replace(/'/g, '&#039;');
	    } else if (quote_style != 'ENT_NOQUOTES') {
	        // All other cases (ENT_COMPAT, default, but not ENT_NOQUOTES)
	        string = string.replace(/"/g, '&quot;');
	    }
    
	    return string;
	}
}
