////////////////////////////////////////////////////////////////////////////////////////
//
//  Name: standard.js
//
//  Purpose: This file provides a standard set of Javascript functions and variables
//           that that are used by the customized Javascript functions in the
//           ShipOnline active server pages.  It contains Browser Detection variables
//           that identify the users browser.  It contains generic functions that
//           allow the developer to "Get" and "Set" values in HTML fields, so they do 
//           not have to worry about the different syntax required the different HTML
//           data field types and browser versions.
//
// Included By: '/ShipOnline/Include/vbScript.vb'
//              (pageHeader function generates client side HTML include statement.
//               when pageHeader is called)
////////////////////////////////////////////////////////////////////////////////////////
//Set Browser Detection and Browser Version variables.
var NS    = false;
var IE    = false;
var IE4   = false;
var isMac = false;
var NS4   = false;
var NS6   = false;
var browserVer = parseInt(navigator.appVersion); 
var IE5PLUS = false;
var versionCheck = false;

NS    = (navigator.appName == "Netscape") ? true : false;
IE    = (navigator.appName == "Microsoft Internet Explorer") ? true : false;
isMac = (navigator.appVersion.indexOf("Mac")!=-1) ? true : false;

if ( NS || IE )
{
  if (NS)
  {
    NS4 = (parent.document.layers) ? true : false;
    if (!NS4) NS6 = navigator.vendor == ("Netscape6");
  }
  else
  {
    IE4 = (document.all) ? true : false;
    //See if its actually MSIE 5.  IE4 is set to true even if browser is actually IE5.
    if (navigator.appVersion.indexOf("5.") != -1 )
    {
      IE5PLUS = true;
      browserVer = 5;
    }
  }
  versionCheck =  ( (isMac && (NS4 || IE5PLUS)) || (!isMac && (NS4 || IE4 || IE5PLUS)) ) ? true : false;
  ver4 = versionCheck;
}

if (false)
{
  alert(navigator.appVersion);
  alert("NS=" + NS);
  alert("IE=" + IE);
  alert("isMac=" + isMac);
  alert("NS4=" + NS4);
  alert("NS6=" + NS6);
  alert("IE4=" + IE4);
  alert("IE5PLUS=" + IE5PLUS );
  alert("versionCheck=" + versionCheck );
  alert("BROWSERVER=" + browserVer );
}

Message = "Microsoft 4.0+ or Netscape 4.7+ (excluding Netscape 6) is required to use Purolators 'Online Shipping'";
newLocation = "http://www.purolator.com";
  
if (!NS && !IE)
{
  alert(Message);
  window.location = newLocation;
}
else
if (!versionCheck )
{
  alert(Message);
  window.location = newLocation;
}

//Array To Keep rack of All Form Field Information
var fieldInfoArray = new Array();
var formsArray     = new Array();

function adobeInstalled() 
{ 
  var plugin = ( navigator.mimeTypes && 
                 navigator.mimeTypes["application/pdf"] ? 
                 navigator.mimeTypes["application/pdf"].enabledPlugin : 0 );
  if (!(plugin && parseInt(plugin.description.substring(plugin.description.indexOf(".") -1 ))>= 4 ))
    return false
  else
    return true;
}

function checkNetscapeResize()
{
  //BIG KLUDGE HERE: OLD NETSCAPE BROWSERS DO NOT FIRE ONLOAD EVENT WHEN BROWSER RESIZED. 
  if (NS)
  {
    if(!window.saveInnerWidth) 
    {
      window.onresize = resize;
      window.saveInnerWidth  = window.innerWidth;
      window.saveInnerHeight = window.innerHeight;
    }
    function resize() 
    {
      if (saveInnerWidth  < window.innerWidth  ||
          saveInnerWidth  > window.innerWidth  ||
          saveInnerHeight > window.innerHeight ||
          saveInnerHeight < window.innerHeight )
      {
        window.history.go(0);
      }
    }
  }
}

