
/*
 * Copyright (c) 2008 Threeformed Media (http://www.threeformed.com)
 * This is licensed under GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 * 
 * 
 * *******
 * 
 * This plugin is derived in part from JScrollPane created by Kevin Luck(http://www.kelvinluck.com)
 * 
 * Copyright (c) 2006 Kelvin Luck (kelvin AT kelvinluck DOT com || http://www.kelvinluck.com)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) 
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 * 
 * See http://kelvinluck.com/assets/jquery/jScrollPane/
 * $Id: jScrollPane.js 3125 2007-09-06 20:39:42Z kelvin.luck $
 */

/**
 * Replace the default horizontal scroll bars on matched 
 * elements with a CSS styled veresion. Very similar to the JScrollPane 
 * which does vertical scrolling, 2 features in particular have been added. 
 * 
 * 1) Intervals
 * 2) Resizing
 * 
 * 1) Intervals can be added by attaching a class type of "scroll-interval" to any 
 * element wrapped within the jscrollhorizontalpane context. This provides
 * the following abilitiies: 
 * a) When dragging, it will snap to the closest element on release of dragger.
 * b) Mousewheel motions jump between intervals
 * c) Notches appear by default on the scrollbar, but can be overriden by css.
 * 
 * 2) Resizing Also occurs. When turned on, all widths are dealt in percentages, so on a 
 * screen refresh, the scroller will resize itself based on it's initial percentage.
 * There are a ton of different circumstances that need to be accounted for, and i'm sure 
 * it's not meeting some people's expected behaviour so let me know about any problems or 
 * feature requests for that! The resizing is done through the WResize plugin.
 * 
 *
 * @example jQuery(".scroll-pane").jScrollHorizontalPane();
 *
 * @name jScrollHorizontalPane
 * @type jQuery
 * @param Object settings hash with options, described below.
 * scrollbarHeight - The height of the generated scrollbar in pixels
 * scrollbarMargin - The amount of space to leave on the side of the scrollbar in pixels
 * wheelSpeed - The speed the pane will scroll in response to the mouse wheel in pixels
 * showArrows - Whether to display arrows for the user to scroll with
 * arrowSize - The height of the arrow buttons if showArrows=true
 * animateTo - Whether to animate when calling scrollTo and scrollBy
 * dragMinWidth - The minimum width to allow the drag bar to be
 * dragMaxWidth - The maximum width to allow the drag bar to be
 * animateInterval - The interval in milliseconds to update an animating scrollHorizontalPane (default 100)
 * animateStep - The amount to divide the remaining scroll distance by when animating (default 3)
 * maintainPosition- Whether you want the contents of the scroll pane to maintain it's position when you re-initialise it - so it doesn't scroll as you add more content (default true)
 * resize - Whether or not to have resizing turned on or not.
 * minimumWidth - The minimum width to allow the jScrollHorizontalPane to be resized to. Only effective when resize is on.
 * reset - When set to 'true' all the global properties will be reset. This is useful for dynamic refreshes on the page.
 * @return jQuery
 * @cat Plugins/jScrollHorizontalPane
 * @author Threeformed Media ( www.threeformed.com, info@threeformed.com )
 * @version 1.0.0
 */
var _jscr_originalSizes = new Array();
var _jscr_differenceSizes = new Array();
var _jscr_previousWindowSize = new Array();
var _jscr_originalPercentages = new Array();
var _jscr_intervals = new Array();
var _jscr_trackInt = new Array();
var _jscr_originalPos = new Array();
var _jscr_globalProperties = new Array();

jQuery.jScrollHorizontalPane = {
 active : []
};

