$(function() {
  var hashtrack = (function(settings,defaults,configurator) {
    function toJSON(o) {
      if (o == undefined) return "undefined";
      else if (o == null) return "null";
      else if (typeof(o) == 'object') {
        if (o.constructor == Array) {
          return '['+o.map(toJSON).join(",")+']';
        } else {
          var r = '{';
          for (key in o) {
            if (r.length>1) r+=',';
            r += '"'+key+'":'+toJSON(o[key]);
          }
          return r+'}';
        }
      } else {
        return (o-0==o&&o+0==o?o:'"'+o+'"');
      }
    }
    function tr(str,re,map) { return str.replace(re,function(m){ return (map[m] == undefined?m:map[m]); }); }
    /* used to reduce escaping by transliterating common need-to-escape
       with less common as-is characters */
    function trquote(s) { return tr(s,/['":!]/g,{'"':"'","'":'"',':':'!','!':':'}); }
    function obstrip(s) { return s.slice(1,-1); }
    function serialize(o) {
      return encodeURIComponent(obstrip(trquote(toJSON(o))));
    }
    function unserialize(o) {
      return $.parseJSON(trquote('{'+decodeURIComponent(o)+'}'))
    }
    function apply(o,c) {
      if (typeof(c) == 'object') for (k in c) { o[k] = c[k]; }
    }
    function hash() { return location.hash.replace(/^#/,''); }
    function set(o) {
      for (key in defaults) if (o[key] == undefined)
          o[key] = defaults[key];
      for (key in o) {
        if (settings[key] != o[key]) {
          configurator[key] && configurator[key](o[key],key,settings[key]);
          if (defaults[key] == o[key])
            delete settings[key];
          else
          {
            settings[key] = o[key];
          }
        }
      }
    }
    var current = hash();
    var initial = {}
    apply (initial, unserialize(current));
    setInterval(function() {
      var newhash = hash();
      if (newhash != current) {
        var o = unserialize(current = newhash);
        if (! o) o = {};
        set(o);
      }
    }, 500);

    set(initial);

    for (key in settings) {
      configurator[key] && configurator[key](settings[key],key);
    }
    return function(o) {
      set(o);
      location.hash = current = serialize(settings);
    }
  });

  var submenus = $("#menu ul");
  var views = $("#content .view");
  var menuselection, menuitem;
  var push;
  function menu_select(id) {
    if (menuselection == id)
      return false;
    menuselection = id;
    var visible = submenus.not(":hidden");
    var slideDown = function() {
      if (visible.filter(":animated").length <= 1)
        $("#"+id+" ul").slideDown();
    }
    if (visible.length > 0)
      visible.slideUp("fast", slideDown);
    else
      slideDown();
    return true;
  }
  function menu_item(id) {
    if (menuitem == id)
      return false;
    menuitem = id;
    var view = $("#v"+id);
    var visible = views.not(":hidden");
    var show = function() {
      if (visible.filter(":animated").length <= 1)
      {
        view.fadeIn();
        if (view.hasClass('gallery'))
        {
          gallery_set(id);
          $('#gallery').fadeIn();
        }
      }
    }
    if (visible.length > 0)
    {
      $('#gallery').fadeOut("fast");
      visible.fadeOut("fast", show);
    }
    else
      show();
    return true;
  }

  var settings = {};
  var defaults = {
    i: 'hs'
  };
  var configurator = {
    i: function(v) {
      menu_select(v.substring(0,1));
      menu_item(v);
    }
  };


  $("#menu>li").click(function(e) {
    if (e.target.parentNode.id == "menu")
      $(">ul>li", this).eq(0).click();
  });
  $("#menu>li>ul>li").click(function(e) {
    push({i: this.id});
  });

  $("#vgd input[type=button]").click(function() {
    push({i: "gdo"});
  });
  $("#vgc input[type=button]").click(function() {
    push({i: "gco"});
  });

  var ctext = $("#lith-ctext");
  var etext = $("#lith-etext");
  var wtext = $("#lith-wtext");
  var wtext2 = $("#lith-wtext-2");
  var ptext = $("#lith-ptext");
  var cval = $("#lith-cval");
  var eval = $("#lith-eval");
  var wval = $("#lith-wval");
  $("#vgl input[type=button]").click(function() {
    var def = this.id.split(':');
    var type = def[1];
    var width = def[2];
    var center = type.substring(0,1);
    var edge = type.substring(1,2);
    var priceid = this.id+':p';

    if (center == 'r') {
      ctext.html('r&ouml;dguldsring');
      cval.val('rödguld');
    } else if (center == 'v') {
      ctext.html('vitguldsring');
      cval.val('vitguld');
    }
    
    if (edge == 'r') {
      etext.html('r&ouml;dguldskant');
      eval.val('rödguld');
    } else if (edge == 'v') {
      etext.html('vitguldskant');
      eval.val('vitguld');
    }

    var wt = ((width/10)+" mm").replace('.',',');
    wtext.html(wt);
    wtext2.html(wt);
    wval.val(wt.replace(' ',''));

    /* copy the price, ':' messes up jquery, so go old school.. */
    price = document.getElementById(priceid).innerHTML;
    ptext.html(price);


    push({i: "glo"});
  });
  $("#vgk input[type=button]").click(function() {
    push({i: "gko"});
  });

  push = hashtrack(settings, defaults, configurator);
});

