﻿var TopOffers = new function() {

	//Parameters
	this.TimerInterval = 30;
	this.MoveDistance = -1;
	
	this.MultiplierEdges = 0.5;
	this.MultiplierMiddle = 1.0;
	
	this.MaxHolderItems = 5;
	
	this.BaseR = 210;
	this.BaseG = 210;
	this.BaseB = 247;
	this.AddR = 38;
	this.AddG = 37;
	this.AddB = 0;
	
	
	//Private variables
	var iCurrentTimerInterval = 0;
	var iCurrentMoveDistance = 0;

	var iTotalWidth = 0;
	var iItemWidth = 0;

	var aOffers;
	var oHolder;
	var oScroller;
	
	var iTimerID;
	
	
	//For Color Converter
	aHexLookup = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'];
	
	
	//Setup
	this.Setup = function(iTimerInterval, iMoveDistance) {
	
		oHolder = f.GetObject('divOffersScrollerHolder');
		oScroller = f.GetObject('divOffersScroller');
		aOffers = oScroller.getElementsByTagName('a');
		
		
		for (var i = 0; i < aOffers.length; i++) {
			//copy the first 5 nodes on to the end as well, so that it will be invisible when we swap back to the beginning again
			if (aOffers.length > this.MaxHolderItems && i < this.MaxHolderItems) oScroller.appendChild(aOffers[i].cloneNode(true));
			
			//find total width
			var iMarginLeft;
			var iMarginLeft;
			
			if (aOffers[i].currentStyle) {
				iMarginLeft = n.SafeInt(aOffers[i].currentStyle.marginLeft);
				iMarginRight = n.SafeInt(aOffers[i].currentStyle.marginRight);
			}
			else if (window.getComputedStyle) {
				iMarginLeft = n.SafeInt(window.getComputedStyle(aOffers[i], null).getPropertyValue('margin-left'));
				iMarginRight = n.SafeInt(window.getComputedStyle(aOffers[i], null).getPropertyValue('margin-right'));
			} else {
				//we have no option but to hardcode
				aOffers[i].style.marginLeft = '11px';
				aOffers[i].style.marginRight = '11px';
				iMarginLeft = 11;
				iMarginRight = 11;
			}
			
			iTotalWidth += n.SafeInt(aOffers[i].offsetWidth) + iMarginLeft + iMarginRight;
			
			if (i == 0) iItemWidth = iTotalWidth; //assumes all items are the same width (all we can do really)
			
			aOffers[i].style.zIndex = 1; //set this so we can pop items in and out later!
		}
		
		oScroller.style.width = iTotalWidth + 'px';
		
		if (aOffers.length <= this.MaxHolderItems) {
			oScroller.style.top = '0px';
			oScroller.style.left = '0px';
			return;
		} else {
			if (n.SafeInt(iTimerInterval) != 0) this.TimerInterval = n.SafeInt(iTimerInterval);
			if (n.SafeInt(iMoveDistance) != 0) this.MoveDistance = n.SafeInt(iMoveDistance);
			this.Start();
		}
	
	}
	
	
	//Start and Pause
	this.Start = function() {
	
		//don't start scrolling if we haven't got enough offers to scroll
		if (aOffers.length <= this.MaxHolderItems) return;
		
		if (iTimerID) {
			clearInterval(iTimerID);
			iTimerID = 0;
		}
	
		iCurrentTimerInterval = this.TimerInterval;
		iCurrentMoveDistance = this.MoveDistance;
		iTimerID = setInterval('TopOffers.MainLoop();', iCurrentTimerInterval);
	}
	this.Pause = function() {
		
		if (iTimerID) {
			clearInterval(iTimerID);
			iTimerID = 0;
		}
	}
	
	
	//Scroll either way (actually, both are almost the same but with different defaults)
	this.ScrollRight = function(iTimerInterval, iMoveDistance) {
	
		if (n.SafeInt(iTimerInterval) == 0) iTimerInterval = 20;
		if (n.SafeInt(iMoveDistance) <= 0) iMoveDistance = 3;
		this.Scroll(iTimerInterval, iMoveDistance);
	}
	this.ScrollLeft = function(iTimerInterval, iMoveDistance) {
	
		if (n.SafeInt(iTimerInterval) == 0) iTimerInterval = 20;
		if (n.SafeInt(iMoveDistance) <= 0) iMoveDistance = 3;
		this.Scroll(iTimerInterval, -iMoveDistance);
	}
	this.Scroll = function(iTimerInterval, iMoveDistance) {
		
		iCurrentTimerInterval = n.SafeInt(iTimerInterval);
		iCurrentMoveDistance = n.SafeInt(iMoveDistance);
		
		clearInterval(iTimerID);
		iTimerID = setInterval('TopOffers.MainLoop();', iCurrentTimerInterval);
	}
	this.StopScroll = function() {
	
		this.Start();
	}
	
	
	//Main Loop
	this.MainLoop = function() {
	
		var iCurrentXPos = n.SafeInt(oScroller.offsetLeft);
		
		var iNextXPos = iCurrentXPos + iCurrentMoveDistance;
		if (iTotalWidth + iNextXPos < n.SafeInt(oHolder.offsetWidth)) {
			iNextXPos += iTotalWidth - iItemWidth * this.MaxHolderItems;
		} else if (iNextXPos > 0) {
			iNextXPos -= iTotalWidth - iItemWidth * this.MaxHolderItems;
		}
		
		oScroller.style.left = iNextXPos + 'px';
		this.ItemDisplayFX();
	}
	
	
	//Item Display / FX
	this.ItemDisplayFX = function() {
	
		var iCurrentXPos = n.SafeInt(oScroller.offsetLeft);
		var iHolderWidth = n.SafeInt(oHolder.offsetWidth);
	
		var aItems = new Array();
		var bLeftInside;
		var bRightInside;
		for (var i = 0; i < aOffers.length; i++) {
			bLeftInside = n.SafeInt(aOffers[i].offsetLeft) + iCurrentXPos < iHolderWidth && n.SafeInt(aOffers[i].offsetLeft) + iCurrentXPos > 0;
			bRightInside = n.SafeInt(aOffers[i].offsetLeft) + n.SafeInt(aOffers[i].offsetWidth) + iCurrentXPos < iHolderWidth && n.SafeInt(aOffers[i].offsetLeft) + n.SafeInt(aOffers[i].offsetWidth) + iCurrentXPos > 0;
			if (bLeftInside || bRightInside) aItems.push(aOffers[i]);
		}
		
		for (var i = 0; i < aItems.length; i++) {
			var nXPosition = n.SafeInt(aItems[i].offsetLeft) + iCurrentXPos + n.SafeInt(aItems[i].offsetWidth) / 2.0;
			var nMultiplier = 2.0 * ((this.MultiplierEdges - this.MultiplierMiddle) / iHolderWidth) * Math.abs(nXPosition - iHolderWidth / 2.0) + this.MultiplierMiddle;
			
			//Any FX can go here. Including making an object bigger when it is in the center or whatever for an apple-style scroller...
			var oContainer = aItems[i].firstChild;
			if (oContainer.nodeType != 1) oContainer = oContainer.nextSibling;
			oContainer.style.backgroundColor = this.ConvertColor(this.BaseR + this.AddR * nMultiplier, this.BaseG + this.AddG * nMultiplier, this.BaseB + this.AddB * nMultiplier);
		}
	}
	
	
	//Color Changer
	this.ChangeItemColor = function(oItem, sColor) {
	
		var oContainer = oItem.firstChild;
		if (oContainer.nodeType != 1) oContainer = oContainer.nextSibling;
		oContainer.sOriginalBgColor = oContainer.style.backgroundColor;
		oContainer.style.backgroundColor = sColor;
	
	}
	this.ResetItemColor = function(oItem) {
	
		var oContainer = oItem.firstChild;
		if (oContainer.nodeType != 1) oContainer = oContainer.nextSibling;
		oContainer.style.backgroundColor = oContainer.sOriginalBgColor;
	}
	
	
	//Color Converter
	this.ConvertColor = function(r, g, b) {
		r = Math.round(r);
		g = Math.round(g);
		b = Math.round(b);
	
		var sHexColor = '#';
		sHexColor += aHexLookup[Math.floor(r / 16.0)];
		sHexColor += aHexLookup[r % 16];
		sHexColor += aHexLookup[Math.floor(g / 16.0)];
		sHexColor += aHexLookup[g % 16];
		sHexColor += aHexLookup[Math.floor(b / 16.0)];
		sHexColor += aHexLookup[b % 16];
		return sHexColor;
	}


}
