var fnfscroller_constants={
	navpanel: {height:'20px', downarrow:'http://c2019542.r42.cf0.rackcdn.com/down.png', opacity:0.4, title:'Go to Next Content', background:'black'},
	loadingimg: {src:'http://c2019542.r42.cf0.rackcdn.com/ajaxloading.gif', dimensions:[100,15]}
}
function fnfscroller(options){
	this.setting={mode:'manual', inittype:'stunted', pause:3000, animatespeed:500, ajaxsource:null, rssdata:null, refreshsecs:0, navpanel:{show:false, cancelauto:false}}
	jQuery.extend(this.setting, options)
	options=null
	this.curmsg=0
	this.addloadingpanel(jQuery, 'preload')
	if (this.setting.rssdata)
		google.load("feeds", "1")
	var slider=this
	jQuery(function($){
		slider.$slider=$('#'+slider.setting.id)
		if (slider.setting.ajaxsource||slider.setting.rssdata)
			slider.$slider.empty()
		slider.addloadingpanel(jQuery, 'show')
		if (slider.setting.ajaxsource)
			slider.getajaxul(slider.setting.ajaxsource)
		else if (slider.setting.rssdata){
			slider.fetchfeeds()
		}
		else{ 
			if (slider.setting.inittype=="onload") 
				$(window).load(function(){slider.init($)})
			else 
				slider.init($)
		}
	})
}
function constrain(str,n)
{
	var strln = str.length;
	if(strln > n)
	{
		var s = str.substr(0, n);
		var words = s.split(' ');
		words[words.length-1] = '';
		str = words.join(' ') + '&hellip;'
	}
	return str;
}

