//
// openWindow
//
function openWindow(theURL,winName,features) {
  window.open(theURL,winName,features);
}

//
// onOptionClick
//
function onOptionClick(clickedOption) {
  var name;
  var offer;
  var offerNumber;
  var selectedParentValue;
  var o, c;

  name = clickedOption.name;
  offer = getParentOffer(clickedOption);
  offerNumber = offer.value;

  if (offer.type != 'hidden' && !offer.checked) {
    offer.click(); // select the offer that this option is a member of
  }

  if (name.indexOf('child') != -1) {
    // child option clicked
    o = window.document.frm['offer' + offerNumber +'-parent']; // get parent options for selected offer

    selectedParentValue = name.replace('offer' + offerNumber + '-parent', '').replace('-child','');
    for (var i = 0; i < o.length; i++) { // find parent option of clicked child
      if (o[i].value == selectedParentValue) {
        o = o[i];
        break;
      }
    }

    if (!o.checked && o.type != 'hidden')
      o.click(); // select this parent option

  } else {
    // parent option changed
    c = window.document.frm[clickedOption.name + clickedOption.value + '-child']; // get the child offers
    
    if (!clickedOption.checked && c) {
      // uncheck all children of this parent
      if (c.length) { // multiple child options
        for (var i = 0; i < c.length; i++) {
          if (c[i].type != 'hidden')
            c[i].checked = false;
        }      
      } else { // single child option
        if (c.type != 'hidden')
          c.checked = false;
      }
    }
  }
  
  if (customOptionClick)
    customOptionClick(this);
}

//
// getSelectionTotal
//
function getSelectionTotal(includeDefaultOptions, ignoredIDs) {
  var total;
  var offerNumber;
  var priceField;
  var parentOption;
  var i;
  var e;
  offerNumber = getSelectedOfferNumber();
	
  if (!ignoredIDs)
    ignoredIDs = new Array();

  total = 0;
  for (i = 0; i < document.frm.elements.length; i++) {
    e = document.frm.elements[i];
    if (e.name == 'offer' + offerNumber + '-parent') { // parent option
      if (e.type == 'hidden' || e.checked) {
        // increment total if it's either a default option or it's checked
        if (e.value.substr(0,1) == 'g') { // group
          if (indexOf(ignoredIDs, e.value) == -1) {
            priceField = document.frm[e.name + e.value + '-price'];
            if (priceField) {
              // group has absolute price, add
              total += priceField.value - 0;
            }
            priceField = document.frm[e.name + e.value + '-discount'];
            if (priceField && hasSelectedChildren(e)) {
              // group has a discount price, subtract it from total if at least one of the children is selected
              total -= priceField.value - 0;
            }
          }
        } else { // top level option
          priceField = document.frm[e.name + e.value + '-price'];
          if (priceField) {
            total += priceField.value - 0;
          }
        }
      }
    } else if (e.name.substring(e.name.lastIndexOf('-') + 1) == 'child') { // child option
      if (((includeDefaultOptions && e.type == 'hidden') || e.checked) && isParentSelected(e)) {
        parentOption = getParentOption(e);
       if (parentOption) {
          if (!document.frm[parentOption.name + parentOption.value + '-price'] && indexOf(ignoredIDs, parentOption.value) == -1 && indexOf(ignoredIDs, e.value) == -1) {
            // only add price of child option if parent option does not have absolute price
            priceField = document.frm[e.name + e.value + '-price'];
            if (priceField)
              total += priceField.value - 0;
          }
        }
      }
    }
  }
  
  return total;
}

//
// getNumSelected
//   Gets the number of selected options
//
function getNumSelected(includeDefaultOptions, ignoredIDs) {
  var numSelected;
  var offerNumber;
  var parentOption;
  var i;
  var e;
  
  offerNumber = getSelectedOfferNumber();
  if (offerNumber == -1) return 0;
  
  if (!ignoredIDs)
    ignoredIDs = new Array();
  
  numSelected = 0;
  for (i = 0; i < document.frm.elements.length; i++) {
    e = document.frm.elements[i];
    if (e.name == 'offer' + offerNumber + '-parent') { // parent option
      if (e.value.substr(0,1) != 'g' && (e.type == 'hidden' || e.checked) && indexOf(ignoredIDs, e.value) == -1) {
        // increment count if it's not a group, it's either a default option or it's checked, and it's not in the ignored list
        numSelected++;
      }
    } else if (e.name.substring(e.name.lastIndexOf('-') + 1) == 'child') { // child option
      if ((includeDefaultOptions && e.type == 'hidden') || e.checked) {
        parentOption = getParentOption(e);
        if ((parentOption.type == 'hidden' || parentOption.checked) && indexOf(ignoredIDs, parentOption.value) == -1 && indexOf(ignoredIDs, e.value) == -1)
          numSelected++;
      }
    }
  }
  
  return numSelected;
}

//
// isParentSelected
//
function isParentSelected(e) {
  var offerNumber;
  var parentValue;
  var parentOptions;
  var i;
  
  offerNumber = getSelectedOfferNumber();
  if (offerNumber == -1) return false;
  
  // name will be "offer<offer_id>-parentg<group_id>-child", parent will be the input with the name "offer<offer_id>-parent" and a value of "g<group_id>"
  parentValue = e.name.replace('offer' + offerNumber + '-parent', '').replace('-child', '');
  parentOptions = document.frm['offer' + offerNumber + '-parent'];
  if (parentOptions.length >= 2) {
	  for (i = 0; i < parentOptions.length; i++) {
		if (parentOptions[i].value == parentValue) {
		  if (parentOptions[i].type == 'hidden' || parentOptions[i].checked)
			return true;
		  else
			return false;
		}
	  }
  }
  else if (parentOptions.value != "") {
	  return true;
  }
  return false;
}

