// -------------------------------------------------------------------
// gAjax RSS Pausing Scroller- By Dynamic Drive, available at: http://www.dynamicdrive.com
// Created: Aug 2nd, 2007 Updated: n/a
// REQUIRES: gfeedfetcher.js class, available at http://dynamicdrive.com/dynamicindex18/gajaxrssdisplayer.htm
// -------------------------------------------------------------------

var gfeedfetcher_loading_image="" //Specify full URL to "loading" image. Overwrites same var from gfeedfetcher.js


function gfeedpausescroller(p_divid, divClass, delay, linktarget,p_instanceName,p_effect){
	this.divid= p_divid 
	this.tickerid=this.divid //ID of outermost scroller div
	this.delay=parseInt(delay) //Default delay between msg change, in miliseconds.
	this.mouseoverBol=0 //Boolean to indicate whether mouse is currently over scroller (and pause it if it is)
	this.hiddendivpointer=1 //index of RSS feed array's entry for hidden div
	this.itemsperpage=1 //Entries to show per page
	
	
	this.waySlide = null; //  next or previous, next par defaut
	
	if(p_effect != null)
		this.effect = p_effect;
	else
		this.effect = "upDown"; // leftRight, upDown
	
	this.timerAnimate = null;
	this.timerRotate = null;
	
	this.instanceName = p_instanceName;
	this.pauseBol=0 //Boolean to indicate whether mouse is currently over scroller (and pause it if it is)<br>
	document.write('<div class="sliderNM">')
		document.write('<div id="'+this.divid+'" class="'+divClass+' sliderNM_content" style="position: relative; overflow: hidden">')
			document.write('<div class="innerDiv" style="position: absolute; width: 100%" id="'+this.divid+'1"><span style="position: absolute">Initializing RSS scroller...</span></div>')
			document.write('<div class="innerDiv" style="position: absolute; width: 100%; visibility: hidden" id="'+this.divid+'2"></div>')
			gfeedfetcher.call(this, this.divid+"unneeded", divClass+"unneeded", linktarget) //inherit properties from "gfeedfetcher" class, but feed it bogus ID/Class, as we won't be using the DIV generated by "gfeedfetcher"
		document.write('</div>')
		document.write('<div id="'+this.divid+'_command" class="'+divClass+'_command commandContent"></div>')
	document.write('</div>')
	this.itemcontainer="<div>" //default element wrapping around each RSS entry
	this.feedcontainer.style.display="none" //Hide unneeded div generated after inheriting properties from "gfeedfetcher" class
	this.feedcontainer=document.getElementById(this.divid+'1') //overwrite inherited "feedcontainer" to reference the first DIV within scroller container
	this.tickerdiv=document.getElementById(this.divid)
	this.visiblediv=document.getElementById(this.divid+"1")
	this.hiddendiv=document.getElementById(this.divid+"2")
	this.visibledivtop=parseInt(this.tickerdiv.currentStyle? this.tickerdiv.currentStyle["paddingTop"] : window.getComputedStyle? window.getComputedStyle(this.tickerdiv, "").getPropertyValue("padding-top") : 0) //Determine the "top" boundary of the visible div, factoring in any CSS padding
	this.visibledivleft=parseInt(this.tickerdiv.currentStyle? this.tickerdiv.currentStyle["paddingLeft"] : window.getComputedStyle? window.getComputedStyle(this.tickerdiv, "").getPropertyValue("padding-left") : 0) //Determine the "left" boundary of the visible div, factoring in any CSS padding
	this.tickerdivwidth=this.tickerdiv.currentStyle? parseInt(this.tickerdiv.currentStyle["width"]) : this.tickerdiv.offsetWidth //IE has trouble getting offsetWidth while page is loading, so use global CSS value instead
	this.tickerdivheight=this.tickerdiv.currentStyle? parseInt(this.tickerdiv.currentStyle["height"])+50 : 0 //IE has trouble getting offsetWidth while page is loading, so use global CSS value instead. "50" accounts for any possible padding skewing things. Variable used by any other browser.
}

