// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults
var cart_items = [];
var home_page_image = 1;
var home_page_images = 0;
var strip_clones = 0;
var individual_pricing = false;
var spinner;
var home_page_move_in_progresss = false;
var counter_image=0;
var first_id = "";
var first_kind = "";

var large_view_width = 0;
var typeface_image_x = 0;
var typeface_image_y = 0;
var typeface_viewer_container = null;
var large_view_options = null;
var typeface_image = null;
var blind_large_delay = 4.5;
var blind_transition = 0.03;
var blind_transition_ratio = 4;
var in_review = false;
var typeface_large_delay = 4.5;
var typeface_transition = 0.03;
var typeface_move = 0.6;
var typeface_transition_ratio = 4;

var typeface_cycles = {};
var typeface_counters = {};

Event.observe(window, 'load', function(){
  spinner = $("spinner");
  spinner.hide();
  // add javascript for select lists
  $$('.select').each(function(select_dropdown){
    init_select_list(select_dropdown);
  });

  if($("dttdjy-dttdjy")){
    Event.observe("dttdjy-dttdjy", "click",
    function(){ 
      if($("dttdjy-dttdjy").already_clicked != true){
        $("dttdjy-dttdjy").value = "";
        $("dttdjy-dttdjy").already_clicked = true;
      }
    }
    );
  }

  if(price_multiplier_id > 0) $$('.global-licenses').each(function(select_dropdown){ show_selected_element(select_dropdown, price_multiplier_id)  });

  set_price_multiplier(price_multiplier, price_multiplier_id);
  $$(".no-highlight").each(function(el){
    Event.observe(el, 'mouseover', function(event){ show_highlight(el) });
    Event.observe(el, 'mouseout', function(event){ hide_highlight(el) });
  });

  var sample_text = $("sample-text");

  if(sample_text){
    Event.observe(sample_text, 'change', letter_setter_handler);
    Event.observe("letter-setter-typeface", 'change', letter_setter_handler);
    $$(".lettersetter-mod").each(function(el){ Event.observe(el, 'click', letter_setter_handler ); });
    letter_setter_handler();
  }

  // init typeface page
  typeface_viewer_container = $("typeface-viewer-container");
  large_view_options = $("large-view-options");
  typeface_image = $("typeface-viewer-image");
  typface_page_resize_handler = function(){
    large_view_width = (document.viewport.getWidth() - 237);
    typeface_viewer_container.style.width = large_view_width + "px";
    box3 = $("box3");
    if(box3) box3=box3.getHeight() + 8; else box3=0;
    typeface_viewer_container.style.height = $("box1").getHeight() + $("box2").getHeight() + box3 - $("typeface-radios").getHeight() - 3 + "px";
    large_view_options.style.width = large_view_width + "px";
    new Draggable('typeface-viewer-resize-handle', {
      starteffect:function(){ },
      endeffect:function(){ },
      constraint: 'vertical',
      change: function(draggable){
        typeface_viewer_container.style.height = typeface_viewer_container.getHeight() + draggable.element.style.top.gsub(/px$/,"")*1 + "px";
      }
    } );
  }
  if(typeface_viewer_container){
    typeface_image_x = typeface_image.getWidth(); typeface_image_y = typeface_image.getHeight();
    typface_page_resize_handler();
    Event.observe(window, 'resize', typface_page_resize_handler);
    new Draggable('typeface-viewer-image',
                  {starteffect:function(){ },
                   endeffect:function(){ },
                   change: function(draggable){
                      var xpos = draggable.element.style.left.gsub(/px$/,"")*1;
                      var ypos = draggable.element.style.top.gsub(/px$/,"")*1;
                      var xmax = typeface_image_x - large_view_width;
                      var ymax = typeface_image_y - typeface_viewer_container.getHeight();
                      if(ypos > 0) draggable.element.style.top = "0px";
                      if(ypos < -ymax) draggable.element.style.top = -ymax + "px";
                      if(draggable.element.getWidth() < typeface_viewer_container.getWidth()){
                        draggable.element.style.left = "0px";
                      }
                      else {
                        if(xpos > 0) draggable.element.style.left = "0px";
                        if(xpos < -xmax) draggable.element.style.left = -xmax + "px";
                      }
                   },
                   onEnd: function(draggable){ update_large_typeface_view_position(draggable.element);  },
                   zindex: 50 });
    var large_typeface_view_position_x = $("large-typeface-view-position-x").value;
    var large_typeface_view_position_y = $("large-typeface-view-position-y").value;
    if(large_typeface_view_position_x.empty() && large_typeface_view_position_y.empty()){
      show_typeface_small(200);
    } else {
      if(large_typeface_view_position_x.empty()) large_typeface_view_position_x = 0; else large_typeface_view_position_x = large_typeface_view_position_x*1;
      if(large_typeface_view_position_y.empty()) large_typeface_view_position_y = 0; else large_typeface_view_position_y = large_typeface_view_position_y*1;
      xmax = typeface_image_x - large_view_width;
      ymax = typeface_image_y - typeface_viewer_container.getHeight();
      if(large_typeface_view_position_y < -ymax) $('typeface-viewer-image').style.top = -ymax + "px"; else $('typeface-viewer-image').style.top = large_typeface_view_position_y + "px";
      if(large_typeface_view_position_x < -xmax) $('typeface-viewer-image').style.left = -xmax + "px"; else $('typeface-viewer-image').style.left = large_typeface_view_position_x + "px";
    }
    
    show_letter_setter_tab('case');

    typeface_modifiers_handler = function(event){
      $$(".tm-checkbox").each(function(tm){ $(tm.id + "-value").value = tm.checked; });
      AjaxCall('/show_with_modifiers', $("typeface-modifiers-form").serialize(this));
    }

    // init open type modifiers
    $$(".tm-checkbox").each(function(tm){
      Event.observe(tm, 'click', typeface_modifiers_handler )
      Event.observe(tm.id + "-label", 'click', function(){ tm.checked = tm.checked ? false : true; typeface_modifiers_handler(); });
    });
    letter_setter_handler();
  }

  // init type tester page
  var type_this_text = $("type-test-text");

  if(type_this_text){
    Event.observe("type-test-set-text", 'click', update_strips_text );
    Event.observe(type_this_text, 'keypress', function(event){ if(event.type == 'keypress' && event.keyCode == Event.KEY_RETURN) update_strips_text();  });
    view_all_sortable_test_strips();
  }

  $$(".search-filter-input").each(function(el){ Event.observe(el, 'change', function(){
         $$(".search-filter-input").each(function(cb){ $(cb.id+"-hidden").value = cb.checked;  });
        $("search-form").submit();
      });
  });
  $$(".in-place-edit").each(function(el){ new Ajax.InPlaceEditor(el, '/checkout/update_info_in_place', { okControl: false, cancelControl:false, submitOnBlur: true }); });

  var search = $("search");
  if(search) Event.observe(search,'click', function(){ search.className = ""; search.value = ""; });

  // init eula

  var eula_accepted = $("eula-accepted");
  if(eula_accepted){
    Modalbox.show("<div class=\"padding\">Please read this document all the way to the end before agreeing to its terms. You must agree in order to continue with the checkout process.<div class=\"MB_buttons\"><a href=\"javascript:blank()\" onclick=\"Modalbox.hide()\">OK</a></div></div>", { transitions:false, width: 400, title: "" });

    Event.observe('accept-eula', 'click', function(){
      if(eula_accepted.checked) eula_accepted.checked = false; else eula_accepted.checked = true;
      eula_click();
    });
    Event.observe('eula-accepted', 'click', eula_click);
  }

  adjust_content_height();
  
});