fnfscroller.prototype={

	getajaxul:function(path){
		var $=jQuery, slider=this
		this.stopscroll() 
		this.$loadingpanel.show()
		$.ajax({
			url: path, 
			async: true,
			error:function(ajaxrequest){
				slider.$slider.html('Error fetching content.<br />Server Response: '+ajaxrequest.responseText)
			},
			success:function(content){
				slider.reloadul(content)
				if (slider.setting.refreshsecs>0) 
					setTimeout(function(){slider.getajaxul(path)}, slider.setting.refreshsecs*1000)
			}
		})
	},

	addloadingpanel:function($, mode){
		var loadingimgref=fnfscroller_constants.loadingimg
		if (mode=="preload"){
			var loadingimg=new Image(loadingimgref.dimensions[0], loadingimgref.dimensions[1])
			loadingimg.src=loadingimgref.src
			this.$loadingimg=$(loadingimg).css({position:'absolute', zIndex:1003})
		}
		else{
			var sliderdimensions=[this.$slider.width(), this.$slider.height()]
			var $loadingpanel=$('<div />').css({position:'absolute', left:0, top:0, background:'black', opacity:0.5, width:sliderdimensions[0], height:sliderdimensions[1], zIndex:1002}).appendTo(this.$slider)
			this.$loadingimg.css({left:sliderdimensions[0]/2-loadingimgref.dimensions[0]/2, top:sliderdimensions[1]/2-loadingimgref.dimensions[1]/2}).appendTo(this.$slider)
			this.$loadingpanel=$loadingpanel.add(this.$loadingimg)
		}
	},

	addnavpanel:function(){
		var slider=this, setting=this.setting
		var $navpanel=$('<div class="sliderdesc"><div class="sliderdescbg"></div><div class="sliderdescfg"><div class="sliderdesctext"></div></div></div>')
			.css({position:'absolute', width:'100%', left:0, top:-1000, zIndex:'1001'})
			.find('div').css({position:'absolute', left:0, top:0, width:'100%'})
			.eq(0).css({background:fnfscroller_constants.navpanel.background, opacity:fnfscroller_constants.navpanel.opacity}).end() 
			.eq(1).css({color:'white'}).end() 
			.eq(2).css({textAlign:'center', cursor:'pointer', paddingTop:'2px'}).html('<img src="'+fnfscroller_constants.navpanel.downarrow+'"/>').end().end()
			.appendTo(this.$slider)
		var $descpanel=$navpanel.find('div.sliderdesctext').attr('title', fnfscroller_constants.navpanel.title).click(function(){ 
			slider.stopscroll()
			slider.scrollmsg(setting.mode=="auto" && !setting.navpanel.cancelauto? true : false)
		})
		$navpanel.css({top:this.$slider.height()-parseInt(fnfscroller_constants.navpanel.height), height:fnfscroller_constants.navpanel.height}).find('div').css({height:'100%'})
	},

	resetuls:function(){ 
		var $tempul=this.$mainul
		this.$mainul=this.$secul.css({zIndex:1000})
		this.$secul=$tempul.css({zIndex:999})
		this.$secul.css('top', this.ulheight)
	},

	reloadul:function(newhtml){ 
		this.$slider.find('ul').remove()
		this.ulheight=null
		this.curmsg=0;
		this.$slider.append(newhtml)
		this.init($)		
	},

	setgetoffset:function($li){
		var recaldimensions=(this.setting.ajaxsource || this.setting.rssdata) && this.setting.inittype=="onload" 
		if (this.curmsg==this.$lis.length)
			return (!this.ulheight || recaldimensions)? this.ulheight=this.$mainul.height() : this.ulheight
		else{
			if (!$li.data('toppos') || recaldimensions)
				$li.data('toppos', $li.position().top)
			return $li.data('toppos')
		}
	},

	scrollmsg:function(repeat){
		var slider=this, setting=this.setting
		var ulheight=this.ulheight || this.$mainul.height()
		var endpoint=-this.setgetoffset(this.$lis.eq(this.curmsg))
		this.$mainul.animate({top: endpoint}, setting.animatespeed, function(){
			slider.curmsg=(slider.curmsg<slider.$lis.length+1)? slider.curmsg+1 : 0
			if (slider.curmsg==slider.$lis.length+1){ 
				slider.resetuls() 
				slider.curmsg=1
			}
			if (repeat)
				slider.scrolltimer=setTimeout(function(){slider.scrollmsg(repeat)}, setting.pause)
		})
		var secendpoint=endpoint+ulheight
		this.$secul.animate({top: secendpoint}, setting.animatespeed)
	},

	stopscroll:function(){
		if (this.$mainul){
			this.$mainul.add(this.$secul).stop(true, false)
			clearTimeout(this.scrolltimer)
		}
	},

	init:function($){
		var setting=this.setting
		this.$loadingpanel.hide()
		this.$mainul=this.$slider.find('ul:eq(0)').css({zIndex:1000})
		this.$lis=this.$mainul.find('li')
		if (setting.navpanel.show)
			this.addnavpanel()
		this.$secul=this.$mainul.clone().css({top:this.$mainul.height(), zIndex:999}).appendTo(this.$slider) 
		this.scrollmsg(setting.mode=="auto")
	},

	fetchfeeds:function(){
		var slider=this, rssdata=this.setting.rssdata
		this.stopscroll() 
		this.$loadingpanel.show()
		this.entries=[] 
		this.feedsfetched=0
		for (var i=0; i<rssdata.feeds.length; i++){ 
			var feedpointer=new google.feeds.Feed(rssdata.feeds[i][1]) 
			feedpointer.setNumEntries(rssdata.entries) 
			feedpointer.load(function(label){
				return function(r){
					slider.storefeeds(r, label)
				}
			}(rssdata.feeds[i][0])) 
		}	
	},

	storefeeds:function(result, label){
		var thisfeed=(!result.error)? result.feed.entries : "" 
		if (thisfeed==""){ 
			alert("Google Feed API Error: "+result.error.message)
		}
		for (var i=0; i<thisfeed.length; i++){ 
			result.feed.entries[i].label=label 
		}
		this.entries=this.entries.concat(thisfeed) 
		this.feedsfetched+=1
		if (this.feedsfetched==this.setting.rssdata.feeds.length){ 
			if (this.setting.rssdata.groupbylabel){ 
				this.entries.sort(function(a,b){
					var fielda=a.label.toLowerCase(), fieldb=b.label.toLowerCase()
					return (fielda<fieldb)? -1 : (fielda>fieldb)? 1 : 0
				})
			}
			else{ 
				this.entries.sort(function(a,b){return new Date(b.publishedDate)-new Date(a.publishedDate)})
			}
			this.formatfeeds()
		}
	},

	formatfeeds:function(){
		function formatdate(datestr, showoptions){
			var itemdate=new Date(datestr)
			var a_p = "";
			var zeromin = "";
			var zerohour = "";
			var parsedhour=itemdate.getHours()
			var parsedmin=itemdate.getMinutes()
			if (parsedhour < 12)
			{
				a_p = "AM";
			}
			else
			{
				a_p = "PM";
			}
			if (parsedhour == 0)
			{
				parsedhour = "12";
			}
			if (parsedhour > 12)
			{
				parsedhour = parsedhour - 12;
			}
			if (parsedmin < 10)
			{
				var zeromin = "0";
			}
			if (parsedhour < 10)
			{
				var zerohour = "0";
			}
			return "<span class='datefield'>"+zerohour+parsedhour+":"+zeromin+parsedmin+" "+a_p+"</span>"
		}
		var fnfcontent='';
		var slider=this, rssdata=this.setting.rssdata, entries=this.entries
		var j = "0";
		var k = "0";
		var block = "0";
		var myRegExp = /advert|delete/i;
		var str=" ";
		var newitem = "0";
		for (var i=0; i<entries.length; i++)
		{
			while(j < i)
			{
				if(i != j)
				{
					if(entries[i].title == entries[j].title)
					{
						k++;
					}
				}
				j++;
			}
			str = entries[i].title;
			str = constrain(str, 45);
			block = str.search(myRegExp);

			if(k == 0)
			{
				if(block == -1)
				{
					var itemdate=new Date(entries[i].publishedDate)
					var today=new Date()
					var one_hour=1000*60*60
					var itemage = Math.ceil( (today.getTime() - itemdate.getTime()) / (one_hour) )

					fnfcontent+='<li>'
					+'<span class="rssdate">'
					+(/date/.test(rssdata.displayoptions)? formatdate(entries[i].publishedDate, rssdata.displayoptions): "")
					+' </span> '
					+'<span class="rsslabel">'
					+(/label/.test(rssdata.displayoptions)? "<b>"+entries[i].label+"</b>" : "")
					+' </span> '
					+'<a href="'+entries[i].link+'" title="Snippet: '
					+(/description/.test(rssdata.displayoptions)? entries[i].content.replace(/(<([^>]+)>)/ig,"")  : entries[i].contentSnippet.replace(/(<([^>]+)>)/ig,""))
					+' Posted about '+itemage+' hour(s) Ago.'
					+'" target="'+rssdata.linktarget+'">'+str+'</a>'
					+'</li>\n\n'
				}
			}
			if (itemage < 24)
			{
				newitem++;
			}	

			j=0;
			k=0;
		}

	if(newitem > 3)
	{
		fnfcontent = '<h4>Breaking Stories | ' +newitem+ ' in the Last 24 hours</h4><ul>' + fnfcontent + ' </ul> '
	}
	else
	{
		fnfcontent = '<h4>Latest News</h4><ul>' + fnfcontent + ' </ul> '
	}
	
	this.reloadul(fnfcontent)
	if (slider.setting.refreshsecs>0) 
		setTimeout(function(){slider.fetchfeeds()}, slider.setting.refreshsecs*1000)
	}
}
function timeSource()
{
	x=new Date();
	x.setTime(x.getTime());
	return x;
}
function leadingZero(x)
{
	return (x>9)?x:'0'+x;
}
function twelveHour(x)
{
	if(x==0)
	{
		x = "12";
	}
	return (x>12)?x-=12:x;
}
function displayTime()
{
	document.getElementById('tP').innerHTML=eval(outputTime);
	setTimeout('displayTime()',990);
}
function amPMsymbol(x)
{
	return (x>11)?' pm':' am';
}
function fixYear4(x)
{
	return (x<500)?x+1900:x;
}

var dayNames=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
var monthNames=new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
var outputTime="dayNames[timeSource().getDay()]+', '+leadingZero(timeSource().getDate())+' '+monthNames[timeSource().getMonth()]+' '+fixYear4(timeSource().getYear())+' - '+twelveHour(timeSource().getHours())+':'+leadingZero(timeSource().getMinutes())+':'+leadingZero(timeSource().getSeconds())+amPMsymbol(timeSource().getHours())";