( function( $ ) {
jQuery.fn.jScrollHorizontalPane = function(settings)
{
 settings = jQuery.extend(
 {
 scrollbarHeight : 10,
 scrollbarMargin : 5,
 wheelSpeed : 18,
 showArrows : false,
 arrowSize : 10,
 animateTo : false,
 dragMinWidth : 1,
 dragMaxWidth : 99999,
 animateInterval : 100,
 animateStep: 3,
 maintainPosition: true, 
 resize: true,
 minimumWidth: 200,
 reset: false
 }, settings
 );
 
 return this.each(
 function()
 {
 if(settings.reset == true) {
 jQuery.fn.jScrollHorizontalPane.reset();
 }
 
 //This holds each one of the intervals, defaulting with one at the beginning.
 var $this = jQuery(this); 
 var mouseWheelNext = 0;
 var mouseWheelMove = false;
 var currentId = $this.attr('id');
 
 if(currentId == undefined) {
 currentId = $this.attr('class');
 }
 
 var previousWindow = _jscr_previousWindowSize[currentId];
 _jscr_originalPos[currentId] = -1;
 _jscr_globalProperties[currentId] = settings;
 _jscr_previousWindowSize[currentId] = $(window).width();

 //On initial load, set values needed for percentage resizing.
 if(_jscr_originalSizes[currentId] == undefined) { 

 //ie6 hack, since jquery width doesnt get the right value on an inproper refresh
 if((jQuery.browser.msie) && (parseInt(jQuery.browser.version) == 6)) {
 var outerWidth = parseInt($this.outerWidth()) - parseInt($this.offset().left);
 _jscr_differenceSizes[currentId] = $this.offset().left / $(window).width();
 } else {
 var outerWidth = $this.outerWidth();
 _jscr_differenceSizes[currentId] = $this.position().left / $(window).width();
 }

 percentageWidth = (outerWidth / $(window).width()); 
 _jscr_originalPercentages[currentId] = percentageWidth;
 _jscr_originalSizes[currentId] = $(window).width();
 } else { 
 percentageWidth = _jscr_originalPercentages[currentId];
 diff = _jscr_differenceSizes[currentId] - (($this.offset().left + _jscr_originalPos[currentId])/ $(window).width());
 percentageWidth = percentageWidth + diff;
 }

 var halfIntervals = new Array();
 _jscr_intervals = new Array();
 halfIntervals[0] = 0;
 _jscr_intervals[0] = 0;
 margin = $this.position().left;
 offset = 1;
 
 if(margin < 0) {
 margin = 0;
 }
 
 //Handles interval code
 $(".scroll-interval", $this).each(
 function(i, elem) {
 pos = $(elem).position().left - margin;
 if(pos != 0) {
 _jscr_intervals[i+offset] = pos;
 } else { 
 offset--;
 }
 }
 );
 
 if(_jscr_intervals.length <= 1) { 
 _jscr_intervals = new Array();
 }

 if (jQuery(this).parent().is('.jScrollPaneContainer')) {
 var currentScrollPosition = settings.maintainPosition ? $this.offset({relativeTo:jQuery(this).parent()[0]}).left : 0;
 var $c = jQuery(this).parent();
 var paneWidth = $c.outerWidth();
 var paneHeight = $c.innerHeight();
 var rightPos = $this.offset().left + _jscr_originalPos[currentId] + paneWidth;
 
 if((previousWindow != $(window).width()) && ((rightPos > $(window).width()) || (previousWindow < $(window).width())) && (settings.resize == true)) {

 if($(window).width() >= _jscr_originalSizes[currentId]) {
 paneWidth = ($(window).width() * percentageWidth);
 } else {
 //Give the outside edge a 10 px buffer margin
 paneWidth = $(window).width() - ($this.offset().left + _jscr_originalPos[currentId]) - 10;
 }

 if(paneWidth < settings.minimumWidth){
 paneWidth = settings.minimumWidth;
 }

 jQuery(this).parent().css(
 { 
 'height':paneHeight+'px', 
 'width': paneWidth + 'px'
 }
 );
 }
 
 var trackWidth = paneWidth;

 if($c.unmousewheel) {
 
 if($.browser.opera) {
 $c.unbind("mousewheel", fn = function() { }); 
 } else {
 $c.unmousewheel();
 } 
 }

 jQuery('>.jScrollPaneTrack, >.jScrollArrowLeft, >.jScrollArrowRight', $c).remove();
 $this.css({'left':0});
 _jscr_originalPos[currentId] = -1;
 } else {
 var currentScrollPosition = 0;
 this.originalPadding = $this.css('paddingTop') + ' ' + $this.css('paddingRight') + ' ' + $this.css('paddingBottom') + ' ' + $this.css('paddingLeft');
 this.originalSidePaddingTotal = (parseInt($this.css('paddingLeft')) || 0) + (parseInt($this.css('paddingRight')) || 0);
 var paneWidth = $this.outerWidth();
 var rightPos = $this.offset().left + _jscr_originalPos[currentId] + paneWidth;

 if((rightPos) > $(window).width()) { 
 paneWidth = $(window).width() * percentageWidth; 
 }
 
 if(paneWidth < settings.minimumWidth){
 paneWidth = settings.minimumWidth;
 }
 
 var paneHeight = $this.innerHeight();
 var trackWidth = paneWidth;
 
 $this.wrap(
 jQuery('<div></div>').attr(
 {'className':'jScrollPaneContainer'}
 ).css(
 {
 'height':paneHeight+'px', 
 'width':paneWidth+'px'
 }
 )
 );
 // deal with text size changes (if the jquery.em plugin is included)
 // and re-initialise the scrollPane so the track maintains the
 // correct size
 jQuery(document).bind(
 'emchange', 
 function(e, cur, prev)
 {
 $this.jScrollHorizontalPane(settings);
 }
 );
 }
 var p = this.originalSidePaddingTotal;
 
 $this.css(
 {
 'height': paneHeight - settings.scrollbarHeight - p + 'px',
 'width': 'auto',
 'paddingRight':settings.scrollbarMargin + 'px'
 }
 );

 var contentWidth = $this.outerWidth();

 //ie6 and 7, outside width does not always guarantee the full size of the div
 //is returned for outerWidth
 if($.browser.msie || $.browser.opera || $.browser.safari) {
 var ieWidth = 0;
 $this.children().each(function(i, elem) { if($(elem).outerWidth() > ieWidth) { ieWidth = $(elem).outerWidth();}});
 if(ieWidth > contentWidth) {
 contentWidth = ieWidth;
 } 
 }

 var percentInView = paneWidth / contentWidth;
 var trackIntervals = new Array();

 if (percentInView < 0.99) {
 var $container = $this.parent();

 $container.append(
 jQuery('<div></div>').attr({'className':'jScrollPaneTrack'}).css({'height':settings.scrollbarHeight+'px'}).append(
 jQuery('<div></div>').attr({'className':'jScrollPaneDrag'}).css({'height':settings.scrollbarHeight+'px'}).append(
 jQuery('<div></div>').attr({'className':'jScrollPaneDragLeft'}).css({'height':settings.scrollbarHeight+'px'}),
 jQuery('<div></div>').attr({'className':'jScrollPaneDragRight'}).css({'height':settings.scrollbarHeight+'px'})
 )
 )
 );
 
 var $track = jQuery('>.jScrollPaneTrack', $container);
 
 //Attach the intervals to the track
 for(inter in _jscr_intervals) { 
 
 if(settings.showArrows == true) { 
 scrollOffset = settings.arrowSize;
 } else { 
 scrollOffset = 0;
 }

 intervalTrackPos = _jscr_intervals[inter] / contentWidth * $track.width() - (scrollOffset);
 trackIntervals[inter] = intervalTrackPos;
 
 if(trackIntervals[inter - 1] != undefined) {
 halfIntervals[inter-1] = (trackIntervals[inter] + trackIntervals[inter-1]) / 2;
 }
 
 // if(inter != 0) { 
 // interObj = jQuery('<div>|</div>').attr({'className':'jScrollIntervalTrack'}).css({'left':intervalTrackPos + 'px'})
 // $track.append(interObj);
 // }
 }

 var $drag = jQuery('>.jScrollPaneTrack .jScrollPaneDrag', $container);
 
 if (settings.showArrows) {
 
 var currentArrowButton;
 var currentArrowDirection;
 var currentArrowInterval;
 var currentArrowInc;
 var whileArrowButtonDown = function()
 {
 if (currentArrowInc > 4 || currentArrowInc%4==0) {
 positionDrag(dragPosition + currentArrowDirection * mouseWheelMultiplier);
 }
 currentArrowInc ++;
 };
 var onArrowMouseUp = function(event)
 {
 jQuery('body').unbind('mouseup', onArrowMouseUp);
 currentArrowButton.removeClass('jScrollActiveArrowButton');
 clearInterval(currentArrowInterval);
 arrowUp = true;
 moveIntervals();
 };
 var onArrowMouseDown = function() {
 jQuery('body').bind('mouseup', onArrowMouseUp);
 currentArrowButton.addClass('jScrollActiveArrowButton');
 currentArrowInc = 0;
 whileArrowButtonDown();
 currentArrowInterval = setInterval(whileArrowButtonDown, 100);
 };
 $container
 .append(
 jQuery('<a></a>')
 .attr({'href':'javascript:;', 'className':'jScrollArrowLeft'})
 .css({'width':settings.arrowSize+'px'})
 .html('Scroll Left')
 .bind('mousedown', function()
 {
 currentArrowButton = jQuery(this);
 currentArrowDirection = -1;
 onArrowMouseDown();
 this.blur();
 return false;
 }),
 jQuery('<a></a>')
 .attr({'href':'javascript:;', 'className':'jScrollArrowRight'})
 .css({'width':settings.arrowSize+'px'})
 .html('Scroll Right')
 .bind('mousedown', function()
 {
 currentArrowButton = jQuery(this);
 currentArrowDirection = 1;
 onArrowMouseDown();
 this.blur();
 return false;
 })
 );
 if (settings.arrowSize) {
 trackWidth = paneWidth - settings.arrowSize - settings.arrowSize;
 $track
 .css({'width': trackWidth+'px', left:settings.arrowSize+'px'})
 } else {
 var leftArrowWidth = jQuery('>.jScrollArrowLeft', $container).width();
 settings.arrowSize = leftArrowWidth;
 trackWidth = paneWidth - leftArrowWidth - jQuery('>.jScrollArrowRight', $container).width();
 $track
 .css({'width': trackWidth +'px', left: leftArrowWidth+'px'})
 }
 }
 
 var $pane = jQuery(this).css({'position':'absolute', 'overflow':'visible'});
 
 var currentOffset;
 var maxX;
 var mouseWheelMultiplier;
 
 // store this in a seperate variable so we can keep track more accurately than just updating the css property..
 var dragPosition = 0;
 var dragMiddle = percentInView*paneWidth/2;
 
 // pos function borrowed from tooltip plugin and adapted...
 var getPos = function (event, c) {
 var p = c == 'X' ? 'Left' : 'Bottom';
 return event['page' + c] || (event['client' + c] + (document.documentElement['scroll' + p] || document.body['scroll' + p])) || 0;
 };
 
 var ignoreNativeDrag = function() { return false; };
 var currentInterval = 0;
 var direction = 1;
 var arrowUp = false;
 var intervalMove = false;
 _jscr_trackInt[currentId] = -1;;
 
 var initDrag = function()
 {
 ceaseAnimation();
 currentOffset = $drag.offset(false);
 currentOffset.left -= dragPosition;
 maxX = trackWidth - $drag[0].offsetWidth;
 mouseWheelMultiplier = 2 * settings.wheelSpeed * maxX / contentWidth;
 };
 
 var onStartDrag = function(event)
 {
 initDrag();
 dragMiddle = getPos(event, 'X') - dragPosition - currentOffset.left;
 jQuery('body').bind('mouseup', onStopDrag).bind('mousemove', updateScroll);
 if (jQuery.browser.msie) {
 jQuery('body').bind('dragstart', ignoreNativeDrag).bind('selectstart', ignoreNativeDrag);
 }
 return false;
 };
 var onStopDrag = function()
 {
 jQuery('body').unbind('mouseup', onStopDrag).unbind('mousemove', updateScroll);
 dragMiddle = percentInView*paneWidth/2;
 moveIntervals();
 
 if (jQuery.browser.msie) {
 jQuery('body').unbind('dragstart', ignoreNativeDrag).unbind('selectstart', ignoreNativeDrag);
 }
 };
 var positionDrag = function(destX)
 {
 //Figure out if we need to adjust because of intervals.
 evaluateIntervals(dragPosition, destX);
 destX = destX < 0 ? 0 : (destX > maxX ? maxX : destX);
 dragPosition = destX;

 $drag.css({'left':destX +'px'});
 var p = destX / maxX;
 _jscr_originalPos[currentId] = (paneWidth-contentWidth) * p * -1;
 $pane.css({'left':((paneWidth-contentWidth)*p) + 'px'});
 $this.trigger('scroll');
 };
 
 var updateScroll = function(e)
 {
 positionDrag(getPos(e, 'X') - currentOffset.left - dragMiddle);
 };
 
 var evaluateIntervals = function(position, destX) { 
 
 if((intervalMove == false) && (mouseWheelMove != true)) { 
 _jscr_trackInt[currentId] = -1;
 halfInter = -1;
 
 smallInter = -1;
 bigInter = -1;
 
 endDragPos = destX + $drag.width();
 fullTrackWidth = $('.jScrollPaneTrack').width();

 for(inter in trackIntervals) { 
 if((endDragPos >= fullTrackWidth) && (endDragPos >= trackIntervals[inter])) {
 _jscr_trackInt[currentId] = inter;
 } else if(destX >= trackIntervals[inter]) {
 smallInter = inter;
 } else { 
 bigInter = inter;
 break;
 }
 
 }

 if(_jscr_trackInt[currentId] == -1) {
 smallDistance = destX - trackIntervals[smallInter];
 largeDistance = trackIntervals[bigInter] - destX;
 
 if(smallDistance <= largeDistance) {
 _jscr_trackInt[currentId] = smallInter;
 } else { 
 _jscr_trackInt[currentId] = bigInter;
 }
 }
 } else { 
 intervalMove = false;
 }
 
 }
 
 var moveIntervals = function() { 
 if(_jscr_trackInt[currentId] != -1) { 
 //Catching arrow clicks
 if(arrowUp == true) { 
 if((direction == -1) && (_jscr_trackInt[currentId] != 0)) { 
 _jscr_trackInt[currentId] = currentInterval - 1;
 } else if((direction == 1) && (_jscr_trackInt[currentId] != (_jscr_intervals.length -1))) {
 _jscr_trackInt[currentId] = parseInt(currentInterval) + 1;
 }
 arrowUp = false;
 } 
 
 intervalMove = true;
 positionDrag(trackIntervals[_jscr_trackInt[currentId]]);
 currentInterval = _jscr_trackInt[currentId];
 }
 }
 
 var arrowSize = 0;
 
 if(settings.showArrows == true) {
 arrowSize = settings.arrowSize;
 } 
 
 var dragH = Math.max(Math.min(percentInView*(paneWidth-arrowSize*2), settings.dragMaxWidth), settings.dragMinWidth);
 
 $drag.css(
 {'width':dragH+'px'}
 ).bind('mousedown', onStartDrag);
 
 var trackScrollInterval;
 var trackScrollInc;
 var trackScrollMousePos;
 var doTrackScroll = function()
 {
 if (trackScrollInc > 8 || trackScrollInc%4==0) {
 positionDrag((dragPosition - ((dragPosition - trackScrollMousePos) / 2)));
 }
 trackScrollInc ++;
 };
 var onStopTrackClick = function()
 {
 clearInterval(trackScrollInterval);
 moveIntervals();
 jQuery('body').unbind('mouseup', onStopTrackClick).unbind('mousemove', onTrackMouseMove);
 };
 var onTrackMouseMove = function(event)
 {
 trackScrollMousePos = getPos(event, 'X') - currentOffset.left - dragMiddle;
 };
 var onTrackClick = function(event)
 {
 initDrag();
 onTrackMouseMove(event);
 trackScrollInc = 0;
 jQuery('body').bind('mouseup', onStopTrackClick).bind('mousemove', onTrackMouseMove);
 trackScrollInterval = setInterval(doTrackScroll, 100);
 doTrackScroll();
 };
 
 $track.bind('mousedown', onTrackClick);
 
 // if the mousewheel plugin has been included then also react to the mousewheel
 if ($container.mousewheel) {

 $container.mousewheel (
 function (event, delta) {
 var movePos = -1;
 
 if($.browser.opera) {
 delta = event.wheelDelta / 120; 
 }

 //The following handles intervals with the mouse wheel
 if(trackIntervals.length > 1) {
 mouseWheelMove = true;
 
 //increase or decrease the interval we are currently on, depending
 //on the direction of the mouse wheel
 if(delta < 0) {
 _jscr_trackInt[currentId] = parseInt(_jscr_trackInt[currentId]) + 1;

 if((_jscr_trackInt[currentId]) >= trackIntervals.length - 1) {
 _jscr_trackInt[currentId] = trackIntervals.length - 1;
 }
 
 //If the next interval is beyond the dragWidth then recalculate.
 if((parseInt($drag.width())+ parseInt(trackIntervals[_jscr_trackInt[currentId]])) > parseInt($('.jScrollPaneTrack').width())) {
 movePos = parseInt($('.jScrollPaneTrack').width()) - $drag.width();
 }
 
 } else { 
 _jscr_trackInt[currentId] = parseInt(_jscr_trackInt[currentId]) - 1;
 if(_jscr_trackInt[currentId] < 0) {
 _jscr_trackInt[currentId] = 0;
 }
 }
 }

 initDrag();
 ceaseAnimation();
 var d = dragPosition;
 
 //when intervals are in use, mouseWheelMove is set to true
 if(mouseWheelMove == true) {
 if(movePos == -1) {
 positionDrag(trackIntervals[_jscr_trackInt[currentId]]);
 } else {
 positionDrag(movePos);
 }
 } else {
 positionDrag(dragPosition - delta * mouseWheelMultiplier);
 }
 
 moveIntervals();
 var dragOccured = d != dragPosition;
 mouseWheelMove = false;
 return !dragOccured;
 },
 false
 ); 
 }
 var _animateToPosition;
 var _animateToInterval;
 function animateToPosition()
 {

 var diff = (_animateToPosition - dragPosition) / settings.animateStep;
 
 if ((diff > 1 || diff < -1) && ((dragPosition + diff + $drag.width()) < (paneWidth))) {
 positionDrag(dragPosition + diff);
 } else {
 positionDrag(_animateToPosition);
 ceaseAnimation();
 }
 }
 var ceaseAnimation = function()
 {
 if (_animateToInterval) {
 clearInterval(_animateToInterval);
 delete _animateToPosition;
 }
 };
 var scrollTo = function(pos, preventAni)
 {
 if (typeof pos == "string") {
 $e = jQuery(pos, this);

 if (!$e.length) return;
 pos = $e.position().left;
 }

 ceaseAnimation();
 var destDragPosition = -pos/(paneWidth-contentWidth) * maxX;
 if (!preventAni || settings.animateTo) {
 _animateToPosition = destDragPosition;
 _animateToInterval = setInterval(animateToPosition, settings.animateInterval);
 
 } else {
 positionDrag(destDragPosition);
 } 
 };
 $this[0].scrollTo = scrollTo;
 
 $this[0].scrollBy = function(delta)
 {
 var currentPos = -parseInt($pane.css('left')) || 0;
 scrollTo(currentPos + delta);
 };
 
 initDrag();
 
 scrollTo(-currentScrollPosition, true);
 
 jQuery.jScrollHorizontalPane.active.push($this[0]);

 } else {
 var scrollTo = function(pos, preventAni) {}
 $this[0].scrollTo = scrollTo;
 
 $this.css(
 {
 'height':paneHeight-this.originalSidePaddingTotal+'px',
 'width': paneWidth+'px',
 'padding':this.originalPadding
 }
 );
 // remove from active list?
 }
 
 }
 )
};})(jQuery)