function match_firefox(){
  return navigator.userAgent.match("Firefox") || navigator.userAgent.match("Shiretoko") || navigator.userAgent.match("Iceweasel") || navigator.userAgent.match("Minefield") || navigator.userAgent.match("Chrome")
}

// Type Test
function update_strips_text(only_ff){
  var reloads = 0;
  if(match_firefox()){
    spinner.show();
    new PeriodicalExecuter(function(pe) {
      if(reloads==3){ pe.stop(); spinner.hide(); }
      fill_strips();
      reloads++;
      }, 0.1 );
  } else { if(only_ff!=true) fill_strips(); }
}

function fill_strips(force_size){
  var total_strips = $$(".type-test-img").length;
  spinner.show();
  $$(".type-test-img").each(function(img){
    var url = img.src.split("&");
    var new_img = new Image();
    var size = url[2];
    if(force_size != undefined) size=force_size;
    img.up(2).select(".strip-size-selector").each(function(el){ el.setAttribute('strip_size',size);})
    var new_src = "http://" + url[0].split("/")[2] + "/" + Math.round(Math.random()*1000000) + "&" + url[1] + "&" + size + "&" + url[3] + "&" + encodeURIComponent($("type-test-text").value);
    new_img.src = new_src;
    if(new_img.complete){
      swap_images(img, new_img);
      total_strips--;
      if(total_strips == 0) spinner.hide();
    }
    else Event.observe(new_img, 'load', function(){
      swap_images(img, new_img);
      total_strips--;
      if(total_strips == 0) spinner.hide();
    });
  });
}

function swap_images(old_image, new_image){
  old_image.src = new_image.src;
  new_image = null;
}
function clone_strip(css_id){
  strip_clones++;
  var existing_strip = $(css_id);
  var new_strip =  document.createElement('div');
  new_strip.innerHTML = existing_strip.innerHTML;
  new_strip.className = existing_strip.className;
  new_strip.id = existing_strip.id + "-" + strip_clones;
  var new_selectors = new_strip.getElementsByTagName('select');
  var new_links = new_strip.getElementsByTagName('a');
  new_selectors[0].id = new_selectors[0].id + "-" + strip_clones;
  new_selectors[1].id = new_selectors[1].id + "-" + strip_clones;
  new_links[0].id = new_links[0].id + "-" + strip_clones;
  new_links[1].id = new_links[1].id + "-" + strip_clones;
  new_selectors[0].setAttribute('strip_size',new_selectors[0].getAttribute('strip_size'));
  new_selectors[1].setAttribute('strip_size',new_selectors[1].getAttribute('strip_size'));
  new_links[2].href="javascript:update_strip_size('"+css_id + "-" + strip_clones +"','small')";
  new_links[3].href="javascript:update_strip_size('"+css_id + "-" + strip_clones +"','large')";
  
  existing_strip.insert({after:new_strip});
  $("sortable-strips").insert({bottom:"<span id=\"" + new_strip.id + "-buffer\" style=\"display:none;\"></span>"})
  init_sortable_strips();
}

function init_sortable_strips(){
  var container = $("sortable-strips");
  if(container){
    if(container.sortable){ container.sortable.destroy(); }
    container.sortable = Sortable.create('sortable-strips', { tag: "div", handle:"handle-row", scroll: window } );
    container.childElements().each(function(strip){ if(!strip.initialized && strip.tagName.toUpperCase() == "DIV"){  init_strip(strip.id);  strip.initialized = true; } });
    $$(".handle-row").each(function(e){
      if(!e.initialized){
        Event.observe(e, 'mouseover', over_type_this_handle);
        Event.observe(e, 'mouseout', out_type_this_handle);
        e.initialized = true;
      }
    });
  }
}

function over_type_this_handle(event){
  var el = Event.element(event);
  el.addClassName('dragged-handle');
}

function out_type_this_handle(event){
  var el = Event.element(event);
  el.removeClassName('dragged-handle');
}

function add_test_strip(){
  strip_clones++;
  var strips = $("sortable-strips").childElements();
  var typeface_id = -1;
  if(strips.length > 0) typeface_id = strips[0].childElements()[0].getAttribute("typeface_id");
  AjaxCall('/add_test_strip', "test_text=" + encodeURIComponent($("type-test-text").value) + "&typeface_id=" +  typeface_id + "&strip_clones=" + strip_clones);
}

function update_strip(event){ 
  var element = Event.element(event);
  AjaxCall('/update_test_strip', "test_text=" + encodeURIComponent($("type-test-text").value) + "&strip_size=" + element.getAttribute("strip_size") + "&typeface_id=" + element.value + "&css_id=" + element.id.gsub(/^select-/,""));
}

function update_strip_by_family(event){
  var element = Event.element(event);
  AjaxCall('/update_test_strip', "test_text=" + encodeURIComponent($("type-test-text").value) + "&strip_size=" + element.getAttribute("strip_size") + "&family_id=" + element.value + "&css_id=" + element.id.gsub(/^select-family-/,""));
}

function update_strip_size(id, size){
  var element = $("select-" + id);
  $("select-family-"+id).setAttribute("strip_size",size);
  $("select-"+id).setAttribute("strip_size",size);
  $("global-small").removeClassName("small-a-selected");
  $("global-large").removeClassName("large-a-selected");
  AjaxCall('/update_test_strip', "test_text=" + encodeURIComponent($("type-test-text").value) + "&typeface_id=" + element.value + "&css_id=" + id + "&strip_size=" + size);
}

function init_strip(css_id){
  Event.observe("select-" + css_id, 'change', update_strip);
  Event.observe("select-family-" + css_id, 'change', update_strip_by_family);
}

function load_strip_buffer(css_id){
  $(css_id).innerHTML = $(css_id+"-buffer").innerHTML;
  $(css_id).getElementsByTagName("img")[0].addClassName("type-test-img");
  init_sortable_strips();
  init_strip(css_id);
  spinner.hide();
  $(css_id+"-img").id = "";
}

function update_loaded_strip(css_id){
  spinner.hide();
  var img = $(css_id+"-img");
  if(img.complete) load_strip_buffer(css_id)
  else Event.observe(img,'load', function(){ load_strip_buffer(css_id); });
}

function change_strip_size(size){
  var reloads = 0;
  if(match_firefox()){
    // oh Firefox why do you these things...
    spinner.show();
    new PeriodicalExecuter(function(pe) {
      if(reloads==3){ pe.stop(); spinner.hide(); set_a_select(size); }
      fill_strips(size);
      reloads++;
      }, 0.2 );
  } else { fill_strips(size); set_a_select(size); }
}

