// +------------------------------------------------------------------------+
// |                  Copyright (c) 2003 ACTIVESEND.COM                     |
// |                         All Rights Reserved.                           |
// |      CONFIDENTIAL MATERIAL - UNAUTHORIZED ACCESS PROHIBITED.           |
// |------------------------------------------------------------------------|
// |  Module:   $RCSfile: util.js,v $                                       |
// |  Author:   Christopher Go                                              |
// |  Rev Date: $Date: 2007-06-02 04:21:06 $                                |
// |  Revision: $Revision: 1.19 $ $Author: chris $                           |
// +------------------------------------------------------------------------+

// ================================================== DATE

function addDays(aDate, aNumberOfDays, aUseBusinessDays) {
    if( !aUseBusinessDays ) {
        aDate.setDate(aDate.getDate() + aNumberOfDays);
    } else {
        var daysAdded = 0;
        while ( daysAdded < aNumberOfDays ) {
            aDate.setDate(aDate.getDate() + 1);
            //$dateTS = $dateTS + (24*60*60);
            //echo date('m/d/Y w', $dateTS ) . "<br>";
            if( aDate.getDay()!=0 && 
                aDate.getDay()!=6 ) 
            {
                daysAdded++;
            }
        }
    }
	//alert(aDate.getFullYear() + "-" + (aDate.getMonth()+1) + "-" + aDate.getDate() + " - " + aDate.getDay());
    return aDate;
}

function getDateDiffInMilliseconds(aStartDate, aEndDate) {
	var startDateTS = aStartDate.getTime();
	if( aEndDate=="" ) {
		return -1;
	} else {
		var endDateTS = aEndDate.getTime();
	}
	//alert(startDateTS + " | " + endDateTS);
	//alert(startDateTS-endDateTS);
	return (startDateTS-endDateTS);
}

// ================================================== WINDOW

function setWindowLocation(aURL, aWindow, aProperties ) {
    if( aProperties==null ) {
        aProperties = "height=300,width=400,menubar=no,scrollbars=yes,status=no,titlebar=no,toolbar=no";
    }
    if(aWindow!=null) {
        var win = open( aURL, aWindow, aProperties);
        win.focus();
    } else {
        window.location = aURL;
        //window.focus();
    }
}

function openHelperWindow(aURL, aHeight, aWidth) {
    if( aHeight==null ) aHeight=300;
    if( aWidth==null ) aWidth=400;
    var windowName  = 'helperWin';
    var windowProps = 'height=' + aHeight + ',width=' + aWidth + ',menubar=no,scrollbars=yes,status=no,titlebar=no,toolbar=no';
    var win = open(aURL, windowName, windowProps);
    win.focus();
}

function reloadSelf() {
    self.location.reload();
}

function reloadParent() {
    opener.location.reload();
}

function resizeWindow(aMinWidth, aMinHeight) {
    var currWidth   = document.body.offsetWidth;
    var currHeight  = document.body.offsetHeight;
    if( currWidth<aMinWidth || currHeight<aMinHeight ) {    
        var targetWidth     = currWidth<=aMinWidth?aMinWidth:currWidth;
        var targetHeight    = currHeight<=aMinHeight?aMinHeight:currHeight;
        window.resizeTo( targetWidth, targetHeight );
    }
}

function toggleDivDisplayWithSwitch(aDivName, aDisplay) {
    if( document.getElementById(aDivName) ) {
        if( aDisplay ) document.getElementById(aDivName).style.display = '';
        else document.getElementById(aDivName).style.display = 'none';
    }
}

/**
 * Toggle the visibility of a DIV (toggles from the current state)
 */
function toggleDivDisplay( aDivName ) {
    if( document.getElementById(aDivName) ) {
        var divElement = document.getElementById(aDivName);
        if( divElement.style.display=='' ) divElement.style.display = 'none';
        else divElement.style.display = '';
    }
}

// Updates the image on a page using a select box
function updateImage(aFormField, aImageName, aImagePath) {   
    document.images[aImageName].src = aImagePath + "/" + aFormField.value;
}