jQuery.fn.jScrollHorizontalPane.reset = function() {
 _jscr_originalSizes = new Array();
 _jscr_differenceSizes = new Array();
 _jscr_previousWindowSize = new Array();
 _jscr_originalPercentages = new Array();
 _jscr_intervals = new Array();
 _jscr_trackInt = new Array();
 _jscr_originalPos = new Array();
 _jscr_globalProperties = new Array();
}

// clean up the scrollTo expandos
jQuery(window)
 .bind('unload', function() {
 var els = jQuery.jScrollHorizontalPane.active; 
 for (var i=0; i<els.length; i++) {
 els[i].scrollTo = els[i].scrollBy = null;
 }
 }
);
jQuery(function() {
 jQuery('.scroll-pane').jScrollHorizontalPane({scrollbarHeight:11, scrollbarMargin:0});
 // this initialises the demo scollpanes on the page.
 // jQuery('#weber-pane').jScrollHorizontalPane({showArrows:true});

});
 
 
/* 
=============================================================================== 
WResize is the jQuery plugin for fixing the IE window resize bug 
............................................................................... 
 Copyright 2007 / Andrea Ercolino 
------------------------------------------------------------------------------- 
LICENSE: http://www.opensource.org/licenses/mit-license.php 
WEBSITE: http://noteslog.com/ 

------------------------------------------------------------------------------- 
USAGE: (div is automatically resized when the window is resized)
------------------------------------------------------------------------------- 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" style="overflow:hidden;"> 
<head> 
<title> test window resize </title> 
 
<script type="text/javascript" src="http://jquery.com/src/jquery-latest.pack.js"></script> 
<script type="text/javascript" src="jquery.wresize.js"></script> 
 
 
<script type="text/javascript"> 
jQuery( function( $ ) 
{ 
 function content_resize() 
 { 
 var w = $( window ); 
 var H = w.height(); 
 var W = w.width(); 
 $( '#content' ).css( {width: W-20, height: H-20} ); 
 } 
 
 $( window ).wresize( content_resize ); 
 
 content_resize(); 
} ); 
</script> 
 
</head> 

<body> 
 
<div id="content" style="border: 1px dashed silver; position:absolute; overflow:auto;"> 
test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test 
</div> 
 
</body> 
</html>

=============================================================================== 
*/ 
 
