//modal popup window
var popWin = '';
function popWindow(file, height, width){
	popWin = window.open(file, 'help', 'height=' + height + ', width=' + width + ', resizable, scrollbars=yes, modal=yes, dialog=yes, menubar=yes');
	popWin.moveTo(20,20);
	popWin.focus();	
}

/////////////////begin form validation code/////////////////////

//form validation - multiple form inputs
	//uses validateInput() for each input
	//returns true or false
	//displays any failure message
	//form is the name of the form
	//validate format: input name=friendly name=test=required
		//leave the 'test' parameter blank or 'nada' to allow field to be required only - no test
		//example: validateForm('Form1', 'per_email=Email Address=email=true,cas_uid=Case Number=integer=false,fromdate=From Date=date=false,todate=To Date=date=true')
	//
function validateForm(form, validate){
	var oInput, sName, sTest, bReq, msg = "";
	var pairs = validate.split(",");
	for(i in pairs){
		oInput = eval("document." + form + ".elements['" + pairs[i].split("=")[0] + "']");
//		oInput = eval("document.getElementById('" + pairs[i].split("=")[0] + "')");
		sName = pairs[i].split("=")[1];
		sTest = pairs[i].split("=")[2];
		bReq = eval(pairs[i].split("=")[3]);
		msg += validateInput(oInput, sName, sTest, bReq);
	}
	if(msg != ""){
		alert(msg);
		return false;
	}
	return true;
}

//form validation - single form input
	//returns empty string '' upon success
	//rerturns error message upon failure
	//oInput is form input object, sName is friendly name of input, sTest is the test to perfom, bReq is true if input is required
		//example: validateInput(per_email, 'Email Address', 'email', true)
function validateInput(oInput, sName, sTest, bReq){
    var rTest = "";
    var sVal = oInput.value;
//    try {var sVal = oInput.value;}
//    catch(e) {alert(sName)}
    if(sVal == "" && !bReq){return rTest;}
    if(sVal == "" && bReq){return sName + ": This field is required.\n";}
    if(sTest == "date"){rTest = validateDate(oInput.value);}
    if(sTest == "time"){rTest = validateTime(oInput.value);}
    if(sTest == "money"){rTest = validateMoney(oInput.value);}
    if(sTest == "email"){rTest = validateEmail(oInput.value);}
    if(sTest == "zip"){rTest = validateZipCode(oInput.value);}
    if(sTest == "integer"){rTest = validateInteger(oInput.value);}
    if(sTest == "numeric"){rTest = validateNumeric(oInput.value);}
    if(sTest == "ssn"){rTest = validateSSN(oInput.value);}
    if(sTest == "group"){rTest = validateGroup(oInput);}
    if(sTest == "path"){rTest = validatePath(oInput.value);}
    if(sTest == "message"){return sName + "\n";}
    if(sTest == "url"){rTest = validateURL(oInput.value);}
    if(sTest == "phone"){rTest = validatePhone(oInput.value);}
    if(sTest == "phone2"){rTest = validatePhone2(oInput.value);}
    if(sTest == "card"){rTest = validateCard(oInput.value);}
    if(sTest == "expdate"){rTest = validateExpiraton(oInput.value);}
    if(sTest == "character"){rTest = validateCharacter(oInput.value);}
    if(rTest != ""){rTest = sName + ": " + rTest + "\n"}
    return rTest;
}

// validation functions used by validateInput() above
//
function validateCharacter(sVal){
	if(sVal.search(/[^\w|^\d|^\s]/) != -1){
		return "This field accepts alphanumeric characters only.";
	}
	return "";
}

function validateCard(sVal){
	type = document.getElementById("pay_card_type").value;
   if (type == "Visa") {
      // Visa: length 16, prefix 4, dashes optional.
      var re = /^4\d{3}-?\d{4}-?\d{4}-?\d{4}$/;
   } else if (type == "Master Card") {
      // Mastercard: length 16, prefix 51-55, dashes optional.
      var re = /^5[1-5]\d{2}-?\d{4}-?\d{4}-?\d{4}$/;
   } else if (type == "Discover") {
      // Discover: length 16, prefix 6011, dashes optional.
      var re = /^6011-?\d{4}-?\d{4}-?\d{4}$/;
   } else if (type == "American Express") {
      // American Express: length 15, prefix 34 or 37.
      var re = /^3[47]\d{13}$/;
   } else if (type == "Diners") {
      // Diners: length 14, prefix 30, 36, or 38.
      var re = /^3[068]\d{12}$/;
   } else {
   	  // 16 digits as default
   	  var re = /^\d{16}$/;
   }
   if (!re.test(sVal)) return "This card number is not valid (mask).\nPlease do not include spaces or dashes within your card number, also please verify you have the correct card type selected";
   // Remove all dashes for the checksum checks to eliminate negative numbers
   sVal = sVal.split("-").join("");
   // Checksum ("Mod 10")
   // Add even digits in even length strings or odd digits in odd length strings.
   var checksum = 0;
   for (var i=(2-(sVal.length % 2)); i<=sVal.length; i+=2) {
      checksum += parseInt(sVal.charAt(i-1));
   }
   // Analyze odd digits in even length strings or even digits in odd length strings.
   for (var i=(sVal.length % 2) + 1; i<sVal.length; i+=2) {
      var digit = parseInt(sVal.charAt(i-1)) * 2;
      if (digit < 10) { checksum += digit; } else { checksum += (digit-9); }
   }
   if ((checksum % 10) == 0) return ""; else return "This card number is not valid (checksum).";
}