function set_a_select(size){
  if(size=="large"){
    $$(".small-a").each(function(el){ el.removeClassName("small-a-selected"); });
    $$(".large-a").each(function(el){ el.addClassName("small-a-selected"); });
  } else {
    $$(".small-a").each(function(el){ el.addClassName("small-a-selected"); });
    $$(".large-a").each(function(el){ el.removeClassName("small-a-selected"); });
  }
}

function view_all_sortable_test_strips(){
  AjaxCall('/view_all_sortable_test_strips', "test_text=" + $("type-test-text").value);
}

// Lettersetter
function letter_setter_handler(){
  var el = $("letter-setter-typeface");
  var el = el.options[el.selectedIndex];
  var lines = el.getAttribute("lines");
  if(lines == "") lines = 1; else lines = lines*1;
  var layout = $("letter-setter-typeface").value.gsub(" ", "_");
  var limg = document.createElement("img");
  Event.observe(limg, 'load', function(){ $("letter-setter-sample-view").childElements()[0].src = limg.src;  spinner.hide(); });

  var ls_modifiers = "";
  var encoded_text = encodeURIComponent($("sample-text").value);
  $$(".lettersetter-mod").each(function(el){
    if(el.checked) ls_modifiers += "&tfINDEX_FOR_MOD=" + el.value;
  });
  tbs = "";
  spinner.show();
  for(var i=1; i<= lines; i++) tbs += ("&tb" + i +"=" + encoded_text + ls_modifiers.gsub(/INDEX_FOR_MOD/,i)+"&tl" + i +"=" + $("language-code").value);
  limg.src = "http://lettersetter.net/cgi-bin/ls?foundry=commercial&layout=" + layout + tbs;
  if(limg.complete){ $("letter-setter-sample-view").childElements()[0].src = limg.src; spinner.hide(); }
}
function show_letter_setter_tab(tab_name){
  var selected_tab = $("letter-setter-" + tab_name + "-tab");
  var tab_link = $(tab_name + "-tab-link");
  if(selected_tab){
    if(!selected_tab.hasClassName("selected-tab")){
      selected_tab.removeClassName("hidden");
      $$(".letter-setter-tab").each(function(tab){
        var tn = tab.id.split("-")[2];
        if(tn == tab_name){
          $(tab).toggle();
          if(tab.visible()) { tab_link.removeClassName('letter-setter-deselected-tab'); tab_link.addClassName('letter-setter-selected-tab'); }
          else { tab_link.addClassName('letter-setter-deselected-tab'); tab_link.removeClassName('letter-setter-selected-tab'); }
        } else {
          var tn_link = $(tn + "-tab-link");
          $(tab).hide();
          tn_link.addClassName('letter-setter-deselected-tab'); tn_link.removeClassName('letter-setter-selected-tab');
        }
      });
    }
  }
}

// Homepage
function init_typefaces_cycling(lengths, collections){
  var n_collections = collections.length;
  for(var i=0; i<n_collections; i++){
    var id=collections[i];
    typeface_cycles[id] = [];
    typeface_counters[id] = 0;
    var l = lengths[id][0];
    var base_path = lengths[id][1];
    for(var j=0; j<l; j++){
      c = typeface_cycles[id].push(new Image());
      var ind = j+1;
      if(ind<10){ ind="00"+ind; } else if(ind<100) ind="0"+ind;
      typeface_cycles[id][c-1].src = base_path+ind+".gif";
    }
  }

  var cycle_typefaces = function(){
    var delay = 0;
    for(var i=0; i<n_collections; i++){
      var id=collections[i];
      var l = lengths[id][0];
      typeface_counters[id] = (typeface_counters[id] + 1) % l;
      var c = typeface_counters[id];
      new_img = typeface_cycles[id][c];
     
      window.setTimeout("swap_typeface_image("+id+",'"+new_img.src+"')", delay);
      delay += typeface_transition_ratio*typeface_transition*1000;
    }
  }
  new PeriodicalExecuter(function(pe) { cycle_typefaces() }, typeface_large_delay);
}

function swap_typeface_image(id, new_src){
  var strip=$("superfamily-strip-"+id);
  strip.style.height = strip.getHeight() + "px";
  var new_img = new Image();
  var old_img = strip.childElements()[0][0];
  new_img.src = new_src;
  strip.style.background = "url('"+new_src+"') top left no-repeat";
  new Effect.Opacity(strip.childElements()[0], { from:1.0, to:0.0, duration: typeface_move, afterFinish: function(){ strip.innerHTML = "<div><img src=\""+new_src+"\"/></div>" } } );
}

function init_cycle_striping(prefix, sets, set_colors){
  var n_sets = sets.length;
  var current_set = 0;

  var cycle_strips = function(){
    var previous_set = current_set;
    current_set = (current_set + 1) % n_sets;
    var i=0;
    var delay = 0;
    var n_strips = sets[current_set];
    if(sets[previous_set] > n_strips) n_strips = sets[previous_set];
    while(i < n_strips){
      var position = i + 1;
      if(i<sets[current_set]){
        window.setTimeout("morph_blinder_color('" + prefix + "container-" + position + "','#" + set_colors[current_set] + "')", delay);
        window.setTimeout("show_blinder_image(" + (current_set + 1) +", " + position + ",'" + prefix + "')", delay+3*blind_transition_ratio*blind_transition*1000);
      } else {
        window.setTimeout("dissapear_previous('" + prefix + "container-" + position + "')", delay);
      }
      delay += blind_transition_ratio*blind_transition*1000;
      i++;
    }
  }
  cycle_strips();
  new PeriodicalExecuter(function(pe) { cycle_strips() }, blind_large_delay); 
}

function dissapear_previous(el){ new Effect.Fade(el, { duration: 6*blind_transition_ratio*blind_transition } ); }
function morph_blinder_color(el, end_color){ new Effect.Morph(el, { style: 'background:' + end_color + ';', duration: 6*blind_transition_ratio*blind_transition } ); }

function show_blinder_image(set, position, prefix){
  var container = $(prefix + "container-" + position);
  if(container){
    next_container = $(prefix + "buffer-" + set + "-" + position);
    container.innerHTML = next_container.innerHTML;
    container.onclick = next_container.onclick;
    container.show();
    container.removeClassName("hidden");
  }
  new Effect.BlindDown(container.childElements()[0], { duration: blind_transition_ratio*blind_transition });
}

function update_large_typeface_view_position(element){
  AjaxCall( "/update_large_typeface_view_position",
    "position_y=" + element.style.top.gsub(/px$/,"")*1 + "&position_x=" + element.style.left.gsub(/px$/,"")*1);
}

function adjust_content_height(){
  var shoppingcart = $("shoppingcart");
  var content = $("content");
  if(shoppingcart && content){
    content.style.marginBottom = (shoppingcart.getHeight() + 12) + "px";
  }
}