gfeedpausescroller.prototype=new gfeedfetcher //inherit methods from gfeedfetcher class
gfeedpausescroller.prototype.constructor=gfeedpausescroller
gfeedpausescroller.prototype._displayresult=null //Remove inherited method "_displayresult()"


// -------------------------------------------------------------------
// entries_per_page()- Sets the number of RSS entries to display per page (at once)
// -------------------------------------------------------------------

gfeedpausescroller.prototype.entries_per_page=function(num){
	this.itemsperpage=num
}

// -------------------------------------------------------------------
// _signaldownloadcomplete()- Signals to the rest of the script when the fetching of all RSS feeds is complete
// -------------------------------------------------------------------

gfeedpausescroller.prototype._signaldownloadcomplete=function(){ //overwrite inherited method "_signaldownloadcomplete()"
	this.feedsfetched+=1
	if (this.feedsfetched==this.feedurls.length) //if all feeds fetched
		this._populateticker(this.feeds) //Populate the two DIVs within scroller with the fetched data
}

// -------------------------------------------------------------------
// _populateticker()- Pre-populates the two DIVs of the scroller with the 1st and 2nd RSS entries.
// -------------------------------------------------------------------

gfeedpausescroller.prototype._populateticker=function(feeds){
	gfeedfetcher._sortarray(feeds, this.sortstring)
	//set width of inner DIVs to outer DIV's width minus padding (padding assumed to be top padding x 2)
	this.visiblediv.style.width=this.hiddendiv.style.width=parseInt(this.tickerdivwidth)-(this.visibledivtop*2)+"px"
	this.itemsperpage=(this.itemsperpage>=feeds.length)? 1 : this.itemsperpage //Adjust "itemsperpage" if needed (based on total # of avail entries)
	var feedslice1=feeds.slice(0, this.itemsperpage) //Get subsection of feed array based on how many entries to show at once
	this.hiddendivpointer=this.itemsperpage //Set the feed array index of the hidden div accordingly
	var feedslice2=feeds.slice(this.hiddendivpointer, this.hiddendivpointer+this.itemsperpage)
	this.visiblediv.innerHTML=formatrssmessage(feedslice1, this.showoptions, this.itemcontainer, this.linktarget)
	this.hiddendiv.innerHTML=formatrssmessage(feedslice2, this.showoptions, this.itemcontainer, this.linktarget)
	this._initscroller()
}


// -------------------------------------------------------------------
// _initscroller()- Initialize the scroller by setting initial positions of the two dinner DIVs, start up down animation
// -------------------------------------------------------------------

gfeedpausescroller.prototype._initscroller=function(){
	var scrollerinstance=this
	this.getinline(this.visiblediv, this.hiddendiv)
	this.hiddendiv.style.visibility="visible"
	//set width of inner DIVs to outer DIV's width minus padding (padding assumed to be top padding x 2)
	this.visiblediv.style.width=this.hiddendiv.style.width=parseInt(this.tickerdivwidth)-(this.visibledivtop*2)+"px"
	
	
	
	if(this.pauseBol == 0){
		this.tickerdiv.onmouseover=function(){scrollerinstance.mouseoverBol=1}
		this.tickerdiv.onmouseout=function(){scrollerinstance.mouseoverBol=0}
	}
	//alert(window.attachEvent);
	//if (window.attachEvent) //Clean up loose references in IE
		//window.attachEvent("onunload", function(){scrollerinstance.tickerdiv.onmouseover=scrollerinstance.tickerdiv.onmouseout=null})
	setTimeout(function(){scrollerinstance._animateup()}, this.delay)
}


// -------------------------------------------------------------------
// formatrssmessage()- Global function that formats a RSS entry(s) to the desired components (title, date, description etc)
// -------------------------------------------------------------------