function validateExpiraton(sVal){
    var reDatePat = /^(\d{1,2})(\/|-)(\d{1,2})$/;
    var OmatchArray = sVal.match(reDatePat);
	var d=new Date();
    if (OmatchArray == null) {
        return "This field require a valid mm/yy format.";
    }
	else {
		var strExp = sVal.split("/");
		if(strExp[0] < 1 || strExp[0] > 12) {
	        return "Month must be between 1 and 12.";
		}
		if(strExp[1] < 1 || strExp[1] > 12) {
	        return "Year must be within a valid range.";
		}

		var e = new Date(strExp[0]+"/01/20"+strExp[1]);
		e.setMonth(e.getMonth()+1);
		e.setMinutes(e.getMinutes()-1);
		if(e < d) {
	        return "Expiraton date is not valid.";
		}
	}
	return "";
}


function validatePhone(sVal){			
//    var rePat1 = /(^\d{10}$)|(^\d{3}-\d{7}$)|(^\d{3}-\d{3}-\d{4}$)/;
    var rePat1 = /(^\d{3}-\d{3}-\d{4}$)/;
    var OmatchArray1 = sVal.match(rePat1);
    if (OmatchArray1 == null) {
        return "A valid phone is required.";
    }
    return "";
} 

function validatePhone2(sVal){			
    var rePat1 = /(^\d{10}$)|(^\d{3}-\d{7}$)|(^\d{3}-\d{3}-\d{4}$)|(^\(\d{3}\)\d{3}-\d{4}$)/;
    var OmatchArray1 = sVal.match(rePat1);
    if (OmatchArray1 == null) {
        return "A valid phone is required.";
    }
    return "";
} 

function validateURL(sVal){			
    var rePat = /^(http:\/\/)/;
    var bln = rePat.test(sVal);
    if(!bln){return "Require http:// format.";}    
    return "";
} 

function validateDate(sVal){
    var reDatePat = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
    var OmatchArray = sVal.match(reDatePat);
    if (OmatchArray == null) {
        return "all dates require a valid mm/dd/yyyy or mm-dd-yyyy date format.";
    }
    else{
        var strError = "";
        var strMonth = OmatchArray[1]; // parse date into variables
        var strDay = OmatchArray[3];
        var strYear = OmatchArray[5];
        if(strMonth < 1 || strMonth > 12) { // check month range
            strError="Month must be between 1 and 12.";
        }
        if(strDay < 1 || strDay > 31) {
			if(strError != ""){strError += ", ";}
            strError += "Day must be between 1 and 31.";
        }
        if((strMonth==4 || strMonth==6 || strMonth==9 || strMonth==11) && strDay==31) {
			if(strError != ""){strError += ", ";}
            strError += "Month "+strMonth+" doesn't have 31 days.";
        }
        if(strMonth == 2) { // check for february 29th
            var blnIsleap = (strYear % 4 == 0 && (strYear % 100 != 0 || strYear % 400 == 0));
            if (strDay>29 || (strDay==29 && !blnIsleap)) {
				if(strError != ""){strError += ", ";}
                strError += "February " + strYear + " doesn't have " + strDay + " days.";
            }
        }
        if(strYear < 1900 || strYear > 9999) {	//restrict year (mostly for sql)
			if(strError != ""){strError += ", ";}
            strError += "Year must be within a valid range.";
        }
        if(strError != ""){
            return strError;
        }
    }
    return "";
}

