

function markChanged(el)
{
    if (el.value!=el.defaultValue)
    {
        el.className='changed';
        el.title=sprintf(_("Not saved, was: %s"),el.defaultValue);
        tdel=el.parentNode;
        if (tdel && tdel.nodeName=='td')
        {
            trel=tdel.parentNode;
            if (trel && trel.nodeName=='tr')
            {
                trel.className='changed';
            }
        }
    }
    else
    {
        el.className='';
        el.title="";
        tdel=el.parentNode;
        if (tdel && tdel.nodeName=='td')
        {
            trel=tdel.parentNode;
            if (trel && trel.nodeName=='tr')
            {
                trel.className='';
            }
        }
    }
    return true;
}

function setTextContent(e_container,content)
{
  if (e_container.childNodes)
  {
    for (var i=0; i<e_container.childNodes.length; i++)
    {
      e_container.removeChild(e_container.childNodes[i]);
    }
  }
  if (content)
  {
    e_container.appendChild(document.createTextNode(content));
    e_container.style.display='';
  }
  else
  {
    e_container.style.display='none';
  }
}

function setIdTextContent(id,content)
{
  var e_container=document.getElementById(id);
  if (e_container)
  {
    setTextContent(e_container,content);
  }
  else
  {
    kaylee_debug("Error setIdTextContent(\""+id+"\",\""+content+"\"): id not found.");
  }
}


function setMaterialProductEnabled(einput)
{
  einput.parentNode.parentNode.className=(einput.checked ? 'enabled' : 'disabled');
}



function compatAddEvent(tobj, etype, hfunc, capture)
{
  if (tobj.addEventListener)
  {
    tobj.addEventListener(etype,hfunc,capture);
    return true;
  }
  else if (tobj.attachEvent)
  {
    return tobj.attachEvent('on'+etype,hfunc);
  }
  else
  {
    tobj['on'+etype]=hfunc;
  }
}

function compatFireEvent(tobj, etype, canbubble, cancellable)
{
  if (document.createEvent)
  {
    var ev;
    try
    {
      ev=document.createEvent("Event");
    }
    catch (e)
    {
      ev=document.createEvent("HTMLEvents");
    }
    ev.initEvent(etype,canbubble,cancellable);
    tobj.dispatchEvent(ev);
    return;
  }

  if (tobj.fireEvent)
  {
    tobj.fireEvent("on"+etype);
  }
  else if (eval("tobj.on"+etype))
  {
    eval("tobj.on"+etype+"()");
  }
  else if (eval("tobj."+etype))
  {
    eval("tobj."+etype+"()");
  }
}


Function.prototype.bindAsEventListener=function(toobj)
{
  var __method=this;
  return function(event) { return __method.call(toobj, event || window.event); }
}


var e_debug;
function kaylee_debug(msg)
{
  if (!e_debug)
  {
    var bodies=document.getElementsByTagName("body");
    if (bodies.length)
    {
      // create this first to stop recursion!
      e_debug=document.createElement("code");

      bodies[0].appendChild(document.createElement("hr"));
      var e_h2=document.createElement("h2");
      e_h2.appendChild(document.createTextNode(_("Debug Output")));
      bodies[0].appendChild(e_h2);
      var e_explanation=document.createElement("p");
      e_explanation.appendChild(document.createTextNode(_("You can probably safely ignore all of this below, if it appears.")));
      bodies[0].appendChild(e_explanation);
      bodies[0].appendChild(e_debug);
    }
  }
  if (e_debug)
  {
    e_debug.appendChild(document.createTextNode(msg));
    e_debug.appendChild(document.createElement("br"));
    e_debug.appendChild(document.createTextNode("\r\n"));
  }
  else
  {
    window.alert("unable to build debug, message: "+msg);
  }
}

function round_off(dp,value)
{
  var value_object=new Number(value);
  if (value_object && value_object.toFixed)
  {
    return value_object.toFixed(dp);
  }
  return value;
}

function format_money(money)
{
  money=parseFloat(money)
  if (Math && Math.round)
  {
    money=Math.round(money*1000)/1000.0;
  }
  return round_off(2,money);
}


function forceUpper(el)
{
    upelv=new String(el.value);
    el.value=upelv.toUpperCase();
    return true;
}

