// common utility functions

  function set_delivery_address(i) {
    var frm = document.frmOrder
    frm.delivery_firstname.value= ADDRESSES[i].firstname
    frm.delivery_lastname.value = ADDRESSES[i].lastname
    frm.delivery_address1.value = ADDRESSES[i].address1
    frm.delivery_address2.value = ADDRESSES[i].address2
    frm.delivery_city.value = ADDRESSES[i].city
    set_droplist(frm.delivery_state, ADDRESSES[i].state)
    frm.delivery_zip.value = ADDRESSES[i].zip
    frm.delivery_telephone.value    = ADDRESSES[i].telephone
  }
  function build_address_table() {
    var d = document.getElementById("AddressTable")
    var s = "<table width=200 cellspacing=0 cellpadding=0  style='border:1px solid #666666'>"
          + "<tr bgcolor=#666666>"
          + "<td align=center><small><small><b><font color=#ffffff>Address Shortcuts</font></b></small></small></td>"
          + "</tr>"
    var N=0;
    if (edit) N++;
    if (ADDRESSES.length>N) {
      for (var i=N; i<ADDRESSES.length; i++) {
      s = s + "<tr>"
            + "<td><small><small>&nbsp;<a href=javascript:set_delivery_address(" + i + ") " 
            + "title='" + ADDRESSES[i].address1 + "\n" + ADDRESSES[i].address2 + "\n" 
            + ADDRESSES[i].city + "," + ADDRESSES[i].state + " " + ADDRESSES[i].zip+"'>"
            + ADDRESSES[i].title + "</a></small></small></td>"
            + "</tr>"
      }
    } else {
      s = s + "<tr>"
            + "<td><small><small>&nbsp;NA</small></small></td>"
            + "</tr>" 
    }

    s = s + "</table>"
    d.innerHTML = s
  }

  function validate_address(fn, ln, a1, a2, city, st, zip,country , ph) {
    if (fn.value=="") {
      alert("Please type in first name")
      fn.focus()
      return false
    }

    if (ln.value=="") {}

    if ((a1.value + a2.value)=="") {
      alert("Please type in address")
      a1.focus()
      return false
    }

    if (city.value=="") {
      alert("Please type in city")
      city.focus()
      return false
    }

    if (st.options[st.selectedIndex].value=="") {
      alert("Please select state")
      st.focus()
      return false
    }

    if (zip.value=="") {
      alert("Please type in zip code")
      zip.focus()
      return false
    }
    if ( (""+zip.value).length!=5) {
      alert("Please type in valid zip code XXXXX")
      zip.focus()
      return false    
    }
    if (ph.value=="") {
      alert("Please type in phone number")
      ph.focus()
      return false
    }
    return true
  }

// generic utility functions

  function get_droplist(dl) {
    var ndx = dl.selectedIndex
    return dl.options[ndx].value
  }

  function get_radio(rb) {
    for (var i=0; i<rb.length; i++) 
      if (rb[i].checked) return rb[i].value
    return null
  }
  function set_radio(rb, v) {
    for (var i=0; i<rb.length; i++) 
      if (rb[i].value==v) {
        rb[i].checked=true
        break;
      }
  }
  function set_droplist(dl, v) {
    for (var i=0; i<dl.options.length; i++) 
      if (dl.options[i].value==v) {
        dl.options[i].selected=true
        break;
      }
  }
  function get_number(n) {
    if (typeof parseFloat(n)=="undefined") return null
    return parseFloat(n)
  }
  function find_array_item (A, S) {
    var f,s,i
    for (i=0; i<A.length; i++) {
      f = true;
      for ( s in S ) {
        if (S[s]!=A[i][s]) { f=false; break; }
      }
      if (f) return A[i]
    }
    return null
  }

  function find_array_items (A, S) {
    var f, s, i
    var R=new Array()
    for (i=0; i<A.length; i++) {
      f = true;
      for ( s in S ) {
        if (S[s]!=A[i][s]) { f=false; break; }
      }
      if (f) R[R.length]=A[i]
    }
    return R
  }