function formatrssmessage(feedslice, showoptions, itemcontainer, linktarget){
	var scrollerinstance=this
	var rssoutput=(itemcontainer=="<li>")? "<ul>\n" : "" //if "itemcontainer" is set to "<li>", define a "<ul>" tag to wrap around the result
	
	for (var i=0; i<feedslice.length; i++){ //Loop through the entered slice of a RSS feed (1 or more entries)
		var itemtitle="<a href=\"" + feedslice[i].link + "\" target=\"" + linktarget + "\" class=\"titlefield\">" + feedslice[i].title + "</a>"
		var itemlabel=/label/i.test(showoptions)? '<span class="labelfield">['+feedslice[i].ddlabel+']</span>' : " "
		var itemdate=gfeedfetcher._formatdate(feedslice[i].publishedDate, showoptions)
		var itemdescription= "<div class='description'>";
		itemdescription +=/description/i.test(showoptions)? ""+feedslice[i].content : /snippet/i.test(showoptions)? ""+feedslice[i].contentSnippet  : ""
		itemdescription += "<div class='clearBoth'></div></div>"
		rssoutput+=itemcontainer + itemtitle + " " + itemlabel + " " + itemdate + "\n" + itemdescription + itemcontainer.replace("<", "</") + "\n\n"
	}
	rssoutput+=(itemcontainer=="<li>")? "</ul>\n" : ""
	return rssoutput
}
function debug(text){
	var oDebug = document.getElementById("debugZone");
	if(oDebug!=null)
	oDebug.innerHTML += text+"<br/>";
}

// -------------------------------------------------------------------
// _animateup()- Move the two inner divs of the scroller up and in sync
// -------------------------------------------------------------------