( function( $ ) 
{ 
 jQuery(function($) {
 $( window ).wresize(resizeScroller);
 
 function resizeScroller() {
 $('.scroll-pane').each(function(i, elem) { 
 
 if($(elem).attr('id') == undefined) {
 id = $(elem).attr('class');
 } else {
 id = $(elem).attr('id');
 }
 $(elem).jScrollHorizontalPane(_jscr_globalProperties[$(elem).attr('id')]);
 });
 } 
 });


 $.fn.wresize = function( f ) 
 { 
 version = '1.1'; 
 wresize = {fired: false, width: 0}; 
 
 function resizeOnce() 
 { 
 if ( $.browser.msie ) 
 { 
 if ( ! wresize.fired ) 
 { 
 wresize.fired = true; 
 } 
 else 
 { 
 var version = parseInt( $.browser.version, 10 ); 
 wresize.fired = false; 
 if ( version < 7 ) 
 { 
 return false; 
 } 
 else if ( version == 7 ) 
 { 
 //a vertical resize is fired once, an horizontal resize twice 
 var width = $( window ).width(); 
 if ( width != wresize.width ) 
 { 
 wresize.width = width; 
 return false; 
 } 
 } 
 } 
 }
 
 return true; 
 } 
 
 function handleWResize( e ) 
 { 
 if ( resizeOnce() ) 
 { 
 return f.apply(this, [e]); 
 } 
 } 
 
 this.each( function() 
 { 
 if ( this == window ) 
 { 
 $( this ).resize( handleWResize ); 
 } 
 else 
 { 
 $( this ).resize( f ); 
 } 
 } ); 
 
 return this; 
 }; 
 
} ) ( jQuery );
/*
 * jQuery UI Effects 1.5.3
 *
 * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 * 
 * http://docs.jquery.com/UI/Effects/
 */
