/************************************************************************
**                                                                     **
** PerfectCar Option/Color Relationship Rules Engine                   **
** Copyright (c) 2004 Xprima Corporation, All Rights Reserved          **
**                                                                     **
** Francis Caporuscio                                                  **
** December 2003-January 2004                                          **
**                                                                     **
************************************************************************/

var __imgs = new Array();
var __i;
if(_regColors) {
  for(__i = 0; __i < CL.length; __i++) {
    __imgs[__i] = new Image();
    __imgs[__i].src = (CL[__i][4] == "") ? 'spacer.gif' : CL[__i][4];
  }
}

var _cache_hasBothColors = new Array();
var _cache_getExteriorColor = new Array();

// #######################################################################
function selectColorE(id)
{
  var i;
  var j;
  var c = new Array();
  var c2 = new Array();
  var cop;
  var co;
  var r = true;
  var found = false;

  if(document.pcOptionSelection["CEIMG" + id.toString()].src == iExc.src) {
    return false;
  }

  for(i = 0; i < CLe.length; i++) {
    cop = "CE" + CLe[i].toString();
    co = document.pcOptionSelection[cop];

    if(CLe[i] != id) {
      co.checked = false;
    }
    else {
      if(!co.checked) {
        co.checked = true;
      }
    }
  }

  found = false;
  for(i = 0; i < CLi.length; i++) {
    cop = "CI" + CLi[i].toString();
    co = document.pcOptionSelection[cop];
    co.checked = false;
  }
  found = false;

  processColorRules();

  // get selected external (could have changed)
  for(i = 0; i < CLe.length; i++) {
    if(document.pcOptionSelection["CE" + CLe[i].toString()].checked) {
      id = CLe[i];
    }
  }

  if(r) {
    // set internal colours
    c = new Array();
    for(i = 0; i < CL.length; i++) {
      if(CL[i][0] == id) {
        c[c.length] = CL[i][1];
      }
    }

    for(i = 0; i < CLi.length; i++) {
      found = false;
      for(j = 0; !found && j < c.length; j++) {
        if(CGA.length > 0) {
          if(CLi[i] == c[j] && document.pcOptionSelection["CIIMG" + c[j].toString()].src != iExc.src) {
            found = true;
          }
        }
        else {
          if(CLi[i] == c[j]) {
            found = true;
          }
        }
      }

      cop = "CIIMG" + CLi[i].toString();
      co = document.pcOptionSelection[cop];
      if(found) {
        co.src = iOK.src;
      }
      else {
        co.src = iExc.src;
      }
    }

    // Check if internal colour is focused on a valid selection
    _selectInternal(id);
    setInternalColorPrices();

    if(_regOptions) {
      setCH();
      calcPrice2();
    }
  }

  setColorPickerImage();
  return r;
}


// #######################################################################
function _selectInternal(id)
{
  var i;
  var found = false;
  var idx = -1;
  var c;
  var op;
  var op1;

  for(i = 0; !found && i < CL.length; i++) {
    if(CL[i][0] == id) {
      if(idx == -1) {
        idx = i;
      }

      op = document.pcOptionSelection["CI" + CL[i][1].toString()];
      if(op.checked && op.src != iExc.src) {
        found = true;
      }
    }
  }

  if(!found && idx != -1) {
    for(i = 0; i < CL.length; i++) {
      op = document.pcOptionSelection["CI" + CL[i][1].toString()];
      op1 = document.pcOptionSelection["CIIMG" + CL[i][1].toString()];
      op.checked = (CL[idx][0] == CL[i][0] && op1.src != iExc.src) ? true : false;

      if(op.checked) {
        return;
      }
    }
  }
}


// #######################################################################
function selectColorI(id)
{
  var cop = "CI" + id.toString();
  var op = document.pcOptionSelection[cop];
  var i;
  var c = new Array();
  var r = true;

  cop = "CIIMG" + id.toString();
  op = document.pcOptionSelection[cop];

  r = (op.src == iExc.src) ? false : true;

  if(r) {
    for(i = 0; i < CLi.length; i++) {
      cop = "CI" + CLi[i].toString();
      co = document.pcOptionSelection[cop];

      if(CLi[i] != id) {
        co.checked = false;
      }
      else {
        if(!co.checked) {
          co.checked = true;
          //r = false;
        }
      }
    }
  }

  if(r) {
    if(_regTaxes) {
      if(_legacySystem) {
        calcPrice();
      }
      else {
        calcPrice2();
      }
    }
  }

  return r;
}



