/**
* jQuery.smoothDivScroll - Smooth div scrolling using jQuery.
* This plugin is for turning a set of HTML elements's into a smooth scrolling area.
*
* Copyright (c) 2009 Thomas Kahn - thomas.kahn(at)karnhuset(dot)net
*
* This plugin is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This plugin is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details. <http://www.gnu.org/licenses/>.
*
* Date: 2009-07-05
* @author Thomas Kahn
* @version 0.9
*
* Changelog
* ---------------------------------------------
* 0.9	- Bugfixes: Problem with multiple autoscrollers on the same page - the intervals
*		  where global which resulted in the wrong autoscroller stopping on mouseOver or
*		  mouseDown.
*		  Error in calculation in autoscrolling mode that made the autoscrolling grind
*		  to a halt after a number of loops.
*
* 0.8   - Major update. New parameter setup. Lots of new autoscrolling capabilities and 
*		  new parameters for controlling the scrolling speed. Made it possible to start 
*		  the scroller at a specific element.
* 
* 0.7   - Added support for autoscrolling after the page has loaded. 
*         Added support for making the hot spots visible at start for X number of seconds
*         or visible all the time.
*
* 0.6   - First version.
*/

(function(jquery){jQuery.fn.smoothDivScroll=function(options){var defaults={scrollingHotSpotLeft:"div.scrollingHotSpotLeft",scrollingHotSpotRight:"div.scrollingHotSpotRight",scrollWrapper:"div.scrollWrapper",scrollableArea:"div.scrollableArea",hiddenOnStart:false,ajaxContentURL:"",countOnlyClass:"",scrollingSpeed:25,mouseDownSpeedBooster:3,autoScroll:"",autoScrollDirection:"right",autoScrollSpeed:1,pauseAutoScroll:"",visibleHotSpots:"",hotSpotsVisibleTime:5,startAtElementId:""};options=jquery.extend(defaults,options);return this.each(function(){var jquerymom=jquery(this);if(options.ajaxContentURL.length!==0){jquerymom.scrollableAreaWidth=0;jquerymom.find(options.scrollableArea).load((options.ajaxContentURL),function(){jquerymom.find(options.scrollableArea).children((options.countOnlyClass)).each(function(){jquerymom.scrollableAreaWidth=jquerymom.scrollableAreaWidth+jquery(this).outerWidth(true);});jquerymom.find(options.scrollableArea).css("width",(jquerymom.scrollableAreaWidth+"px"));if(options.hiddenOnStart){jquerymom.hide();}
windowIsResized();setHotSpotHeightForIE();});}
var scrollXpos;var booster;var motherElementOffset=jquerymom.offset().left;var hotSpotWidth=0;booster=1;var hasExtended=false;jquery(window).one("load",function(){if(options.ajaxContentURL.length===0){jquerymom.scrollableAreaWidth=0;jquerymom.tempStartingPosition=0;jquerymom.find(options.scrollableArea).children((options.countOnlyClass)).each(function(){if((options.startAtElementId.length!==0)&&((jquery(this).attr("id"))==options.startAtElementId)){jquerymom.tempStartingPosition=jquerymom.scrollableAreaWidth;}
jquerymom.scrollableAreaWidth=jquerymom.scrollableAreaWidth+jquery(this).outerWidth(true);});jquerymom.find(options.scrollableArea).css("width",jquerymom.scrollableAreaWidth+"px");if(options.hiddenOnStart){jquerymom.hide();}}
jquerymom.find(options.scrollWrapper).scrollLeft(jquerymom.tempStartingPosition);if(options.autoScroll!==""){jquerymom.autoScrollInterval=setInterval(autoScroll,6);}
if(options.autoScroll=="always")
{hideLeftHotSpot();hideRightHotSpot();}
switch(options.visibleHotSpots)
{case"always":makeHotSpotBackgroundsVisible();break;case"onstart":makeHotSpotBackgroundsVisible();jquerymom.hideHotSpotBackgroundsInterval=setInterval(hideHotSpotBackgrounds,(options.hotSpotsVisibleTime*1000));break;default:break;}});jquerymom.find(options.scrollingHotSpotRight,options.scrollingHotSpotLeft).one('mouseover',function(){if(options.autoScroll=="onstart"){clearInterval(jquerymom.autoScrollInterval);}});jquery(window).bind("resize",function(){windowIsResized();});function windowIsResized(){if(!(options.hiddenOnStart))
{jquerymom.scrollableAreaWidth=0;jquerymom.find(options.scrollableArea).children((options.countOnlyClass)).each(function(){jquerymom.scrollableAreaWidth=jquerymom.scrollableAreaWidth+jquery(this).outerWidth(true);});jquerymom.find(options.scrollableArea).css("width",jquerymom.scrollableAreaWidth+'px');}
jquerymom.find(options.scrollWrapper).scrollLeft("0");var bodyWidth=jquery("body").innerWidth();if(options.autoScroll!=="always")
{if(jquerymom.scrollableAreaWidth<bodyWidth)
{hideLeftHotSpot();hideRightHotSpot();}
else
{showHideHotSpots();}}}
function hideLeftHotSpot(){jquerymom.find(options.scrollingHotSpotLeft).hide();}
function hideRightHotSpot(){jquerymom.find(options.scrollingHotSpotRight).hide();}
function showLeftHotSpot(){jquerymom.find(options.scrollingHotSpotLeft).show();if(hotSpotWidth<=0){hotSpotWidth=jquerymom.find(options.scrollingHotSpotLeft).width();}}
function showRightHotSpot(){jquerymom.find(options.scrollingHotSpotRight).show();if(hotSpotWidth<=0){hotSpotWidth=jquerymom.find(options.scrollingHotSpotRight).width();}}
function setHotSpotHeightForIE()
{jQuery.each(jQuery.browser,function(i,val){if(i=="msie"&&jQuery.browser.version.substr(0,1)=="6")
{jquerymom.find(options.scrollingHotSpotLeft).css("height",(jquerymom.find(options.scrollableArea).innerHeight()));jquerymom.find(options.scrollingHotSpotRight).css("height",(jquerymom.find(options.scrollableArea).innerHeight()));}});}
jquerymom.find(options.scrollingHotSpotRight).bind('mousemove',function(e){var x=e.pageX-(this.offsetLeft+motherElementOffset);scrollXpos=Math.round((x/hotSpotWidth)*options.scrollingSpeed);if(scrollXpos===Infinity){scrollXpos=0;}});jquerymom.find(options.scrollingHotSpotRight).bind('mouseover',function(){if(options.autoScroll=="onstart"){clearInterval(jquerymom.autoScrollInterval);}
jquerymom.rightScrollInterval=setInterval(doScrollRight,6);});jquerymom.find(options.scrollingHotSpotRight).bind('mouseout',function(){clearInterval(jquerymom.rightScrollInterval);scrollXpos=0;});jquerymom.find(options.scrollingHotSpotRight).bind('mousedown',function(){booster=options.mouseDownSpeedBooster;});jquery("*").bind('mouseup',function(){booster=1;});var doScrollRight=function()
{if(scrollXpos>0){jquerymom.find(options.scrollWrapper).scrollLeft(jquerymom.find(options.scrollWrapper).scrollLeft()+(scrollXpos*booster));}
showHideHotSpots();};if(options.pauseAutoScroll=="mousedown"&&options.autoScroll=="always")
{jquerymom.find(options.scrollWrapper).bind('mousedown',function(){clearInterval(jquerymom.autoScrollInterval);});jquerymom.find(options.scrollWrapper).bind('mouseup',function(){jquerymom.autoScrollInterval=setInterval(autoScroll,6);});}
else if(options.pauseAutoScroll=="mouseover"&&options.autoScroll=="always")
{jquerymom.find(options.scrollWrapper).bind('mouseover',function(){clearInterval(jquerymom.autoScrollInterval);});jquerymom.find(options.scrollWrapper).bind('mouseout',function(){jquerymom.autoScrollInterval=setInterval(autoScroll,6);});}
jquerymom.previousScrollLeft=0;jquerymom.pingPongDirection="right";jquerymom.swapAt;jquerymom.getNextElementWidth=true;var autoScroll=function()
{if(options.autoScroll=="onstart"){showHideHotSpots();}
switch(options.autoScrollDirection)
{case"right":jquerymom.find(options.scrollWrapper).scrollLeft(jquerymom.find(options.scrollWrapper).scrollLeft()+options.autoScrollSpeed);break;case"left":jquerymom.find(options.scrollWrapper).scrollLeft(jquerymom.find(options.scrollWrapper).scrollLeft()-options.autoScrollSpeed);break;case"backandforth":jquerymom.previousScrollLeft=jquerymom.find(options.scrollWrapper).scrollLeft();if(jquerymom.pingPongDirection=="right"){jquerymom.find(options.scrollWrapper).scrollLeft(jquerymom.find(options.scrollWrapper).scrollLeft()+options.autoScrollSpeed);}
else{jquerymom.find(options.scrollWrapper).scrollLeft(jquerymom.find(options.scrollWrapper).scrollLeft()-options.autoScrollSpeed);}
if(jquerymom.previousScrollLeft===jquerymom.find(options.scrollWrapper).scrollLeft())
{if(jquerymom.pingPongDirection=="right"){jquerymom.pingPongDirection="left";}
else{jquerymom.pingPongDirection="right";}}
break;case"endlessloop":if(jquerymom.getNextElementWidth)
{if(options.startAtElementId!==""){jquerymom.swapAt=jquery("#"+options.startAtElementId).outerWidth();}
else{jquerymom.swapAt=jquerymom.find(options.scrollableArea).children(":first-child").outerWidth();}
jquerymom.getNextElementWidth=false;}
jquerymom.find(options.scrollWrapper).scrollLeft(jquerymom.find(options.scrollWrapper).scrollLeft()+options.autoScrollSpeed);if((jquerymom.swapAt<=jquerymom.find(options.scrollWrapper).scrollLeft()))
{jquerymom.find(options.scrollableArea).append(jquerymom.find(options.scrollableArea).children(":first-child").clone());jquerymom.find(options.scrollWrapper).scrollLeft((jquerymom.find(options.scrollWrapper).scrollLeft()-jquerymom.find(options.scrollableArea).children(":first-child").outerWidth()));jquerymom.find(options.scrollableArea).children(":first-child").remove();jquerymom.getNextElementWidth=true;}
break;default:break;}};jquerymom.find(options.scrollingHotSpotLeft).bind('mousemove',function(e){var x=jquerymom.find(options.scrollingHotSpotLeft).innerWidth()-(e.pageX-motherElementOffset);scrollXpos=Math.round((x/hotSpotWidth)*options.scrollingSpeed);if(scrollXpos===Infinity)
{scrollXpos=0;}});jquerymom.find(options.scrollingHotSpotLeft).bind('mouseover',function(){if(options.autoScroll=="onstart"){clearInterval(jquerymom.autoScrollInterval);}
jquerymom.leftScrollInterval=setInterval(doScrollLeft,6);});jquerymom.find(options.scrollingHotSpotLeft).bind('mouseout',function(){clearInterval(jquerymom.leftScrollInterval);scrollXpos=0;});jquerymom.find(options.scrollingHotSpotLeft).bind('mousedown',function(){booster=options.mouseDownSpeedBooster;});var doScrollLeft=function()
{if(scrollXpos>0){jquerymom.find(options.scrollWrapper).scrollLeft(jquerymom.find(options.scrollWrapper).scrollLeft()-(scrollXpos*booster));}
showHideHotSpots();};function showHideHotSpots()
{if(jquerymom.find(options.scrollWrapper).scrollLeft()===0)
{hideLeftHotSpot();showRightHotSpot();}
else if((jquerymom.scrollableAreaWidth)<=(jquerymom.find(options.scrollWrapper).innerWidth()+jquerymom.find(options.scrollWrapper).scrollLeft()))
{hideRightHotSpot();showLeftHotSpot();}
else
{showRightHotSpot();showLeftHotSpot();}}
function makeHotSpotBackgroundsVisible()
{jquerymom.find(options.scrollingHotSpotLeft).addClass("scrollingHotSpotLeftVisible");jquerymom.find(options.scrollingHotSpotRight).addClass("scrollingHotSpotRightVisible");}
function hideHotSpotBackgrounds()
{clearInterval(jquerymom.hideHotSpotBackgroundsInterval);jquerymom.find(options.scrollingHotSpotLeft).fadeTo("slow",0.0,function(){jquerymom.find(options.scrollingHotSpotLeft).removeClass("scrollingHotSpotLeftVisible");});jquerymom.find(options.scrollingHotSpotRight).fadeTo("slow",0.0,function(){jquerymom.find(options.scrollingHotSpotRight).removeClass("scrollingHotSpotRightVisible");});}});};})(jQuery);
