var ulPositionX = 0;
var ulPositionY = 0;
var ulHeight = 0;
var ulMainWidth = 0;
var ulPaddingsWidth = 0;
var previousEventOwner;
var flagDone;

(function($){
    $.fn.animateMenu = function(args){
        var am = this;
        var amTimer = null;
        var amDefaultParams = {
            hoverClass: 'am-hover',
            selectedClass: 'am-selected',
            openClass: 'am-open',
            delay: 0,
            animation: {
                opacity: 'show',
                height: 'show'
                
            },
            speed: 0,
            type: 'innerClick',
            roundedElements:false
        };
  
  $(this).wrap('<div class="menuWrap"></div>');

        var amParams = $.extend(amDefaultParams, args);
        
        var outerOver = function(event){
            if (amTimer) {
                clearTimeout(amTimer);
            }
            if (event.target != $(this).get(0) && event.target.nodeName == 'LI' && previousEventOwner != event.target) {
              previousEventOwner = event.target;
                var $amCurrentLI;
                if (event.target.nodeName != 'LI') {
                    $amCurrentLI = $(event.target).closest('li');
                }
                else {
                    $amCurrentLI = $(event.target);
                }
                var $amChildrenUL = $('ul:first', $amCurrentLI).stop();
                if ($amChildrenUL.length) {
                    if (amParams.type != 'outerTopHover' || $(this).get(0) != $amCurrentLI.parent().get(0)) {
                        $amChildrenUL.amBuildOuterLeft(amParams.roundedElements);
                    }
                    $amChildrenUL.amClearCSS(amParams.type, amParams.roundedElements);
                }
               $(am).find('ul').not($amCurrentLI.parents('ul')).not($amChildrenUL).stop().hide();
            }
        };
        
        var outerOut = function(event){
            if (amTimer) {
                clearTimeout(amTimer);
            }
            amTimer = setTimeout(function(){
                $(am).find('ul').stop().hide();
            }, amParams.delay);
        };
        
        var innerClick = function(){
            if ($('ul:first', this).is(':visible')) {
                $('ul:first', this).stop().hide().closest('li').removeClass(amParams.openClass);

            }
            else {
                var $amChildrenUL = $('ul:first', this).stop();
                if ($amChildrenUL.length) {
                    $amChildrenUL.amClearCSS();
                    $amChildrenUL.closest('li').addClass(amParams.openClass);
                }
            }
        };
        
        var innerOver = function(event){
            var $amChildrenULs = (am).find('ul:animated').stop();
            if ($amChildrenULs.length) {
                $amChildrenULs.amClearCSS();
            }
            if (event.target != $(this).get(0) && event.target.nodeName != 'UL') {
                var $amCurrentLI;
                if (event.target.nodeName != 'LI') {
                    $amCurrentLI = $(event.target).closest('li');
                }
                else {
                    $amCurrentLI = $(event.target);
                }
                var $amChildrenUL = $('ul:first', $amCurrentLI).stop().closest('li').removeClass(amParams.openClass);
                if ($amChildrenUL.length) {
                    $amChildrenUL.amClearCSS();
                    $amChildrenUL.closest('li').addClass(amParams.openClass);
                }
            }
        };
        
        var innerOut = function(){
            $(am).find('ul').stop().fadeOut(amParams.delay);
        };
        
        $.fn.extend({
            animateMenuBind: function(){
                switch (amParams.type) {
                    case 'innerClick':
                        $('li:has(ul)', this).click(innerClick);
                        $('li', this).click(function(event){
                            event.stopPropagation();
                        });
                        break;
                    case 'innerHover':
                        $(this).mouseover(innerOver);
                        $(this).mouseout(innerOut);
                        break;
                    case 'outerTopHover':
                        $('li', this).amBuildFirstSecondMenuBottomLeft();
                        $(this).mouseover(outerOver);
                        $(this).mouseout(outerOut);
                        break;
                    case 'outerLeftHover':
      $('li', this).amBuildFirstSecondMenuRightBottom();
      $(this).mouseover(outerOver);
                        $(this).mouseout(outerOut);
                        break;
                    default:
                        alert('Ð?ÐµÐ²ÐµÑ?ÐœÐŸ Ñ?ÐºÐ°Ð·Ð°Ðœ Ñ?ÐžÐ¿ ÐŒÐµÐœÑ?!');
                }
            },
            
            amBuildOuterLeft: function(roundedElements){
              var ulWidth = $(this).width();
              var firstFlag = true;
              var topH = 0;
              $(this).children('li').each(function (){
                $(this).parent().css('display','block');
                if(!parseInt($(this).parent().parent().css('borderTopWidth'))){//Stroim <li> vtorogo urovnia dlya verticalnogo menu, i tretego  i bolee urovnya dlya vseh menu
                  borderTopWidth = 0;
                } else {
                    borderTopWidth = parseInt($(this).parent().parent().css('borderTopWidth'));
                }
                
                
                if(roundedElements == true && firstFlag == true){
                
                $('body').append('<ul id="deleteMe"><li>&nbsp;<ul id="ulForCheck" class="bg">&nbsp;</li></ul>');
                var tmpPaddingValue = parseInt($('#ulForCheck').css('padding-top'),10);
                $('#deleteMe').remove();
                
                topH += tmpPaddingValue;
                firstFlag = false;
                }
                $(this).css({
                  left: 0,
                  width: ulWidth,
                  top:topH 
                  });

                topH += parseInt($(this).height(),10) + parseInt($(this).css('padding-top'),10) + parseInt($(this).css('padding-bottom'),10) ;
                $(this).parent().css('display','none');
          
                
              });              
            },
            
            amBuildOuterTop: function(){
                $(this).find('ul').css({
                    left: -($(this).outerWidth() - $(this).innerWidth()) / 2,
                    top: ($(this).outerHeight() - $(this).innerHeight()) / 2 + $(this).innerHeight()
                });
            },
            
            amBuildFirstSecondMenuBottomLeft: function(){
                $(this).css('position', 'absolute').find('ul').css('position', 'absolute');
    $(this).filter('div > ul > li').each( function (){//Stroim <li> pervogo urovnia dlya horizont menu
      var $currentElement = $(this);
      var elementLeftPosition = 0;
      while($currentElement.prev().width()){
        
        if(parseInt($(this).css('borderLeftWidth'),10)){
          borderLeftWidth = parseInt($(this).css('borderLeftWidth'),10);
        } else {
        borderLeftWidth = 1;
        }
        if(parseInt($(this).css('borderRightWidth'),10)){
          borderLeftWidth = parseInt($(this).css('borderRightWidth'),10);
        } else {
          borderRightWidth = 0;
        }
        paddingAndBorder = parseInt($(this).css('padding-left'),10) + parseInt($(this).css('padding-right'),10) + borderRightWidth +borderLeftWidth;
        elementLeftPosition = elementLeftPosition + parseInt($currentElement.prev().width()) + paddingAndBorder;
        $currentElement = $currentElement.prev();
        }
      if(!elementLeftPosition){
        elementLeftPosition = 0;
      }
      $(this).css('left',parseInt(elementLeftPosition));
      $(this).children('ul').css('display','block');
      var ulWidth = $(this).children('ul').width();
      var topH = 0;
      var flagIsNotFirst;
      $(this).children().children('li').each( function () {//Stroim <li> vtorogo urovnia dlya horizont menu
      $(this).css({
          left: 0,
          top:topH,
          width: ulWidth });
        topH += $(this).height() + parseInt($(this).css('padding-top'),10) + parseInt($(this).css('padding-bottom'),10) ;
          flagIsNotFirst = true;
          });
      $(this).children('ul').css('display','none');
      });
    
    
      
    
    
            },

  amBuildFirstSecondMenuRightBottom: function(){
    $(this).css('position', 'absolute').find('ul').css('position', 'absolute');
    if(amParams.roundedElements == true){
      

      $(this).parent('div > ul').each(function (){
        $(this).prepend("<div class='bg png_fix'>&nbsp;</div>");
        $(this).prepend("<div class='bgBegin png_fix'>&nbsp;</div>");
        $('div.bg').css('top',$('div.bgBegin').height());
        $('div.bgBegin').css('top',0);
        
              

      });
      
    }
    var elementTopPosition = $('div.bgBegin').height() + $('div.bg').height();
    var lastHeight;
    $(this).filter('div > ul > li').each( function (){//Stroim <li> pervogo urovnia dlya verticalnogo menu
      var $currentElement = $(this);
      while($currentElement.prev('li').height()){
        if(parseInt($(this).css('borderTopWidth'),10)){
          borderTopWidth = parseInt($(this).css('borderTopWidth'),10);
        } else {
        borderTopWidth = 0;
        }
        if(parseInt($(this).css('borderBottomWidth'),10)){
          borderBottomWidth = parseInt($(this).css('borderBottomWidth'),10);
        } else {
          borderBottomWidth = 0;
        }
        paddingAndBorder = parseInt($(this).css('padding-top'),10) + parseInt($(this).css('padding-bottom'),10) + borderTopWidth +borderBottomWidth;
        elementTopPosition = elementTopPosition + parseInt($currentElement.prev().height()) + parseInt(paddingAndBorder);
        $currentElement = $currentElement.prev();
        lastHeight = parseInt($(this).height(), 10) + parseInt(paddingAndBorder,10);
        }
      if(!elementTopPosition){
        elementTopPosition = 0;
      }
      $(this).css('top',parseInt(elementTopPosition));
      $(this).children('ul').css('display','block');
      var ulWidth = $(this).children('ul').width();
      $(this).css('width',ulWidth);
      $(this).children('ul').css('display','none');
      });
      
      $(this).parent().parent('div.menuWrap').css('height',elementTopPosition + lastHeight);
      
      if(amParams.roundedElements == true){
      var x;
      $(this).parent('div > ul').each(function (){
        $(this).append("<div class='bg png_fix'>&nbsp;</div>");
        $(this).append("<div class='bgEnd png_fix'>&nbsp;</div>");

        x = elementTopPosition + $(this).children('li:last').height() + parseInt($(this).children('li:last').css('padding-top')) + parseInt($(this).children('li:last').css('padding-bottom'));
      
        $('div.bg:last').css('top',x) ;
      

        $('div.bgEnd').css('top', x + $('div.bg:last').height());


      });

      $(this).parent().parent('div.menuWrap').css('height',x + $('div.bg:last').height() + $('div.bgEnd:last').height());
      
      
      
      }
      
      
  },

            
            amClearCSS: function(animType, roundedElements){
                var $currentThis = $(this);
                $.each(amParams.animation, function(i){
                    $currentThis.css(i, '');
                    $currentThis.css('overflow', '');
                });
                
                if(animType == "outerLeftHover" || animType == "outerTopHover"){
                $(this).css('display','block');
                ulHeight = 0;
                $currentThis.children('li').each(function (){
                ulHeight += parseInt($(this).height()) + parseInt($(this).css('padding-top')) + parseInt($(this).css('padding-bottom')) ; 
                });
                
                if(parseInt($currentThis.parent('li').css('borderTopWidth'),10)){
          borderTopWidth = parseInt($currentThis.parent('li').css('borderTopWidth'),10);
        } else {
        borderTopWidth = 0;
        }
                if(parseInt($currentThis.parent('li').css('borderLeftWidth'),10)){
          borderLeftWidth = parseInt($currentThis.parent('li').css('borderLeftWidth'),10);
        } else {
        borderLeftWidth = 0;
        }

                
                if(animType == 'outerLeftHover' || $(this).is('ul > li > ul > li > ul')){
                ulPositionX = 0 + ( parseInt($currentThis.parent('li').width()) + parseInt($currentThis.parent('li').css('padding-right')) + parseInt($currentThis.parent('li').css('padding-left')) + borderLeftWidth );
                ulPositionY = 0 - borderTopWidth;                
                } else if (animType == 'outerTopHover'){
                ulPositionX = 0;
                ulPositionY = 0 + ( parseInt($currentThis.parent('li').height()) + parseInt($currentThis.parent('li').css('padding-top')) + parseInt($currentThis.parent('li').css('padding-bottom')) );
                                }

              
                ulMainWidth = $(this).children('li:first').width();
                ulPaddingsWidth = parseInt($(this).children('li').css('padding-left')) + parseInt($(this).children('li').css('padding-right'));
    if(animType == 'outerLeftHover' || animType == 'outerTopHover'){
                $(this).css({
                left: ulPositionX,
                top: ulPositionY,
                height: ulHeight,
                paddingLeft:ulPaddingsWidth
                });
                }
                
                if(roundedElements == true){
    $(this).addClass('bg');
    $(this).addClass('png_fix');
                $(this).css('top', 0 - parseInt($(this).css('padding-top'),10));
                var z = parseInt($(this).css('height'), 10) + parseInt($(this).css('padding-top'),10);
                $(this).css('height',z);

                var y = (parseInt($(this).css('padding-top'), 10) + parseInt($(this).css('height'),10)) - 1;

                $(this).append('<div class="bgEnd png_fix">&nbsp;</div>');
                $(this).children('div.bgEnd').css({
                position: 'absolute',
                top: y,
                left:0                
                });
                              
                }
                     
                $(this).css('display','none');    

                }

                $currentThis.animate(amParams.animation, amParams.speed);
                
            }
        });
        
        return this.each(function(){
            $('li', this).hover(function(){
                $(this).addClass(amParams.hoverClass);
            }, function(){
                $(this).removeClass(amParams.hoverClass);
            });
            $('li:has(ul)', this).addClass('am-arrow');
            $(this).animateMenuBind();
            if (amParams.type.substr(0, 5) == 'inner') {
                $('.' + amParams.selectedClass, this).children('ul').show().parents('li').addClass(amParams.selectedClass).parent().show();
            }
        });
    };
})(jQuery)