;(function($) {

$.effects = $.effects || {}; //Add the 'effects' scope

$.extend($.effects, {
 save: function(el, set) {
 for(var i=0;i<set.length;i++) {
 if(set[i] !== null) $.data(el[0], "ec.storage."+set[i], el[0].style[set[i]]);
 }
 },
 restore: function(el, set) {
 for(var i=0;i<set.length;i++) {
 if(set[i] !== null) el.css(set[i], $.data(el[0], "ec.storage."+set[i]));
 }
 },
 setMode: function(el, mode) {
 if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle
 return mode;
 },
 getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value
 // this should be a little more flexible in the future to handle a string & hash
 var y, x;
 switch (origin[0]) {
 case 'top': y = 0; break;
 case 'middle': y = 0.5; break;
 case 'bottom': y = 1; break;
 default: y = origin[0] / original.height;
 };
 switch (origin[1]) {
 case 'left': x = 0; break;
 case 'center': x = 0.5; break;
 case 'right': x = 1; break;
 default: x = origin[1] / original.width;
 };
 return {x: x, y: y};
 },
 createWrapper: function(el) {
 if (el.parent().attr('id') == 'fxWrapper')
 return el;
 var props = {width: el.outerWidth({margin:true}), height: el.outerHeight({margin:true}), 'float': el.css('float')};
 el.wrap('<div id="fxWrapper" style="font-size:100%;background:transparent;border:none;margin:0;padding:0"></div>');
 var wrapper = el.parent();
 if (el.css('position') == 'static'){
 wrapper.css({position: 'relative'});
 el.css({position: 'relative'});
 } else {
 var top = el.css('top'); if(isNaN(parseInt(top))) top = 'auto';
 var left = el.css('left'); if(isNaN(parseInt(left))) left = 'auto';
 wrapper.css({ position: el.css('position'), top: top, left: left, zIndex: el.css('z-index') }).show();
 el.css({position: 'relative', top:0, left:0});
 }
 wrapper.css(props);
 return wrapper;
 },
 removeWrapper: function(el) {
 if (el.parent().attr('id') == 'fxWrapper')
 return el.parent().replaceWith(el);
 return el;
 },
 setTransition: function(el, list, factor, val) {
 val = val || {};
 $.each(list,function(i, x){
 unit = el.cssUnit(x);
 if (unit[0] > 0) val[x] = unit[0] * factor + unit[1];
 });
 return val;
 },
 animateClass: function(value, duration, easing, callback) {

 var cb = (typeof easing == "function" ? easing : (callback ? callback : null));
 var ea = (typeof easing == "object" ? easing : null);

 return this.each(function() {

 var offset = {}; var that = $(this); var oldStyleAttr = that.attr("style") || '';
 if(typeof oldStyleAttr == 'object') oldStyleAttr = oldStyleAttr["cssText"]; /* Stupidly in IE, style is a object.. */
 if(value.toggle) { that.hasClass(value.toggle) ? value.remove = value.toggle : value.add = value.toggle; }

 //Let's get a style offset
 var oldStyle = $.extend({}, (document.defaultView ? document.defaultView.getComputedStyle(this,null) : this.currentStyle));
 if(value.add) that.addClass(value.add); if(value.remove) that.removeClass(value.remove);
 var newStyle = $.extend({}, (document.defaultView ? document.defaultView.getComputedStyle(this,null) : this.currentStyle));
 if(value.add) that.removeClass(value.add); if(value.remove) that.addClass(value.remove);

 // The main function to form the object for animation
 for(var n in newStyle) {
 if( typeof newStyle[n] != "function" && newStyle[n] /* No functions and null properties */
 && n.indexOf("Moz") == -1 && n.indexOf("length") == -1 /* No mozilla spezific render properties. */
 && newStyle[n] != oldStyle[n] /* Only values that have changed are used for the animation */
 && (n.match(/color/i) || (!n.match(/color/i) && !isNaN(parseInt(newStyle[n],10)))) /* Only things that can be parsed to integers or colors */
 && (oldStyle.position != "static" || (oldStyle.position == "static" && !n.match(/left|top|bottom|right/))) /* No need for positions when dealing with static positions */
 ) offset[n] = newStyle[n];
 }

 that.animate(offset, duration, ea, function() { // Animate the newly constructed offset object
 // Change style attribute back to original. For stupid IE, we need to clear the damn object.
 if(typeof $(this).attr("style") == 'object') { $(this).attr("style")["cssText"] = ""; $(this).attr("style")["cssText"] = oldStyleAttr; } else $(this).attr("style", oldStyleAttr);
 if(value.add) $(this).addClass(value.add); if(value.remove) $(this).removeClass(value.remove);
 if(cb) cb.apply(this, arguments);
 });

 });
 }
});

//Extend the methods of jQuery
$.fn.extend({
 //Save old methods
 _show: $.fn.show,
 _hide: $.fn.hide,
 __toggle: $.fn.toggle,
 _addClass: $.fn.addClass,
 _removeClass: $.fn.removeClass,
 _toggleClass: $.fn.toggleClass,
 // New ec methods
 effect: function(fx,o,speed,callback) {
 return $.effects[fx] ? $.effects[fx].call(this, {method: fx, options: o || {}, duration: speed, callback: callback }) : null;
 },
 show: function() {
 if(!arguments[0] || (arguments[0].constructor == Number || /(slow|normal|fast)/.test(arguments[0])))
 return this._show.apply(this, arguments);
 else {
 var o = arguments[1] || {}; o['mode'] = 'show';
 return this.effect.apply(this, [arguments[0], o, arguments[2] || o.duration, arguments[3] || o.callback]);
 }
 },
 hide: function() {
 if(!arguments[0] || (arguments[0].constructor == Number || /(slow|normal|fast)/.test(arguments[0])))
 return this._hide.apply(this, arguments);
 else {
 var o = arguments[1] || {}; o['mode'] = 'hide';
 return this.effect.apply(this, [arguments[0], o, arguments[2] || o.duration, arguments[3] || o.callback]);
 }
 },
 toggle: function(){
 if(!arguments[0] || (arguments[0].constructor == Number || /(slow|normal|fast)/.test(arguments[0])) || (arguments[0].constructor == Function))
 return this.__toggle.apply(this, arguments);
 else {
 var o = arguments[1] || {}; o['mode'] = 'toggle';
 return this.effect.apply(this, [arguments[0], o, arguments[2] || o.duration, arguments[3] || o.callback]);
 }
 },
 addClass: function(classNames,speed,easing,callback) {
 return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames);
 },
 removeClass: function(classNames,speed,easing,callback) {
 return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames);
 },
 toggleClass: function(classNames,speed,easing,callback) {
 return speed ? $.effects.animateClass.apply(this, [{ toggle: classNames },speed,easing,callback]) : this._toggleClass(classNames);
 },
 morph: function(remove,add,speed,easing,callback) {
 return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]);
 },
 switchClass: function() {
 return this.morph.apply(this, arguments);
 },
 // helper functions
 cssUnit: function(key) {
 var style = this.css(key), val = [];
 $.each( ['em','px','%','pt'], function(i, unit){
 if(style.indexOf(unit) > 0)
 val = [parseFloat(style), unit];
 });
 return val;
 }
});