// Checkout
function refresh_checkout_cart(){ AjaxCall("/cart_items/refresh_checkout_cart", $("contact-info-form").serialize(this) ); }
function add_rebate(){ AjaxCall("/checkout/add_rebate", "order=" + $("rebate_order").value); }
function remove_rebate(id){ AjaxCall("/checkout/remove_rebate", "order=" + id); }
function eula_click(event){
  var eula_accepted = $("eula-accepted");
  if(event){  if(eula_accepted.checked) eula_accepted.checked = false; else eula_accepted.checked = true;  }
  var checkout_continue = $("checkout-continue");
  if(eula_accepted.checked){
    $("eula-acceptances").value = "true";
    checkout_continue.disabled=false;
    checkout_continue.removeClassName('continue-inactive');
    checkout_continue.addClassName('continue-active');
  } else {
    $("eula-acceptances").value = "false";
    checkout_continue.disabled=true;
    checkout_continue.addClassName('continue-inactive');
    checkout_continue.removeClassName('continue-active');
  }
}
function submit_eula(){ $('eula-accept').submit(); }
function submit_for_manual_processing(page){ AjaxCall('/checkout/submit_for_manual_processing','page=' + page); }
function forgo_rebates(page){ AjaxCall('/checkout/forgo_rebates'); }
function unprocessable_rebate_warning(page, rebate){
  modalbox_cont  =    "<div class=\"padding\">The order you have entered for rebates contains items that have previously been partially used for rebates. Rebates using these items cannot be processed on the website.<br/><br/>";
  modalbox_cont +=    "You can <a class=\"blue\" href=\"javascript:submit_for_manual_processing('"+page+"')\">proceed to submit this order</a> for manual processing";
  if(rebate == undefined)
    modalbox_cont += " or ";
  else
    
    modalbox_cont +=    ", <br/><a class=\"blue\" href=\"javascript:Modalbox.hide();remove_rebate('"+rebate+"')\">remove this rebate order</a> or <br/>";
  modalbox_cont +=    "<a class=\"blue\" href=\"javascript:forgo_rebates('"+page+"')\">forgo the rebates</a>.";
  Modalbox.show(modalbox_cont, { transitions:false, width: 650, title: ""});
}

function finish_checkout(){ AjaxCall('/checkout/charge_order', $("cc_form").serialize(this) ); }
function show_cc_error(error, errors){
  spinner.hide();
  $("credit-card-error").removeClassName('hidden');
  $("cc_error_message").innerHTML = error;
  
  $$(".required").each(function(e){ e.removeClassName("checkout-error"); });
  errors.each(function(d){ el = $(d+"-label"); el.addClassName("checkout-error"); new Effect.Highlight(el); });
  
  Effect.ScrollTo("cc_error_message", {offset: -30, duration:0.3});
}

function toggle_billing(){
  var show = $("billing-same-as-mailing").checked;
  if(show) $("billing-info").removeClassName('hidden'); else $("billing-info").addClassName('hidden');
  $("billing-same-as-mailing-val").value = show ? "false" : "true";
}

function process_contact_information(fax_order){
  $("fax_order").value = fax_order;
  AjaxCall('/checkout/process_contact_information', $("contact-info-form").serialize(this));
}

function show_required_contact_fields(contact, billing){
  spinner.hide();
  var top_h = "x";
  var top_el = null;
  var el = null;
  $$(".required").each(function(e){ e.removeClassName("checkout-error"); });
  contact.each(function(d){
    el = $("contact-"+d);
    el_top = el.cumulativeOffset()[1];
    el.addClassName("checkout-error");
    new Effect.Highlight(el);
    if(top_h=="x" || el_top<top_h){ top_h = el_top; top_el = el; }
  });
  if(billing)
  billing.each(function(d){
    el = $("billing-"+d);
    el_top = el.cumulativeOffset()[1];
    el.addClassName("checkout-error");
    new Effect.Highlight(el);
    if(top_h=="x" || el_top<top_h){ top_h = el_top; top_el = el; }
  });
  Effect.ScrollTo(top_el, {offset: -20, duration:0.3});
}

function highlight_zipcode(){
  spinner.hide();
  var zip = $("contact-zipcode");
  if($("billing-same-as-mailing-val").value != "true") zip = $("billing-zipcode");
  Effect.ScrollTo(zip, {offset: -20, duration:0.3});
  new Effect.Highlight(zip);
  zip.addClassName("checkout-error");
  alert('Invalid zipcode NY zipcode');
}

function update_contact_state_list(){
  var cstate = $("cstate");
  var bstate = $("bstate");
  var ccs = $("contact-country-select");
  
  if(ccs.value == "United States"){
    cstate.innerHTML = $("cstate-select").innerHTML;
    Event.observe('contact-state-select', 'change', refresh_checkout_cart);
  }
  else{
    cstate.innerHTML = $("cstate-input").innerHTML;
    $("contact-state-select").value = "";
    Event.observe('contact-state-select', 'change', refresh_checkout_cart);
  }
  ccs.old_value = ccs.value;
}

function update_billing_state_list(){
  var cstate = $("cstate");
  var bstate = $("bstate");
  var bcs = $("billing-country-select");
  
  if(bcs.value == "United States"){
    bstate.innerHTML = $("bstate-select").innerHTML;
    Event.observe('billing-state-select', 'change', refresh_checkout_cart);
  } else {
    bstate.innerHTML = $("bstate-input").innerHTML;
    $("billing-state-select").value = "";
    Event.observe('billing-state-select', 'change', refresh_checkout_cart);
  }
  bcs.old_value = bcs.value;
}

function init_country_handler(){
  var ccs = $("contact-country-select");
  var bcs = $("billing-country-select");
  ccs.old_value = ccs.value;
  bcs.old_value = bcs.value;
  Event.observe("contact-country-select", 'change', update_contact_state_list );
  Event.observe("billing-country-select", 'change', update_billing_state_list );
    
  new PeriodicalExecuter(function(pe) {
    if(ccs.old_value!=ccs.value) update_contact_state_list();
    if(bcs.old_value!=bcs.value) update_billing_state_list();
  }, 0.2 );
}

// Misc view functions
function show_typeface_large(){ new Effect.Move(typeface_image, { y: 0, mode: 'absolute' });  }
function show_typeface_medium(){ new Effect.Move(typeface_image, { y: -$("middle-of-large-image").value, mode: 'absolute' }); }
function show_typeface_small(offset){ if(offset==undefined) offset = 0; new Effect.Move(typeface_image, { y: -typeface_image_y + offset + typeface_viewer_container.getHeight(), mode: 'absolute' }); }
function show_highlight(el){ el.addClassName('highlight'); el.removeClassName('no-highlight'); }
function hide_highlight(el){ el.removeClassName('highlight'); el.addClassName('no-highlight'); }
function buffer_typeface_image(){
  var buffer_image = $("typeface-viewer-image-buffer").childElements()[0];
  var typeface_image = $("typeface-viewer-image").childElements()[0];
  if(buffer_image.complete) typeface_image.src = buffer_image.src;
  else Event.observe(buffer_image, 'load', function(){ typeface_image.src = buffer_image.src; });
}
function show_family_strip_size(size){
  $("small-a").removeClassName("size-selected");
  $("large-a").removeClassName("size-selected");
  $(size+"-a").addClassName("size-selected");
  $("samplesize").value = size;
  $("family-view-size-form").submit();
}

