//<script>
/*
' ************************************************************
' File:		common.js
' Author:	PureWellness © 2010. All rights reserved.
' Purpose:  Common JavaScript functions
'
' Usage Requirements:
'    <script type="text/javascript" language="javascript" src="/dt/nutr/include/common.js"></script>
' ------------------------------------------------------------
' Revisions:
' ************************************************************ 
*/

function PopCalendar()
{
    var retObj = window.showModalDialog('/dt/nutr/DatePicker.asp','','dialogHeight:240px;dialogWidth:315px;status:no;help:no');
    return retObj;
}

function PopHelp(helpFile, height)
{
    var width  = 610;
    if (typeof height == "undefined") { height = 400; }
    var newWindow = window.open(helpFile,'myHelp','width=' + width + ',height=' + height + ',status=no,toolbar=no,resizable=yes,scrollbars=yes',false);
    newWindow.focus();
    return true;
}

function PopLargeHelp(helpFile)
{
    var newWindow = window.open(helpFile,'myHelp','width=530,height=500,status=no,toolbar=no,resizable=yes,scrollbars=yes',false);
	newWindow.focus();
	return true;
}

//addEvent(window, 'load', function() {
//    var input;
//    var inputs = document.getElementsByTagName('input');
//    for (var i = 0; (input = inputs[i]); i++) {
//        addEvent(input, 'focus', oninputfocus);
//        addEvent(input, 'blur', oninputblur);
//    }
//    var textareas = document.getElementsByTagName('textarea');
//    for (var i = 0; (textarea = textareas[i]); i++) {
//        addEvent(textarea, 'focus', oninputfocus);
//        addEvent(textarea, 'blur', oninputblur);
//    }
//});

//function addEvent(obj, evType, fn){
//    if (obj.addEventListener){
//        obj.addEventListener(evType, fn, true);
//        return true;
//    } else if (obj.attachEvent){
//        var r = obj.attachEvent("on"+evType, fn);
//        return r;
//    } else {
//        return false;
//    }
//}

//function oninputfocus(e) {
//    /* Cookie-cutter code to find the source of the event */
//    if (typeof e == 'undefined') {
//        var e = window.event;
//    }
//    var source;
//    if (typeof e.target != 'undefined') {
//        source = e.target;
//    } else if (typeof e.srcElement != 'undefined') {
//        source = e.srcElement;
//    } else {
//        return;
//    }
//    /* End cookie-cutter code */
//}

//function oninputblur(e) {
//    /* Cookie-cutter code to find the source of the event */
//    if (typeof e == 'undefined') {
//        var e = window.event;
//    }
//    var source;
//    if (typeof e.target != 'undefined') {
//        source = e.target;
//    } else if (typeof e.srcElement != 'undefined') {
//        source = e.srcElement;
//    } else {
//        return;
//    }
//    /* End cookie-cutter code */
//}

// ------------------------------------------------
// Event Functions
// ------------------------------------------------

// Add an event listener to the window_onload event
function addOnLoadEvent(fn) {
    var fnLoad = window.onload;
    if (typeof fnLoad != "function")
        window.onload = fn;
    else {
        window.onload = function() {
            fnLoad();
            fn();
        }
    }
}

// Add an event listener to the obj given
// evType - refers to the event trigger, without the "on", like click or mouseover
// fn - refers to the function callback when event is triggered
function addEvent(obj, evType, fn) {
    if (obj.attachEvent) {
        obj.attachEvent("on" + evType, fn);
    } else if (obj.addEventListener) {
        obj.addEventListener(evType, fn, true);
    } else {
        obj["on" + evType] = fn;
    }
}

// Removes an event from the object
function removeEvent(obj, evType, fn) {
    if (obj.detachEvent) {
        obj.detachEvent("on" + evType, fn);
    } else if (obj.removeEventListener) {
        obj.removeEventListener(evType, fn, true);
    } else {
        obj["on" + evType] = null;
    }
}

// Stop an event from bubbling up the event DOM
function stopEvent(e) {
    if (!e) e = window.event;
    if (e.stopPropagation) {
        e.stopPropagation();
        e.preventDefault();
    } else if (typeof e.cancelBubble != "undefined") {
        e.cancelBubble = true;
        e.returnValue = false;
    }
    return false;
}

// Get the obj that starts the event
function getElement(e) {
    if (window.event) {
        return window.event.srcElement;
    } else {
        return e.currentTarget;
    }
}


// ------------------------------------------------
// String Functions
// ------------------------------------------------

String.prototype.trim = function() {
    return (this.replace(/^\s+|\s+$/g, ''));
}

// trim whitespaces
function trim(str) {
    if (typeof (str) == 'string') {
        return str.replace(/^\s+|\s+$/g, '');
    }
    return '';
}

// validate e-mail address
function isValidEmailAddress(sEmail) {
    // validate argument
    if (typeof (sEmail) != 'string') { return false; }

    // regular expression:
    // Microsoft: http://msdn.microsoft.com/en-us/library/ms998267.aspx     
    var regEx = new RegExp("^([0-9a-zA-Z]([-\.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$");
    var retVal = regEx.test(trim(sEmail))
    return retVal;

}

// ------------------------------------------------
// HTML Encode/Decode Functions
// ------------------------------------------------

