(function($) {
  var opts;
  var menus = [];
  $.fn.webetui_pulldown = function(options) {
    opts = $.extend({
      aniLen    : 250,
      showDelay : 250,
      hideDelay : 1000,
      slideUp   : true
    }, options || {});

    return this.each(function() {
      initmenu(this);
    });
  };
  
  function initmenu(ul) {
    $(ul).children('li').each(function(i) {
      var li = this;
//      var lic  = $(li).children('li').get(0);
      $(li).children('ul').each(function() {
        inititem(i, li, this);
      });
    });
  };
  
  function inititem(i, li, ul) {
    var div = $('<div class="container"/>');
   // var ul2 = $(ul).clone();
    var ul2 = $(ul);
    div.append(ul2);
    $(li).append(div);
    li.accelConst	   = (0 - ul2.height()) / opts.aniLen / opts.aniLen
    var padding_bottom = parseInt(ul2.css('padding-bottom'));
    div.height(ul2.height() + padding_bottom);
    div.css('left', 0);
    
    menus[i] = li;
    li.menu   = ul;
    li.menuId = i;
    li.onmouseover = function() { showmenu(this) };
    li.onmouseout  = function() { hidemenu(this) };
    li.style.position = "relative";
  }

  function showmenu(node) {
    if (node.showTimer) clearInterval(node.showTimer)
  	//node.showTimer = setInterval( (function(i){ return function() { shownow(i) }})(node.menuId), opts.showDelay);
    shownow(node.menuId);
  }
  
  function shownow(i) {
    var node = menus[i];
    clearInterval(node.showTimer);
    $(node).addClass('hover');
    for(var i=0; i<menus.length; i++)
      if(menus[i] != node) 
        hidenow(i);
   	if (node.hideTimer) window.clearTimeout(node.hideTimer)
      node.hideTimer = 0
    if (!node.open) startSlide(node, true);
  }
  
  function hidemenu(node) {
    if (node.hideTimer) window.clearInterval(node.hideTimer)
  	node.hideTimer = setInterval( (function(i){ return function() { hidenow(i) }})(node.menuId), opts.hideDelay);
  }
  
  function hidenow(i) {
    var node = menus[i];
//    clearInterval(node.showTimer);
    if (node && node.open && !node.aniTimer) {
      if (opts.slideUp) {
        startSlide(node, false);
      } else {
        node.open = false;
        $('div', node).fadeOut(300, function() { $('div',node).show(); endSlide(node) } );
      }
      clearInterval(node.hideTimer);
    }
  }

  function slide(i) {
    var node = menus[i];
  	var elapsed = (new Date()).getTime() - node.startTime;
  	if (elapsed > opts.aniLen) 
      endSlide(node);
  	else {
      var d = Math.round(Math.pow(opts.aniLen - elapsed, 2) * node.accelConst)
      if (node.open)
    		node.menu.style.top = d + "px";
  		else 
    		node.menu.style.top = -node.menu.offsetHeight - d + "px";
  	}
  }

  function startSlide(node, open) {
    //alert(node.menu);
  	node.open = open;
  	node.menu.style.top = -node.menu.offsetHeight + 'px';
    node.menu.style.visibility = "visible";
    node.menu.parentNode.style.visibility = "visible";
  	node.startTime = (new Date()).getTime();
    // omdat IE geen 3e argument op setInterval ondersteunt:
  	// FF en Safari: node.aniTimer = setInterval(slide, 10, node.menuId);
  	node.aniTimer = setInterval( (function(i){ return function() { slide(i) }})(node.menuId), 10);
  }
  
  
  function endSlide(node) {
  	node.aniTimer = window.clearInterval(node.aniTimer)
  	//node.moveTo(node.open ? node.outPos : node.homePos)
  	if (!node.open) {
      node.menu.style.visibility = "hidden";
      node.menu.parentNode.style.visibility = "hidden";
    }
    if (node.open) {
    	node.menu.style.top = 0;
    }
  	//if ((node.open && !node.over) || (!node.open && node.over)) {
    //  startSlide()
    //	}
    if (!node.open) $(node).removeClass('hover');
  }
  
  
})(jQuery);