//Array To Keep rack of All Form Field Information
function fieldInfo( inFieldObj, inFieldType, inFieldLength, inFieldMandatory, inFieldMsg )
{
  this.fieldObj       = inFieldObj;
  this.fieldDataType  = inFieldType;
  this.fieldLength    = inFieldLength;
  this.fieldMandatory = inFieldMandatory;
  this.fieldMsg       = inFieldMsg;
}


//Returns correct Javascript syntax for referencing an HTML form field
//based on browser verion and layers (DIV).  This is due to IE and NS
//having different DOM syntax if DIVS are used.
function getFieldName(inDivName, inFormName, inFieldName )
{
  var retString = "";
  
  if (!isEmpty(inFormName) > 0)
    retString = "document." + inFormName
  else
    retString = "document.forms[0]";

  if (!isEmpty(inFieldName) > 0)
    retString = retString + "." + inFieldName

  if (NS && !isEmpty(inDivName) )
      retString = "document." + inDivName + "." + retString;

  return retString;
}

//Returns and Object reference to HTML form field that is identified
//by DIV Name(layer), Form Name and Field Name.
function getFieldObject(inDivName, inFormName, inFieldName )
{
  var myObject
  eval("myObject = " + getFieldName(inDivName, inFormName, inFieldName ) );  
  return myObject
}


//Returns a name value Pair for use in URLs.  This function allows for
//HTML field data types. Buttons TYpes are excluded. It also allows for an array
//of fields to be specified to be excluded.  
//This function is primarily used in BuildURL when building
//the big url from several forms, to do an Estimate or Process the shipment data.  
//It also escapes the data for correct URL compliant syntax.
function nameValuePair(inObject, inExcludeFields )
{
  var objectType = inObject.type.toUpperCase();
  var objectName = inObject.name.toUpperCase();
  var retVal = ""
  var skipIt = false;
  
  if (objectType != "SUBMIT" && objectType != "BUTTON" )
  {
    if (inExcludeFields != null)
    {
      for (var i = 0; (skipIt == false && i < inExcludeFields.length); i++)
      {
        if (objectName == inExcludeFields[i].toUpperCase())
          skipIt = true;
      }
    }
    if (!skipIt)
    {
      myValue = getFormFieldValue( inObject );
      if (!isEmpty(myValue))
        retVal = (objectName + "=" + escape(myValue) );
    }
  }
  return retVal;
}

//This function loops through all of the forms and all of the form's field in 
//the current HTML page to build a URL that can be submitted to the server.
//This function is primarily used by Shipment.asp, to do Estimates and 
//Process Shipments.  The developer must supply the base URL of the calling page
//and can optionally suplly an Array of field objects to exclude from the
//generated URL.  the third parameter is a boolean so that the developer can pass
//true to have the generqated url be displayed in an alert box for debugging.
//NOTE: this function allows for the different DOM models used by Netscape and
//Microsofts Internet Explorer. (Layers)
function buildURL( inPage, inExcludeFields, inAlertFlag )
{
  var myObject;
  var myURL;
  var counter = 0;  
  var myValue;
  var allowNSLayers = (NS && false);
      
  myURL = inPage + "?";
  
  if (allowNSLayers)
  {
    if (document.layers.length > 0) 
      netscapeLayers = true
    else
      netscapeLayers = false;
  }
  else
    netscapeLayers = false;

  if (netscapeLayers)
  {
    myLength = document.layers.length;
    for (var x = 0; x < myLength; x++)
    {
      for (var y = 0; y < document.layers[x].document.forms.length; y++)
      {
        for (var z = 0; z < document.layers[x].document.forms[y].elements.length; z++)
        { 
          myValue = nameValuePair( document.layers[x].document.forms[y].elements[z], inExcludeFields  );
          if (!isEmpty(myValue))
          {
            if (counter > 0) myURL = myURL + "&";
            myURL = myURL + myValue;
            counter++;
          }
        }
      }
    }
  }
  else
  {
    for (var y = 0; y < document.forms.length; y++)
    {
      for (var z = 0; z < document.forms[y].elements.length; z++)
      {
        myValue = nameValuePair( document.forms[y].elements[z], inExcludeFields );
        if (!isEmpty(myValue))
        {
          if (counter > 0) myURL = myURL + "&";
          myURL = myURL + myValue;
          counter++;
            if (inAlertFlag) alert(myURL + " " + myURL.length );

        }
      }
    }
  }
  //if (inAlertFlag) alert(myURL);
  if (inAlertFlag) alert(myURL + " " + myURL.length );
  return myURL;
}

