/* MediaPlus cmo35 Version cmo35A 04/01/08 12:01:39 delta js/validate.js
** Copyright 2001 Publishing Business Systems, Inc.
** All Rights Reserved Worldwide.
*/
/* #170822 08.02.26 mickeyg Use generic errormsg variable for reusability in 
**                          builderrtext() and remove builderrtext2().
** #172254 07.09.14 mickeyg Check for 'mainnav' in activeImg().
** #171957 07.08.21 mickeyg Add updDeliveryInfo().
** #172254 07.09.14 mickeyg Check for 'mainnav' in activeImg().
** #170969 07.06.13 mickeyg Add activeImg() (for "transactions left" layout);
**                          set x/y coordinates for showCalendar.
** #167951 07.05.23 mickeyg Add valtermsconditions().
** #170924 07.05.16 mickeyg Add maximum length account number alert.
** #170838 07.05.08 mickeyg Build pathname in showCalendar.
** #168449 07.03.16 todd	Merge CMO 3.3b WR #168448 up to 3.4.
** #168448 06.10.03 todd	Create validateAccountNumber()
**-----------------------------------------------------------------------------
	File: 		 validate.js
	Description: validation routines used in CM Online
	Author:
	Created:
    Modified:    02/01/07 mickeyg WR#169745 CR#27467 builderrtext2()
	             12/07/06 mickeyg WR#168832 Added params to checkpwdlength() 
	             09/19/06 mickeyg WR#161592 Removed checkAltPhoneNumber()
	             12/12/05 mickeyg WR#164607 Check popup value for dynwinsize() 
	             10/04/05 mickeyg WR#163690 Don't trim email ending period;
	                              Allow "+" in local email name and changed
								  emailexp to {2,5}; Revised trim code in 
								  isValidEmail; Added validEmailList()
	             09/19/05 todd	  WR#163168 CR#23882 Add isValidEmail function
								  Update validateEmail to call it.
				 08/10/05 todd    WR#162768 Merge WR #162362 from 3.3 to 3.4.
				 07/27/05 todd	  WR#162362 CR#23434 Check type of DonateTo
    			 07/20/05 robi    WR#160803 Merged WR#161721 from 33 to 34
    			 07/20/05 robi    WR#161979 Merged WR#160198 from 33 to 34
				 06/03/05 mickeyg WR#161721 CR#23038 Trim email ending period. 
	             06/02/05 mickeyg WR#161721 CR#23021 Changed emailexp to {1,3}. 
	             05/26/05 mickeyg WR#161721 Loosen emailexp--remove {2,}. 
	             03/16/05 mickeyg WR#160198 Increase height padding from 55 
	                              to 75 in dynwinsize(). 
	             02/08/05 mickeyg WR#159742 Added trim and checkpwdlength(). 
                 01/17/05 mickeyg WR#159788 Merged up cmo32 WR#159298. 
				 12/01/04 mickeyg WR#159298 Changed myURLpath to point to
	                              custservice/web.
	             08/16/04 mickeyg WR#157818 Changed email to allow dashes. 
	             08/09/04 mickeyg WR#157750 CR#20547 Added dynwinsize(). 
                 07/21/04 mickeyg WR#157570 Modified showCalendar to use JS 
	                              vars instead of HostURL which may not be 
								  reliable due to server redirects.
	             05/13/04 mickeyg WR#155730 CR#19848 Added optional errtext
	                              param to validateRadioButtons().
			     03/26/04 mickeyg WR#156027 Added builderrtext();
	             12/15/03 mickeyg WR#154445 Merge up WR #153043.
				 12/04/03 mickeyg WR#153043 CR#18624 comment out searcharray
								  because it is not working; revisit later
			     10/24/03 mickeyg WR#153043 Added searcharray and seterrorfocus.
				 08/07/02 mickeyg WR#139428 CR#14425 Added 'padding' parameter 
								  to setwindowsize()
				 07/19/02 todd	  for 'contest', validateRadioButtons needs to 
								  return true when form has no radio buttons
				 07/01/02 mickeyg WR#146009 CR#14351 Added URL params to 
								  showCalendar 
				 03/26/02 mickeyg Increase calendar window size
			     02/27/02 mickeyg Copied transaction specific to own js files
-----------------------------------------------------------------------------*/

var iserrors = false;
var iscaution = false;
var errlist = new Array();
var caulist = new Array();