function forceInt(el)
{
    var eli;

    if (el.value=='') { eli=0; }
    else { eli=parseInt(el.value, 10); }

    if (isNaN(eli))
    {
        window.alert(_("Must be a number"));
        el.focus();
        el.select();
        return false;
    }
    el.value=eli;
    return true;
}

function forceUInt(el)
{
    var eli;

    if (el.value=='') { eli=0; }
    else { eli=parseInt(el.value, 10); }
    if (isNaN(eli))
    {
        window.alert(_("Must be a number"));
        el.focus();
        el.select();
        return false;
    }
    if (eli<0)
    {
        window.alert(_("Cannot be negative"));
        el.focus();
        el.select();
        return false;
    }
    el.value=eli;
    return true;
}

function forceUFloat(el)
{
    var eli;

    if (el.value=='') { eli=0; }
    else { eli=parseFloat(el.value); }
    if (isNaN(eli))
    {
        window.alert(_("Must be a number"));
        el.focus();
        el.select();
        return false;
    }
    if (eli<0)
    {
        window.alert(_("Cannot be negative"));
        el.focus();
        el.select();
        return false;
    }
    el.value=eli;
    return true;
}


function get_form_element_value(e)
{
  var e_value;
  if (e.nodeName.toLowerCase()=="select")
  {
    e_value=e.options[e.selectedIndex].value;
  }
  else if (e.nodeName.toLowerCase()=="input")
  {
    e_value=e.value;
  }
  return e_value;
}


function updateProductData(category_data,product,prefix)
{
  var pdata=category_data[product];

  setIdTextContent(prefix+"short_description",pdata.short_description);
  setIdTextContent(prefix+"long_description",pdata.long_description);

  var e_a_popup=document.getElementById(prefix+"popup_link");
  if (e_a_popup) { e_a_popup.style.display='none'; }

  var e_img_thumbnail=document.getElementById(prefix+"thumbnail");
  if (e_img_thumbnail)
  {
    e_img_thumbnail.style.display='none';
    if (pdata.url_thumbnail)
    {
      e_img_thumbnail.src='/kaylee/images/indicator.white.gif';
      e_img_thumbnail.src=pdata.url_thumbnail;
      e_img_thumbnail.style.display='';
    }
  }

  var e_img_preview=document.getElementById(prefix+"preview_image");
  if (e_img_preview)
  {
    e_img_preview.style.display='none';
    if (pdata.url_preview_image)
    {
      e_img_preview.src='/kaylee/images/indicator.white.gif';
      e_img_preview.src=pdata.url_preview_image;
      e_img_preview.style.display='';
    }
  }

  var e_popup_span=document.getElementById(prefix+"popup");
  if (e_popup_span)
  {
    if (pdata.long_description || pdata.short_description || pdata.url_preview_image)
    {
      e_popup_span.className='popup';
    }
    else
    {
      e_popup_span.className='nopopup';
    }
  }

  if (pdata.short_description || pdata.long_description  || pdata.url_preview_image || pdata.url_popup_link)
  {
    e_a_popup.style.display='';
  }
}

function buildProductThumbnail(prefix,pdata)
{
  var e_img_thumbnail=document.createElement("img");
  e_img_thumbnail.id=prefix+'thumbnail';
  e_img_thumbnail.className='thumbnail';
  e_img_thumbnail.alt='Product Thumbnail Image';
  e_img_thumbnail.cr_prefix=prefix;
  e_img_thumbnail.handlemouseover=function()
  {
    document.getElementById(prefix+'popup_link').className='information_hover';
  }
  compatAddEvent(e_img_thumbnail,'mouseover',e_img_thumbnail.handlemouseover.bindAsEventListener(e_img_thumbnail),false);
  e_img_thumbnail.handlemouseout=function()
  {
    document.getElementById(prefix+'popup_link').className='information';
  }
  compatAddEvent(e_img_thumbnail,'mouseout',e_img_thumbnail.handlemouseout.bindAsEventListener(e_img_thumbnail),false);

  if (pdata.url_thumbnail)
  {
    e_img_thumbnail.src=pdata.url_thumbnail;
  }
  else
  {
    e_img_thumbnail.style.display='none';
  }
  return e_img_thumbnail;
}

