function quicklinkScroller(_initArray)
{
	this.qsWidth;
	this.qsListWidth=0;
	this.qsLeft=0;
	this.qsSpeed = _initArray.speed;
	this.qsScrollTime = _initArray.scrollTime * 1000;
	this.qsScrollValue = _initArray.autoScroll;
	this.qsScrollDirection="next";
	this.qsScrollInterval;
	this.qsElem = _initArray.id;
	this.qsPosition=0;
	this.qsListArray = [];
	this.qsOffsetArray = [];
	this.qsTargetElement = _initArray.targetElement;
	this.qsWindow = _initArray.windowElement;
	this.qsLoop = _initArray.loop || false;
	this.i=0;
	this.oldPosition=0;
	this.qsItemsInView = _initArray.itemsInView;
	this.qsShowTitle = _initArray.showTitle;
	this.qsDirectionArrows = _initArray.directionArrows || false;
	this.qsPauseOnRoll = _initArray.pauseOnRoll;
	this.qsObjectName = _initArray.objectName;
	this.qsThumbnails = _initArray.thumbnails || false;
	this.qstnID = this.qsElem.replace(/#/, '');
	this.qsCurrentThumb = 0;
	this.qsCurrentThumbScroll = 0;
	this.qsCSSOffset=0;
	this.qsThumbsInView = _initArray.thumbsInView || 4;
	this.qsImageCount = _initArray.imageCount || false;
	this.qsTransitionType = _initArray.transitionType;

	this.init();
}

quicklinkScroller.prototype.init = function()
{
	var myself = this;
	$(document).ready(function()
	{
		if(myself.qsThumbnails == true)
			myself.initThumbs();
		
		if($(myself.qsElem+" "+myself.qsTargetElement).length > 1)
		{
			if(myself.qsDirectionArrows.enabled == true && ($(myself.qsElem).find('#btnLeft').length == 0))
			{
				switch(myself.qsDirectionArrows.position)
				{
					case 'bottom':
						$('#'+myself.qstnID+'_qs_thumbnailWrapper').prepend('<div id="btnLeft" class="disabledLeft" onclick="'+myself.qsObjectName+'.prev()"></div>');
						$('#'+myself.qstnID+'_qs_thumbnailWrapper').append('<div id="btnRight" onclick="'+myself.qsObjectName+'.next()"></div>');
						break;
					case 'inside':
						$(myself.qsElem).prepend('<div class="qsDirectionButton" id="btnRight" onclick="'+myself.qsObjectName+'.prepareSlide(\''+myself.qsTransitionType+'Next\')"></div>');
						$(myself.qsElem).prepend('<div class="qsDirectionButton" id="btnLeft" onclick="'+myself.qsObjectName+'.prepareSlide(\''+myself.qsTransitionType+'Prev\')"></div>');
						break;
					default:
						$(myself.qsElem).prepend('<div id="btnLeft" class="disabledLeft" onclick="'+myself.qsObjectName+'.prepareSlide(\''+myself.qsTransitionType+'Prev\')"></div>');
						$(myself.qsElem).append('<div id="btnRight" onclick="'+myself.qsObjectName+'.prepareSlide(\''+myself.qsTransitionType+'Next\')"></div>');
						break;
				}
			}

		}
		
		myself.qsWidth = $(myself.qsElem).width()-($("#btnLeft").width()+$("#btnRight").width());
		var elementCount = $(myself.qsElem+" "+myself.qsTargetElement).length;
		$(myself.qsElem+" "+myself.qsTargetElement).each(function(i, elem)
		{
			myself.qsOffsetArray[i] = myself.qsListWidth;
			myself.qsListWidth += parseInt($(elem).outerWidth());
			myself.qsListArray[i] = parseInt($(elem).outerWidth());
			$(elem).addClass("qsT_"+i);

			if(myself.qsTransitionType == "fade")
			{
				$(elem).css({"position" : "absolute", "top" : "0", "left" : "0", "z-index" : elementCount-i});
			}
		});
		if(myself.qsTransitionType != "fade")
			$(myself.qsElem+" "+myself.qsWindow).width(myself.qsListWidth);
		else
			$(myself.qsElem+" "+myself.qsWindow).width($(myself.qsElem).width());

		if(myself.qsImageCount == true)
		{
			if($(myself.qsElem+' .imageCount').length == 0)
				$(myself.qsElem).prepend("<div class='imageCount'></div>");
			myself.updateTitleCount();
		}

		setTransition();

		$(myself.qsElem).hover(function()
		{
			$(myself.qsElem+" .qsDirectionButton, "+myself.qsElem+" .imageCount").stop(true, true).animate({"opacity":"1"});
			if(myself.qsPauseOnRoll == true) 
				clearTimeout(myself.qsScrollInterval);
		},
		function()
		{
			$(myself.qsElem+" .qsDirectionButton, "+myself.qsElem+" .imageCount").stop(true, true).animate({"opacity":"0"});
			if(myself.qsScrollValue == true && myself.qsPauseOnRoll == true) 
				setTransition();
		});
	});

	function setTransition()
	{
		if(myself.qsScrollValue == true && $(myself.qsElem+" "+myself.qsTargetElement).length > 1) {
			var transType = '';
			switch(myself.qsTransitionType)
			{
				case "fade":
				case "fadeNext":
					transType = "fadeNext";
					break;
				
				default:
					transType = "slideNext";
					break;
			}

			myself.qsScrollInterval = setTimeout(myself.qsObjectName+".prepareSlide('"+transType+"')", myself.qsScrollTime);
		}
	}
	
	if(myself.qsShowTitle == true)
	{
		if($(myself.qsElem+' .imageTitle').length == 0)
			$(myself.qsElem).prepend("<div class='imageTitle'></div>");
		myself.updateTitle();
	}

	

	myself.restyleThumbs('qsT_0');
}
	
quicklinkScroller.prototype.destroy = function()
{
	this.qsWidth=0;
	this.qsListWidth=0;
	this.qsLeft=0;
	this.qsSpeed = 0;
	this.qsScrollTime = 0;
	this.qsScrollValue = false;
	this.qsScrollDirection="next";
	clearTimeout(this.qsScrollInterval);
	this.qsElem = "";
	this.qsPosition=0;
	this.qsListArray = [];
	this.qsTargetElement = "";
	this.qsWindow = "";
	this.qsLoop = false;
	this.i=0;
	this.oldPosition=0;
	this.qsItemsInView = 0;
	this.qsShowTitle = false;
	this.qsDirectionArrows = false;
	this.qsPauseOnRoll = true;
	this.qsObjectName = "";
}

quicklinkScroller.prototype.refresh = function()
{
	var myself = this;

	myself.qsWidth = $(myself.qsElem).width()-($("#btnLeft").width()+$("#btnRight").width());
	$(myself.qsElem+" "+myself.qsTargetElement).each(function(i, elem)
	{
		myself.qsOffsetArray[i] = myself.qsListWidth;
		myself.qsListWidth += parseInt($(elem).outerWidth());
		myself.qsListArray[i] = parseInt($(elem).outerWidth());
	});
	$(myself.qsElem+" "+myself.qsWindow).width(myself.qsListWidth);
}
	
quicklinkScroller.prototype.prepareSlide = function(direction)
{
	var myself = this;
	switch(direction)
	{
		case 'slideNext':
			myself.next();
			break;
		case 'slidePrev':
			myself.prev();
			break;
		case 'next_click':
			myself.qsScrollValue=false;
			myself.next();
			break;
		case 'prev_click':
			myself.qsScrollValue=false;
			myself.prev();
			break;
		case 'fadeNext':
			myself.fadeNext();
			break;
		case 'fadePrev':
			myself.fadePrev();
			break;
	}
}
	
quicklinkScroller.prototype.next = function(amount)
{
	var myself = this;
	clearTimeout(myself.qsScrollInterval);
	myself.qsScrollInterval=0;

	var moveAmount = (amount != undefined) ? myself.qsOffsetArray[amount] : myself.qsListArray[myself.qsPosition];

	if(myself.qsThumbnails != true || amount != undefined)
	{
		myself.updateTitle();
		
		if(/webkit/i.test(navigator.userAgent) == true)
		{
			if(myself.qsLoop == true)
			{
				clearTimeout(myself.qsTimer);
				myself.qsFunction();
				$(myself.qsTargetElement).parent().css(
					{
						'-webkit-transition': (myself.qsSpeed / 1000)+'s ease-in-out',
						'-webkit-transform': 'translateX(-'+moveAmount+'px)'
					}
				);
				myself.qsFunction = function()
				{
					$(myself.qsElem+" "+myself.qsTargetElement+":first").detach().appendTo(myself.qsElem+" "+myself.qsWindow);
					$(myself.qsTargetElement).parent().css(
						{
							'-webkit-transition': '0s linear',
							'-webkit-transform': 'translateX(0px)'
						}
					);

					myself.qsFunction = function(){ return false; };
				};
				myself.qsTimer = setTimeout(myself.qsFunction, myself.qsSpeed);
			} else {
				$(myself.qsTargetElement).parent().css(
					{
						'-webkit-transition': (myself.qsSpeed / 1000)+'s ease-in-out',
						'-webkit-transform': 'translateX(-'+moveAmount+'px)'
					}
				);
			}
		} else {
			$(myself.qsTargetElement).parent().stop(true, true).animate({ 'left': '+=-'+moveAmount+'px' }, myself.qsSpeed, function()
			{
				if(myself.qsLoop == true)
				{
					$(myself.qsElem+" "+myself.qsTargetElement+":first").detach().appendTo(myself.qsElem+" "+myself.qsWindow);
					$(myself.qsTargetElement).parent().css('left', '0px');
				}
			});
		}
		if(myself.qsPosition >= ($(myself.qsElem+" "+myself.qsTargetElement).length-1)) myself.qsPosition = 0;
		else myself.qsPosition++;
	} else {
		myself.thumb_next();
	}

	if(myself.qsScrollValue == true)
	{
		clearTimeout(myself.qsScrollInterval);
		myself.qsScrollInterval = setTimeout(myself.qsObjectName+".prepareSlide('slideNext')", myself.qsScrollTime);
	}

	if(myself.qsImageCount == true)
		myself.updateTitleCount();
}

quicklinkScroller.prototype.prev = function(amount)
{
	var myself = this;
	myself.qsScrollInterval=0;
	myself.qsScrollValue=false;

	var moveAmount = (amount != undefined) ? myself.qsOffsetArray[amount] : myself.qsListArray[myself.qsPosition];

	if(myself.qsThumbnails != true || amount != undefined)
	{
		myself.updateTitle();

		if(myself.qsPosition == 0)
			myself.qsPosition = ($(myself.qsTargetElement).length-1);
		else 
			myself.qsPosition--;

		if(/webkit/i.test(navigator.userAgent) == true)
		{
			if(myself.qsLoop == true)
			{
				$(myself.qsElem+" "+myself.qsTargetElement+":last").detach().prependTo(myself.qsElem+" "+myself.qsWindow);
				$(myself.qsTargetElement).parent().css(
					{
						'-webkit-transition': '0s linear',
						'-webkit-transform': 'translateX(-'+moveAmount+'px)'
					}
				);
				setTimeout(function()
				{
					$(myself.qsTargetElement).parent().css(
						{
							'-webkit-transition': (myself.qsSpeed / 1000)+'s ease-in-out',
							'-webkit-transform': 'translateX(0px)'
						}
					);
				}, 100);
			} else {
				$(myself.qsTargetElement).parent().css(
					{
						'-webkit-transition': (myself.qsSpeed / 1000)+'s ease-in-out',
						'-webkit-transform': 'translateX(-'+moveAmount+'px)'
					}
				);
			}
		} else {
			if(myself.qsLoop == true)
			{
				$(myself.qsElem+" "+myself.qsTargetElement+":last").detach().prependTo(myself.qsElem+" "+myself.qsWindow);
				$(myself.qsTargetElement).parent().stop(true, true).css({'left': '-'+$(myself.qsTargetElement+':first').outerWidth()+'px'});
			}
			$(myself.qsTargetElement).parent().stop(true, true).animate({ 'left': '-=-'+moveAmount+'px' }, myself.qsSpeed);
		}
		$(myself.qsWindow+" br:not(:last)").remove();
	} else {
		myself.thumb_prev();
	}

	if(myself.qsScrollValue == true)
	{
		clearTimeout(myself.qsScrollInterval);
		myself.qsScrollInterval = setTimeout(myself.qsObjectName+".prepareSlide('slidePrev')", myself.qsScrollTime);
	}

	if(myself.qsImageCount == true)
		myself.updateTitleCount();
}

quicklinkScroller.prototype.fadeNext = function()
{
	var myself = this;
	var elementCount = $(myself.qsElem+" "+myself.qsTargetElement).length;
	if(elementCount > 1)
	{
		if(myself.qsLoop == true)
		{
			$(myself.qsElem+" "+myself.qsTargetElement+":first").stop(true, true).animate({ 'opacity': '0' }, myself.qsSpeed, function(){
				$(myself.qsElem+" "+myself.qsTargetElement).each(function(i, elem) {
					var zVal = parseInt($(elem).css("z-index"))+1;

					$(elem).css({"z-index" : zVal});
				});
				$(this).css({"opacity" : "1", "z-index" : "1"});
			});
			$(myself.qsElem+" "+myself.qsTargetElement+":first").detach().appendTo(myself.qsElem+" "+myself.qsWindow);
		}

		if(myself.qsScrollValue == true)
		{
			clearTimeout(myself.qsScrollInterval);
			myself.qsScrollInterval = setTimeout(myself.qsObjectName+".prepareSlide('fadeNext')", myself.qsScrollTime);
		}

		if(myself.qsImageCount == true)
			myself.updateTitleCount();
	}
}

quicklinkScroller.prototype.fadePrev = function()
{
	var myself = this;
	var elementCount = $(myself.qsElem+" "+myself.qsTargetElement).length;
	if(elementCount > 1)
	{
		if(myself.qsLoop == true)
		{
			$(myself.qsElem+" "+myself.qsTargetElement+":last").detach().prependTo(myself.qsElem+" "+myself.qsWindow).css({"opacity" : "0", "z-index" : elementCount + 1});
			$(myself.qsElem+" "+myself.qsTargetElement+":first").stop(true, true).animate({ 'opacity': '1' }, myself.qsSpeed, function(){
				$(myself.qsElem+" "+myself.qsTargetElement).each(function(i, elem) {
					var zVal = parseInt($(elem).css("z-index"))-1;

					$(elem).css({"z-index" : zVal});
				});
			});
		}

		if(myself.qsScrollValue == true)
		{
			clearTimeout(myself.qsScrollInterval);
			myself.qsScrollInterval = setTimeout(myself.qsObjectName+".prepareSlide('fadeNext)", myself.qsScrollTime);
		}

		if(myself.qsImageCount == true)
			myself.updateTitleCount();
	}
}

quicklinkScroller.prototype.thumb_next = function()
{
	var myself = this;
	if(myself.qsCurrentThumbScroll <= myself.qsOffsetArray.length - myself.qsThumbsInView)
	{
		myself.qsCSSOffset = myself.qsCSSOffset+$('.qs_thumbnailImage:first').outerWidth();
		if(/webkit/i.test(navigator.userAgent) == true)
		{
			$('#'+myself.qstnID+'_qs_thumbnailWrapper .qs_thumbnailContainer').css(
				{
					'-webkit-transition': (myself.qsSpeed / 1000)+'s ease-in-out',
					'-webkit-transform': 'translateX(-'+myself.qsCSSOffset+'px)'
				}
			);
		} else {
			$('#'+myself.qstnID+'_qs_thumbnailWrapper .qs_thumbnailContainer').stop(true, true).animate({ 'left': '-'+myself.qsCSSOffset+'px' }, myself.qsSpeed);
		}
		myself.qsCurrentThumbScroll++;
	}
}

quicklinkScroller.prototype.thumb_prev = function()
{
	var myself = this;
	if(myself.qsCurrentThumbScroll > 0 && myself.qsListArray.length > myself.qsThumbsInView)
	{
		myself.qsCSSOffset = myself.qsCSSOffset-$('.qs_thumbnailImage:first').outerWidth();
		if(/webkit/i.test(navigator.userAgent) == true)
		{
			$('#'+myself.qstnID+'_qs_thumbnailWrapper .qs_thumbnailContainer').css(
				{
					'-webkit-transition': (myself.qsSpeed / 1000)+'s ease-in-out',
					'-webkit-transform': 'translateX(-'+myself.qsCSSOffset+'px)'
				}
			);
		} else {
			$('#'+myself.qstnID+'_qs_thumbnailWrapper .qs_thumbnailContainer').stop(true, true).animate({ 'left': '-'+myself.qsCSSOffset+'px' }, myself.qsSpeed);
		}

		myself.qsCurrentThumbScroll--;
	}
}
	
quicklinkScroller.prototype.updateTitle = function()
{
	var myself = this;
	if(myself.qsShowTitle == true)
	{
		$(myself.qsElem+' .imageTitle').html( $(myself.qsTargetElement+" img").eq(1).attr('title') ).css(
		{
			'left': ( ($(myself.qsTargetElement).outerWidth()/2) - ($('.imageTitle').outerWidth()/2) )+'px'
		});
	}
}

quicklinkScroller.prototype.initThumbs = function()
{
	var myself = this;
	var tempWidth=0;
	if($('#'+myself.qstnID+'_qs_thumbnailWrapper').length == 0)
	{
		$(myself.qsElem).append('<div id="'+myself.qstnID+'_qs_thumbnailWrapper" class="qs_thumbnailWrapper"><div class="qs_thumbShield"><div class="qs_thumbnailContainer"></div></div></div>');

		$(myself.qsElem+" "+myself.qsTargetElement).find("img").each(function(i, elem)
		{
			$('#'+myself.qstnID+'_qs_thumbnailWrapper .qs_thumbnailContainer').append('<div class="qs_thumbnailImage qsT_'+i+'"><img src="'+$(elem).attr('src')+'" /></div>');
		});
		$('#'+myself.qstnID+'_qs_thumbnailWrapper .qs_thumbnailContainer .qs_thumbnailImage').each(function(i, elem)
		{
			 tempWidth += 85;
		});
		$('#'+myself.qstnID+'_qs_thumbnailWrapper .qs_thumbnailContainer').width(tempWidth);

		$('#'+myself.qstnID+'_qs_thumbnailWrapper .qs_thumbnailContainer .qs_thumbnailImage').click(function()
		{
			var tClass = $(this).attr('class');
			eval(myself.qsObjectName+'.swapImageByID("'+tClass+'")');
		});
	}
}

quicklinkScroller.prototype.swapImageByID = function(__tClass)
{
	var myself = this;
	var tClass = __tClass.split(' ');
	for(x in tClass)
	{
		if(/qsT/i.test(tClass[x]) == true)
		{
			tClass = tClass[x];
			break;
		}
	}

	var offsetLeft=$(myself.qsTargetElement).parent().css('left');
	offsetLeft = parseInt(offsetLeft.replace('px', ''));
	if(isNaN(offsetLeft) == true)
		offsetLeft = 0;

	var mClass = parseInt(tClass.replace('qsT_', ''));
	if(myself.qsCurrentThumb > mClass)
		myself.prev(mClass);
	else
		myself.next(mClass);
	
	myself.qsCurrentThumb = mClass;
	myself.restyleThumbs(tClass);
}

quicklinkScroller.prototype.restyleThumbs = function(__tClass)
{
	var myself = this;

	$('#'+myself.qstnID+'_qs_thumbnailWrapper .qs_thumbnailContainer .qs_thumbnailImage').each(function(i, elem)
	{
		if($(elem).hasClass(__tClass) == false)
		{
			$(elem).removeClass('qsT_Selected');
		} else {
			$(elem).addClass('qsT_Selected');
		}
	});
}

quicklinkScroller.prototype.updateTitleCount = function()
{
	var myself = this;

	var __tClass = $(myself.qsElem+" "+myself.qsTargetElement+":first").attr('class');
	var tClass = __tClass.split(' ');
	for(x in tClass)
	{
		if(/qsT/i.test(tClass[x]) == true)
		{
			tClass = tClass[x];
			break;
		}
	}
	var mClass = tClass.replace('qsT_', '');
	$(myself.qsElem+' .imageCount').html((parseInt(mClass)+1)+' / '+myself.qsListArray.length);
}