var charexp = /./;
var letterexp = /[a-z]/i;
var constitexp = /^\d{7}$/;
var phonexp = /^[ \-().0-9]{7,20}$/;
var zipexp = /^\d{5}$|^\d{5}[\-\s]?\d{4}$/;
// var emailexp = /^[a-z][a-z_0-9\.]+@[a-z_0-9\.]+\.[a-z]{2,}$/i;
var emailexp = /^[a-z_+0-9\.\-]+@[a-z_0-9\.\-]+\.[a-z]{2,5}$/i;
var intexp = /^\d+$/;
var numexp = /^\d+$|^\d*\.\d+$/;
var ccexp = /^\d{16}$|^\d{15}$/;
var dateexp = /^[01][0-9]\/[0123][0-9]\/[12][7890]\d{2}$/;

function hasChar(str) {
    return charexp.test(str);
}

function isValid(pattern, str) {
    return pattern.test(str);
}

function addError(myfield,myerror) {
    iserrors = true;
    errlist[errlist.length] = myerror;
}

function showErrors() {
    alert(errlist.join("\n"));
    return false;
}

function resetErrors() {
    iserrors = false;
    iscaution = false;
    errlist = null;
    errlist = new Array();
    caulist = null;
    caulist = new Array();
}


function trim(s) {
  while (s.substring(0,1) == ' ') {
    s = s.substring(1,s.length);
  }
  while (s.substring(s.length-1,s.length) == ' ') {
    s = s.substring(0,s.length-1);
  }
  return s;
}

// check for white spaces
var whitespace
function isblank(s) {
	whitespace = false;
	for(var i = 0; i < s.length; i++) {
    	var c = s.charAt(i);
        if ((c != ' ') && (c != '\n') && (c != '\t')) {
		whitespace = false;
		return whitespace;
		}
    }
	whitespace = true;
	return whitespace;
}

var errormsg;
function builderrtext(myfield, mytext) {
	// input: expects complete form field name to check for object existance
	// input: expects text to append to error text string
	// output: return error message 
    if (myfield) {
       	errormsg += mytext + " \n";
    }
	return errormsg;
}

var nw;

// opens calendar.html and passes a field number and URL address components 
function showCalendar(fieldNum,HostURL,AppURL) {
	//trim(HostURL);
	trim(AppURL);

    var ix = location.pathname.indexOf(AppURL);
    var pathname = location.protocol + '//' + location.hostname;
    if (ix > 0) {
        pathname += location.pathname.substring(0, ix) + AppURL;
    }
    else {
        pathname += AppURL;
    }

	// get HostURL from JS variables instead
	myURLpath = pathname + "/custservice/web/calendar.html";	

    calendar = window.open(myURLpath + '?fieldNum=' + fieldNum,'cal','width=270,height=220,screenX=450,screenY=225,left=450,top=225');
}

function validateTextBoxes(myform) {
    with (myform) {
     for (var i = 0; i < elements.length; i++ ) {
        // checks if text boxes are blank
        if ((elements[i].type == "text" || elements[i].type == "password") && elements[i].value == "") {
            alert("Please enter a value for the empty text field(s)");
            return false;
        }
     }
    return true;
	}
}

function valtermsconditions(myform) {
	if (myform.termsaccept) {
		if (myform.termsaccept.checked == false) {
    		alert('You must accept the terms and conditions to continue.');
	    	return false;
    	}
		else {
    		return true;
		}
	}
}

function validateRadioButtons(myform,errtext) {
	with (myform) {
    var names = "";
    for (var i = 0; i < elements.length; i++ ) {
        // checks if a radiobutton is selected
        if(elements[i].type == "radio") {
            if(names.indexOf(elements[i].name) < 0) {
                names = names + elements[i].name + ",";
            }
        }
    }
        if (names.length > 0) {
        	var namelist=names.split(",");
        	var checklist = new Array(namelist.length - 1);
            for(i=0;i < (namelist.length - 1); i++) {
                checklist[i]=false;
                for(j=0;j<elements.length;j++) {
                    if(elements[j].type == "radio" && elements[j].name == namelist[i] && elements[j].checked) {
                        checklist[i]=true;
                        // if the selected radiobutton EQ newAdd make sure an alternate address was added
                        if ((elements[j].value == "newAdd") && (newAddress.value == "")) {
                            alert("Please enter an alternate address for delivery");
                            return false;
                        }
                        // if the selected radiobutton EQ Donate AND the Donate To select box EQ null
                         if(elements[j].value == "Donate" && DonateTo.type == 'select-one' && DonateTo.options[DonateTo.selectedIndex].value == "") {
                            alert("Please enter who you would like to donate to.");
                            return false;
                        }
                    }
                }
            }
            for(i=0;i < (namelist.length - 1); i++) {
                if(!checklist[i]) {
                    if (errtext != null) {
                        alert(errtext);
                    }
                    else {
                        alert("Make a selection from each set of radiobuttons");
                    }
                    return false;
                }
            }
            return true;
        }
		return true;
    }
}

