var m_sLoginPage = "LoginPage.html";
var m_sNavServiceURL = "http://portal.weldco-beales.com/NavWebService/NavWebService.php?";
var m_sHelpLink = "http://portal.weldco-beales.com/help/Customer%20Portal%20Help.pdf";
var m_oLogonManager = new LoginManager();

var m_sSupportContact = "For further assistance please contact our Support staff by phone at <b>'1-800-661-4155'</b> or by email at <a href='mailto:portalsupport.weldco-beales.com'>portalsupport@weldco-beales.com</a>.";

document.oncontextmenu = function(){return false}


function LoginInfo()
{
  this.CustomerNo = "";
  this.ContactNo = "";
  this.DefaultCompany = "";
  this.UserName = "";
  this.isWeldco = false;
}

function LoginManager()
{
  var m_oLoginInfo = null;

  //public
  this.isLoggedOn = function()
  {
    if( m_oLoginInfo != null )
      return true;
    else
      return false;
  }

  this.isWeldco = function(){return m_oLoginInfo.isWeldco;}
  this.UserName = function(){return m_oLoginInfo.UserName;}
  this.DefaultCompany = function(){return m_oLoginInfo.DefaultCompany;}
  this.ContactNo = function(){return m_oLoginInfo.ContactNo;}
  this.CustomerNo = function(){return m_oLoginInfo.CustomerNo;}


  this.logOn = function()
  {
    //@todo implement here for consistency
  }

  /*
    This function will attempt to get the login information.
    If it can't the function will redirect to the login page.
  */
  this.getLogonInformation = function(fncCallbackOnSuccess)
  {
    // if not already received get it now
    if( m_oLoginInfo == null )
    {
      var callbacks = { success: pass, failure: fail,timeout: 15000};
      var postData = "meta=0&method=getlogininfo";

      Ext.lib.Ajax.request('POST', m_sNavServiceURL, callbacks, postData);
    }//if
    else
    {
      fncCallbackOnSuccess(m_oLoginInfo);
    }

    function pass(o)
    {
      var oInfo = Ext.util.JSON.decode(o.responseText);
      if( oInfo.success )
      {
        m_oLoginInfo = new LoginInfo();
        m_oLoginInfo.CustomerNo = oInfo.custno;
        m_oLoginInfo.ContactNo = oInfo.contactno;
        m_oLoginInfo.DefaultCompany = oInfo.defaultcompany;
        m_oLoginInfo.UserName = oInfo.username;
        m_oLoginInfo.isWeldco = oInfo.isweldco;
      }

      fncCallbackOnSuccess(m_oLoginInfo);
    }
    function fail()
    {
      fncCallbackOnSuccess(m_oLoginInfo);
    }
  }//this.getLogonInformation()
}

function redirectToLogin()
{
  window.location = m_sLoginPage + "?redirect=" + location;
}



function findURLValue(key)
{
  var sLocation = decodeURI(location.search.substr(1).toLowerCase());

  // need to replace the %26 that might be there (in case link was sent via email)
  sLocation = sLocation.replace(/%26/g,'&');
  var aParams = sLocation.split("&");

  for (x=0;x<=aParams.length;x++)
  {
    if( aParams[x] )
    {
      var aTemp = aParams[x].split('=');
      if( aTemp && aTemp != 'undefined' && (aTemp.length == 2) && (aTemp[0] == key) )
        return decodeURI(aTemp[1]);
    }
  }

  return "";
}

function getCompanyName()
{
  return YAHOO.util.Dom.get('cmbBranches').value;
}

function clearSelect(oSelect)
{
  while( oSelect.hasChildNodes() )
  {
    oSelect.removeChild(oSelect.firstChild);
  }
}


function fireEvent(element,event)
{
  if (document.createEventObject)
  {
    // dispatch for IE
    var evt = document.createEventObject();
    return element.fireEvent('on'+event,evt)
  }
  else
  {
    // dispatch for firefox + others
    var evt = document.createEvent("HTMLEvents");
    evt.initEvent(event, true, true ); // event type,bubbling,cancelable
    return !element.dispatchEvent(evt);
  }
}