// rabbit print specific functions
  function calc_product_price(P, O1, O2, O3, O4, O5) {
    var vb = new VBScript()
    var px = null
    if (!P) return px
    px = get_number(P.price)
    if (O1) px = calc_product_option(px, O1, P)
    if (O2) px = calc_product_option(px, O2, P)
    if (O3) px = calc_product_option(px, O3, P)
    if (O4) px = calc_product_option(px, O4, P)
    if (O5) px = calc_product_option(px, O5, P)
    return vb.formatNumber(px,2)
  }
  function calc_product_option(px, O, P) {

    if (get_number(O.value)==(-1)) {
      px = px + get_number(P.proof)
      return px
    }
    switch(O.opcode) {
    case "*":
       px = px * (1+get_number(O.value))
       break;
    case "+":
       px = px + get_number(O.value)
       break;
    }
    return px
  }

// vbscript functions
  function VBScript()
  {
    this.formatNumber = formatNumber
    this.formatCurrency = formatCurrency
    this.ltrim = ltrim
    this.rtrim = rtrim
    this.trim  = trim
    this.left  = left
    this.right = right
    this.mid   = mid
    this.replace = replace

    function replace(s,x,r) { 
      var re = new RegExp(x);
      var s1 = String(s);
      var ss = "";
      while(s1!=ss) {
        ss = s1;
        s1 = s1.replace(re,r);
      }
      return ss; 
    }
    function appendZero(s,n) { for (var i=0;i<n;i++) s+="0"; return s; }
    function formatNumber(n,d,z,p,c) { /* n:num, d:dec, z:zero, p:parens, c:comma */
      if (isNaN(parseInt(n))) return "NaN";
      if (typeof d =="undefined") var d=2;
      var s = n<0 ? -1 : 1;
      var t = s*Math.round(Math.abs(n * Math.pow(10,d)))/Math.pow(10,d);
      var r = new String(t);
      if (d>0) {
        var i=r.indexOf(".");
        r = i<0 ? appendZero(r+".",d) : appendZero(r,d-(r.length-i-1));
      }
      if (!z && n<1 && n>-1 && n!=0) 
        r = n>0 ? r.substring(1,r.length) : "-"+r.substring(2,r.length);
     
      if (c && (n>=1000 || n<=-1000)) {
        var i=r.indexOf(".");
        if (i<0) i=r.length;
        i=i-3;
        while(i>=1) {
          r = r.substring(0,i)+","+r.substring(i,r.length);
          i=i-3;
        }
      }
      if (p && n<0) r="(" + r.substring(1,r.length) + ")";
      return r;
    }

    function formatCurrency(n,d,z,p,c) {
      var s=new String(formatNumber(n,d,z,p,c));
      if (s.indexOf("(")!= -1 || s.indexOf("-") != -1) {
        if (s.charAt(0)=="(") s = "($" + s.substring(1,s.length);
        else if (s.charAt(0)=="-") s= "-$" + s.substring(1,s.length);
        return s;
      }
      return "$" + s;
    }

    function ltrim(str) {
      var w=new String(" \t\n\r");
      var s=new String(str);
      if (w.indexOf(s.charAt(0))!=-1) {
        var j=0;
        var i=s.length;
        while(j<i && w.indexOf(s.charAt(j))!=-1) j++;
        s = s.substring(j,i);
      }
      return s;
    }
    function rtrim(str) {
      var w=new String(" \t\n\r");
      var s=new String(str);
      if (w.indexOf(s.charAt(s.length-1))!=-1) {
        var i=s.length-1;
        while(i>=0 && w.indexOf(s.charAt(i))!=-1) i--;
        s = s.substring(0,i+1);
      }
      return s;
    }
    function trim(str) { return rtrim(ltrim(str)); }
    function left(str,n) {
      if (n<=0) return "";
      if (n>String(str).length) return str;
      return String(str).substring(0,n);
    }
    function right(str,n) {
      if (n<=0) return "";
      if (n>String(str).length) return str;
      var i=String(str).length;
      return String(str).substring(i,i-n);
    }
    function mid(str,i,len) {
      if (i<0 || len<0) return "";
      var iend, ilen=String(str).length;
      iend = (i+len>ilen) ? ilen : i + len;
      return String(str).substring(i,iend);
    }
  }