// Opens an HTML editor with a predefined size and width and sends the 
// information back to the form field that called it
function openHTMLEditor(aForm, aField) {
    var properties = "toolbar=no,location=no,directories=no,menubar=no,scrollbars=no,width=550px,height=320px,modal=yes";
	var url = "../admin/popupHTMLEditor.php?form=" + aForm + "&field=" + aField;
	win = window.open(url, 'htmlEditor', properties);
}

// Generic open window command that all other functions use
function openWindow(aURL, aProperties) {
    var properties = "toolbar=no,location=no,directories=no,menubar=no,scrollbars=no,width=200px,height=200px,modal=yes";
    if( aProperties!=null ) {
        properties = aProperties;
    }
	win = window.open(aURL, "crossing", aProperties);
}

// Function to use one checkbox to check a bunch of other checkboxes
function globalCheck(aCheckboxObj, aFormName, aFieldName) {
    var status = true;
    if( !aCheckboxObj.checked ) {
        status = false;
    }
    for(ii=0; ii<document.forms[aFormName].elements.length; ii++) {
        if( document.forms[aFormName].elements[ii].name == aFieldName ) {
            document.forms[aFormName].elements[ii].checked = status;
        }
    }
}

// ================================================== FORMS

function getCalendarField(aFormName, aFieldName) {
    var obj = document.getElementById(aFormName);
    var field = obj.elements[aFieldName];
    return field;
}

function setFormAction(aForm, aAction) {
    var action = path + "/" + aAction;
    document.forms[aForm].submit();
}

function highlightButton(aString) {
    if ("INPUT"==event.srcElement.tagName) event.srcElement.className=aString;
}

function processCommand(aSelectBox) {
    var command = aSelectBox.options[aSelectBox.selectedIndex].value;
    if( trimstr(command)!='' ) aSelectBox.form.elements['command'].value = command;
}



// ================================================== FORMS

function toggleCheckboxes(aCheckbox) {
    var form = aCheckbox.form;
    var check = aCheckbox.ch;
    if( document.forms[aCheckbox.form.name] ) {
        for (ii=0;ii<form.length;ii++) {
            if (form.elements[ii].type=='checkbox'&&
                form.elements[ii].name.indexOf(aCheckbox.name)==0) {
                form.elements[ii].checked=aCheckbox.checked;
            }
        }
    }
}

// Function to use one checkbox to check a bunch of other checkboxes
function globalCheck(aCheckbox, aFormName, aFieldName) {
    var status = true;
    if( !aCheckbox.checked ) {
        status = false;
    }
    for(ii=0; ii<document.forms[aFormName].elements.length; ii++) {
        if( document.forms[aFormName].elements[ii].name == aFieldName ) {
            document.forms[aFormName].elements[ii].checked = status;
        }
    }
}

function globalCheckLooseMatch(aCheckbox, aFormName, aFieldName) {
    var status = true;
    if( !aCheckbox.checked ) {
        status = false;
    }
    for(ii=0; ii<document.forms[aFormName].elements.length; ii++) {
        if( document.forms[aFormName].elements[ii].name.indexOf(aFieldName)>-1 ) {
            document.forms[aFormName].elements[ii].checked = status;
        }
    }
}

function focusField(aForm, aField) {
    if( document.forms[aForm] && document.forms[aForm].elements[aField] ) {
        document.forms[aForm].elements[aField].focus();
    }
}


function getNumberChecked(aFormName, aCheckboxName) {
    var ii;
    var counter = 0;
    //alert( getNumberCheckboxes(aForm, aCheckboxElement) );
    if( getNumberCheckboxes(aFormName, aCheckboxName) > 1 ) {
        for(ii=0; ii<getNumberCheckboxes(aFormName, aCheckboxName); ii++) {
            if( document.forms[aFormName].elements[aCheckboxName][ii].checked ) counter++;
        }
    } else if( getNumberCheckboxes(aFormName, aCheckboxName) == 1 ) {
        if( document.forms[aFormName].elements[aCheckboxName].checked ) counter = 1;
    }
    return counter;
}

