// Dumps an RSS Feed in <LI> format. CAn then be styled or displayed anyway you like
// Dean Huntley (c) 2008
// Kintera
/*
Take RSS Feed and display all tags in <li> format
*/

function RSSDisplay(params) {

	this.getParams = function(params) {
		this.appenddata = (params.appenddata != undefined) ? params.appenddata : false;		
		this.showtitle = (params.showtitle != undefined) ? params.showtitle : false;
		this.sectiontitle = (params.title != undefined) ? params.title : '';
		this.sitepath = params.sitepath;
		this.itemsToDisplay = (params.itemsToDisplay != undefined) ? params.itemsToDisplay : 4;
		this.feed = params.feed;
		this.dataArea = params.dataArea;
		this.datekey = params.datekey;
		this.filter = (params.filter != undefined) ? params.filter : {};
		this.uniqueid = params.uniqueid;
		this.loadingImage = params.loadingImage; 
		this.linktitletag = (params.linktitletag != undefined) ? params.linktitletag : "title";
		this.linkurltag = (params.linkurltag != undefined) ? params.linkurltag : "";
		this.showlabels = (params.showlabels != undefined) ? params.showlabels : false;
		this.labeltags = (params.labeltags != undefined) ? params.labeltags : {};
		this.labeltypes = (params.labeltypes != undefined) ? params.labeltypes : {};
		this.showsort = (params.showsort != undefined) ? params.showsort : false;
		this.labelsort = (params.labelsort != undefined) ? params.labelsort : {};
		this.fieldsToDisplay = (params.fieldsToDisplay != undefined) ? params.fieldsToDisplay : '';		
	}
	
	this.buildRSSList = function() {
		var self = this;
		$('#'+this.dataArea)[0].innerHTML = "Loading... <img src='" + this.sitepath + this.loadingImage + "' />";
		$.get(this.feed,function(data) {
			//find each 'item' in the file and parse it
			var rssdata = [];
			var count = 0;
			$(data).find('item').each(function(index, item) {
				var addrec = false;
				//name the current found item this for this particular loop run
				rssdata[index] = [];
				rssdata[index]["allnodes"] = new Object();									
				for (k=0; item.childNodes.length>k; k++)
				{
					if(item.childNodes[k].firstChild != null) {
						rssdata[index]["allnodes"][item.childNodes[k].tagName] = item.childNodes[k].firstChild.data;							
					} 
				 }
			});
			self.RSSData = rssdata;
			self.displayFilterData(rssdata);
  	    });
	}
	
	/* name of highlevel filter array passed, the actual name, div the data will return to and the pagecount to display */
	this.displayFilterData = function(filter) {
			var self = this;
			var displayany = false;
			var prevgroup='', filterItemContent='', itemstart=-1, itemcount=-1;
			var datastore = $('#'+this.dataArea)[0];
			if (!this.appenddata) datastore.innerHTML = '';
			if (this.showtitle) datastore.innerHTML += '<div class="sectiontitle">'+this.sectiontitle+'</div>';
			if (filter.length > 0) {
				if (this.showsort) {
					//sort title
					var span = document.createElement("span");
					span.className = "article-sort-title";
					span.innerHTML = "Sort: ";
					datastore.appendChild(span);
					//sort dropdown
					var sel = document.createElement("select");
					sel.className = "article-sort";
					sel.onchange = function() {
						self.filterSort(this.options[this.selectedIndex].value);
					}
					for (var key in this.labelsort) {
						this.sortval = (this.sortval != undefined) ? this.sortval : key;
						var optx = document.createElement("option");
						optx.value = key+this.labelsort[key].match(/\[\w\]/);
						optx.innerHTML = this.labelsort[key].replace(/\[\w\]/g,"");
						optx.selected = (key == this.sortval) ? 'selected' : '';
						sel.appendChild(optx);
					}
					datastore.appendChild(sel);
				}
				var pstart = 0;
				var pend = (this.itemsToDisplay > filter.length) ? filter.length : this.itemsToDisplay;
		
				filterItemContent += '<br />';		
				var i = 0;
				while (i<filter.length) {
					var addrec = false;					
					if (i>pend) break;					
					if (this.filter != '') {
						for (var key in filter[i]['allnodes']) {
							//check node against filter node passed - if there is a filter
							if (this.filter[key]) {
								//get all values within filter key
								for (x=0;x<this.filter[key].length;x++) {
									var vals = filter[i]['allnodes'][key].split(",");
									for (v=0;v<vals.length;v++) {
										if (this.filter[key][x] == $.trim(vals[v])) {
											displayany = true;
											addrec = true;
											break;
										}
									}
								}
							}
							if (addrec) break;
						}
					} else {
						addrec = true;
					}
					if (addrec) {
						datastore.appendChild(this.buildAddlContent(filter[i]));
					}
					i++;					
				}
				if (!displayany) {
					var html = document.createElement("span");
					html.innerHTML = "<ul><li><p>There are currently no "+this.sectiontitle+"</p></li></ul>";
					datastore.appendChild(html);
				}
			} else {
				filterItemContent += "<p><h4>No RSS Feed Data found!</h4></p>"
			}
		}
	
	/* builds content to be written */
	this.buildAddlContent = function(filter) {
			var dataArticle = document.createElement("ul");
			dataArticle.className = "article-all";
			var newfilter  = new Object(filter.allnodes);
			for (var key in newfilter) {
				if (newfilter[key] != '') {
					if ((this.fieldsToDisplay[key] != undefined) || this.fieldsToDisplay == '') {
						if ((this.fieldsToDisplay[key]) || this.fieldsToDisplay == '') {
							var div = document.createElement("li");
							div.className = key.replace(":","-");
							if (this.showlabels) {
								var label = document.createElement("label");
								label.innerHTML = ((this.labeltags[key] != undefined) ? this.labeltags[key] : key)+'&nbsp;';
								div.appendChild(label);
							}
							if (key == this.linktitletag && newfilter[this.linkurltag]) {
								var self = this;
								var dataHref = document.createElement("a");
								dataHref.innerHTML = newfilter[key];
								dataHref.href = newfilter[this.linkurltag];
								dataHref.target = "_new";
								div.appendChild(dataHref);
							} else {
								var span = document.createElement("span");
								switch (this.labeltypes[key]) {
									case "map" : 
										span.innerHTML = newfilter[key]+"&nbsp;<a href='http://maps.google.com/maps?q="+newfilter[key]+"' target='_new'>map</a>";
										break;
									case "email" : 
										var href = document.createElement("a");
										href.href = "mailto:"+newfilter[key];
										href.innerHTML = newfilter[key];
										span.appendChild(href);
										break;
									default : 
										span.innerHTML = newfilter[key];
										break;
								}
								div.appendChild(span);					
							}
							dataArticle.appendChild(div);
						}
					}
				}
			}
			
			return dataArticle;
		}

	this.filterSort = function(sortval) {
			var self = this;
			filter = this.RSSData.slice(0);
			
			var sortdir = (sortval.search(/\[\w\]/) > 0) ? (sortval.substr(sortval.search(/\[\w\]/)+1,1)) : 'a';
			this.sortval = sortval.replace(/\[\w\]/g,"");
			
			//use datekey to determine if the Date var should be used to sort rather than the text vers of the date
			if (this.sortval == this.datekey) this.sortval = "Date";
			
			/* sort descending - put all articles in title order */
			if (sortdir == 'd') {
				filter.sort(function (a, b){
							a = a['allnodes'][self.sortval];
							b = b['allnodes'][self.sortval];
							if (a>b) return -1;
							if (a <b) return 1;
							return 0; } );
			} else {
				filter.sort(function (a, b){
							a = a['allnodes'][self.sortval];
							b = b['allnodes'][self.sortval];
							if (a>b) return 1;
							if (a <b) return -1;
							return 0; } );
			}
			
			this.displayFilterData(filter);
		}
	
	/* write's output data */
	this.writeOutput = function() {
			var content = this.filterItemContent;
			this.content = "<div id='rssResults'><p>"+content+"</p></div>";
			return content;
		}

	this.init = function(params) {
			this.getParams(params);
			this.buildRSSList();
		}
	
	this.init(params);
}