// #######################################################################
function getColorSelectionPrice()
{
  var price = 0;
  var i;
  var f = document.forms.pcOptionSelection;
  var found = false;

  for(i = 0; !found && i < CL.length; i++) {
    if(f["CE" + CL[i][0].toString()].checked && f["CI" + CL[i][1].toString()].checked) {
      price += CL[i][2] + CL[i][3];
      found = true;
    }
  }

  return price;
}


// #######################################################################
function processColorRules()
{
  var i;
  var cmpType;
  var L;
  var R;
  var success;
  var f = document.forms.pcOptionSelection;

  if(_regOptions) {
    for(i = 0; i < CLe.length; i++) {
      f["CEIMG" + CLe[i].toString()].src = iOK.src;
    }

    for(i = 0; i < CLi.length; i++) {
      f["CIIMG" + CLi[i].toString()].src = iOK.src;
    }

    for(i = 0; i < CGA.length; i++) {
      cmpType = (CGA[i][0] * 100) + (CGA[i][1] * 10) + CGA[i][2];
      L  = CGA[i][3];
      R  = CGA[i][4];

      switch(cmpType) {
        case  10: cmpC010(L,R);
                  break;

        case  11: cmpC011(L,R);
                  break;

        case 110: cmpC110(L,R);
                  break;

        case 111: cmpC111(L,R);
                  break;

        default: break;
      }
    }

    _checkColorSelection();
  }
}


// #######################################################################
function cmpC010(L,R)
{
  var Rs = CRany(R);
  var colorE;
  var f = document.forms.pcOptionSelection;

  if(_hasBothColors(L)) {
    // Only applies when exterior color is active
    colorE = _getExteriorColor(L);
    if(colorE > 0) {
      if(f["CE" + colorE.toString()].checked) {
        _makeInteriorColorAvailable(L, Rs);
      }
    }
  }
  else {
    _makeColorsAvailable(L, Rs);
  }
}


// #######################################################################
function cmpC011(L,R)
{
  var Rs = CRall(R);
  var colorE;
  var f = document.forms.pcOptionSelection;

  if(_hasBothColors(L)) {
    // Only applies when exterior color is active
    colorE = _getExteriorColor(L);
    if(colorE > 0) {
      if(f["CE" + colorE.toString()].checked) {
        _makeInteriorColorAvailable(L, Rs);
      }
    }
  }
  else {
    _makeColorsAvailable(L, Rs);
  }
}


// #######################################################################
function cmpC110(L,R)
{
  var Ls = CLall(L);
  var colorE;
  var f = document.forms.pcOptionSelection;

  if(_hasBothColors(R)) {
    // Only applies when exterior color is active
    colorE = _getExteriorColor(R);
    if(colorE > 0) {
      if(f["CE" + colorE.toString()].checked) {
        _makeInteriorColorAvailable(R, !Ls);
      }
    }
  }
  else {
    _makeColorsAvailable(R, !Ls);
  }
}


// #######################################################################
function cmpC111(L,R)
{
  var Ls = CLall(L);
  var colorE;
  var f = document.forms.pcOptionSelection;

  if(_hasBothColors(R)) {
    // Only applies when exterior color is active
    colorE = _getExteriorColor(R);
    if(colorE > 0) {
      if(f["CE" + colorE.toString()].checked) {
        _makeInteriorColorAvailable(R, !Ls);
      }
    }
  }
  else {
    _makeColorsAvailable(R, !Ls);
  }
}


// #######################################################################
function CLall(L)
{
  var Ls = true;
  var i;
  var j;
  var idx;
  var op;
  var f = document.forms.pcOptionSelection;

  for(i = 0; Ls && i < CG[L].length; i++) {
    idx = CG[L][i];
    if(idx < 0) {
      idx *= -1;

      op = "";
      for(j = 0; op == "" & j < CL.length; j++) {
        if(CL[j][0] == idx) {
          op = "CE" + idx.toString();
        }
        else if(CL[j][1] == idx) {
          op = "CI" + idx.toString();
        }
      }

      if(op != "") {
        if(!f[op].checked) {
          Ls = false;
        }
      }
    }
    else {
      if(ch[idx] != 1) {
        Ls = false;
      }
    }
  }

  return Ls;
}