// Custom selectors
function init_item_selectors(){
   // add javascript for select lists
  $$('.select').each(function(select_dropdown){ init_select_list(select_dropdown); });
  if(price_multiplier_id>0){
    $$('.global-licenses').each(function(select_dropdown){ show_selected_element(select_dropdown, price_multiplier_id)  });
    $$('.cart-licenses').each(function(select_dropdown){ show_selected_element(select_dropdown, price_multiplier_id)  });
  }
}

function fold_selector(select_dropdown){

  var options = select_dropdown.childElements();
  options.each(function(opt){
    // if there is a selected element select it
    if(select_dropdown.selected_element){
      if(opt != select_dropdown.selected_element) opt.style.display = "";
      select_dropdown.selected_element.addClassName('selected');
    } else {
      if(opt.getAttribute("name") !="--" && !opt.parentNode.hasClassName('individual') ) opt.style.display = "";
    }
  });
  select_dropdown.removeClassName('unfolded');
  select_dropdown.unfolded = false;
  if(select_dropdown.up().hasClassName('pullup-container')){
    var shoppingcart = $("shoppingcart");
    if(shoppingcart){
      shoppingcart.style.zIndex = 1000;
      select_dropdown.style.bottom = "0";
    }
  }
}

function finish_click_processing(select_dropdown, element){
  select_dropdown.click_handler(element);
  select_dropdown.selected_element = element;
  select_dropdown.clicked = false;
}

function init_select_list(select_dropdown){
  if(select_dropdown){
    if(select_dropdown.initialized) return;
    select_dropdown.initialized = true;
    var options = select_dropdown.childElements();
    var click_handler;
    if(select_dropdown.hasClassName("licenses")) click_handler = set_licenses;
    if(select_dropdown.hasClassName("samplesize")) click_handler = set_samplesize;
    if(select_dropdown.hasClassName("languages")) click_handler = set_languages;
    if(select_dropdown.hasClassName('global-licenses')){ if(price_multiplier < 1) select_dropdown.addClassName('hover-no-licenses');  }


    select_dropdown.click_handler = click_handler;
    select_dropdown.unfolded = false;
    select_dropdown.clicked = false;
    select_dropdown.parent_container = select_dropdown.up();

    Event.observe(select_dropdown, 'mouseover', function(event){
      if(select_dropdown.up().hasClassName("select-container") ||select_dropdown.up().hasClassName("pullup-container") ){
        if(select_dropdown.id == "languages"){
          select_dropdown.addClassName('hover-with-licenses');
        } else if(price_multiplier < 1 && !select_dropdown.hasClassName('global-licenses')) select_dropdown.addClassName('hover-no-licenses'); else select_dropdown.addClassName('hover-with-licenses');
      }

    });

    Event.observe(select_dropdown, 'mouseout', function(event){
      var element = Event.element(event);
      // we are not moving to another selector option and the selector has not been just clicked
      if(!event.relatedTarget.hasClassName("in-selector") && !event.relatedTarget.hasClassName("select-chooser")){
        fold_selector(select_dropdown);
        select_dropdown.style.top = "";
        select_dropdown.style.left = "";
        if(select_dropdown.parent_container.childElements().length == 0) select_dropdown.parent_container.insert({ top: select_dropdown });
        select_dropdown.clicked = false;
        select_dropdown.relativize();
      }
      if(!select_dropdown.hasClassName('global-licenses') || (price_multiplier >= 1 && select_dropdown.hasClassName('global-licenses'))){
        select_dropdown.removeClassName('hover-no-licenses');
        select_dropdown.removeClassName('hover-with-licenses');
      }
    });

    Event.observe(select_dropdown, 'click', function(event){
      if(!select_dropdown.unfolded){  
        options.each(function(opt){ opt.style.display = "block";   });
        select_dropdown.unfolded = true;
        select_dropdown.clicked = true;
        select_dropdown.addClassName('unfolded');
        
        var selector_container = select_dropdown.up();
        if(selector_container.hasClassName('checkout-pullup-container') && selector_container.id!="checkout-selectors-container"){
          var offset = select_dropdown.parentNode.cumulativeOffset();
          select_dropdown.absolutize();
          newel.addClassName('checkout-container');
          var cart_items_height = $("cart-items").getHeight();
          select_dropdown.style.left = offset[0]+ "px";
          select_dropdown.style.top = offset[1] +"px";
        }

        if(selector_container.hasClassName('pullup-container')){
          var shoppingcart = $("shoppingcart");
          var in_checkout = false;
          var in_checkout_global = false;
          if(select_dropdown.hasClassName('cart-licenses')){ in_checkout_global = true }
          if(!shoppingcart){ shoppingcart = $("checkout-items"); in_checkout = true; }
          var cart_selectors_container = $("cart-selectors-container");
          if(in_checkout) cart_selectors_container = $("cart-selectors-container-checkout");

          var offset = select_dropdown.up().positionedOffset();
          var cart_position = shoppingcart.cumulativeOffset();
          select_dropdown.absolutize();
          
          cart_selectors_container.innerHTML = "";
          cart_selectors_container.insert({bottom : select_dropdown});

          if(!in_checkout){
            var cart_height = shoppingcart.getHeight();
            var cart_table_height = $("cart-table").getHeight();
            var selector_height = select_dropdown.getHeight();
            var position_from_bottom = (event.clientY ? event.clientY + (document.documentElement.scrollTop || document.body.scrollTop) : event.pageY) - document.viewport.getScrollOffsets()[1];
            position_from_bottom = document.viewport.getHeight() - position_from_bottom;
            select_dropdown.style.left = offset[0] + "px";
            var vpos = position_from_bottom+20;
            if(position_from_bottom < selector_height - 20) vpos = position_from_bottom + selector_height-18;
            select_dropdown.style.top = -vpos  + "px";
          } else {
            cart_height = shoppingcart.getHeight();
            var vertical_offset = 0;
            if($("bottom-cart-checkout")) vertical_offset = select_dropdown.getHeight() - 20;
            if(in_checkout_global){
              select_dropdown.style.left = offset[0] - 215 + "px";
              select_dropdown.style.top = -cart_height - 37 - vertical_offset + "px";
            } else {
              select_dropdown.style.left = offset[0]+ 7 + "px";
              select_dropdown.style.top = -cart_height + offset[1] - 3- vertical_offset + "px";
            }
          }
        }
      }
    });

    // setup event handlers for options
    options.each(function(option){
      
      if(option.hasClassName('selected')) select_dropdown.selected_element = option;

      Event.observe(option, 'click', function(event){
        var element = Event.element(event);
        var att_name = element.getAttribute("name");
        if(select_dropdown.unfolded){
          if(!(att_name == "--")){
            if(att_name == '-individual-'){
              individual_pricing = true;
              finish_click_processing(select_dropdown, element);
            } else {
              // this is an unfolded selector expecting a selection
              if(cart_items.length > 1 && price_multiplier_id != element.getAttribute("name")*1 && click_handler == set_licenses && !individual_pricing ){
                var modalbox_cont = "<div class=\"padding\">You have items in the cart that are priced for a different number of licenses. ";
                modalbox_cont +=    "You can either update all items in the cart to be priced using the new license number or select licenses individually for the different items.<br>";
                modalbox_cont +=    "<div class=\"MB_buttons\"><a href=\"javascript:blank()\" id=\"MB_CANCEL\">Update licenses of all items in cart</a>";
                modalbox_cont +=    "<a href=\"javascript:blank()\" id=\"MB_OK\">Set licenses individually for each item in cart</a></div></div>";
                Modalbox.show(modalbox_cont, { transitions:false, width: 650, title: "",
                                               afterLoad : function(){
                                                 Event.observe('MB_OK', 'click', function(){
                                                                                  Modalbox.hide();
                                                                                  individual_pricing = true;
                                                                                  finish_click_processing(select_dropdown, element);
                                                                                  } );
                                                 Event.observe('MB_CANCEL', 'click', function(){
                                                                                  Modalbox.hide();
                                                                                  finish_click_processing(select_dropdown, element);
                                                                                  } );
                                               }
                                             });
              } else {
                if(individual_pricing && select_dropdown.hasClassName("cart-licenses")){
                  var modalbox_cont = "<div class=\"padding\">Are you certain that you want to reset licenses for all items in the cart? This cannot be undone.";
                  modalbox_cont +=    "<div class=\"MB_buttons\"><input type=\"button\" value=\"NO\" id=\"MB_CANCEL\">";
                  modalbox_cont +=    "<input type=\"button\" value=\"Yes\" id=\"MB_OK\"></div></div>";
                  Modalbox.show(modalbox_cont, { transitions:false, width: 450, title: "",
                                                 afterLoad : function(){
                                                   Event.observe('MB_OK', 'click', function(){
                                                                                    Modalbox.hide();
                                                                                    individual_pricing = false;
                                                                                    finish_click_processing(select_dropdown, element);
                                                                                    } );
                                                   Event.observe('MB_CANCEL', 'click', function(){
                                                                                    Modalbox.hide();
                                                                                    finish_click_processing(select_dropdown, element);
                                                                                    } );
                                                 }
                                               });
                } else { finish_click_processing(select_dropdown, element); }
              }
            }
          }
        } else if(element.up().up().id != "cart-selectors-container") { element.removeClassName('selected'); }
      });
    });


    if(price_multiplier < 1 && select_dropdown.id != 'languages'  && select_dropdown.id != 'samplesize'){
      select_dropdown.childElements()[0].addClassName('selected');
    }
  }
}