/*
 * jQuery Color Animations
 * Copyright 2007 John Resig
 * Released under the MIT and GPL licenses.
 */

// We override the animation for all of these color styles
jQuery.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'], function(i,attr){
 jQuery.fx.step[attr] = function(fx){
 if ( fx.state == 0 ) {
 fx.start = getColor( fx.elem, attr );
 fx.end = getRGB( fx.end );
 }

 fx.elem.style[attr] = "rgb(" + [
 Math.max(Math.min( parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0]), 255), 0),
 Math.max(Math.min( parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1]), 255), 0),
 Math.max(Math.min( parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2]), 255), 0)
 ].join(",") + ")";
 }
});

// Color Conversion functions from highlightFade
// By Blair Mitchelmore
// http://jquery.offput.ca/highlightFade/

// Parse strings looking for color tuples [255,255,255]
function getRGB(color) {
 var result;

 // Check if we're already dealing with an array of colors
 if ( color && color.constructor == Array && color.length == 3 )
 return color;

 // Look for rgb(num,num,num)
 if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
 return [parseInt(result[1]), parseInt(result[2]), parseInt(result[3])];

 // Look for rgb(num%,num%,num%)
 if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
 return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];

 // Look for #a0b1c2
 if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
 return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];

 // Look for #fff
 if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
 return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];

 // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
 if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
 return colors['transparent']

 // Otherwise, we're most likely dealing with a named color
 return colors[jQuery.trim(color).toLowerCase()];
}

function getColor(elem, attr) {
 var color;

 do {
 color = jQuery.curCSS(elem, attr);

 // Keep going until we find an element that has color, or we hit the body
 if ( color != '' && color != 'transparent' || jQuery.nodeName(elem, "body") )
 break;

 attr = "backgroundColor";
 } while ( elem = elem.parentNode );

 return getRGB(color);
};

// Some named colors to work with
// From Interface by Stefan Petre
// http://interface.eyecon.ro/

var colors = {
 aqua:[0,255,255],
 azure:[240,255,255],
 beige:[245,245,220],
 black:[0,0,0],
 blue:[0,0,255],
 brown:[165,42,42],
 cyan:[0,255,255],
 darkblue:[0,0,139],
 darkcyan:[0,139,139],
 darkgrey:[169,169,169],
 darkgreen:[0,100,0],
 darkkhaki:[189,183,107],
 darkmagenta:[139,0,139],
 darkolivegreen:[85,107,47],
 darkorange:[255,140,0],
 darkorchid:[153,50,204],
 darkred:[139,0,0],
 darksalmon:[233,150,122],
 darkviolet:[148,0,211],
 fuchsia:[255,0,255],
 gold:[255,215,0],
 green:[0,128,0],
 indigo:[75,0,130],
 khaki:[240,230,140],
 lightblue:[173,216,230],
 lightcyan:[224,255,255],
 lightgreen:[144,238,144],
 lightgrey:[211,211,211],
 lightpink:[255,182,193],
 lightyellow:[255,255,224],
 lime:[0,255,0],
 magenta:[255,0,255],
 maroon:[128,0,0],
 navy:[0,0,128],
 olive:[128,128,0],
 orange:[255,165,0],
 pink:[255,192,203],
 purple:[128,0,128],
 violet:[128,0,128],
 red:[255,0,0],
 silver:[192,192,192],
 white:[255,255,255],
 yellow:[255,255,0],
 transparent: [255,255,255]
};
 
/*
 * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
 *
 * Uses the built in easing capabilities added In jQuery 1.1
 * to offer multiple easing options
 *
 * TERMS OF USE - jQuery Easing
 * 
 * Open source under the BSD License. 
 * 
 * Copyright © 2008 George McGinley Smith
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, 
 * are permitted provided that the following conditions are met:
 * 
 * Redistributions of source code must retain the above copyright notice, this list of 
 * conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright notice, this list 
 * of conditions and the following disclaimer in the documentation and/or other materials 
 * provided with the distribution.
 * 
 * Neither the name of the author nor the names of contributors may be used to endorse 
 * or promote products derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
 * OF THE POSSIBILITY OF SUCH DAMAGE. 
 *
*/

// t: current time, b: begInnIng value, c: change In value, d: duration
jQuery.easing['jswing'] = jQuery.easing['swing'];