function greaterDate(indate) {
	var chkDate = new Date();
	var today = (chkDate.getMonth() + 1) + "/" + (chkDate.getDate()) + "/" + (chkDate.getFullYear());

	// check to see if date is greater than today
    if (Date.parse(indate) > Date.parse(today)) {
        return false;
    }
	else {
        return true;
    }
}

function previousDate(indate) {
	var chkDate = new Date();
	var today = (chkDate.getMonth() + 1) + "/" + (chkDate.getDate()) + "/" + (chkDate.getFullYear());

	// check to see if date is less than today
    if(Date.parse(indate) < Date.parse(today)) {
        return true;
    }
	else {
        return false;
    }
}

function checkPhoneNumber(fld, errmsg) {
	var showAlert = true;
    if (errmsg == "no") {
        showAlert = false; 
    } 
    if (!isValid(phonexp,(fld.value))) {
        if (showAlert) {
            alert("Please enter a valid phone number.");
        	return false;
        }
    }
	else {
        return true;
    }
}

function checkpwdlength(pwdobj, minlengthobj) {
	// pwdobj - object containing password
	// pwdlengthobj - object containing minimum password length
    if (pwdobj.value.length < minlengthobj.value) {
        alert("Please enter a password of at least " +
               minlengthobj.value + " characters.");
	  	pwdobj.focus();
        return false;
    }
	else {
        return true;
	}
}

// Subscription Account Number Validation
function validateAccountNumber (accountNumber) {
	var checkDigit = '';

	if (accountNumber.length > 2 &&
		accountNumber.charAt(accountNumber.length - 2) == '-') {
		checkDigit = accountNumber.substring (accountNumber.length - 1);
		accountNumber = accountNumber.substring (0, accountNumber.length - 2);
	}

	// prevent Progress from blowing up its interger variable
	if (parseInt(accountNumber) > '2147483647') {
	    if (!confirm("Your account number appears to be too big.\n" +
		             "Are you sure your subscription account number is " + 
					 accountNumber + "?")) {
	    	return false;
	    }
	    else {
	    	return true;
	    }
	}

	if (isNaN(accountNumber) ||
        (checkDigit != '' && isNaN(checkDigit))) {
    	 alert("Please enter only numeric values for your account number.");
		return false;
    }

	return true;
}

// generic email validation for passed in email address string
function isValidEmail (email) {
	var outString;

	outString = trim(email);

    if (hasChar(outString) && !isValid(emailexp,outString)) {
        return false;
    }
	else {
        return true;
    }
}

// email validation - single email address on form
function validateEmail(errmsg) {
	var showAlert = true;

    if(errmsg == "no") {
        showAlert = false; 
    }

	document.forms[0].email.value = trim(document.forms[0].email.value);

    if (! isValidEmail (document.forms[0].email.value)) {
        if (showAlert) {    
            alert("The email address you entered does not appear valid.");
        	document.forms[0].email.focus();
        }
		return false;
	}
	else {
		return true;
	}
}

// email validation - multiple email addresses
function valEmailList(emailcount, emailrequired) {
	// emailcount - number of email address widgets
	// emailrequired - (optional) is email address a required field? yes/no
	var emailaddrlist = "";	// comma-separated list of email addresses
	var widgetname;

    // validate email addresses and accumulate them in emailaddrlist string
    for (i = 1; i <= emailcount; i++) {
        widgetname = "email" + i;
        emailobj = document.getElementById (widgetname);
	
		emailobj.value = trim(emailobj.value);

        // if email address is not blank then validate
        if (emailobj.value != "") {
            if (isValidEmail (emailobj.value)) {
                emailaddrlist = ((emailaddrlist == "") ? "" : emailaddrlist + 
				                ",") + emailobj.value;
            }
            else {
                alert ("The email address '" + emailobj.value +
                       "' does not appear to be valid.");
                emailobj.focus();
                return false;
            }
        }
    }

	if ((emailaddrlist == '') && (emailrequired == 'yes')) {
    	alert("Please enter an email address.");
        document.forms[0].email1.focus();
        return false;
	}

	return true;
}