function getNumberCheckboxes(aFormName, aCheckboxName) {
    if( document.forms[aFormName].elements[aCheckboxName] ) {
        if( document.forms[aFormName].elements[aCheckboxName].length ) return document.forms[aFormName].elements[aCheckboxName].length;
        else if( document.forms[aFormName].elements[aCheckboxName] ) return 1;
        else return 0;
    } else {
        return 0;
    }
}

function getCheckboxValuesAsString(aFormName, aCheckboxName) {
    if( document.forms[aFormName].elements[aCheckboxName] ) {
        var checkboxObj = document.forms[aFormName].elements[aCheckboxName];
        if( checkboxObj.length ) {
            var checkValueArr = new Array();
            for( var ii=0; ii<checkboxObj.length; ii++ ) {
                if( checkboxObj[ii].checked ) checkValueArr.push(checkboxObj[ii].value);
            }
            if( checkValueArr.length>0 ) return checkValueArr.toString();
        } else {
            if( checkboxObj.checked ) return checkboxObj.value;
        }
    }
    return null;
}

function getCheckboxValuesAsArray(aFormName, aCheckboxName) {
    if( document.forms[aFormName].elements[aCheckboxName] ) {
        var checkboxObj = document.forms[aFormName].elements[aCheckboxName];
        if( checkboxObj.length ) {
            var checkValueArr = new Array();
            for( var ii=0; ii<checkboxObj.length; ii++ ) {
                if( checkboxObj[ii].checked ) checkValueArr.push(checkboxObj[ii].value);
            }
            if( checkValueArr.length>0 ) return checkValueArr;
        } else {
            if( checkboxObj.checked ) return new Array(checkboxObj.value);
        }
    }
    return null;
}

function setSelectedRadioValue(aFormName, aRadioName, aValue) {
    if( document.forms[aFormName] && 
        document.forms[aFormName].elements[aRadioName] ) 
    {
        var radioObj = document.forms[aFormName].elements[aRadioName];
        if( radioObj.length ) {
            for( ii=0; ii<radioObj.length; ii++ ) {
                if( radioObj[ii].value==aValue ) radioObj[ii].checked = true;
            }
        } else {
            radioObj.checked = true;
        }
    }
}

function getSelectedRadioValue(aFormName, aRadioName) {
    if( document.forms[aFormName] && 
        document.forms[aFormName].elements[aRadioName] ) 
    {
        //alert("here");
        var radioObj = document.forms[aFormName].elements[aRadioName];
        if( radioObj.length ) {
            for( ii=0; ii<radioObj.length; ii++ ) {
                //alert(radioObj[ii].checked + " | " + radioObj[ii].value);
                if( radioObj[ii].checked ) return radioObj[ii].value;
            }
            return false;
        } else {
            if( radioObj.checked ) return radioObj.value;
        }
    } else {
        //alert("here 2");
        return false;
    }
}

function getSelectedRadioValueWithFrame(aFormName, aRadioName, aFrameName) {
    if( window.frames[aFrameName].document.forms[aFormName] && 
        window.frames[aFrameName].document.forms[aFormName].elements[aRadioName] ) 
    {
        var radioObj = window.frames[aFrameName].document.forms[aFormName].elements[aRadioName];
        if( radioObj.length ) {
            for( ii=0; ii<radioObj.length; ii++ ) {
                // alert(radioObj[ii].checked);
                if( radioObj[ii].checked ) return radioObj[ii].value;
            }
            return false;
        } else {
            if( radioObj.checked ) return radioObj.value;
        }
    } else {
        return false;
    }
}

function clearList(aID, aSelectText) {
    eval(defaults(arguments, "", "-- Select --"));
    if( aID!="" && document.getElementById(aID) ) {
        document.getElementById(aID).options.length=1;
        document.getElementById(aID).options[0].value = 0;
        document.getElementById(aID).options[0].text = aSelectText;
    } else if ( document.getElementById(aID) ) {
        document.getElementById(aID).options.length=0;
    }
}

