/**
 * jQuery Banner Rotator 
 * Copyright (c) 2011 Allan Ma (http://codecanyon.net/user/webtako)
 * Version: 1.4.8 (02/15/2011)
 */
(function(jQuery) {
	jQuery.fn.wtRotator = function(params) {
		var TOP_LEFT = "TL";
		var TOP_RIGHT = "TR";
		var TOP_CENTER = "TC";
		var BOTTOM_LEFT = "BL";
		var BOTTOM_RIGHT = "BR";		
		var BOTTOM_CENTER = "BC";
		var INSIDE = "inside";
		var OUTSIDE = "outside";
		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++,
			"vert.random.fade":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++,
			"horz.random.fade":ei++,
			"none":ei++,
			"fade":ei++,
			"random":ei++
		};
		var TEXT_EFFECTS = {
			"fade":0,
			"down":1,
			"right":2,
			"up":3,
			"left":4,
			"none":5
		}
		
		var DEFAULT_DELAY = 5000;
		var DURATION = 800;
		var ANIMATE_SPEED = 600;
		var TOOLTIP_DELAY = 600;
		var UPDATE_TEXT = "updatetext";
		
		//Vertical Stripes
		function VertStripes(rotator, areaWidth, areaHeight, stripeSize, bgColor, duration, delay) {
			var jQuerystripes;
			var jQueryarr;
			var total;
			var intervalId = null;
			
			//init stripes
			var init = function() {
				total = Math.ceil(areaWidth/stripeSize);
				var divs = "";
				for (var i = 0; i < total; i++) {
					divs += "<div class='vpiece' id='" + i + "'/>";
				}					
				rotator.addToScreen(divs);
				
				jQuerystripes = jQuery("div.vpiece", rotator.jQueryel);
				jQueryarr = new Array(total);
				jQuerystripes.each(
					function(n) {						
						jQuery(this).css({left:(n * stripeSize), height: areaHeight});
						jQueryarr[n] = jQuery(this);
					}
				);	
			}

			//clear animation
			this.clear = function() {
				clearInterval(intervalId);
				jQuerystripes.stop(true).css({"z-index":2, opacity:0});
			}

			//display content
			this.displayContent = function(jQueryimg, effect) {
				setPieces(jQueryimg, effect);
				if (effect == EFFECTS["vert.random.fade"]) {
					animateRandom(jQueryimg);
				}
				else {
					animate(jQueryimg, effect);
				}
			}			
			
			//set image stripes
			var setPieces = function(jQueryimg, effect) {
				switch (effect) {
					case EFFECTS["vert.tl"]:
					case EFFECTS["vert.tr"]:
						setVertPieces(jQueryimg, -areaHeight, 1, stripeSize, false);		
						break;
					case EFFECTS["vert.bl"]:
					case EFFECTS["vert.br"]:
						setVertPieces(jQueryimg, areaHeight, 1, stripeSize, false);
						break;
					case EFFECTS["alt.left"]:
					case EFFECTS["alt.right"]:
						setVertPieces(jQueryimg, 0, 1, stripeSize, true);
						break;
					case EFFECTS["blinds.left"]:
					case EFFECTS["blinds.right"]:
						setVertPieces(jQueryimg, 0, 1, 0, false);
						break;
					default:
						setVertPieces(jQueryimg, 0, 0, stripeSize, false);
				}
			}
			
			//set vertical stripes
			var setVertPieces = function(jQueryimg, topPos, opacity, width, alt) {
				var imgSrc = jQueryimg.attr("src");
				var tOffset = 0;
				var lOffset = 0;								
				if (rotator.centerImg()) {
					tOffset = (areaHeight - jQueryimg.height())/2;
					lOffset = (areaWidth - jQueryimg.width())/2;
				}
				jQuerystripes.each(
					function(n) {
						var xPos =  ((-n * stripeSize) + lOffset);
						if (alt) {
							topPos = (n % 2) == 0 ? -areaHeight: areaHeight;
						}
						jQuery(this).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(jQueryimg, 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() {
						jQuery(jQuerystripes.get(start)).animate({top:0, opacity:1, width:stripeSize}, duration, rotator.easing(),
							function() {
								if (jQuery(this).attr("id") == end) {
									rotator.setComplete(jQueryimg);
								}
							}
						);
						if (start == end) {
							clearInterval(intervalId);
						}
						start += incr;
					}, delay);							
			}
			
			//animate random fade 
			var animateRandom = function(jQueryimg) {		
				shuffleArray(jQueryarr);
				var i = 0;
				var count = 0;
				intervalId = setInterval(
					function() {
						jQueryarr[i++].animate({opacity:1}, duration, rotator.easing(),
								function() {
									if (++count == total) {
										rotator.setComplete(jQueryimg);
									}
								});
						if (i == total) {
							clearInterval(intervalId);
						}
					}, delay);			
			}
			
			init();
		}
		
		//Horizontal Stripes
		function HorzStripes(rotator, areaWidth, areaHeight, stripeSize, bgColor, duration, delay) {
			var jQuerystripes;
			var jQueryarr;
			var total;
			var intervalId = null;
			
			//init stripes
			var init = function() {			
				total = Math.ceil(areaHeight/stripeSize);				
				var divs = "";
				for (var j = 0; j < total; j++) {
					divs += "<div class='hpiece' id='" + j + "'><!-- --></div>";
				}				
				rotator.addToScreen(divs);
				
				jQuerystripes = jQuery("div.hpiece", rotator.jQueryel);
				jQueryarr = new Array(total);
				jQuerystripes.each(
					function(n) {
						jQuery(this).css({top:(n * stripeSize), width: areaWidth});
						jQueryarr[n] = jQuery(this);
					}							 
				);
			}

			//clear animation
			this.clear = function() {
				clearInterval(intervalId);
				jQuerystripes.stop(true).css({"z-index":2, opacity:0});
			}

			//display content
			this.displayContent = function(jQueryimg, effect) {
				setPieces(jQueryimg, effect);
				if (effect == EFFECTS["horz.random.fade"]) {
					animateRandom(jQueryimg);
				}
				else {
					animate(jQueryimg, effect);
				}
			}			
			
			//set image stripes
			var setPieces = function(jQueryimg, effect) {
				switch (effect) {
					case EFFECTS["horz.tr"]:
					case EFFECTS["horz.br"]:
						setHorzPieces(jQueryimg, areaWidth, 1, stripeSize, false);		
						break;
					case EFFECTS["horz.tl"]:
					case EFFECTS["horz.bl"]:
						setHorzPieces(jQueryimg, -areaWidth, 1, stripeSize, false);
						break;
					case EFFECTS["alt.top"]:
					case EFFECTS["alt.bottom"]:
						setHorzPieces(jQueryimg, 0, 1, stripeSize, true);
						break;
					case EFFECTS["blinds.top"]:
					case EFFECTS["blinds.bottom"]:
						setHorzPieces(jQueryimg, 0, 1, 0, false);
						break;
					default:
						setHorzPieces(jQueryimg, 0, 0, stripeSize, false);		
				}
			}
			
			//set horizontal stripes
			var setHorzPieces = function(jQueryimg, leftPos, opacity, height, alt) {
				var imgSrc = jQueryimg.attr("src");
				var tOffset = 0;
				var lOffset = 0;
				if (rotator.centerImg()) {
					tOffset = (areaHeight - jQueryimg.height())/2;
					lOffset = (areaWidth - jQueryimg.width())/2;
				}
				jQuerystripes.each(
					function(n) {
						var yPos = ((-n * stripeSize) + tOffset);
						if (alt) {
							leftPos = (n % 2) == 0 ? -areaWidth: areaWidth;
						}
						jQuery(this).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(jQueryimg, 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() {
						jQuery(jQuerystripes.get(start)).animate({left:0, opacity:1, height:stripeSize}, duration, rotator.easing(),
							function() {
								if (jQuery(this).attr("id") == end) {
									rotator.setComplete(jQueryimg);
								}
							}
						);						
						if (start == end) {
							clearInterval(intervalId);
						}
						start += incr;
					}, delay);							
			}
			
			//animate random fade 
			var animateRandom = function(jQueryimg) {		
				shuffleArray(jQueryarr);
				var i = 0;
				var count = 0;
				intervalId = setInterval(
					function() {
						jQueryarr[i++].animate({opacity:1}, duration, rotator.easing(),
								function() {
									if (++count == total) {
										rotator.setComplete(jQueryimg);
									}
								});
						if (i == total) {
							clearInterval(intervalId);
						}
					}, delay);			
			}
			
			init();
		}
		
		//class Blocks
		function Blocks(rotator, areaWidth, areaHeight, blockSize, bgColor, duration, delay) {
			var jQueryblockArr;
			var jQueryblocks;
			var jQueryarr;
			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;
				var divs = "";								
				for (var i = 0; i < numRows; i++) {					
					for (var j = 0; j < numCols; j++) {
						divs += "<div class='block' id='" + i + "-" + j + "'/>";		
					}
				}
				rotator.addToScreen(divs);
				jQueryblocks = jQuery("div.block", rotator.jQueryel);	
				jQueryblocks.data({tlId:"0-0", trId:"0-"+(numCols - 1), blId:(numRows - 1)+"-0", brId:(numRows - 1)+"-"+(numCols - 1)});
				
				var k = 0;
				jQueryarr = new Array(total);
				jQueryblockArr = new Array(numRows);
				for (var i = 0; i < numRows; i++) {
					jQueryblockArr[i] = new Array(numCols);
					for (var j = 0; j < numCols; j++) {
						jQueryblockArr[i][j] = jQueryarr[k++] = jQueryblocks.filter("#" + (i + "-" + j)).data("top", i * blockSize);
					}
				}				
			}
			
			//clear blocks
			this.clear = function() {
				clearInterval(intervalId);
				jQueryblocks.stop(true).css({"z-index":2, opacity:0});
			}
			
			//display content
			this.displayContent = function(jQueryimg, effect) {
				switch (effect) {
					case EFFECTS["diag.fade"]:
						setBlocks(jQueryimg, 0, blockSize, 0);
						diagAnimate(jQueryimg, {opacity:1}, false);		
						break;
					case EFFECTS["diag.exp"]:
						setBlocks(jQueryimg, 0, 0, 0);
						diagAnimate(jQueryimg, {opacity:1, width:blockSize, height:blockSize}, false);
						break;
					case EFFECTS["rev.diag.fade"]:
						setBlocks(jQueryimg, 0, blockSize, 0);
						diagAnimate(jQueryimg, {opacity:1}, true);
						break;
					case EFFECTS["rev.diag.exp"]:
						setBlocks(jQueryimg, 0, 0, 0);
						diagAnimate(jQueryimg, {opacity:1, width:blockSize, height:blockSize}, true);
						break;
					case EFFECTS["block.fade"]:
						setBlocks(jQueryimg, 0, blockSize, 0);
						randomAnimate(jQueryimg);
						break;
					case EFFECTS["block.exp"]:
						setBlocks(jQueryimg, 1, 0, 0);
						randomAnimate(jQueryimg);
						break; 
					case EFFECTS["block.drop"]:
						setBlocks(jQueryimg, 1, blockSize, -(numRows * blockSize));
						randomAnimate(jQueryimg);
						break;
					case EFFECTS["block.top.zz"]: 
					case EFFECTS["block.bottom.zz"]:					
						setBlocks(jQueryimg, 0, blockSize, 0);
						horzZigZag(jQueryimg, effect);
						break;
					case EFFECTS["block.left.zz"]: 
					case EFFECTS["block.right.zz"]:
						setBlocks(jQueryimg, 0, blockSize, 0);
						vertZigZag(jQueryimg, effect);
						break;
					case EFFECTS["spiral.in"]:
						setBlocks(jQueryimg, 0, blockSize, 0);
						spiral(jQueryimg, false);
						break;
					case EFFECTS["spiral.out"]:
						setBlocks(jQueryimg, 0, blockSize, 0);
						spiral(jQueryimg, true);
						break;
					default:
						setBlocks(jQueryimg, 1, 0, 0);
						dirAnimate(jQueryimg, effect);					
				}
			}
			
			//set blocks 
			var setBlocks = function(jQueryimg, opacity, size, tPos) {
				var tOffset = 0;
				var lOffset = 0;
				if (rotator.centerImg()) {
					tOffset = (areaHeight - jQueryimg.height())/2;
					lOffset = (areaWidth - jQueryimg.width())/2;
				}
				var imgSrc = jQueryimg.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);
						jQueryblockArr[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(jQueryimg, props, rev) {
				var jQueryarray = new Array(total);
				var start, end, incr, lastId;
				var diagSpan = (numRows - 1) + (numCols - 1);
				if (rev) {				
					start = diagSpan;
					end = -1;
					incr = -1;
					lastId = jQueryblocks.data("tlId");
				}
				else {
					start = 0;
					end = diagSpan + 1;
					incr = 1;
					lastId = jQueryblocks.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;
						}
						jQueryarray[count++] = jQueryblockArr[i][j];
						i--;
					}
					start+=incr;	
				}
				
				count = 0;
				intervalId = setInterval(
					function() {
						jQueryarray[count++].animate(props, duration, rotator.easing(),
								function() {
									if (jQuery(this).attr("id") == lastId) {
										rotator.setComplete(jQueryimg);
									}
								});							
						if (count == total) {
							clearInterval(intervalId);
						}			
					}, delay);				
			}

			//vertical zig zag effect
			var vertZigZag = function(jQueryimg, effect) {
				var fwd = true;
				var i = 0, j, incr, lastId;
				if (effect == EFFECTS["block.left.zz"]) {
					lastId = (numCols%2 == 0) ? jQueryblocks.data("trId") : jQueryblocks.data("brId");
					j = 0;
					incr = 1;
				}
				else {
					lastId = (numCols%2 == 0) ? jQueryblocks.data("tlId") : jQueryblocks.data("blId");
					j = numCols - 1;
					incr = -1;
				}
				
				intervalId = setInterval(
					function() {
						jQueryblockArr[i][j].animate({opacity:1}, duration, rotator.easing(),
								function() {
									if (jQuery(this).attr("id") == lastId) {
										rotator.setComplete(jQueryimg);
									}});
						
						if (jQueryblockArr[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(jQueryimg, effect) {
				var fwd = true;
				var i, j = 0, incr, lastId;
				if (effect == EFFECTS["block.top.zz"]) {
					lastId = (numRows%2 == 0) ? jQueryblocks.data("blId") : jQueryblocks.data("brId");
					i = 0;
					incr = 1;
				}
				else {
					lastId = (numRows%2 == 0) ? jQueryblocks.data("tlId") : jQueryblocks.data("trId");
					i = numRows - 1;
					incr = -1;
				}
				
				intervalId = setInterval(
					function() {
						jQueryblockArr[i][j].animate({opacity:1}, duration, rotator.easing(),
								function() {
									if (jQuery(this).attr("id") == lastId) {
										rotator.setComplete(jQueryimg);
									}});
						
						if (jQueryblockArr[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(jQueryimg, effect) {
				var jQueryarray = new Array(total);
				var lastId;
				var count = 0;
				switch (effect) {
					case EFFECTS["block.left"]:
						lastId = jQueryblocks.data("brId");
						for (var j = 0; j < numCols; j++) {
							for (var i = 0; i < numRows; i++) {
								jQueryarray[count++] = jQueryblockArr[i][j];			
							}
						}
						break;
					case EFFECTS["block.right"]:
						lastId = jQueryblocks.data("blId");
						for (var j = numCols - 1; j >= 0; j--) {
							for (var i = 0; i < numRows; i++) {
								jQueryarray[count++] = jQueryblockArr[i][j];			
							}
						}					
						break;
					case EFFECTS["block.top"]:
						lastId = jQueryblocks.data("brId");
						for (var i = 0; i < numRows; i++) {
							for (var j = 0; j < numCols; j++) {
								jQueryarray[count++] = jQueryblockArr[i][j];			
							}
						}					
						break;
					default:
						lastId = jQueryblocks.data("trId");
						for (var i = numRows - 1; i >= 0; i--) {
							for (var j = 0; j < numCols; j++) {
								jQueryarray[count++] = jQueryblockArr[i][j];			
							}
						}
				}
				count = 0;
				intervalId = setInterval(
					function() {
						jQueryarray[count++].animate({width:blockSize, height:blockSize}, duration, rotator.easing(),
								function() {
									if (jQuery(this).attr("id") == lastId) {
										rotator.setComplete(jQueryimg);
									}
								});	
						if (count == total) {
							clearInterval(intervalId);	
						}
					}, delay);
			}
			
			//random block effect
			var randomAnimate = function(jQueryimg) {
				shuffleArray(jQueryarr);
				var i = 0;
				count = 0;
				intervalId = setInterval(
					function() {
						jQueryarr[i].animate({top:jQueryarr[i].data("top"), width:blockSize, height:blockSize, opacity:1}, duration, rotator.easing(),
								function() {
									if (++count == total) {
										rotator.setComplete(jQueryimg);
									}
								});	
						i++;
						if (i == total) {
							clearInterval(intervalId);
						}
					}, delay);
			}
			
			//spiral effect
			var spiral = function(jQueryimg, spiralOut) {			
				var i = 0, j = 0;
				var rowCount = numRows - 1;
				var colCount = numCols - 1;
				var dir = 0;
				var limit = colCount;
				var jQueryarray = new Array();
				while (rowCount >= 0 && colCount >=0) {
					var count = 0; 
					while(true) { 
						jQueryarray[jQueryarray.length] = jQueryblockArr[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 (jQueryarray.length > 0) {
					if (spiralOut) {
						jQueryarray.reverse();
					}
					var end = jQueryarray.length - 1;
					var lastId = jQueryarray[end].attr("id");
					var k = 0;				
					intervalId = setInterval(
						function() {
							jQueryarray[k].animate({opacity:1}, duration, rotator.easing(),
								function() {
									if (jQuery(this).attr("id") == lastId) {
										rotator.setComplete(jQueryimg);
									}
								});						
							if (k == end) {
								clearInterval(intervalId);	
							}	
							k++;
						}, delay);					
				}
			}
			
			init();
		}
		
		//class Rotator
		function Rotator(jQueryobj, opts) {
			//set options
			var screenWidth =  	getPosNumber(opts.width, 825);
			var screenHeight = 	getPosNumber(opts.height, 300);
			var margin = 		getNonNegNumber(opts.button_margin, 4);
			var globalEffect = 	opts.transition.toLowerCase();	
			var duration =   	getPosNumber(opts.transition_speed, DURATION);
			var globalDelay = 	getPosNumber(opts.delay, DEFAULT_DELAY);
			var rotate = 		opts.auto_start;	
			var cpPos =			opts.cpanel_position.toLowerCase();
			var cpAlign = 		opts.cpanel_align.toUpperCase();
			var buttonWidth =  	getPosNumber(opts.button_width, 24);
			var buttonHeight =	getPosNumber(opts.button_height, 24);
			var displayThumbs = opts.display_thumbs;
			var displayDBtns = 	opts.display_dbuttons;
			var displayPlayBtn =opts.display_playbutton;
			var displayNumbers = opts.display_numbers;
			var displayThumbImg = opts.display_thumbimg;
			var cpMouseover = 	opts.cpanel_mouseover;
			var textMousover = 	opts.text_mouseover;
			var pauseMouseover =opts.mouseover_pause;
			var tipType = 		opts.tooltip_type.toLowerCase();
			var textEffect = 	opts.text_effect.toLowerCase();
			var textSync =		opts.text_sync;
			var playOnce =		opts.play_once;
			var autoCenter =	opts.auto_center;
			var easing =		opts.easing;
			
			var numItems;
			var currIndex;
			var prevIndex;
			var delay;		
			var vStripes;
			var hStripes;
			var blocks;		
			var timerId;
			
			var jQueryrotator;
			var jQueryscreen;
			var jQuerymainLink;				
			var jQuerytextBox;
			var jQuerypreloader;			
			var jQuerycpanel;
			var jQuerythumbPanel;
			var jQuerythumbs;
			var jQuerybuttonPanel;	
			var jQueryplayBtn;
			var jQueryprevBtn;
			var jQuerynextBtn;
			var jQuerytimer;
			var jQuerytooltip;
			var jQueryitems;
			var jQueryinnerText;
			this.jQueryel = jQueryobj;
			
			//init rotator
			this.init = function() {
				jQueryrotator = 	jQuery(".wt-rotator", jQueryobj);
				jQueryscreen = 	jQueryrotator.find("div.screen");
				jQuerycpanel 	= jQueryrotator.find("div.c-panel");
				jQuerybuttonPanel= jQuerycpanel.find("div.buttons");
				jQuerythumbPanel = jQuerycpanel.find("div.thumbnails");
				jQuerythumbs 	= jQuerythumbPanel.find(">ul:first>li");
				jQuerytooltip = jQuery("<div id='rotator-tooltip'/>");
				timerId = null;
				currIndex = 0;
				prevIndex = -1;
				numItems = jQuerythumbs.size();	
				jQueryitems = new Array(numItems);
				
				//init components
				initScreen();
				initItems();
				initButtons();
				initCPanel();
				initTimerBar();
				
				jQueryrotator.css({width:screenWidth, height:screenHeight + (cpPos == OUTSIDE ? jQuerycpanel.outerHeight(): 0)});
				
				if (textMousover) {
					jQueryrotator.hover(displayText, hideText);
				}
				else {
					jQueryrotator.bind(UPDATE_TEXT, updateText);
				}
				
				//init transition components
				var bgColor = jQueryscreen.css("background-color");
				vStripes =  new VertStripes(this, screenWidth, screenHeight, getPosNumber(opts.vert_size, 50), bgColor, duration, getPosNumber(opts.vstripe_delay, 75));
				hStripes =  new HorzStripes(this, screenWidth, screenHeight, getPosNumber(opts.horz_size, 50), bgColor, duration, getPosNumber(opts.hstripe_delay, 75));				
				blocks = 	new Blocks(this, screenWidth, screenHeight, getPosNumber(opts.block_size, 75), bgColor, duration, getPosNumber(opts.block_delay, 25));	
				
				//init image loading
				loadImg(0);
				
				//display initial image
				loadContent(currIndex);
			}
			
			//set complete
			this.setComplete = function(jQueryimg) {
				showContent(jQueryimg);
			}
			
			//add to screen
			this.addToScreen = function(content) {
				jQuerymainLink.append(content);
			}
			
			//get center image
			this.centerImg = function() {
				return autoCenter;
			}
			
			this.easing = function() {
				return easing;
			}
			
			//init screen
			var initScreen = function() {
				var content =  "<a href='#'></a>\
								<div class='preloader'/>\
								<div id='timer'/>";
				jQueryscreen.empty().append(content);
				jQueryscreen.parent().append("<div class='desc'/>");
				jQuerymainLink 	= jQueryscreen.find(">a:first");				
			 	jQuerytextBox 	= jQueryscreen.parent().find("div.desc");
			 	jQuerypreloader 	= jQueryscreen.find("div.preloader");
				jQueryscreen.css({width:screenWidth, height:screenHeight});
				
				jQuerytextBox.append("<div class='inner-bg'/><div class='inner-text'/>");
				jQueryinnerText = jQuerytextBox.find("div.inner-text");
			}
			
			//init control panel
			var initCPanel = function() {	
				if (displayThumbs || displayDBtns || displayPlayBtn) {
					jQuerythumbPanel.css("height", jQuerythumbs.outerHeight());
					var maxWidth = screenWidth - (jQuerybuttonPanel.width() + margin);
					if (jQuerythumbPanel.width() > maxWidth) {
						jQuerythumbPanel.width(maxWidth);
					}
					if (cpPos == INSIDE) {
						jQuerycpanel.css({"margin-top":margin, "margin-right":0, "margin-bottom":margin, "margin-left":margin});
						var cpWidth = jQuerycpanel.outerWidth(true);
						var cpHeight = jQuerycpanel.outerHeight(true);
						switch (cpAlign) {
							case TOP_LEFT:
								setCPanel(0, 0, -cpHeight, "left");			
								break;
							case TOP_CENTER:
								setCPanel(0, Math.round((screenWidth - cpWidth)/2), -cpHeight, "right");
								break;
							case TOP_RIGHT:
								setCPanel(0, (screenWidth - cpWidth), -cpHeight, "right");
								break;
							case BOTTOM_LEFT:
								setCPanel((screenHeight - cpHeight), 0, screenHeight, "left");
								break;
							case BOTTOM_CENTER:
								setCPanel((screenHeight - cpHeight), Math.round((screenWidth - cpWidth)/2), screenHeight, "right");
								break;
							default:
								setCPanel((screenHeight - cpHeight), (screenWidth - cpWidth), screenHeight, "right");
						}
						
						if (cpMouseover) {
							jQueryrotator.hover(displayCPanel, hideCPanel);
						}
					}
					else {
						if (jQueryrotator.outerWidth() - jQueryrotator.width() > 0) {
							jQuerycpanel.css({"border-left":"none", "border-right":"none"});
						}
						jQuerycpanel.css({"padding-top":margin, "padding-bottom":margin}).addClass("cp-bg");
						var cpWidth = jQuerycpanel.outerWidth();
						switch (cpAlign) {
							case TOP_LEFT:
								setOutsideCPanel(true, margin, "left");
								break;
							case TOP_CENTER:
								setOutsideCPanel(true, Math.round((screenWidth - cpWidth)/2), "right");
								break;
							case TOP_RIGHT:
								setOutsideCPanel(true, screenWidth - cpWidth, "right");
								break;
							case BOTTOM_LEFT:
								setOutsideCPanel(false, margin, "left");
								break;
							case BOTTOM_CENTER:
								setOutsideCPanel(false, Math.round((screenWidth - cpWidth)/2), "right");
								break;
							default:
								setOutsideCPanel(false, screenWidth - cpWidth, "right");					
						}
					}
					jQuerycpanel.css("visibility", "visible");
				}
			}
			
			//set control panel attributes
			var setCPanel = function(yPos, xPos, offset, align) {
				jQuerycpanel.data({offset:offset, pos:yPos}).css({top:(cpMouseover ? offset : yPos), left:xPos});
				jQuerythumbPanel.css("float", align);
				jQuerybuttonPanel.css("float", align);
				jQuerycpanel.css({width:jQuerythumbPanel.width() + jQuerybuttonPanel.width(), height:jQuerythumbPanel.height()});
			}
			
			//set outside control panel attributes
			var setOutsideCPanel = function(top, leftPad, align) {
				if (top) {
					jQuerycpanel.css({"border-top":"none", top:0});
					jQueryscreen.css("top",jQuerycpanel.outerHeight());
				}
				else {
					jQuerycpanel.css({"border-bottom":"none", top:screenHeight});
					jQueryscreen.css("top",0);
				}
				jQuerycpanel.css({"padding-left":leftPad, "padding-right":screenWidth - (leftPad + jQuerycpanel.width())});
				jQuerythumbPanel.css("float", align);
				jQuerybuttonPanel.css("float", align);	   
			}
			
			//init buttons
			var initButtons = function() {
				jQueryplayBtn 	= jQuerybuttonPanel.find("div.play-btn");
				jQueryprevBtn 	= jQuerybuttonPanel.find("div.prev-btn");
				jQuerynextBtn 	= jQuerybuttonPanel.find("div.next-btn");
				var props = {"margin-right":margin, width:buttonWidth, height:buttonHeight};
				//config directional buttons
				if (displayDBtns) {					
					jQueryprevBtn.css(props).click(prevImg).mouseover(buttonOver).mouseout(buttonOut).mousedown(preventDefault);
					jQuerynextBtn.css(props).click(nextImg).mouseover(buttonOver).mouseout(buttonOut).mousedown(preventDefault);					
				}
				else {
					jQueryprevBtn.hide();
					jQuerynextBtn.hide();
				}
				
				//config play button
				if (displayPlayBtn) {
					if (rotate) {
						jQueryplayBtn.addClass("pause");
					}			
					jQueryplayBtn.css(props).click(togglePlay).mouseover(buttonOver).mouseout(buttonOut).mousedown(preventDefault);
				}
				else {
					jQueryplayBtn.hide();
				}
				
				var jQuerybuttons = jQuerybuttonPanel.find(":visible");
				jQuerybuttonPanel.css({width:jQuerybuttons.size() * jQuerybuttons.outerWidth(true), height:jQuerybuttons.outerHeight(true)});
				
				if (pauseMouseover) {
					jQueryrotator.hover(pause, play);
				}
			}			
			
			//init timer bar
			var initTimerBar = function() {
				jQuerytimer = jQueryscreen.find("#timer").data("pct", 1);
				if (opts.display_timer) {
					var align = opts.timer_align.toLowerCase();
					jQuerytimer.css("visibility", "visible");
					jQuerytimer.css(align == "bottom" ? "bottom" : "top", 0);
				}
				else {
					jQuerytimer.hide();
				}
			}
			
			//init items
			var initItems = function() {
				var padding = jQueryinnerText.outerHeight() - jQueryinnerText.height();
				jQuerythumbs.each(
					function(n) {
						var jQueryimgLink = jQuery(this).find(">a:first");
						jQuery(this).data({imgurl:jQueryimgLink.attr("href"), caption:jQueryimgLink.attr("title"), tturl:jQueryimgLink.find(">img").attr("src"),
							   		  effect:EFFECTS[jQuery(this).attr("effect")] != undefined ? EFFECTS[jQuery(this).attr("effect")] : EFFECTS[globalEffect],
							   		  delay:getPosNumber(jQuery(this).attr("delay"), globalDelay)});
						initTextData(jQuery(this), padding);				
						jQueryitems[n] = jQuery(this);
						
						if (displayNumbers) {
							jQuery(this).append(n+1);
						}
					}
				);
				jQueryinnerText.css({width:"auto", height:"auto"}).html("");
				jQuerytextBox.css("visibility", "visible");
				
				if (displayThumbImg) {
					jQuerythumbs.addClass("image");
					jQuerythumbs.find(">a:first").removeAttr("title").find(">img").removeAttr("alt");
				}
						
				if (opts.shuffle) {
					shuffleItems();
				}
				
				if (displayThumbs) {					
					jQuerythumbs.css({width:buttonWidth, height:buttonHeight, "line-height":buttonHeight + "px", "margin-right":margin})
						   .mouseover(itemOver).mouseout(itemOut).mousedown(preventDefault);
					jQuerythumbPanel.css({width:jQuerythumbs.size() * jQuerythumbs.outerWidth(true), height:jQuerythumbs.outerHeight(true)}).click(selectItem);	   
					if (tipType == "text" || tipType == "image") {
						initTooltip();
					}
				}
				else {
					jQuerythumbs.hide();
				}
			}			
			
			//init text data
			var initTextData = function(jQueryitem, padding) {				
				var jQueryp = jQueryitem.find(">div:hidden");				
				var textWidth =  getPosNumber(parseInt(jQueryp.css("width")) - padding, 300);				
				var textHeight = getPosNumber(parseInt(jQueryp.css("height")) - padding, 0);
				jQueryinnerText.width(textWidth).html(jQueryp.html());
				if (textHeight < jQueryinnerText.height()) {
					textHeight = jQueryinnerText.height();
				}
				jQueryitem.data("textbox", {x:jQueryp.css("left"), y:jQueryp.css("top"), w:textWidth + padding, h:textHeight + padding, color:jQueryp.css("color"), bgcolor:jQueryp.css("background-color")});
			}
			
			//init tool tip
			var initTooltip = function() {
				jQuery("body").append(jQuerytooltip);
				
				var content, upClass, downClass;
				if (tipType == "text") {
					content = "<div class='tt-txt'/>";
					upClass = "txt-up";
					downClass = "txt-down";
					jQuerythumbs.mouseover(showTooltip).mouseout(hideTooltip).bind("mousemove", moveTooltip);
				}
				else if (tipType == "image") {
					content = "<img class='tt-img'/>";
					upClass = "img-up";
					downClass = "img-down";
					jQuerythumbs.mouseover(showImgTooltip).mouseout(hideTooltip);
				}
				
				jQuerytooltip.append(content);
				switch (cpAlign) {
					case TOP_LEFT: case TOP_CENTER: case TOP_RIGHT:
						jQuerytooltip.data("bottom",true).addClass(downClass);
						break;
					default:
						jQuerytooltip.data("bottom",false).addClass(upClass);
				}
				
				if (jQuery.browser.msie && parseInt(jQuery.browser.version) <= 6) {
					jQuerytooltip.css("background-image", "none").find(":only-child").css("margin",0);
				}
			}
			
			//show image tooltip
			var showImgTooltip = function(e) {
				var tturl = jQueryitems[jQuery(this).index()].data("tturl");
				if (tturl != undefined) {
					var jQueryttImg = jQuerytooltip.find(">img.tt-img");
					jQueryttImg.attr("src", tturl);
					if (jQueryttImg[0].complete || jQueryttImg[0].readyState == "complete") {						
						var yOffset = jQuerytooltip.data("bottom") ? jQuery(this).outerHeight() : -jQuerytooltip.outerHeight();
						var offset = jQuery(this).offset();
						jQuerytooltip.css({top:offset.top + yOffset, left:offset.left + ((jQuery(this).outerWidth() - jQuerytooltip.outerWidth())/2)})
								.stop(true, true).delay(TOOLTIP_DELAY).fadeIn(300);
					}
				}
			}
			
			//show tooltip
			var showTooltip = function(e) {
				var caption = jQueryitems[jQuery(this).index()].data("caption");
				if (caption != "") {					
					jQuerytooltip.find(">div.tt-txt").html(caption);
					var yOffset = jQuerytooltip.data("bottom") ? 0 : -jQuerytooltip.outerHeight(true);
					jQuerytooltip.css({top:e.pageY + yOffset, left:e.pageX}).stop(true, true).delay(TOOLTIP_DELAY).fadeIn(300);
				}
			}
			
			//tooltip move
			var moveTooltip = function(e) {
				var yOffset = jQuerytooltip.data("bottom") ? 0 : -jQuerytooltip.outerHeight(true);
				jQuerytooltip.css({top:e.pageY + yOffset, left:e.pageX});
			}
			
			//hide tooltip
			var hideTooltip = function() {
				jQuerytooltip.stop(true, true).fadeOut(0);
			}
			
			//display control panel
			var displayCPanel = function() {
				jQuerycpanel.stop(true).animate({top:jQuerycpanel.data("pos"), opacity:1}, ANIMATE_SPEED);
			}
			
			//hide control panel
			var hideCPanel = function() {
				jQuerycpanel.stop(true).animate({top:jQuerycpanel.data("offset"), opacity:0}, ANIMATE_SPEED);
			}
			
			//select list item
			var selectItem = function(e) {
				var jQueryitem = jQuery(e.target);
				if (jQueryitem[0].nodeName != "LI") {
					jQueryitem = jQueryitem.parents("li").eq(0);
				}
				var i = jQueryitem.index();
				if (i > -1 && i != currIndex) {					
					resetTimer();
					prevIndex = currIndex;
					currIndex = i;
					loadContent(currIndex);
					hideTooltip();					
				}
				return false;
			}
			
			//on item mouseover
			var itemOver = function() {
				jQuery(this).addClass("thumb-over");
			}
			
			//on item mouseout
			var itemOut = function() {
				jQuery(this).removeClass("thumb-over");
			}
			
			//go to previous image
			var prevImg = function() {
				resetTimer();
				prevIndex = currIndex;
				currIndex = (currIndex > 0) ? (currIndex - 1) : (numItems - 1);
				loadContent(currIndex);	
				return false;
			}
			
			//go to next image
			var nextImg = function() {
				resetTimer();
				prevIndex = currIndex;
				currIndex = (currIndex < numItems - 1) ? (currIndex + 1) : 0;
				loadContent(currIndex);
				return false;
			}
			
			//play/pause
			var togglePlay = function() {
				rotate = !rotate;
				jQuery(this).toggleClass("pause", rotate);					
				rotate ? startTimer() : pauseTimer();
				return false;
			}
			
			//play
			var play = function() {
				rotate = true;
				jQueryplayBtn.toggleClass("pause", rotate);
				startTimer();
			}

			//pause
			var pause = function() {
				rotate = false;
				jQueryplayBtn.toggleClass("pause", rotate);
				pauseTimer();
			}
			
			//pause on last item
			var pauseLast = function(i) {
				if (i == numItems - 1) {
					rotate = false;
					jQueryplayBtn.toggleClass("pause", rotate);
				}
			}
					
			//on button over
			var buttonOver = function() {
				jQuery(this).addClass("button-over");
			}
			
			//on button out
			var buttonOut = function() {
				jQuery(this).removeClass("button-over");
			}
			
			//update text box
			var updateText = function(e) {
				if (!jQuerytextBox.data("visible")) {
					jQuerytextBox.data("visible", true);
					var text = jQueryitems[currIndex].find(">div:first").html();
					if (text && text.length > 0) {			
						var data = jQueryitems[currIndex].data("textbox");
						jQueryinnerText.css("color",data.color);
						jQuerytextBox.find(".inner-bg").css("background-color",data.bgcolor);
						switch(TEXT_EFFECTS[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() {
				jQuerytextBox.data("visible", false).stop(true, true);
				switch(TEXT_EFFECTS[textEffect]) {
					case TEXT_EFFECTS["fade"]:
						if (jQuery.browser.msie) {
							jQueryinnerText.css("opacity",0);
						}
						jQuerytextBox.fadeOut(ANIMATE_SPEED, function() { jQuery(this).css("display", "none"); });
						break;
					case TEXT_EFFECTS["down"]:
						jQueryinnerText.html("");
						jQuerytextBox.animate({height:0}, ANIMATE_SPEED);
						break;
					case TEXT_EFFECTS["right"]:
						jQueryinnerText.html("");
						jQuerytextBox.animate({width:0}, ANIMATE_SPEED);
						break;
					case TEXT_EFFECTS["left"]:
						jQueryinnerText.html("");
						jQuerytextBox.animate({width:0, "margin-left":jQuerytextBox.outerWidth()}, ANIMATE_SPEED);
						break;
					case TEXT_EFFECTS["up"]:
						jQueryinnerText.html("");
						jQuerytextBox.animate({height:0, "margin-top":jQuerytextBox.outerHeight()}, ANIMATE_SPEED);
						break;		
					default:
						jQuerytextBox.css("display", "none");
				}
			}
			
			//expand text effect
			var expandText = function(text, data, props1, props2) {
				jQueryinnerText.html("");
				jQuerytextBox.stop(true).css({display:"block", top:data.y, left:data.x}).css(props1).animate(props2, ANIMATE_SPEED, 
					function () {  
						jQueryinnerText.html(text);
					});  
			}
			
			//fade in text effect
			var fadeInText = function(text, data) {
				jQueryinnerText.css("opacity",1).html(text);
				jQuerytextBox.css({top:data.y, left:data.x, width:data.w, height:data.h})
						.stop(true, true).fadeIn(ANIMATE_SPEED, function() {
																	if (jQuery.browser.msie) {
																		jQueryinnerText[0].style.removeAttribute('filter'); 
																	}});  
			}
			
			//show text effect
			var showText = function(text, data) {
				jQuerytextBox.stop(true).css({display:"block", top:data.y, left:data.x, width:data.w, height:data.h});  
				jQueryinnerText.html(text);
			}
			
			//display text panel on mouseover
			var displayText = function() {
				jQueryrotator.unbind(UPDATE_TEXT).bind(UPDATE_TEXT, updateText).trigger(UPDATE_TEXT);
			}

			//hide text panel on mouseovers
			var hideText = function() {
				jQueryrotator.unbind(UPDATE_TEXT);
				resetText();
			}
			
			//load current content
			var loadContent = function(i) {
				if (playOnce) {
					pauseLast(i);
				}
				
				//select thumb
				jQuerythumbs.filter(".curr-thumb").removeClass("curr-thumb");				
				jQuery(jQuerythumbs.get(i)).addClass("curr-thumb");
				
				//set delay
				delay =	jQueryitems[i].data("delay");
				
				//reset text
				resetText();
				if (!textSync) {
					jQueryrotator.trigger(UPDATE_TEXT);
				}
				
				//set link
				var jQuerycurrLink = jQueryitems[i].find(">a:nth-child(2)");
				var href = jQuerycurrLink.attr("href");
				if (href) {					
					jQuerymainLink.unbind("click").css("cursor", "pointer").attr({href:href, target:jQuerycurrLink.attr("target")});
				}
				else {
					jQuerymainLink.click(preventDefault).css("cursor", "default");
				}
				
				//load image
				if (jQueryitems[i].data("img")) {
					jQuerypreloader.hide();	
					displayContent(jQueryitems[i].data("img"));
				}	
				else {	
					//load new image
					var jQueryimg = jQuery("<img class='main-img'/>");
					jQueryimg.attr("src", jQueryitems[i].data("imgurl"));								
					if (jQueryimg[0].complete || jQueryimg[0].readyState == "complete") {		
						jQuerypreloader.hide();
						storeImg(jQueryitems[i], jQueryimg);
						displayContent(jQueryimg);
					}
					else {
						jQuerypreloader.show();
						jQueryimg.load(
							function() {
								jQuerypreloader.hide();
								storeImg(jQueryitems[i], jQuery(this));
								displayContent(jQuery(this));
							}
						).error(
							function() {
								alert("Error loading image");
							}
						);						
					}
				}	    
			}
			
			//display content
			var displayContent = function(jQueryimg) {
				//clear
				vStripes.clear();
				hStripes.clear();
				blocks.clear();
				setPrevious();
				
				//get effect number
				var effect = jQueryitems[currIndex].data("effect");				
				if (effect == EFFECTS["none"] || effect == undefined) {
					showContent(jQueryimg);
					return;
				}
				else if (effect == EFFECTS["fade"]) {
					fadeInContent(jQueryimg);
					return;
				}
				
				if (effect == EFFECTS["random"]) {
					effect = Math.floor(Math.random() * (ei - 3));
				}
				
				if (effect < EFFECTS["vert.tl"]) {
					blocks.displayContent(jQueryimg, effect);
				}
				else if (effect < EFFECTS["horz.tl"]) {
					vStripes.displayContent(jQueryimg, effect);
				}
				else {
					hStripes.displayContent(jQueryimg, effect);					
				}
			}
			
			//set previous
			var setPrevious = function() {
				if (prevIndex >= 0) {
					var currSrc = jQuery("img#curr-img").attr("src");
					var prevSrc = jQueryitems[prevIndex].data("imgurl");
					if (currSrc != prevSrc) {
						jQuery("img.main-img", jQuerymainLink).removeAttr("id").hide();
						var jQueryimg = jQuery("img.main-img", jQuerymainLink).filter(function() { return jQuery(this).attr("src") == prevSrc; });
						jQuery(jQueryimg.get(0)).show();
					}
				}
			}
			
			//display content (no effect)
			var showContent = function(jQueryimg) {
				if (textSync) {
					jQueryrotator.trigger(UPDATE_TEXT);
				}
				jQuery("img.main-img", jQuerymainLink).removeAttr("id").hide();
				jQueryimg.attr("id", "curr-img").show();
				startTimer();
			}
			
			//display content (fade effect)
			var fadeInContent = function(jQueryimg) {
				jQuery("img#curr-img", jQuerymainLink).stop(true, true);
				jQuery("img.main-img", jQuerymainLink).removeAttr("id").css("z-index", 0);
				jQueryimg.attr("id", "curr-img").stop(true, true).css({opacity:0,"z-index":1}).show().animate({opacity:1}, duration, easing,
					function() {
						jQuery("img.main-img:not('#curr-img')", jQuerymainLink).hide();
						if (textSync) {
							jQueryrotator.trigger(UPDATE_TEXT);
						}
						startTimer();
					}
				);	
			}
			
			//load image
			var loadImg = function(loadIndex) {
				var jQueryitem = jQueryitems[loadIndex];
				var jQueryimg = jQuery("<img class='main-img'/>");
				jQueryimg.attr("src", jQueryitem.data("imgurl"));
				jQueryimg.load(function() {
							if (!jQueryitem.data("img")) {
								storeImg(jQueryitem, jQuery(this));
							}
							loadIndex++
							if (loadIndex < numItems) {
								loadImg(loadIndex);
							}
						})
					.error(function() {
							//error loading image, continue next
							loadIndex++
							if (loadIndex < numItems) {
								loadImg(loadIndex);
							}
						});
			}
			
			//process & store image
			var storeImg = function(jQueryitem, jQueryimg) {
				jQuerymainLink.append(jQueryimg);
				if (autoCenter && jQueryimg.width() > 0 && jQueryimg.height() > 0) {
					var tDiff = (screenHeight - jQueryimg.height())/2;
					var lDiff = (screenWidth  - jQueryimg.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;
					}
					jQueryimg.css({top:top, left:left, "padding-top":vPad, "padding-bottom":vPad, "padding-left":hPad, "padding-right":hPad});
				}
				jQueryitem.data("img", jQueryimg);
			}
			
			//start timer
			var startTimer = function() {
				if (rotate && timerId == null) {
					var duration = Math.round(jQuerytimer.data("pct") * delay);
					jQuerytimer.animate({width:(screenWidth+1)}, duration, "linear");
					timerId = setTimeout(nextImg, duration);					
				}
			}
			
			//reset timer
			var resetTimer = function() {
				clearTimeout(timerId);
				timerId = null;
				jQuerytimer.stop(true).width(0).data("pct", 1);
			}
			
			//pause timer
			var pauseTimer = function() {
				clearTimeout(timerId);
				timerId = null;
				var pct = 1 - (jQuerytimer.width()/(screenWidth+1));
				jQuerytimer.stop(true).data("pct", pct);
			}
			
			//shuffle items
			var shuffleItems = function() {			
				for (var i = 0; i < jQueryitems.length; i++) {
					var ri = Math.floor(Math.random() * jQueryitems.length);
					var temp = jQueryitems[i];	
					jQueryitems[i] = jQueryitems[ri];
					jQueryitems[ri] = temp;				
				}
			}
			
			//prevent default behavior
			var preventDefault = function() {
				return false;
			}
		}		
			
		//get positive number
		var getPosNumber = function(val, defaultVal) {
			if (!isNaN(val) && val > 0) {
				return val;
			}
			return defaultVal;
		}
		
		//get nonnegative number
		var getNonNegNumber = function(val, defaultVal) {
			if (!isNaN(val) && val >= 0) {
				return val;
			}
			return defaultVal;
		}
		
		//shuffle array
		var shuffleArray = function(arr) {
			var total =  arr.length;
			for (var i = 0; i < total; i++) {
				var ri = Math.floor(Math.random() * total);
				var temp = arr[i];
				arr[i] = arr[ri];
				arr[ri] = temp;	
			}	
		}
		
		var defaults = { 
			width:825,
			height:300,
			button_width:24,
			button_height:24,
			button_margin:4,			
			auto_start:true,
			delay:DEFAULT_DELAY,
			transition:"fade",
			transition_speed:DURATION,
			cpanel_position:INSIDE,
			cpanel_align:BOTTOM_RIGHT,
			timer_align:"top",
			display_thumbs:true,
			display_dbuttons:true,
			display_playbutton:true,
			display_imgtooltip:true,
			display_numbers:true,
			display_thumbimg:false,
			display_timer:true,
			mouseover_pause:false,
			cpanel_mouseover:false,
			text_mouseover:false,
			text_effect:"fade",
			text_sync:true,
			tooltip_type:"text",
			shuffle:false,
			play_once:false,
			auto_center:false,
			block_size:75,
			vert_size:50,
			horz_size:50,
			block_delay:25,
			vstripe_delay:75,
			hstripe_delay:75,
			easing:""
		};
		
		var opts = jQuery.extend({}, defaults, params);		
		return this.each(
			function() {
				var rotator = new Rotator(jQuery(this), opts);
				rotator.init();
			}
		);
	}
})(jQuery);