function buildProductInfo(prefix,pdata,category,quote_data)
{
  var e_a_popup=document.createElement("a");
  e_a_popup.id=prefix+'popup_link';
  e_a_popup.href='#';
  e_a_popup.className='information';
  e_a_popup.product_prefix=prefix;
  e_a_popup.category=category;
  e_a_popup.quote_data=quote_data;
  e_a_popup.handleclick=function(){
    open_product_popup(this.product_prefix,this.category,this.quote_data);
    return false;
  }
  e_a_popup.handlemouseover=function() { this.className='information_hover'; }
  e_a_popup.handlemouseout=function() { this.className='information'; }
  compatAddEvent(e_a_popup,'click',e_a_popup.handleclick.bindAsEventListener(e_a_popup), false);
  compatAddEvent(e_a_popup,'mouseover',e_a_popup.handlemouseover.bindAsEventListener(e_a_popup),false);
  compatAddEvent(e_a_popup,'mouseout',e_a_popup.handlemouseout.bindAsEventListener(e_a_popup),false);

  if (!(pdata.short_description || pdata.long_description || pdata.url_thumbnail || pdata.url_preview_image || pdata.url_popup_link))
  {
    e_a_popup.style.display='none';
  }

  var e_img_info_icon=document.createElement("img");
  e_img_info_icon.alt="info";
  e_img_info_icon.className="info_icon";
  e_img_info_icon.src=quote_data.info_img;

  var e_popup_span=document.createElement("span");
  e_popup_span.id=prefix+"popup";
  if (pdata.long_description || pdata.url_preview_image)
  {
    e_popup_span.className='popup';
  }
  else
  {
    e_popup_span.className='nopopup';
  }

  var e_short_description=document.createElement("span");
  e_short_description.id=prefix+"short_description";
  e_short_description.className="short_description";

  var e_img_preview=document.createElement("img");
  e_img_preview.id=prefix+'preview_image';
  e_img_preview.className='preview_image';
  e_img_preview.alt='Product Preview Image';
  if (pdata.url_preview_image)
  {
    e_img_preview.src=pdata.url_preview_image;
  }
  else
  {
    e_img_preview.style.display='none';
  }

  var e_long_description=document.createElement("div");
  e_long_description.id=prefix+"long_description";
  e_long_description.className="long_description";

  e_popup_span.appendChild(e_short_description);
  e_popup_span.appendChild(e_img_preview);
  e_popup_span.appendChild(e_long_description);

  e_a_popup.appendChild(e_img_info_icon);
  e_a_popup.appendChild(e_popup_span);
  return e_a_popup;
}

function addQuantityProductSelector(quote_prefix,prefix,category,product_name,quote_data)
{
  if (!quote_data[category] || !quote_data[category][product_name])
  {
    error_log("category "+category+" or product "+product_name+" product not found!");
    return false;
  }
  pdata=quote_data[category][product_name];

  var e_a_popup=buildProductInfo(prefix,pdata,category,quote_data);
  var e_img_thumbnail=buildProductThumbnail(prefix,pdata);

  var e_select=document.createElement("select");
  e_select.id=prefix+"product_name";
  e_select.name=e_select.id;
  e_select.product_prefix=prefix;
  e_select.category_data=quote_data[category];
  e_select.quote_prefix=quote_prefix;
  e_select.handlechange=function(event){
    clearTotals(this.quote_prefix);
    updateProductData(this.category_data,this.options[this.selectedIndex].value,this.product_prefix);
  }
  compatAddEvent(e_select,'change',e_select.handlechange.bindAsEventListener(e_select), false);

  i=0;
  for (product_name in quote_data[category])
  {
    if (!quote_data[category][product_name].product_name)
    {
      continue;
    }
    var has_opts=false;
    for (opt in quote_data[category][product_name].options)
    {
      if (quote_data[category][product_name].options && quote_data[category][product_name].options[opt].option_id)
      {
        has_opts=true;
      }
    }
    if (has_opts) { continue; }
    e_select.options[i]=new Option(product_name,product_name);
    if (pdata.product_name==product_name)
    {
      e_select.selectedIndex=i;
    }
    i++;
  }

  var e_quantity_input=document.createElement("input");
  e_quantity_input.type='text';
  e_quantity_input.setAttribute('type','text');
  e_quantity_input.id=prefix+'quantity';
  e_quantity_input.name=prefix+'quantity';
  e_quantity_input.size=2;
  e_quantity_input.maxLength=5;
  e_quantity_input.value=1;
  e_quantity_input.quote_prefix=quote_prefix;
  e_quantity_input.handlechange=function(event){
    clearTotals(this.quote_prefix);
    return forceUFloat(this);
  }
  compatAddEvent(e_quantity_input,'change',e_quantity_input.handlechange.bindAsEventListener(e_quantity_input), false);

  var e_div=document.createElement("div");
  e_div.className='product';
  e_div.appendChild(e_img_thumbnail);
  e_div.appendChild(e_select);
  e_div.appendChild(document.createTextNode(' '+_("quantity")+' '));
  e_div.appendChild(e_quantity_input);
  e_div.appendChild(e_a_popup);

  return e_div;
}