// email checking
  function emailCheck (emailStr) {
    var checkTLD=1;
    var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
    var emailPat=/^(.+)@(.+)$/;
    var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
    var validChars="\[^\\s" + specialChars + "\]";
    var quotedUser="(\"[^\"]*\")";
    var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
    var atom=validChars + '+';
    var word="(" + atom + "|" + quotedUser + ")";
    var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
    var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
    var matchArray=emailStr.match(emailPat);
    if (matchArray==null) {
      alert("Email address seems incorrect (check @ and .'s)");
      return false;
    }
    var user=matchArray[1];
    var domain=matchArray[2];
    for (i=0; i<user.length; i++) {
      if (user.charCodeAt(i)>127) {
        alert("Ths username contains invalid characters.");
        return false;
       }
    }
    for (i=0; i<domain.length; i++) {
      if (domain.charCodeAt(i)>127) {
        alert("Ths domain name contains invalid characters.");
        return false;
       }
    }
    if (user.match(userPat)==null) {
      alert("The username doesn't seem to be valid.");
      return false;
    }
    var IPArray=domain.match(ipDomainPat);
    if (IPArray!=null) {
      for (var i=1;i<=4;i++) {
        if (IPArray[i]>255) {
          alert("Destination IP address is invalid!");
          return false;
        }
      }
      return true;
    }

    var atomPat=new RegExp("^" + atom + "$");
    var domArr=domain.split(".");
    var len=domArr.length;
    for (i=0;i<len;i++) {
      if (domArr[i].search(atomPat)==-1) {
      alert("The domain name does not seem to be valid.");
      return false;
      }
    }

    if (checkTLD && domArr[domArr.length-1].length!=2 && domArr[domArr.length-1].search(knownDomsPat)==-1) {
      alert("The address must end in a well-known domain or two letter " + "country.");
      return false;
    }

    if (len<2) {
      alert("This address is missing a hostname!");
      return false;
    }
    return true;
  }

// build the pricing table

  function get_price_link(S) {
    var s = "NA"
    var P = find_array_item(PRODUCTS, S)
    if (P!=null) {
      s = "<a href=javascript:set_form_by_name('" + P.name + "') "
        + "title='Size: " + P.size + " Color:" + P.color + " Qty:" + P.quantity + "'>"
        + "$" + P.price.replace(".00","") + "</a>"
    }
    return s
  }

  function build_pricing_table() {
    var nav=navigator.appVersion;
    nav=nav.toLowerCase();
    var isMac=(nav.indexOf("mac")!=-1)?1:0;
    var IEmac=((document.all)&&(isMac))?1:0;
    if (IEmac) { 
      var d = document.getElementById("pricing_table")
      if (!d) return
      d.style.visibility = "hidden"
      d.style.display = "none"
      return
    }

    var d, s
    for (var i=0; i<LIST.length; i++) {
      d = document.getElementById("c_" + LIST[i].t + "_" + LIST[i].r + "_" + LIST[i].c)
      s = "<font size=1>" + get_price_link( LIST[i].p ) + "&nbsp;</font>"
      if (d) d.innerHTML = s
    }
  }

// set a form for a given product name
// used by the pricing link
  function set_form_by_name(n) {
    var S = { name: n }
    var P = find_array_item (PRODUCTS, S)
    if (P!=null) set_form(P) 
  }

// submit the product form
  function submit_form() {
    var f = document.frmOrder
    if (!get_number(f.price.value)) {
      alert("Please select a product")
      return
    }
    if (!validate_address(f.delivery_firstname, 
                         f.delivery_lastname,
                         f.delivery_address1,
                         f.delivery_address2,
                         f.delivery_city,
                         f.delivery_state,
                         f.delivery_zip,
                         f.delivery_country,
                         f.delivery_telephone)) 
    {
      return
    }
    recalc_price()
    if (f.product_id.value=="") {
      alert("Please select a product")
      return
    }
    document.frmOrder.submit()
  }

// reset the product form
  function reset_form() {
    if (edit) {
      var frm=document.frmOrder
      frm.cmd.value="update"
      frm.item_id.value = item_id
      frm.product_id.value= product_id
      frm.option1_id.value= option1_id
      frm.option2_id.value= option2_id
      frm.option3_id.value= option3_id
      frm.project_name.value=project_name
      init_form_by_id(product_id, option1_id, option2_id, option3_id)
      set_delivery_address(0)        
    } else { 
      document.frmOrder.reset()
    }
    recalc_price()
  }