function initializeCustomerList(oSelect)
{
  if(! m_oLogonManager.isWeldco() )
  {
    return;
  }

  createLoadingOption(oSelect, false);

  // Make the call to the server for JSON data
  var callbacks = { success: pass, failure: fail,timeout: 15000};
  var postData = "method=getcustomers&meta=0&company=" + getCompanyName();
  YAHOO.util.Connect.asyncRequest('POST',m_sNavServiceURL, callbacks,postData);


  var aInnerHTML = new Array();
  var iIndex=0;
  aInnerHTML[iIndex++] = "<option value=''></option>";


  function pass(o)
  {
    var sDefaultValue = findURLValue("cust_no").toUpperCase();
    var aResults = [];
    aResults = YAHOO.lang.JSON.parse(o.responseText);  // results are an array of 'objects', reference fields by name -:)

    for (var i = 0, len = aResults.length; i < len; ++i)
    {
      var m = aResults[i];

      if( sDefaultValue != "" && m.CustomerNumber == sDefaultValue )
        aInnerHTML[++iIndex] = "<option selected value='" + m.CustomerNumber + "'>" +  m.CustomerName + " (" + m.CustomerNumber + ")</option>";
      else
        aInnerHTML[++iIndex] = "<option value='" + m.CustomerNumber + "'>" +  m.CustomerName + " (" + m.CustomerNumber + ")</option>";
    }

    YAHOO.util.Dom.get('divCustomers_select').innerHTML = "<select id='cmbCustomers' onselectstart='event.cancelBubble=true;' onchange='onCustomerChange();'>" + aInnerHTML.join() + "</select>";
  }
  function fail()
  {
    //showError("Failed to get list of customers.");
    YAHOO.util.Dom.get('divCustomers_select').innerHTML = "<select id='cmbCustomers' onselectstart='event.cancelBubble=true;' onchange='onCustomerChange();'>" + aInnerHTML.join() + "</select>";
  }
}


function initializeItemCategoryList(oSelect, sCatType)
{
  // mh - added sCatType param for pricebook2
  if(sCatType == null)
    sCatType = '';

  clearSelect(oSelect);

  createLoadingOption(oSelect, false);

  var aInnerHTML = new Array();
  var iIndex=0;
  aInnerHTML[iIndex++] = "<option value=''></option>";


  var mode = 0;
  if( location.href.toLowerCase().indexOf("pricebook") == -1 )
    mode = 1;

  // Make the call to the server for JSON data
  var callbacks = { success: pass, failure: fail,timeout: 15000};
  var postData = "method=getitemcategories&meta=0&mode="+mode+"&categorytype="+sCatType+"&company=" + getCompanyName();





  YAHOO.util.Connect.asyncRequest('POST',m_sNavServiceURL, callbacks,postData);

  function pass(o)
  {
    var sDefaultValue = findURLValue("product_type").toUpperCase();
    var aResults = [];
    aResults = YAHOO.lang.JSON.parse(o.responseText);

    for (var i = 0, len = aResults.length; i < len; ++i)
    {
      var m = aResults[i];
      aInnerHTML[iIndex++] = "<option value='" + m.Code + "'>" + m.Description + "</option>";
    }

    YAHOO.util.Dom.get('divProductType_select').innerHTML = "<select id='cmbProductType' onselectstart='event.cancelBubble=true;' onchange='onProductTypeChange();'>" + aInnerHTML.join() + "</select>";

    // make sure the onchange event occurs
    onProductTypeChange();
  }
  function fail()
  {
    showError("Failed to get list of product types.");
    YAHOO.util.Dom.get('divProductType_select').innerHTML = "<select id='cmbProductType' onselectstart='event.cancelBubble=true;' onchange='onProductTypeChange();'>" + aInnerHTML.join() + "</select>";
  }
}


function initializeProductGroupByCategory(oSelect, sCategory, sSeries)
{
  clearSelect(oSelect);

  if( sCategory == "" )
  {
    oSelect.disabled = true;
    return;
  }
  else
    oSelect.disabled = false;

  createLoadingOption(oSelect,true);

  var aInnerHTML = new Array();
  var iIndex=0;
  aInnerHTML[iIndex++] = "<option value=''></option>";


  // Make the call to the server for JSON data
  var callbacks = { success: pass, failure: fail,timeout: 15000};
  var postData = "method=getproductgroups&meta=0&company=" + getCompanyName() + "&category=" + sCategory + "&series=" + sSeries;

  YAHOO.util.Connect.asyncRequest('POST',m_sNavServiceURL, callbacks,postData);

  function pass(o)
  {
    var aResults = [];
    aResults = YAHOO.lang.JSON.parse(o.responseText);

    for (var i = 0, len = aResults.length; i < len; ++i)
    {
      var m = aResults[i];
      aInnerHTML[iIndex++] = "<option value='" + m.Code + "'>" + m.Description + "</option>";
    }

    YAHOO.util.Dom.get('divProductSubType_select').innerHTML = "<select id='cmbProductSubType' onselectstart='event.cancelBubble=true;' onchange='onProductSubTypeChange();'>" + aInnerHTML.join() + "</select>";
  }
  function fail()
  {
    showError("Failed to get list of product types.");
    YAHOO.util.Dom.get('divProductSubType_select').innerHTML = "<select id='cmbProductSubType' onselectstart='event.cancelBubble=true;' onchange='onProductSubTypeChange();'>" + aInnerHTML.join() + "</select>";
  }
}



