// Copyright (c) 2007 Ganeshji Marwaha (gmarwaha.com)
// Dual licensed under the MIT and GPL licenses:
// http://www.opensource.org/licenses/mit-license.php
// http://www.gnu.org/licenses/gpl.html
(function($) {
	$.fn.jCarouselLite = function(o) {
		o = $.extend( {
			prevImage : "",
			nextImage : "",
			prevDisabledImage : "",
			nextDisabledImage : "",
			btnNext : ".next",
			btnPrev : ".prev",
			btnGo : null,
			mouseWheel : false,
			auto : null,
			speed : 600,
			easing : null,
			vertical : false,
			circular : false,
			visible : 3,
			start : 0,
			scroll : 1,
			beforeStart : null,
			afterEnd : null,
			fixedWidth : 0,
			fixedHeight : 0
		}, o || {});
		return this
				.each(function() {
					var running = false, animCss = o.vertical ? "top" : "left", sizeCss = o.vertical ? "height"
							: "width";
					var div = $(this), ul = $("ul", div), tLi = $("li", ul), tl = tLi
							.size(), v = o.visible;
					if (o.circular) {
						ul.prepend(tLi.slice(tl - v - 1 + 1).clone()).append(
								tLi.slice(0, v).clone());
						o.start += v;
					}
					var li = $("li", ul), itemLength = li.size(), curr = o.start;
					if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) {
						var ieversion = new Number(RegExp.$1)
					}
					div.css("visibility", "visible");
					li.css( {
						overflow : "hidden",
						float : o.vertical ? "none" : "left"
					});
					ul.css( {
						margin : "0",
						padding : "0",
						position : "relative",
						"list-style-type" : "none",
						"z-index" : "1"
					});
					div.css( {
						overflow : "hidden",
						position : "relative",
						"z-index" : "2",
						left : "0px"
					});
					var liSize = o.vertical ? height(li) : width(li);
					var ulSize = liSize * itemLength;
					var divSize = liSize * v;
					
					var lis = ul.find('li');
					var maxHeight = 0;
					var maxWidth = 0;
					lis.each(function() {
						if ($(this).find('img').attr('height') > maxHeight) {
							maxHeight = $(this).find('img').attr('height');
						}
						if ($(this).find('img').attr('width') > maxWidth) {
							maxWidth = $(this).find('img').attr('width');
						}
					});
					
					if (maxWidth > 0 && maxHeight > 0) {
						li.css( {
							width : maxWidth,
							height : maxHeight
						});
					} else {
						li.css( {
							width : li.width(),
							height : li.height()
						});						
					}
					
					ul.css(sizeCss, ulSize + "px").css(animCss,
							-(curr * liSize));
					div.css(sizeCss, divSize + "px");
					if (!o.circular) {
						$(o.btnPrev).attr('src', o.prevImage);
						$(o.btnNext).attr('src', o.nextImage);
						
						if (o.btnPrev && curr == 0) {
							$(o.btnPrev).attr('src', o.prevDisabledImage);
						}
						if (o.btnNext && curr >= itemLength - v) {
							$(o.btnNext).attr('src', o.nextDisabledImage);
						}
						if (ieversion <= 6)
							if (o.btnNext && curr >= itemLength - v - 1) {
								$(o.btnNext).attr('src', o.nextDisabledImage);
							}
					}
					if (o.btnPrev)
						$(o.btnPrev).click(function() {
							prev = curr - o.scroll;
							if (!o.circular && prev < 0) {
								prev = 0;
							}
							return go(prev);
						});
					if (o.btnNext)
						$(o.btnNext).click(function() {
							next = curr + o.scroll;
							if (!o.circular && next > itemLength - v - 1) {
								if (ieversion <= 6)
									next = itemLength - v - 1;
								else
									next = itemLength - v;
							}
							return go(next);
						});
					if (o.btnGo)
						$.each(o.btnGo, function(i, val) {
							$(val).click(function() {
								return go(o.circular ? o.visible + i : i);
							});
						});
					if (o.mouseWheel && div.mousewheel)
						div.mousewheel(function(e, d) {
							return d > 0 ? go(curr - o.scroll) : go(curr
									+ o.scroll);
						});
					if (o.auto)
						setInterval(function() {
							go(curr + o.scroll);
						}, o.auto + o.speed);
					function vis() {
						return li.slice(curr).slice(0, v);
					}
					;
					function go(to) {
						if (!running) {
							if (o.beforeStart)
								o.beforeStart.call(this, vis());
							if (o.circular) {
								if (to <= o.start - v - 1) {
									ul.css(animCss,
											-((itemLength - (v * 2)) * liSize)
													+ "px");
									curr = to == o.start - v - 1 ? itemLength
											- (v * 2) - 1 : itemLength
											- (v * 2) - o.scroll;
								} else if (to >= itemLength - v + 1) {
									ul.css(animCss, -((v) * liSize) + "px");
									curr = to == itemLength - v + 1 ? v + 1 : v
											+ o.scroll;
								} else
									curr = to;
							} else {
								if (to < 0 || to > itemLength - v)
									return;
								else
									curr = to;
							}
							running = true;
							ul.animate(animCss == "left" ? {
								left : -(curr * liSize)
							} : {
								top : -(curr * liSize)
							}, o.speed, o.easing, function() {
								if (o.afterEnd)
									o.afterEnd.call(this, vis());
								running = false;
							});
							if (!o.circular) {
								$(o.btnPrev).attr('src', o.prevImage);
								$(o.btnNext).attr('src', o.nextImage);
								
								if (o.btnPrev && curr == 0) {
									$(o.btnPrev).attr('src', o.prevDisabledImage);
								}
								if (o.btnNext && curr >= itemLength - v) {
									$(o.btnNext).attr('src', o.nextDisabledImage);
								}
								if (ieversion <= 6)
									if (o.btnNext && curr >= itemLength - v - 1) {
										$(o.btnNext).attr('src', o.nextDisabledImage);
									}
							}
						}
						return false;
					}
					;
				});
	};
	function css(el, prop) {
		return parseInt($.css(el[0], prop)) || 0;
	}
	;
	function width(el) {
		return el[0].offsetWidth + css(el, 'marginLeft')
				+ css(el, 'marginRight');
	}
	;
	function height(el) {
		return el[0].offsetHeight + css(el, 'marginTop')
				+ css(el, 'marginBottom');
	}
	;
})($);