function copyFormField(aFormName, aSourceField, aTargetField) {
    if( document.forms[aFormName] &&
        document.forms[aFormName].elements[aSourceField] &&
        document.forms[aFormName].elements[aTargetField] ) {
        document.forms[aFormName].elements[aTargetField].value = document.forms[aFormName].elements[aSourceField].value;
    }
}


// ================================================== DATES

function writeCurrentDate() {
    var months          = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
    var monthAbbrevs	= new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
    var days            = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");
    var dayAbbrevs      = new Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
    var time            = new Date();
    var day             = time.getDay();
    var month           = time.getMonth();
    var date            = time.getDate();
    var year            = time.getYear();
    if (year < 2000)    // Y2K Fix, Isaac Powell
    	year = year + 1900; // http://onyx.idbsu.edu/~ipowell
    document.write(dayAbbrevs[day] + ", " + date + " " + monthAbbrevs[month] + " " + year);
}

/**
 * Function to populate the due date based on convenient time conventions
 */
function populateDateFieldUsingConventions(aSelectBox, aFormField) {
    var value = aSelectBox.options[aSelectBox.selectedIndex].value;
    if( value ) {
        var currDate    = new Date();
        var currDay     = currDate.getDate();
        var currMonth   = currDate.getMonth();
        var currYear    = currDate.getYear();
        var currHour    = currDate.getHours();
        var currMinute  = currDate.getMinutes();
        switch (value) {
            case '0.5':
                currMinute += 30;
                if( currMinute>60 ) {
                    currHour++;
                    currMinute = currMinute-60;
                }
                break;
            case '1':
                currHour++;
                if( currHour>24 ) {
                    currDay++;
                    currHour = currHour-24;
                }
                break;
            case '2':
                currHour += 2;
                if( currHour>24 ) {
                    currDay++;
                    currHour = currHour-24;
                }
                break;
            case '4':
                currHour += 6;
                if( currHour>24 ) {
                    currDay++;
                    currHour = currHour-24;
                }
                break;
            case '24':
                currDay++;
                break;
            case 'todayCOB':
                currHour = 18;
                currMinute = 0;
                break;
            case 'tomorrowNoon':
                currDay++;
                currHour = 12;
                currMinute = 0;
                break;
            case 'tomorrowCOB':
                currDay++;
                currHour = 18;
                currMinute = 0;
                break;
        }
        var dateStr  = '';
        if( currMonth+1<10 ) dateStr += '0'+(currMonth+1) + '/'
        else dateStr += (currMonth+1) + '/';
        if( currDay<10 ) dateStr += '0'+(currDay)
        else dateStr += (currDay);
        dateStr += '/'+ currYear + ' ';
        if( currHour>12 ) {
            currHour = currHour-12;
            meridiem = ' PM';
        } else {
            meridiem = ' AM';
        }
        if( currHour<10 ) dateStr += '0'+currHour + ':'
        else dateStr += currHour + ':';
        if( currMinute<10 ) dateStr += '0'+currMinute
        else dateStr += currMinute;
        dateStr += meridiem;
        aSelectBox.form.elements[aFormField].value = dateStr;
    }
}

// ================================================== PAYMENT FORMS


