(function($) {

  /**********************************
  	methods
  	**********************************/
  var methods = {
    init: function(options) {

      var defaults = {
        containerDiv: 'container',
        scrollDiv: 'scrollDiv',
        direction: 'vertical',
        scrollHitSize: 30,
        offset: 0
      }

      var opts = $.extend(defaults, options);
      var containerDiv = $('#' + opts.containerDiv);
      var scrollDiv = $('#' + opts.scrollDiv);
      var moveTimer = 0;
      var curMouseX = 0;
      var curMouseY = 0;
      var containerHeight = containerDiv.height();
      var scrollPercentage = 0;
      var moveDirection = 'down';
      var scrollSpeed = 0;
      var scrollHitSize = opts.scrollHitSize;
      var offset = opts.offset;
      var curBrowser = navigator.userAgent.toLowerCase();
      var menuBack;
      var isMobile = false;

      if (curBrowser.indexOf('iphone') != -1 || 
					curBrowser.indexOf('ipod') != -1 || 
					curBrowser.indexOf('ipad') != -1 || 
					curBrowser.indexOf('android') != -1 || 
					curBrowser.indexOf('blackBerry') != -1) {
        
				isMobile = true;
      }

      return this.each(function() {
        containerDiv.bind('mouseenter', onContainerOver);
        containerDiv.bind('mouseleave', onContainerOut);
        scrollDiv.css({
          'position': 'absolute',
					'margin-top' : '0px'
        });
        if (isMobile == true && scrollDiv.height() > containerDiv.height()) {
          setDragging();
        } else {
          containerDiv.mousemove(getScrollPosition);
        }
      });

      function setDragging() {
        menuBack = $('<div class="menuBack"></div>');
        containerDiv.prepend(menuBack);
        menuBack.css({
          'width': scrollDiv.width() + 'px',
          'height': (scrollDiv.height() + (scrollDiv.height() - containerDiv.height())) + 'px',
          'position': 'absolute',
          'margin-top': -(scrollDiv.height()) + containerDiv.height() + 'px'
        });
        scrollDiv.draggable({
          containment: menuBack
        }).addTouch();
      }

      function onContainerOver(e) {
        startMoving();
      }

      function onContainerOut(e) {
        stopMoving()
      }

      function startMoving() {
        moveTimer = setInterval(moveScrollDiv, 10);
      }

      function stopMoving() {
        clearInterval(moveTimer);
      }

      function getScrollPosition(e) {
        curMouseX = e.pageX - $(this).offset().left;
        curMouseY = e.pageY - $(this).offset().top;
      }

      function moveScrollDiv() {
        if (opts.direction == 'vertical') {
          scrollPercentage = Math.round((curMouseY / containerHeight) * 100);
          var compS = scrollDiv.css('margin-top');
          var cmt = Number(compS.substr(0, compS.length - 2)); 

				 	if (scrollPercentage >= 0 && scrollPercentage <= scrollHitSize) {
            moveDirection = 'down';
            scrollSpeed = Math.round((scrollHitSize - scrollPercentage) / 5);
          } else if (scrollPercentage >= (100 - scrollHitSize) && scrollPercentage <= 100) {
            moveDirection = 'up';
            scrollSpeed = Math.round((scrollHitSize - (100 - scrollPercentage)) / 5);
          } else {
            scrollSpeed = 0;
          }

          if (moveDirection == 'up') {
            cmt = Number(cmt) - Number(scrollSpeed);
          }
					
					if (moveDirection == 'down') {
            cmt = Number(cmt) + Number(scrollSpeed);
          }

					if (Number(cmt) < (Number(containerHeight) - Number(offset)) - scrollDiv.height()) {
            cmt = (Number(containerHeight) - Number(offset)) - scrollDiv.height();
          }

					if (Number(cmt) > 0) {
            cmt = 0;
          }

          if(isNaN(cmt) == false){
						scrollDiv.css({'margin-top': String(cmt) + 'px'});  
					}
        }
      }
    }
  }

  /**********************************
  	controller
    **********************************/
  $.fn.mouseMoveMenu = function(method) {
    if (methods[method]) {
      return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
    } else if (typeof method === 'object' || !method) {
      return methods.init.apply(this, arguments);
    } else {
      $.error('Method ' + method + ' does not exist on jQuery.tooltip');
    }
  };

})(jQuery);
