/* Begin: TragicMedia.com - DOOM Scroller
/* created 6/08 by Rich Rudzinski
/*------------------------------------------*/
//var constants = {container:"", arrowLeft:"", arrowRight:"", itemClass:"", slideNumber:#, numberShown:#, startPosition:#, speed:#, pageDots:Bool, sideButtons:Bool};
//var scroll = new DoomScroll(constants);
			
function DoomScroll(values) {
	this.values = values;	
	/* set default values if not filled in */
	this.values.container = TM.$(values.container);					 
	if(this.values.slideNumber == undefined) this.values.slideNumber = 1;
	if(this.values.sideButtons == undefined) this.values.sideButtons = true;
	if(this.values.numberShown == undefined) this.values.numberShown = values.slideNumber;
	if(this.values.startPosition == undefined) this.values.startPosition = 1;
	if(this.values.speed == undefined) this.values.speed = 30;
	if(this.values.pageDots == undefined) this.values.pageDots = false;
	this.slideItems = TM.getElementsByClassName(values.itemClass, '*', document);
	this.itemCount = 0;
	if(this.slideItems.length%this.values.numberShown != 0) this.addNodes(this.slideItems.length%this.values.numberShown);
	this.itemWidth = this.slideItems[0].offsetWidth;
	this.itemHeight = this.slideItems[0].offsetHeight;
	this.totalWidth = this.itemWidth * this.slideItems.length + 'px';	
	this.totalSlide = this.values.slideNumber * this.itemWidth;
	this.values.container.style.width = this.totalWidth;
	this.buttonLeft = TM.$(values.arrowLeft);
	this.buttonRight = TM.$(values.arrowRight);
	this.animate = [false, false];
	this.timerId = [];
	this.position = 0;
	this.createScroll();
}	
// Sets container width, adds page dots if chosen, shifts elements if startPosition != 1			
DoomScroll.prototype.createScroll = function() {
	if(this.values.pageDots) {
		this.makePageDots();
	}
	if(this.values.startPosition != 1) {	
		var shiftNum = this.values.startPosition - 1;
		if(shiftNum >= this.slideItems.length) shiftNum = shiftNum%this.slideItems.length;
		if(shiftNum != 0) {	
			this.shiftElementsRight(shiftNum);
			if(this.values.slideNumber != 1 && this.values.pageDots) this.itemCount = Math.floor(shiftNum/this.values.numberShown) * this.values.numberShown;
			else this.itemCount = shiftNum;
			this.changePageDot(Math.floor(shiftNum/this.values.numberShown));
		}
	}
	if(this.values.sideButtons) {
		this.values.container.parentNode.style.width = (this.buttonLeft.offsetWidth * 2) + this.itemWidth * this.values.numberShown + 'px'; // set wrapper width;
		this.values.container.style.left = this.buttonLeft.offsetWidth + 'px';
		this.values.startPosition = this.buttonLeft.offsetWidth;
	} else {
		this.values.container.parentNode.style.width = this.itemWidth * this.values.numberShown + 'px'; // set wrapper width;
		this.values.container.style.left = 0 + 'px';
		this.values.startPosition = 0;
	}
	this.values.container.parentNode.style.height = this.itemHeight + 'px';
	this.addArrowEvent();	// add arrow events
}	
// add nodes to slideItems when not enough elements for pages
DoomScroll.prototype.addNodes = function(number) {
	for(i=0; i<=number; i++) {
		var tempNode = this.slideItems[this.slideItems.length-1].cloneNode(false);
		this.values.container.appendChild(tempNode);
	}
}
// add click event
DoomScroll.prototype.addArrowEvent = function() {
	var left = function() {
		if(this.animate[1] != true && this.animate[0] != true) {
			this.slideLeft();
			this.shiftElementsLeft();
		}	
	}
	var right = function() {
		if(this.animate[1] != true && this.animate[0] != true) {
			this.slideRight();
		}
	}
	this.buttonLeft.onclick = TM.bindFunction(this, left);
	this.buttonRight.onclick = TM.bindFunction(this, right);
}