// replaces Html reserved characters by their escape sequences
function HtmlEncode(str) {
    var result = str;
    result = result.replace(/&/gi, "&amp;");
    result = result.replace(/>/gi, "&gt;");
    result = result.replace(/</gi, "&lt;");
    //result = result.replace(/"/gi, "&guot;");
    //result = result.replace(/'/gi, "&apos;");
    result = result.replace(/"/gi, "&#34;");
    result = result.replace(/'/gi, "&#39;");
    return result;
}

function HtmlDecode(str) {
    var result = str;
    result = result.replace(/&#39;/gi, "'");
    result = result.replace(/&#34;/gi, "\"");
    //result = result.replace(/&apos;/gi, "\'");
    //result = result.replace(/&guot;/gi, "\"");
    result = result.replace(/&nbsp;/gi, " ");    
    result = result.replace(/&lt;/gi, "<");
    result = result.replace(/&gt;/gi, ">");
    result = result.replace(/&amp;/gi, "&");
    return result;
}

// IE/Firefox compatibility
function SetHtmlTextValue(obj, str) {
    if (obj == null || typeof(str) != 'string') 
        return;
    if (typeof (obj.innerText) != 'undefined') { // IE
        obj.innerText = str;
    } else { // Mozilla, Safari, ... 
        obj.textContent = str;
    }
}




// ------------------------------------------------
// HTML Offset Functions
// ------------------------------------------------

// absolute position of element from left of the screen 
function curLeft(obj) {
    var nLeft = 0;
    while (obj) {
        nLeft += obj.offsetLeft;
        obj = obj.offsetParent;
    }
    return nLeft;
}

// absolute position of element from top of the screen 
function curTop(obj) {
    var nTop = 0;
    while (obj) {
        nTop += obj.offsetTop;
        obj = obj.offsetParent;
    }
    return nTop;
}

// absolute position of element from top, left of the screen
function curPos(obj) {
    var nLeft = 0;
    var nTop = 0;
    while (obj != null) {
        nLeft += obj.offsetLeft;
        nTop += obj.offsetTop;
        obj = obj.offsetParent;
    }
    return [nLeft, nTop];
}

// ------------------------------------------------
// Password Functions
// ------------------------------------------------

function passwordCheckLoad(pid, spid) {
    // default password max length
    var obj = document.getElementById(pid);   
    var objSpan = document.getElementById(spid);
    if (obj && objSpan) {
        objSpan.innerHTML = '(max ' + obj.maxLength.toString() + ' characters)';
    }

}

function passwordEventHandler(e, spid) {

    var obj = getElement(e);
    var objSpan = document.getElementById(spid);
    if (objSpan == null) { return false; }

    var sMsg = '';
    var nChars = obj.value.length;
    if (nChars > 0) {
        sMsg = '(' + (obj.maxLength - nChars).toString() + ' characters remaining)';
    } else {
        sMsg = '(max ' + obj.maxLength.toString() + ' characters)';
    }
    objSpan.innerHTML = sMsg;
    return false;
}

// Get Query String function, pass in querystring key, the default value and the URL: document.location or parent.location
function getQuerystring(key, default_, sLoc) {
    if (default_ == null) default_ = "";
    key = key.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
    var regex = new RegExp("[\\?&]" + key + "=([^&#]*)");
    var qs = regex.exec(sLoc);
    if (qs == null)
        return default_;
    else
        return qs[1];
}

// Check to see if we have a valid number
function CheckNumber(theNumBox, sAlertText, bAllowZero, bAllowNegative, bAllowEmpty, bClearOnError, bAllowDecimals) {
    var bNumberIsValid = true;
    var sMsg;

    if (theNumBox) {
        var theVal = trim(theNumBox.value) + "";

        if ((!bAllowEmpty) && (theVal == ""))
            bNumberIsValid = false;
        else if (isNaN(theVal))
            bNumberIsValid = false;
        else if ((!bAllowDecimals) && (theVal.indexOf(".") > -1))
            bNumberIsValid = false;
        else if ((!bAllowZero) && (parseInt(theVal) == 0))
            bNumberIsValid = false;
        else if ((!bAllowNegative) && (parseInt(theVal) < 0))
            bNumberIsValid = false;
    }

    if (!bNumberIsValid) {
        sMsg = sAlertText + ' must be a ';

        if (!bAllowNegative)
            sMsg += 'positive ';

        if (!bAllowDecimals)
            sMsg += 'whole ';

        sMsg += 'number.';

        alert(sMsg);

        if (bClearOnError)
            theNumBox.value = "";
    }

    return bNumberIsValid;
}

// Declaring valid date character, minimum year and maximum year
var dtCh= "/";
var minYear=1900;
var maxYear=2100;

function isDate(dtStr) {
    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 isInteger(s){
	var i;
    for (i = 0; i < s.length; i++){   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

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
}

//*****************Javascript File Loading*************
//Schuyler: 8/13/2010 - This function checks to see if 
// the javascript file already exists on the HTML page 
// and if it doesn't, adds it to the head section

//NOTE: Due to how javascript files are loaded, you 
// cannot load a file and call a function from within 
// that file in the same javascript block. That is 
// what the callback parameter is for.
// --a good example is:
// /dt/nutr/include/FruitVeggieTrackerFunctions.asp

function IncludeJSFileInHTML(relativeLink, callbackName) {
    var exists = false;
    var headSection = document.getElementsByTagName('head')[0];
    var scripts = document.getElementsByTagName('script');

    for(var i = 0; i < scripts.length; i++) {
        if(scripts[i].src.indexOf(relativeLink) != -1) {
            exists = true;
            break;
        }
    }
    
    if (!exists) {
        var js = document.createElement('script');
        js.setAttribute('type', 'text/javascript');
        js.setAttribute('src', relativeLink);
        
        if (js.readyState) {  //IE
            js.onreadystatechange = function(){
                if (js.readyState == "loaded" || js.readyState == "complete") {
                    js.onreadystatechange = null;
                    eval(callbackName);
                }
            };
        } else //Others
            js.onload = function(){ eval(callbackName); };
        
        headSection.appendChild(js);
    }
    else
        eval(callbackName);
}