(function($){$.fn.hoverscroll=function(params){if(!params){params={};}
params=$.extend({vertical:$.fn.hoverscroll.params.vertical,width:$.fn.hoverscroll.params.width,height:$.fn.hoverscroll.params.height,arrows:$.fn.hoverscroll.params.arrows,arrowsOpacity:$.fn.hoverscroll.params.arrowsOpacity,debug:$.fn.hoverscroll.params.debug},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').addClass('ui-helper-clearfix');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="arrowleft"></div>').append('<div class="arrowright"></div>')}
else{listctnr.append('<div class="arrowtop"></div>').append('<div class="arrowbottom"></div>')}}
ctnr.width(params.width).height(params.height);listctnr.width(params.width).height(params.height);var size=0;if(!params.vertical){$this.children().each(function(){$(this).addClass('horizontal-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{$this.children().each(function(){$(this).addClass('vertical-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;}
if(opacity<=0){$('.arrowleft, .arrowtop',ctnr).hide();}
else if(opacity>=limit){$('.arrowright, .arrowbottom',ctnr).hide();}
else{$('.arrowleft, .arrowtop',ctnr).show().css('opacity',(opacity>limit?limit:opacity));$('.arrowright, .arrowbottom',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;};$.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);
