/* ====================================================================================== RSSControllerEvent is used for sending different type of events notifications as well as data that is needed in some occasions.====================================================================================== */function RSSControllerEvent(settings){	this.type = (settings.type) ? settings.type : 0; // type of event one of RSSControllerEvent constants	this.dataHolder = (settings.dataHolder) ? settings.dataHolder :null;		this.srcObject = (settings.srcObject) ? settings.srcObject :null;}// Class ConstantsRSSControllerEvent.EVT_FETCHING_DATA = 1;RSSControllerEvent.EVT_DATA_RETRIEVED = 2;RSSControllerEvent.EVT_POSTING_DATA = 3;RSSControllerEvent.EVT_POST_COMPLETE= 4;/* ====================================================================================== RSSDataHolder is used for hold various dataobjects. The number of objects in the data element can be checked by its count member====================================================================================== */function RSSDataHolder(settings){	this.data = (settings.data) ? settings.data : null; 	}RSSDataHolder.prototype ={	count:0,	data:null,			setCount:function(count){		//this.count = funcGetResultCount(argList);		this.count =(count) ? count:0; 	},	getCount:function(){		return this.Count;	},	getData:function(){		return this.data;	},	setData:function(dataObj){		this.data = dataObj;	}}/* ====================================================================================== RSSController is used to keep a list of all objects of type 'RSSControllerJSON' type====================================================================================== */function RSSController(settings){		this.instanceId = RSSController.instances.length;	this.strRef = 'RSSController.instances[' + this.instanceId + ']';	RSSController.instances[this.instanceId] = this;}//Class static membersRSSController.instances = new Array();RSSController.eventStack = new Array();RSSController.prototype ={	strRef: '',	registeredListeners:new Array(),	instanceId: -1,	registerListeners: function(listener)		{						if (!this.isArray(listener)) listener = [listener];						for (var i=0; i<listener.length; i++) {				if (listener[i].processRSSControllerEvent){					this.registeredListeners[this.registeredListeners.length] = listener[i];				}			}		},		isArray: function(o){		//alert('in isarr');		try{			if (isNaN(o.length)){				//alert('NAN');				return false;			}else				try{ var x = o[0]; if (typeof x == 'undefined'){ return false;} else {return true;} } catch (e){ return false; }		} catch(e){			//alert('caught e');			return false;		}	},		sendEvent:function(RSSControllerEvent){		for (var i=0; i<this.registeredListeners.length; i++){			var l = this.registeredListeners[i];						if (l.strRef) {				RSSController.eventStack.push(RSSControllerEvent);				setTimeout(l.strRef + '.processRSSControllerEvent(RSSController.eventStack.splice(0,1)[0])', 10);			} else {							l.processRSSControllerEvent(RSSControllerEvent);			}		}			}	}/* ====================================================================================== RSSControllerJSON is used for instance objects and will address calls to the static object array listnamed 'RSSController' ====================================================================================== */function RSSControllerJSON(settings){	//alert('RSSControllerJSON constructor');	RSSController.call(this, settings);	//additional attributes	if (settings){		if (settings.postRenderCall) this.postRenderCall=settings.postRenderCall; else this.postRenderCall=null;		if (settings.rssDbUrl) this.rssDbUrl=settings.rssDbUrl;		if (settings.mode) this.mode=settings.mode;		if (settings.contentDiv) this.contentDiv=settings.contentDiv;		if (settings.rssCategory) this.rssCategory=settings.rssCategory; else this.rssCategory='';		if (settings.showDescription!=null) this.showDescription=settings.showDescription; else this.showDescription=1;		if (settings.showDate!=null) this.showDate=settings.showDate; else this.showDate=1;		if (settings.showRss!=null) this.showRss =settings.showRss; else this.showRss=1;		if (settings.maxRec) this.maxRec=settings.maxRec; else this.maxRec=5;		if (settings.debug!=null) this.debug=settings.debug; 		if (settings.debugDiv) this.debugDiv=settings.debugDiv; else this.debugDiv='debuginfo';		if (settings.listStyle) {			if ( settings.listStyle=='list') this.listStyle='list'; else this.listStyle='table';		} else this.listStyle='table';		this.lastRequestString = '- not set -';		this.lastResponseString = '- not set -';			}		this.processSTGridEvent=function(eventObj){		//		switch(eventObj.type){			case STGridEvent.EVT_RENDER_COMPLETE:				//alert('RSSControllerJSON.processSTGridEvent: got render completefrom grid!');				this.sendEvent(new RSSControllerEvent({type:RSSControllerEvent.EVT_GRID_DATA_RENDERED,srcObj:this}))				break;							case STGridEvent.EVT_CLICK:				//alert('RSSControllerJSON.processSTGridEvent: got grid clicked!');				var msg = '\n action=' + eventObj.srcObject.actionParams.action;				msg += '\n url='+ eventObj.srcObject.actionParams.url;				//alert('You clicked a link:'+ msg);				window.open(eventObj.srcObject.actionParams.url,'_blank');				break;			default:				break;			}			};	/*		method used to recive the assumed JSON request from server	*/	this.recieveData = function(originalRequest){		var responseText;		//alert('got recieveData!');		document.getElementById(this.contentDiv).innerHTML = 'Data recieved!';		if (typeof originalRequest == 'object'){			responseText = originalRequest.responseText;		}else{			responseText = originalRequest;		}		//alert('recieveData:' + responseText);		this.lastResponseString = responseText;		if (this.debug==1){			this.printDebug();		}		var jsondata;		try{			jsondata = eval('(' + responseText + ')')		}catch(e){			//alert('catch:' + originalRequest.Status + e.message);			if (responseText.substring(0,1)=="<"){				//no JSON object, assumes an html page, probably logged out				location.reload(true);			} else {				//something wrong in the viewdata				alert('Problem with view data:' + e.message);			}		}			if (jsondata){				//alert('RSSControllerJSON.recieveData: sending event that we got some data');			//alert('going to render:' + originalRequest.responseText);			this.renderData(jsondata);		}	};		/*		method used to recive the assumed JSON request from server	*/	this.handleError = function(originalRequest) {		alert('RSSControllerJSON.handleError:'+ keys['viewnav_ErrorCom'] + ' Request.status= ' + originalRequest.statusText);	};		/*		method used to render debug information	*/	this.printDebug = function() {		//alert('RSSControllerJSON.printDebug');		try{			var divDebug = document.getElementById(this.debugDiv);			var html = '<div id="debugrequest">LAST REQUEST:<br />' + this.lastRequestString + '</div><br />';			html +='<div id="debugresponse">LAST RESPONSE:<br />' + this.getNiceOutput(this.lastResponseString) + '</div>';			//html +='<div id="debugresponse">LAST RESPONSE:<br />' + this.getObjectAsString(this.lastResponseString) + '</div>';			//html +='<div id="debugresponse">LAST RESPONSE:<br />' + this.lastResponseString + '</div>';			divDebug.innerHTML = html;		} catch(e){}	};		/*		method used to print ajax responsetext nicely	*/	this.getNiceOutput = function(str) {		var newstr=''; 		var re = /\r/gi;		newstr = str.replace(re,'<br />');		return newstr;			};		/*		method used to get object attribs/methods as text	*/	this.getObjectAsString = function(obj) {		var txt='';		if (typeof(obj)=='object'){			for (key in obj){				if (typeof(key)=='object'){					txt += this.getObjectAsString(key);				} else {					txt += key + ": " + this.getObjectAsString(obj[key]);				}			}			return txt;		} else {			return obj;		}	};	/*		method used to make data request to the server	*/	this.loadData = function(stEvent) {		//alert(toString(stEvent))		var pars;		if (stEvent){			var searchStr = stEvent.searchStr;			var fetchObject = stEvent.fetchObject;			if (this.mode=='viewnav'){				pars = "mode="+this.mode+"&view="+this.viewName+"&start="+fetchObject.start+"&count="+fetchObject.count;				if (this.restrictToCategory) pars +="&restricttocategory="+this.restrictToCategory			} else {				pars = "mode="+this.mode+"&view="+this.viewName+"&start="+fetchObject.start+"&count="+fetchObject.count+"&key="+this.key;			}		} else {			alert('RSSControllerJSON.loadData: Missing a valid event object.' );			return		}		//fetch data...		this.sendEvent(new RSSControllerEvent({type:RSSControllerEvent.EVT_FETCHING_DATA, srcObject:this, dataHolder:null}))		//alert('Ajax request:' + pars);		//alert('RSSControllerJSON.loadData: instanceId = ' + this.instanceId);		this.lastRequestString = pars;		if (this.debug==1){			this.printDebug();		}		var url = 'jsonData?OpenAgent';		var ajaxreq;			if (typeof jQuery != 'undefined') {        		// use jQuery style call				//jQuery.noConflict();				ajaxreq = {type: "GET",url: url, data: pars, success: new Function('data', 'RSSController.instances['+this.instanceId+'].recieveData(data)')	 }				this.lastRequest = $.ajax(ajaxreq);			} else {				//assume prototype.js style call				ajaxreq =  {method:'get', onSuccess:new Function('data', 'RSSController.instances['+this.instanceId+'].recieveData(data)'), parameters: pars, onFailure:this.handleError };				this.lastRequest = new Ajax.Request(url, ajaxreq);			}		//this.lastRequest = new Ajax.Request('jsonData?OpenAgent', {method:'get', onSuccess:new Function('data', 'RSSController.instances['+this.instanceId+'].recieveData(data)'), parameters: pars, onFailure:this.handleError });	};	/*		method used to make data request to the server	*/	this.sendRequest = function(postdata) {		//alert('RSSControllerJSON.sendRequest : ' );		//alert(this.mode);		var pars;		var ajaxreq;		var agentused;		var url;		if (typeof jQuery != 'undefined') {        		// use jQuery style call			if (this.mode=='get'){				//get records from database				agentused = 'jsonData'				url = this.rssDbUrl+'/' + agentused +'?OpenAgent';				pars = "mode="+this.mode+"&cat="+this.rssCategory +"&count="+this.maxRec+"&sdec="+this.showDescription+"&sdat="+this.showDate+"&srss="+this.showRss;				ajaxreq = {type: 'GET',url: url, data: pars, success: new Function('data', 'RSSController.instances['+this.instanceId+'].recieveData(data)')	 }				//this.sendEvent(new RSSControllerEvent({type:RSSControllerEvent.EVT_FETCHING_DATA, srcObject:this, dataHolder:null}))			} else {		 		//posting data to rss database				agentused = 'postData'				url = this.rssDbUrl+'/' + agentused +'?OpenAgent';		 		if (postdata != null){		 			pars = "mode=post&"+ postdata					ajaxreq = {type: "POST",url: url, data: pars, success: new Function('data', 'RSSController.instances['+this.instanceId+'].recievePostResponse(data)')	 }					//ajaxreq = {method:'post', onSuccess:new Function('data', 'RSSController.instances['+this.instanceId+'].recievePostResponse(data)'), parameters: pars, onFailure:this.handleError };		 		}			}		} else {			//use prototype.js style			if (this.mode=='get'){				//get records from database				agentused = 'jsonData'				url = this.rssDbUrl+'/' + agentused +'?OpenAgent';				pars = "mode="+this.mode+"&cat="+this.rssCategory +"&count="+this.maxRec+"&sdec="+this.showDescription+"&sdat="+this.showDate+"&srss="+this.showRss;				ajaxreq = {method:'get', onSuccess:new Function('data', 'RSSController.instances['+this.instanceId+'].recieveData(data)'), parameters: pars, onFailure:this.handleError };				//this.sendEvent(new RSSControllerEvent({type:RSSControllerEvent.EVT_FETCHING_DATA, srcObject:this, dataHolder:null}))			} else {		 		//posting data to rss database				agentused = 'postData'				url = this.rssDbUrl+'/' + agentused +'?OpenAgent';		 		if (postdata != null){		 			pars = "mode=post&"+ postdata					ajaxreq = {method:'post', onSuccess:new Function('data', 'RSSController.instances['+this.instanceId+'].recievePostResponse(data)'), parameters: pars, onFailure:this.handleError };		 		}			}		} // end of 'typeof jQuery '				//fetch data...		//alert('Ajax request:' + pars);		//alert('RSSControllerJSON.sendRequest : instanceId = ' + this.instanceId);		this.lastRequestString = pars;		if (this.debug==1){			this.printDebug();		}		//this.lastRequest = new Ajax.Request('jsonData?OpenAgent', {method:'get', onSuccess:new Function('data', 'RSSController.instances['+this.instanceId+'].recieveData(data)'), parameters: pars, onFailure:this.handleError });		if (typeof jQuery != 'undefined') {        		// use jQuery style call			//jQuery.noConflict();			//alert('jQuery: ' + url + '   pars: ' +pars);			this.lastRequest = $.ajax(ajaxreq);		} else {			//assume prototype.js style call			//alert('prototype.js: ' + url + '   pars: ' +pars);			this.lastRequest = new Ajax.Request(url, ajaxreq);		}		//this.lastRequest = new Ajax.Request(this.rssDbUrl+'/' + agentused +'?OpenAgent', ajaxreq);	};	/*		method used to display the data	*/	this.recievePostResponse = function(originalRequest){		var responseText;		//alert('got recievePostResponse!');		document.getElementById(this.contentDiv).innerHTML = 'Data recieved!';		if (typeof originalRequest == 'object'){			responseText = originalRequest.responseText;		}else{			responseText = originalRequest;		}		//alert('recieveData:' + responseText);		this.lastResponseString = responseText;		if (this.debug==1){			this.printDebug();		}		var jsondata;		try{			jsondata = eval('(' + responseText + ')')		}catch(e){			//alert('catch:' + originalRequest.Status + e.message);			if (responseText.substring(0,1)=="<"){				//no JSON object, assumes an html page, probably logged out				location.reload(true);			} else {				//something wrong in the viewdata				alert('Problem with view data:' + e.message);			}		}			if (jsondata.status != 'error'){			try{				document.getElementById(this.contentDiv).innerHTML = jsondata.responstext;				} catch(e){}		} else {			alert('Ett fel uppstod vid n\u00E4r posten skulle sparas:\n' +jsondata.responstext);		}		//perform any post render call		try{			//alert('postRenderCall: '+ this.postRenderCall)			if (this.postRenderCall) this.postRenderCall();		} catch(e){}	}	/*		method used to display the data	*/	this.renderData = function(view){		var html='';		if (!view){			html = 'Invalid data:'+ this.toString(view);			document.getElementById(this.contentDiv).innerHTML = html;			return false;		} 		if (view.error) {			alert(' view_error');			this.show_error(view.error);		}		//build the table		var tablewidth = document.getElementById(this.contentDiv).clientWidth - 10;		var html_header;		var html_footer;		var html_recstart;		var html_recend;		if (this.listStyle=='list'){			html_header='<ul class="rsslist">';			html_footer='</ul>';			html_recstart='<li>';			html_recend='</li>';		} else {			html_header='<table width="' + tablewidth + '" border="0" class="rsstable">';			html_footer='</table>';			html_recstart='<tr><td valign="top">';			html_recend='</td></tr>';		}		if (view.total > 0){			//print entries			//process all entries in view			try{			for (var entryidx=0; entryidx<view.entries.length; entryidx++){				//alert('Inside renderData: 4-'+entryidx);				var entry =view.entries[entryidx];				if (!entry._unid){return}; //no document=must be end of the view				var url = ((view.aliases)?view.aliases[0]:view.name)+'/'+ entry._unid+'?OpenDocument' ;				var rsslink = entry.columns[3];				//var rsstitle = '<a href="#" onclick="window.open(\''+ url+'\')">' + entry.columns[1] +'</a>'				//var rsstitle = '<a href="#" class="rsstitle" onclick="window.open(\''+ rsslink+'\')">' + entry.columns[1] +'</a>'				var rsstitle = '<a href="'+ rsslink+'" class="rsstitle" target="_blank">' + entry.columns[1] +'</a>'				var rssdescription = entry.columns[2];				var rssdate = entry.columns[0];				var rsslink = entry.columns[3];				html+= html_recstart;				//html+= '<li>';				html+= '  <span class="rssrecord">';				html+= '     <p class="rsstitle">'+ rsstitle + '</p>';				if (this.showDescription) html+= '     <p class="rssdescription">'+ rssdescription + '</p>';				if (this.showDate) html+= '     <p class="rssdate">'+ rssdate + '</p>';				html+= '  </span>';				//html+= '</li>';				html+= html_recend															} //end for-loop			//alert('Instans ' + this.instanceId + ': showRss=' +this.showRss);			if (this.showRss){					var rssicon = (this.rssicon==null)? view.rssicon: this.rssicon;					//var rsssyndicate = '<a href="#" onclick="window.open(\''+ view.rsssyndicateurl+'\')">' + rssicon +'</a>'					var rsssyndicate = '<a href="'+ view.rsssyndicateurl+'"  target="_blank">' + rssicon +'</a>'					html+= '<tr><td valign="top">';					html+= '     <p class="rsssyndicate">'+ rsssyndicate + '</p>';					html+= '</td></tr>';			}			} catch(e){ alert(e.message)}		} //end view.total		else {			html = '<p class="rssnodata">Ingen data finns att visa.</p>'		}		//alert('html:' + html);		//alert('div=' +this.contentDiv);		//update contentDiv		document.getElementById(this.contentDiv).innerHTML = html_header + '<tbody id="table-view-body">' + html+ '</tbody>' + html_footer;						//perform any post render call		try{			//alert('postRenderCall: '+ this.postRenderCall)			if (this.postRenderCall) this.postRenderCall();		} catch(e){}		//return status		return true;			}	}RSSControllerJSON.prototype = new RSSController();