// set the product form
  function set_form(P,O1) {
    var frm=document.frmOrder
    if (typeof(frm.RB_pages)!="undefined")    set_radio( frm.RB_pages, P.pages);
    if (typeof(frm.RB_stock)!="undefined")    set_radio( frm.RB_stock, P.stock);
    if (typeof(frm.RB_size)!="undefined")     set_radio( frm.RB_size,  P.size);
    if (typeof(frm.RB_color)!="undefined")    set_radio( frm.RB_color, P.color);
    if (typeof(frm.DL_folding)!="undefined")  set_droplist(frm.DL_folding, P.folding);
    if (typeof(frm.DL_quantity)!="undefined") set_droplist(frm.DL_quantity, P.quantity);
    if (O1) set_droplist(frm.DL_proof, O1.name);
    recalc_price()
  }

// set the product form by the given productID and optionID
  function init_form_by_id(pid, oid, oid2, oid3) {
    var frm=document.frmOrder
    var S, O, P, O2, O3
    S = { id: pid }
    P = find_array_item(PRODUCTS, {id: pid})
    O = find_array_item(OPTIONS,  {id: oid})
    O2= find_array_item(OPTIONS2, {id: oid2})
    O3= find_array_item(OPTIONS3, {id: oid3})
    if (P) {
      if (typeof(frm.RB_pages)!="undefined")    set_radio( frm.RB_pages, P.pages);
      if (typeof(frm.RB_stock)!="undefined")    set_radio( frm.RB_stock, P.stock);
      if (typeof(frm.RB_size)!="undefined")     set_radio( frm.RB_size,  P.size);
      if (typeof(frm.RB_color)!="undefined")    set_radio( frm.RB_color, P.color);
      if (typeof(frm.DL_folding)!="undefined")  set_droplist( frm.DL_folding, P.folding);
      if (typeof(frm.RB_folding_type)!="undefined")  set_radio( frm.RB_folding_type, P.folding);
      if (typeof(frm.DL_quantity)!="undefined") set_droplist(frm.DL_quantity, P.quantity);
    }
    if (O)  set_droplist(frm.DL_proof, O.name)
    if (O2) set_droplist(frm.DL_file_type, O2.name)
    if (O3) set_droplist(frm.DL_file_submit, O3.name)
  }

// recalculate the price
  function recalc_price() {
    var S, P, O, O2, O3
    var frm=document.frmOrder
    // find the product
    S = new Array()
    if (typeof(frm.RB_pages)!="undefined")    S["pages"]    = get_radio(frm.RB_pages)
    if (typeof(frm.RB_stock)!="undefined")    S["stock"]    = get_radio(frm.RB_stock)
    if (typeof(frm.RB_color)!="undefined")    S["color"]    = get_radio(frm.RB_color)
    if (typeof(frm.RB_size)!="undefined")     S["size"]     = get_radio(frm.RB_size)
    if (typeof(frm.DL_folding)!="undefined")  S["folding"]  = frm.DL_folding.value
    if (typeof(frm.DL_quantity)!="undefined") S["quantity"] = frm.DL_quantity.value

    P = find_array_item(PRODUCTS, S)
    if (P==null) {
      frm.product_id.value = 0
      frm.price.value      = 0
      var d=document.getElementById("LabelPrice")
      d.innerHTML="Product Not Available"
      return;
    }
    // Update the hard copy options
    for (var i=0; i<frm.DL_proof.options.length; i++) {
      if (frm.DL_proof.options[i].value=="HARD") {
        frm.DL_proof.options[i].text = "Hard Copy Proof (Add $" + P.proof + ")"
        break;
      }
    }
    // find the options
    S = { name: frm.DL_proof.value }
    O = find_array_item(OPTIONS, S)

    // file type option
    S = { name: frm.DL_file_type.value } 
    O2 = find_array_item(OPTIONS2, S) 

    // file submission option
    S = { name: frm.DL_file_submit.value } 
    O3 = find_array_item(OPTIONS3, S)  
    
    var px= calc_product_price (P, O, O2, O3)
    var d=document.getElementById("LabelPrice")
    d.innerHTML="$" + px

    frm.product_id.value = "";
    frm.option1_id.value = "";
    frm.option2_id.value = "";
    frm.option3_id.value = "";

    if (P) frm.product_id.value = P.id
    if (O) frm.option1_id.value = O.id
    if (O2) frm.option2_id.value = O2.id
    if (O3) frm.option3_id.value = O3.id


    frm.price.value  = px
  }