gfeedpausescroller.prototype._animateup=function(){
	var scrollerinstance=this
	//debug(parseInt(this.hiddendiv.style.top) + " > " + this.visibledivtop);
	this.pauseBol = 0;
	
	
	if(this.effect == "upDown"){
	
		var finX = Math.abs(parseInt(this.visiblediv.style.top)) - parseInt(this.tickerdiv.offsetHeight)  + 5;
		var finY = Math.abs(parseInt(this.tickerdiv.offsetHeight)) + 5;
		var debutX = Math.abs(parseInt(this.hiddendiv.style.top));
		var vitesseY = 0;
		
		if(this.waySlide == "previous"){
			
			
			var vitesseX = -(finX-debutX)/10;
			vitesseX =((-Math.abs(parseInt(this.tickerdiv.offsetHeight)) + finX+parseInt(this.visiblediv.style.top)))/10;
			//vitesseY = -(finY-parseInt(this.visiblediv.style.top))/10;
			
			if(parseInt(this.hiddendiv.style.top) < 0){
				//debug("finX "+finX +" debutX "+debutX + " vitesseX "+vitesseX + " // " +parseInt(this.hiddendiv.style.left));	
				this.visiblediv.style.top=parseInt(this.visiblediv.style.top)-vitesseX+"px"
				this.hiddendiv.style.top=parseInt(this.hiddendiv.style.top)-vitesseX+"px"
				this.timerAnimate = setTimeout(function(){scrollerinstance._animateup()}, 10) 
				
			}else{
					this.getinline(this.hiddendiv, this.visiblediv)
					this._swapdivs()
					this.timerRotate = setTimeout(function(){scrollerinstance._rotatemessage()}, this.delay)
					this._pausemessage(); 
					
				}
		}
		
		if (this.waySlide == "next" || this.waySlide == null){
			
			var vitesseX = -(finX-debutX)/10;
			vitesseX = -((finX-parseInt(this.hiddendiv.style.top)))/10;
			
			//if (Math.abs(vitesseX) > 0){
			
			if(parseInt(this.hiddendiv.style.top) > 0){
				//debug("finX "+finX +" debutX "+debutX + " vitesseX "+vitesseX + " // " +parseInt(this.hiddendiv.style.left));	
				this.visiblediv.style.top=parseInt(this.visiblediv.style.top)-vitesseX+"px"
				this.hiddendiv.style.top=parseInt(this.hiddendiv.style.top)-vitesseX+"px"
				this.timerAnimate = setTimeout(function(){scrollerinstance._animateup()}, 10) 
			}else{
					this.getinline(this.hiddendiv, this.visiblediv)
					this._swapdivs()
					this.timerRotate = setTimeout(function(){scrollerinstance._rotatemessage()}, this.delay)
					if(this.waySlide != null ){
						this._pausemessage(); 
					}
			}
		}
	}
	
	
	if(this.effect == "leftRight"){
		
		var finX = Math.abs(parseInt(this.visiblediv.style.left)) - parseInt(this.tickerdiv.offsetWidth)  + 5;
		var finY = Math.abs(parseInt(this.tickerdiv.offsetWidth)) + 5;
		var debutX = Math.abs(parseInt(this.hiddendiv.style.left));
		var vitesseY = 0;
		
		if(this.waySlide == "previous"){
			
			var vitesseX = -(finX-debutX)/10;
			vitesseX =((-Math.abs(parseInt(this.tickerdiv.offsetWidth)) + finX+parseInt(this.visiblediv.style.left)))/10;
			
			//if (Math.abs(vitesseX) > 0){
			//debug("finX "+finX +" debutX "+debutX + " vitesseX "+vitesseX + " // " +parseInt(this.hiddendiv.style.left));	
			if(parseInt(this.hiddendiv.style.left) < 0){
				//debug("finX "+finX +" debutX "+debutX + " vitesseX "+vitesseX + " // " +parseInt(this.hiddendiv.style.left));	
				this.visiblediv.style.left=parseInt(this.visiblediv.style.left)-vitesseX+"px"
				this.hiddendiv.style.left=parseInt(this.hiddendiv.style.left)-vitesseX+"px"
				this.timerAnimate = setTimeout(function(){scrollerinstance._animateup()}, 10) 
				
			}else{
					this.getinline(this.hiddendiv, this.visiblediv)
					this._swapdivs()
					this.timerRotate = setTimeout(function(){scrollerinstance._rotatemessage()}, this.delay)
					this._pausemessage(); 
					
				}
		}
		
		if (this.waySlide == "next" || this.waySlide == null){
			
			var vitesseX = -(finX-debutX)/10;
			vitesseX = -((finX-parseInt(this.hiddendiv.style.left)))/10;
			
			//if (Math.abs(vitesseX) > 0){
			
			if(parseInt(this.hiddendiv.style.left) > 0){
				//debug("finX "+finX +" debutX "+debutX + " vitesseX "+vitesseX + " // " +parseInt(this.hiddendiv.style.left));	
				this.visiblediv.style.left=parseInt(this.visiblediv.style.left)-vitesseX+"px"
				this.hiddendiv.style.left=parseInt(this.hiddendiv.style.left)-vitesseX+"px"
				this.timerAnimate = setTimeout(function(){scrollerinstance._animateup()}, 10) 
			}else{
					this.getinline(this.hiddendiv, this.visiblediv)
					this._swapdivs()
					this.timerRotate = setTimeout(function(){scrollerinstance._rotatemessage()}, this.delay)
					if(this.waySlide != null ){
						this._pausemessage(); 
					}
			}
		}
	}
	
}


// -------------------------------------------------------------------
// _swapdivs()- Swap between which is the visible and which is the hidden div
// -------------------------------------------------------------------

gfeedpausescroller.prototype._swapdivs=function(){
	var tempcontainer=this.visiblediv
	this.visiblediv=this.hiddendiv
	this.hiddendiv=tempcontainer
}

gfeedpausescroller.prototype.getinline=function(div1, div2){
	if(this.effect == "upDown"){
		div1.style.top=this.visibledivtop+"px"
		div2.style.top=Math.max(div1.parentNode.offsetHeight || this.tickerdivheight, div1.offsetHeight)+"px"
	}
	
	if(this.effect == "leftRight"){
		div1.style.left=this.visibledivleft+"px"
		div2.style.left=Math.max(div1.parentNode.offsetWidth || this.tickerdivwidth, div1.offsetWidth)+"px"
	}
}


// -------------------------------------------------------------------
// _rotatemessage()- Populate the hidden div with the next message before it's visible
// -------------------------------------------------------------------