function validateTime(sVal){
    var reDatePat = /^(\d{1,2})(\:)(\d{1,2})$/;
    var OmatchArray = sVal.match(reDatePat);

    if (OmatchArray == null) {
		return "all times require a valid HH:MM time format.";
	}
	else {
        var strError = "";
        var strHour = OmatchArray[1]; // parse date into variables
        var strMinute = OmatchArray[3];

        if(strHour < 0 || strHour > 23) {
			if(strError != ""){strError += ", ";}
            strError += "Hour must be between 0 and 23.";
        }
        if(strMinute < 0 || strMinute > 59) {
			if(strError != ""){strError += ", ";}
            strError += "Minute must be between 0 and 59.";
        } else if(strMinute%15 != 0) {
			if(strError != ""){strError += ", ";}
            strError += "Minute must be use 15 minute intervals.";
        }

        if(strError != ""){
            return strError;
        }
	}
    return "";
}

function validateMoney(sVal){			
    reMoneyPat = /^\$|,/g;
    sVal=sVal.replace(reMoneyPat, "");
    if(isNaN(sVal)){return "A valid US monitary format is required.";}
    return "";
} 

function validateEmail(sVal){
    //var rePat = /[a-zA-Z0-9_\.\-\+]+@[a-zA-Z0-9_\.\-\+]+\.[a-zA-Z]+$/;
    var rePat = /([a-zA-Z0-9_\.\-\+]+@[a-zA-Z0-9_\.\-\+]+\.[a-zA-Z]+$)|([a-zA-Z0-9_\.\-\+]+@[a-zA-Z0-9_\.\-\+]+$)/;
    var bln = rePat.test(sVal);
    if(!bln){return "A valid email address is required.";}    
    return "";
}
		
function validatePath(sVal){
    var rePat = /[^\w ]/;
    var bln = rePat.test(sVal);
    if(bln){return "This field accepts only letters, numbers, the underscore, and spaces.";}    
    return "";
}
		
function validateZipCode(sVal){
    var rePat1 = /(^\d{5}$)|(^\d{5}-\d{4}$)/;
    var OmatchArray1 = sVal.match(rePat1);
    if (OmatchArray1 == null) {
        return "A valid zipcode is required.";
    }
    return "";
}

function validateInteger(sVal){
	if(sVal.search(/[^\d]/) != -1){
		return "This field accepts Integers only.";
	}
	return "";
}

function validateNumeric(sVal){
	if(isNaN(sVal)){return "This field accepts numbers only.";}
	return "";
}

function validateSSN(sVal){
	var rePat1 = /^(\d{3})-(\d{2})-(\d{4})$/;
	var OmatchArray1 = sVal.match(rePat1);
	if (OmatchArray1 == null) {
		return "This field requires a number of the format NNN-NN-NNNN.";
	}
	return "";
}

function validateGroup(oIn){
	for(i=0; i<oIn.length; i++){
		if(oIn[i].checked){return "";}
	}
	return "Please make a selection.";
}


//validate a password as being strong
function strongPass(password){
	var msg = "";
	if(!(password.length >= 7)){msg += "passwords must be at least 7 characters long.\n";}
	if(!(password.match(/\d/))){msg += "passwords must include at least one number.\n";}
	if(!(password.match(/[A-Z]/))){msg += "passwords must include at least one uppercase letter.\n";}
	if(!(password.match(/[a-z]/))){msg += "passwords must include one or more lowercase letters.\n";}
	if(!(password.match(/\W+/))){msg += "passwords must include at least one special character - #,@,%,!\n";}
	if(msg != ""){
		alert(msg);
		return false;
	}
	return true;
}
/////////////////end form validation code/////////////////////


/*
new ypSlideOutMenu("menu1", "down", 324, 0, 160, 300)
new ypSlideOutMenu("menu3", "down", 459, 0, 170, 300)
new ypSlideOutMenu("menu2", "down", 594, 0, 210, 300)
new ypSlideOutMenu("menu5", "down", 729, 0, 134, 300)
new ypSlideOutMenu("menu4", "down", 864, 0, 135, 300)
*/

function changeMenu(mId,mClass) {
	document.getElementById(mId).className = mClass;
}

function fillFormTest(form){
	var choice = "1234567890abcdefghiklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXTZ";
	var rndword; var rnd;
	for(i = 0; i < form.elements.length - 1; i++){
		rndword = '';
		for (var r = 0; r < Math.floor(Math.random() * 13) + 3; r++) {
		  rnd = Math.floor(Math.random() * choice.length);
		  rndword += choice.substring(rnd,rnd+1);
		}
		etype = form.elements[i].type;
		if(etype == 'text' || etype == 'textarea'){form.elements[i].value = rndword}
		if(etype == 'checkbox' || etype == 'radio'){form.elements[i].checked = true;}
	}
}