function defaults(passed) {
    var pattern = /function[^(]*\(([^)]*)\)/;
    var args = passed.callee.toString().match(pattern)[1].split(/\s*,\s*/);
    var str = "", i = 1;
    for ( ; i < arguments.length; i++) {
        if (typeof passed[i-1] == "undefined") {
            //str += args[i-1] + "=" + fix(arguments[i]) + ";";
            str += "var " + args[i-1] + "=" + fix(arguments[i]) + ";";
        }
    }
    return str;
    
    function fix(x) {
        if (typeof x == "string")
            return "'" + x.replace(/\'/g, "\\'") + "'";
        return x;
    }
}

// ================================================== ARRAY

function in_array(aNeedle, aHaystack) {
    var exists = false;
    for (var ii=0;ii<aHaystack.length;ii++) {
        if( aNeedle.toUpperCase() == aHaystack[ii].toUpperCase() ) {
            exists = true;
            break;
        }
    }
    return exists;
}

function ltrim(s) { return s.replace( /^\s*/, "" ); }
function rtrim (s) { return s.replace( /\s*$/, "" ); }
function trimstr (s) { return rtrim(ltrim(s)); }

// ================================================== STRING

function str_replace(aSearch, aReplace, aString) {
    return aString.replace(aSearch,aReplace);
}

function phoneNumberFormatter(aFormField) {
    fieldVal = aFormField.value;
    if( fieldVal.indexOf("(")>-1 ) {
        aFormField.value = "";
        alert("Please type in your phone number without the parenthesis");
    }
    if( fieldVal.length>2 && fieldVal.length<4 ) fieldVal = fieldVal + "-";
    if( fieldVal.length>6 && fieldVal.length<8 ) fieldVal = fieldVal + "-";
    aFormField.value = ltrim(fieldVal);
}

function ssnFormatter(aFormField) {
    fieldVal = aFormField.value;
    if( fieldVal.length>2 && fieldVal.length<4 ) fieldVal = fieldVal + "-";
    if( fieldVal.length>5 && fieldVal.length<7 ) fieldVal = fieldVal + "-";
    aFormField.value = ltrim(fieldVal);
}

// ================================================== BROWSER



// ================================================== OVERLIB Util

var MESSAGE_STATUS_SUCCESS  = 0;
var MESSAGE_STATUS_WAIT     = 1;
var MESSAGE_STATUS_ERROR    = 2;

function showStatus(aMessage,aStatus) {
    switch(aStatus) {
        case MESSAGE_STATUS_ERROR: messageColor='#cc0000'; break;
        case MESSAGE_STATUS_SUCCESS: messageColor='#009933'; break;
        case MESSAGE_STATUS_WAIT: messageColor='#ffcc00'; break;
        default: messageColor = '#808080'; break;
    }
    overlib("<b>"+aMessage+" &nbsp; </b>", FOLLOWSCROLL, STICKY, NOCLOSE, RELX, -8, RELY, 0, FGCOLOR, messageColor, BORDER, 0, TEXTSIZE, '10pt', TEXTCOLOR, '#ffffff', WRAP, 1, CELLPAD, 4, 4, 4, 4, WRAP);
}

function closeStatus() {
    nd();nd();
}

function loadDivWithURL(aDivName, aURL) {
    if( document.getElementById(aDivName) ) {
        document.getElementById(aDivName).innerHTML = "<div class='loadingBox'><b>Please wait. Loading...</b> <img src='../images/tabs/indicator.gif' /></div>";
    	//var form = document.getElementById('form');
    	//ajax.setVar("myTextBox", form.mytext.value); // recomended method of setting data to be parsed.
        ajax.requestFile = aURL;
    	//ajax.method = form.method.value;
    	ajax.element = aDivName;
    	//ajax.onLoading = whenLoading;
    	//ajax.onLoaded = whenLoaded; 
    	//ajax.onInteractive = whenInteractive;
    	//ajax.onCompletion = whenCompleted;
    	ajax.runAJAX();
        /*        
        var http = getHTTPObject();
        var url = getAjaxURL(aURL);
        http.open("GET", url, true);
        http.onreadystatechange = function() {
            if (http.readyState == 4) {
            	if (http.status == 200) {
            		window.clearTimeout(timeoutId);
            		var htmlDoc = http.responseText;
            		document.getElementById(aDivName).innerHTML = htmlDoc;
        	    }
            }
        }
        document.getElementById(aDivName).innerHTML = "<div class='loadingBox'><b>Please wait. Loading...</b> <img src='../images/tabs/indicator.gif' /></div>";
        http.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
        http.send(null);
        timeoutId = window.setTimeout(
            function() {
            	switch (http.readyState) {
            		case 1:
            		case 2:
            		case 3:
            			http.abort();
            			document.getElementById('panel_' + aTabID).innerHTML = "<h2>Error Loading Data</h2><a href=\"javascript:void(0)\" onclick=\"refreshTab('" + aTabID + "');\">Retry</a>";
            			alert("Oops. There was an error retreiving data from the server. Please try again in a few moments.");
            			break;
            		default:
            			break;
            	}
            },
            20000 // twenty seconds
        );
        */
    }
}

// ================= GETTING TRUE X & Y POSITION OF ELEMENTS =================
// From: http://www.webreference.com/dhtml/diner/realpos3/8.html

function DL_GetElementLeft(eElement)
{
   if (!eElement && this)                    // if argument is invalid
   {                                         // (not specified, is null or is 0)
      eElement = this;                       // and function is a method
   }                                         // identify the element as the method owner

   var DL_bIE = document.all ? true : false; // initialize var to identify IE

   var nLeftPos = eElement.offsetLeft;       // initialize var to store calculations
   var eParElement = eElement.offsetParent;  // identify first offset parent element

   while (eParElement != null)
   {                                         // move up through element hierarchy
      if(DL_bIE)                             // if browser is IE, then...
      {
         if(eParElement.tagName == "TD")     // if parent a table cell, then...
         {
            nLeftPos += eParElement.clientLeft; // append cell border width to calcs
         }
      }
      else                                   // if browser is Gecko, then...
      {
         if(eParElement.tagName == "TABLE")  // if parent is a table, then...
         {                                   // get its border as a number
            var nParBorder = parseInt(eParElement.border);
            if(isNaN(nParBorder))            // if no valid border attribute, then...
            {                                // check the table's frame attribute
               var nParFrame = eParElement.getAttribute('frame');
               if(nParFrame != null)         // if frame has ANY value, then...
               {
                  nLeftPos += 1;             // append one pixel to counter
               }
            }
            else if(nParBorder > 0)          // if a border width is specified, then...
            {
               nLeftPos += nParBorder;       // append the border width to counter
            }
         }
      }

      nLeftPos += eParElement.offsetLeft;    // append left offset of parent
      eParElement = eParElement.offsetParent; // and move up the element hierarchy
   }                                         // until no more offset parents exist
   return nLeftPos;                          // return the number calculated
}

function DL_GetElementTop(eElement)
{
   if (!eElement && this)                    // if argument is invalid
   {                                         // (not specified, is null or is 0)
      eElement = this;                       // and function is a method
   }                                         // identify the element as the method owner

   var DL_bIE = document.all ? true : false; // initialize var to identify IE

   var nTopPos = eElement.offsetTop;         // initialize var to store calculations
   var eParElement = eElement.offsetParent;  // identify first offset parent element

   while (eParElement != null)
   {                                         // move up through element hierarchy
      if(DL_bIE)                             // if browser is IE, then...
      {
         if(eParElement.tagName == "TD")     // if parent a table cell, then...
         {
            nTopPos += eParElement.clientTop; // append cell border width to calcs
         }
      }
      else                                   // if browser is Gecko, then...
      {
         if(eParElement.tagName == "TABLE")  // if parent is a table, then...
         {                                   // get its border as a number
            var nParBorder = parseInt(eParElement.border);
            if(isNaN(nParBorder))            // if no valid border attribute, then...
            {                                // check the table's frame attribute
               var nParFrame = eParElement.getAttribute('frame');
               if(nParFrame != null)         // if frame has ANY value, then...
               {
                  nTopPos += 1;              // append one pixel to counter
               }
            }
            else if(nParBorder > 0)          // if a border width is specified, then...
            {
               nTopPos += nParBorder;        // append the border width to counter
            }
         }
      }

      nTopPos += eParElement.offsetTop;      // append top offset of parent
      eParElement = eParElement.offsetParent; // and move up the element hierarchy
   }                                         // until no more offset parents exist
   return nTopPos;                           // return the number calculated
}
