/*
 * jQuery liquid carousel v1.0
 * http://www.nikolakis.net
 *
 * Copyright 2010, John Nikolakis
 * Free to use under the GPL license.
 * http://www.gnu.org/licenses/gpl.html
 *
 */

(function($){
	$.fn.liquidcarousel = function(options) {
	var defaults = {
		height: 150,
		duration: 100,
		slide: true,
		autoMargin: true,
		hidearrows: true
	};
	var options = $.extend(defaults, options);
	var ie6 = ($.browser.msie && $.browser.version < 7);

    this.each(function() {

			var divobj = $(this);

//			$(divobj).height(options.height);
			$(divobj).css('overflow', 'hidden');

//			$('> .scrlist', divobj).height(options.height);
			$('> .scrlist', divobj).css('overflow', 'hidden');
			$('> .scrlist', divobj).css('float', 'left');

//			$('> .scrlist > ul', divobj).height(options.height);
//			$('> .scrlist > ul', divobj).css('float', 'left');
			$('> .scrlist > ul', divobj).css('overflow', 'hidden');
			$('> .scrlist > ul', divobj).css('margin', '0');
			$('> .scrlist > ul', divobj).css('padding', '0');
			$('> .scrlist > ul', divobj).css('display', 'block');

//			$('> .scrlist > ul > li', divobj).height(options.height);
//			$('> .scrlist > ul', divobj).height(options.height);
			if (defaults.autoMargin) {
				$('> .scrlist > ul > li', divobj).css('display', 'inline');
				$('> .scrlist > ul > li', divobj).css('float', 'left');
			} else {
				$('> .scrlist > ul > li', divobj).css('display', 'inline');
				$('> .scrlist > ul > li', divobj).css('float', 'left');
				var l = 0;
				jQuery.each($('> .scrlist > ul > li', divobj), function(i, val) {
					$(val).css('left', l+'px');
					l = l + $(val).outerWidth(true);
				});
				if (!ie6) {
					$('> .scrlist > ul', divobj).width(l);
				} else {
					setTimeout( function() {
						$('> .scrlist > ul', divobj).width(l);
					}, 1000);
				};
			}
			$('> .previous', divobj).css({'display':'block', 'visibility':'visible'});
			$('> .next', divobj).css({'display':'block', 'visibility':'visible'});


			var originalmarginright = parseInt($('> .scrlist > ul > li', divobj).css('marginRight'));
			var originalmarginleft = parseInt($('> .scrlist > ul > li', divobj).css('marginLeft'));
			var visiblelis = 0;
			var totallis = $('> .scrlist > ul > li', this).length;
			var currentposition = 0;
			var liwidth = $('> .scrlist > ul > li:first', divobj).outerWidth(true);
			var additionalmargin = 0;
			var totalwidth = liwidth + additionalmargin;

			$(window).resize(function(e){
				var divwidth = $(divobj).width();
				var availablewidth = (divwidth - $('> .previous', divobj).outerWidth(true) - $('> .next', divobj).outerWidth(true));

				previousvisiblelis = visiblelis;
				visiblelis = Math.floor((availablewidth / liwidth));

				if (visiblelis < totallis) {
					additionalmargin = Math.floor((availablewidth - (visiblelis * liwidth))/visiblelis);
				} else {
					additionalmargin = Math.floor((availablewidth - (totallis * liwidth))/totallis);
				}
				halfadditionalmargin = Math.floor(additionalmargin/2);
				totalwidth = liwidth + additionalmargin;

				if (defaults.autoMargin) {
					$('> .scrlist > ul > li', divobj).css('marginRight', originalmarginright + halfadditionalmargin);
					$('> .scrlist > ul > li', divobj).css('marginLeft',originalmarginleft + halfadditionalmargin);
				}

				if (defaults.autoMargin) {
					if (visiblelis > previousvisiblelis  || totallis <= visiblelis) {
						currentposition -= (visiblelis-previousvisiblelis);
						if (currentposition < 0 || totallis <= visiblelis ) {
							currentposition = 0;
						}
					}
					$('> .scrlist > ul', divobj).css('marginLeft', -(currentposition * totalwidth));
				} else {
					if (visiblelis > previousvisiblelis  || liwidth <= visiblelis) {
						currentposition -= (visiblelis-previousvisiblelis);
						if (currentposition < 0 || liwidth <= visiblelis ) {
							currentposition = 0;
						}
					}
					if (currentposition > 0) {
//					$('> .scrlist > ul', divobj).css('marginLeft', -(currentposition * liwidth));
						if ((currentposition + visiblelis) * liwidth >= totallis * liwidth) {
							$('> .scrlist > ul', divobj).stop().css({'marginLeft': -((totallis) * liwidth - availablewidth)}, options.duration);
						} else {
							$('> .scrlist > ul', divobj).stop().css({'marginLeft': -((totallis) * liwidth - availablewidth)}, options.duration);
						}
					}
				}

				if (visiblelis >= totallis || ((divwidth >= (totallis * liwidth)) && options.hidearrows) ) {
					if (options.hidearrows) {
						$('> .previous', divobj).hide();
						$('> .next', divobj).hide();

						additionalmargin = Math.floor((divwidth - (totallis * liwidth))/totallis);
						halfadditionalmargin = Math.floor(additionalmargin/2);
						totalwidth = liwidth + additionalmargin;
						if (defaults.autoMargin) {
							$('> .scrlist > ul > li', divobj).css('marginRight', originalmarginright + halfadditionalmargin);
							$('> .scrlist > ul > li', divobj).css('marginLeft', originalmarginleft + halfadditionalmargin);
						}
					}
					$('> .scrlist', divobj).width(totallis * totalwidth);
					$('> ul', divobj).width(totallis * totalwidth);
					$('> .scrlist', divobj).css('marginLeft', 0);
					currentposition = 0;
				} else {
					$('> .previous', divobj).show();
					$('> .next', divobj).show();
					$('> .scrlist', divobj).width(visiblelis * totalwidth);
					$('> ul', divobj).width(visiblelis * totalwidth);
				}
				PrevNext();
			});

			function nextClick(e){

				if (totallis <= visiblelis) {
					currentposition = 0;
				} else if ((currentposition + (visiblelis*2)) < totallis) {
					currentposition += visiblelis;
				} else if ((currentposition + (visiblelis*2)) >= totallis -1) {
					currentposition = totallis - visiblelis;
				}

				$('> .scrlist > ul', divobj).stop();
				if (options.slide) {
					if (defaults.autoMargin) {
						$('> .scrlist > ul', divobj).stop().animate({'marginLeft': -(currentposition * totalwidth)}, options.duration);
					} else {
						if ((currentposition + visiblelis) * liwidth >= totallis * liwidth) {
							var divwidth = $(divobj).width();
							var availablewidth = (divwidth - $('> .previous', divobj).outerWidth(true) - $('> .next', divobj).outerWidth(true));
							$('> .scrlist > ul', divobj).stop().animate({'marginLeft': -((totallis) * liwidth - availablewidth)}, options.duration);
						} else {
							$('> .scrlist > ul', divobj).stop().animate({'marginLeft': -(currentposition * liwidth)}, options.duration);
						}
					}
				} else {
					for(var i=currentposition; i<currentposition+visiblelis; i++) {
						$('> .scrlist > ul > li:eq('+i+') > div', divobj).hide().delay((currentposition+visiblelis-i)*50).fadeIn(200);
					}
					$('> .scrlist > ul', divobj).css({'marginLeft': -(currentposition * totalwidth)}, options.duration);
				}


				PrevNext();
			};

			function prevClick(e){

				if ((currentposition - visiblelis) > 0) {
					currentposition -= visiblelis;
				} else if ((currentposition - (visiblelis*2)) <= 0) {
					currentposition = 0;
				}

				$('> .scrlist > ul', divobj).stop();
				if (options.slide) {
					$('> .scrlist > ul', divobj).stop().animate({'marginLeft': -(currentposition * totalwidth)}, options.duration);
				} else {
					for(var i=currentposition; i<currentposition+visiblelis; i++) {
						$('> .scrlist > ul > li:eq('+i+') > div', divobj).hide().delay((i-currentposition)*50).fadeIn(200);
					}
					$('> .scrlist > ul', divobj).css({'marginLeft': -(currentposition * totalwidth)}, options.duration);
				}

				PrevNext();
			};

			function nextDblClick(e){
//				e.preventDefault();
//				clearSelection();
			};

			function prevDblClick(e){
//				e.preventDefault();
//				clearSelection();
			};

			$('> .next', divobj).unbind('click', nextClick);
			$('> .previous', divobj).unbind('click', prevClick);
			$('> .next', divobj).bind('click', nextClick);
			$('> .previous', divobj).bind('click', prevClick);

			function PrevNext() {
				$previous = $('> .previous', divobj);
				$next = $('> .next', divobj);
				$previous.unbind('click', prevClick);
				$next.unbind('click', nextClick);
				$ul = $('> .scrlist > ul', divobj)
				
					if (currentposition <= 0) {
						$previous.css({'cursor':'default', 'opacity':'0.2'});
						$previous.addClass('dead');
					} else {
						$previous.bind('click', prevClick);
						$previous.css({ 'cursor':'pointer', 'opacity':''});
						$previous.removeClass('dead');
					}
					if (currentposition + visiblelis >= totallis) {
						$next.css({'cursor':'default', 'opacity':'0.2'});
						$next.addClass('dead');
					} else {
						$next.bind('click', nextClick);
						$next.css({ 'cursor':'pointer', 'opacity':''});
						$next.removeClass('dead');
				}

			}

			function clearSelection() {
				if (document.selection && document.selection.empty) {
					document.selection.empty();
				} else if (window.getSelection) {
					var sel = window.getSelection();
					sel.removeAllRanges();
				}
			}

			PrevNext();
			$(window).resize();

    });


 };
})(jQuery);
