function cart_notice(msg, duration, elem) {
  if (!msg) return;
  duration = duration || 5;
  var notice = $(elem);
  notice.innerHTML = msg;
  if (notice.effect != null) {
    notice.effect.cancel()
  }
  notice.show();
  notice.effect = new Effect.Fade(notice, { duration: duration, from: 1.0 });
}

Event.observe(document, 'dom:loaded', function() {
    var nameFromElement = function(element) {
      return element.id.replace(/^(nav|menu)-/, '');
    };
    var toMenu = function(element) {
      return $('menu-'+nameFromElement(element));
    };
    var toNav = function(element) {
      return $('nav-'+nameFromElement(element));
    };
    var closeMenu = function(element) {
      nav = toNav(element);
      menu = toMenu(element || this);
      if (nav.className) nav.removeClassName('menu-open');
      menu.hide();
    };
    var menuTimeout = {
      hash: new Hash(),
      set: function(element) {
          var name = nameFromElement(element);
          this.clear(element);
          this.hash.set(name, setTimeout(closeMenu.bind(null, element), 500));
        },
      clear: function(element) {
          var name = nameFromElement(element);
          var timeout = this.hash.get(name);
          if (timeout) {
            clearTimeout(timeout);
            this.hash.unset(name);
          }
        }
    };
    var allMenus = null;
    var onNav = null;
    var onMenu = null;
    var closeOthers = function(name) {
      var menu = $('menu-'+name);
      if (this != menu) closeMenu(menu);
    };
    var openMenu = function(evt) {
      var nav = Event.element(evt);
      if (nav.tagName != 'li') nav = nav.up('li');
      if (!nav) return;
      var menu = toMenu(nav);
      if (nav.className) {
        nav.addClassName('menu-open');
      } else {
        nav.className = 'menu-open';
      }
      allMenus.each(closeOthers.bind(menu));
      onNav = nav.id;
      menuTimeout.clear(nav);
      menu.show();
    };
    var inMenu = function(evt) {
      var menu = Event.element(evt);
      if (menu.tagName.toLowerCase() != 'iframe') {
        menu = toMenu(menu.up('body'));
      }
      if (!menu) return;
      onMenu = menu.id;
      menuTimeout.clear(menu);
    };
    var offMenu = function(evt) {
      var menu = Event.element(evt);
      if (menu.tagName.toLowerCase() != 'iframe') {
        menu = toMenu(menu.up('body'));
      }
      if (!menu) return;
      if (onMenu == menu.id) {
        onMenu = null;
        if (!(onMenu || onNav)) menuTimeout.set(menu);
      }
    };
    var offNav = function(evt) {
      var nav = Event.element(evt);
      if (nav.tagName != 'li') nav = nav.up('li');
      if (!nav) return;
      if (onNav == nav.id) {
        onNav = null;
        if (!(onMenu || onNav)) menuTimeout.set(nav);
      }
    };
    allMenus = $$('iframe.menu').map(function(menu) {
      var nav = toNav(menu);
      nav.observe( "mouseover", openMenu);
      nav.observe( "mouseout",  offNav);
      menu.observe("mouseover", inMenu);
      menu.observe("mouseout",  offMenu);
      return nameFromElement(menu);
    });
    if ($('nav-home')) {
      Event.observe('nav-home', 'mouseover',
          function() { allMenus.each(closeOthers.bind(null)); });
    }
    if ($('nav-contact')) {
      Event.observe('nav-contact', 'mouseover',
          function() { allMenus.each(closeOthers.bind(null)); });
    }
});

