/*
	Author: Volkan Altinbas & Mahir Yildirim
	Modified: 01/05/2009
*/

var $j = jQuery.noConflict();

function vaScroller(sliderId, scrollBarArrowStepNumber) {
	
	var _startX = 0; 
	var _startY = 0;
	var _offsetX = 0;
	var _offsetY = 0; 
	var _trackX = 0;
	var _currentItem = 0;

	var scrollBarArrowStepNumber = scrollBarArrowStepNumber || 1;
	var scrollerItems = $j("#"+sliderId+" .scrollerItem");
	var scrollerContainerWidth = 0;
	var scrollerContainerPos = 0;
	var scrollerItemContainer = $j("#"+sliderId+" .scrollerItemContainer");
	var scrollBar = $j("#"+sliderId+" .scrollBar");
	var scrollerTrackBar = $j("#"+sliderId+" .scrollerTrackBar");
	var scrollerTrackBarWidth = ExtractNumber(scrollerTrackBar.width());
	var scrollerTrack = $j("#"+sliderId+" .scrollerTrack");
	var scrollerTrackWidth = ExtractNumber(scrollerTrack.width());
	var scrollerItemMask = $j("#"+sliderId+" .scrollerItemMask");
	var scrollerItemMaskWidth = ExtractNumber(scrollerItemMask.width());
	var scrollBarLeftArrow = $j("#"+sliderId+" .scrollBarLeftArrow");
	var scrollBarRightArrow = $j("#"+sliderId+" .scrollBarRightArrow");
	var scrollerLeftArrow = $j("#"+sliderId+" .scrollerLeftArrow");
	var scrollerRightArrow = $j("#"+sliderId+" .scrollerRightArrow");

	var _categoryNames = new Array();
	var _isCategoryClicked = false;
	var scrollerCatItem = $j("#"+sliderId+" .scrollerCatItem");

	var scrollerImgs = $j("#"+sliderId+" img");
	var scrollerImgsTotal = scrollerImgs.length;
	var scrollerImgLoaded = 0;
	
	var _visibleItemNumber = Math.floor(scrollerItemMaskWidth / ExtractNumber($j(scrollerItems[0]).width()));

	this.initial = function() {
		initializeScroll();
	}

	scrollBarLeftArrow.click(function() {
		slideTo(-scrollBarArrowStepNumber);							  
	})
	scrollBarRightArrow.click(function() {
		slideTo(scrollBarArrowStepNumber);							  
	})
	scrollerLeftArrow.click(function() {
		slideTo(-scrollBarArrowStepNumber);							  
	})
	scrollerRightArrow.click(function() {
		slideTo(scrollBarArrowStepNumber);							  
	})

	scrollerCatItem.each(function() {
		$j(this).click(function() {
			_isCategoryClicked = true;
			slideToCategory(this);
		})		  
	})

	function isImageComplete(img) {
		if (!img.complete) {
			return false;
		}
		if (typeof img.naturalWidth != "undefined" && img.naturalWidth == 0) {
			return false;
		}
		return true;
	}

	function isAllScrollerImgLoaded() {
		scrollerImgLoaded = 0;
		for (var i=0; i < scrollerImgsTotal; i++) {
			if(isImageComplete(scrollerImgs[i])) {
				scrollerImgLoaded++;
			}
		}
		if(scrollerImgLoaded != scrollerImgsTotal) {
			return false;
		}
		else {
			return true;
		}
	}
	
	var _t;
	
	function checkLoad(){
		var isLoad = isAllScrollerImgLoaded();
		if(isLoad){
			clearInterval(_t);
			scrollerItemMask.css("height", scrollerItemContainer.height());
		}
		else {
			setTimeout(function(){scrollerItemMask.css("height", scrollerItemContainer.height())},10000)
		}
	}

	function initializeScroll() {
		
		for(var i=0; i < scrollerItems.length; i++) {
			scrollerContainerWidth += scrollerItems[i].offsetWidth;
		}
		
		scrollerItemContainer.width(scrollerContainerWidth);

		_t = setInterval(function(){checkLoad()},1000);

		if (scrollerItems.length <= _visibleItemNumber) {
			scrollerTrack.css("visibility","hidden");
			scrollerLeftArrow.addClass("scrollerLeftArrowPassive");
			scrollerRightArrow.addClass("scrollerRightArrowPassive");
			scrollBarLeftArrow.addClass("scrollBarLeftArrowPassive");
			scrollBarRightArrow.addClass("scrollBarRightArrowPassive");
			scrollerLeftArrow.unbind("click");
			scrollerRightArrow.unbind("click");
			scrollBarLeftArrow.unbind("click");
			scrollBarRightArrow.unbind("click");
			return false;
		}

		scrollerTrackBar.click(function(e) {
			if(!_isCategoryClicked) {
				e = e || window.event;
				
				var scrollerTrackBarOffset = $j(this).offset();
				var scrollerTrackBarPos = e.clientX - scrollerTrackBarOffset.left;
				_trackX = scrollerTrackBarPos - scrollerTrackWidth / 2;
				
				slideScroller(true);
				slideContainer(true);
			}
			_isCategoryClicked = false
		})
		
		scrollerTrack.click(function() {
			return false;							 
		})
		
		scrollerTrack.mousedown(function(e) {
			
			e = e || window.event;

			_startX = e.clientX;
			_offsetX = ExtractNumber(scrollerTrack.css("left"));
			
			document.onmousemove = function(e) { 
				e = e || window.event;
				_trackX = (_offsetX + (e.clientX - _startX));
				slideScroller(false);
				slideContainer(false);
			}
			document.onselectstart = function () { return false; }
			
			findCurrentItem();
			return false;
		})

		document.onmouseup = function() {
			document.onmousemove = null;	
		}
		
		checkArrowBtn();
		findCategories();
	
	}	

	function slideToCategory(cat) {
		var catIndex = $j(cat).attr("rel")
		var catFirstItem = _categoryNames[catIndex][0];
		
		if(catFirstItem > (scrollerItems.length -_visibleItemNumber))  catFirstItem = scrollerItems.length -_visibleItemNumber;
		var itemWidth = ExtractNumber($j(scrollerItems[0]).width());
		scrollerContainerPos = -(itemWidth*catFirstItem)
		scrollerItemContainer.animate({left:scrollerContainerPos}, 300)
		var catWidth = ExtractNumber($j(cat).width());
		_trackX = ExtractNumber($j(cat).css("left")) - (scrollerTrackWidth - catWidth)/2;
		slideScroller(true);
		
		findCurrentItem();
		checkArrowBtn();
	}
	
	function findCategories() {
		var index1 = 0;
		var index2 = 0;
		for(var i=0; i < scrollerItems.length; i++) {
			index2 = i;
			if($j(scrollerItems[i]).attr("rel")) {
				if(_categoryNames.length == 0) {
					index1 = i;
					_categoryNames.push(new Array(i,$j(scrollerItems[i])));
				}
				else {
					
					if(_categoryNames[_categoryNames.length-1][1].attr("rel") != $j(scrollerItems[i]).attr("rel"))
					{
						index1 = i;
						_categoryNames.push(new Array(i,$j(scrollerItems[i])));
						
					}
				}
				var categoryNameObj = getCategoryNameObj(_categoryNames.length-1) ;
				var catLeft = (scrollerTrackBarWidth / (scrollerItems.length)) * (index1 + (index2 - index1)/2) +  $j(categoryNameObj).width()/2;
				catLeft = (catLeft + $j(categoryNameObj).width()) > scrollerTrackBarWidth ? (scrollerTrackBarWidth - $j(categoryNameObj).width()) : catLeft;
				
				$j(categoryNameObj).css("left", catLeft);
			}
		}
	}
	function getCategoryNameObj(index){
		var obj = null;
		scrollerCatItem.each(function() {			
			if(index == ($j(this).attr("rel"))){
				obj= this;
			}
		})
		return obj;
	}
	
	function slideScroller(animate) {
		if(_trackX < 0) {
			_trackX = 0;
		}
		
		if(_trackX > scrollerTrackBarWidth - scrollerTrackWidth) {
			_trackX = scrollerTrackBarWidth - scrollerTrackWidth;
		}
		
		if(animate) {
			scrollerTrack.animate({left:_trackX},300);
		}
		else {
			scrollerTrack.css("left",_trackX);
		}
	}
	
	function slideContainer(animate) {		
		
		scrollerContainerPos = setContainerX();
		
		if(animate) {
			scrollerItemContainer.animate({left:scrollerContainerPos},300)
		}
		else {
			scrollerItemContainer.css("left", scrollerContainerPos)
		}

		findCurrentItem();
		checkArrowBtn();
		
	}
	
	function slideTrack() {
		var _trackX = 0;
		var trackScrollableArea = (scrollerTrackBarWidth - scrollerTrackWidth);
		var containerScrollableArea = (scrollerContainerWidth - scrollerItemMaskWidth);
		var percent = Math.abs(ExtractNumber(scrollerContainerPos)) / containerScrollableArea * 100;

		_trackX = trackScrollableArea * percent / 100;
		
		scrollerTrack.animate({left:_trackX},300);
	}

	function setContainerX() {
		var _containerX = 0;
		var scrollableArea = (scrollerTrackBarWidth - scrollerTrackWidth);
		var percent = _trackX / scrollableArea * 100;
		var containerPos = (scrollerContainerWidth - scrollerItemMaskWidth) * percent / 100;
		return _containerX = -containerPos;
	}
	
	function slideTo(step) {
		scrollerContainerPos = scrollerItemContainer.css("left");
		_currentItem+= step;
	
		if(_currentItem < 0) {
			_currentItem = 0;
		}

		if(_currentItem > scrollerItems.length - _visibleItemNumber) {
			_currentItem = (scrollerItems.length) - _visibleItemNumber;
		}

		var itemWidth = ExtractNumber($j(scrollerItems[0]).width());

		scrollerContainerPos = -(itemWidth*_currentItem)
		scrollerItemContainer.animate({left:scrollerContainerPos}, 300 )
		
		slideTrack();
		checkArrowBtn();
	}
	
	function checkArrowBtn() {
		if(_currentItem == 0 ) {
			scrollerLeftArrow.addClass("scrollerLeftArrowPassive");
		}
		else {
			scrollerLeftArrow.removeClass("scrollerLeftArrowPassive");
		}
		
		if(_currentItem == (scrollerItems.length - _visibleItemNumber)) {
			scrollerRightArrow.addClass("scrollerRightArrowPassive");
		}
		else {
			scrollerRightArrow.removeClass("scrollerRightArrowPassive");
		}
	}	

	function findCurrentItem() {
		var itemWidth = ExtractNumber($j(scrollerItems[0]).width());
		return _currentItem = Math.floor(Math.abs(scrollerContainerPos / itemWidth));
	}
	
	function ExtractNumber(value) { 
		var n = parseInt(value); 
		return n == null || isNaN(n) ? 0 : n; 
	} 

}