//Returns the value currently set in an HTML form field. This is usually called
//by the local javascript funtion getFieldvalues.
function getFormFieldValue(fieldObject)
{    
  var myValue   = "";
  var fieldType = fieldObject.type.toUpperCase();

  if (fieldType == "RADIO" || fieldType == "CHECKBOX")
  {
    if (fieldObject.checked)
    {
      if (!isEmpty(fieldObject.value))
          myValue = fieldObject.value;
      }
  }
  else if (fieldType == "SELECT-ONE")
  {
    if ( !isEmpty(fieldObject.options[fieldObject.selectedIndex].value) )
      myValue = fieldObject.options[fieldObject.selectedIndex].value;
  }
  else if (fieldType == "TEXT" || fieldType == "HIDDEN" || fieldType == "TEXTAREA" || fieldType == "PASSWORD" || fieldType == "FILE" )
  {
    if (!isEmpty(fieldObject.value) )
      myValue = fieldObject.value;
  }

  return myValue;
}


//Returns a Javascript Array of current values in an HTML form field.  
//This hides the complexity of referencing the different HTML field Types
//from the developer. Select, CheckBox, Radio Group etc...

function getFieldValues(fieldObject)
{
  var fieldValues = new Array();
  var fieldType;
  var myValue;
  var muliFieldFlag = false;

  fieldType = fieldObject.type;

  if (fieldType == null) 
  {
    fieldType = "KLUDGE-MULTIPLE";  //More than one Checkbox/Radio/TextBox with same name, has no type attr defined.
    muliFieldFlag = true;
  }
  else if (fieldType.toUpperCase() == "SELECT-MULTIPLE") 
    muliFieldFlag = true;

  if (muliFieldFlag)
  {
    for (var i=0; i < fieldObject.length; i++)
    {
      if ( fieldType.toUpperCase() == "SELECT-MULTIPLE" )
      {
        if (fieldObject[i].selected) myValue = fieldObject[i].value;
      }
      else
      {
        myValue = getFormFieldValue(fieldObject[i]);
      }
      if (!isEmpty(myValue))
        fieldValues[fieldValues.length] = myValue;
    }
  }
  else
  {
    myValue = getFormFieldValue( fieldObject );
    if (!isEmpty(myValue))
      fieldValues[fieldValues.length] = myValue;
  }
  return fieldValues;
}

function getFormFieldValues(fieldObject)
{
  return getFieldValues(fieldObject);
}


//Sets the current value of an HTML form field.
function setFieldValue(fieldObject, inValue)
{
  var fieldValues = new Array();
  var muliFieldFlag = false;
  var setIt = false;
  var fieldType;


  fieldType = fieldObject.type;

  if (fieldType == null || fieldType == "undefined") 
    muliFieldFlag = true
  else
  {
    fieldType = fieldType.toUpperCase();
    if (fieldType == null || fieldType == "SELECT-ONE" || fieldType == "UNDEFINED")
      muliFieldFlag = true;
  }

  if (muliFieldFlag)
  {
    for (var i=0; (i < fieldObject.length && !setIt); i++)
    {
      if (inValue == fieldObject[i].value)
      {
        if (fieldType == "SELECT-ONE")
          fieldObject.options[i].selected = true
        else
          fieldObject[i].checked = true;
        setIt = true;
      }
    }
  }
  else
  {
    if (fieldType == "CHECKBOX" || fieldType == "RADIO")
    {
      if (fieldObject.value == inValue)
        fieldObject.checked = true
      else
        fieldObject.checked = false;
      setIt = true;    
    }
    else
    {  
      fieldObject.value = inValue;
      setIt = true;    
    }
  }
  return setIt;
}


