UTIL = {
	mask : function(v, m) {
		if (m == v || (m == null) || m.length <= 0 || typeof m != "string" || v==null || v.length <= 0) return v;
		
		var x = m.split('').sort().join('').replace(/(.)\1+/gi,'$1').replace(/[^A-Z0-9]/gi,'');
		var z = new RegExp("["+x+"]","gi");
		var m = m.replace(z,"X"), l = (m = m.split("")).length, s = v.split(""), j = 0, h = "";
		for(var i = -1; ++i < l;)
		if(m[i] != "X"){
			if(m[i] == "\\" && (h += m[++i])) continue;
			h += m[i];
			i + 1 == l && (s[j - 1] += h, h = "");
		}
		else{
			if(!s[j] && !(h = "")) break;
			(s[j] = h + s[j++]) && (h = "");
		}
		return s.join("") + h;
	},
	
	inArray : function (a, b) {
		for(var l=0; l < a.length; l++) {
			if (a[l] == b) return l;
		}
		return -1;
	},
	
    /* Returns an Array or scalar value based on the object sent */
	getValue : function(o, mask) {
		var v; 
		if (typeof o == "object" && (o != null && o.type)) {
			switch (o.type) {
				case "password" :
				case "hidden" : 
				case "image" : 
				case "text" : 
					if (mask && mask.length > 0 && o.value != mask) {
			   			return  UTIL.mask(o.value, mask);
					} 
					return o.value; 
				case "select-one" : 
				case "select-multiple" : 
					var s = new Array();
					for (var i = 0; i < o.options.length; i++)
					{
						if (o.options[i].selected) {
						    s.push(o.options[i].value);
						}
					}
					if (s.length == 1) return s[0]; 
					else if (s.length > 1) return s.slice();
					else return null; 
				case "radio" :
				case "checkbox" : 
					return (o.checked) ? o.value : null; 
			}
		} else if (typeof o == "object" && (o != null && o.length)) {
			for(var i = 0; i < o.length; i++) {
				var t = UTIL.getValue(o[i]); 
				if (t != null) {
					if (!v)  v = new Array();
					if ((t == null || t.constructor.toString().indexOf("Array") == -1))
					    v.push(t); 
					else
						v = v.concat(t);
				}
			}
		} else { 
			v = UTIL.mask(o, mask); 
		}

		/* it is a array */
		return (typeof v == "object") ? ( (v.length > 1) ? v.slice() : ((v.length == 1) ? v[0] : null) ) : v
	},

    /* Returns an Array or scalar value based on the object sent */
	getSplitValue : function(o, deli) {
		var o = (typeof o != "object") ? document.getElementById(o) : o;
//alert(o.name);
		if (!o.form) return "";
		
		var f = o.form;
		var v = o.name;
		
		if (v.substring(0,1) != "_") return "";

		var retval = "", deli = (deli == null) ? "" : deli;
		
		var cnt = v.split(/[^0-9]/).pop();
		var re  = new RegExp(cnt+"$");
		var itm = v.replace(/^_/,'').replace(re, '');

		for (var i=1; i < parseInt(cnt); i++) {
			retval += f.elements[itm + i].value + deli;
		}

		retval += f.elements[v].value;

		if (deli.length > 0)
			retval = (retval.replace(new RegExp(deli,"g"),"").length == 0) ? "" : retval;

		return retval;
	},

	isEmpty: function(v) {
		var v = UTIL.getValue(v);
		return (v == null || v.length == 0);
	},
	
	isLen: function(v, l) {
	    var v = UTILS.getValue(v);
		return (v && v.length == l);
	},

	isChecked : function(o) {
		if (o.length) {
			for(var i=0, j=o.length; i < j; i++) {
				if(o[i].checked) return true;
			}
		}
		else if (o.checked) return true;
		return false;
	},
	
	isSelected : function(o) {	
		return (o.selectedIndex == -1) ? false : true;
	},
	
	isSsn: function (v, mask) {
		var v = UTIL.getValue(v, mask);
		return /^\d{3}-?\d{2}-?\d{4}$/.test(v);
	},
	
	isPhone: function (v, mask) {
		var v = UTIL.getValue(v, mask);
		return /^\d{3}-?\d{3}-?\d{4}$/.test(v);
	},

	isZip: function(v, mask) {
		var v = UTIL.getValue(v, mask);
		return /^\d{5}$|^\d{5}-\d{4}$/.test(v);
	},
	
	isEmail: function(v) {
		var v = UTIL.getValue(v);
		var re = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
		return re.test(v);
	},
	
	isDate: function(v, mask) {
		//Modified to check a validate to be in the range of (last 120 years - any future date)
		var v = UTIL.getValue(v, mask);				
		if(v.length<10) return false;
		var re = /^(?=\d)(?:(?:(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})|(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2}))($|\ (?=\d)))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$/;
		var valid = re.test(v);
		if(valid){
			var one_day=1000*60*60*24;
			var thisDate = new Date();
			var today = new Date();
			today.setTime(Date.parse(enroll.today()));
			thisDate.setTime(Date.parse(v.replace(/-/,"/").replace(/-/,"/") ));
			var numberOfDays=(today.getTime()-thisDate.getTime())/one_day;
			var years = Math.floor(numberOfDays/365);		
			if(years>120) valid = false;
		}
		return valid;
	},

	isNumber: function(v, mask) {
		var v = UTIL.getValue(v, mask);
		return !isNan(v);
	},

	isAlpha: function(v) {
		var v = UTIL.getValue(v);
		return /[a-zA-Z]/g.test(v);
	},

	isAlphanumeric: function(v) {
		var v = UTIL.getValue(v);
		return /^[0-9A-Za-z]+$/.test(v);
	},

	isEq: function(v, a) {
		var v = UTIL.getValue(v);
		var a = UTIL.getValue(a)		
		return (v == a);
	},

	isNe: function(v, a) {
		var v = UTIL.getValue(v);
		var a = UTIL.getValue(a)		
		return (v != a);
	},

	isLt: function(v, a) {
		var v = UTIL.getValue(v);
		var a = UTIL.getValue(a)		
		return (v < a);
	},

	isGt: function(v, a) {
		var v = UTIL.getValue(v);
		var a = UTIL.getValue(a)		
		return (v > a);
	},

	isGe: function(v, a) {
		var v = UTIL.getValue(v);
		var a = UTIL.getValue(a)
		return (v >= a);
	},
	
	isLe: function(v, a) {
		var v = UTIL.getValue(v);
		var a = UTIL.getValue(a)		
		return (v <= a);
	},

	isMaxlen: function(v, l) {
		var v = UTIL.getValue(v);
		return (v.length < parseInt(l,10));
	},		

	isMinlen: function(v, l) {
		var v = UTIL.getValue(v);
		return (v.length >= parseInt(l,10));
	},
	
	isDob: function(v, mask) {
		var v = UTIL.getValue(v, mask);
		var re = /^(?=\d)(?:(?:(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})|(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2}))($|\ (?=\d)))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$/;
		var valid = re.test(v);
		if(valid){
			var one_day=1000*60*60*24;
			var thisDate = new Date();
			var today = new Date();
			today.setTime(Date.parse(enroll.today()));
			thisDate.setTime(Date.parse(v.replace(/-/,"/").replace(/-/,"/") ));
			var numberOfDays=(today.getTime()-thisDate.getTime())/one_day;
			var years = Math.floor(numberOfDays/365);			
			//alert(numberOfDays/365+" Years, floor "+years+' Years');			
			if(years>120) valid = false;
		}
		return valid;
	},
	
	isMedicareYear: function(v) {
		var v = UTIL.getValue(v);
		year = v.substr(4, 8);
		if(v!=null && v.length==8 && year != 'YYYY'){
			if(year< 2009 || year>2020) return false;
		}
		return true;
	}
}
