//this is just a grouping of reusable JavaScript functions.

////////    TABLE OF CONTENTS   ////////
/*
      $
      VISIBILITY TOGGLE
      FORCE NUMERIC ENTRY
      DATE VALIDATION
      EMAIL VALIDATION
      GET ELEMENTS BY CLASS NAME
      CURSOR POSITION GRABBING
*/
////////////////////////////////////////

/////PROTOTYPE DOLLAR$IGN FUNCTION/////
    // use in place of the tedious document.getElementById
    //example: document.getElementById("startDate") = $("startDate")
function $() {
	var elements = new Array();
	for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if (typeof element == 'string')
			element = document.getElementById(element);
		if (arguments.length == 1)
			return element;
		elements.push(element);
	}
	return elements;
}


/////VISIBILITY TOGGLE/////
    // just send the object id in
function toggle(obj) {
	var el = $(obj);
	if ( el.style.display != 'none' ) {
		el.style.display = 'none';
	}
	else {
		el.style.display = 'block';
	}
}

/////FORCE NUMERIC ENTRY/////
    //example: onkeypress="return isNumberKey(event)" 
    //change 48 to 47 to allow '/', to 46 to allow '.', to 45 to allow '-'
function isNumberKey(evt){
    var charCode = (evt.which) ? evt.which : event.keyCode
    if (charCode > 31 && (charCode < 47 || charCode > 57)){  
          return false;
    }

         return true;
}

/////DATE VALIDATION///////
    //example : onblur="ValidateDate(this)";
    //              -OR-
    // if(document.getElementById("dateRequired").value!=""){
    //      if(ValidateDate(document.getElementById("dateRequired"))==false){
    //      return false;
    //      }
    //  }

function daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31;
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this;
}

function isDate(dtStr){
	var dtCh= "/";
	var minYear=1900;
	var maxYear=2100;   //in case of smalldatetime, change to 2075
	var daysInMonth = DaysArray(12);
	var pos1=dtStr.indexOf(dtCh);
	var pos2=dtStr.indexOf(dtCh,pos1+1);
	var strMonth=dtStr.substring(0,pos1);
	var strDay=dtStr.substring(pos1+1,pos2);
	var strYear=dtStr.substring(pos2+1);
	strYr=strYear;
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
	}
	month=parseInt(strMonth)
	day=parseInt(strDay);
	year=parseInt(strYr);
	if (pos1==-1 || pos2==-1){
		alert("The date format should be : mm/dd/yyyy");
		return false;
	}
	if (strMonth.length<1 || month<1 || month>12){
		alert("Please enter a valid month");
		return false;
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		alert("Please enter a valid day");
		return false;
	}
	if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
		alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear);
		return false;
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1){ // || isInteger(stripCharsInBag(dtStr, dtCh))==false){
		alert("Please enter a valid date");
		return false;
	}
return true
}

function ValidateDate(testField){
	var dt=testField;
	if (isDate(dt.value)==false){
		dt.focus()
		return false;
	}
    return true;
 }
 
 /////EMAIL VALIDATION///////
 function validEmail(email) {
			//list invalid characters
			var invalidChars = " /:,;";

			
			//check for blank field		
			if (email == "") {
				return false;
			}
			//check for presence of invalid characters
			for (var k=0; k<invalidChars.length; k++) {
				var badChar = invalidChars.charAt(k);
				if (email.indexOf(badChar) > -1) {
					return false;
				}
			}
			//check for presence of @ symbol
			var atPos = email.indexOf("@",1);
			if (atPos == -1) {
				return false;
			}
			//check for presence of ONLY ONE @ symbol
			if (email.indexOf("@",atPos+1) != -1) {
				return false;
			}
			//check for presence of a period after the @ symbol
			var periodPos = email.indexOf(".",atPos);
			if (periodPos == -1) {	
				return false;
			}
			//check to make sure at least 2 char follow period
			if (periodPos+3 > email.length)	{
				return false;
			}
			return true;
}


 /////GET ELEMENTS BY CLASSNAME///////
/*
Developed by Robert Nyman, http://www.robertnyman.com
Code/licensing: http://code.google.com/p/getelementsbyclassname/

Use in like getElementById, but will get all items of a particular class and
pull into an array
ex.     var allLinks = getElementsByClassName("storename","a");
                        or
        var allLinks = getElementsByClassName("storename");                       
*/
var getElementsByClassName = function(className, tag, elm) {
    if (document.getElementsByClassName) {
        getElementsByClassName = function(className, tag, elm) {
            elm = elm || document;
            var elements = elm.getElementsByClassName(className),
			nodeName = (tag) ? new RegExp("\\b" + tag + "\\b", "i") : null,
			returnElements = [],
			current;
            for (var i = 0, il = elements.length; i < il; i += 1) {
                current = elements[i];
                if (!nodeName || nodeName.test(current.nodeName)) {
                    returnElements.push(current);
                }
            }
            return returnElements;
        };
    }
    else if (document.evaluate) {
        getElementsByClassName = function(className, tag, elm) {
            tag = tag || "*";
            elm = elm || document;
            var classes = className.split(" "),
			classesToCheck = "",
			xhtmlNamespace = "http://www.w3.org/1999/xhtml",
			namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace) ? xhtmlNamespace : null,
			returnElements = [],
			elements,
			node;
            for (var j = 0, jl = classes.length; j < jl; j += 1) {
                classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
            }
            try {
                elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
            }
            catch (e) {
                elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
            }
            while ((node = elements.iterateNext())) {
                returnElements.push(node);
            }
            return returnElements;
        };
    }
    else {
        getElementsByClassName = function(className, tag, elm) {
            tag = tag || "*";
            elm = elm || document;
            var classes = className.split(" "),
			classesToCheck = [],
			elements = (tag === "*" && elm.all) ? elm.all : elm.getElementsByTagName(tag),
			current,
			returnElements = [],
			match;
            for (var k = 0, kl = classes.length; k < kl; k += 1) {
                classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
            }
            for (var l = 0, ll = elements.length; l < ll; l += 1) {
                current = elements[l];
                match = false;
                for (var m = 0, ml = classesToCheck.length; m < ml; m += 1) {
                    match = classesToCheck[m].test(current.className);
                    if (!match) {
                        break;
                    }
                }
                if (match) {
                    returnElements.push(current);
                }
            }
            return returnElements;
        };
    }
    return getElementsByClassName(className, tag, elm);

}


/////CURSOR POSITION GRABBING///////
/*
    gets the current position of the mouse cursor including any scrolling.
    cross-browser compatible.
    
    ex.  var Ypos = mouseY(evt);
         var Xpos = mouseX(evt)
*/
function mouseY(evt) {
if (evt.pageY) return evt.pageY;
else if (evt.clientY)
   return evt.clientY + (document.documentElement.scrollTop ?
   document.documentElement.scrollTop :
   document.body.scrollTop);
else return null;
}

function mouseX(evt) {
if (evt.pageX) return evt.pageX;
else if (evt.clientX)
   return evt.clientX + (document.documentElement.scrollLeft ?
   document.documentElement.scrollLeft :
   document.body.scrollLeft);
else return null;
}