//Opens the Help Browser Window using the supplied URL.
var helpWindow;
function clickHelp(inURL)
{
  if (clickHelp.arguments.length == 0 || isEmpty(inURL) ) 
  {
    alert("Help Clicked. No URL exists in database for the current screen" );
  }
  else
  {
    if (!helpWindow || helpWindow.closed)
    {
	  var height	= 500;
	  var width		= 780;
	  var top		= (screen.height-height)/2;
	  var left		= (screen.width-width)/2;
      helpWindow = window.open( inURL, "HELPWINDOW", "width=" + width + ",height=" + height + ",left=" + left + ",top=" + top + ",toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=no");
    }
    else
      helpWindow.location = inURL;
    
    helpWindow.focus();
  }
}

function getDisplayText(inFieldObject)
{
  return (inFieldObject.options[inFieldObject.selectedIndex].text);
}

function setFieldType( inFieldObj, inFieldType )
{
  for (var x=0; (x < formsArray.length); x++)
  {
    fieldInfoArray = formsArray[x];
    for (var i=0; (i < fieldInfoArray.length); i++)
    {
      if (fieldInfoArray[i].fieldObj == inFieldObj)
      {
        fieldInfoArray[i].fieldDataType = inFieldType;
        break;
      }
    }
  }
}

function setFieldOptional( inFieldObj )
{
  for (var x=0; (x < formsArray.length); x++)
  {
    fieldInfoArray = formsArray[x];    
    for (var i=0; (i < fieldInfoArray.length); i++)
    {
      if (fieldInfoArray[i].fieldObj == inFieldObj)
      {
        fieldInfoArray[i].fieldMandatory = false;
        break;
      }
    }
  }
}

function setFieldMandatory( inFieldObj )
{
  var fieldCounter = 0;
  for (var fp=0; (fp < formsArray.length); fp++)
  {
    fieldInfoArray = formsArray[fp];    
    for (var i=0; (i < fieldInfoArray.length); i++)
    {
      if (fieldInfoArray[i].fieldObj == inFieldObj)
      {
        fieldInfoArray[i].fieldMandatory = true;
        break;
      }
    }
  }
}

function dumpFieldArray()
{
  for (var x=0; (x < formsArray.length); x++)
  {
    var myString = "";
    fieldInfoArray = formsArray[x];
    for (var i=0; (i < fieldInfoArray.length); i++)
    {
      myString = myString + "(" + i + ")"  + fieldInfoArray[i].fieldObj.name  + 
                            " Type:"       + fieldInfoArray[i].fieldDataType  + 
                            " Length:"     + fieldInfoArray[i].fieldLength    + 
                            " Mandatory:"  + fieldInfoArray[i].fieldMandatory + 
                            " Msg Prefix:" + fieldInfoArray[i].fieldMsg + "\n";
    }
    alert(myString);
  }
}

function disableField(inFieldObject)
{
  setFieldValue(inFieldObject, "");
  if (IE && inFieldObject.disabled == false) inFieldObject.disabled = true;
}
function enableField(inFieldObject)
{
  if (IE && inFieldObject.disabled == true) inFieldObject.disabled = false;
}
function whatsThis(inPage, scroll)
// generate window to contain 'What's this?' help page
{
	var h = 275;
	var w = 350;
	var top = (screen.height-h)/2;
	var left = (screen.width-w)/2;
	var showScroll
	
	if (scroll == true)
	{
		showScroll = "scrollbars,"
	}
	else
	{
		showScroll = ""
	}

	var theWindow = window.open("/ShipOnline/Help/" + inPage, "", showScroll + "width=" + w + ",height=" + h + ",top=" + top + ",left=" + left);
}