// moves the elements on the page in preparation for the slide
DoomScroll.prototype.shiftElementsLeft = function(number) {
	if(!number) { 
		number = this.values.slideNumber;
		this.values.container.style.left = this.values.startPosition - this.totalSlide + 'px'; //itemWidth*count + 'px';
		this.values.startPosition -= this.totalSlide;
	}
	for(i=number; i>0; i--) {
		var el = this.values.container.lastChild;
		while (el.nodeType != TM.node.ELEMENT_NODE) {	
					el = el.previousSibling;
		} 
		this.values.container.insertBefore(el, this.values.container.firstChild);
		this.itemCount = (this.itemCount == 0) ? this.slideItems.length - 1 : this.itemCount - 1;
	} 
}
DoomScroll.prototype.shiftElementsRight = function(number) {
	if(!number) {
		number = this.values.slideNumber;
		this.values.container.style.left = this.values.startPosition + this.totalSlide + 'px'; //itemWidth*count + 'px';
		this.values.startPosition += this.totalSlide; 
	}
	for(n=number; n>0; n--) {
		var el = this.values.container.firstChild;
		while (el.nodeType != TM.node.ELEMENT_NODE) {	
			el = el.nextSibling;
		} 
		TM.insertAfter(el, this.values.container.lastChild);
		this.itemCount = (this.itemCount == this.slideItems.length - 1) ? 0 : this.itemCount + 1;
	} 
}
// slide elements left
DoomScroll.prototype.slideLeft = function() {
	clearTimeout(this.timerId[0]);
	if(this.position + this.values.speed < this.totalSlide) {
		this.position += this.values.speed;
		this.values.container.style.left = this.values.startPosition + this.position + 'px';
		this.timerId[0] = setInterval(TM.bindFunction(this, this.slideLeft), 30); 
		this.animate[0] = true;
	} else {
		this.values.startPosition += this.totalSlide;
		this.values.container.style.left = this.values.startPosition + 'px';
		this.animate[0] = false;
		this.position = 0;
		count = 0;
		if(this.itemCount%this.values.numberShown == 0 && this.values.pageDots) this.changePageDot(this.itemCount/this.values.numberShown);
	}
}
// slide elements right
DoomScroll.prototype.slideRight = function() {
	clearTimeout(this.timerId[1]);
	if(Math.abs(this.position - this.values.speed) < this.totalSlide) {
		this.position -= this.values.speed;
		this.values.container.style.left = this.values.startPosition + this.position + 'px';
		this.timerId[1] = setInterval(TM.bindFunction(this, this.slideRight), 30); 
		this.animate[1] = true;
	} else {
		this.values.startPosition -= this.totalSlide;
		this.values.container.style.left = this.values.startPosition + 'px';
		this.animate[1] = false;
		this.position = 0;
		count = 0;
		this.shiftElementsRight();
		if(this.itemCount%this.values.numberShown == 0 && this.values.pageDots) this.changePageDot(this.itemCount/this.values.numberShown);
	}
}
// create new page element for page dots
DoomScroll.prototype.makePageDots = function() {
	var slideCount = this.slideItems.length/this.values.numberShown;
	this.dotContainer = document.createElement('div');
	this.values.container.parentNode.appendChild(this.dotContainer);
	this.dotLinks = [];
	for(i=0; i<slideCount; i++) {
		var tempLink = document.createElement('a');
		tempLink.setAttribute('href', '#');
		tempLink.className = 'imgDots';
		tempLink.setAttribute('rel', i);
		var self = this;
		tempLink.onclick = function() {
			var num = this.rel;
			dotSkip(self, num);
			return false;
		}
		this.dotLinks.push(tempLink);
		this.dotContainer.appendChild(tempLink);
	}
	this.dotContainer.className = 'pageDots';
	this.dotContainer.style.width = this.dotContainer.firstChild.offsetWidth * slideCount + 'px';
	this.values.container.parentNode.style.paddingTop = this.dotContainer.offsetHeight + 5 + 'px';
	this.dotContainer.firstChild.className = this.dotContainer.firstChild.className + ' active';
	this.dotContainer.style.right = (this.values.sideButtons) ? this.buttonRight.offsetWidth + 'px' : '0px';     // set the page dots position within its container
	if(this.values.sideButtons) this.buttonRight.style.marginTop = this.dotContainer.offsetHeight + 5 + 'px';
	if(this.values.sideButtons) this.buttonLeft.style.marginTop = this.dotContainer.offsetHeight + 5 + 'px';
	// adjust dots/scroll on dot click
	var dotSkip = function(obj, dotNum) {
		obj.changePageDot(dotNum);
		if(dotNum > obj.itemCount/obj.values.numberShown) {
			obj.shiftElementsRight(dotNum*obj.values.numberShown - obj.itemCount);
			//obj.itemCount = (dotNum * obj.values.numberShown < obj.slideItems.length - 1) ? dotNum * obj.values.numberShown : dotNum * obj.values.numberShown - obj.slideItems.length;
		} else if(dotNum != obj.itemCount/obj.values.numberShown) {
			obj.shiftElementsLeft(obj.itemCount - dotNum*obj.values.numberShown);
			//obj.itemCount = (dotNum * obj.values.numberShown >= 0) ? dotNum*obj.values.numberShown : obj.itemCount - (obj.slideItems.length - dotNum*obj.values.numberShown);
		}
	}
}

// adjust dots according to scroll position
DoomScroll.prototype.changePageDot = function(num) {
	for(i=0; i<this.dotLinks.length; i++) {
		if(this.dotLinks[i].className.match('active')) {
			TM.toggleClass(this.dotLinks[i], 'active');
		}
	}
	TM.toggleClass(this.dotLinks[num], 'active');
}
	
//------------------------------- End Rich's Amazing Scroller of DOOM w/ getElementsByClassName & insertAfter --------------------------------------->