(function ($) {
	preloadImages =[ "/img/defaults/preowned/tabOff.png",
	"/img/defaults/preowned/tabOn.png",
	"/img/defaults/preowned/dataBg.png",
	"/img/defaults/preowned/noPhoto.png"];
	
	var preload = function (imgArray) {
		var cache =[], cacheImg = '';
		for (var i = 0; i < imgArray.length; i++) {
			cacheImg = document.createElement('img');
			cacheImg.src = imgArray[i];
			cache.push(cacheImg);
		}
	};
	
	var tabHoverOn = function () {
		var elementId = $(this).attr('id').split('_');
		if (elementId[2] != 1) {
			/* If clicked tab is not the first id */
			$(this).addClass('hover');
		} else {
			/* Otherwise change background on parent element */
			$(this).parent('div').addClass('hover');
		}
	};
	
	var tabHoverOff = function () {
		var elementId = $(this).attr('id').split('_');
		if (elementId[2] != 1) {
			/* If clicked tab is not the first tab */
			$(this).removeClass('hover');
		} else {
			/* Otherwise change background on parent element */
			$(this).parent('div').removeClass('hover');
		}
	};
	
	var tabClick = function () {
		var elementId = $(this).attr('id').split('_');
		var link = $('a', this);
		var tabControl = $(this).parent('div');
		var vehicleDiv = $('#vehicleDiv_' + elementId[1]);
		var callback = null;
		var tabNum = elementId[2];
		
		//Default all tabs to unselected
		vehicleDiv.attr('class', 'vehicleDiv selTab' + elementId[2]);
		$(this).siblings(':not(.tabDividerDiv)').removeClass('select').parent('div').removeClass('select');
		
		//Change clicked tab to selected
		if (tabNum != 1) {
			$(this).addClass('select');
		} else {
			tabControl.addClass('select');
		}
		
		if (tabNum == 3) {
			/* If photo tab */
			callback = function () {
				var photoDiv = $(".mediaDownloadStrip", this);
				var carousel = photoDiv.data('jcarousel');
				
				if (carousel != null) {
					carousel.scroll(1);
					carousel.currentPage = 1;
				}
				
				var heading = $('.mediaDownloadHeading', this);
				var totalPages = Math.ceil($('li', photoDiv).length / 3);
				
				carousel = photoDiv.jcarousel({
					visible: 3,
					buttonNextHTML: null,
					buttonPrevHTML: null,
					itemLoadCallback: { onAfterAnimation: function (carousel) {
							$('.page_num', heading).html(carousel.currentPage);
							$('.page_count', heading).html(carousel.totalPages);
							
							if (carousel.currentPage == 1) {
								$('.go_prev', heading).css('visibility', 'hidden');
							} else {
								$('.go_prev', heading).css('visibility', 'visible');
							}
							if (carousel.currentPage == totalPages) {
								$('.go_next', heading).css('visibility', 'hidden');
							} else {
								$('.go_next', heading).css('visibility', 'visible');
							}
						}
					}
				}).data('jcarousel');
				
				carousel.totalPages = totalPages;
				carousel.currentPage = 1;
				carousel.scroll(1);
				
				$('.page_num', heading).html(carousel.currentPage);
				$('.page_count', heading).html(carousel.totalPages);
				
				$('.go_next', heading).click(function () {
					if (carousel.animating) {
						return false;
					};
					carousel.next();
					carousel.currentPage++;
				});
				$('.go_prev', heading).click(function () {
					if (carousel.animating) {
						return false;
					};
					carousel.prev();
					carousel.currentPage--;
				});
				
				if (carousel.totalPages > 1) {
					heading.show();
				} else {
					heading.hide();
				}
				
				if (carousel.currentPage == 1) {
					$('.go_prev', heading).css('visibility', 'hidden');
				} else {
					$('.go_prev', heading).css('visibility', 'visible');
				}
				if (carousel.currentPage == totalPages) {
					$('.go_next', heading).css('visibility', 'hidden');
				} else {
					$('.go_next', heading).css('visibility', 'visible');
				}
			}
		}
		//Hide all data div's
		$('> div', tabControl.siblings('.dataTextDiv')).hide()
		$('> div', tabControl.siblings('.dataTextDiv').eq(0)).eq(tabNum - 1).fadeIn("slow", callback);
	}
	function setStripWidth() {
		var totalOffset = 0;
		var sectionWidth = 540;
		var pageCount = 1;
		
		var thumbnails = $("img", this);
		
		for (var i = 0; i < thumbnails.length; i++) {
			var thumbnail = thumbnails.eq(i);
			var thumbnailLi = thumbnail.parents('li');
			
			totalOffset += thumbnailLi.outerWidth();
			if (thumbnail.offset().left >= 0) {
				if (totalOffset < sectionWidth) {
					$(this).css({
						"width":(totalOffset + 2) + "px"
					});
					pageCount = Math.ceil(thumbnails.size() / (i + 1));
				} else {
					break;
				}
			}
		}
		$('.mediaDownloadStrip', this).css({
			"width":(pageCount * sectionWidth) + "px"
		});
		return pageCount;
	}
	
	function slideStrip(direction) {
		var heading = $(this).parents('.mediaDownloadHeading');
		var page = heading.data("page");
		var pageCount = heading.data("pageCount");
		
		if ((page == 1 && direction == "+=") || (page == pageCount && direction == "-=")) {
			return false;
		}
		
		var div = heading.children("div");
		
		$('.page_num', div).html((direction == "+="? page - 1: page + 1));
		$('.page_count', div).html(pageCount);
		
		$(".mediaDownloadStrip", heading.parent()).each(function () {
			var strip = $(this);
			strip.animate({
				left: direction +(strip.parent().width() + 20) + "px"
			},
			400);
		});
		
		page = page + (direction == "+="? - 1: 1);
		heading.data("page", page);
		$("img", div).iunfixpng().each(function () {
			this.src = this.src.replace("-off", "");
		}).ifixpng();
		if (page == pageCount) $("img:last", div).iunfixpng().each(function () {
			this.src = this.src.replace(".png", "-off.png");
		}).ifixpng();
		if (page == 1) $("img:first", div).iunfixpng().each(function () {
			this.src = this.src.replace(".png", "-off.png");
		}).ifixpng();
	}
	jQuery.cookie = function (cookiename, value, options) {
		if (typeof value != 'undefined') {
			options = options || {
			};
			if (value === null) {
				value = '';
				options.expires = - 1;
			}
			var expires = '';
			if (cookiename != "nklauth" && options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
				var date;
				if (typeof options.expires == 'number') {
					date = new Date();
					date.setTime(date.getTime() +(options.expires * 24 * 60 * 60 * 1000));
				} else {
					date = options.expires;
				}
				expires = '; expires=' + date.toUTCString();
			}
			var path = options.path? '; path=' + options.path: '; path=/';
			var domain = options.domain? '; domain=' + options.domain: '';
			var secure = options.secure? '; secure': '';
			document.cookie =[cookiename, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
		} else {
			var cookieValue = null;
			if (document.cookie && document.cookie != '') {
				var cookies = document.cookie.split(';');
				for (var i = 0; i < cookies.length; i++) {
					var cookie = jQuery.trim(cookies[i]);
					if (cookie.substring(0, cookiename.length + 1) ==(cookiename + '=')) {
						cookieValue = decodeURIComponent(cookie.substring(cookiename.length + 1));
						break;
					}
				}
			}
			return cookieValue;
		}
	};
	
	jQuery.fn.preview = function (options) {
		var $$ = jQuery(this);
		options = jQuery.extend({
			offset: {
				x: 10,
				y: 15
			},
			attribute: "rel",
			type: "image",
			id: "previewPluginPreviewElement",
			trigger: "hover",
			style: "simple",
			closeText: "X",
			position: "offset"
		},
		options);
		$$.cloneableData("preview.options", options);
		if (options.trigger == "hover") {
			$$.hover(jQuery.fn.preview.hoverIn, jQuery.fn.preview.hoverOut).mousemove(jQuery.fn.preview.mousemove);
		}
		if (options.trigger == "toggle") {
			$$.toggle(jQuery.fn.preview.hoverIn, jQuery.fn.preview.hoverOut);
		}
		return this;
	};
	jQuery.fn.preview.hoverIn = function (e) {
		var options = jQuery(this).data("preview.options");
		var $$ = jQuery(this);
		var preview =[];
		this.title = (options && options.title)? options.title: (this.title? this.title: (this.alt? this.alt: ""));
		preview.push("<div id=\"" + options.id + "\">");
		if (options.trigger == "toggle") {
			preview.push("<a class=\"closeButton\" href=\"javascript:void(null)\">" + options.closeText + "</a>");
		}
		switch (options.type) {
			case "image":
			case "img":
			if (options.attribute != 'href') {
				var attr = $$.attr(options.attribute).split("|");
			} else {
				var attr =[jQuery(this).parent('a').attr('href')];
			}
			preview.push("<img src=\"" + attr[0] + "\"");
			if (attr.length > 2) {
				preview.push(" width=\"" + attr[1] + "\" height=\"" + attr[2] + "\"");
			}
			preview.push(">");
			break;
			case "html":
			preview.push(jQuery($$.attr(options.attribute)).html());
			break;
		}
		if (options.style == "slideshow") {
			preview.push("<div class=\"slideshow\">");
			if ($$.data("prev")) {
				preview.push("<img src=\"" + cmsContext + "/img/icons/page-prev.png\" alt=\"<\" />");
			} else {
				preview.push("<img src=\"" + cmsContext + "/img/icons/page-prev-off.png\" alt=\"<\" />");
			}
			if ($$.data("next")) {
				preview.push("<img src=\"" + cmsContext + "/img/icons/page-next.png\" alt=\">\" />");
			} else {
				preview.push("<img src=\"" + cmsContext + "/img/icons/page-next-off.png\" alt=\">\" />");
			}
			preview.push("</div>");
		}
		if (this.title.length > 0) {
			preview.push("<p>" + this.title + "</p>");
		}
		preview.push("</div>");
		jQuery("body").append(preview.join(""));
		var $p = jQuery("#" + options.id);
		if (options.trigger == "toggle") {
			$p.get(0).triggerElement = $$;
			$p.click(function () {
				this.triggerElement.click();
			});
		}
		if (options.style == "slideshow") {
			var slideshowImg = jQuery(".slideshow img");
			slideshowImg.each(function (index) {
				var t = jQuery(this);
				t.cloneableData("triggerElement", $$);
				if (jQuery.fn.ifixpng) {
					t.ifixpng();
				}
				if (index === 0) {
					t.click(function () {
						jQuery(jQuery(this).data("triggerElement").click().data("prev")).click();
						return false;
					});
				}
				if (index === 1) {
					t.click(function () {
						jQuery(jQuery(this).data("triggerElement").click().data("next")).click();
						return false;
					});
				}
			});
		}
		if (options.callback) {
			options.callback.apply(this);
		}
		switch (options.position) {
			case "offset":
			$p.css({
				"left":
				(e.pageX + options.offset.x) + "px",
				"top": (e.pageY + options.offset.y) + "px"
			}).show();
			break;
			case "center":
			var top = jQuery(window).scrollTop() + ((jQuery(window).height() - jQuery("#" + options.id).height()) / 2);
			var left = jQuery(window).scrollLeft() + ((jQuery(window).width() - jQuery("#" + options.id).width()) / 2);
			$p.css({
				"left": left + "px",
				"top": top + "px"
			}).show();
			break;
		}
	};
	jQuery.fn.preview.hoverOut = function (e) {
		var options = jQuery(this).data("preview.options");
		jQuery("#" + options.id).hide().remove();
	};
	jQuery.fn.preview.mousemove = function (e) {
		var options = jQuery(this).data("preview.options");
		jQuery("#" + options.id).css({
			"left": (e.pageX + options.offset.x) + "px",
			"top": (e.pageY + options.offset.y) + "px"
		});
	};
	jQuery.fn.cloneableData = function (dataTerm, data) {
		var t = jQuery(this);
		switch (arguments.length) {
			case 2:
			if (! t.data("cloneableData")) {
				t.data("cloneableData",[]);
			}
			var tData = t.data("cloneableData");
			tData.push(dataTerm);
			t.data(dataTerm, data);
			t.data("cloneableData", tData);
			break;
			case 1:
			dataTerm.data("events", t.data("events"));
			if (t.data("cloneableData")) {
				for (var cloneable in t.data("cloneableData")) {
					if (t.data(cloneable)) {
						dataTerm.cloneableData(cloneable, t.data(cloneable));
					}
				}
			}
			break;
		}
		return t;
	};
	function setPreviewCaption() {
		var options = $(this).data("preview.options");
		$("p", "#" + options.id).fadeTo(10, 0.5);
		jQuery('#previewPluginPreviewElement img').load(function () {
			var cont = $('#previewPluginPreviewElement');
			var mW = cont.width();
			var mH = cont.height();
			cont.css({
				'left': ($(window).width() - mW) / 2 + 'px'
			});
		})
	}
	
	$(function () {
		preload(preloadImages);
		$(".pre-owned ul.mediaDownloadStrip img").preload();
		
		$(".pre-owned .mediaDownloadSection").each(function (index) {
			$(this).data("index", index);
		});
		$('.pre-owned .tabControlDiv div:not(.tabDividerDiv)').mouseover(tabHoverOn).mouseout(tabHoverOff).click(tabClick);
		
		$('.pre-owned div.mediaDownloadSection img').each(function () {
			var parent = $(this).parents('div.mediaDownloadSection');
			var parentId = parent.attr('id');
			var allImages = parent.find('img');
			var myIdx = parseInt(allImages.index(this));
			
			$(this).data('idInt', myIdx + 1).data('intMax', allImages.length);
			if (myIdx > 0) {
				$(this).data('prev', allImages.eq(myIdx - 1));
			}
			if (myIdx + 1 < allImages.length) {
				$(this).data('next', allImages.eq(myIdx + 1));
			}
			
			allImages.preview({
				trigger: "toggle",
				style: "slideshow",
				position: "center",
				autoPosition: true,
				type: "image",
				attribute: "href",
				offset: {
					x: - 200,
					y: 15
				},
				callback: setPreviewCaption,
				ofWord: "/",
				nextLabel: "<",
				prevLabel: ">"
			});
		});
	});
	
	
	jQuery.infiniti = {
	};
	jQuery.infiniti.promoPopup = function (options) {
		options = jQuery.extend({
			url: "",
			size: "fullscreen",
			height: "auto",
			width: "auto",
			top: "0",
			left: "0",
			name: "popup",
			cookie: null,
			autofocus: false,
			extra: ""
		},
		options);
		if (options.cookie !== null && options.cookie.length > 0 && jQuery.cookie && jQuery.cookie(options.cookie) !== null && (jQuery.cookie(options.cookie).length > 0 || jQuery.cookie("nopopups") == "true")) {
			return jQuery;
		}
		var size = "";
		switch (options.size) {
			case "fullscreen":
			size = "fullscreen,type=fullWindow";
			break;
			case "fixed":
			default:
			size = "width=" + options.width + ",height=" + options.height + ",top=" + options.top + ",left=" + options.left;
		}
		//check the cookie - if no cookie value is set, or if the value isn't correct show the popup
		var myName = options.name;
		var cookieVal = jQuery.cookie(myName);
		
		if (! cookieVal) {
			var win = window.open(options.url, options.name.replace(/\s*/ig, ""), size + (options.extra.length > 0? "," + options.extra: ""));
			if (! win) {
				win = window.open('', options.name.replace(/\s*/ig, ""), size + (options.extra.length > 0? "," + options.extra: ""));
				if (win) {
					win.location.href = options.url;
				}
			}
			if (options.autofocus !== null && options.autofocus && win) {
				win.focus();
			}
			
			
			jQuery.cookie(myName, myName)
		};
		
		
		return jQuery;
	};
	
	
	jQuery.fn.flashEvent = function (options) {
		var $$ = jQuery(this);
		if (typeof (options) == 'function') {
			$$.bind("flashEvent", options);
		} else {
			$$.trigger("flashEvent",[options]);
		}
	};
	
	jQuery.fn.iefiximg = function (returnType) {
		jQuery(this).ifixpng();
	};
	jQuery.iefiximg = function (iteration) {
		jQuery("img").ifixpng();
	};
	
	
	var $preload = $.preload = function (original, settings) {
		if (typeof (original) == 'undefined') {
			return original;
		}
		settings = $.extend({
		},
		$preload.defaults, settings);
		var sources = $.map(original,
		function (source) {
			if (! source) {
				return;
			}
			if (source.split) {
				return settings.base + source + settings.ext;
			}
			var url = source.src || source.href;
			if (typeof settings.placeholder == 'string' && source.src) {
				source.src = settings.placeholder;
			}
			if (settings.rel) {
				url = source.rel;
			}
			if (settings.href) {
				url = $(source).parents('a').attr('href');
			}
			if (url && settings.find) {
				url = url.replace(settings.find, settings.replace);
			}
			return url || null;
		});
		var data = {
			loaded: 0,
			failed: 0,
			next: 0,
			done: 0,
			total: sources.length
		};
		if (! data.total) {
			return finish();
		}
		var imgs = '<img/>',
		thres = settings.threshold;
		while (-- thres > 0) {
			imgs += '<img/>';
		}
		imgs = $(imgs).load(handler).error(handler).bind('abort', handler).each(fetch);
		function handler(e) {
			data.found = e.type == 'load';
			data.image = this.src;
			var orig = data.original = original[ this.index];
			data[data.found? 'loaded': 'failed']++;
			data.done++;
			if (settings.placeholder && orig.src) {
				orig.src = data.found? data.image: settings.notFound || orig.src;
			}
			if (settings.onComplete) {
				settings.onComplete(data);
			}
			if (data.done < data.total) {
				fetch(0, this);
			} else {
				if (imgs.unbind) {
					imgs.unbind('load').unbind('error').unbind('abort');
				}
				imgs = null;
				finish();
			}
		}
		function fetch(i, img, retry) {
			if ($.browser.msie && data.next && data.next % $preload.gap === 0 && ! retry) {
				setTimeout(function () {
					fetch(i, img, true);
				},
				0);
				return false;
			}
			if (data.next == data.total) {
				return false;
			}
			img.index = data.next;
			img.src = sources[data.next++];
			if (settings.onRequest) {
				data.image = img.src;
				data.original = original[data.next - 1];
				settings.onRequest(data);
			}
			return false;
		}
		function finish() {
			if (settings.onFinish) {
				settings.onFinish(data);
			}
		}
	};
	$preload.gap = 14;
	$preload.defaults = {
		threshold: 2,
		base: '',
		ext: '',
		replace: ''
	};
	$.fn.preload = function (settings) {
		$preload(this, settings);
		return this;
	};
	
	jQuery.ifixpng = function (customPixel) {
		jQuery.ifixpng.pixel = customPixel;
	};
	jQuery.ifixpng.getPixel = function () {
		return jQuery.ifixpng.pixel || (typeof (cmsContext) != "undefined"? cmsContext: cmsContext = "") + '/img/global/spacer.gif';
	};
	var hack = {
		ltie7: jQuery.browser.msie && (/MSIE\s(5\.5|6\.)/).test(navigator.userAgent),
		filter: function (src, method) {
			return "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true,sizingMethod='" + method + "',src='" + src + "')";
		}
	};
	jQuery.fn.ifixpng = hack.ltie7?
	function () {
		return this.each(function () {
			var $$ = jQuery(this);
			var base = jQuery('base').attr('href');
			if ($$.is('img') || $$.is('input')) {
				if ($$.attr('src')) {
					if ($$.attr('src').match(/.*\.png([?].*)?$/i)) {
						var source = (base && $$.attr('src').substring(0, 1) != '/')? base + $$.attr('src'): $$.attr('src');
						var w = $$.width();
						var h = $$.height();
						if (w === 0) {
							w = $$.attr("width");
						}
						if (h === 0) {
							h = $$.attr("height");
						}
						if (w === 0) {
							w = "auto";
						}
						if (h === 0) {
							h = "auto";
						}
						$$.css({
							filter: hack.filter(source, "image"),
							width: w,
							height: h
						}).attr({
							src: jQuery.ifixpng.getPixel()
						}).positionFix();
					}
				}
			} else {
				var image = $$.css('backgroundImage');
				if (image.match(/^url\(["']?(.*\.png([?].*)?)["']?\)$/i)) {
					image = RegExp.$1;
					$$.css({
						backgroundImage: 'none',
						filter: hack.filter(image, "scale")
					}).children().positionFix();
				}
			}
		});
	}: function () {
		return this;
	};
	jQuery.fn.iunfixpng = hack.ltie7?
	function () {
		return this.each(function () {
			var $$ = jQuery(this);
			var src = $$.css('filter');
			if (src.match(/src=["']?(.*\.png([?].*)?)["']?/i)) {
				src = RegExp.$1;
				if ($$.is('img') || $$.is('input')) {
					$$.attr({
						src: src
					}).css({
						filter: ''
					});
				} else {
					$$.css({
						filter: '',
						background: 'url(' + src + ')'
					});
				}
			}
		});
	}: function () {
		return this;
	};
	jQuery.fn.positionFix = function () {
		return this.each(function () {
			var $$ = jQuery(this);
			var position = $$.css('position');
			if (position != 'absolute' && position != 'relative') {
				$$.css({
					position: 'relative'
				});
			}
		});
	};
	jQuery.infiniti.sendToAFriend = function (formpage) {
		tt_copybarepageName = "";
		tt_copychannel = "";
		if (tt.barepageName && tt_copybarepageName.length == 0) {
			tt_copybarepageName = tt.barepageName;
		} else {
			tt_copybarepageName = '';
		}
		
		if (tt.siteSection) {
			tt_copychannel = tt.siteSection;
		} else {
			tt_copychannel = '';
		}

		jQuery('#stafContent').empty().remove();
		jQuery("body").append("<a href='#' id='stafPopup'></a><div id='stafContent'><div id='stafContentCopy' class='copy'></div></div>");
		
		jQuery.infiniti.followCursor(cmsContext + "/img/global/spinner04.gif");
		
		jQuery(function () {
			jQuery('#stafPopup').click(function (e) {
				e.preventDefault();
				jQuery('#stafContent').modal({
					closeHTML: "<img alt='close' src='" + cmsContext + "/img/icons/close-x-white.gif' />",
					position:[ "15%" ]
				});
			});
		});
		jQuery("#stafPopup").click();
		jQuery.ajax({
			url: formpage,
			dataType: 'html',
			success: function (responseText, responseCode) {
				jQuery("#stafContent").append(responseText);
				jQuery.infiniti.followCursor.stop();
			},
			type: "GET"
		});
		
		jQuery("#stafPopup").remove();
	};
	jQuery.infiniti.followCursor = function (img) {
		var ix = jQuery("body").append("<img class=\"followCursor\" src=\"" + img + "\"/>").find(".followCursor:last");
		ix.css({
			position: "absolute",
			top: "0px",
			left: "0px",
			"z-index": 10000
		});
		jQuery("body").mousemove(mousemove);
		function mousemove(e) {
			if (ix) {
				ix.css({
					top: (e.pageY + 10) + "px",
					left: (e.pageX + 10) + "px"
				});
			}
		}
		jQuery.infiniti.followCursor.stop = function () {
			jQuery("body").unbind("mousemove", mousemove);
			jQuery(ix).remove();
		};
	};
	
	$(function () {
		$('img').ifixpng();
	});
})(jQuery);

/*
* jCarousel - Riding carousels with jQuery
*   http://sorgalla.com/jcarousel/
*
* Copyright (c) 2006 Jan Sorgalla (http://sorgalla.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.
*
* Built on top of the jQuery library
*   http://jquery.com
*
* Inspired by the "Carousel Component" by Bill Scott
*   http://billwscott.com/carousel/
*/

(function (g) {
	var q = {
		vertical: ! 1, rtl: ! 1, start: 1, offset: 1, size: null, scroll: 3, visible: null, animation: "normal", easing: "swing", auto: 0, wrap: null, initCallback: null, setupCallback: null, reloadCallback: null, itemLoadCallback: null, itemFirstInCallback: null, itemFirstOutCallback: null, itemLastInCallback: null, itemLastOutCallback: null, itemVisibleInCallback: null, itemVisibleOutCallback: null, animationStepCallback: null, buttonNextHTML: "<div></div>", buttonPrevHTML: "<div></div>", buttonNextEvent: "click", buttonPrevEvent: "click", buttonNextCallback: null, buttonPrevCallback: null, itemFallbackDimension: null
	},
	m = ! 1;
	g(window).bind("load.jcarousel", function () {
		m = ! 0
	});
	g.jcarousel = function (a, c) {
		this.options = g.extend({
		},
		q, c || {
		});
		this.autoStopped = this.locked = ! 1;
		this.buttonPrevState = this.buttonNextState = this.buttonPrev = this.buttonNext = this.list = this.clip = this.container = null;
		if (! c || c.rtl === void 0) this.options.rtl =(g(a).attr("dir") || g("html").attr("dir") || "").toLowerCase() == "rtl";
		this.wh = ! this.options.vertical? "width": "height";
		this.lt = ! this.options.vertical? this.options.rtl? "right": "left": "top";
		for (var b = "", d = a.className.split(" "), f = 0; f < d.length; f++) if (d[f].indexOf("jcarousel-skin") != - 1) {
			g(a).removeClass(d[f]);
			b = d[f];
			break
		}
		a.nodeName.toUpperCase() == "UL" || a.nodeName.toUpperCase() == "OL"?(this.list = g(a), this.clip = this.list.parents(".jcarousel-clip"), this.container = this.list.parents(".jcarousel-container")):(this.container = g(a), this.list = this.container.find("ul,ol").eq(0), this.clip = this.container.find(".jcarousel-clip"));
		if (this.clip.size() === 0) this.clip = this.list.wrap("<div></div>").parent();
		if (this.container.size() === 0) this.container = this.clip.wrap("<div></div>").parent();
		b !== "" && this.container.parent()[0].className.indexOf("jcarousel-skin") == - 1 && this.container.wrap('<div class=" ' + b + '"></div>');
		this.buttonPrev = g(".jcarousel-prev", this.container);
		if (this.buttonPrev.size() === 0 && this.options.buttonPrevHTML !== null) this.buttonPrev = g(this.options.buttonPrevHTML).appendTo(this.container);
		this.buttonPrev.addClass(this.className("jcarousel-prev"));
		this.buttonNext = g(".jcarousel-next", this.container);
		if (this.buttonNext.size() === 0 && this.options.buttonNextHTML !== null) this.buttonNext = g(this.options.buttonNextHTML).appendTo(this.container);
		this.buttonNext.addClass(this.className("jcarousel-next"));
		this.clip.addClass(this.className("jcarousel-clip")).css({
			position: "relative"
		});
		this.list.addClass(this.className("jcarousel-list")).css({
			overflow: "hidden", position: "relative", top: 0, margin: 0, padding: 0
		}).css(this.options.rtl? "right": "left", 0);
		this.container.addClass(this.className("jcarousel-container")).css({
			position: "relative"
		}); ! this.options.vertical && this.options.rtl && this.container.addClass("jcarousel-direction-rtl").attr("dir", "rtl");
		var j = this.options.visible !== null? Math.ceil(this.clipping() / this.options.visible): null, b = this.list.children("li"), e = this;
		if (b.size() > 0) {
			var h = 0, i = this.options.offset;
			b.each(function () {
				e.format(this, i++);
				h += e.dimension(this, j)
			});
			this.list.css(this.wh, h + 100 + "px");
			if (! c || c.size === void 0) this.options.size = b.size()
		}
		this.container.css("display", "block");
		this.buttonNext.css("display", "block");
		this.buttonPrev.css("display", "block");
		this.funcNext = function () {
			e.next()
		};
		this.funcPrev = function () {
			e.prev()
		};
		this.funcResize = function () {
			e.resizeTimer && clearTimeout(e.resizeTimer);
			e.resizeTimer = setTimeout(function () {
				e.reload()
			},
			100)
		};
		this.options.initCallback !== null && this.options.initCallback(this, "init"); ! m && g.browser.safari?(this.buttons(! 1, ! 1), g(window).bind("load.jcarousel", function () {
			e.setup()
		})): this.setup()
	};
	var f = g.jcarousel;
	f.fn = f.prototype = {
		jcarousel: "0.2.8"
	};
	f.fn.extend = f.extend = g.extend;
	f.fn.extend({
		setup: function () {
			this.prevLast = this.prevFirst = this.last = this.first = null; this.animating = ! 1; this.tail = this.resizeTimer = this.timer = null; this.inTail = ! 1; if (! this.locked) {
				this.list.css(this.lt, this.pos(this.options.offset) + "px");
				var a = this.pos(this.options.start, ! 0);
				this.prevFirst = this.prevLast = null; this.animate(a, ! 1);
				g(window).unbind("resize.jcarousel", this.funcResize).bind("resize.jcarousel", this.funcResize);
				this.options.setupCallback !== null && this.options.setupCallback(this)
			}
		},
		reset: function () {
			this.list.empty();
			this.list.css(this.lt, "0px");
			this.list.css(this.wh, "10px");
			this.options.initCallback !== null && this.options.initCallback(this, "reset");
			this.setup()
		},
		reload: function () {
			this.tail !== null && this.inTail && this.list.css(this.lt, f.intval(this.list.css(this.lt)) + this.tail);
			this.tail = null; this.inTail = ! 1; this.options.reloadCallback !== null && this.options.reloadCallback(this);
			if (this.options.visible !== null) {
				var a = this, c = Math.ceil(this.clipping() / this.options.visible), b = 0, d = 0; this.list.children("li").each(function (f) {
					b += a.dimension(this, c);
					f + 1 < a.first &&(d = b)
				});
				this.list.css(this.wh, b + "px");
				this.list.css(this.lt, - d + "px")
			}
			this.scroll(this.first, ! 1)
		},
		lock: function () {
			this.locked = ! 0; this.buttons()
		},
		unlock: function () {
			this.locked = ! 1; this.buttons()
		},
		size: function (a) {
			if (a !== void 0) this.options.size = a, this.locked || this.buttons();
			return this.options.size
		},
		has: function (a, c) {
			if (c === void 0 || ! c) c = a; if (this.options.size !== null && c > this.options.size) c = this.options.size; for (var b = a; b <= c; b++) {
				var d = this.get(b);
				if (! d.length || d.hasClass("jcarousel-item-placeholder")) return ! 1
			}
			return ! 0
		},
		get: function (a) {
			return g(">.jcarousel-item-" + a, this.list)
		},
		add: function (a, c) {
			var b = this.get(a), d = 0, p = g(c);
			if (b.length === 0) for (var j, e = f.intval(a), b = this.create(a);;) {
				if (j = this.get(-- e), e <= 0 || j.length) {
					e <= 0? this.list.prepend(b): j.after(b);
					break
				}
			} else d = this.dimension(b);
			p.get(0).nodeName.toUpperCase() == "LI"?(b.replaceWith(p), b = p): b.empty().append(c);
			this.format(b.removeClass(this.className("jcarousel-item-placeholder")), a);
			p = this.options.visible !== null? Math.ceil(this.clipping() / this.options.visible): null; d = this.dimension(b, p) - d; a > 0 && a < this.first && this.list.css(this.lt, f.intval(this.list.css(this.lt)) - d + "px");
			this.list.css(this.wh, f.intval(this.list.css(this.wh)) + d + "px");
			return b
		},
		remove: function (a) {
			var c = this.get(a);
			if (c.length && !(a >= this.first && a <= this.last)) {
				var b = this.dimension(c);
				a < this.first && this.list.css(this.lt, f.intval(this.list.css(this.lt)) + b + "px");
				c.remove();
				this.list.css(this.wh, f.intval(this.list.css(this.wh)) - b + "px")
			}
		},
		next: function () {
			this.tail !== null && ! this.inTail? this.scrollTail(! 1): this.scroll((this.options.wrap == "both" || this.options.wrap == "last") && this.options.size !== null && this.last == this.options.size? 1: this.first + this.options.scroll)
		},
		prev: function () {
			this.tail !== null && this.inTail? this.scrollTail(! 0): this.scroll((this.options.wrap == "both" || this.options.wrap == "first") && this.options.size !== null && this.first == 1? this.options.size: this.first - this.options.scroll)
		},
		scrollTail: function (a) {
			if (! this.locked && ! this.animating && this.tail) {
				this.pauseAuto();
				var c = f.intval(this.list.css(this.lt)), c = ! a? c - this.tail: c + this.tail; this.inTail = ! a; this.prevFirst = this.first; this.prevLast = this.last; this.animate(c)
			}
		},
		scroll: function (a, c) { ! this.locked && ! this.animating &&(this.pauseAuto(), this.animate(this.pos(a), c))
		},
		pos: function (a, c) {
			var b = f.intval(this.list.css(this.lt));
			if (this.locked || this.animating) return b; this.options.wrap != "circular" &&(a = a < 1? 1: this.options.size && a > this.options.size? this.options.size: a);
			for (var d = this.first > a, g = this.options.wrap != "circular" && this.first <= 1? 1: this.first, j = d? this.get(g): this.get(this.last), e = d? g: g - 1, h = null, i = 0, k = ! 1, l = 0; d?-- e >= a:++ e < a;) {
				h = this.get(e);
				k = ! h.length; if (h.length === 0 &&(h = this.create(e).addClass(this.className("jcarousel-item-placeholder")), j[d? "before": "after"](h), this.first !== null && this.options.wrap == "circular" && this.options.size !== null &&(e <= 0 || e > this.options.size))) j = this.get(this.index(e)), j.length &&(h = this.add(e, j.clone(! 0)));
				j = h; l = this.dimension(h);
				k &&(i += l);
				if (this.first !== null &&(this.options.wrap == "circular" || e >= 1 &&(this.options.size === null || e <= this.options.size))) b = d? b + l: b - l
			}
			for (var g = this.clipping(), m =[], o = 0, n = 0, j = this.get(a - 1), e = a;++ o;) {
				h = this.get(e);
				k = ! h.length; if (h.length === 0) {
					h = this.create(e).addClass(this.className("jcarousel-item-placeholder"));
					if (j.length === 0) this.list.prepend(h); else j[d? "before": "after"](h);
					if (this.first !== null && this.options.wrap == "circular" && this.options.size !== null &&(e <= 0 || e > this.options.size)) j = this.get(this.index(e)), j.length &&(h = this.add(e, j.clone(! 0)))
				}
				j = h; l = this.dimension(h);
				if (l === 0) throw Error("jCarousel: No width/height set for items. This will cause an infinite loop. Aborting...");
				this.options.wrap != "circular" && this.options.size !== null && e > this.options.size? m.push(h): k &&(i += l);
				n += l; if (n >= g) break; e++
			}
			for (h = 0; h < m.length; h++) m[h].remove();
			i > 0 &&(this.list.css(this.wh, this.dimension(this.list) + i + "px"), d &&(b -= i, this.list.css(this.lt, f.intval(this.list.css(this.lt)) - i + "px")));
			i = a + o - 1; if (this.options.wrap != "circular" && this.options.size && i > this.options.size) i = this.options.size; if (e > i) {
				o = 0; e = i; for (n = 0;++ o;) {
					h = this.get(e--);
					if (! h.length) break; n += this.dimension(h);
					if (n >= g) break
				}
			}
			e = i - o + 1; this.options.wrap != "circular" && e < 1 &&(e = 1);
			if (this.inTail && d) b += this.tail, this.inTail = ! 1; this.tail = null; if (this.options.wrap != "circular" && i == this.options.size && i - o + 1 >= 1 &&(d = f.intval(this.get(i).css(! this.options.vertical? "marginRight": "marginBottom")), n - d > g)) this.tail = n - g - d; if (c && a === this.options.size && this.tail) b -= this.tail, this.inTail = ! 0; for (; a-- > e;) b += this.dimension(this.get(a));
			this.prevFirst = this.first; this.prevLast = this.last; this.first = e; this.last = i; return b
		},
		animate: function (a, c) {
			if (! this.locked && ! this.animating) {
				this.animating = ! 0; var b = this, d = function () {
					b.animating = ! 1; a === 0 && b.list.css(b.lt, 0); ! b.autoStopped &&(b.options.wrap == "circular" || b.options.wrap == "both" || b.options.wrap == "last" || b.options.size === null || b.last < b.options.size || b.last == b.options.size && b.tail !== null && ! b.inTail) && b.startAuto();
					b.buttons();
					b.notify("onAfterAnimation");
					if (b.options.wrap == "circular" && b.options.size !== null) for (var c = b.prevFirst; c <= b.prevLast; c++) c !== null && !(c >= b.first && c <= b.last) &&(c < 1 || c > b.options.size) && b.remove(c)
				};
				this.notify("onBeforeAnimation");
				if (! this.options.animation || c === ! 1) this.list.css(this.lt, a + "px"), d(); else {
					var f = ! this.options.vertical? this.options.rtl? {
						right: a
					}: {
						left: a
					}: {
						top: a
					},
					d = {
						duration: this.options.animation, easing: this.options.easing, complete: d
					};
					if (g.isFunction(this.options.animationStepCallback)) d.step = this.options.animationStepCallback; this.list.animate(f, d)
				}
			}
		},
		startAuto: function (a) {
			if (a !== void 0) this.options.auto = a; if (this.options.auto === 0) return this.stopAuto();
			if (this.timer === null) {
				this.autoStopped = ! 1; var c = this; this.timer = window.setTimeout(function () {
					c.next()
				},
				this.options.auto * 1E3)
			}
		},
		stopAuto: function () {
			this.pauseAuto();
			this.autoStopped = ! 0
		},
		pauseAuto: function () {
			if (this.timer !== null) window.clearTimeout(this.timer), this.timer = null
		},
		buttons: function (a, c) {
			if (a == null &&(a = ! this.locked && this.options.size !== 0 &&(this.options.wrap && this.options.wrap != "first" || this.options.size === null || this.last < this.options.size), ! this.locked &&(! this.options.wrap || this.options.wrap == "first") && this.options.size !== null && this.last >= this.options.size)) a = this.tail !== null && ! this.inTail; if (c == null &&(c = ! this.locked && this.options.size !== 0 &&(this.options.wrap && this.options.wrap != "last" || this.first > 1), ! this.locked &&(! this.options.wrap || this.options.wrap == "last") && this.options.size !== null && this.first == 1)) c = this.tail !== null && this.inTail; var b = this; this.buttonNext.size() > 0?(this.buttonNext.unbind(this.options.buttonNextEvent + ".jcarousel", this.funcNext), a && this.buttonNext.bind(this.options.buttonNextEvent + ".jcarousel", this.funcNext), this.buttonNext[a? "removeClass": "addClass"](this.className("jcarousel-next-disabled")).attr("disabled", a? ! 1: ! 0), this.options.buttonNextCallback !== null && this.buttonNext.data("jcarouselstate") != a && this.buttonNext.each(function () {
				b.options.buttonNextCallback(b, this, a)
			}).data("jcarouselstate", a)): this.options.buttonNextCallback !== null && this.buttonNextState != a && this.options.buttonNextCallback(b, null, a);
			this.buttonPrev.size() > 0?(this.buttonPrev.unbind(this.options.buttonPrevEvent + ".jcarousel", this.funcPrev), c && this.buttonPrev.bind(this.options.buttonPrevEvent + ".jcarousel", this.funcPrev), this.buttonPrev[c? "removeClass": "addClass"](this.className("jcarousel-prev-disabled")).attr("disabled", c? ! 1: ! 0), this.options.buttonPrevCallback !== null && this.buttonPrev.data("jcarouselstate") != c && this.buttonPrev.each(function () {
				b.options.buttonPrevCallback(b, this, c)
			}).data("jcarouselstate", c)): this.options.buttonPrevCallback !== null && this.buttonPrevState != c && this.options.buttonPrevCallback(b, null, c);
			this.buttonNextState = a; this.buttonPrevState = c
		},
		notify: function (a) {
			var c = this.prevFirst === null? "init": this.prevFirst < this.first? "next": "prev"; this.callback("itemLoadCallback", a, c);
			this.prevFirst !== this.first &&(this.callback("itemFirstInCallback", a, c, this.first), this.callback("itemFirstOutCallback", a, c, this.prevFirst));
			this.prevLast !== this.last &&(this.callback("itemLastInCallback", a, c, this.last), this.callback("itemLastOutCallback", a, c, this.prevLast));
			this.callback("itemVisibleInCallback", a, c, this.first, this.last, this.prevFirst, this.prevLast);
			this.callback("itemVisibleOutCallback", a, c, this.prevFirst, this.prevLast, this.first, this.last)
		},
		callback: function (a, c, b, d, f, j, e) {
			if (!(this.options[a] == null || typeof this.options[a] != "object" && c != "onAfterAnimation")) {
				var h = typeof this.options[a] == "object"? this.options[a][c]: this.options[a]; if (g.isFunction(h)) {
					var i = this; if (d === void 0) h(i, b, c); else if (f === void 0) this.get(d).each(function () {
						h(i, this, d, b, c)
					}); else for (var a = function (a) {
						i.get(a).each(function () {
							h(i, this, a, b, c)
						})
					},
					k = d; k <= f; k++) k !== null && !(k >= j && k <= e) && a(k)
				}
			}
		},
		create: function (a) {
			return this.format("<li></li>", a)
		},
		format: function (a, c) {
			for (var a = g(a), b = a.get(0).className.split(" "), d = 0; d < b.length; d++) b[d].indexOf("jcarousel-") != - 1 && a.removeClass(b[d]);
			a.addClass(this.className("jcarousel-item")).addClass(this.className("jcarousel-item-" + c)).css({
				"float": this.options.rtl? "right": "left", "list-style": "none"
			}).attr("jcarouselindex", c);
			return a
		},
		className: function (a) {
			return a + " " + a +(! this.options.vertical? "-horizontal": "-vertical")
		},
		dimension: function (a, c) {
			var b = g(a);
			if (c == null) return ! this.options.vertical? b.outerWidth(! 0) || f.intval(this.options.itemFallbackDimension): b.outerHeight(! 0) || f.intval(this.options.itemFallbackDimension); else {
				var d = ! this.options.vertical? c - f.intval(b.css("marginLeft")) - f.intval(b.css("marginRight")): c - f.intval(b.css("marginTop")) - f.intval(b.css("marginBottom"));
				g(b).css(this.wh, d + "px");
				return this.dimension(b)
			}
		},
		clipping: function () {
			return ! this.options.vertical? this.clip[0].offsetWidth - f.intval(this.clip.css("borderLeftWidth")) - f.intval(this.clip.css("borderRightWidth")): this.clip[0].offsetHeight - f.intval(this.clip.css("borderTopWidth")) - f.intval(this.clip.css("borderBottomWidth"))
		},
		index: function (a, c) {
			if (c == null) c = this.options.size; return Math.round(((a - 1) / c - Math.floor((a - 1) / c)) * c) + 1
		}
	});
	f.extend({
		defaults: function (a) {
			return g.extend(q, a || {
			})
		},
		intval: function (a) {
			a = parseInt(a, 10);
			return isNaN(a)? 0: a
		},
		windowLoaded: function () {
			m = ! 0
		}
	});
	g.fn.jcarousel = function (a) {
		if (typeof a == "string") {
			var c = g(this).data("jcarousel"), b = Array.prototype.slice.call(arguments, 1);
			return c[a].apply(c, b)
		} else return this.each(function () {
			var b = g(this).data("jcarousel");
			b?(a && g.extend(b.options, a), b.reload()): g(this).data("jcarousel", new f(this, a))
		})
	}
})(jQuery);