// #######################################################################
function CRany(R)
{
  var Rs = false;
  var i;
  var j;
  var idx;
  var op;
  var f = document.forms.pcOptionSelection;

  for(i = 0; i < CG[R].length; i++) {
    idx = CG[R][i];
    if(idx < 0) {
      idx *= -1;

      op = "";
      for(j = 0; op == "" & j < CL.length; j++) {
        if(CL[j][0] == idx) {
          op = "CE" + idx.toString();
        }
        else if(CL[j][1] == idx) {
          op = "CI" + idx.toString();
        }
      }

      if(op != "") {
        if(f[op].checked) {
          Rs = true;
        }
      }
    }
    else {
      if(ch[idx] == 1) {
        Rs = true;
      }
    }
  }

  return Rs;
}


// #######################################################################
function CRall(R)
{
  var Rs = true;
  var i;
  var j;
  var idx;
  var op;
  var f = document.forms.pcOptionSelection;

  for(i = 0; Rs && i < CG[R].length; i++) {
    idx = CG[R][i];
    if(idx < 0) {
      idx *= -1;

      op = "";
      for(j = 0; op == "" & j < CL.length; j++) {
        if(CL[j][0] == idx) {
          op = "CE" + idx.toString();
        }
        else if(CL[j][1] == idx) {
          op = "CI" + idx.toString();
        }
      }

      if(op != "") {
        if(!f[op].checked) {
          Rs = false;
        }
      }
    }
    else {
      if(ch[idx] != 1) {
        Rs = false;
      }
    }
  }

  return Rs;
}


// #######################################################################
function _makeColorsAvailable(g, avail)
{
  var c = new Array();
  var i;
  var j;
  var op;
  var opi;
  var f = document.forms.pcOptionSelection;

  // Get group colors
  for(i = 0; i < CG[g].length; i++) {
    if(CG[g][i] < 0) {
      c[c.length] = CG[g][i] * -1;
    }
  }

  for(i = 0; i < c.length; i++) {
    op = "";
    for(j = 0; op == "" && j < CL.length; j++) {
      if(CL[j][0] == c[i]) {
        op  = "CE" + c[i].toString();
        opi = "CEIMG" + c[i].toString();
      }
      else if(CL[j][1] == c[i]) {
        op  = "CI" + c[i].toString();
        opi = "CIIMG" + c[i].toString();
      }
    }

    if(op != "") {
      if(f[opi].src != iExc.src) {
        f[opi].src = avail ? iOK.src : iExc.src;
      }
    }
  }

  //_checkColorSelection();
}


// #######################################################################
function _makeInteriorColorAvailable(g, avail)
{
  var colorI = _getInteriorColor(g);
  var f = document.forms.pcOptionSelection;
  var opI;

  if(colorI > 0) {
    opI = f["CIIMG" + colorI.toString()];

    if(opI.src != iExc.src) {
      opI.src = avail ? iOK.src : iExc.src;
    }
  }

  //_checkColorSelection();
}


// #######################################################################
function _checkColorSelection()
{
  // Make sure that the current colour selection is acceptable, otherwise
  // select the first available set.

  var i;
  var j;
  var opE;
  var opEI;
  var opII;
  var opI;
  var setE = false;
  var setI = false;
  var f = document.forms.pcOptionSelection;
  var set = false;
  var eChecked = false;
  var iChecked = false;

  for(i = 0; i < CL.length; i++) {
    opE  = f["CE" + CL[i][0]];
    opEI = f["CEIMG" + CL[i][0]];
    opI  = f["CI" + CL[i][1]];
    opII = f["CIIMG" + CL[i][1]];

    if(opE.checked) eChecked = true;
    if(opI.checked) iChecked = true;

    if(opE.checked && opEI.src == iExc.src) {
      setE = true;
    }

    if(opI.checked && opII.src == iExc.src) {
      setI = true;
    }
  }

  if(!eChecked) setE = true;
  if(!iChecked) setI = true;

  if(setE) {
    setI = true;
    // Setting E will automatically select a good I
    for(i = 0; i < CL.length; i++) {
      opE  = f["CE" + CL[i][0]];
      opEI = f["CEIMG" + CL[i][0]];
      opI  = f["CI" + CL[i][1]];
      opII = f["CIIMG" + CL[i][1]];
      opE.checked = false;
      opI.checked = false;
    }

    for(i = 0; !set && i < CL.length; i++) {
      opE  = f["CE" + CL[i][0]];
      opEI = f["CEIMG" + CL[i][0]];

      if(opEI.src != iExc.src) {
        selectColorE(CL[i][0]);
        set = true;
      }

      /*
      opI  = f["CI" + CL[i][1]];
      opII = f["CIIMG" + CL[i][1]];

      if(opEI.src != iExc.src && opII.src != iExc.src) {
        opE.checked = true;
        opI.checked = true;

        selectColorE(CL[i][0]);
        selectColorI(CL[i][1]);

        set = true;
      }
      */
    }
  }

  if(setI) {
    // Let's find out which E is set
    opE = 0;
    j = -1;
    for(i = 0; i < CL.length; i++) {
      opI = f["CI" + CL[i][1].toString()];
      opI.checked = false;
      if(setI && f["CE" + CL[i][0].toString()].checked) {
        opE = CL[i][0];
        j = i;
        setI = false;
      }
    }

    if(j != -1 && opE != 0) {
      // Set the first available I
      // Resume from previous position
      for(i = j; j != -1 && i < CL.length; i++) {
        opI = f["CI" + CL[i][1].toString()]
        opII = f["CIIMG" + CL[i][1].toString()];
        if(CL[i][0] == opE && opII.src != iExc.src) {
          opI.checked = true;
          j = -1; // to stop
        }
      }
    }
  }

  if(_regOptions) {
    setCH();
    calcPrice2();
  }
}