//
// getParentOption
//
function getParentOption(e) {
  var offerNumber;
  var parentValue;
  var parentOptions;
  var i;
  
  offerNumber = getSelectedOfferNumber();
  if (offerNumber == -1) return null;
  
  // name will be "offer<offer_id>-parentg<group_id>-child", parent will be the input with the name "offer<offer_id>-parent" and a value of "g<group_id>"
  parentValue = e.name.replace('offer' + offerNumber + '-parent', '').replace('-child', '');
  parentOptions = document.frm['offer' + offerNumber + '-parent'];
  if (parentOptions.length >= 2) {
	  for (i = 0; i < parentOptions.length; i++) {
		if (parentOptions[i].value == parentValue) {
		  return parentOptions[i];
		}
	  }
  }
  else if (parentOptions.value != "") {
		if (parentOptions.value == parentValue) {
		  return parentOptions;
		}
  }
  return null;
}

//
// getSelectedOfferNumber
//
function getSelectedOfferNumber() {
  var o;
  o = getSelectedOffer();
  if (o == null) return -1;
  else return o.value;
}

//
// getSelectedOffer
//
function getSelectedOffer() {
  var o, i;
  var v;
  
  o = document.frm['offer'];
  if (!o)
    return null;
  
  if (o.length) {
    // multiple offers
    for (i = 0; i < o.length; i++) {
      if (o[i].checked) {
        return o[i];
      }
    }
  } else {
    // single offer
    return o;
  }
  
  return null;
}

//
// getParentOffer
//
function getParentOffer(option) {
  var offerNumber;
  offerNumber = option.name.substring(5, option.name.indexOf('-'));

  o = document.frm['offer'];
  if (!o)
    return null;
  
  if (o.length) {
    // multiple offers
    for (i = 0; i < o.length; i++) {
      if (o[i].value == offerNumber) {
        return o[i];
      }
    }
  } else {
    // single offer
    return o;
  }
}

//
// setGroupDisabledAttr
//   sets the disabled attribute of all child options under a group (but not the group option itself)
//
function setGroupDisabledAttr(groupId, value) {
  var offerNumber;
  var parentOptions;
  var childOptions;
  var p;
  var i;
  
  offerNumber = getSelectedOfferNumber();
  
  if (groupId.substr(0,1) != 'g')
    groupId = 'g' + groupId
    
  parentOptions = document.frm['offer' + offerNumber + '-parent'];
  for (i = 0; i < parentOptions.length; i++) {
    if (parentOptions[i].value == groupId) {
      p = parentOptions[i];
      break;
    }
  }

  if (p == null)
    return;
  
  childOptions = getChildOptions(p);
  for (i = 0; i < childOptions.length; i++) {
    childOptions[i].disabled = value;
  }
}


//
// setOptionDisabledAttr
//   sets the disabled attribute for an option, put 'g' in front of the group_id
//   to disable a group option.
//
function setOptionDisabledAttr(optionId, value) {
  var offerNumber;
  var o;
  
  offerNumber = getSelectedOfferNumber();
  o = getParentOptionById(optionId);
  if (o)
    o.disabled = value;
}


//
// hasSelectedChildren
//   returns true if group option e has default child options or the user has selected one of the child options
//
function hasSelectedChildren(e) {
  var o;
  var i;
  
  o = document.frm[e.name + e.value + '-child'];
  if (o) {
    if (o.length) { // multiple children
      for (i = 0; i < o.length; i++) {
        if (o[i].type == 'hidden' || o[i].checked) {
          return true;
        }
      }
      return false;
    } else { // single child
      if (o.type == 'hidden' || o.checked)
        return true;
      else
        return false;
    }
  } else {
    return false;
  }
}

//
// getParentOptionById
//   prefix group ids with a 'g'
//
function getParentOptionById(optionId) {
  var offerNumber;
  var parentOptions;
  var o;
  var i;
  
  offerNumber = getSelectedOfferNumber();
  if (offerNumber == -1) return null;
    
  parentOptions = document.frm['offer' + offerNumber + '-parent'];
  for (i = 0; i < parentOptions.length; i++) {
    if (parentOptions[i].value == optionId) {
      o = parentOptions[i];
      break;
    }
  }
  
  return o;
}

//
// getChildOptions
//
function getChildOptions(e) {
  var o;
  var i;
  
  o = document.frm[e.name + e.value + '-child'];
  if (o) {
    if (o.length) { // multiple children
      return o;
    } else { // single child
      return (new Array(o));
    }
  } else {
    return new Array();
  }
}

//
// indexOf
//
function indexOf(a,v) {
  var i;
  for (i = 0; i < a.length; i++) {
    if (a[i] == v)
      return i;
  }
  return -1;
}

//
// formatCurrency
//
function formatCurrency(num) {
  num = num.toString().replace(/\$|\,/g,'');
  if(isNaN(num))
    num = "0";
  sign = (num == (num = Math.abs(num)));
  num = Math.floor(num*100+0.50000000001);
  cents = num%100;
  num = Math.floor(num/100).toString();
  if(cents<10)
    cents = "0" + cents;
  for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
    num = num.substring(0,num.length-(4*i+3))+','+
  num.substring(num.length-(4*i+3));
  return (((sign)?'':'-') + '$' + num + '.' + cents);
}