function addMaterialPiece(quote_prefix, prefix)
{
  var e_num_pieces=document.getElementById(prefix+'num_pieces');

  var i=parseFloat(e_num_pieces.value);
  e_num_pieces.value=i+1;

  var e_tr=document.createElement("tr");

  var e_th=document.createElement("th");
  e_th.appendChild(document.createTextNode(sprintf(_("Piece %d"),e_num_pieces.value)));

  var e_input_length=document.createElement("input");
  e_input_length.id=prefix+"piece_"+i+"_length";
  e_input_length.name=prefix+"piece_"+i+"_length";
  e_input_length.type="text";
  e_input_length.title=sprintf(_("Piece %d length"),e_num_pieces.value);
  e_input_length.size=4;
  e_input_length.maxLength=6;
  e_input_length.value="0";
  e_input_length.quote_prefix=quote_prefix;
  e_input_length.handlechange=function(event){
    clearTotals(this.quote_prefix);
    return forceUInt(this);
  }
  compatAddEvent(e_input_length,'change',e_input_length.handlechange.bindAsEventListener(e_input_length),true);


  var e_input_width=document.createElement("input");
  e_input_width.id=prefix+"piece_"+i+"_width";
  e_input_width.name=prefix+"piece_"+i+"_width";
  e_input_width.type="text";
  e_input_width.title=sprintf(_("Piece %d width"),e_num_pieces.value);
  e_input_width.size=4;
  e_input_width.maxLength=6;
  e_input_width.value="0";
  e_input_width.quote_prefix=quote_prefix;
  e_input_width.handlechange=function(event){
    clearTotals(this.quote_prefix);
    return forceUInt(this);
  }
  compatAddEvent(e_input_width,'change',e_input_width.handlechange.bindAsEventListener(e_input_width),true);

  var e_td1=document.createElement("td");
  var e_td2=document.createElement("td");

  e_tr.appendChild(e_th);
  e_td1.appendChild(e_input_length);
  e_td1.appendChild(document.createTextNode(" by"));
  e_tr.appendChild(e_td1);
  e_td2.appendChild(e_input_width);
  e_td2.appendChild(document.createTextNode(" mm"));
  e_tr.appendChild(e_td2);

  var e_table=document.getElementById(prefix+'pieces_table');
  e_table.tBodies[0].appendChild(e_tr);
}

