// 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 : {};
		for (var key in this.filter) {
			if (key == "pubDate" && this.filter[key][0] == "today") {
				this.filter[key][0] = new Date();
				this.filter[key][1] = new Date();
				this.filter[key][1].setDate(this.filter[key][0].getFullYear()+5);
			}
		}
		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 : '';		
		//store template in datastring
		templatedata = '';		
		if (params.templatedata) {
			for (var key in params.templatedata){
				templatedata += params.templatedata[key]; //store template in 1 long string
			}
		}
	}
	
	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;							
					} 
				}
				if (rssdata[index]["allnodes"]["k:DPFEvent"] == undefined) rssdata[index]["allnodes"]["k:DPFEvent"] = 'false';
			});
			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 filtcnt = 0;
				for (var key in this.filter) {
					if (this.filter[key] != '') filtcnt++;
				}
				var i = 0;
				while (i<filter.length) {
					var addrec = false;	
					var addDateRec = false;
					var addKeywordRec = false;
					if (i>pend) break;	
					if (filtcnt > 0) {
						for (var key in filter[i]['allnodes']) {
							//check node against filter node passed - if there is a filter
							if (this.filter[key] != undefined && this.filter[key] != '') {
								//get all values within filter key
								switch (key) {
								case "pubDate" :
									if ((formatDateChk(new Date(filter[i]['allnodes'][key])) >= formatDateChk(new Date(this.filter[key][0])) ) && (formatDateChk(new Date(filter[i]['allnodes'][key])) <= formatDateChk(new Date(this.filter[key][1])) ) ) {
										displayany = true;
										addDateRec = true;
									}
									break;
								case "k:keywords" :
									if (filter[i]['allnodes'][key].match(this.filter[key]) ) {
										displayany = true;
										addKeywordRec = true;
									}
									break;
								default :
									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] == $.trim(vals[v])) {
												displayany = true;
												addrec = true;
												break;
											}
										}
									}
									break;
								}
							} else {
								if (key == "k:keywords") addKeywordRec = true;
								if ( (key == "k:DPFEvent") && (filter[i]['allnodes'][key] == "true") ) {
									displayany = true;
									addrec = true;
								}
							}
						}
						//if (addrec) break;						
					} else {
						displayany = true;						
						addrec = true;
						addDateRec = true;
						addKeywordRec = true;
					}
					
					if (addDateRec) {
						if (addrec || addKeywordRec) {
							datastore.appendChild(this.buildAddlContent(filter[i]));
						}
					}
					i++;					
				}
				if (!displayany) {
					var html = document.createElement("span");
					html.innerHTML = "<ul><li><p>No events found!</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);
			if (templatedata != '') {
				dataArticle.innerHTML = templatedata;
			}
			for (var key in newfilter) {
				if (newfilter[key] != '') {
					if ((this.fieldsToDisplay[key] != undefined) || this.fieldsToDisplay == '') {
						if ((this.fieldsToDisplay[key]) || this.fieldsToDisplay == '') {
							if (templatedata != '') {
								var newkey = key.replace(":","-");
								var data = newfilter[key];
								if (key == 'pubDate') data = formatDate(new Date(data));
								if (key == 'k:DPFEvent') {
									if (newfilter[key] == "true") {
										dataArticle.innerHTML = dataArticle.innerHTML.replace("[dpfevent]", ("<img src='"+this.sitepath+"dpflogosmall.jpg' />"));
									} else {
										dataArticle.innerHTML = dataArticle.innerHTML.replace("[dpfevent]", "");
									}
								}
								if (key == 'guid') {
									$(dataArticle).find('a:last').attr("href",data);
								}
								dataArticle.innerHTML = dataArticle.innerHTML.replace("["+newkey+"]", data);
								//on href [] are change to escape values by sphere
								dataArticle.innerHTML = dataArticle.innerHTML.replace("%5B"+newkey+"%5D", data);								
							} else {
								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);
}