function initializeSeriesList(oSelect, sItemCat, sProdGroup)
{
  clearSelect(oSelect);

  createLoadingOption(oSelect, false);

  var aInnerHTML = new Array();
  var iIndex=0;
  aInnerHTML[iIndex++] = "<option value=''></option>";

  // Make the call to the server for JSON data
  var callbacks = { success: pass, failure: fail,timeout: 15000};
  var postData = "method=getmachineseries&meta=0&company=" + getCompanyName() +
                  "&item_cat=" + sItemCat +
                  "&prod_group=" + sProdGroup;

  YAHOO.util.Connect.asyncRequest('POST',m_sNavServiceURL, callbacks,postData);

  function pass(o)
  {
    var sDefaultValue = findURLValue("series").toUpperCase();
    var aResults = [];

    aResults = YAHOO.lang.JSON.parse(o.responseText);

    for (var i = 0, len = aResults.length; i < len; ++i)
    {
      var m = aResults[i];
      aInnerHTML[iIndex++] = "<option value='" + m.Series + "'>" + m.Series + "</option>";

      //if( sDefaultValue != "" && m.Series == sDefaultValue )
      //  oOption.selected = true;
    }

    YAHOO.util.Dom.get('divSeries_select').innerHTML = "<select id='cmbSeries' onselectstart='event.cancelBubble=true;' onchange='onSeriesChange();'>" + aInnerHTML.join() + "</select>";


    // make sure the onchange event occurs
    //fireEvent(oSelect,'change');
    onSeriesChange();
  }
  function fail()
  {
    showError("Failed to get list of machine series.");
    YAHOO.util.Dom.get('divSeries_select').innerHTML = "<select id='cmbSeries' onselectstart='event.cancelBubble=true;' onchange='onSeriesChange();'>" + aInnerHTML.join() + "</select>";
  }
}





function initializeMachineModelsBySeries(oSelect, sSeries, sCategory, sMode)
{
  clearSelect(oSelect);

  createLoadingOption(oSelect, true);

  var aInnerHTML = new Array();
  var iIndex=0;
  aInnerHTML[iIndex++] = "<option value=''></option>";


  // Make the call to the server for JSON data
  var callbacks = { success: pass, failure: fail,timeout: 15000};
  var postData = "method=getmachinemodels&meta=0&company=" + getCompanyName() + "&series=" + sSeries + "&category=" + sCategory + "&mode="+sMode;

  YAHOO.util.Connect.asyncRequest('POST',m_sNavServiceURL, callbacks,postData);

  function pass(o)
  {
    var aResults = [];
    aResults = YAHOO.lang.JSON.parse(o.responseText);

    var aMachineModels = new Array();
    for (var i = 0, len = aResults.length; i < len; ++i)
    {
      var m = aResults[i];
      aMachineModels[i] = m.Code;
    }

    var htModels = parseMachineModels(aMachineModels);

    for(key in htModels)
    {
      if( isArray(htModels[key]) )
      {
        aInnerHTML[iIndex++] = "<optgroup label='" + key + "'>";

        for(var i=0, len=htModels[key].length; i<len; ++i)
        {
          aInnerHTML[iIndex++] = "<option value='" + htModels[key][i].MachineModel + "'>" + htModels[key][i].Abbreviation + "</option>";
        }//for

        aInnerHTML[iIndex++] = "</optgroup>";
      }//if
    }//for

    YAHOO.util.Dom.get('divMachineModels_select').innerHTML = "<select id='cmbMachineModels' onselectstart='event.cancelBubble=true;'>" + aInnerHTML.join() + "</select>";
  }
  function fail()
  {
    showError("Failed to get list of machine models.");
    YAHOO.util.Dom.get('divMachineModels_select').innerHTML = "<select id='cmbMachineModels' onselectstart='event.cancelBubble=true;'>" + aInnerHTML.join() + "</select>";
  }
}


function isIE()
{
  var chkAgent1=navigator.userAgent;
  //var chkVersion=navigator.appVersion.substring(0,3);
  var IE = chkAgent1.search(/MSIE/i);

  return ((IE!=-1)?true:false);

}

