/**
 * BACK-OFFICE price-tweaking script for Ciblo Boutique.
 *
 * Requires Prototype 1.6.
 *
 * @author Christophe Porteneuve <christophe@ciblo.net>
 * @legals © 2008 Ciblo SA.
 */

PriceHandler = (function() {
  var fields, taxes = {}, currentMode;

  function reactToValueChange(field, value) {
    setupFields();
    var fieldIsTotal = field.id.include('Total'), value = parseFloat(value.gsub(/[^\d,.]/, '').replace(',', '.'));
    if (fieldIsTotal != currentMode || isNaN(value) || value < 0) return;

    var index = fields[fieldIsTotal].indexOf(field);
    var converseField = fields[!fieldIsTotal][index], taxField = fields['tax'][index];
    var tax = taxes[$('cbxTax') ? $F('cbxTax') : $F('hidTaxId')], taxValue, converseValue;

    if (fieldIsTotal) {
      taxValue = tax.percent ? tax.centiles * value / (100 + tax.centiles) : tax.centiles;
      converseValue = value - taxValue;
    } else {
      taxValue = tax.percent ? value * tax.centiles / 100 : tax.centiles;
      converseValue = value + taxValue;
    }
    taxField.setValue(taxValue.toFixed(2).replace('.', ','));
    converseField.setValue(converseValue.toFixed(2).replace('.', ','));
  }
  
  function registerTaxes(taxHash) {
    taxes = taxHash;
  }
  
  function setupFields() {
    if (fields !== undefined) return;
    fields = {
      'false': $('edtPurchaseValue', 'edtSaleValue', 'edtReqSaleValue').compact(),
      'true':  $('edtPurchaseTotalValue', 'edtSaleTotalValue', 'edtReqSaleTotalValue').compact(),
      tax:     $('edtPurchaseTaxValue', 'edtSaleTaxValue')
    };
  }
  
  function toggleMode(eventOrTotalMode, autoFocus) {
    if (typeof eventOrTotalMode != 'boolean')
      return toggleMode(this.id.endsWith('Total'), true);
    currentMode = eventOrTotalMode;
    setupFields();
    fields[eventOrTotalMode].each(function(f) {
      f.removeClassName('disabled').enable();
    });
    fields[!eventOrTotalMode].each(function(f) {
      f.addClassName('disabled');
      if (!f.disabled)
        f.disable();
    });
    if (autoFocus)
      fields[eventOrTotalMode].first().activate();
  }
  
  return {
    reactToValueChange: reactToValueChange,
    registerTaxes:      registerTaxes,
    toggleMode:         toggleMode
  };
})();

function initPriceHooks() {
  var togglers = $('rbtInputOnTotal', 'rbtInputOnRegular').compact();
  if (togglers.length == 0) return;
  togglers.invoke('observe', 'click', PriceHandler.toggleMode);
  PriceHandler.toggleMode(togglers[0].checked);
  $w('edtPurchaseValue edtPurchaseTotalValue edtSaleValue edtSaleTotalValue edtReqSaleTotalValue').each(function(field) {
    field = $(field);
    if (!field) return;
    new Field.Observer(field, 0.4, PriceHandler.reactToValueChange);
  });
}

document.observe('dom:loaded', initPriceHooks);