function addMeasuredProductSelector(quote_prefix,prefix,category,product_name,quote_data)
{
  if (!quote_data[category] || !quote_data[category][product_name])
  {
    error_log("category "+category+", or product "+product_name+" product not found!");
    return false;
  }
  pdata=quote_data[category][product_name];

  var e_a_popup=buildProductInfo(prefix,pdata,category,quote_data);
  var e_img_thumbnail=buildProductThumbnail(prefix,pdata);

  var e_select=document.createElement("select");
  e_select.id=prefix+"product_name";
  e_select.name=e_select.id;
  e_select.category_data=quote_data[category];
  e_select.product_prefix=prefix;
  e_select.quote_prefix=quote_prefix;
  e_select.handlechange=function(event){
    clearTotals(this.quote_prefix);
    var ndimension_label="measurement";
    var proddata=this.category_data[this.options[this.selectedIndex].value];
    if (proddata
        && proddata.custom_values
        && proddata.custom_values['Form Text']
        && proddata.custom_values['Form Text']['Dimensions']
        && proddata.custom_values['Form Text']['Dimensions']['Label'])
    {
      ndimension_label=proddata.custom_values['Form Text']['Dimensions']['Label'];
    }
    setIdTextContent(this.product_prefix+'dimension_label',ndimension_label);
    updateProductData(this.category_data,this.options[this.selectedIndex].value,this.product_prefix);
  }
  compatAddEvent(e_select,'change',e_select.handlechange.bindAsEventListener(e_select), false);

  i=0;
  for (product_name in quote_data[category])
  {
    if (!quote_data[category][product_name].product_name)
    {
      continue;
    }
    var has_opts=false;
    for (opt in quote_data[category][product_name].options)
    {
      if (quote_data[category][product_name].options && quote_data[category][product_name].options[opt].option_id)
      {
        has_opts=true;
      }
    }
    if (!has_opts) { continue; }
    e_select.options[i]=new Option(product_name,product_name);
    if (pdata.product_name==product_name)
    {
      e_select.selectedIndex=i;
    }
    i++;
  }

  var e_dimension_label=document.createElement("span");
  e_dimension_label.id=prefix+"dimension_label";
  var ndimension_label='measurement';
  if (pdata
      && pdata.custom_values
      && pdata.custom_values['Form Text']
      && pdata.custom_values['Form Text']['Dimensions']
      && pdata.custom_values['Form Text']['Dimensions']['Label'])
  {
    ndimension_label=pdata.custom_values['Form Text']['Dimensions']['Label'];
  }
  e_dimension_label.appendChild(document.createTextNode(ndimension_label));

  var e_measurement_input=document.createElement("input");
  e_measurement_input.type='text';
  e_measurement_input.setAttribute('type','text');
  e_measurement_input.id=prefix+'measurement';
  e_measurement_input.name=prefix+'measurement';
  e_measurement_input.size=5;
  e_measurement_input.maxLength=7;
  e_measurement_input.value=0;
  e_measurement_input.quote_prefix=quote_prefix;
  e_measurement_input.handlechange=function(event){
    clearTotals(this.quote_prefix);
    return forceUFloat(this);
  }
  compatAddEvent(e_measurement_input,'change',e_measurement_input.handlechange.bindAsEventListener(e_measurement_input), false);


  var e_div=document.createElement("div");
  e_div.className='product';
  e_div.appendChild(e_img_thumbnail);
  e_div.appendChild(e_select);
  e_div.appendChild(document.createTextNode(' '));
  e_div.appendChild(e_dimension_label);
  e_div.appendChild(document.createTextNode(' '));
  e_div.appendChild(e_measurement_input);
  e_div.appendChild(document.createTextNode(' mm'));
  e_div.appendChild(e_a_popup);


  return e_div;
}

