/*
* Name: jquery.eScroller
* Version: 0.1
*/
(function($) {
    $.eScroller = {
        defaults: {
            controls: ".easyScrollerControls",
			menu: false,
			addControl: "",
			specialScreenContentClass: "videoClip",
			dynamicHeight: false,
            width: 492,
			hasDecoration: false,
			decoratedScreenIdx: 1,
			decoration: "",
            height: "auto",
			slideDuration: 350,
			easingType: "swing",
			goToHash: true,
            nextCallback: function() { },
            prevCallback: function() { }
        },
        buildScroller: function(options) {
            return this.each(function() {
                this.options = {};
                $.extend(this.options, $.eScroller.defaults);
                $.extend(this.options, options);
                var eScroller = this;
                var controls = $(eScroller.options.controls);
                eScroller.idx = 1;
                eScroller.scrollTo = 0;
                eScroller.elements = $(eScroller).children();
                eScroller.elements.addClass("easyScreen");
	
                $(eScroller).children().each(function() { $(this).wrap("<div class='easyScreenContainer'></div>"); });
                eScroller.elements = $(eScroller).children();
				eScroller.singleScreenWidth = eScroller.options.width;
				$(eScroller.elements).css({
					width: eScroller.singleScreenWidth,
					"float": "left"
				});
				
                this.screensWidth = (eScroller.singleScreenWidth * eScroller.elements.size()) + eScroller.elements.size();
                eScroller.screensCount = eScroller.elements.size();
				$(eScroller).css({
					position: "relative",
					overflow: "hidden",
					width: eScroller.options.width,
					height: eScroller.options.height
				});
                var easyScrollerSW = $("<div class='easyScreensWrapper'/>").css({
					position: "relative",
					width: eScroller.screensWidth
				});
                $(eScroller.elements).wrapAll(easyScrollerSW);
                eScroller.easyScrollerSW = $(eScroller).find(".easyScreensWrapper");
				
				/**/
				eScroller.decHelper = "." + $(eScroller).parent().attr("class");
				eScroller.decoration = $(eScroller.options.decoration);
				eScroller.decorationHeight = eScroller.decoration.height();
				/*
				if (eScroller.options.hasDecoration == true) {
					if (eScroller.idx == eScroller.options.decoratedScreenIdx) {
						eScroller.decoration.find("img").show();
						$(eScroller).css({
							height: eScroller.elements.eq(eScroller.idx - 1).height()
						});
						$(eScroller.decHelper).css({
							paddingBottom: eScroller.decorationHeight
						});
						eScroller.decoration.css({
							marginTop: -eScroller.decorationHeight
						});
					}
					else {
						eScroller.decoration.find("img").hide();
						$(eScroller).css({
							height: eScroller.elements.eq(eScroller.idx - 1).height() 
						});
						eScroller.decoration.css({
							marginTop: 0
						});
					}
				}
				else {
					eScroller.decoration.find("img").hide();
					eScroller.decoration.css({
						marginTop: 0
					});
				}
				*/
				if (eScroller.options.dynamicHeight) {
					$(eScroller).css({
						height: eScroller.elements.eq(eScroller.idx - 1).height()
					});
					/*
					if (eScroller.options.hasDecoration == true) {
						if (eScroller.idx == eScroller.options.decoratedScreenIdx) {
							$(eScroller.decHelper).stop().animate({
								paddingBottom: eScroller.decorationHeight
							});
						}
						else {
							$(eScroller.decHelper).stop().animate({
								paddingBottom: 0
							});
						}
					}
					*/
				}
                $(eScroller).eDynamicHeight();
				$(eScroller).eMenu();
				$(eScroller).eByIndex();
                $(eScroller).eActivateControls();
                $(eScroller).eControlsHandler();
				
            });
        },
		/* ************************************* */
		dynamicHeight: function() {
			var eScroller = $(this).get(0);
			var additionH;
			var decorationAnimFinish = false;
			/*
			if (eScroller.options.hasDecoration == true) {
				if (eScroller.idx == eScroller.options.decoratedScreenIdx) {
					$(eScroller.decoration).find("img").show("fade", {}, 500, function() { decorationAnimFinish = true; });
					additionH = eScroller.decorationHeight;
					eScroller.decoration.css({
						marginTop: -eScroller.decorationHeight
					});
				}
				else {
					
					if ( decorationAnimFinish == true ) {
						$(eScroller.decoration).find("img").hide("fade");
					}
					else {
						$(eScroller.decoration).find("img").hide();
					}
					additionH = 0;
					eScroller.decoration.css({
						marginTop: 0
					});
				}
				
			}
			*/
			if (eScroller.options.dynamicHeight) {
				$(eScroller).stop().animate({
					height: eScroller.elements.eq(eScroller.idx - 1).height()
				});
				/*
				if (eScroller.options.hasDecoration == true) {
					if (eScroller.idx == eScroller.options.decoratedScreenIdx) {
						$(eScroller.decHelper).stop().animate({
							paddingBottom: eScroller.decorationHeight
						});
					}
					else {
						$(eScroller.decHelper).stop().animate({
							paddingBottom: 0
						});
					}
				}
				*/
			}
        },
		/* ************************************* */
		activateControls: function() {
            var eScroller = $(this).get(0);
            var controls = $(eScroller.options.controls);
            controls.find(".prev").bind("click", function() { $(eScroller).ePrev(); return false });
            controls.find(".next").bind("click", function() { $(eScroller).eNext(); return false });
			$(controls).find("span").hover(
				function(){
					$(this).addClass("hovered");
				},
				function(){
					$(this).removeClass("hovered");
				}
			);
			$(controls).find("span").mousedown(function(){
				$(this).addClass("pressed");
			});
			$(controls).find("span").mouseup(function(){
				$(this).removeClass("pressed");
			});
        },
        controlsHandler: function() {
            var eScroller = $(this).get(0);
            var controls = eScroller.options.controls;
			
            if (eScroller.idx == eScroller.screensCount) {
                $(controls).find(".next").addClass("disabled");
            } else {
                $(controls).find(".next").removeClass("disabled");
            }
            if (eScroller.idx == 1) {
                $(controls).find(".prev").addClass("disabled");
            } else {
                $(controls).find(".prev").removeClass("disabled");
            }
            $(controls).find(".screen").removeClass("selected");
            $(controls).find(".screen").eq(eScroller.idx - 1).addClass("selected");
            $(controls).find(".idx").html(eScroller.idx + " / " + eScroller.screensCount);
			//$(eScroller.options.menu).children().eq(eScroller.idx - 1).addClass("current"); //This selects one unnecessary element if the list is separated. So it's done in window.load().
        },
        next: function() {
            var eScroller = $(this).get(0);
            if (eScroller.idx == eScroller.screensCount) {
                $(eScroller).eControlsHandler();
                return;
            }
            if (eScroller.options.nextCallback) eScroller.options.nextCallback();
            eScroller.scrollTo -= eScroller.singleScreenWidth;
			if ((eScroller.scrollTo < -eScroller.screensWidth + eScroller.options.width))
				eScroller.scrollTo = -eScroller.screensWidth + eScroller.options.width;
			$(eScroller.easyScrollerSW).stop().animate({
				marginLeft: eScroller.scrollTo
			}, eScroller.options.slideDuration, eScroller.options.easingType);
            eScroller.idx += 1;
            $(this).eControlsHandler();
        },
        prev: function() {
            var eScroller = $(this).get(0);
            if (eScroller.idx == 1) {
                $(eScroller).eControlsHandler();
                return;
            }
            if (eScroller.options.prevCallback) eScroller.options.prevCallback();
            eScroller.scrollTo += eScroller.singleScreenWidth;
			if (eScroller.scrollTo >= 0) eScroller.scrollTo = 0;
			$(eScroller.easyScrollerSW).stop().animate({
				marginLeft: eScroller.scrollTo
			}, eScroller.options.slideDuration, eScroller.options.easingType);
            eScroller.idx -= 1;
            $(this).eControlsHandler();
        },
        byIndex: function() {
            var eScroller = $(this).get(0);
            var controls = eScroller.options.controls;
            var screens = $(controls).find(".screenIndex");
            if (screens) {
                function getScreen(i) {
                    eScroller.scrollTo = -(eScroller.singleScreenWidth * (i - 1));
					if (eScroller.scrollTo < -eScroller.screensWidth + eScroller.options.width)
						eScroller.scrollTo = -eScroller.screensWidth + eScroller.options.width;
					$(eScroller.easyScrollerSW).stop().animate({
						marginLeft: eScroller.scrollTo
					}, eScroller.options.slideDuration, eScroller.options.easingType);
                    eScroller.idx = Math.floor(i);
                    $(eScroller).eControlsHandler();
                }
                var n = 0;
				var specialScreenClass = eScroller.options.specialScreenContentClass;
                for (var i = 1; i <= eScroller.screensCount; i++) {
                    n++;
                    var s = $("<span class='screen'><b rel='" + n + "'><\/b><\/span>").bind("click", function() {
                        getScreen($(this).children().attr("rel"));
                    });
                    screens.append(s);
					if (eScroller.elements.eq(i - 1).children().children().attr("class") == specialScreenClass) {
						s.children().addClass("screenIndex-special");
					}
                };
            }
        },
		menu: function() {
			var eScroller = $(this).get(0);
            var menu = eScroller.options.menu;
            var items = $(menu).find("a");
			var addControl = eScroller.options.addControl;
			var addControlItems = $(addControl).find("a");
			
			if (items) {
				function getItem(i, mi) {
					eScroller.scrollTo = -(eScroller.singleScreenWidth * (i - 1));
					items.parent().removeClass("current");
						mi.parent().addClass("current");
					if (eScroller.scrollTo < -eScroller.screensWidth + eScroller.options.width)
						
						eScroller.scrollTo = -eScroller.screensWidth + eScroller.options.width;
					$(eScroller.easyScrollerSW).stop().animate({
						marginLeft: eScroller.scrollTo
					}, eScroller.options.slideDuration, eScroller.options.easingType, function() {
						
					});
					eScroller.idx = Math.floor(i);
					$(eScroller).eControlsHandler();
					$(eScroller).eDynamicHeight();
				}
				
				// Collect hashes (anchors) for named links instead of numbers.
				var namedItemsHrefs = $.map(items, function(element) {
						return $(element).attr("href").slice(1);
					}),
					namedItemsNames = [];
				$.each(namedItemsHrefs, function(index, element) {
					namedItemsNames[element] = index + 1;
				});

				var myfunc = function() {
					if (eScroller.options.goToHash == true) {
						var hash = window.location.hash;
						var itemIndex = namedItemsNames[hash.slice(1)];
						if (itemIndex) {
							var mi1 = items.eq(itemIndex - 1);
						} else {
							itemIndex = 1;
							var mi1 = items.eq(0);
						};
						if (itemIndex <= eScroller.screensCount) {
							getItem(itemIndex, mi1);
						};
					}
				};
				$(window).load(myfunc);
				if ("onhashchange" in window) {
					$(window).bind("hashchange", myfunc);
				};
				
				$(items).bind("click", function() {
					var mi = $(this);
					
					if (namedItemsNames[$(this).attr("href").slice(1)] <= eScroller.screensCount ) {
						//$("html, body").animate({ scrollTop: 0 }, "fast"); //Animate window to top.
						getItem(namedItemsNames[$(this).attr("href").slice(1)], mi);
					}
					else {
						return false;
					}
				});

				$(addControlItems).bind("click", function() {
					var mi = items.eq(namedItemsNames[$(this).attr("href").slice(1)] - 1);
					
					if (namedItemsNames[$(this).attr("href").slice(1)] <= eScroller.screensCount ) {
						getItem(namedItemsNames[$(this).attr("href").slice(1)], mi);
					}
					else {
						return false;
					}
				});
			}
			
        }
	};
    $.fn.eScroller = $.eScroller.buildScroller;
	$.fn.eActivateControls = $.eScroller.activateControls;
    $.fn.eControlsHandler = $.eScroller.controlsHandler;
	$.fn.eDynamicHeight = $.eScroller.dynamicHeight;
	$.fn.eNext = $.eScroller.next;
    $.fn.ePrev = $.eScroller.prev; 
    $.fn.eByIndex = $.eScroller.byIndex;
	$.fn.eMenu = $.eScroller.menu;
	
})(jQuery);
