var newSlider = new Class({
	Implements: [Options,Events],
	
	options: {
		width:'',
		height:'',
		itemWidth:'',
		itemHeight:'',
		itemPadding:0,
		itemBorderWidth:0,
		itemBorderColour:'',
		handleWidth:'',
		handleHeight:'',
		handleLeftImage:'',
		handleRightImage:'',
		handleLeftImageOver:'',
		handleRightImageOver:'',
		handleBackground:false,
		shiftAmount:1,
		imageNameAppend:'',
		targetDiv:'',
		name:'',
		onclickLink:'',
		forceInitialItemClick:false,
		clickFunction:function(){},
		addFunction:function(){}
	},
	
	initialize: function(options) {
		this.setOptions(options);
		this.itemArray = [];
		this.currentPosition = 0;
		this.currentDisplayWidth = 0;
		this.itemCount = 0;
		this.currentlyShifting = false;

		this.availableVisible = ((this.options.width.toInt())/(this.options.itemWidth.toInt()+this.options.itemPadding.toInt()+(this.options.itemBorderWidth.toInt()*2)));

		if ($(this.options.targetDiv).getStyle('position') != "absolute" && $(this.options.targetDiv).getStyle('position') != "relative") $(this.options.targetDiv).setStyle('position','relative');

		var slideButtonPreloadLeft = new Image(); slideButtonPreloadLeft.src = this.options.handleLeftImage;
		if (this.options.handleLeftImageOver != '') { var slideButtonPreloadLeftOver = new Image(); slideButtonPreloadLeftOver.src = this.options.handleLeftImageOver;}

		var slideButtonPreloadRight = new Image(); slideButtonPreloadRight.src = this.options.handleRightImage;
		if (this.options.handleRightImageOver != '') { var slideButtonPreloadRightOver = new Image(); slideButtonPreloadRightOver.src = this.options.handleRightImageOver;}



		this.slideContainer = new Element('DIV',{
			'styles':{
				'width':this.options.width,
				'height':this.options.height+(this.options.itemBorderWidth*2),
				'position':'relative'
			},
			'id':'slideContainer_' + this.options.name
		});

		var slideNavBacker = new Element('DIV',{
			'styles':{
				'width':this.options.handleWidth,
				'height':this.options.handleHeight,
				/*'height':this.options.height+(this.options.itemBorderWidth*2),*/
				'position':'absolute',
				'top':'0',
				'z-index':'2',
				'background':'#fff',
				'opacity':'1'
			}
		});

		if (this.options.handleBackground) {
			this.leftSlideNavBacker = slideNavBacker.clone().cloneEvents(slideNavBacker);
			this.rightSlideNavBacker = slideNavBacker.clone().cloneEvents(slideNavBacker);

			this.leftSlideNavBacker.set({
				'styles':{
					'left':'0',
					'display':'none'
				}
			});

			this.rightSlideNavBacker.set({
				'styles':{
					'right':'0'
				}
			});
		}

		var slideNavHolder = new Element('DIV',{
			'styles':{
				'width':this.options.handleWidth,
				/*'height':this.options.height+(this.options.itemBorderWidth*2),*/
				'height':this.options.handleHeight,
				'position':'absolute',
				'top':'0',
				'z-index':'3'
			},
			'id':'slideNavHolder_' + this.options.name
		});

		this.leftSlideNav = slideNavHolder.clone().cloneEvents(slideNavHolder);
		this.rightSlideNav = slideNavHolder.clone().cloneEvents(slideNavHolder);

		this.leftSlideNav.set({
			'styles':{
				'left':'0',
				'background':'url('+this.options.handleLeftImage+') no-repeat center center',
				'display':'none'
			},
			'id':'leftNav_' + this.options.name
		});
		$(this.leftSlideNav).store('classInstance',this);
		$(this.leftSlideNav).addEvent('click', function() {
			$(this).retrieve('classInstance').shiftBar(-this.retrieve('classInstance').options.shiftAmount);
		});
		$(this.leftSlideNav).addEvent('mouseover', function() {
			$(this).setStyle('background','url('+this.retrieve('classInstance').options.handleLeftImageOver+') no-repeat center center');
		});
		$(this.leftSlideNav).addEvent('mouseout', function() {
			$(this).setStyle('background','url('+this.retrieve('classInstance').options.handleLeftImage+') no-repeat center center');
		});

		this.rightSlideNav.set({
			'styles':{
				'left':this.options.width-this.options.handleWidth,
				'background':'url('+this.options.handleRightImage+') no-repeat center center'
			},
			'id':'rightNav_' + this.options.name
		});
		$(this.rightSlideNav).store('classInstance',this);
		$(this.rightSlideNav).addEvent('click', function() {
			$(this).retrieve('classInstance').shiftBar(this.retrieve('classInstance').options.shiftAmount);
		});
		$(this.rightSlideNav).addEvent('mouseover', function() {
			$(this).setStyle('background','url('+this.retrieve('classInstance').options.handleRightImageOver+') no-repeat center center');
		});
		$(this.rightSlideNav).addEvent('mouseout', function() {
			$(this).setStyle('background','url('+this.retrieve('classInstance').options.handleRightImage+') no-repeat center center');
		});

		this.itemContainer = new Element('DIV',{
			'styles':{
				'width':this.options.width,
				'height':this.options.height+(this.options.itemBorderWidth*2),
				'position':'absolute',
				'left':'0',
				'top':'0',
				'z-index':1,
				'overflow':'hidden'
			},
			'id':'itemContainer_' + this.options.name
		});

		this.itemHolder = new Element('DIV',{
			'styles':{
				'width':'0',
				'height':this.options.height+(this.options.itemBorderWidth*2),
				'position':'relative',
				'top':'0',
				'left':'0'
			},
			'id':'itemHolder_' + this.options.name
		});

		this.itemContainer.appendChild(this.itemHolder);
		this.slideContainer.appendChild(this.leftSlideNav);
		this.slideContainer.appendChild(this.itemContainer);
		this.slideContainer.appendChild(this.rightSlideNav);
		if (this.options.handleBackground) {
			this.slideContainer.appendChild(this.leftSlideNavBacker);
			this.slideContainer.appendChild(this.rightSlideNavBacker);
		}
		$(this.options.targetDiv).appendChild(this.slideContainer);

		this.slideFx = new Fx.Morph(this.itemHolder, {duration:500,'link':'chain'});
		this.slideFx.options.transition = Fx.Transitions.Linear;
		this.slideFx.options.classInstance=this;
		this.slideFx.addEvent('complete',function(){this.options.classInstance.currentlyShifting=false;});
	},
	
	addItem: function(name,image,caption,type,hidden) {
		this.itemArray[this.itemArray.length] = [];
		this.itemCount = this.itemArray.length;
		var curItem = this.itemArray[this.itemArray.length-1];

		curItem["name"] = name;
		curItem["image"] = image;
		curItem["caption"] = caption;
		curItem["type"] = type;
		curItem["hidden"] = hidden;

		this.currentDisplayWidth += this.options.itemWidth+this.options.itemPadding+(this.options.itemBorderWidth*2);
		
		var newItem = new Element('IMG', {
			'styles':{
				'width':this.options.itemWidth,
				'height':this.options.itemHeight,
				'margin-left':this.options.itemPadding.toInt()/2,
				'margin-right':this.options.itemPadding.toInt()/2,
				'float':'left',
				'align':'absmiddle',
				'border':this.options.itemBorderWidth + 'px solid ' + this.options.itemBorderColour,
				'cursor':'pointer',
				'display':(curItem["hidden"]==1)?"none":"block"
			},
			'id':'item_' + this.options.name + '_' + (this.itemArray.length-1),
			'alt':name,
			'title':name,
			'src':image + this.options.imageNameAppend
		});
		$(newItem).addEvent('click', this.options.clickFunction.bind(this));

		$('itemHolder_' + this.options.name).setStyles({'width':this.currentDisplayWidth});
		
		if (this.options.onclickLink != "") {
			var newLink = new Element('A', {
				'href':this.options.onclickLink,
				'target':'_blank'
			});
			newLink.appendChild(newItem);
			$('itemHolder_' + this.options.name).appendChild(newLink);
		} else {
			$('itemHolder_' + this.options.name).appendChild(newItem);
		}
		if (this.options.forceInitialItemClick) {
			if (this.itemCount == 1) {
				$(newItem).fireEvent('click',$('item_' + this.options.name + '_' + (this.itemArray.length-1)));
			}
		}
		this.options.addFunction(newItem);
	},

	addItems: function(B) {
		for (var A in B) {
			this.addItem(A, B[A][0], B[A][1], B[A][2], B[A][3]);
		}
	},

	getItemData: function(targetItem) {
		return this.itemArray[targetItem];
	},

	shiftBar: function(shiftAmount) {
		if (!this.currentlyShifting) {
			this.currentlyShifting=true;
			var newLeft = $('itemHolder_' + this.options.name).getStyle('left').toInt();
			var overflowFlag = false;
			var leftLimit=false,rightLimit=false;

			if (shiftAmount > 0) {
				if ((((this.itemCount-1)-this.currentPosition)-this.availableVisible) <= shiftAmount) {
					var allowedShift = ((this.itemCount-1)-this.currentPosition)-this.availableVisible;
					if (allowedShift>0) {
						shiftAmount=allowedShift;
						if (allowedShift <= this.options.shiftAmount) { rightLimit = true; }
					} else { overflowFlag = true; rightLimit=true; }
				}
			} else {
				if ((this.currentPosition+shiftAmount)<=0) {
					if (this.currentPosition !== 0) {
						shiftAmount = -this.currentPosition;
					} else { overflowFlag=true; }
					leftLimit=true;
				}
			}

			newLeft -= (shiftAmount * (this.options.itemWidth.toInt() + this.options.itemPadding.toInt() + (this.options.itemBorderWidth.toInt()*2)));
			
			if (leftLimit) {
				this.leftSlideNav.setStyle('display','none');
				if (this.options.handleBackground) { this.leftSlideNavBacker.setStyle('display','none'); }
			} else {
				this.leftSlideNav.setStyle('display','block');
				if (this.options.handleBackground) { this.leftSlideNavBacker.setStyle('display','block'); }
			}

			if (rightLimit) {
				this.rightSlideNav.setStyle('display','none');
				if (this.options.handleBackground) { this.rightSlideNavBacker.setStyle('display','none'); }
			} else {
				this.rightSlideNav.setStyle('display','block');
				if (this.options.handleBackground) { this.rightSlideNavBacker.setStyle('display','block'); }
			}

			if (!overflowFlag) {
				this.currentPosition += shiftAmount;
				this.slideFx.start({'left':newLeft});
			} else {
				this.currentlyShifting = false;
			}
		}
	}
});