function show_selected_element(select_dropdown, multiplier_id){ 
  if(select_dropdown){
    if(select_dropdown.selected_element.getAttribute("name")!="-individual-"){
      var options = select_dropdown.childElements();
      options.each(function(opt){
        if(opt.getAttribute("name") != multiplier_id){
          opt.style.display = "";
          opt.removeClassName("selected");
        } else {
          opt.style.display = "block";
          opt.addClassName("selected");
        }
      });
      select_dropdown.unfolded = false;
    }
  }
}

function set_licenses(element){
  var multiplier_id = element.getAttribute("name");
  var selector = element.parentNode;
  var in_checkout = "";
  if($('checkout-global-licenses')) in_checkout = "&in_checkout=true"; 
  var succ = function(){ fold_selector(select_dropdown); };
  review = "";
  if(in_review) review = "&in_review=true";
  if( selector.hasClassName('individual')){
    AjaxCall("/cart_items/set_multiplier",
             "id=" + selector.getAttribute("cart_item_id") + "&multiplier_id=" + multiplier_id + review + in_checkout );
  } else {
    AjaxCall("/price_multipliers/set_multiplier","id=" + multiplier_id + "&individual_pricing=" + individual_pricing + review, succ );
  }
}

function plural(n, kind){
  if(kind == 'style'){ if(n>1) return 'styles'; else return 'style'; }
  if(kind == 'typeface'){ if(n>1) return 'typefaces'; else return 'typeface'; }
  if(kind == 'family'){ if(n>1) return 'families'; else return 'family'; }
  if(kind == 'superfamily'){ if(n>1) return 'superfamilies'; else return 'superfamily'; }
  return '';
}

function show_typeface_family_discount(discount, typefaces, typeface_id){
  var modalbox_cont = "<div class=\"padding\">You are trying to remove a single style from a family in your cart. If you remove this style, it will cost " + format_currency(discount) + " more to license the " + typefaces;
  modalbox_cont += " remaning " + plural(typefaces, 'style') + " than it will to license the complete family. Are you sure you want to remove this style?";
  modalbox_cont +=    "<div class=\"MB_buttons\"><a href=\"javascript:blank()\" onclick=\"Modalbox.hide()\" id=\"MB_CANCEL\">No</a></div><br>";
  modalbox_cont +=    "If you want to license individual styles, or want to continue removing styles, you can <a class=\"blue\" href=\"javascript:Modalbox.hide();remove_cart_item(true, false," + typeface_id + " , 'typeface', true);\">continue</a></div>";
  Modalbox.show(modalbox_cont, { transitions:false, width: 450, title:""  });
}

function show_typeface_superfamily_discount(discount, typefaces, families, typeface_id){
  var modalbox_cont = "<div class=\"padding\">You are trying to remove a single style from a collection in your cart. If you remove this style, it will cost " + format_currency(discount) + " more to license the " + typefaces;
  modalbox_cont += " remaning " + plural(typefaces, 'style') + " and " + families + " remaining " + plural(families, 'family') + " than it will to license the complete collection. Are you sure you want to remove this style?";
  modalbox_cont +=    "<div class=\"MB_buttons\"><a href=\"javascript:blank()\" onclick=\"Modalbox.hide()\" id=\"MB_CANCEL\">No</a></div><br>";
  modalbox_cont +=    "If you want to license individual styles, or want to continue removing styles, you can <a class=\"blue\" href=\"javascript:Modalbox.hide();remove_cart_item(true, false," + typeface_id + " , 'typeface', true);\">continue</a></div>";
  Modalbox.show(modalbox_cont, { transitions:false, width: 450, title:""  });
}

function show_family_superfamily_discount(discount, families, family_id){
  var modalbox_cont = "<div class=\"padding\">You are trying to remove a single family from a collection in your cart. If you remove this family, it will cost " + format_currency(discount) + " more to license the " + families;
  modalbox_cont += " remaning " + plural(families, 'family') + " than it will to license the complete collection. Are you sure you want to remove this family?";
  modalbox_cont +=    "<div class=\"MB_buttons\"><a href=\"javascript:blank()\" onclick=\"Modalbox.hide()\" id=\"MB_CANCEL\">No</a></div><br>";
  modalbox_cont +=    "If you want to license individual families, or want to continue removing families, you can <a class=\"blue\" href=\"javascript:Modalbox.hide();remove_cart_item(true, false," + family_id + " , 'family', true);\">continue</a></div>";
  Modalbox.show(modalbox_cont, { transitions:false, width: 450, title:""  });
}