function addProductSelector(e_product_add_selector,quote_prefix,prefix,category,product_name,quote_data)
{
  clearTotals(quote_prefix);
  pdata=quote_data[category][product_name];
  if (pdata && pdata.product_name)
  {
    var has_opts=false;
    for (opt in pdata.options)
    {
      if (pdata.options && pdata.options[opt].option_id)
      {
        has_opts=true;
      }
    }

    var e_num_products=document.getElementById(prefix+'num_products');
    var e_section=document.getElementById(prefix+'section');
    //kaylee_debug(prefix+'product_'+e_num_products.value+'_product_name is '+e_product_add_selector);
    //kaylee_debug("0 e_num_products.value: "+e_num_products.value);
    e_product_add_selector.id=prefix+'product_'+(parseInt(e_num_products.value)+1)+'_product_name';
    e_product_add_selector.name=prefix+'product_'+(parseInt(e_num_products.value)+1)+'_product_name';
    if (e_section)
    {
      var i=parseInt(e_num_products.value);
      if (has_opts)
      {
        var e_div=addMeasuredProductSelector(quote_prefix,prefix+'product_'+i+'_',category,product_name,quote_data);
        if (e_div)
        {
          e_num_products.value=i+1;
          //kaylee_debug("3a e_num_products.value: "+e_num_products.value);
          e_product_add_selector.id=prefix+'product_'+e_num_products.value+'_product_name';
          e_product_add_selector.name=prefix+'product_'+e_num_products.value+'_product_name';
          e_section.insertBefore(e_div,e_section.lastChild);
          e_product_add_selector.selectedIndex=0;
          updateProductData(quote_data[category],product_name,prefix+'product_'+i+'_');
          var nfocus;
          if (nfocus=document.getElementById(prefix+'product_'+i+'_measurement'))
          {nfocus.focus(); }
          else if (nfocus=document.getElementById(prefix+'product_'+i+'_product_name'))
          {nfocus.focus(); }
          return true;
        }
      }
      else
      {
        var e_div=addQuantityProductSelector(quote_prefix,prefix+'product_'+i+'_',category,product_name,quote_data);
        if (e_div)
        {
          e_num_products.value=i+1;
          //kaylee_debug("3b e_num_products.value: "+e_num_products.value);
          e_product_add_selector.id=prefix+'product_'+e_num_products.value+'_product_name';
          e_product_add_selector.name=prefix+'product_'+e_num_products.value+'_product_name';
          e_section.insertBefore(e_div,e_section.lastChild);
          e_product_add_selector.selectedIndex=0;
          updateProductData(quote_data[category],product_name,prefix+'product_'+i+'_');
          var nfocus;
          if (nfocus=document.getElementById(prefix+'product_'+i+'_quantity'))
          {nfocus.focus(); }
          else if (nfocus=document.getElementById(prefix+'product_'+i+'_product_name'))
          {nfocus.focus(); }
          return true;
        }
      }
    }
  }
  var e_num_products=document.getElementById();
  i=parseInt(e_num_products.value);
  e_num_products.value=i+1;
  e_num_products.form.submit();
  return false;
}


function open_product_popup(prefix, category, quote_data)
{
  var e_product_name=document.getElementById(prefix+"product_name");
  product_name=get_form_element_value(e_product_name);

  if (!quote_data[category] || !quote_data[category][product_name])
  {
    kaylee_debug("category "+category+", or product_name "+product_name+" in it doesn't exist");
    return false;
  }

  var desturl=quote_data[category][product_name].url_popup_link;
  if (!desturl)
  {
    //kaylee_debug("no popup link or preview image associated with category "+category+", product "+product_name);
    return false;
  }

  window.open(desturl,"_blank","height=520,width=720,location=no,menubar=no,statusbar=no,titlebar=no,toolbar=no",true);
  return true;
}

function check_contact(prefix)
{
  var e_namefirst=document.getElementById(prefix+'namefirst');
  var e_namelast=document.getElementById(prefix+'namelast');
  var e_addrline1=document.getElementById(prefix+'addrline1');
  var e_postalcode=document.getElementById(prefix+'city');
  var e_email=document.getElementById(prefix+'email');
  var e_phone=document.getElementById(prefix+'phone');

  if ((e_namelast && (!e_namelast.value || e_namelast.value==""))
      && (e_namefirst && (!e_namefirst.value || e_namefirst.value=="")))
  {
    window.alert(_("You must enter a name in order to submit."));
    e_namelast.focus();
    return false;
  }

  if (e_addrline1 && (!e_addrline1.value || e_addrline1.value==""))
  {
    window.alert(_("You must enter an address in order to submit."));
    e_addrline1.focus();
    return false;
  }

  if (e_postalcode && (!e_postalcode.value || e_postalcode.value==""))
  {
    window.alert(_("You must enter an address in order to submit."));
    e_postalcode.focus();
    return false;
  }

  if ((e_email && (!e_email.value || e_email.value==""))
      && (e_phone && (!e_phone.value || e_phone.value=="")))
  {
    window.alert(_("You must enter an email address or a phone number in order to submit."));
    e_email.focus();
    return false;
  }
  return true;
}

function checkTooFewMillimetres(e_input)
{
  var val=parseFloat(e_input.value);

  if (isNaN(val)) { return false; }

  if (val < 20)
  {
    if (window.confirm(sprintf(_("Please note that this dimension is in millimetres. Would you like me to change it to %dmm?"), (val*1000))))
    {
      e_input.value=(val*1000);
    }
  }
  return true;
}