// checks if entered value is a number
var numexp = /^\d+$|^\d*\.\d+$/
function isNum(str) {
    return numexp.test(str)
}


// verify at least one digit precedes or follows decimal point
function goodDecimal(S) {
	return /^\d+\.\d+$/.test(S); 
}

var numexp1 = /^[0-9]+\.?[0-9]{0,2}$/
function checkDecimal(str) {
	goodDecimal(str);
	if(!goodDecimal(str)) {
		str = "0" + str;	
	}
	return numexp1.test(str);
}


function validatewebspeedlogs(myform) {
    if (document.options.refresh.value < 10) {
        alert("Enter a larger refresh value to avoid an infinite loop");
        return false;
    }
    if (document.options.numlines.value < 1){
        alert("Number of lines to show must be greater than zero");
        return false;
    }
    if ((isNaN(document.options.numlines.value) || isNaN(document.options.refresh.value))) {
		alert("Enter Numeric Values Only in the text boxes");
        return false;
	}
}

function validatebrwstracking(myform){
    if(document.forms[0].report.options[document.forms[0].report.selectedIndex].value == ""){
        alert("Select a report");
        return false;
    }
}

// back button
function setscreenvalues() {
	document.forms[0].backbutton.value = "yes";
	// possible Netscape fix
	document.forms[0].method = "post";
	document.forms[0].submit();
}

// dynamically resize window to table width
function setwindowsize(padding) {
    if (padding > 0) {
        wid = wid + padding;
    }
    if (typeof sizeToContent == 'function') {
        sizeToContent();
    }
    else {
        window.resizeTo(wid,document.body.offsetHeight);
    }
}

function dynwinsize(bodydiv,winHeight,winWidth) {
	var IE = document.all && navigator.appName.toLowerCase().indexOf("opera")==-1 ? true:false;

	if ((!document.forms[0]) || (document.forms[0].popup.value == 'yes')) {
		// dynamically resize IE browser window to a div container
    	if (IE) {
        	winHeight = document.all[bodydiv].offsetHeight + 75;
        	winWidth = document.all[bodydiv].offsetWidth + 30;
			// resize window to 70% of its maximum resolution
			if (window.screen.width < winWidth) {
				winWidth = window.screen.width * .70;
			}
			if (window.screen.height < winHeight) {
				winHeight = window.screen.height * .70;
			}
        	window.resizeTo(winWidth,winHeight);
    	}
    	else {
			// resize non-IE browser window to passed in height and width params
        	window.resizeTo(winWidth,winHeight);
    	}
	}
}

// switch navigation images for "transactions left" layout
function activeImg() {
    // swap active (subitem) image
    if ((document.forms[0].activeimgname) && 
	    (document.forms[0].activeimgsrc) &&
		(document.getElementById('mainnav'))) {
        document.images[document.forms[0].activeimgname.value].src = document.forms[0].imgPath.value + document.forms[0].activeimgsrc.value;
    }
    // swap active (group) image
    if ((document.forms[0].activegrpname) && 
	    (document.forms[0].activegrpsrc) &&
		(document.getElementById('mainnav'))) {
        document.images[document.forms[0].activegrpname.value].src = document.forms[0].imgPath.value + document.forms[0].activegrpsrc.value;
    }
}

function updDeliveryInfo (arrayObj, mySubscriptionID) {
    // search array for matching subscription and update delivery info 
    for (var i = 0; i < arrayObj.length;  i++) {
        if (arrayObj[i].subscriptionID == mySubscriptionID) {
            document.getElementById('delmethoddesc').innerHTML =
                arrayObj[i].delMethod;
            if (arrayObj[i].showEdition == 'yes') {
                document.getElementById('editionrow').style.visibility = 'visible';
                document.getElementById('editiondesc').innerHTML =
                    arrayObj[i].editionID;
            }
			else {
				if (document.getElementById('editiondesc')) {
                	document.getElementById('editiondesc').innerHTML = '';
                	document.getElementById('editionrow').style.visibility = 'hidden';
				}		
			}
            break;
        }
    }
}

function seterrorfocus(fieldname) {
    var myform = document.forms[0];

    myform[fieldname].focus();
    myform[fieldname].select();
    return false;
}

/*****
function searcharray(myarrayname, myarrayfield, mymatchvalue, mysearchfield) {
    // loop through array to find and return a value
    for (var i = 0; i < myarrayname.length;  i++) {
        if (myarrayname[i].myarrayfield == mymatchvalue) {
            return myarrayname[i].mysearchfield;
        }
    }
}
*****/