// #######################################################################
function _hasBothColors(g)
{
  var i;
  var j;
  var idx;
  var hasExterior = false;
  var hasInterior = false;


  if(_cache_hasBothColors.length > g) {
    cache = _cache_hasBothColors[g]
    if(cache == true || cache == false) {
      return cache;
    }
  }

  if(CG[g].length > 1) {
    for(i = 0; i < CG[g].length; i++) {
      if(CG[g][i] < 0) {
        idx = CG[g][i] * -1;
        for(j = 0; j < CL.length; j++) {
          if(!hasExterior && CL[j][0] == idx) {
            hasExterior = true;
          }

          if(!hasInterior && CL[j][1] == idx) {
            hasInterior = true;
          }
        }
      }
    }
  }

  if(hasExterior && hasInterior) {
    _cache_hasBothColors[g] = true;
    return true;
  }
  _cache_hasBothColors[g] = false;
  return false;
}


// #######################################################################
function _getInteriorColor(g) {
  var i;
  var j;
  var idx;

  for(i = 0; i < CG[g].length; i++) {
    if(CG[g][i] < 0) {
      idx = CG[g][i] * -1;
      for(j = 0; j < CL.length; j++) {
        if(CL[j][1] == idx) {
          return idx;
        }
      }
    }
  }

  return 0;
}


// #######################################################################
function _getExteriorColor(g) {
  var i;
  var j;
  var idx;

  if(_cache_getExteriorColor.length > g) {
    cache = _cache_getExteriorColor[g];
    if(!isNaN(cache)) {
      return cache;
    }
  }

  for(i = 0; i < CG[g].length; i++) {
    if(CG[g][i] < 0) {
      idx = CG[g][i] * -1;
      for(j = 0; j < CLe.length; j++) {
        if(CLe[j] == idx) {
          _cache_getExteriorColor[g] = idx;
          return idx;
        }
      }
    }
  }

  _cache_getExteriorColor[g] = 0;
  return 0;
}


// #######################################################################
function setColorPickerImage()
{
  var i;
  var op;
  var f = document.forms.pcOptionSelection;

  if(_regColorPicker) {
    // We need to determine which colour is selected
    for(i = 0; i < CL.length; i++) {
      op = f["CE" + CL[i][0].toString()];
      if(op.checked) {
        colorPickerSetImage(i);
        i = CL.length; // to stop loop
      }
    }
  }
}


// #######################################################################
function setInternalColorPrices()
{
  var i;
  var op;
  var p;
  var f = document.forms.pcOptionSelection;

  for(i = 0; i < CL.length; i++) {
    if(f["CE" + CL[i][0].toString()].checked) {
      op = f["_CI" + CL[i][1].toString()];
      p = CL[i][3];
      op.value = (p != 0) ? frmt(p) : "";
    }
  }
}

// #######################################################################
function processColorRulesCur()
{
  var i;
  var f = document.forms.pcOptionSelection;

  for(i = 0; i < CLe.length; i++) {
    if(f["CE" + CLe[i].toString()].checked) {
      selectColorE(CLe[i]);
      i = CLe.length;
    }
  }
}

