// {{{ fixprice(element_or_text, cSymbol, allowpc, orFree)
function fixprice(p, cSymbol, allowpc, orFree){
  if(typeof(p) === 'undefined') p = 0;

  var isEl = (typeof(p) === 'object' && p.nodeName);
  var v; var ispcout; var sout; var ispc;
  if(isEl){
    allowpc = p.hasClassName('allowpc');
    ispcout = p.hasClassName('pcout');
    sout    = p.hasClassName('sout');
    v = p.value;
    ispc = allowpc ? ispcout || v.match(/% *$/) : 0;

    if(ispc) {
      v = parseFloat(v) || 0;
      if(isEl) {
        return p.value = v + (ispcout ? '' : '%');
      }
      return p.value = v + (ispcout ? '' : '%');
    }

  } else {
    v = p;
  }

  v = from_money(v || '0.00');
  var defVal;
  if(isEl){
    defVal = from_money(p.defaultValue || '0.00');
  }

  // if(v.match(/^[0-9]+\.[0-9][0-9]$/)){
    // var err = $(p.getAttribute('id') + '_error');
    //if(err && err.parentNode) err.parentNode.removeChild(err);

  // } else {
  //   alert("CREATE ERROR NODE");
  // }

  if(orFree && (!v || v == '0.00')) {
    ret = freeVal || 'Free';
  } else if(sout) {
    ret = v;
  } else {
    ret = cSymbolPrefix ? cSymbol + v : v + cSymbol;
    if(isEl && defVal) {
      defVal = cSymbolPrefix ? cSymbol + defVal : defVal + cSymbol;
    }
  }

  if(isEl) {
    if(defVal === ret) {
      p.defaultValue = defVal;
    }
    return p.value = ret;
  } else {
    return ret;
  }
}; // }}}

// {{{ fixprice_init()
function fixprice_init() {
 if(typeof(Prototype) === 'undefined') return;

 if(typeof(cSymbol) === 'undefined')
   cSymbol = '$';

 if(typeof(cSymbolPrefix) === 'undefined')
   cSymbolPrefix = 1;

 addCurrencyTo();
} // }}}

// {{{ addCurrencyTo([parentEl])
function addCurrencyTo(pEl) {
 var els = pEl ? pEl.select('.currency') || $A(pEl) : $$('.currency');

 els.each(function(el) {
   fixprice(el, cSymbol);

   // Clean up prices after editing:
   if(pEl) el.stopObserving('blur', fixPriceOnBlur); // Don't duplicate onBlur
   el.observe('blur', fixPriceOnBlur);
 });
} // }}}

// {{{ from_money(v)
function from_money(v) {
  if(!v) return;
  if(typeof(cDecimalSep) === 'undefined') {
    cDecimalSep = '[.,]';
  } else if(cDecimalSep.length == 1) {
    // quick way to "escape" the pattern
    cDecimalSep = '[' + cDecimalSep + ']';
  }

  // Strip entities:
  v = new String(v);
  v = v.replace(/&#x?[0-9A-Z]+;/g, '');
  v = v.replace(/&[a-z0-9]+;/g, '');
  v = v.replace(/\\u[0-9]+/g, '');

  v = v.replace(/[^0-9., ]/g, '');

  var int_dec = v.match(new RegExp('^([0-9]+)'+ cDecimalSep +'([0-9]{1,})$'));
  if(int_dec) {
    v = int_dec[1].replace(/[^0-9]/, '')
      + '.' + int_dec[2];
  }

  if(!v.match(/^0\.[0-9]+$/)) {
    v = v.replace(/^0/, '');
  }

  if(v.match(/\.[0-9]{2,}$/)) {
    v = floatAsDP(v, 2);
  }


  if(v.match(/\.$/)) {
    v = v + '00';
  } else if(v.match(/\.[0-9]$/)) {
    v = v + '0';
  } else if(v.match(/^[0-9]+$/)) {
    v = v + '.00';
  } else if(v.match(/^[,.]/)) {
    v = 0 + v;
  } else if(!v) {
    v = '0.00';
  }

  return v;
} // }}}

// {{{ floatAsDP(val, dp)
function floatAsDP(val, dp) {
  if(!dp) dp = 2;
  var dpRE = new RegExp('^([0-9]+\\.[0-9]{' + dp + '})([0-9]?)[0-9]*$');
  val = new String(val);

  var ret = val.replace(dpRE,
                  function(a, b, c) {
                    c = parseInt(c || 0);
                    var ret = parseFloat(b) + (c > 5 ? 0.01 : 0);
                    var dpRE2 = new RegExp('(\\.[0-9]{' + dp + '})[0-9]*$');
                    ret = new String(ret).replace(dpRE2, '$1');
                    return ret;
                  });
  return ret;
} // }}}

// {{{ fixPriceOnBlur(ev)
function fixPriceOnBlur(ev){
 ev.stop();
 var p = Event.element(ev);
 fixprice(p, cSymbol);
 return true;
}; // }}}

if(typeof(fixprice_queued) === 'undefined' || !fixprice_queued) {
  Event.observe(window, 'load', fixprice_init);
  fixprice_queued = 1;
}