gfeedpausescroller.prototype._rotatemessage=function(){
	var scrollerinstance=this
	if (this.mouseoverBol==1) //if mouse is currently over scoller, do nothing (pause it)
		this.timerRotate = setTimeout(function(){scrollerinstance._rotatemessage()}, 100)
	else{
		
		var i=this.hiddendivpointer
		if(this.waySlide == "previous"){
			i -= 2;
		}
		
		var ceiling=this.feeds.length
		this.hiddendivpointer=(i+this.itemsperpage>ceiling-1)? 0 : i+this.itemsperpage
		var feedslice=this.feeds.slice(this.hiddendivpointer, this.hiddendivpointer+this.itemsperpage)
		this.hiddendiv.innerHTML=formatrssmessage(feedslice, this.showoptions, this.itemcontainer, this.linktarget)
		
		if(this.waySlide == "previous"){
			if(this.effect == "upDown"){
				this.hiddendiv.style.top = "-"+parseInt(this.hiddendiv.style.top)+"px";
			}else{
				this.hiddendiv.style.left = "-"+parseInt(this.hiddendiv.style.left)+"px";
			}
			
		}
		this._animateup()
	}
}

gfeedpausescroller.prototype._playmessage=function(){
	if(this.pauseBol != 0){
		
		enableDisableBtn("btn_play","disabled",this.instanceName);
		enableDisableBtn("btn_pause","enabled",this.instanceName);
		
		this.pauseBol = 0;
		this.waySlide = null;
		//debug("playmessage : "+this.pauseBol);
		this._rotatemessage();
	}
}
gfeedpausescroller.prototype._pausemessage=function(){
	if(this.pauseBol == 0){
		enableDisableBtn("btn_play","enabled",this.instanceName);
		enableDisableBtn("btn_pause","disabled",this.instanceName);
		
		this.pauseBol = 1;
		//debug("pausemessage : "+this.pauseBol);
		clearTimeout(this.timerAnimate);
		clearTimeout(this.timerRotate);
	}
	
}

gfeedpausescroller.prototype._previousmessage=function(){
	enableDisableBtn("btn_play","enabled",this.instanceName);
	enableDisableBtn("btn_pause","disabled",this.instanceName);
	this._pausemessage();
	this.pauseBol = 0;
	this.waySlide = "previous";
	this._rotatemessage();
	//debug("previousmessage : "+this.waySlide);
}

gfeedpausescroller.prototype._nextmessage=function(){
	enableDisableBtn("btn_play","enabled",this.instanceName);
	enableDisableBtn("btn_pause","disabled",this.instanceName);
	this._pausemessage();
	this.pauseBol = 0;
	this.waySlide = "next";
	this._rotatemessage();
	//debug("nextmessage : "+this.waySlide);
}

gfeedpausescroller.prototype.addNavigationButton=function(){
	var scrollerinstance=this
	
	//debug(scrollerinstance.divid+"_command");
	var commandDiv = document.getElementById(scrollerinstance.divid+"_command");
	
	commandDiv.innerHTML = "<a href='#' onclick='"+scrollerinstance.instanceName+"._previousmessage();return false' id='"+this.instanceName+"_btn_previous' class='btn_previous btnCommand'>previous</a> ";
	
	commandDiv.innerHTML += "<a href='#' onclick='"+scrollerinstance.instanceName+"._pausemessage();return false' id='"+this.instanceName+"_btn_pause' class='btn_pause btnCommand'>pause</a> ";
	commandDiv.innerHTML += "<a href='#' onclick='"+scrollerinstance.instanceName+"._playmessage();return false' id='"+this.instanceName+"_btn_play' class='btn_play btnCommand disabled'>play</a> ";
	
	
	commandDiv.innerHTML += "<a href='#' onclick='"+scrollerinstance.instanceName+"._nextmessage();return false' id='"+this.instanceName+"_btn_next' class='btn_next btnCommand'>next</a>";
	commandDiv.innerHTML += "<div class='clearLeft'></div>";

}

function enableDisableBtn(p_id,p_status,p_instanceName){
	var command = document.getElementById(p_instanceName+"_"+p_id);
	command.className = p_id+" btnCommand "+ p_status;
}