function getBaseURL()
{
  return location.href.split("&")[0];
}


function addBookmark(sTitle, sURL)
{
  if( isIE() )
    window.external.AddFavorite(sURL, sTitle)//IE
  else
    window.sidebar.addPanel( sTitle, sURL, '' );//Moz
}


function sendEmailLink(sSubject)
{
  var sFull = constructLinkURL(getBaseURL());
  // need to escape the '&' explicitly due to restrictions on the mailto format
  var sBodyText = "Page Link: " + encodeURI(sFull.replace(/&/g, "%26"));
  var oWin = window.open("mailto:?enctype=text/plain&subject=" + sSubject + "&body=" + sBodyText);
  //oWin.close();
}



function isArray(obj)
{
  return obj.constructor == Array;
}


function MachineModel(sAbbreviation,sMachineModel)
{
  this.Abbreviation = sAbbreviation;
  this.MachineModel = sMachineModel;
}

function parseMachineModels(aMachineModels)
{
  var htMachineModelMap = new Array();

  for(var i=0;i<aMachineModels.length; i++)
  {

    var sMachineModel = aMachineModels[i];
    var iSpaceIndex = sMachineModel.indexOf(" ");
    if( iSpaceIndex > 0 )
    {
      var sBrandAbbr = sMachineModel.substring(0,iSpaceIndex);
      var sModel = sMachineModel.substring(iSpaceIndex);
      var sBrandFull = "";
      switch(sBrandAbbr)
      {
        case "BOBCAT": sBrandFull = "Bobcat"; break;
        case "CASE": sBrandFull = "Case"; break;
        case "CAT": sBrandFull = "Caterpillar"; break;
        case "CHALLENGER": sBrandFull = "Challenger"; break;
        case "CHMPN": sBrandFull = "Champion"; break;
        case "DAEWOO": sBrandFull = "Daewoo"; break;
        case "DOOSAN": sBrandFull = "Doosan"; break;
        case "DRESSTA": sBrandFull = "Dressta"; break;
        case "DRS": sBrandFull = "Dresser"; break;
        case "FERMEC": sBrandFull = "Fermec"; break;
        case "HIT": sBrandFull = "Hitachi"; break;
        case "HUN": sBrandFull = "Hyundai"; break;
        case "JCB": sBrandFull = "JCB"; break;
        case "JD": sBrandFull = "John Deere"; break;
        case "KAW": sBrandFull = "Kawasaki"; break;
        case "KBA": sBrandFull = "Kubota"; break;
        case "KBLC": sBrandFull = "Kobelco"; break;
        case "KOM": sBrandFull = "Komatsu"; break;
        case "LB": sBrandFull = "Link-Belt"; break;
        case "NEW": sBrandFull = "New Holland"; sModel = sModel.substring(5); break;
        case "TAK": sBrandFull = "Takeuchi"; break;
        case "THOMAS": sBrandFull = "Thomas"; break;
        case "TRX": sBrandFull = "Terex"; break;
        case "VLV": sBrandFull = "Volvo"; break;
        case "VME": sBrandFull = "Volvo"; break;
        default: sBrandFull = "Other"; break;
      }


      var oMachineModel = new MachineModel(sModel,sMachineModel);

      if( sBrandFull == "Other" )
        oMachineModel.Abbreviation = sMachineModel;



      if(htMachineModelMap[sBrandFull])
      {
        htMachineModelMap[sBrandFull].push(oMachineModel);
      }
      else
      {
        htMachineModelMap[sBrandFull] = new Array();
        htMachineModelMap[sBrandFull].push(oMachineModel);
      }
    }
  }

  return htMachineModelMap;
}

function createLoadingOption(oSelect, bSecond)
{
  var oOption;

  // create a blank entry
  if( bSecond )
  {
    oOption = document.createElement('option');
    oSelect.appendChild(oOption);
    oOption.text="";
    oOption.value="";
  }

  oOption = document.createElement('option');
  oSelect.appendChild(oOption);
  oOption.text="Loading...";
  oOption.value="";
}

function trim(str)
{
  return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}


function isURLRequest()
{
  // if controls not blank
  var sLocation = decodeURI(location.search.substr(1).toLowerCase());
  sLocation = sLocation.replace(/%26/g,'&');
  var aParams = sLocation.split("&");
  if( aParams.length>1)
    return true;

  return false;
}


function displayGenericError(sMsg)
{
  showError(sMsg + "<br/>" + m_sSupportContact);
}