jQuery.extend( jQuery.easing,
{
 def: 'easeOutQuad',
 swing: function (x, t, b, c, d) {
 //alert(jQuery.easing.default);
 return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
 },
 easeInQuad: function (x, t, b, c, d) {
 return c*(t/=d)*t + b;
 },
 easeOutQuad: function (x, t, b, c, d) {
 return -c *(t/=d)*(t-2) + b;
 },
 easeInOutQuad: function (x, t, b, c, d) {
 if ((t/=d/2) < 1) return c/2*t*t + b;
 return -c/2 * ((--t)*(t-2) - 1) + b;
 },
 easeInCubic: function (x, t, b, c, d) {
 return c*(t/=d)*t*t + b;
 },
 easeOutCubic: function (x, t, b, c, d) {
 return c*((t=t/d-1)*t*t + 1) + b;
 },
 easeInOutCubic: function (x, t, b, c, d) {
 if ((t/=d/2) < 1) return c/2*t*t*t + b;
 return c/2*((t-=2)*t*t + 2) + b;
 },
 easeInQuart: function (x, t, b, c, d) {
 return c*(t/=d)*t*t*t + b;
 },
 easeOutQuart: function (x, t, b, c, d) {
 return -c * ((t=t/d-1)*t*t*t - 1) + b;
 },
 easeInOutQuart: function (x, t, b, c, d) {
 if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
 return -c/2 * ((t-=2)*t*t*t - 2) + b;
 },
 easeInQuint: function (x, t, b, c, d) {
 return c*(t/=d)*t*t*t*t + b;
 },
 easeOutQuint: function (x, t, b, c, d) {
 return c*((t=t/d-1)*t*t*t*t + 1) + b;
 },
 easeInOutQuint: function (x, t, b, c, d) {
 if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
 return c/2*((t-=2)*t*t*t*t + 2) + b;
 },
 easeInSine: function (x, t, b, c, d) {
 return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
 },
 easeOutSine: function (x, t, b, c, d) {
 return c * Math.sin(t/d * (Math.PI/2)) + b;
 },
 easeInOutSine: function (x, t, b, c, d) {
 return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
 },
 easeInExpo: function (x, t, b, c, d) {
 return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
 },
 easeOutExpo: function (x, t, b, c, d) {
 return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
 },
 easeInOutExpo: function (x, t, b, c, d) {
 if (t==0) return b;
 if (t==d) return b+c;
 if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
 return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
 },
 easeInCirc: function (x, t, b, c, d) {
 return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
 },
 easeOutCirc: function (x, t, b, c, d) {
 return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
 },
 easeInOutCirc: function (x, t, b, c, d) {
 if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
 return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
 },
 easeInElastic: function (x, t, b, c, d) {
 var s=1.70158;var p=0;var a=c;
 if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
 if (a < Math.abs(c)) { a=c; var s=p/4; }
 else var s = p/(2*Math.PI) * Math.asin (c/a);
 return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
 },
 easeOutElastic: function (x, t, b, c, d) {
 var s=1.70158;var p=0;var a=c;
 if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
 if (a < Math.abs(c)) { a=c; var s=p/4; }
 else var s = p/(2*Math.PI) * Math.asin (c/a);
 return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
 },
 easeInOutElastic: function (x, t, b, c, d) {
 var s=1.70158;var p=0;var a=c;
 if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5);
 if (a < Math.abs(c)) { a=c; var s=p/4; }
 else var s = p/(2*Math.PI) * Math.asin (c/a);
 if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
 return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
 },
 easeInBack: function (x, t, b, c, d, s) {
 if (s == undefined) s = 1.70158;
 return c*(t/=d)*t*((s+1)*t - s) + b;
 },
 easeOutBack: function (x, t, b, c, d, s) {
 if (s == undefined) s = 1.70158;
 return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
 },
 easeInOutBack: function (x, t, b, c, d, s) {
 if (s == undefined) s = 1.70158; 
 if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
 return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
 },
 easeInBounce: function (x, t, b, c, d) {
 return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
 },
 easeOutBounce: function (x, t, b, c, d) {
 if ((t/=d) < (1/2.75)) {
 return c*(7.5625*t*t) + b;
 } else if (t < (2/2.75)) {
 return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
 } else if (t < (2.5/2.75)) {
 return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
 } else {
 return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
 }
 },
 easeInOutBounce: function (x, t, b, c, d) {
 if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
 return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
 }
});

/*
 *
 * TERMS OF USE - EASING EQUATIONS
 * 
 * Open source under the BSD License. 
 * 
 * Copyright © 2001 Robert Penner
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, 
 * are permitted provided that the following conditions are met:
 * 
 * Redistributions of source code must retain the above copyright notice, this list of 
 * conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright notice, this list 
 * of conditions and the following disclaimer in the documentation and/or other materials 
 * provided with the distribution.
 * 
 * Neither the name of the author nor the names of contributors may be used to endorse 
 * or promote products derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
 * OF THE POSSIBILITY OF SUCH DAMAGE. 
 *
 */

})(jQuery);

/*
 * jQuery UI Effects Scale
 *
 * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 * 
 * http://docs.jquery.com/UI/Effects/Scale
 *
 * Depends:
 * effects.core.js
 */
(function($) {

$.effects.puff = function(o) {

 return this.queue(function() {

 // Create element
 var el = $(this);
 
 // Set options
 var options = $.extend(true, {}, o.options);
 var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
 var percent = parseInt(o.options.percent) || 150; // Set default puff percent
 options.fade = true; // It's not a puff if it doesn't fade! :)
 var original = {height: el.height(), width: el.width()}; // Save original
 
 // Adjust
 var factor = percent / 100;
 el.from = (mode == 'hide') ? original : {height: original.height * factor, width: original.width * factor};
 
 // Animation
 options.from = el.from;
 options.percent = (mode == 'hide') ? percent : 100;
 options.mode = mode;
 
 // Animate
 el.effect('scale', options, o.duration, o.callback);
 el.dequeue();
 });
 
};

$.effects.scale = function(o) {
 
 return this.queue(function() {
 
 // Create element
 var el = $(this);

 // Set options
 var options = $.extend(true, {}, o.options);
 var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
 var percent = parseInt(o.options.percent) || (parseInt(o.options.percent) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent
 var direction = o.options.direction || 'both'; // Set default axis
 var origin = o.options.origin; // The origin of the scaling
 if (mode != 'effect') { // Set default origin and restore for show/hide
 options.origin = origin || ['middle','center'];
 options.restore = true;
 }
 var original = {height: el.height(), width: el.width()}; // Save original
 el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state
 
 // Adjust
 var factor = { // Set scaling factor
 y: direction != 'horizontal' ? (percent / 100) : 1,
 x: direction != 'vertical' ? (percent / 100) : 1
 };
 el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state
 
 if (o.options.fade) { // Fade option to support puff
 if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;};
 if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;};
 };
 
 // Animation
 options.from = el.from; options.to = el.to; options.mode = mode;
 
 // Animate
 el.effect('size', options, o.duration, o.callback);
 el.dequeue();
 });
 
};

$.effects.size = function(o) {

 return this.queue(function() {
 
 // Create element
 var el = $(this), props = ['position','top','left','width','height','overflow','opacity'];
 var props1 = ['position','top','left','overflow','opacity']; // Always restore
 var props2 = ['width','height','overflow']; // Copy for children
 var cProps = ['fontSize'];
 var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom'];
 var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight'];
 
 // Set options
 var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
 var restore = o.options.restore || false; // Default restore
 var scale = o.options.scale || 'both'; // Default scale mode
 var origin = o.options.origin; // The origin of the sizing
 var original = {height: el.height(), width: el.width()}; // Save original
 el.from = o.options.from || original; // Default from state
 el.to = o.options.to || original; // Default to state
 // Adjust
 if (origin) { // Calculate baseline shifts
 var baseline = $.effects.getBaseline(origin, original);
 el.from.top = (original.height - el.from.height) * baseline.y;
 el.from.left = (original.width - el.from.width) * baseline.x;
 el.to.top = (original.height - el.to.height) * baseline.y;
 el.to.left = (original.width - el.to.width) * baseline.x;
 };
 var factor = { // Set scaling factor
 from: {y: el.from.height / original.height, x: el.from.width / original.width},
 to: {y: el.to.height / original.height, x: el.to.width / original.width}
 };
 if (scale == 'box' || scale == 'both') { // Scale the css box
 if (factor.from.y != factor.to.y) { // Vertical props scaling
 props = props.concat(vProps);
 el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from);
 el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to);
 };
 if (factor.from.x != factor.to.x) { // Horizontal props scaling
 props = props.concat(hProps);
 el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from);
 el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to);
 };
 };
 if (scale == 'content' || scale == 'both') { // Scale the content
 if (factor.from.y != factor.to.y) { // Vertical props scaling
 props = props.concat(cProps);
 el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from);
 el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to);
 };
 };
 $.effects.save(el, restore ? props : props1); el.show(); // Save & Show
 $.effects.createWrapper(el); // Create Wrapper
 el.css('overflow','hidden').css(el.from); // Shift
 
 // Animate
 if (scale == 'content' || scale == 'both') { // Scale the children
 vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size
 hProps = hProps.concat(['marginLeft','marginRight']); // Add margins
 props2 = props.concat(vProps).concat(hProps); // Concat
 el.find("*[width]").each(function(){
 child = $(this);
 if (restore) $.effects.save(child, props2);
 var c_original = {height: child.height(), width: child.width()}; // Save original
 child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x};
 child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x};
 if (factor.from.y != factor.to.y) { // Vertical props scaling
 child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from);
 child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to);
 };
 if (factor.from.x != factor.to.x) { // Horizontal props scaling
 child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from);
 child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to);
 };
 child.css(child.from); // Shift children
 child.animate(child.to, o.duration, o.options.easing, function(){
 if (restore) $.effects.restore(child, props2); // Restore children
 }); // Animate children
 });
 };
 
 // Animate
 el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
 if(mode == 'hide') el.hide(); // Hide
 $.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore
 if(o.callback) o.callback.apply(this, arguments); // Callback
 el.dequeue();
 }}); 
 
 });

};

})(jQuery);

