dojo.provide("com.ba.gui.ConjunctureTicker");

dojo.require("com.ba.Util");
//~ dojo.require("dijit.Tooltip");

dojo.declare("com.ba.gui.ConjunctureTicker",
	null,
	{
		_currentNode: null,
		_infoHolderId: null,
		_baseULlength: 0,
		_viewportWidth: 0,
		_coke: 0,
		statics: { templateString: '<span class="contentHolder"></span><span class="content"></span><div class="infoHolder">{{ ulHolder }}</div>',
					updateInterval: 20,
					mouseOverStateClass: "mouseOverStateClass"},
		
		constructor: function(node, args)
		{
			if(typeof(node) == "string"){
				node = dojo.byId(node);
			} 
			
			if(node) {
			
				if(!node.id) {
					node.id = com.ba.Util.GenerateId(); 
				}
			
				this._currentNode = node.id;
				
				this._buildElements();
				
				this._createInteraction();
			}
			
		},
		
		_buildElements: function()
		{
			
			var ulWidth = 0; 
			
			var childList = [];
			var ulNode;
			
			dojo.forEach(dojo.query("#"+this._currentNode + " ul"), function(element) { 
				ulNode = element;
			});
			
			dojo.forEach(dojo.query("#"+this._currentNode + " ul li"), function(liElement) { 
				ulWidth += dojo.contentBox(liElement).w;
				
				liElement.parentNode.removeChild(liElement);
				childList.push(liElement);
				//~ ulWidth += dojo.style(liElement, "width");
				//~ dojo.addClass(liElement, "processed" );
				//~ alert("ulWidth: " + ulWidth);
			});
			
			dojo.forEach(childList, function(liElement){
				ulNode.appendChild(liElement);
			});

			if(!ulWidth){
				throw "ConjunctureTicker: Width cannot be zero";
			}
			
			
			
			this._baseULlength = ulWidth;
			
			var newString = "";
			var node = dojo.byId(this._currentNode);
			this._viewportWidth = dojo.style(node, "width");
			
			var newWidth = 0;
			var loopCount = 0;
			
			while ((loopCount < 2) || (newWidth <= 2 * this._viewportWidth)) {
				newString += node.innerHTML;
				newWidth += ulWidth;
				loopCount++;
			}
			
			node.innerHTML = this.statics.templateString.replace(/{{ ulHolder }}/gi, newString);

			dojo.forEach(dojo.query(".infoHolder", node), dojo.hitch(this, function(element){
				this._infoHolderId = element.id = com.ba.Util.GenerateId();
			}));
		},
		
		_createInteraction: function()
		{
			dojo.connect(dojo.byId(this._currentNode), "mouseenter", this, this._onMouseEnter);
			dojo.connect(dojo.byId(this._currentNode), "mouseleave", this, this._onMouseLeave);
			
			window.setInterval(dojo.hitch(this, this._updateAnimation), this.statics.updateInterval);
		},
		
		_onMouseEnter: function(domEvent){
			var holder = dojo.byId(this._infoHolderId);
			if(holder)
				dojo.addClass(holder, this.statics.mouseOverStateClass);
		},
		_onMouseLeave: function(domEvent){
			var holder = dojo.byId(this._infoHolderId);
			if(holder)
				dojo.removeClass(holder, this.statics.mouseOverStateClass);
		},
		
		_updateAnimation: function(){
			
			var holder = dojo.byId(this._infoHolderId);
			if(!holder)
				return;
			if(!dojo.hasClass(holder, this.statics.mouseOverStateClass)){
				this._coke += 0.5;
			}
			
			this._coke *= 0.85;
			
			var pos = (dojo.style(holder, "left")-this._coke);
			
			if(pos < - this._baseULlength){
				pos += this._baseULlength;
			}
			
			dojo.style(holder, "left", pos+"px");
			
			//console.debug("this._infoHolderId: " + this._infoHolderId);
		}
	});


