;(function($) {
	$.fn.slidingImageGallery = function(settings) {
		//Static Variables
		var LIMIT = 250;
		var BLOCK_SIZE = 75;
		var STRIPE_SIZE = 50;
		var DEFAULT_DELAY = 10000;
		var DURATION = 800;
		var DEFAULT_SPEED = 300;
		var TEXT_SPEED = 600;
		var SCROLL_DELAY = 0.1;		
		var MAX_SCROLL_SPEED = 600;
		//Event Triggers
		var AUTO_ADJUST = "auto_adjust";
		var UPDATE_TEXT = "update_text";
		var UPDATE_BUTTONS = "update_buttons";		
		var SHOW_SCROLLBAR = "show_scrollbar";
		var HIDE_SCROLLBAR = "hide_scrollbar";
		var MOVE_KNOB = "update_knob";
		//Default Variables
		var defaults = {
			width:670,
			height:300,
			currentItem:0,			
			randomize:false,
			autoPlay:true,
			playOnce:false,			
			//Button
			buttonPosition:"left",		//left, right
			buttonWidth:250,
			buttonHeight:60,
			buttonDisplayLength:5,
			buttonShowArrow:true,
			autoAdjust:true,
			//Transition			
			delay:DEFAULT_DELAY,
			transition:"random",		//EFFECTS
			transitionSpeed:DURATION,
			easing:"",
			//Timer
			showTimer:true,
			timerAlign:"bottom",		//bottom, top
			pauseRollOver:false,
			//Image
			autoCenter:true,
			//Text
			textRollOver:false,
			textEffect:"fade",			//TEXT_EFFECTS
			textSync:true,
			//Effects
			blockSize:BLOCK_SIZE,
			verticalSize:STRIPE_SIZE,
			horizontalSize:STRIPE_SIZE,
			blockDelay:35,
			verticalStripeDelay:90,
			horizontalStripeDelay:180,
			//ScrollBar
			scrollType:"mouse_move",	//mouse_click, mouse_over, mouse_move
			showScrollbar:true,
			moveBy1:true,
			//Script Used Globals
			oldItem:-1,
			button:"next"
		};
		//Settings
		var settings = $.extend({}, defaults, settings);
		//Image Area Width
		var IMAGE_WIDTH = (settings.width-settings.buttonWidth);		
		var SCROLL_RATE = settings.buttonDisplayLength;
		//Effects
		var ei = 0;
		var EFFECTS = {
			"block.top":ei++,	"block.right":ei++, 	"block.bottom":ei++,	"block.left":ei++,		"block.drop":ei++,		
			"diag.fade":ei++,	"diag.exp":ei++,		"rev.diag.fade":ei++,	"rev.diag.exp":ei++,	"block.fade":ei++,
			"block.exp":ei++,	"block.top.zz":ei++,	"block.bottom.zz":ei++,	"block.left.zz":ei++,	"block.right.zz":ei++,		
			"spiral.in":ei++,	"spiral.out":ei++,		"vert.tl":ei++,			"vert.tr":ei++,			"vert.bl":ei++,
			"vert.br":ei++,		"fade.left":ei++,		"fade.right":ei++,		"alt.left":ei++,		"alt.right":ei++,
			"blinds.left":ei++,	"blinds.right":ei++,	"horz.tl":ei++,			"horz.tr":ei++,			"horz.bl":ei++,
			"horz.br":ei++,		"fade.top":ei++,		"fade.bottom":ei++,		"alt.top":ei++,			"alt.bottom":ei++,
			"blinds.top":ei++,	"blinds.bottom":ei++,	"none":ei++,			"fade":ei++,			"h.slide":ei++,
			"v.slide":ei++,		"random":ei++
		};
		//Text Effects
		var TEXT_EFFECTS = {"fade":0, "down":1, "right":2, "up":3, "left":4, "none":5};		
		//Create Banner
		var container = $(this);
		container.addClass("sliding-image-gallery");
		container.css({visibility:"visible"});
		return this.each(function() {				
			var imageGallery = new SlidingImageGallery($(this), settings);
			imageGallery.init();
		});				
		//Get Positive Number
		function getPosNumber(val, defaultVal) {
			if (!isNaN(val) && val>0) {
				return val;
			}
			return defaultVal;
		}	
		//SlidingImageGallery Class
		function SlidingImageGallery($obj, settings) {
			//Variables			
			var $banner;
			var $screen;
			var $items;
			var $list;
			var $listItems;
			var $button;
			var $arrow;
			var arrowWidth;
			var itemLength = 0;
			var vStripes;
			var hStripes;
			var blocks;	
			var range;
			var dest;
			var $preloader;
			var $timer;
			var $textBox;
			var $innerBg;
			var $innerText;
			var $strip;
			var $mainLink;
			var blockEffect = false;
			var hStripeEffect = false;
			var vStripeEffect = false;
			var timerId = null;
			var delay;
			var scrollId = null;
			var prevSlots;
			var nextSlots;
			var maxSlots;
			var pos = 0;
			this.$el = $obj;
			//Init
			this.init = function() {
				$banner = $obj;
				$screen = $obj.find(".screen");
				$items = $obj.find(".items");
				$list = $items.find(">ul:first");
				$listItems = $list.find(">li");
				itemLength = $listItems.size();
				//Variables
				maxSlots = itemLength-settings.buttonDisplayLength;
				prevSlots = 0;
				nextSlots = maxSlots;
				//Randomize Items
				if (settings.randomize) {
					randomizeItems();
				}	
				$button = $listItems.find(".button");
				//Banner Dimensions
				$banner.css({width:settings.width, height:settings.height});
				//Effect
				blockEffect = hStripeEffect = vStripeEffect = false;
				checkEffect(EFFECTS[settings.transition]);				
				//Create Main Screen
				createMainScreen();
				//Create Buttons
				createButtons();
				//Show / Hide Content
				if (settings.textRollOver) {
					$banner.hover(displayText, hideText);
				} else {
					$banner.bind(UPDATE_TEXT, updateText);
				}
				//Pause On RollOver
				if (settings.pauseRollOver) {
					$banner.hover(stopRotate, startRotate);
				}				
				//Effect
				var bgColor = $banner.css("background-color");
				if (vStripeEffect) {
					vStripes = new VertStripes(this, IMAGE_WIDTH, settings.height, getPosNumber(settings.verticalSize, STRIPE_SIZE), bgColor, settings.transitionSpeed, getPosNumber(settings.verticalStripeDelay, 90));
				} 
				if (hStripeEffect) {
					hStripes = new HorzStripes(this, IMAGE_WIDTH, settings.height, getPosNumber(settings.horizontalSize, STRIPE_SIZE), bgColor, settings.transitionSpeed, getPosNumber(settings.horizontalStripeDelay, 180));
				} 
				if (blockEffect) {
					blocks = new Blocks(this, IMAGE_WIDTH, settings.height, getPosNumber(settings.blockSize, BLOCK_SIZE), bgColor, settings.transitionSpeed, getPosNumber(settings.blockDelay, 35));
				}
				//Load Images
				loadImage(0);
				//Load Content
				loadContent();
			};
			//Create Main Screen
			var createMainScreen = function() {
				var content = "	<div class='preloader'></div>\
								<div class='timer'></div>\
							   	<div class='textbox'>\
							   		<div class='inner-bg'></div>\
									<div class='inner-text'></div>\
							   	</div>";
				$screen.append(content).css({width:IMAGE_WIDTH, height:settings.height});
				$preloader = $screen.find(".preloader");
				$timer = $screen.find(".timer").data("pct", 1);
				$textBox = $screen.find(".textbox");
				$innerBg = $textBox.find(".inner-bg");
				$innerText = $textBox.find(".inner-text");
				$strip = $("<div class='strip'></div>");
				//Create Timer Bar
				createTimerBar();
				//Strip
				if (settings.transition=="h.slide") {
					$screen.append($strip);
					$strip.css({width:IMAGE_WIDTH*2, height:settings.height});
					$listItems.removeAttr("effect");
				} else if (settings.transition=="v.slide"){
					$screen.append($strip);
					$strip.css({width:IMAGE_WIDTH, height:2*settings.height});
					$listItems.removeAttr("effect");
				} else {
					$mainLink = $("<a href='#'></a>");
					$screen.append($mainLink);
				}	
			};
			//Create Timer Bar
			var createTimerBar = function() {
				if (settings.showTimer) {
					$timer.css("top", settings.timerAlign.toLowerCase()=="top" ? 0 : (settings.height-$timer.height())).css("visibility", "visible");
				} else {
					$timer.hide();
				}
			};
			//Create Button Panel
			var createButtons = function() {
				if (settings.buttonShowArrow) {
					$arrow = $("<div>&nbsp;</div>").attr("id", ("arrow-"+settings.buttonPosition)).height(settings.buttonHeight);
					$($button.get(settings.currentItem)).append($arrow);
					arrowWidth = $arrow.width()+10;
				}
				$button.css({width:settings.buttonWidth, height:(settings.buttonHeight-1)});		
				$list.height(itemLength*$listItems.height());
				$listItems.css({width:$button.width()});
				$items.css({width:$listItems.width()+arrowWidth, height:settings.buttonDisplayLength*$listItems.outerHeight()}).click(selectItem);								
				range = $list.height()-$items.height();
				//Change Button Location
				if (settings.buttonPosition=="left") {
					$screen.css("left", settings.buttonWidth);
				} else {
					$items.css("left", settings.width-$items.width());
					$button.css("left", arrowWidth);
					$screen.css("left", 0);
				}
				//Align Button Text Vertically
				$button.each(function() {
					//Button Holder
					var buttonHolder = $(this).parent();
					//Button Text
					var txt = $(this).find("p");
					txt.css({marginTop:(settings.buttonHeight-txt.outerHeight())/2});
					//Image
					var $img = buttonHolder.find(">a:first").attr("href");
					//Effect
					var itemEffect = EFFECTS[$(this).attr("effect")];
					if (itemEffect==undefined || itemEffect==EFFECTS["h.slide"] || itemEffect==EFFECTS["v.slide"]) {
						itemEffect = EFFECTS[settings.transition];
					} else {
						checkEffect(itemEffect);
					}
					//Set Data
					buttonHolder.data({imgurl:$img, effect:itemEffect, delay:getPosNumber($(this).attr("delay"), settings.delay)});
					//Set Text Data					
					var display = buttonHolder.find(">div:hidden").length>0 ? "block" : "none";
					var padding = $innerText.outerHeight() - $innerText.height();
					var x = 0, y = 0, textWidth = 0, textHeight = 0, color = "#FFF", bgcolor = "#000", borderradius;
					if (buttonHolder.find("div:hidden").length>0) {
						var $content = buttonHolder.find(">div:hidden");
						textWidth = getPosNumber(parseInt($content.css("width")), IMAGE_WIDTH)-padding;
						textHeight = getPosNumber(parseInt($content.css("height"))-padding, 0);					
						$innerText.width(textWidth).html($content.html());
						if (textHeight<$innerText.height()) {
							textHeight = $innerText.height();
						}
						x = $content.css("left");
						y = $content.css("top");
						textWidth += padding;
						textHeight += padding+1;
						color = $content.css("color");
						bgcolor = $content.css("background-color");
						borderradius = !isNaN($content.attr("radius")) ? parseInt($content.attr("radius")) : 0;
					}
					buttonHolder.data("textbox", {display:display, x:x, y:y, w:textWidth, h:textHeight, color:color, bgcolor:bgcolor, borderradius:borderradius});
				});
				//Make Visible Text Area
				$innerText.html("").css({width:"auto", height:"auto"});
				$textBox.css("visibility", "visible");
				//Button Over CSS
				$listItems.hover(function() {
								if (settings.currentItem != $(this).index()) {
									$(this).find(".button").addClass("over");
								}
							}, function() {$(this).find(".button").removeClass("over");});
				//Scroll Bar
				switch(settings.scrollType) {
					case "mouse_click":
						createDropDownButtons();
						$upPane.click(prevThumbs).find("#up-btn").css("cursor","pointer");
						$downPane.click(nextThumbs).find("#down-btn").css("cursor","pointer");
						break;
					case "mouse_over":
						createDropDownButtons();
						$upPane.hover(scrollUp, stopThumbList);
						$downPane.hover(scrollDown, stopThumbList);
						break;
					case "mouse_move":
						$items.mousemove(mousemoveScroll);
						break;
					default:
						settings.moveBy1 = true;
						$listItems.bind("click", itemClick);					
				}		
				if (settings.showScrollbar && range>0) {
					createScrollbar();
				}
				//Auto Adjust Thumbs
				if (settings.autoAdjust) {	
					$banner.bind(AUTO_ADJUST, adjustThumbs);
					$items.hover(function() {$banner.unbind(AUTO_ADJUST);}, function() {$banner.bind(AUTO_ADJUST, adjustThumbs);});
				}
			};
			//Load Content
			var loadContent = function() {
				//Auto Adjust Thumbs
				$banner.trigger(AUTO_ADJUST);
				//Play Once
				if (settings.playOnce) {
					pauseLast();
				}
				//Change Old Button
				if (settings.oldItem>=0) {
					var $oldItem = $($listItems.get(settings.oldItem));
					var $oldButton = $oldItem.find(".selected");
					$oldButton.removeClass("selected").removeClass("selected-"+settings.buttonPosition);
					$oldButton.css({width:settings.buttonWidth});
				}
				//Change Current Button
				var $selectedItem = $($listItems.get(settings.currentItem));
				var $selectedButton = $selectedItem.find(".button");			
				$selectedButton.removeClass("over").addClass("selected").addClass("selected-"+settings.buttonPosition).append($arrow);
				$selectedButton.css({width:settings.buttonWidth+arrowWidth});
				//Set Delay
				delay =	$selectedItem.data("delay");
				//Reset Text
				resetText();
				if (!settings.textSync) {
					$banner.trigger(UPDATE_TEXT);
				}
				//Set Link
				if ($mainLink) {
					var $currLink = $($selectedItem.find(">a").get(1));
					var href = $currLink.attr("href");
					if (href) {
						$mainLink.unbind("click", false).css("cursor","pointer").attr({href:href, target:$currLink.attr("target")});
					} else {
						$mainLink.click(false).css("cursor","default");
					}
				}
				//Load Image
				if ($selectedItem.data("img")) {
					$preloader.hide();
					displayContent($selectedItem.data("img"));
				} else {	
					//Load New Image
					var $img = $("<img class='main-img'/>");				
					$img.load(function() {
							$preloader.hide();
							storeImage($selectedItem, $(this));
							displayContent($(this));
						}
					).error(function() {
							alert("Error loading image!");
						}
					);
					$preloader.show();
					$img.attr("src", $selectedItem.data("imgurl"));
				}	
			};
			//Display Content
			var displayContent = function($img) {				
				if (vStripeEffect) {
					vStripes.clear();
					setPrevious();
				}
				if (hStripeEffect) {
					hStripes.clear();
					setPrevious();
				}
				if (blockEffect) {
					blocks.clear();
					setPrevious();
				}	
				var effect = $($listItems.get(settings.currentItem)).data("effect");	
				if (effect == EFFECTS["none"] || effect == undefined) {
					showContent($img);
					return;
				} else if (effect == EFFECTS["fade"]) {
					fadeInContent($img);
					return;
				} else if (effect == EFFECTS["h.slide"]) {
					slideContent($img, "left", IMAGE_WIDTH);
					return;
				} else if (effect == EFFECTS["v.slide"]) {					
					slideContent($img, "top", settings.height);
					return;
				}				
				if (effect == EFFECTS["random"]) {
					effect = Math.floor(Math.random() * (ei - 5));
				}
				if (effect <= EFFECTS["spiral.out"]) {
					blocks.displayContent($img, effect);
				} else if (effect <= EFFECTS["blinds.right"]) {
					vStripes.displayContent($img, effect);
				} else {
					hStripes.displayContent($img, effect);				
				}
			};
			//Set Previous
			var setPrevious = function() {
				if (settings.oldItem>=0) {
					var currSrc = $mainLink.find("img#curr-img").attr("src");
					var prevSrc = $($listItems.get(settings.oldItem)).data("imgurl");
					if (currSrc != prevSrc) {
						$mainLink.find("img.main-img").attr("id","").hide();
						var $img = $mainLink.find("img.main-img").filter(function() {return $(this).attr("src") == prevSrc;});
						$($img.get(0)).show();
					}
				}
			};
			//Display Content (No Effect)
			var showContent = function($img) {
				if (settings.textSync) {
					$banner.trigger(UPDATE_TEXT);
				}
				$mainLink.find("img.main-img").attr("id","").hide();
				$img.attr("id", "curr-img").show();
				startTimer();
			};
			//Display Content (Fade Effect)
			var fadeInContent = function($img) {
				$mainLink.find("img#curr-img").stop(true, true);
				$mainLink.find("img.main-img").attr("id","").css("z-index", 0);				
				$img.attr("id", "curr-img").stop(true, true).css({opacity:0,"z-index":1}).show().animate({opacity:1}, settings.transitionSpeed,  settings.easing,
					function() {						
						$mainLink.find("img.main-img:not('#curr-img')").hide();
						if (settings.textSync) {
							$banner.trigger(UPDATE_TEXT);
						}
						startTimer();
					}
				);
			};
			//Slide Content
			var slideContent = function($currImg, pos, moveby) {				
				$strip.stop(true,true);
				var $prevImg = $("#curr-img", $strip);				
				if ($prevImg.size() > 0) {					
					$strip.find(".main-img").attr("id","").parents(".content-box").css({top:0,left:0});
					$currImg.attr("id", "curr-img").parents(".content-box").show();
					var $img, dest;
					if (settings.button=="previous") {
						$strip.css(pos, -moveby);
						$img = $prevImg;				
						dest = 0;
					} else {
						$img = $currImg;
						dest = -moveby;
					}
					$img.parents(".content-box").css(pos,moveby);
					var prop = (pos == "top") ? {top:dest} : {left:dest};
					$strip.stop(true,true).animate(prop, settings.transitionSpeed, settings.easing,
										function() {
											$strip.find(".main-img:not('#curr-img')").parents(".content-box").hide();
											$img.parents(".content-box").css({top:0,left:0});
											$strip.css({top:0,left:0});
											if (settings.textSync) {
												$banner.trigger(UPDATE_TEXT);
											}
											startTimer();
										});
				} else {
					$strip.css({top:0,left:0});
					$strip.find(".main-img").parents(".content-box").hide().css({top:0,left:0});
					$currImg.attr("id", "curr-img").parents(".content-box").show();
					if (settings.textSync) {
						$banner.trigger(UPDATE_TEXT);
					}
					startTimer();
				}
			};
			//Load Image
			var loadImage = function(i) {
				try {
					var $item = $($listItems.get(i));
					var $img = $("<img class='main-img'/>");			
					$img.load(function() {
							if (!$item.data("img")) {
								storeImage($item, $(this));
							}
							i++;
							if (i<itemLength) {
								loadImage(i);
							}
						})
						.error(function() {
							i++;
							if (i<itemLength) {
								loadImage(i);

							}
						});
					$img.attr("src", $item.data("imgurl"));					
				} catch(ex) {}
			};
			//Store Image
			var storeImage = function($item, $img) {
				if (settings.transition=="h.slide" || settings.transition=="v.slide") {
					$strip.append($img);
					centerImage($img);
					var $div = $("<div class='content-box'></div>").css({width:IMAGE_WIDTH, height:settings.height});
					$img.wrap($div);
					$img.css("display","block");
					var $link = $($item.find(">a").get(1));
					if ($link) {
						$img.wrap($link);
					}
				} else {
					$mainLink.append($img);
					centerImage($img);
				}				
				$item.data("img", $img);
			};
			//Center Image
			var centerImage = function($img) {
				if (settings.autoCenter && $img.width()>0 && $img.height()>0) {
					var tDiff = (settings.height-$img.height())/2;
					var lDiff = (IMAGE_WIDTH-$img.width())/2;
					var top = 0, left = 0, vPad = 0, hPad = 0;
					if (tDiff>0) {
						vPad = tDiff;
					} else if (tDiff<0) {
						top = tDiff;
					}				
					if (lDiff>0) {
						hPad = lDiff;
					} else if (lDiff<0) {
						left = lDiff;
					}
					$img.css({top:top, left:left, "padding-top":vPad, "padding-bottom":vPad, "padding-left":hPad, "padding-right":hPad});
				}
			};
			//Start Timer
			var startTimer = function() {
				if (settings.autoPlay && timerId == null) {
					var duration = Math.round($timer.data("pct")*delay);
					$timer.animate({width:(IMAGE_WIDTH+1)}, duration, "linear");
					timerId = setTimeout(rotateImg, duration);	
				}
			};
			//Reset Timer
			var resetTimer = function() {
				clearTimeout(timerId);
				timerId = null;
				$timer.stop(true).width(0).data("pct", 1);
			};
			//Pause Timer
			var pauseTimer = function() {
				clearTimeout(timerId);
				timerId = null;
				$timer.stop(true).data("pct", 1 - ($timer.width()/(IMAGE_WIDTH+1)));
			};
			//Select List Item
			var selectItem = function(e) {
				var $item = $(e.target);
				if ($item[0].nodeName != "LI") {
					$item = $item.parents("li").eq(0);
				}
				var i = $item.index();
				if (i>=0 && i!=settings.currentItem) {
					settings.button = i<settings.currentItem ? "previous" : "next"; 
					resetTimer();
					settings.oldItem = settings.currentItem;
					settings.currentItem = i;
					loadContent();
				}
				return false;
			};
			//Rotate Image
			var rotateImg = function() {
				resetTimer();
				settings.button = "next";
				settings.oldItem = settings.currentItem;
				settings.currentItem = settings.currentItem<itemLength-1 ? settings.currentItem+1 : 0;
				loadContent();
			};
			//Start Rotate
			var startRotate = function() {
				settings.autoPlay = true;
				startTimer();
			};
			//Stop Rotate
			var stopRotate = function() {
				settings.autoPlay = false;
				pauseTimer();
			};
			//Pause On Last Item
			var pauseLast = function() {
				if (settings.currentItem==(itemLength-1)) {					
					settings.autoPlay = false;
					pauseTimer();			
				}
			};
			//Randomize Items
			var randomizeItems = function() {
				var $arrItems = new Array(itemLength);
				var i = 0;
				for (i=0; i<itemLength; i++) {
					$arrItems[i] = $($listItems.get(i)).clone(true);
				}				
				for (i=0; i<itemLength; i++) {
					var rnd = Math.floor(Math.random()*itemLength);
					var temp = $arrItems[i];
					$arrItems[i] = $arrItems[rnd];
					$arrItems[rnd] = temp;
				}				
				for (i=0; i<itemLength; i++) {
					$($listItems.get(i)).replaceWith($arrItems[i]);
				}
				$listItems = $list.find(">li");
			};		
			//Check Effect
			var checkEffect = function(num) {				
				if (num==EFFECTS["random"]) {
					blockEffect = hStripeEffect = vStripeEffect = true;
				} else if (num <= EFFECTS["spiral.out"]) {
					blockEffect = true;
				} else if (num <= EFFECTS["blinds.right"]) {
					vStripeEffect = true;
				} else if (num <= EFFECTS["blinds.bottom"]) {
					hStripeEffect = true;
				}
			};
			/***
			Content
			***/
			//update text box
			var updateText = function(e) {
				if (!$textBox.data("visible")) {
					$textBox.data("visible", true);					
					var selectedItem = $($listItems.get(settings.currentItem));					
					if (selectedItem.find(">div:hidden").length>0) {	
						var text = selectedItem.find(">div:hidden").html();
						var data = $($listItems.get(settings.currentItem)).data("textbox");
						$innerBg.css({"background-color":data.bgcolor, height:data.h-1, MozBorderRadius:data.borderradius, WebkitBorderRadius:data.borderradius, borderRadius:data.borderradius});
						$innerText.css("color",data.color);
						switch(TEXT_EFFECTS[settings.textEffect]) {
							case TEXT_EFFECTS["fade"]:
								fadeInText(text, data);
								break;
							case TEXT_EFFECTS["down"]:
								expandText(text, data, {width:data.w, height:0}, {height:data.h});
								break;
							case TEXT_EFFECTS["right"]:
								expandText(text, data, {width:0, height:data.h}, {width:data.w});
								break;
							case TEXT_EFFECTS["left"]:
								expandText(text, data, {"margin-left":data.w, width:0, height:data.h}, {width:data.w, "margin-left":0});
								break;
							case TEXT_EFFECTS["up"]:
								expandText(text, data, {"margin-top":data.h, height:0, width:data.w}, {height:data.h, "margin-top":0});
								break;	
							default:
								showText(text, data);
						}												
					}	
				}
			};
			//Reset Text Box
			var resetText = function() {
				$textBox.data("visible", false).stop(true, true);
				switch(TEXT_EFFECTS[settings.textEffect]) {					
					case TEXT_EFFECTS["fade"]:
					case TEXT_EFFECTS["down"]:
					case TEXT_EFFECTS["left"]:
					case TEXT_EFFECTS["up"]:
					case TEXT_EFFECTS["right"]:
						if (jQuery.browser.msie) {
							$innerText.css("opacity",0);
						}
						$textBox.fadeOut(TEXT_SPEED, function() {$(this).css("display", "none");});
						break;
					default:
						$textBox.css("display", "none");
				}
			};
			//Fade In Text Effect
			var fadeInText = function(text, data) {
				$innerText.css("opacity",1).html(text);
				$textBox.css({left:data.x, top:data.y, width:data.w, height:data.h})
						.stop(true, true).fadeIn(TEXT_SPEED, function() {
																if (jQuery.browser.msie) {
																	$innerText[0].style.removeAttribute('filter'); 
															}
										});  
			};
			//Expand Text Effect
			var expandText = function(text, data, props1, props2) {		
				$innerText.css("opacity",1).html("");
				$textBox.stop(true, true).css({display:data.display, top:data.y, left:data.x, "margin-top":0, "margin-left":0}).css(props1).animate(props2, TEXT_SPEED,  
					function () {
						$innerText.html(text);						
					}); 				
			};
			//Show Text Effect
			var showText = function(text, data) {
				$textBox.stop(true).css({display:data.display, left:data.x, top:data.y, width:data.w, height:data.h});  
				$innerText.html(text);
			};
			//Display Text on Roll Over
			var displayText = function() {
				$banner.unbind(UPDATE_TEXT).bind(UPDATE_TEXT, updateText).trigger(UPDATE_TEXT);
			};
			//Hide Text on Roll Over
			var hideText = function() {
				$banner.unbind(UPDATE_TEXT);
				resetText();
			};
			/***
			ScrollBar
			***/
			//Create ScrollBar
			var createScrollbar = function() {
				$items.append("<div id='scrollbar'><div id='knob'></div></div>");
				$scrollbar = $items.find("#scrollbar");
				$knob = $scrollbar.find("#knob");
				$scrollbar.css("left", settings.buttonPosition=="left" ? 0 : $items.width() - $scrollbar.width());								
				$knob.height(Math.floor((settings.buttonDisplayLength/itemLength)*$scrollbar.height()));				
				var scrollRange = $scrollbar.height()-$knob.height();
				var scrollRatio = scrollRange/range;
				$scrollbar.data({range:scrollRange, ratio:scrollRatio});				
				$banner.bind(SHOW_SCROLLBAR, function() {$scrollbar.stop(true,true).fadeIn(DEFAULT_SPEED);})
						.bind(HIDE_SCROLLBAR, function() {$scrollbar.stop(true,true).fadeOut(DEFAULT_SPEED);})
						.bind(MOVE_KNOB, function() {$knob.stop(true).animate({top:Math.round(-pos*scrollRatio)}, scrollSpeed);});
				$scrollbar.hide().css("visibility","visible");
			};
			//Create Directional Buttons
			var createDropDownButtons = function() {
				$items.append("	<div class='btn-pane'><div id='up-btn'></div></div>\
								<div class='btn-pane'><div id='down-btn'></div></div>");
				var $dPane = $items.find(".btn-pane");
				$dPane.css({opacity:0, width:settings.buttonWidth});
				$dPane.hover(showDPane, hideDPane);
				if (settings.buttonShowArrow && settings.buttonPosition=="right") {
					$dPane.css("left", $arrow.width());
				}
				$upPane = $dPane.has("#up-btn");
				$downPane = $dPane.has("#down-btn");
				$downPane.css("top", $items.height()-$downPane.height());
				$dPane.css("visibility", "visible");
				$banner.bind(UPDATE_BUTTONS, updateButtons).trigger(UPDATE_BUTTONS);
			};
			var showDPane = function() {
				$(this).stop(true, true).animate({opacity:1}, DEFAULT_SPEED);
			};
			var hideDPane = function() {
				$(this).stop(true, true).animate({opacity:0}, DEFAULT_SPEED);
			};
			//Update Control
			var updateButtons = function() {
				pos < 0 ? $upPane.stop(true,true).fadeIn(DEFAULT_SPEED): $upPane.stop(true,true).fadeOut(DEFAULT_SPEED);
				pos > -range ? $downPane.stop(true,true).fadeIn(DEFAULT_SPEED) : $downPane.stop(true,true).fadeOut(DEFAULT_SPEED);
			};
			//Move To Previous Thumbs
			var prevThumbs = function() {
				if (nextSlots<maxSlots) {
					var slots = settings.moveBy1 ? 1 : Math.min(maxSlots-nextSlots, settings.buttonDisplayLength);
					nextSlots += slots;
					prevSlots -= slots;
					moveList();
				}				
				return false;
			};
			//Move To Next Thumbs
			var nextThumbs = function() {				
				if (prevSlots<maxSlots) {
					var slots = settings.moveBy1 ? 1 : Math.min(maxSlots-prevSlots, settings.buttonDisplayLength);
					prevSlots += slots;
					nextSlots -= slots;
					moveList();
				}				
				return false;
			};
			//Item Click Move
			var itemClick = function() {
				var index = ($(this).index()-prevSlots)%settings.buttonDisplayLength;
				if (index+1==settings.buttonDisplayLength) {
					nextThumbs();
				} else if (inde ==0) {
					prevThumbs();
				}
			};
			
			//MouseOver Scroll Up
			var scrollUp = function() {
				$downPane.stop(true,true).fadeIn(DEFAULT_SPEED);
				$banner.trigger(SHOW_SCROLLBAR);				
				scrollSpeed = -$list.stop(true).position().top * SCROLL_RATE;
				$list.animate({top:0}, scrollSpeed, 
										 	function() { 
												$upPane.stop(true,true).fadeOut(DEFAULT_SPEED); 
												$banner.trigger(HIDE_SCROLLBAR);
											});
				$knob.stop(true).animate({top:0}, scrollSpeed);
			};
			//MouseOver Scroll Down
			var scrollDown = function() {
				$upPane.stop(true,true).fadeIn(DEFAULT_SPEED);
				$banner.trigger(SHOW_SCROLLBAR);
				scrollSpeed = (range + $list.stop(true).position().top) * SCROLL_RATE;
				$list.animate({top:-range}, scrollSpeed, 
										 	function() { 
												$downPane.stop(true,true).fadeOut(DEFAULT_SPEED);
												$banner.trigger(HIDE_SCROLLBAR);
											});
				$knob.stop(true).animate({top:$scrollbar.data("range")}, scrollSpeed);
			};
			//Stop List
			var stopThumbList = function() {
				$list.stop(true);					
				try { 
					$knob.stop(true);
				} catch (ex) {
					//No Knob
				};
				$banner.trigger(HIDE_SCROLLBAR);
			};
			//Mouse Move Scroll

			var mousemoveScroll = function(e) {

				var pct = Math.round(((e.pageY - $items.offset().top)/$items.height()) * 100)/100;

				dest = -Math.round(range*pct);

				if (scrollId==null && dest!=$list.position().top) {

					stopThumbList();

					$banner.trigger(SHOW_SCROLLBAR);

					scrollId = setInterval(scrollList, 30);

				}

			};

			

			//Start Scroll

			var scrollList = function() {

				var yPos = $list.stop(true).position().top;

				if (yPos==dest) {

					stopScrollTimer();

					$banner.trigger(HIDE_SCROLLBAR);

				} else {					

					var move = (dest-yPos)*SCROLL_DELAY;

					pos += move<0 ? Math.min(-1, Math.round(move)) : Math.max(1, Math.round(move));

					$list.css("top", pos);

					try {

						$knob.css("top", Math.round(-pos * $scrollbar.data("ratio")));

					} catch (ex) {

						//no knob

					};

				}

			};



			//Stop Timer Scroll

			var stopScrollTimer = function() {

				clearInterval(scrollId);

				scrollId = null;			

			};

			

			//Adjust Thumbs

			var adjustThumbs = function() {	

				if (scrollId==null) {

					var slots = Math.min(settings.currentItem, maxSlots);

					prevSlots = slots;

					nextSlots = maxSlots-prevSlots;			

					moveList();

				}

			};

			

			//Move List

			var moveList = function() {

				pos = -prevSlots * $listItems.outerHeight();

				scrollSpeed = Math.min(MAX_SCROLL_SPEED, Math.abs($list.position().top-pos)*SCROLL_RATE);

				if (scrollSpeed>0) {

					$banner.trigger(SHOW_SCROLLBAR);

				}

				$list.stop(true).animate({top:pos}, scrollSpeed, 

										 	function() { 

												$banner.trigger(UPDATE_BUTTONS); 

												$banner.trigger(HIDE_SCROLLBAR);

											});

				$banner.trigger(MOVE_KNOB);

			};

			

			//Set Complete

			this.setComplete = function($img) {

				showContent($img);

			};

			

			//Add To Screen

			this.addToScreen = function(content) {

				$mainLink.append(content);

			};

			

			//Get Auto Center

			this.autoCenter = function() {

				return settings.autoCenter;

			};

			

			//Get Easing

			this.easing = function() {

				return settings.easing;

			};

		}	

		

		//Randomize Array

		function randomizeArray(arr) {

			var total = arr.length;

			for (var i=0; i<total; i++) {

				var rnd = Math.floor(Math.random()*total);

				var temp = arr[i];

				arr[i] = arr[rnd];

				arr[rnd] = temp;

			}

		}	

		

		//Vertical Stripes

		function VertStripes(banner, areaWidth, areaHeight, stripeSize, bgColor, duration, delay) {

			var $stripes;

			var $arr;

			var total;

			var intervalId = null;

			

			//init stripes

			var init = function() {

				total = Math.ceil(areaWidth/stripeSize);

				if (total > LIMIT) {

					stripeSize = Math.ceil(areaWidth/LIMIT);

					total = Math.ceil(areaWidth/stripeSize);

				}

				var divs = "";

				for (var i = 0; i < total; i++) {

					divs += "<div class='vpiece' id='" + i + "'></div>";

				}					

				banner.addToScreen(divs);				

				$stripes = banner.$el.find("div.vpiece");

				$arr = new Array(total);

				$stripes.each(

					function(n) {						

						$(this).css({left:(n * stripeSize), height: areaHeight});

						$arr[n] = $(this);

					}

				);

			};



			//clear animation

			this.clear = function() {

				clearInterval(intervalId);

				$stripes.stop(true).css({"z-index":2, opacity:0});

			};



			//display content

			this.displayContent = function($img, effect) {

				setPieces($img, effect);

				animate($img, effect);

			};			

			

			//set image stripes

			var setPieces = function($img, effect) {

				switch (effect) {

					case EFFECTS["vert.tl"]:

					case EFFECTS["vert.tr"]:

						setVertPieces($img, -areaHeight, 1, stripeSize, false);	

						break;

					case EFFECTS["vert.bl"]:

					case EFFECTS["vert.br"]:

						setVertPieces($img, areaHeight, 1, stripeSize, false);

						break;

					case EFFECTS["alt.left"]:

					case EFFECTS["alt.right"]:

						setVertPieces($img, 0, 1, stripeSize, true);

						break;

					case EFFECTS["blinds.left"]:

					case EFFECTS["blinds.right"]:

						setVertPieces($img, 0, 1, 0, false);

						break;

					default:

						setVertPieces($img, 0, 0, stripeSize, false);

				}

			};

			

			//set vertical stripes

			var setVertPieces = function($img, topPos, opacity, width, alt) {

				var imgSrc = $img.attr("src");

				var tOffset = 0;

				var lOffset = 0;

				if (banner.autoCenter()) {

					tOffset = (areaHeight - $img.height())/2;

					lOffset = (areaWidth - $img.width())/2;

				}

				for (var i = 0; i < total; i++) {		

					var xPos =  ((-i * stripeSize) + lOffset);

					if (alt) {

						topPos = (i % 2) == 0 ? -areaHeight: areaHeight;

					}

					$($stripes.get(i)).css({background:bgColor + " url('"+ imgSrc +"') no-repeat", backgroundPosition:xPos + "px " + tOffset + "px",						   

											opacity:opacity, top:topPos, width:width, "z-index":3});					

				}

			};

			

			//animate stripes			

			var animate = function($img, effect) {

				var start, end, incr, limit;

				switch (effect) {

					case EFFECTS["vert.tl"]:   case EFFECTS["vert.bl"]: 

					case EFFECTS["fade.left"]: case EFFECTS["blinds.left"]: 

					case EFFECTS["alt.left"]:

						start = 0;

						end = total - 1;

						incr = 1;

						break;

					default:

						start = total - 1;

						end = 0;

						incr = -1;

				}

				

				intervalId = setInterval(

					function() {

						$($stripes.get(start)).animate({top:0, opacity:1, width:stripeSize}, duration, banner.easing(),

							function() {

								if ($(this).attr("id") == end) {

									banner.setComplete($img);

								}

							}

						);

						if (start == end) {

							clearInterval(intervalId);

						}

						start += incr;

					}, delay);						

			};

						

			init();

		}		

		

		//Horizontal Stripes

		function HorzStripes(banner, areaWidth, areaHeight, stripeSize, bgColor, duration, delay) {

			var $stripes;

			var $arr;

			var total;

			var intervalId = null;

			

			//init stripes

			var init = function() {			

				total = Math.ceil(areaHeight/stripeSize);

				if (total > LIMIT) {

					stripeSize = Math.ceil(areaHeight/LIMIT);

					total = Math.ceil(areaHeight/stripeSize);

				}

				var divs = "";

				for (var j = 0; j < total; j++) {

					divs += "<div class='hpiece' id='" + j + "'><!-- --></div>";

				}				

				banner.addToScreen(divs);

				

				$stripes = banner.$el.find("div.hpiece");

				$arr = new Array(total);

				$stripes.each(

					function(n) {

						$(this).css({top:(n * stripeSize), width: areaWidth});

						$arr[n] = $(this);

					}							 

				);

			};



			//clear animation

			this.clear = function() {

				clearInterval(intervalId);

				$stripes.stop(true).css({"z-index":2, opacity:0});

			};



			//display content

			this.displayContent = function($img, effect) {

				setPieces($img, effect);

				animate($img, effect);

			};		

			

			//set image stripes

			var setPieces = function($img, effect) {

				switch (effect) {

					case EFFECTS["horz.tr"]:

					case EFFECTS["horz.br"]:

						setHorzPieces($img, areaWidth, 1, stripeSize, false);	

						break;

					case EFFECTS["horz.tl"]:

					case EFFECTS["horz.bl"]:

						setHorzPieces($img, -areaWidth, 1, stripeSize, false);

						break;

					case EFFECTS["alt.top"]:

					case EFFECTS["alt.bottom"]:

						setHorzPieces($img, 0, 1, stripeSize, true);

						break;

					case EFFECTS["blinds.top"]:

					case EFFECTS["blinds.bottom"]:

						setHorzPieces($img, 0, 1, 0, false);

						break;

					default:

						setHorzPieces($img, 0, 0, stripeSize, false);	

				}

			};

			

			//set horizontal stripes

			var setHorzPieces = function($img, leftPos, opacity, height, alt) {

				var imgSrc = $img.attr("src");

				var tOffset = 0;

				var lOffset = 0;

				if (banner.autoCenter()) {

					tOffset = (areaHeight - $img.height())/2;

					lOffset = (areaWidth - $img.width())/2;

				}

				for (var i = 0; i < total; i++) {			

					var yPos = ((-i * stripeSize) + tOffset);

					if (alt) {

						leftPos = (i % 2) == 0 ? -areaWidth: areaWidth;

					}

					$($stripes.get(i)).css({background:bgColor + " url('"+ imgSrc +"') no-repeat", backgroundPosition:lOffset + "px " + yPos + "px",

											opacity:opacity, left:leftPos, height:height, "z-index":3});		  

				}

			};

			

			//animate stripes			

			var animate = function($img, effect) {

				var start, end, incr;

				switch (effect) {

					case EFFECTS["horz.tl"]:  case EFFECTS["horz.tr"]: 

					case EFFECTS["fade.top"]: case EFFECTS["blinds.top"]: 

					case EFFECTS["alt.top"]:

						start = 0;

						end = total - 1;

						incr = 1;

						break;

					default:

						start = total - 1;

						end = 0;

						incr = -1;

				}

				

				intervalId = setInterval(

					function() {

						$($stripes.get(start)).animate({left:0, opacity:1, height:stripeSize}, duration, banner.easing(),

							function() {

								if ($(this).attr("id") == end) {

									banner.setComplete($img);

								}

							}

						);					

						if (start == end) {

							clearInterval(intervalId);

						}

						start += incr;

					}, delay);						

			};

					

			init();

		}

		

		//Blocks

		function Blocks(banner, areaWidth, areaHeight, blockSize, bgColor, duration, delay) {

			var $blockArr;

			var $blocks;

			var $arr;

			var numRows;

			var numCols;

			var total;

			var intervalId;

			

			//init blocks

			var init = function() {

				numRows = Math.ceil(areaHeight/blockSize);

				numCols = Math.ceil(areaWidth/blockSize);			

				total = numRows * numCols;

				if (total > LIMIT) {

					blockSize = Math.ceil(Math.sqrt((areaHeight * areaWidth)/LIMIT));

					numRows = Math.ceil(areaHeight/blockSize);

					numCols = Math.ceil(areaWidth/blockSize);			

					total = numRows * numCols;

				}

				var divs = "";							

				for (var i = 0; i < numRows; i++) {					

					for (var j = 0; j < numCols; j++) {

						divs += "<div class='block' id='" + i + "-" + j + "'></div>";	

					}

				}

				banner.addToScreen(divs);

				$blocks = banner.$el.find("div.block");

				$blocks.data({tlId:"0-0", trId:"0-"+(numCols - 1), blId:(numRows - 1)+"-0", brId:(numRows - 1)+"-"+(numCols - 1)});

				

				var k = 0;

				$arr = new Array(total);

				$blockArr = new Array(numRows);

				for (var i = 0; i < numRows; i++) {

					$blockArr[i] = new Array(numCols);

					for (var j = 0; j < numCols; j++) {

						$blockArr[i][j] = $arr[k++] = $blocks.filter("#" + (i + "-" + j)).data("top", i * blockSize);

					}

				}				

			};

			

			//clear blocks

			this.clear = function() {

				clearInterval(intervalId);

				$blocks.stop(true).css({"z-index":2, opacity:0});

			};

			

			//display content

			this.displayContent = function($img, effect) {

				switch (effect) {

					case EFFECTS["diag.fade"]:

						setBlocks($img, 0, blockSize, 0);

						diagAnimate($img, {opacity:1}, false);	

						break;

					case EFFECTS["diag.exp"]:

						setBlocks($img, 0, 0, 0);

						diagAnimate($img, {opacity:1, width:blockSize, height:blockSize}, false);

						break;

					case EFFECTS["rev.diag.fade"]:

						setBlocks($img, 0, blockSize, 0);

						diagAnimate($img, {opacity:1}, true);

						break;

					case EFFECTS["rev.diag.exp"]:

						setBlocks($img, 0, 0, 0);

						diagAnimate($img, {opacity:1, width:blockSize, height:blockSize}, true);

						break;

					case EFFECTS["block.fade"]:

						setBlocks($img, 0, blockSize, 0);

						randomAnimate($img);

						break;

					case EFFECTS["block.exp"]:

						setBlocks($img, 1, 0, 0);

						randomAnimate($img);

						break; 

					case EFFECTS["block.drop"]:

						setBlocks($img, 1, blockSize, -(numRows * blockSize));

						randomAnimate($img);

						break;

					case EFFECTS["block.top.zz"]: 

					case EFFECTS["block.bottom.zz"]:					

						setBlocks($img, 0, blockSize, 0);

						horzZigZag($img, effect);

						break;

					case EFFECTS["block.left.zz"]: 

					case EFFECTS["block.right.zz"]:

						setBlocks($img, 0, blockSize, 0);

						vertZigZag($img, effect);

						break;

					case EFFECTS["spiral.in"]:

						setBlocks($img, 0, blockSize, 0);

						spiral($img, false);

						break;

					case EFFECTS["spiral.out"]:

						setBlocks($img, 0, blockSize, 0);

						spiral($img, true);

						break;

					default:

						setBlocks($img, 1, 0, 0);

						dirAnimate($img, effect);				

				}

			};

			

			//set blocks 

			var setBlocks = function($img, opacity, size, tPos) {

				var tOffset = 0;

				var lOffset = 0;

				if (banner.autoCenter()) {

					tOffset = (areaHeight - $img.height())/2;

					lOffset = (areaWidth - $img.width())/2;

				}

				var imgSrc = $img.attr("src");

				for (var i = 0; i < numRows; i++) {							

					for (var j = 0; j < numCols; j++) {

						var tVal = ((-i * blockSize) + tOffset);

						var lVal = ((-j * blockSize) + lOffset);

						$blockArr[i][j].css({background:bgColor + " url('"+ imgSrc +"') no-repeat", backgroundPosition:lVal + "px " + tVal + "px",

											 opacity:opacity, top:(i * blockSize) + tPos, left:(j * blockSize), width:size, height:size, "z-index":3});

					}					

				}

			};

			

			//diagonal effect

			var diagAnimate = function($img, props, rev) {

				var $array = new Array(total);

				var start, end, incr, lastId;

				var diagSpan = (numRows - 1) + (numCols - 1);

				if (rev) {				

					start = diagSpan;

					end = -1;

					incr = -1;

					lastId = $blocks.data("tlId");

				}

				else {

					start = 0;

					end = diagSpan + 1;

					incr = 1;

					lastId = $blocks.data("brId");

				}

				

				var count = 0;

				while (start != end) {

					i = Math.min(numRows - 1, start);

					while(i >= 0) {			

						j = Math.abs(i - start);

						if (j >= numCols) {

							break;

						}

						$array[count++] = $blockArr[i][j];

						i--;

					}

					start+=incr;

				}

				

				count = 0;

				intervalId = setInterval(

					function() {

						$array[count++].animate(props, duration, banner.easing(),

								function() {

									if ($(this).attr("id") == lastId) {

										banner.setComplete($img);

									}

								});						

						if (count == total) {

							clearInterval(intervalId);

						}			

					}, delay);			

			};



			//vertical zig zag effect

			var vertZigZag = function($img, effect) {

				var fwd = true;

				var i = 0, j, incr, lastId;

				if (effect == EFFECTS["block.left.zz"]) {

					lastId = (numCols%2 == 0) ? $blocks.data("trId") : $blocks.data("brId");

					j = 0;

					incr = 1;

				} else {

					lastId = (numCols%2 == 0) ? $blocks.data("tlId") : $blocks.data("blId");

					j = numCols - 1;

					incr = -1;

				}

				

				intervalId = setInterval(

					function() {

						$blockArr[i][j].animate({opacity:1}, duration, banner.easing(),

								function() {

									if ($(this).attr("id") == lastId) {

										banner.setComplete($img);

									}});

						

						if ($blockArr[i][j].attr("id") == lastId) {

							clearInterval(intervalId);

						}

						

						(fwd ? i++ : i--);

						if (i == numRows || i < 0) {

							fwd = !fwd;

							i = (fwd ? 0 : numRows - 1);

							j+=incr;

						}						

					}, delay);

			};

			

			//horizontal zig zag effect

			var horzZigZag = function($img, effect) {

				var fwd = true;

				var i, j = 0, incr, lastId;

				if (effect == EFFECTS["block.top.zz"]) {

					lastId = (numRows%2 == 0) ? $blocks.data("blId") : $blocks.data("brId");

					i = 0;

					incr = 1;

				} else {

					lastId = (numRows%2 == 0) ? $blocks.data("tlId") : $blocks.data("trId");

					i = numRows - 1;

					incr = -1;

				}

				

				intervalId = setInterval(

					function() {

						$blockArr[i][j].animate({opacity:1}, duration, banner.easing(),

								function() {

									if ($(this).attr("id") == lastId) {

										banner.setComplete($img);

									}});

						

						if ($blockArr[i][j].attr("id") == lastId) {

							clearInterval(intervalId);

						}

						

						(fwd ? j++ : j--);

						if (j == numCols || j < 0) {

							fwd = !fwd;

							j = (fwd ? 0 : numCols - 1);

							i+=incr;

						}						

					}, delay);

			};

			

			//vertical direction effect

			var dirAnimate = function($img, effect) {

				var $array = new Array(total);

				var lastId;

				var count = 0;

				switch (effect) {

					case EFFECTS["block.left"]:

						lastId = $blocks.data("brId");

						for (var j = 0; j < numCols; j++) {

							for (var i = 0; i < numRows; i++) {

								$array[count++] = $blockArr[i][j];		

							}

						}

						break;

					case EFFECTS["block.right"]:

						lastId = $blocks.data("blId");

						for (var j = numCols - 1; j >= 0; j--) {

							for (var i = 0; i < numRows; i++) {

								$array[count++] = $blockArr[i][j];		

							}

						}					

						break;

					case EFFECTS["block.top"]:

						lastId = $blocks.data("brId");

						for (var i = 0; i < numRows; i++) {

							for (var j = 0; j < numCols; j++) {

								$array[count++] = $blockArr[i][j];		

							}

						}					

						break;

					default:

						lastId = $blocks.data("trId");

						for (var i = numRows - 1; i >= 0; i--) {

							for (var j = 0; j < numCols; j++) {

								$array[count++] = $blockArr[i][j];		

							}

						}

				}

				count = 0;

				intervalId = setInterval(

					function() {

						$array[count++].animate({width:blockSize, height:blockSize}, duration, banner.easing(),

								function() {

									if ($(this).attr("id") == lastId) {

										banner.setComplete($img);

									}

								});

						if (count == total) {

							clearInterval(intervalId);

						}

					}, delay);

			};

			

			//random block effect

			var randomAnimate = function($img) {

				randomizeArray($arr);

				var i = 0;

				count = 0;

				intervalId = setInterval(

					function() {

						$arr[i].animate({top:$arr[i].data("top"), width:blockSize, height:blockSize, opacity:1}, duration, banner.easing(),

								function() {

									if (++count == total) {

										banner.setComplete($img);

									}

								});

						i++;

						if (i == total) {

							clearInterval(intervalId);

						}

					}, delay);

			};

			

			//spiral effect

			var spiral = function($img, spiralOut) {			

				var i = 0, j = 0;

				var rowCount = numRows - 1;

				var colCount = numCols - 1;

				var dir = 0;

				var limit = colCount;

				var $array = new Array();

				while (rowCount >= 0 && colCount >=0) {

					var count = 0; 

					while(true) { 

						$array[$array.length] = $blockArr[i][j];

						if ((++count) > limit) {

							break;

						}

						switch(dir) {

							case 0:

								j++;

								break;



							case 1:

								i++;

								break;

							case 2:

								j--;

								break;

							case 3:

								i--;

						}

   					} 

					switch(dir) {

						case 0:

							dir = 1;

							limit = (--rowCount);

							i++;

							break;

						case 1:

							dir = 2;

							limit = (--colCount);

							j--;

							break;

						case 2:

							dir = 3;

							limit = (--rowCount);

							i--;

							break;

						case 3:

							dir = 0;

							limit = (--colCount);

							j++;

					}

				}

				if ($array.length > 0) {

					if (spiralOut) {

						$array.reverse();

					}

					var end = $array.length - 1;

					var lastId = $array[end].attr("id");

					var k = 0;			

					intervalId = setInterval(

						function() {

							$array[k].animate({opacity:1}, duration, banner.easing(),

								function() {

									if ($(this).attr("id") == lastId) {

										banner.setComplete($img);

									}

								});					

							if (k == end) {

								clearInterval(intervalId);

							}	

							k++;

						}, delay);				

				}

			};

						

			init();

		}		

	};		

})(jQuery);
