/**
 * Creates the slider widget object.
 * 
 * @param 	p_config					configuration object
 *			p_config.layout				specify horizontal or vertical layout
 * 			p_config.wrapper_id			id of list wrapper
 * 			p_config.thumbs				id of individual list elements
 * 			p_config.startPos			starting position
 * 			p_config.transitionSpeed	transition speed
 * 			p_config.tnSpacing			overall width of list elements
 * 			p_config.tnPerTransition	number of list elements to use during transition
 * 			p_config.tnPerPage			number of list elements to be displayed on the page
 */
var SliderWidget = function(p_config) {
	var __dimension;
	var LAYOUT = p_config.layout;
	switch (LAYOUT) {
		case "horizontal":
		LAYOUT = "right";
		__dimension = "width"
		break;
		case "vertical":
		LAYOUT = "bottom";
		__dimension = "height"
		break;
		default:
		LAYOUT = "right";
		__dimension = "width"
		break;
	}
	var STARTPOS = parseInt(p_config.startPos);
	var TRANSITIONSPEED = parseInt(p_config.transitionSpeed);
	var TNSPACING = parseInt(p_config.tnSpacing);
	var TNPERTRANSITION = parseInt(p_config.tnPerTransition);
	var TNTRANSITIONPERPAGE = parseInt(p_config.tnPerPage);
	var TNWRAPPER = p_config.wrapper_id;
	var TN = p_config.thumbs;
	var NOITEMS = p_config.noitems;
	if(!NOITEMS) {
		NOITEMS = "No Items Found.";
	}
	var NAV = p_config.navControls;
	var rollInterval;
	this.loadImage = function(p_location,p_transition) {
		showImages(p_location,p_transition);
	}
	this.init = function() {
		if(LAYOUT==""||STARTPOS.toString()=="NaN"||TRANSITIONSPEED.toString()=="NaN"||TNSPACING.toString()=="NaN"||TNPERTRANSITION.toString()=="NaN"||TNTRANSITIONPERPAGE.toString()=="NaN"||TNWRAPPER==""||TN=="") {
			var __errorString = new String();
			__errorString = "One or more of the following parameters is incorrect. Please check the implementation.";
			var errorDiv = document.createElement("div");
			errorDiv.id = "error";
			errorDiv.style.display = "none";
			
			 $("body").append(errorDiv);
			document.getElementById("error").innerHTML = "<div>"+__errorString+"</div>";
			for(var elements in p_config) {
				__errorString += "\n"+elements+":"+p_config[elements];
				document.getElementById("error").innerHTML += "<div>"+elements+":"+p_config[elements]+"</div>";		 
			}
			
			if(typeof window.tb_show ==="function") {
				tb_show("Implementation Error","TB_inline?width=600&height=180&inlineId=error&bgcolor=ffffff&linkcolor=000000",null);
			} else {
				alert(__errorString);
			}		
		} else {		
			showImages($("."+TN),"fadeIn");
		}
		
	}
	this.autoRoll = function(p_config) {
		var __bounce = Boolean(p_config.bounce);
		var __speed = Number(p_config.speed);
		rollInterval = window.setInterval(function(){rollForward(__bounce,__speed)},__speed);
	}
	
	var tnWrapperSize = new Number();
	var arrayLen = 0;
	$("."+TN).each(function(index) {
		arrayLen = (index+1);
		$(this).css(__dimension, TNSPACING);
	});
	var oldHTML = $("#"+TNWRAPPER).html();
	var newHTML = "<img src='http://www.jewelrytelevision.com/content/39/30/7/2-0.gif'/>";
	$("#"+TNWRAPPER).html(newHTML);
	if(arrayLen==0) {
		var noProductsString ="<div class='noItemsFound'>"+NOITEMS+"</div>";
		$("#"+TNWRAPPER).html(noProductsString);
		$("."+NAV).hide();
	} else {
		$("#"+TNWRAPPER).html(oldHTML);
		$("."+NAV).show();
	}
	tnWrapperSize = TNSPACING*arrayLen;
	$("#"+TNWRAPPER).css(LAYOUT, STARTPOS);
	$("#"+TNWRAPPER).css(__dimension, tnWrapperSize);
	
	this.stepPrevious = function() {
		if(determinePageNum()>1) {
			STARTPOS -= TNSPACING*TNPERTRANSITION;
		}
		var layoutObject = new Object();
		layoutObject[LAYOUT] = STARTPOS;
		$("#"+TNWRAPPER).animate(layoutObject, TRANSITIONSPEED);
	}
	this.stepNext = function() {
		if(determinePageNum()<lastPageNum()) {
			STARTPOS += TNSPACING*TNPERTRANSITION;
			var layoutObject = new Object();
			layoutObject[LAYOUT] = STARTPOS;
			$("#"+TNWRAPPER).animate(layoutObject, TRANSITIONSPEED);
		}
	}
	var determinePageNum = function() {
		return Number((determineTNPos()-1)/TNPERTRANSITION)+1;
	}
	var lastPageNum = function() {
		return Number(Math.ceil(arrayLen/TNPERTRANSITION));
	}
	this.rollPrevious = function() {
		this.rollOff();
		rollInterval = window.setInterval(function(){rollBackward(false, TRANSITIONSPEED)},TRANSITIONSPEED);
	}
	this.rollNext = function() {
		this.rollOff();
		rollInterval = window.setInterval(function(){rollForward(false, TRANSITIONSPEED)},TRANSITIONSPEED);
		
	}
	
	this.rollOff = function() {
		clearInterval(rollInterval);
	}
	
	var rollBackward = function (p_bounce, p_speed) {
		if(STARTPOS<=0) {
			clearInterval(rollInterval);
			if(p_bounce) {
				rollInterval = window.setInterval(function(){rollForward(p_bounce, p_speed)},p_speed);
			}
		} else {
			STARTPOS-=1;
			$("#"+TNWRAPPER).css(LAYOUT, STARTPOS);
		}
	}
	
	var rollForward = function (p_bounce, p_speed) {
		var __leftoverTN = (arrayLen-TNTRANSITIONPERPAGE);
		if(determineTNPos()<=__leftoverTN) {
			STARTPOS+=1;
			$("#"+TNWRAPPER).css(LAYOUT, STARTPOS);
		} else {
			if(STARTPOS%TNSPACING==0) {
				clearInterval(rollInterval);
				if(p_bounce) {
					rollInterval = window.setInterval(function(){rollBackward(p_bounce, p_speed)},p_speed);
				}
			}
		}
	}
	var determineTNPos = function() {
		return Number(Math.floor(STARTPOS/TNSPACING)+1);
	}
	
}
var showImages = function(p_location,p_transition) {
	var counter=0;
	var cb=function() {
		if(counter<p_location.length) {
			$(p_location).eq(counter)[p_transition]("fast", cb);
		}
		counter++;
	}
	cb();
}
fbConsole = function(p_string) {
	if(window.console) {
		console.log(p_string);
	} else {
		alert(p_string);
	}
}



