(function($){$.fn.hoverscroll=function(params){if(!params){params={}}
params=$.extend({},$.fn.hoverscroll.params,params);this.each(function(){var $this=$(this);if(params.debug){$.log('[HoverScroll] Trying to create hoverscroll on element '+this.tagName+'#'+this.id)}
$this.wrap('<div class="listcontainer"></div>');$this.addClass('list');var listctnr=$this.parent();listctnr.wrap('<div class="ui-widget-content hoverscroll"></div>');
var ctnr=listctnr.parent();if(params.arrows){if(!params.vertical){listctnr.append('<div class="arrow left"></div>').append('<div class="arrow right"></div>')}else
{listctnr.append('<div class="arrow top"></div>').append('<div class="arrow bottom"></div>')}}ctnr.width(params.width).height(params.height);
listctnr.width(params.width).height(params.height);var size=0;if(!params.vertical){ctnr.addClass('horizontal');$this.children().each(function(){$(this).addClass('item');
if($(this).outerWidth){size+=$(this).outerWidth(true)}else{size+=$(this).width()+parseInt($(this).css('padding-left'))+parseInt($(this).css('padding-right'))+parseInt(
$(this).css('margin-left'))+parseInt($(this).css('margin-right'))}});$this.width(size);if(params.debug){$.log('[HoverScroll] Computed content width : '+size+'px')}
if(ctnr.outerWidth){size=ctnr.outerWidth()}else{size=ctnr.width()+parseInt(ctnr.css('padding-left'))+parseInt(ctnr.css('padding-right'))+parseInt(ctnr.css('margin-left'))+
parseInt(ctnr.css('margin-right'))}if(params.debug){$.log('[HoverScroll] Computed container width : '+size+'px')}}else{ctnr.addClass('vertical');$this.children().each(function(){
$(this).addClass('item');
if($(this).outerHeight){size+=$(this).outerHeight(true)}
else{size+=$(this).height()+parseInt($(this).css('padding-top'))+parseInt($(this).css('padding-bottom'))+
parseInt($(this).css('margin-bottom'))+parseInt($(this).css('margin-bottom'))}});$this.height(size);if(params.debug){$.log('[HoverScroll] Computed content height : '+size+'px')}
if(ctnr.outerHeight){size=ctnr.outerHeight()}else{size=ctnr.height()+parseInt(ctnr.css('padding-top'))+parseInt(ctnr.css('padding-bottom'))+parseInt(ctnr.css('margin-top'))+
parseInt(ctnr.css('margin-bottom'))}if(params.debug){$.log('[HoverScroll] Computed container height : '+size+'px');}}
var zone={1:{action:'move',from:0,to:0.06*size,direction:-1,speed:16},2:{action:'move',from:0.06*size,to:0.15*size,direction:-1,speed:8},3:{action:'move',from:0.15*size,to:0.25*size,direction:-1,speed:4},4:{action:'move',from:0.25*size,to:0.4*size,direction:-1,speed:2},5:{action:'stop',from:0.4*size,to:0.6*size},6:{action:'move',from:0.6*size,to:0.75*size,direction:1,speed:2},7:{action:'move',from:0.75*size,to:0.85*size,direction:1,speed:4},8:{action:'move',from:0.85*size,to:0.94*size,direction:1,speed:8},9:{action:'move',from:0.94*size,to:size,direction:1,speed:16}}
ctnr[0].isChanging=false;ctnr[0].direction=0;ctnr[0].speed=1;
function checkMouse(x,y){x=x-ctnr.offset().left;y=y-ctnr.offset().top;var pos;if(!params.vertical){pos=x}else{pos=y}for(i in zone){
if(pos>=zone[i].from&&pos<zone[i].to){if(zone[i].action=='move'){startMoving(zone[i].direction,zone[i].speed)}else{stopMoving()}}}}
function setArrowOpacity(){if(!params.arrows){return}var maxScroll;var scroll;if(!params.vertical){maxScroll=listctnr[0].scrollWidth-listctnr.width();scroll=listctnr[0].scrollLeft}else
{maxScroll=listctnr[0].scrollHeight-listctnr.height();scroll=listctnr[0].scrollTop}var opacity=(scroll/maxScroll);var limit=params.arrowsOpacity;if(isNaN(opacity)){opacity=0}
var done=false;if(opacity<=0){$('div.arrow.left, div.arrow.top',ctnr).hide();done=true}if(opacity>=limit||maxScroll<=0){$('div.arrow.right, div.arrow.bottom',ctnr).hide();done=true}
if(!done){$('div.arrow.left, div.arrow.top',ctnr).show().css('opacity',(opacity>limit?limit:opacity));$('div.arrow.right, div.arrow.bottom',ctnr).show().css('opacity',(1-opacity>limit?limit:1-opacity))}}
function startMoving(direction,speed){if(ctnr[0].direction!=direction){if(params.debug){$.log('[HoverScroll] Starting to move. direction: '+direction+', speed: '+speed)}stopMoving();ctnr[0].direction=direction;ctnr[0].isChanging=true;move()}
if(ctnr[0].speed!=speed){if(params.debug){$.log('[HoverScroll] Changed speed: '+speed)}ctnr[0].speed=speed}}function stopMoving(){if(ctnr[0].isChanging){if(params.debug){$.log('[HoverScroll] Stoped moving')}ctnr[0].isChanging=false;ctnr[0].direction=0;ctnr[0].speed=1;clearTimeout(ctnr[0].timer)}}function move(){if(ctnr[0].isChanging==false){return}setArrowOpacity();var scrollSide;
if(!params.vertical){scrollSide='scrollLeft'}else{scrollSide='scrollTop'}listctnr[0][scrollSide]+=ctnr[0].direction*ctnr[0].speed;ctnr[0].timer=setTimeout(function(){move()},50)}ctnr.mousemove(function(e){checkMouse(e.pageX,e.pageY)}).bind('mouseleave',function(){stopMoving()});
if(params.arrows){setArrowOpacity()}else{$('.arrowleft, .arrowright, .arrowtop, .arrowbottom',ctnr).hide()}});return this};if(!$.fn.offset){
$.fn.offset=function(){this.left=this.top=0;if(this[0]&&this[0].offsetParent){var obj=this[0];do{this.left+=obj.offsetLeft;this.top+=obj.offsetTop}while(obj=obj.offsetParent)}return this}}
$.fn.hoverscroll.params={vertical:false,width:400,height:50,arrows:true,arrowsOpacity:0.7,debug:false};$.log=function(msg){if(console&&console.log){console.log(msg)}}})(jQuery);
