/**
 * Wrapper functionality for AJAX request using prototype
 *
 * This file is part of Batavi Open E-Commerce Solution.
 *
 * Batavi Open E-Commerce Solution is free software: you can redistribute
 * it and/or modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation version 2 of the
 * License.
 *
 * @copyright 2007-2008 ICEshop BV Copyright (www.batavi.org)
 *
 * @license GNU General Public License v2
 *
 * @see http://www.gnu.org/licenses/
 * @see http://www.gnu.org/licenses/gpl-faq.html
 */

  var boxMenuClickedItems = new Array;
  /**
   * methods for menu type "full - flyout"
   *
   * add methods for flyout nenu expanding
   */
  var menu_methods = {
    menu: function(el, menuId, parentItem) {
      var element = $(el);
      element.id = menuId;
      var itemIdBase = menuId;
      if (menuId.substr(menuId.length - 4) == '_sub') {
        itemIdBase = menuId.substr(0, menuId.length - 4);
      }
      if (parentItem != undefined) {
        element.parentItem = parentItem;
      }
      element.items = new Array();
      element.timerId = null;
      element.currentMenuId = '';
      var items = element.immediateDescendants();
      for (var i=0; i<items.length; i++) {

        if (items[i].match('li')) {
          var item = items[i];
          item.parent = element;
          item.menuItem(itemIdBase + '_' + i);
          element.items.push(item);
        }

      }
    },

    menuItem: function(el, itemId) {
      var element = $(el);
      element.id = itemId;
      var links = element.getElementsBySelector('a');
      if (links != undefined && links.length > 0) {
        var link = links[0];
      }
      if (link != undefined && link.hasClassName('active')) {
        element.isCurrentItem = true;
      } else {
        element.isCurrentItem = false;
      }
      var sub = element.getElementsBySelector('ul');
      if (sub != undefined && sub.length > 0) {
        element.sub = sub[0];
        element.sub.menu(element.id + '_sub', element);
        element.sub.hide();
      }

      Event.observe(element, 'mouseover', (function(event){
        if (this.parent.currentMenuId != '') {
          clearTimeout(this.parent.timerId);
          if ((this.sub == undefined) || (this.parent.currentMenuId != this.id)) {
            $(this.parent.currentMenuId).menuItemMouseOut();
          }
        }
        if (this.parent.parentItem != undefined) {
          var link = this.parent.parentItem.firstDescendant();
          if (link != undefined) {
            link.addClassName('parentHover');
          }
        }
        if (this.sub != undefined) {
          this.parent.currentMenuId = this.id;
          this.sub.show();
        }
      }).bindAsEventListener(element) );

      Event.observe(element, 'mouseout', (function(event){
        if (this.sub != undefined) {
          this.parent.timerId = setTimeout("$('" + this.id + "').menuItemMouseOut();", 500);
        } else {
          this.menuItemMouseOut();
        }
      }).bindAsEventListener(element) );
    },

    menuItemMouseOut: function(el) {
      var element = $(el);
      if (element.parent.parentItem != undefined) {
        var link = element.parent.parentItem.firstDescendant();
        if (link != undefined) {
          link.removeClassName('parentHover');
        }
      }
      if (element.sub != undefined) {
        if (element.sub.currentMenuId != '') {
          $(element.sub.currentMenuId).menuItemMouseOut();
        }
        element.sub.hide();
        element.parent.currentMenuId = '';
      }
    }
  }


  /**
   * methods for menu type "full - onclick"
   *
   * add methods for clickable nenu expanding
   */
  var menu_clickable_methods = {
    menuClickable: function(el, menuId, parentItem) {
      var element = $(el);
      element.id = menuId;
      var itemIdBase = menuId;
      if (menuId.substr(menuId.length - 4) == '_sub') {
        itemIdBase = menuId.substr(0, menuId.length - 4);
      }
      if (parentItem != undefined) {
        element.parentItem = parentItem;
      }
      element.items = new Array();
      element.timerId = null;
      element.currentMenuId = '';
      var items = element.immediateDescendants();
      for (var i=0; i<items.length; i++) {

        if (items[i].match('li')) {
          var item = items[i];
          item.parent = element;
          item.menuClickableItem(itemIdBase + '_' + i);
          element.items.push(item);
        }

      }
    },

    menuClickableItem: function(el, itemId) {
      var element = $(el);
      element.id = itemId;
      var links = element.getElementsBySelector('a');
      if (links != undefined && links.length > 0) {
        var link = links[0];
      }
      if (link != undefined && link.hasClassName('active')) {
        element.isCurrentItem = true;
      } else {
        element.isCurrentItem = false;
      }
      element.clicksCounter = 0;
      var sub = element.getElementsBySelector('ul');
      if (sub != undefined && sub.length > 0) {
        element.sub = sub[0];

        if (link != undefined) {
          link.onclick = function(event){
            return false;
          };
        }

        element.sub.menuClickable(element.id + '_sub', element);
        if (element.isCurrentItem == false) {
          element.sub.hide();
        } else {
          element.sub.show();
        }
      }

      Event.observe(element, 'mouseover', (function(event){
        if (this.parent.currentMenuId != '') {
          clearTimeout(this.parent.timerId);
          if ((this.sub == undefined) || (this.parent.currentMenuId != this.id)) {
            $(this.parent.currentMenuId).menuClickableItemMouseOut();
          }
        }
        if (this.parent.parentItem != undefined) {
          var link = this.parent.parentItem.firstDescendant();
          if (link != undefined) {
            link.addClassName('parentHover');
          }
        }
      }).bindAsEventListener(element) );

      Event.observe(element, 'click', (function(event){
        if (this.sub != undefined) {
          if (Event.element(event) == this || (Event.findElement(event, 'li') == this)) {
            this.clicksCounter++;
          }
          if (this.clicksCounter > 1) {
            var links = this.getElementsBySelector('a');
            if (links != undefined && links.length > 0) {
              window.location.href = links[0].href;
            }
          }
          this.parent.currentMenuId = this.id;
          this.sub.show();
        }
      }).bindAsEventListener(element) );
      Event.observe(element, 'mouseout', (function(event){
        if (this.sub != undefined && this.parent.currentMenuId == this.id) {
          this.parent.timerId = setTimeout("$('" + this.id + "').menuClickableItemMouseOut();", 500);
        } else {
          this.menuClickableItemMouseOut();
        }
      }).bindAsEventListener(element) );
    },

    menuClickableItemMouseOut: function(el) {
      var element = $(el);
      if (element.parent.parentItem != undefined) {
        var link = element.parent.parentItem.firstDescendant();
        if (link != undefined) {
          link.removeClassName('parentHover');
        }
      }
      if (element.isCurrentItem == false) {
        if (element.sub != undefined) {
          if (element.sub.currentMenuId != '') {
            $(element.sub.currentMenuId).menuClickableItemMouseOut();
          }
          element.clicksCounter = 0;
          element.sub.hide();
          element.parent.currentMenuId = '';
        }
      }
    }
  }

  Element.addMethods(['ul', 'li'], menu_methods);
  Element.addMethods(['ul', 'li'], menu_clickable_methods);
