//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////
/*
	JAVASCRIPT SEO-FRIENDLY SLIDER
	Version:  2.0.3
	Last Update:  22/10/09
	
	Explanation:
		This class scrolls an exact amout of px (html element's width)	
*/
/////////////////////

var Slider = {
	
	//initialize the namespace 
	init : function()
	{
		//nothing
	},
	
	totalSliders : 0
}

/////////////////////////////////
//Slider Object
/////////////////////////////////
Slider.slider = function(htmlElement,scrollSpeed, scrollAmount, scrollJumps)
{
	/////////////////////////////////
	//HTML element check
	/////////////////////////////////
	this.htmlElement = null;
	if (!htmlElement)
	{
		alert('no htmlElement is passed to Slide.slider()');
		return;
	}
	else if (typeof(htmlElement) === 'string')
		this.htmlElement = document.getElementById(htmlElement);
	else if (typeof(htmlElement) === 'object')
		this.htmlElement = htmlElement;
	else  //htmlElement = null
	{
		alert('no htmlElement');
		return;
	}
	
	//setting up the no Overflow attribute
	this.htmlElement.style.overflow = "hidden";
	//htmlElement Border
	this.htmlBorder = this.getBorderWidth();
	this.htmlBorderEf = this.htmlBorder*2;
		
	/////////////////////////////////
	//scrolling settings
	/////////////////////////////////
	this.scrollSpeed = scrollSpeed || 20; //time in miliseconds
	this.scrollAmount = scrollAmount || 5; //amout in pixels
	this.scrollJumps = scrollJumps || this.htmlElement.offsetWidth;
	var br = navigator.appName.indexOf("Microsoft") !== -1 ?  "ie" : "ff" ;
	if (br === "ff")
		this.scrollJumps = this.scrollJumps - this.htmlBorderEf;
	/////////////////////////////////
	//TIME Out Object
	/////////////////////////////////
	this.timeoutObj = null;
	
	//////// SLIDER NUMBER //////////
	this.num = Slider.totalSliders++;
	
	/////////////////////////////////
	//DONE SCROLL EVENT
	/////////////////////////////////
	this.dontScrollEvent = new EVENTS.Event("ScrollingDoneEvent_" + this.num);
}

Slider.slider.prototype.getBorderWidth = function()
{
	var border = this.htmlElement.style.border.replace(/^\s+|\s+$/g,"");
	if (border === 0 || border === '')
	{
		var idClass = "#" + this.htmlElement.id;
		var border = this.getCss(idClass,"border") || 0;
	}
	if (border === 0 || border === '')
	{
		var elementClass = this.htmlElement.className || 0;
		if (elementClass !== '')
			var border = this.getCss(elementClass,"border") || 0;
	}
	if (border !== '' && border !== 0)
	{
		border = border.toString();
		var borderAr = border.split(" ");
		var l = borderAr.length;
		var part = '';
		var _index;
		var borderWidth = 0;
		for (var i=0;i<l;i++)
		{
			part = borderAr[i];
			_index = part.indexOf("px");
			if (_index !== -1)	
			{
				borderWidth = parseInt(part.substring(0,_index));
				//alert(borderWidth);
				return borderWidth;
			}
		}
	}
	return 0;
}

Slider.slider.prototype.getCss = function(myclass,element)
{
	//gets the CSS rules' attributes

	try
	{
		var CSSRules; 
		var selectorText;
		var i = 0;
		var max;
		if (navigator.userAgent.toLowerCase().indexOf("firefox") === -1)
		{ CSSRules = 'rules'; }
		else 
		{ CSSRules = 'cssRules'; }
		for (var csss =0 ; csss<document.styleSheets.length;csss++)
		{
			i=0;
			max = document.styleSheets[csss][CSSRules].length
			for (i = 0; i < max; i++)
			{
				selectorText = document.styleSheets[csss][CSSRules][i].selectorText;
				if (selectorText === myclass)
				{
					return document.styleSheets[csss][CSSRules][i].style[element] || 0;
				}
			}
		}
	}
	catch(e)
	{
		return 0;	
	}
}


Slider.slider.prototype.move = function(dir)
{
	//if the slider is in the middle of sliding
	if (this.timeoutObj !== null)
		return;
	
	//browser detection
	var br = navigator.appName.indexOf("Microsoft") !== -1 ?  "ie" : "ff" ;
	//horizontal!
	if (dir === 'left' || dir === 'right')
	{
		var maxScroll;
		var actualWidth = '';
		if (br === "ie")
			actualWidth = this.htmlElement.offsetWidth;
		else
			actualWidth = this.htmlElement.offsetWidth - this.htmlBorderEf;
		
		this.scrollJumps = this.scrollJumps || this.htmlElement.offsetWidth;
		var br = navigator.appName.indexOf("Microsoft") !== -1 ?  "ie" : "ff" ;
		if (br === "ff")
			this.scrollJumps = this.scrollJumps - this.htmlBorderEf;
			
		if (dir === 'right')
		{
			maxScroll = this.htmlElement.scrollWidth - actualWidth;
			
			//can't scroll
			if (this.htmlElement.scrollLeft === maxScroll)
				return;
				
			var amountToScroll = this.htmlElement.scrollLeft + this.scrollJumps;
			if (amountToScroll > (maxScroll))
				amountToScroll = maxScroll;
				
			//// can scroll
			if (br === "ie")
				amountToScroll = amountToScroll;
			else
				amountToScroll = amountToScroll - this.htmlBorderEf;
				
			this.mover(dir, amountToScroll);
			
		}
		else //left
		{
			maxScroll = 0; 
			
			//can't scroll
			if (this.htmlElement.scrollLeft === maxScroll)
				return;
			
			var amountToScroll = this.htmlElement.scrollLeft - this.scrollJumps;
			if (amountToScroll < maxScroll)
				amountToScroll = 0;	
			
			//// can scroll
			this.mover(dir, amountToScroll);
		}
	} 	
	else if (dir === 'up' || dir === 'down')
	{
		
	}
	else
		return;
}


Slider.slider.prototype.mover = function(dir,scrollTarget)
{
	//target ==>  the scroll target
	var doScroll = false;
	if (dir === 'right')
	{
		if (this.htmlElement.scrollLeft + this.scrollAmount < scrollTarget) 
		{
			this.htmlElement.scrollLeft += this.scrollAmount;
			doScroll = true;
		}
		else if (this.htmlElement.scrollLeft + this.scrollAmount >= scrollTarget) 
		{
			this.htmlElement.scrollLeft = scrollTarget;
		}
	}
	else if (dir === 'left')
	{
		if (this.htmlElement.scrollLeft - this.scrollAmount > scrollTarget)
		{
			this.htmlElement.scrollLeft -= this.scrollAmount;
			doScroll = true;
		}
		else if (this.htmlElement.scrollLeft - this.scrollAmount <= scrollTarget)
		{
			this.htmlElement.scrollLeft = scrollTarget;
		}
	}
	else if (dir === 'down')
	{
		
	}
	else if (dir === 'up')
	{
		
	}
	
	/////// doing OR not doing the scroll //////
	if (doScroll === true)
	{
		var self = this;
		this.timeoutObj = setTimeout(function(){
				self.mover(dir,scrollTarget);
			},this.scrollSpeed);
	}
	else //doScroll === false
	{
		clearTimeout(this.timeoutObj);	
		this.timeoutObj = null;
		
		/// dispatching event ///
		this.dontScrollEvent.dispatch();
	}
	
	
}

/////////////////////////////////
//NameSpace Initialize
/////////////////////////////////
//Slider.init();