//**************************************************************
// jQZoom allows you to realize a small magnifier window,close
// to the image or images on your web page easily.
//
// jqZoom version 2.2
// Author Doc. Ing. Renzi Marco(www.mind-projects.it)
// First Release on Dec 05 2007
// i'm looking for a job,pick me up!!!
// mail: renzi.mrc@gmail.com
//**************************************************************

(function($){

 $.fn.jqueryzoom = function(options){

 var settings = {
 xzoom: 200, //zoomed width default width
 yzoom: 200, //zoomed div default width
 offset: 10, //zoomed div default offset
 position: "right" ,//zoomed div default position,offset position is to the right of the image
 lens:1, //zooming lens over the image,by default is 1;
 preload: 1, 
 anim_scale: 1

 };

 if(options) {
 $.extend(settings, options);
 }

 var noalt='';

 $(this).hover(function(){
 
 var imageLeft = $(this).offset().left; 
 var imageTop = $(this).offset().top;

 
 var imageWidth = $(this).children('img').get(0).offsetWidth;
 var imageHeight = $(this).children('img').get(0).offsetHeight;


 noalt= $(this).children("img").attr("alt");

 var bigimage = $(this).children("img").attr("jqimg");

 $(this).children("img").attr("alt",'');

 if($("div.zoomdiv").get().length == 0){

 $(this).after("<div class='zoomdiv'><img class='bigimg' src='"+bigimage+"'/></div>");


 $(this).append("<div class='jqZoomPup'>&nbsp;</div>");

 }


 if(settings.position == "right"){

 if(imageLeft + imageWidth + settings.offset + settings.xzoom > screen.width){

 leftpos = imageLeft - settings.offset - settings.xzoom;

 }else{

 leftpos = imageLeft + imageWidth + settings.offset;
 }
 }else{
 leftpos = imageLeft - settings.xzoom - settings.offset;
 if(leftpos < 0){

 eftpos = imageLeft + imageWidth + settings.offset;

 }

 }
 
 var imageLeft2 = $(this).position().left; 
 var imageTop2 = $(this).position().top;
 var leftpos2 = imageLeft2 + imageWidth + 10;
 var imageTop2 = imageTop2 + 10;
 $("div.zoomdiv").css({ top: imageTop2,left: leftpos2 });

 $("div.zoomdiv").width(settings.xzoom);

 $("div.zoomdiv").height(settings.yzoom);

 if(settings.anim_scale) {
 $("div.zoomdiv").show("scale", {}, 1000);
 } else {
 $("div.zoomdiv").show();
 }
 if(!settings.lens){
 $(this).css('cursor','crosshair');
 }

 $(document.body).mousemove(function(e){



 mouse = new MouseEvent(e);

 /*$("div.jqZoomPup").hide();*/


 var bigwidth = $(".bigimg").get(0).offsetWidth;

 var bigheight = $(".bigimg").get(0).offsetHeight;

 var scaley ='x';

 var scalex= 'y';


 if(isNaN(scalex)|isNaN(scaley)){

 var scalex = (bigwidth/imageWidth);

 var scaley = (bigheight/imageHeight);




 //$("div.jqZoomPup").width((settings.xzoom)/scalex );

// $("div.jqZoomPup").height((settings.yzoom)/scaley);

 if(settings.lens){
 $("div.jqZoomPup").css('visibility','visible');
 }

 }

 

 xpos = mouse.x - $("div.jqZoomPup").width()/2 - imageLeft;

 ypos = mouse.y - $("div.jqZoomPup").height()/2 - imageTop ;

 if(settings.lens){

 xpos = (mouse.x - $("div.jqZoomPup").width()/2 < imageLeft ) ? 0 : (mouse.x + $("div.jqZoomPup").width()/2 > imageWidth + imageLeft ) ? (imageWidth -$("div.jqZoomPup").width() -2) : xpos;

 ypos = (mouse.y - $("div.jqZoomPup").height()/2 < imageTop ) ? 0 : (mouse.y + $("div.jqZoomPup").height()/2 > imageHeight + imageTop ) ? (imageHeight - $("div.jqZoomPup").height() -2 ) : ypos;

 }


 if(settings.lens){

 $("div.jqZoomPup").css({ top: ypos,left: xpos });

 }



 scrolly = ypos;

 $("div.zoomdiv").get(0).scrollTop = scrolly * scaley;

 scrollx = xpos;

 $("div.zoomdiv").get(0).scrollLeft = (scrollx) * scalex ;


 });
 },function(){

 $(this).children("img").attr("alt",noalt);
 $(document.body).unbind("mousemove");
 if(settings.lens){
 $("div.jqZoomPup").remove();
 }
 $("div.zoomdiv").remove();
 $("div#fxWrapper").remove();
 });

 count = 0;

 if(settings.preload){

 $('body').append("<div style='display:none;' class='jqPreload"+count+"'>Loading...</div>");

 $(this).each(function(){

 var imagetopreload= $(this).children("img").attr("jqimg");

 var content = jQuery('div.jqPreload'+count+'').html();

 jQuery('div.jqPreload'+count+'').html(content+'<img src=\"'+imagetopreload+'\">');

 });

 }

 }

})(jQuery);

function MouseEvent(e) {
this.x = e.pageX;
this.y = e.pageY;


}

