/*
	Kwicks for jQuery (version 1.5.1)
	Copyright (c) 2008 Jeremy Martin
	http://www.jeremymartin.name/projects.php?project=kwicks
	
	Licensed under the MIT license:
		http://www.opensource.org/licenses/mit-license.php

	Any and all use of this script must be accompanied by this copyright/license notice in its present form.
*/

(function($){
	$.fn.kwicks = function(options) {
		var defaults = {
			isVertical: false,
			sticky: false,
			defaultKwick: -1,
			event: 'mouseover',
			spacing: 0,
			duration: 500,
			plus: 46,
			offset: 0,
			class_active: 'kwick_active'
		};
		var o = $.extend(defaults, options);
		var WoH = (o.isVertical ? 'height' : 'width'); // WoH = Width or Height
		var LoT = (o.isVertical ? 'top' : 'left'); // LoT = Left or Top
		
		return this.each(function() {
			container = $(this);
			var kwicks = container.children('li');
			var aPos = [];

			// set width of container ul
			
			var cwidth = 0;
			aPos[0] = 0;
			for(j = 0; j < kwicks.size(); j++) {
				var l = kwicks.eq(j).children('a').eq(0);
				
				if (kwicks.eq(j).hasClass('current')) {
					o.defaultKwick = j;
					cwidth += l.width() - o.plus;
				} else {
					// set normal width of link
					cwidth += l.width();
					l.width(l.width() + o.plus);
					
				}
				aPos[j+1] = cwidth;
			}

			container.css({
				width : cwidth + o.plus + 'px',
				height : '58px'
			});

			// pre calculate left or top values for all kwicks but the first and last
			// i = index of currently hovered kwick, j = index of kwick we're calculating
			var preCalcLoTs = []; // preCalcLoTs = pre-calculated Left or Top's
			var preCalcWoHs = [];
			
			for(i = -1; i < kwicks.size(); i++) {
				preCalcLoTs[i] = [];
				preCalcWoHs[i] = [];
				for(j = 0; j < kwicks.size(); j++) {
					if(j <= i || i == -1) {
						preCalcLoTs[i][j] = aPos[j];
						
						
					} else {
						preCalcLoTs[i][j] = aPos[j] + o.plus;
						
					}
					if (i == j) {
						preCalcWoHs[i][j] = aPos[j+1]-aPos[j] + o.plus;
					} else {
						preCalcWoHs[i][j] = aPos[j+1]-aPos[j];
					}

				}
			}
			
			
			// loop through all kwick elements
			kwicks.each(function(i) {
				var kwick = $(this);
				var link = kwick.children('a').eq(0);
				
				kwick.css(LoT, preCalcLoTs[o.defaultKwick][i]);
				
				
				if(o.defaultKwick == i) {
					kwick.css(WoH, aPos[i+1]-aPos[i]+o.plus + 'px');
					//kwick.addClass(o.class_active);
				} else {
					kwick.css(WoH, aPos[i+1]-aPos[i] + 'px');
				}
				
				kwick.css({
					margin: 0,
					position: 'absolute'
				});
				
				kwick.bind(o.event, function() {
					// calculate previous width or heights and left or top values
					var prevWoHs = []; // prevWoHs = previous Widths or Heights
					var prevLoTs = []; // prevLoTs = previous Left or Tops
					kwicks.stop().removeClass(o.class_active);
					for(j = 0; j < kwicks.size(); j++) {
						prevWoHs[j] = kwicks.eq(j).css(WoH).replace(/px/, '');
						prevLoTs[j] = kwicks.eq(j).css(LoT).replace(/px/, '');
					}
					var aniObj = {};
					var w = aPos[i+1]-aPos[i]+o.plus;
					aniObj[WoH] = w;
					var maxDif = w - prevWoHs[i];
					var prevWoHsMaxDifRatio = prevWoHs[i]/maxDif;
					
					kwick.addClass(o.class_active).animate(aniObj, {
						step: function(now) {
							// calculate animation completeness as percentage
							var percentage = maxDif != 0 ? now/maxDif - prevWoHsMaxDifRatio : 1;
							// adjsut other elements based on percentage
							kwicks.each(function(j) {
								if(j != i) {
									kwicks.eq(j).css(WoH, prevWoHs[j] - ((prevWoHs[j] - preCalcWoHs[i][j]) * percentage) + 'px');
								}
								if(j > 0 && j < kwicks.size()) {
									kwicks.eq(j).css(LoT, prevLoTs[j] - ((prevLoTs[j] - preCalcLoTs[i][j]) * percentage) + 'px');
								}
							});
						},
						duration: o.duration,
						easing: o.easing
					});
				});
			});
			
			
			container.bind("mouseleave", function() {
				var prevWoHs = [];
				var prevLoTs = [];
				kwicks.removeClass(o.class_active).stop();
				var kw = 0;
				var t_diff = 0;
				for(i = 0; i < kwicks.size(); i++) {
					prevWoHs[i] = kwicks.eq(i).css(WoH).replace(/px/, '');
					var diff = Math.abs(preCalcWoHs[o.defaultKwick][i] - prevWoHs[i]);
					if (diff > t_diff) {
						kw = i;
						t_diff = diff;
					}
					prevLoTs[i] = kwicks.eq(i).css(LoT).replace(/px/, '');
				}
				
				var aniObj = {};
				aniObj[WoH] = preCalcWoHs[o.defaultKwick][kw];
				var normDif = preCalcWoHs[o.defaultKwick][kw] - prevWoHs[kw];
				
				kwicks.eq(kw).animate(aniObj, {
					step: function(now) {
						var percentage = now / prevWoHs[kw];
						var percentage = normDif != 0 ? (now - prevWoHs[kw])/normDif : 1;
						
						for(i = 0; i < kwicks.size(); i++) {
							kwicks.eq(i).css(WoH, prevWoHs[i] - ((prevWoHs[i] - preCalcWoHs[o.defaultKwick][i]) * percentage) + 'px');
							kwicks.eq(i).css(LoT, prevLoTs[i] - ((prevLoTs[i] - preCalcLoTs[o.defaultKwick][i]) * percentage) + 'px');
						}
					},
					duration: o.duration,
					easing: o.easing
				});
			});
			
			
		});
	};
})(jQuery);


jQuery(document).ready(function() {  
     jQuery('.kwicks').kwicks({ 
         spacing : 5  
     });  
});