function show_family_discount_for_typeface(typeface_id, family_id){
  var modalbox_cont = "<div class=\"padding\">The cost to license the individual styles you have added to the cart now exceeds the cost to license the entire family. Would you like to license the complete family instead?";
  modalbox_cont +=    "<div class=\"MB_buttons\"><a href=\"javascript:blank()\" id=\"MB_CANCEL\">Yes</a></div><br>";
  modalbox_cont +=    "If you prefer to license individual styles, you can <a class=\"blue\" href=\"javascript:Modalbox.hide();add_typeface_to_cart(" + typeface_id + ", true);\">continue</a></div>";
  Modalbox.show(modalbox_cont, { transitions:false, width: 450, title:"",
                afterLoad : function(){ Event.observe('MB_CANCEL', 'click', function(){ Modalbox.hide(); add_family_to_cart(family_id); } ); } });
}

function show_superfamily_discount_for_typeface(typeface_id, superfamily_id){
  var modalbox_cont = "<div class=\"padding\">The cost to license the individual styles and families you have added to the cart from this collection now exceeds the cost to license the entire collection. Would you like to license the complete collection instead?";
  modalbox_cont +=    "<div class=\"MB_buttons\"><a href=\"javascript:blank()\" id=\"MB_CANCEL\">Yes</a></div><br>";
  modalbox_cont +=    "If you prefer to license individual styles, you can <a class=\"blue\" href=\"javascript:Modalbox.hide();add_typeface_to_cart(" + typeface_id + ", true);\">continue</a></div>";
  Modalbox.show(modalbox_cont, { transitions:false, width: 450, title:"",
                afterLoad : function(){ Event.observe('MB_CANCEL', 'click', function(){ Modalbox.hide(); add_superfamily_to_cart(superfamily_id); } ); } });
}

function show_superfamily_discount_for_family(family_id, superfamily_id){
  var modalbox_cont = "<div class=\"padding\">The cost to license the individual styles and families you have added to the cart from this collection now exceeds the cost to license the entire collection. Would you like to license the complete collection instead?";
  modalbox_cont +=    "<div class=\"MB_buttons\"><a href=\"javascript:blank()\" id=\"MB_CANCEL\">Yes</a></div><br>";
  modalbox_cont +=    "If you prefer to license individual styles, you can <a class=\"blue\" href=\"javascript:Modalbox.hide();add_family_to_cart(" + family_id + ", true);\">continue</a></div>";
  Modalbox.show(modalbox_cont, { transitions:false, width: 450, title:"",
                afterLoad : function(){ Event.observe('MB_CANCEL', 'click', function(){ Modalbox.hide(); add_superfamily_to_cart(superfamily_id); } ); } });
}


// Shopping cart
function remove_cart_item(cart_item_id, checkout, object_id, kind, force){
  force = force == true ? "&force=true" : "";
  var view_kind = $("view_kind");
  var view_id = $("view_id");
  if(view_kind) view_kind = "&view_kind=" + view_kind.value; else view_kind = "";
  if(view_id) view_id = "&view_id=" + view_id.value; else view_id = ""
  if(object_id) object_param = "&object_id=" + object_id + "&removed_kind=" + kind; else object_param = "";
  
  AjaxCall("/cart_items/destroy", "id=" + cart_item_id + "&checkout=" + checkout + object_param + force + view_kind + view_id );
}
function add_family_to_cart(family_id, force) {
  if(user_chosen_price_multiplier){
    force = force == true ? "&force=true" : "";
    AjaxCall("/cart_items/add", "kind=family&id=" + family_id + force);
  } else user_select_modalbox('family', family_id);
}

function add_typeface_to_cart(typeface_id, force) {
  if(user_chosen_price_multiplier){
    force = force == true ? "&force=true" : "";
    AjaxCall("/cart_items/add", "kind=typeface&id=" + typeface_id + force);
  } else user_select_modalbox('typeface', typeface_id);
}

function add_superfamily_to_cart(superfamily_id, force){
  if(user_chosen_price_multiplier){
    force = force == true ? "&force=true" : "";
    AjaxCall("/cart_items/add", "kind=superfamily&id=" + superfamily_id + force);
  } else user_select_modalbox('superfamily', superfamily_id);
}
function show_full_cart(set_state){
  if(!$("cart-empty")){
    var cart_items = $("cart-items");
    if(cart_items){
      var cart_status = $("cart-status");
      cart_items.removeClassName('hidden');
      cart_status.removeClassName('hidden');
      cart_items.show();
      cart_status.show();
      $("shoppingcart-summary").style.display = "none";
      var expander = $("shopping-cart-expander");
      if(expander) expander.addClassName('shopping-cart-expanded');
      if(expander) expander.removeClassName('shopping-cart-collapsed');
      if(set_state) AjaxCall("/cart_items/set_cart_state", "cart_state=full");
      adjust_content_height();
    }
  }
}

function show_summary_cart(set_state){
  if($("cart-items")){
    $("cart-items").hide();
    $("cart-status").hide();
    $("shoppingcart-summary").style.display = "block";
    var expander = $("shopping-cart-expander");
    if(expander) expander.removeClassName('shopping-cart-expanded');
    if(expander) expander.addClassName('shopping-cart-collapsed');
    if(set_state)  AjaxCall("/cart_items/set_cart_state", "cart_state=summary");
    adjust_content_height();
  }
}

function toggle_cart_view(){
  if($("cart-items").visible()) show_summary_cart(true); else show_full_cart(true);
}

function set_children_in_cart_status_for(kind, object_id, object_status, item_status){
  if(kind == 'family') set_family_children_in_cart_status(object_id, object_status, item_status);
  if(kind == 'superfamily') set_superfamily_children_in_cart_status(object_id, object_status, item_status);
}

function set_family_children_in_cart_status(family_id, family_status, item_status){
  $$(".typeface-price").each(function(price_element){
    if(price_element.getAttribute('family_id')==family_id)
    update_price_for(null,null, price_element, { 'family_in_cart': family_status, 'in_cart': item_status } );
  });
}

function set_superfamily_children_in_cart_status(superfamily_id, superfamily_status, item_status){
  $$(".family-price").each(function(family_price_element){
    if(family_price_element.getAttribute('superfamily_id')==superfamily_id){
      set_price_element_in_cart_status(family_price_element, superfamily_status, item_status);
      var family_id = family_price_element.getAttribute('object_id');
      $$(".typeface-price").each(function(price_element){
        if(price_element.getAttribute('family_id')==family_id) set_price_element_in_cart_status(price_element, superfamily_status, item_status);
      });
    }
  });
}

function set_price_element_in_cart_status(price_element, superfamily_status, item_status){
  if(price_element) update_price_for(null,null, price_element, { 'superfamily_in_cart': superfamily_status, 'in_cart':item_status } );
}

function set_in_cart_status(kind, id, in_cart){
  if($(kind + "-price-" + id)) $(kind + "-price-" + id).setAttribute('in_cart', in_cart);
  if($(kind + "-price-" + id + "-in_typeface")) $(kind + "-price-" + id + "-in_typeface").setAttribute('in_cart', in_cart);
}

