/*
 * JavaScript form validation functions for jQuery 1.2
 * Most functions return the matching values.  If a true argument
 * is passed to the function, it will return a bool instead.
 */

(function($){
	var temp = {
		isBlank : function(b) {
			return this.isEmpty(b);
		},
		isEmpty : function(b) {
			var retVal = [];
			this.each(function(){
				if(this.value.replace(/[\s]*/g,"") === ""){retVal.push(this);}
			});
			return (!b)?$(retVal):!!retVal.length;
		},
		isSpacey : function(b) {
			var retVal = [];
			this.each(function(){
				if(this.value.replace(/[\s]*/g,"") != this.value){retVal.push(this);}
			});
			return (!b)?$(retVal):!!retVal.length;
		},
		isTooShort : function(num,b) {
			var retVal = [];
			this.each(function(){
				if(this.value.length < num){retVal.push(this);}
			});
			return (!b)?$(retVal):!!retVal.length;
		},
		isTooLong : function(num,b) {
			var retVal = [];
			this.each(function(){
				if(this.value.length > num){retVal.push(this);}
			});
			return (!b)?$(retVal):!!retVal.length;
		},
		isNotANumber : function(b){
			var retVal = [];
			this.each(function(){
				if(isNaN(this.value)){retVal.push(this);}
			});
			return (!b)?$(retVal):!!retVal.length;
		},
		isChecked : function(b){
			var retVal = this.filter(":checked");
			return (!b)?retVal:!!retVal.length;
		},
		isSelected : function(){
			return (this[0].options[index].selected);
		},
		isAnySelected : function(b){
			var retVal = this.filter(":selected");
			return (!b)?retVal:!!retVal.length;
		},
		isIndexOf : function(str,b){
			var retVal = this.filter("[value*="+str+"]");
			return (!b)?retVal:!!retVal.length;
		},
		isSelectedRange : function(loLimit,hiLimit){
			// works with numerically-valued select options only!
			return (this[0].selectedIndex >= loLimit && this[0].selectedIndex < upLimit);
		},
		isNotZip : function(b){
			var retVal = [];
			this.each(function(){
				if(this.value.length == 5){
					if(isNaN(this.value)){retVal.push(this);}
				} 
				else if(this.value.length < 5) {retVal.push(this);} 
				else if( 
					this.value.replace(/[^0-9]*/g,"").length != 9 ||
					this.value.substring(5,6) != '-'
				){retVal.push(this);}
			});
			return (!b)?$(retVal):!!retVal.length;
		},
		isNotUSPhone : function(b){
			var retVal = [];
			this.each(function(){
				if(this.value.replace(/[^0-9]*/g,"").length != 10) {retVal.push(this);}
			});
			return (!b)?$(retVal):!!retVal.length;
		},
		isNotEmail : function(b) {
			var retVal = [];
			this.each(function(){
				if(!(/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(([a-zA-Z0-9]{2,3})|(aero|coop|info|museum|name))$/.test(this.value))) {
					retVal.push(this);
				}
			});
			return (!b)?$(retVal):!!retVal.length;
		},
		isNotValidCCNum : function(b) {
			var retVal = [];
			this.each(function(){
				var cnum = onlyNumbers(this.value);
				var lgth = cnum.length;
				if (lgth > 19) {retVal.push(this);}
				else if (lgth < 15) {retVal.push(this);}
				else {
					// validate number
					tally = 0; multTemp = 0; 
					lengthCheck = lgth % 2;
					if (lengthCheck == 0) { counter = 2; } else { counter = 1; }
					for (i = 0; i < lgth; i++) {
						tempNumb = parseInt(cnum.charAt(i));
						multTemp = tempNumb * counter;
						if (multTemp >= 10) {
							multTemp2 = parseInt(multTemp.charAt(0)) + parseInt(multTemp.charAt(multTemp.length));
							multTemp = multTemp2;
						}
						tally += multTemp; multTemp = 0;
						if (counter == 1) {counter = 2;} else {counter = 1;}
					}
					if (tally % 10 != 0) {retVal.push(this);}
				} 
			});
			return (!b)?$(retVal):!!retVal.length;
		},
		isNotDateWithSlash : function(b) {
			var retVal = [];
			this.each(function(){
				var a = this.value.split("/");
				if(a.length != 3) {retVal.push(this); return;}
				if(isNaN(a[0]) || a[0] < 1 || a[0] > 12){retVal.push(this); return;}
				if(isNaN(a[1]) || a[1] < 1 || a[1] > 31){retVal.push(this); return;}
				if(isNaN(a[2]) || a[2] < 1800 || a[2] > 2500){retVal.push(this); return;}
				if ((a[0]==4 || a[0]==6 || a[0]==9 || a[0]==11) && a[1]==31){
					retVal.push(this); return;
				}
				if (a[0]==2 ) {
					if(a[1]>29){retVal.push(this); return;}
					if ( a[1]==29 && !!(a[2]%4 ||( !(a[2]%100) && (a[2]%400))) ) {
						retVal.push(this); return;
					}
				}
			});
			return (!b)?$(retVal):!!retVal.length;
		},
		isValid : function(func) {
			var temp = [];
			for( var i = 1, l = arguments.length ; i<l; i++ ) {
				temp[i-1] = arguments[i];
			}
			return this[func].apply(this,temp);
		},
		insertErrorAfter : function(str) {
			if(this.next('.erroricon')[0]) {return this;}
			this.after(
				'<div class="erroricon"><img src="'+configure.imgDir+'icon-error.gif" alt="error!" /></div>'+
				'<br />'+
				'<span class="errormessage" >'+str+'</span>'
			);
			return this;
		},
		clearErrorAfter : function() {
			this.next(".erroricon").remove().end()
				.next('br').remove().end()
				.next('.errormessage').remove();
			return this;
		},
		insertErrorInDiv : function(str) {
			if(!($(this)[0])){return this;}
			if ($.trim($(this)[0].innerHTML) == '') {
				if (str === undefined) {
					str = "<strong>There was a problem processing your information.</strong> Please check the fields flagged below for accuracy. ";
				}
				this.append(
					"<div class=\"inner-error\">"+
						"<img src='" + configure.imgDir + "icon-error-rev.gif' alt='Error!' />" + str+
					"</div>"
				);
			}
			$(this).show().fadeTo("fast", 0.0).fadeTo("fast", 0.7).fadeTo("fast", 0.3).fadeTo("fast", 1);
			window.location.hash = 'top';
			return this;
		},
		clearErrorInDiv : function(id,div) {
			if(div === undefined){div = '#errdiv';}
			$("e_"+id).remove();
			return this;
		}
	}
	$.extend($.fn,temp);
})(jQuery);