// Prices
function format_currency(val){
  var decimals = (Math.round( (val - Math.floor(val) )*100 ));
  decimals = decimals < 10 ? ".0" + decimals : "." + decimals;
  integer = Math.floor(val) + "";
  var int_part = "";
  for(i=integer.length-1; i>=0; i--) {
    if(i<integer.length-1 && (integer.length - i - 1) % 3 == 0) int_part = integer.substr(i,1) + "," + int_part ; else int_part = integer.substr(i,1) + int_part;
  }
  return "$" + int_part + decimals;
}

function update_price_for(object, object_id, price_element, options){
  if(options == undefined) options = {};
  var in_typeface_page = false;
  if(!(options['in_typeface_page'] == undefined)){ in_typeface_page = options['in_typeface_page']; }
  // get the element that contains the price information
  var price_element;
  if(price_element == undefined){
    if(in_typeface_page) price_element = $(object + "-price-" + object_id + "-in_typeface");
    else price_element = $(object + "-price-" + object_id);
  }
  if(price_element){
    // get info on object
    // get the id of the typeface, family or superfamily
    var object_id = price_element.getAttribute("object_id");
    var object = price_element.getAttribute("object");
    var base_price = price_element.getAttribute("base_price");
    var discounted_price = price_element.getAttribute("discounted_price");
    var in_cart = price_element.getAttribute("in_cart");
    var family_in_cart = price_element.getAttribute("family_in_cart");
    var superfamily_in_cart = price_element.getAttribute("superfamily_in_cart");
    if(family_in_cart!=undefined && family_in_cart == true) { family_in_cart == 'true' }
    var price = price_multiplier * base_price;
    
    // if the options specify whether the object is in the cart use that and set the attribute
    // if the options do not specify this use the element attribute
    if(!(options['in_cart'] == undefined)){ in_cart = options['in_cart'];  price_element.setAttribute("in_cart", in_cart); }
    if(!(options['discounted_price'] == undefined)){ discounted_price = options['discounted_price']; price_element.setAttribute("discounted_price", discounted_price); }
    if(!(options['family_in_cart'] == undefined)){ family_in_cart = options['family_in_cart']; price_element.setAttribute("family_in_cart", family_in_cart); }
    if(!(options['superfamily_in_cart'] == undefined)){ superfamily_in_cart = options['superfamily_in_cart']; price_element.setAttribute("superfamily_in_cart", superfamily_in_cart); }
    if(in_cart=='false' && !(family_in_cart=='true') && !(superfamily_in_cart=='true'))  price_element.setAttribute("discounted_price", price);
    
    if(in_cart == "false"){
      // item is not in cart
      var add_to_cart = "<span class=\"add-to-cart\">, add to cart</span>";
      if(price_element.getAttribute("skip_in_cart") == "true") add_to_cart = "";
      if(price_multiplier > 0){
        if(discounted_price == price || price_element.hasClassName('superfamily-price')){
          // no discount
  
          price_element.innerHTML = "<a href=\"javascript:add_" + object +"_to_cart(" + object_id + ");\" class=\"blue\"> " + format_currency(price) + add_to_cart + "</a>";
          price_element.removeClassName('inactive-gray');
          price_element.removeClassName('discount-highlight');
        } else {
          // there is a discount
          var tooltip = "";
          if(object == 'typeface') tooltip = " title=\"When licensing roman or italic in any individual weight, the matching style is discounted.\" ";
          if(object == 'family') tooltip = " title=\"This family has been discounted because you already have a member of the same family in your cart.\" ";
          var link_markup = "<a " + tooltip + "href=\"javascript:add_" + object +"_to_cart(" + object_id + ");\" class=\"blue\">";
          price_element.innerHTML =  link_markup + "+ <del><span>" + format_currency(price) + "</span></del> " + format_currency(discounted_price) + "*" + add_to_cart + "</a>";
          price_element.removeClassName('inactive-gray');
          price_element.addClassName('discount-highlight');
        }

      } else {
        // price multiplier is not set, show blank prices
        price_element.addClassName('inactive-gray');
        price_element.innerHTML = "+ $--";
        price_element.removeClassName('discount-highlight');
      }
    } else {
      price_element.removeClassName('discount-highlight');
      // item is in cart, show remove text
      if(superfamily_in_cart == 'true')
        price_element.innerHTML = "<a class=\"blue\" href=\"javascript:remove_cart_item(" + in_cart + ", 'false', " + price_element.getAttribute("object_id") + ", '" + price_element.getAttribute("object")  + "')\">×</a> <span class=\"bold inactive-gray\">collection in cart</span>";
      else {
        if(family_in_cart == 'true')
        price_element.innerHTML = "<a class=\"blue\" href=\"javascript:remove_cart_item(" + in_cart + ", 'false', " + price_element.getAttribute("object_id") + ", '" + price_element.getAttribute("object") + "')\">×</a> <span class=\"bold inactive-gray\">family in cart</span>";
        else
        price_element.innerHTML = "<a class=\"blue\" href=\"javascript:remove_cart_item(" + in_cart + ", 'false')\">×</a> <span class=\"bold inactive-gray\">in cart</span>";
      }
    }
  }
}

function set_price_multiplier(multiplier, multiplier_id){
  price_multiplier = multiplier;
  price_multiplier_id = multiplier_id;
  $$(".select").each(function(select_dropdown) { if(select_dropdown.hasClassName('global-licenses')){ if(price_multiplier >= 1) select_dropdown.removeClassName('hover-no-licenses');  } });
  update_prices();
}

function set_prices_for(kind, prices_to_update){
  $$("." + kind + "-price").each(function(price_element){
    update_price_for(null,null, price_element, prices_to_update[price_element.getAttribute('object_id')] );
  });
}

function update_prices(highlight){
  $$(".price").each(function(price_element){ update_price_for(null,null, price_element);  });
}

function set_samplesize(element){
  $("samplesize-value").value = element.getAttribute('name');
  $("samplesize-form").submit();
}

function set_languages(element){
  $("language-code").value = element.getAttribute('name');
  $("languages-form").submit();
}

function user_select_modalbox(kind, id){
  Modalbox.show('/price_multipliers/user_select/?kind='+kind+'&id=' + id + "&authenticity_token=" + authenticity_token,
    { title:"", width:220,
      afterLoad: function(){
                  init_select_list($("user-selected-licenses"));
                }
     });
}

function show_info_for(id){
  $$("#about-people .selected").each(function(el){ el.removeClassName('selected'); });
  $("bio-link-"+id).addClassName('selected');
  AjaxCall('/pages/view_bio', "id=" + id);
}

function show_designer_info_for(id){
  $$("#about-people .selected").each(function(el){ el.removeClassName('selected'); });
  $("d-link-"+id).addClassName('selected');
  AjaxCall('/pages/view_designer_bio', "id=" + id);
}

// Popups
function setup_popups(){
  $$(".popup").each(function(el){
    Event.observe(el, 'mouseover', function(){ $(el.id+"-popup").removeClassName("hidden"); });
    Event.observe(el, 'mouseout',  function(){ $(el.id+"-popup").addClassName("hidden");     });
  });
}

// Utility
function redirect_to(url){ window.location = url;} 
function remove(css_id){ $(css_id).remove(); }
function blank(){}