"use strict";function DataCacheClass(parent,name,options,functions){var self=this;var defaultOptions={useCache:true};var defaultFunctions={};self.parent=parent;self.name=name;self.options=jQuery.extend(true,{},defaultOptions,options);self.functions=jQuery.extend(true,{},defaultFunctions,functions);self.cache={};};DataCacheClass.prototype.getCacheKey=function(name,objects){var self=this;return name+'_'+JSON.stringify(objects);};DataCacheClass.prototype.load=function(key){var self=this;if(self.options.useCache){return self.cache[key];}else{return null;}};DataCacheClass.prototype.save=function(key,json){var self=this;if(self.options.useCache){self.cache[key]=json;}
return json;};"use strict";function DataCookieClass(parent,name,options,functions){var self=this;var defaultOptions={cookieOptions:{expires:2},queryCookieId:name+'_query',selectedListCookieId:name+'_selectedlist',favouritesListCookieId:name+'_favouriteslist'};var defaultFunctions={};self.parent=parent;self.name=name;self.options=jQuery.extend(true,{},defaultOptions,options);self.functions=jQuery.extend(true,{},defaultFunctions,functions);};DataCookieClass.prototype.loadValue=function(key){var self=this;return jQuery.cookie(key);};DataCookieClass.prototype.loadQueryValue=function(){var self=this;return self.loadValue(self.options.queryCookieId);};DataCookieClass.prototype.loadObject=function(key){var self=this;return jQuery.getJSONCookie(key).d;};DataCookieClass.prototype.loadFavouritesListObject=function(){var self=this;return self.loadObject(self.options.favouritesListCookieId);};DataCookieClass.prototype.loadSelectedListObject=function(){var self=this;return self.loadObject(self.options.selectedListCookieId);};DataCookieClass.prototype.saveValue=function(key,value){var self=this;jQuery.cookie(key,value,self.options.cookieOptions);return value;};DataCookieClass.prototype.saveQueryValue=function(value){var self=this;return self.saveValue(self.options.queryCookieId,value);};DataCookieClass.prototype.saveObject=function(key,json){var self=this;jQuery.setJSONCookie(key,{d:json},self.options.cookieOptions);return json;};DataCookieClass.prototype.saveSelectedListObject=function(json){var self=this;return self.saveObject(self.options.selectedListCookieId,json);};DataCookieClass.prototype.saveFavouritesListObject=function(json){var self=this;return self.saveObject(self.options.favouritesListCookieId,json);};"use strict";function DataServerClass(parent,name,options,functions){var self=this;var defaultOptions={dataUrl:'PLEASE-CONFIGURE-THIS-URL'};var defaultFunctions={};self.parent=parent;self.name=name;self.options=jQuery.extend(true,{},defaultOptions,options);self.functions=jQuery.extend(true,{},defaultFunctions,functions);};DataServerClass.prototype.load=function(sourceObject,selectedList_array,dataTables,displayVisualisationObjectsToRedraw,onSuccess){var self=this;var ajax;if(ajax)
{ajax.abort();ajax=null;}
ajax=jQuery.ajax({type:'GET',url:this.options.dataUrl+'/data',dataType:'json',data:(selectedList_array==null?'':'objects='+encodeURIComponent(JSON.stringify(selectedList_array)))+'&tables='+toCSV(dataTables),success:function(data,status)
{onSuccess(sourceObject,selectedList_array,displayVisualisationObjectsToRedraw,data);},error:function(XMLHttpRequest,textStatus,errorThrown)
{},complete:function(XMLHttpRequest,textStatus)
{}});};DataServerClass.prototype.lookup=function(sourceObject,ids,onSuccess){var self=this;var ajax;if(ajax)
{ajax.abort();ajax=null;}
ajax=jQuery.ajax({type:'GET',url:this.options.dataUrl+'/lookup',dataType:'json',data:'ids='+toCSV(ids),success:function(data,status)
{onSuccess(sourceObject,ids,data);},error:function(XMLHttpRequest,textStatus,errorThrown)
{console.log('ERROR');},complete:function(XMLHttpRequest,textStatus)
{}});};DataServerClass.prototype.lookupKeyValue=function(sourceObject,key,value,onSuccess){var self=this;var ajax;if(ajax)
{ajax.abort();ajax=null;}
ajax=jQuery.ajax({type:'GET',url:this.options.dataUrl+'/lookup_key_value',dataType:'json',data:key+'='+value,success:function(data,status)
{onSuccess(sourceObject,key,value,data);},error:function(XMLHttpRequest,textStatus,errorThrown)
{console.log('ERROR');},complete:function(XMLHttpRequest,textStatus)
{}});};"use strict";function DataClass(parent,name,options,functions){var self=this;var defaultOptions={dataCacheObject:{},dataCookieObject:{},dataServerObject:{}};var defaultFunctions={dataCacheObject:{},dataCookieObject:{},dataServerObject:{}};self.parent=parent;self.name=name;self.options=jQuery.extend(true,{},defaultOptions,options);self.functions=jQuery.extend(true,{},defaultFunctions,functions);self.dataCacheObject=new DataCacheClass(self,name+'_datacacheobject',self.options.dataCacheObject,self.functions.dataCacheObject);self.dataCookieObject=new DataCookieClass(self,name+'_datacookieobject',self.options.dataCookieObject,self.functions.dataCookieObject);self.dataServerObject=new DataServerClass(self,name+'_dataserverobject',self.options.dataServerObject,self.functions.dataServerObject);};DataClass.prototype.lookupKeyValueFromServerOrCache=function(sourceObject,key,value,onSuccess){var self=this;var cacheKey=self.dataCacheObject.getCacheKey(key,value);var cacheValue=self.dataCacheObject.load(cacheKey);if(cacheValue!=null){onSuccess(sourceObject,key,value,cacheValue)}else{var onServerLookup=function(sourceObject,key,value,data){self.dataCacheObject.save(cacheKey,data);onSuccess(sourceObject,key,value,data)};self.dataServerObject.lookupKeyValue(sourceObject,key,value,onServerLookup);}};"use strict";function DisplayVisualisationClass(parent,name,options,functions)
{var self=this;var defaultOptions={fixedVisualisation:false};var defaultVisualisationOptions={width:590,height:200,is3D:false,legend:'bottom',min:0,showCategories:true,tooltipHeight:110,tooltipWidth:260};var defaultFunctions={currencyFormatter:new google.visualization.NumberFormat({prefix:'£',fractionDigits:2,groupingSymbol:','}),percentFormatter:new google.visualization.NumberFormat({suffix:'%',fractionDigits:1})};self.parent=parent;self.name=name;self.options=jQuery.extend(true,{},defaultOptions,options);self.options.visualisationOptions=jQuery.extend(true,{},defaultVisualisationOptions,options.visualisationOptions);self.functions=jQuery.extend(true,{},defaultFunctions,functions);self.containerId=name;}
DisplayVisualisationClass.prototype.redraw=function(selectedObjects,dataTable)
{var self=this;self.parent.selectedDisplayVisualisationObject=self;jQuery('#'+self.parent.containerId+'-title').text(self.parent.options.title+' '+self.options.title);if(dataTable==null){alert('Error: no data to visualise for '+self.name);return;}
jQuery('#'+self.containerId).empty();switch(self.options.visualisation){case"Map":self.drawMap(selectedObjects,dataTable);break;case"TermCloud":if(selectedObjects!=null&&selectedObjects.length>0){self.drawTermCloud(selectedObjects,dataTable);}
break;case"PopUp":self.drawPopUp(selectedObjects,dataTable);break;default:if(selectedObjects!=null&&selectedObjects.length>0){self.drawVisualisation(selectedObjects,dataTable);}
break;}};DisplayVisualisationClass.prototype.drawTermCloud=function(selectedObjects,dataTable){var self=this;var googleDataTable=self.applyFormatters(dataTable);var googleDataView=new google.visualization.DataView(googleDataTable);if(self.options.viewColumns){googleDataView.setColumns(self.options.viewColumns);}
var googleVisualisation=new TermCloud(document.getElementById(self.containerId));googleVisualisation.draw(googleDataView,self.options.visualisationOptions);};DisplayVisualisationClass.prototype.drawPopUp=function(selectedObjects,dataTable){var self=this;var googleDataTable=self.applyFormatters(dataTable);var googleDataView=new google.visualization.DataView(googleDataTable);if(self.options.viewColumns){googleDataView.setColumns(self.options.viewColumns);}
var googleVisualisation=new bestcourse4me.PopUp(document.getElementById(self.containerId));googleVisualisation.draw(googleDataView,self.options.visualisationOptions);};DisplayVisualisationClass.prototype.drawMap=function(selectedObjects,dataTable){var self=this;var map=new google.maps.Map(document.getElementById(self.containerId),self.options.visualisationOptions);var middleOfTheUK=new google.maps.LatLng(53.8,358);map.setCenter(middleOfTheUK);google.maps.event.trigger(map,'resize');self.parent.parent.map=map;self.parent.parent.markers={};for(var i=0;i<dataTable.length;i+=1){var record=dataTable[i];var myLatLng=new google.maps.LatLng(record.latitude,record.longitude);var text='<div class="infotext"><p><b>'+record.long_name+'</b></p>'+'<p>'+record.address+'</p>'+'<p><a target="_blank" href="'+record.website+'">'+record.website+'</a></p></div>';var marker=new google.maps.Marker({position:myLatLng,map:map,title:record.long_name,infoContent:text});google.maps.event.addListener(marker,'click',function(){new google.maps.InfoWindow({content:this.infoContent}).open(map,this);});self.parent.parent.markers[record.id]=marker;}};DisplayVisualisationClass.prototype.applyFormatters=function(dataTable){var self=this;var googleDataTable=new google.visualization.DataTable(dataTable,self.options.apiVersion);if(self.options.visualisationFormatters){for(var formatter in self.options.visualisationFormatters){switch(formatter)
{case"trendFormatter":var formatterFunction=eval('self.functions.'+self.options.visualisationFormatters[formatter]);for(var i=1;i<googleDataTable.getNumberOfColumns();i+=1){formatterFunction.format(googleDataTable,i);}
break;case"patternFormatter":var patternObj=self.options.visualisationFormatters[formatter];patternObj.formatter.format(googleDataTable,patternObj.sourceColumns,patternObj.destinationColumn);break;default:var formatterFunction=eval('self.functions.'+formatter);for(var i=0;i<self.options.visualisationFormatters[formatter].length;i+=1){formatterFunction.format(googleDataTable,self.options.visualisationFormatters[formatter][i]);}
break;}}}
return googleDataTable;}
DisplayVisualisationClass.prototype.drawVisualisation=function(selectedObjects,dataTable){var self=this;var googleDataTable=self.applyFormatters(dataTable);if(self.options.transposeWithId!=null)
{var numberOfRows=googleDataTable.getNumberOfRows();for(var i=0;i<numberOfRows;i+=1){self.drawVisualisationChart(googleDataTable,[i],self.containerId+'_'+i);}}else if(self.options.splitViewById!=null){for(var i=0;i<selectedObjects.length;i+=1){var filteredRows=googleDataTable.getFilteredRows([{column:self.options.splitViewById,value:selectedObjects[i]}]);self.drawVisualisationChart(googleDataTable,filteredRows,self.containerId+'_'+i);}}else{if(self.options.visualisation==='ColumnChart'){for(var i=googleDataTable.getNumberOfRows();i<4;i+=1){googleDataTable.addRow();}}
self.drawVisualisationChart(googleDataTable,null,null);}};DisplayVisualisationClass.prototype.drawVisualisationChart=function(googleDataTable,filteredRows,subContainerId){var self=this;var googleVisualisation;if(subContainerId!=null){jQuery("#"+self.containerId).append(jQuery('<div class="subcontainer" id="'+subContainerId+'"></div>'));googleVisualisation=eval('new google.visualization.'+self.options.visualisation+'(document.getElementById(subContainerId))');}else{googleVisualisation=eval('new google.visualization.'+self.options.visualisation+'(document.getElementById(self.containerId))');}
if(self.options.onSelect!=null){google.visualization.events.addListener(googleVisualisation,'select',self.options.onSelect);}
var googleDataView;var options=self.options.visualisationOptions;if(self.options.visualisation==='Table'){var googleDataTableClone=new google.visualization.DataTable(googleDataTable.toJSON(),self.options.apiVersion);googleDataView=new google.visualization.DataView(googleDataTableClone);if(self.options.splitTitleColumn!=null&&self.options.viewColumns!=null&&filteredRows!=null){googleDataTableClone.setColumnLabel(self.options.viewColumns[0],googleDataTableClone.getValue(filteredRows[0],self.options.splitTitleColumn));}}else{googleDataView=new google.visualization.DataView(googleDataTable);if(self.options.splitTitleColumn!=null&&filteredRows!=null){options=jQuery.extend(options,{title:googleDataTable.getValue(filteredRows[0],self.options.splitTitleColumn)});}}
if(self.options.viewColumns!=null){googleDataView.setColumns(self.options.viewColumns);}
if(filteredRows!=null){googleDataView.setRows(filteredRows);}
googleVisualisation.draw(googleDataView,options);};"use strict";function DisplayComponentClass(parent,name,options,functions)
{var self=this;var defaultOptions={displayVisualisationObjects:{},displayVisualisationObjectsData:[]};var defaultFunctions={onLoad:function(displayComponentObject){displayComponentObject.buildContainer();},displayVisualisationObjects:{}};self.parent=parent;self.name=name;self.options=jQuery.extend(true,{},defaultOptions,options);self.functions=jQuery.extend(true,{},defaultFunctions,functions);self.displayVisualisationObjects=[];jQuery.each(self.options.displayVisualisationObjectsData,function(i,item){var displayVisualisationObject=new DisplayVisualisationClass(self,name+'_displayvisualisationobjects_'+item.name,jQuery.extend(true,{},self.options.displayVisualisationObjects,item),self.functions.displayVisualisationObjects);self.displayVisualisationObjects.push(displayVisualisationObject);});self.selectedDisplayVisualisationObject=self.displayVisualisationObjects.length>0?self.displayVisualisationObjects[0]:null;self.containerId=name;self.containerRef=jQuery('#'+self.containerId);if(self.functions.onLoad){self.functions.onLoad(self)};};DisplayComponentClass.prototype.redraw=function()
{var self=this;self.parent.redraw();};DisplayComponentClass.prototype.buildContainer=function()
{var self=this;var ulContent='<ul><li id="'+self.containerId+'-title" class="graphTitle">'+self.options.title+' '+self.selectedDisplayVisualisationObject.options.title+'</li>';var divContent='';jQuery.each(self.displayVisualisationObjects,function(i,displayVisualisationObject){var tabClass='tab-'+i+'-'+self.displayVisualisationObjects.length;ulContent+='<li title="'+displayVisualisationObject.options.title+'">';if(self.displayVisualisationObjects.length>1){ulContent+='<a class="'+tabClass+'" href="#'+displayVisualisationObject.name+'"><span> </span></a>';}
ulContent+='</li>';divContent+='<div id="'+displayVisualisationObject.containerId+'"';if(displayVisualisationObject.options.visualisation==='Map'){divContent+=' style="width:575px; height:450px;"';}
divContent+='></div>';});ulContent+='</ul>';self.containerRef.append(ulContent+divContent).tabs();self.containerRef.bind('tabsselect',function(event,ui){self.selectedDisplayVisualisationObject=findByName(ui.panel.id,self.displayVisualisationObjects);self.redraw();});};"use strict";function DisplayClass(parent,name,options,functions)
{var self=this;var defaultOptions={searchResultPrefix:'searchresult-id-',searchResultId:'id',searchResultTitle:'SET-THIS-VALUE-IN-THE-CONTROLLER-OBJECT',searchResultTinyTitle:'SET-THIS-VALUE-IN-THE-CONTROLLER-OBJECT',searchResultClass:'SET-THIS-VALUE-IN-THE-CONTROLLER-OBJECT',arrowClass:'hidden',searchResultArrowSelector:jQuery('#results .arrow, #favourites .arrow'),searchResultsCompareSelector:jQuery("#results-body .compare"),searchResultsAddSelector:jQuery("#results-body .add"),favouriteResultPrefix:'favourites-id-',favouritesCompareSelector:jQuery("#favourites-body .compare"),favouritesDeleteSelector:jQuery("#favourites-body .delete"),resultsTitleSelector:jQuery('#results-title-2'),titleBoxesSelector:jQuery('div#bar-one-boxes'),resultsBodySelector:jQuery('#results-body'),favouritesBodySelector:jQuery('#favourites-body'),removeTitleSelector:jQuery('a.remove-title'),maxSelectedResults:4,maxFavourites:20,displayComponentObjects:{},displayComponentObjectsData:[],mapIcon:'/images/markers/yellow_MarkerA.png'};var defaultFunctions={initialiseSelectedList:function(displayObject){var self=displayObject;if(self.parent.searchObject!=null)self.initialiseSelectedListFromSearchObject();},onAddSelection:false,displayComponentObjects:{}};self.parent=parent;self.name=name;self.options=jQuery.extend(true,{},defaultOptions,options);self.functions=jQuery.extend(true,{},defaultFunctions,functions);self.markers={};self.map=null;self.displayComponentObjects=[];self.selectedList=new List({maxLength:self.options.maxSelectedResults});self.favouritesList=new List({maxLength:self.options.maxFavourites});if(self.functions.initialiseSelectedList)self.functions.initialiseSelectedList(self);self.initialiseFavouritesList();self.drawnDisplayVisualisationObjects=[];self.drawnObjects=[];jQuery.each(self.options.displayComponentObjectsData,function(i,item){var displayComponentObject=new DisplayComponentClass(self,name+'_displaycomponentobjects_'+item.name,jQuery.extend(true,{},self.options.displayComponentObjects,item),self.functions.displayComponentObjects);self.displayComponentObjects.push(displayComponentObject);});var displayObject=self;self.options.searchResultArrowSelector.live('mouseover',function(){$(this).addClass("arrow-over");}).live('mouseout',function(){$(this).removeClass("arrow-over");});self.options.searchResultsCompareSelector.live('mouseover',function(){$(this).addClass("results-compare-over");}).live('mouseout',function(){$(this).removeClass("results-compare-over");}).live('click',function(){var id=parseIdFromNameEnding(this.id);var title=jQuery(this).parent('div.results-item-2').find('div.name').text();var tinyTitle=jQuery(this).parent('div.results-item-2').find('div.result-tiny-title').text();if($(this).hasClass("results-compare-on"))
{$(this).removeClass("results-compare-on");displayObject.removeSelection(id);}else{displayObject.addSelection(id,title,tinyTitle,true);}});self.options.searchResultsAddSelector.live('mouseover',function(){$(this).addClass("add-over");}).live('mouseout',function(){$(this).removeClass("add-over");}).live('click',function(){var id=parseIdFromNameEnding(this.id);var title=jQuery(this).parent('div.results-item-2').find('div.name').text();var tinyTitle=jQuery(this).parent('div.results-item-2').find('div.result-tiny-title').text();if($(this).hasClass("add-on")){if(id){$(this).removeClass("add-on");displayObject.removeFavourite(id,title);}}else{if(id){$(this).addClass("add-on");displayObject.addFavourite(id,title,tinyTitle);}}});self.options.favouritesCompareSelector.live('mouseover',function(){$(this).addClass("favourites-compare-over");}).live('mouseout',function(){$(this).removeClass("favourites-compare-over");}).live('click',function(){var id=parseIdFromNameEnding(this.id);var title=jQuery(this).parent('div.favourites-item-2').find('div.name').text();var tinyTitle=jQuery(this).parent('div.favourites-item-2').find('div.result-tiny-title').text();if($(this).hasClass("favourites-compare-on"))
{$(this).removeClass("favourites-compare-on");displayObject.removeSelection(id);}else{displayObject.addSelection(id,title,tinyTitle,true);}});self.options.favouritesDeleteSelector.live('mouseover',function(){$(this).addClass("favourites-delete-over");}).live('mouseout',function(){$(this).removeClass("favourites-delete-over");}).live('click',function()
{if($(this).hasClass("add-on")){$(this).removeClass("add-on");}else{$(this).addClass("add-on");}
var id=parseIdFromNameEnding(this.id);var title=jQuery(this).parent('div.favourites-item-2').find('div.name').text();var tinyTitle=jQuery(this).parent('div.favourites-item-2').find('div.result-tiny-title').text();if(id){displayObject.removeFavourite(id,title);}});self.options.removeTitleSelector.live('mouseover',function(){$(this).addClass("remove-title-mouseover");}).live('mouseout',function(){$(this).removeClass("remove-title-mouseover");}).live('click',function(){var id=parseIdFromNameEnding(this.id);displayObject.removeSelection(id);});if(self.functions.onLoad){self.functions.onLoad(self);};};DisplayClass.prototype.findDisplayVisualisationById=function(id)
{var self=this;var visualisation=null;jQuery.each(self.displayComponentObjects,function(i,displayComponentObject){jQuery.each(displayComponentObject.displayVisualisationObjects,function(k,displayVisualisationObject){console.log('THIS IS A TEST');console.log(id,displayVisualisationObject.Id,id==displayVisualisationObject.containerId);console.log(displayVisualisationObject);});});};DisplayClass.prototype.initialiseSelectedListForChoices=function()
{var self=this;var array=self.parent.dataObject.dataCookieObject.loadSelectedListObject();if(array==null){array=[];}
for(var i=0;i<self.options.maxSelectedResults;i++){if(array[i]==null){self.selectedList.set(i,{});}else{self.selectedList.set(i,array[i]);}}
self.parent.dataObject.dataCookieObject.saveSelectedListObject(self.selectedList.array);};DisplayClass.prototype.initialiseSelectedListFromSearchObject=function()
{var self=this;var array=self.parent.dataObject.dataCookieObject.loadSelectedListObject();if(array==null){array=[];}
var onSuccess=function(sourceObject,ids,data)
{var self=sourceObject;jQuery.each(data,function(i,item){var id=item[self.options.searchResultId];var title=item[self.options.searchResultTitle];var tinyTitle=item[self.options.searchResultTinyTitle];self.addSelection(id,title,tinyTitle,false);});self.redraw();};if(array.length>0){self.parent.dataObject.dataServerObject.lookup(self,array,onSuccess);}};DisplayClass.prototype.initialiseFavouritesList=function()
{var self=this;if(self.parent.searchObject!=null)
self.initialiseFavouritesListFromSearchObject();};DisplayClass.prototype.initialiseFavouritesListFromSearchObject=function()
{var self=this;var array=self.parent.dataObject.dataCookieObject.loadFavouritesListObject();if(array==null){array=[];}
var onSuccess=function(sourceObject,ids,data)
{var self=sourceObject;jQuery.each(data,function(i,item){var id=item[self.options.searchResultId];var title=item[self.options.searchResultTitle];var tinyTitle=item[self.options.searchResultTinyTitle];self.addFavourite(id,title,tinyTitle);});};if(array.length>0){self.parent.dataObject.dataServerObject.lookup(self,array,onSuccess);}};DisplayClass.prototype.addSelection=function(id,title,tinyTitle,redrawRequired){var self=this;if(self.selectedList.add(id,{title:title,tinyTitle:tinyTitle}))
{self.parent.dataObject.dataCookieObject.saveSelectedListObject(self.selectedList.array);if(self.options.titleBoxesSelector.find('a#'+self.options.searchResultPrefix+id).length==0){self.options.resultsBodySelector.find('a#'+self.options.searchResultPrefix+'selector-'+id).addClass('results-compare-on');self.options.favouritesBodySelector.find('a#'+self.options.favouriteResultPrefix+'selector-'+id).addClass('favourites-compare-on');jQuery('#title-box-'+self.selectedList.length()).append(self.buildTitleBox(self.options.searchResultPrefix,id,title,tinyTitle));jQuery('.num'+self.selectedList.length()).addClass('num'+self.selectedList.length()+'-on');if(redrawRequired){self.redraw();}
if(self.functions.onAddSelection){self.functions.onAddSelection(self,id,title,tinyTitle);}}}else{self.options.favouritesBodySelector.find('a#'+self.options.favouriteResultPrefix+'selector-'+id).removeClass('favourites-compare-on');alert('Sorry, you cannot select more than '+self.selectedList.opts.maxLength+' items');}};DisplayClass.prototype.addFavourite=function(id,title,tinyTitle){var self=this;if(self.favouritesList.add(id,{title:title,tinyTitle:tinyTitle}))
{self.parent.dataObject.dataCookieObject.saveFavouritesListObject(self.favouritesList.array);if(self.options.favouritesBodySelector.find('div#'+self.options.favouriteResultPrefix+id).length==0){self.options.favouritesBodySelector.append(self.buildFavourite(self.options.favouriteResultPrefix,id,title,tinyTitle));self.options.resultsBodySelector.find('a#'+self.options.searchResultPrefix+'fav-selector-'+id).attr('title','Remove '+title+' from favourites');self.options.favouritesBodySelector.height(20+(self.favouritesList.length()*52));}}else{alert('Sorry, you cannot have more than '+self.favouritesList.opts.maxLength+' favourites')}};DisplayClass.prototype.removeSelection=function(id)
{var self=this;if(self.selectedList.remove(id))
{self.parent.dataObject.dataCookieObject.saveSelectedListObject(self.selectedList.array);self.options.resultsBodySelector.find('a#'+self.options.searchResultPrefix+'selector-'+id).removeClass('results-compare-on');self.options.favouritesBodySelector.find('a#'+self.options.favouriteResultPrefix+'selector-'+id).removeClass('favourites-compare-on');self.options.titleBoxesSelector.find("a").remove();jQuery.each(self.selectedList.array,function(i,item){i=i+1;var text_values=self.selectedList.text_values['key'+item];$('#title-box-'+i).append(self.buildTitleBox(self.options.searchResultPrefix,item,text_values.title,text_values.tinyTitle));});var remove_id=self.selectedList.length()+1;$('.num'+remove_id).removeClass('num'+remove_id+'-on');if(self.functions.onRemoveSelection){self.functions.onRemoveSelection(self,id);}
self.redraw();}};DisplayClass.prototype.removeFavourite=function(id,title)
{var self=this;if(self.favouritesList.remove(id))
{self.parent.dataObject.dataCookieObject.saveFavouritesListObject(self.favouritesList.array);self.options.favouritesBodySelector.find("div#"+self.options.favouriteResultPrefix+id).remove();self.options.resultsBodySelector.find("a#"+self.options.searchResultPrefix+"fav-selector-"+id).removeClass('add-on');self.options.resultsBodySelector.find("a#"+self.options.searchResultPrefix+"fav-selector-"+id).attr('title','Add '+title+' to favourites');self.options.favouritesBodySelector.height(20+(self.favouritesList.length()*52));}};DisplayClass.prototype.getSelectedDisplayVisualisationObjects=function(){var self=this;var result=[];jQuery.each(self.displayComponentObjects,function(i,displayComponentObject){result.push(displayComponentObject.selectedDisplayVisualisationObject);});return result;};DisplayClass.prototype.isRedrawRequired=function(displayVisualisationObject){var self=this;return(!displayVisualisationObject.options.fixedVisualisation&&((!compareArray(self.drawnObjects,self.selectedList.array))||(!isNameInArray(displayVisualisationObject.name,self.drawnDisplayVisualisationObjects))));};DisplayClass.prototype.redraw=function(displayVisualisations,data){var self=this;self.parent.redraw();};DisplayClass.prototype.displaySearchResults=function(data){var self=this;self.options.resultsBodySelector.empty();jQuery.each(data.data,function(i,item){self.options.resultsBodySelector.append(self.buildSearchResult(item));});var results_text;switch(data.count)
{case 0:results_text='no results found';break;case 1:results_text='showing 1 result';break;default:results_text='showing '+data.count+' results';break;}
self.options.resultsTitleSelector.text(results_text);};DisplayClass.prototype.buildTitleBox=function(id_prefix,id,title,tinyTitle){var self=this;if(tinyTitle==null){tinyTitle='FIX - buildTitleBox';}
return jQuery('<a class="remove-title" href="#n" id="'+id_prefix+id+'" title="click to remove '+title+'"><div class="close-icon"></div>'+tinyTitle+' '+'</a>');};DisplayClass.prototype.buildSearchResult=function(item)
{var self=this;var id_prefix=self.options.searchResultPrefix;var id=item[self.options.searchResultId];var title=item[self.options.searchResultTitle];var tinyTitle=item[self.options.searchResultTinyTitle];var isSelected=self.selectedList.contains(id);var isFavourite=self.favouritesList.contains(id);return jQuery('<div class="results-item '+self.options.searchResultClass+'" id="'+id_prefix+id+'">'+'<div class="results-item-2">'+'<a href="#n" type="image" alt="i" class="arrow '+self.options.arrowClass+'" id="info-button-'+id_prefix+id+'"/>'+'<div class="results-item-3">'+'<div class="name">'+title+'</div>'+'<div class="type">'+self.options.searchResultLabel+' '+id+'</div>'+'<div class="result-tiny-title">'+tinyTitle+'</div>'+'</div>'+'<a class="add '+(isFavourite?'add-on':'')+'" title="'+(isFavourite?'Remove '+title+' from favourites':'Add '+title+' to favourites')+'" href="#n"'+'name="'+id_prefix+'fav-selector-'+id+'" '+'id="'+id_prefix+'fav-selector-'+id+'" '+'/>'+'<a class="compare '+(isSelected?'results-compare-on':'')+'"title="'+(isSelected?'Stop Comparing ':'Compare ')+title+'" href="#n"'+'name="'+id_prefix+'selector-'+id+'" '+'id="'+id_prefix+'selector-'+id+'" '+'/>'+'<div class="clear"></div>'+'</div></div>');};DisplayClass.prototype.buildFavourite=function(id_prefix,id,title,tinyTitle)
{var self=this;var isSelected=self.selectedList.contains(id);var isFavourite=self.favouritesList.contains(id);return jQuery('<div class="favourites-item '+self.options.searchResultClass+'" id="'+id_prefix+id+'">'+'<div class="favourites-item-2">'+'<a href="#n" type="image" alt="i" class="arrow '+self.options.arrowClass+'" id="info-button-'+id_prefix+id+'"/>'+'<div class="favourites-item-3">'+'<div class="name">'+title+'</div>'+'<div class="type">'+self.options.searchResultLabel+' '+id+'</div>'+'<div class="result-tiny-title">'+tinyTitle+'</div>'+'</div>'+'<a class="delete" title="Remove '+title+' from favourites" href="#n"'+'name="'+id_prefix+'fav-selector-'+id+'" '+'id="'+id_prefix+'fav-selector-'+id+'" '+'type="checkbox" '+'/>'+'<a class="'+(isSelected?'compare favourites-compare-on':'compare')+'" title="'+(isSelected?'Stop Comparing ':'Compare ')+title+'" href="#n"'+'name="'+id_prefix+'selector-'+id+'" '+'id="'+id_prefix+'selector-'+id+'" '+'/>'+'<div class="clear"></div>'+'</div></div>');};DisplayClass.prototype.setDrawn=function(drawnObjects,drawnDisplayVisualisationObjects){var self=this;self.drawnObjects=cloneArray(drawnObjects);self.drawnDisplayVisualisationObjects=drawnDisplayVisualisationObjects;};"use strict";function SearchClass(parent,name,options,functions){var self=this;self.parent=parent;self.name=name;var defaultOptions={searchFormId:null,searchBodyId:null,searchBoxId:null,checkForPreselected:true};var defaultFunctions={loadQueryAndSearch:function(searchObject){var self=searchObject;var query=null;if(self.options.checkForPreselected&&preselected)
{query=preselected.title;}else{query=self.parent.dataObject.dataCookieObject.loadQueryValue();}
if(query!=null&&query!=''){jQuery('#'+self.options.searchBoxId).attr("value",query);jQuery('#'+self.options.searchFormId).submit();}},saveSearchCookie:function(formData,jqForm,options){var query=formData[0].value;self.parent.dataObject.dataCookieObject.saveQueryValue(query);},displaySearchResults:function(response,status)
{self.parent.displayObject.displaySearchResults(response);},initSearchTabSelection:null,onLoad:function(searchObject){var self=searchObject;if(self.options.searchBodyId){search_all_off();jQuery('#'+self.options.searchBodyId).show(0);}
if(self.functions.initSearchTabSelection){self.functions.initSearchTabSelection(self);}
if(self.options.searchFormId){jQuery('#'+self.options.searchFormId).ajaxForm({beforeSubmit:self.functions.saveSearchCookie,success:self.functions.displaySearchResults,dataType:'json'});}
if(self.options.searchBoxId){jQuery('#'+self.options.searchBoxId).searchbox();}
if(self.functions.loadQueryAndSearch){self.functions.loadQueryAndSearch(self);}}};self.options=jQuery.extend(true,{},defaultOptions,options);self.functions=jQuery.extend(true,{},defaultFunctions,functions);if(self.functions.onLoad){self.functions.onLoad(self);}}"use strict";function ChoiceClass(parent,name,options,functions){var self=this;self.parent=parent;self.name=name;var defaultOptions={choiceSectionId:null,choices:{selectCourses:{},selectUniversities:{}}};var defaultFunctions={onLoad:function(choiceObject){var self=choiceObject;var maxSelectedResults=self.parent.displayObject.options.maxSelectedResults;var currentSelections=self.parent.dataObject.dataCookieObject.loadSelectedListObject();for(var i=0;i<maxSelectedResults;i++)
{var style=(i%2===0)?"dark":"light";if(i+1==maxSelectedResults){style+=" last";}
style+=(i%2===0)?" dark-tall":" light-tall";if(i===0&&i+1<maxSelectedResults){style+=" first";}else{style+=" wide";}
var div=jQuery('<div class="'+style+'" id="title-box-'+(i+1)+'"></div>');var selectCourseId='choice_'+i+'_course';var selectUniversityId='choice_'+i+'_uni';var selectCourse=self.buildSelect(selectCourseId,[],'-course-',self.functions.onSelectCourse);var selectUniversity=self.buildSelect(selectUniversityId,[],'-university-',self.functions.onSelectUniversity);self.options.choices.selectCourses[selectUniversityId]=selectCourseId;self.options.choices.selectUniversities[selectCourseId]=selectUniversityId;div.append(selectCourse);div.append('<br/>');div.append(selectUniversity);jQuery("#"+self.options.choiceSectionId).append(div);}
var onLoadCourses=function(sourceObject,ids,data){var self=sourceObject;for(var k=0;k<maxSelectedResults;k++){jQuery.each(data,function(i,courseGroup){var optgroup=jQuery('<optgroup label="'+courseGroup.tiny_name+'" title="'+courseGroup.long_name+'"></optgroup>');optgroup.append('<option value="'+courseGroup.id+'" title="Aggregated: '+courseGroup.long_name+'" class="status-'+
courseGroup.ucde_data_status+'">*'+courseGroup.tiny_name.toUpperCase()+'*</option>');jQuery.each(courseGroup.courses,function(j,course){optgroup.append('<option value="'+course.id+'" title="'+
course.long_name+'" class="status-'+course.ucde_data_status+'">'+course.tiny_name+'</option>');});jQuery('#choice_'+k+'_course').append(optgroup);});if(currentSelections[k]!=null){jQuery('#choice_'+k+'_course').val(currentSelections[k].course);if(currentSelections[k].course!=null)
{jQuery('#choice_'+k+'_course').trigger('change');}}}};var onLoadUniversities=function(sourceObject,ids,data){var self=sourceObject;for(var k=0;k<maxSelectedResults;k++){jQuery.each(data,function(i,university){jQuery('#choice_'+k+'_uni').append('<option value="'+university.id+'" title="'+university.long_name+'" class="status-'+university.ucde_data_status+'">'+university.tiny_name+'</option>');});if(currentSelections[k]!=null){jQuery('#choice_'+k+'_uni').val(currentSelections[k].uni);if(currentSelections[k].uni!=null)
{jQuery('#choice_'+k+'_uni').trigger('change');}}}};self.parent.dataObject.dataServerObject.lookup(self,['courses'],onLoadCourses);self.parent.dataObject.dataServerObject.lookup(self,['universities'],onLoadUniversities);},onSelectUniversity:function(){var selectUniversityId=this.id;var selectGroupId=selectUniversityId.match(/choice_(\d+)_\w+/)[1];var uniValue=this.value;var courseValue=jQuery('#'+self.options.choices.selectCourses[selectUniversityId]).val();if(uniValue==''){uniValue=null;}
if(courseValue==''){courseValue=null;}
var id={};if(uniValue!=null){id.uni=uniValue;}
if(courseValue!=null){id.course=courseValue;}
self.parent.displayObject.selectedList.set(selectGroupId,id);self.parent.dataObject.dataCookieObject.saveSelectedListObject(self.parent.displayObject.selectedList.array);var onLookup=function(sourceObject,key,value,data){var self=sourceObject;jQuery.each(data,function(course,status){jQuery('#choice_'+selectGroupId+'_course option[value='+course+']').attr('class','status-'+status);});};self.parent.dataObject.lookupKeyValueFromServerOrCache(self,'university',uniValue,onLookup);self.redraw();},onSelectCourse:function(){var selectCourseId=this.id;var selectGroupId=selectCourseId.match(/choice_(\d+)_\w+/)[1];var courseValue=this.value;var uniValue=jQuery('#'+self.options.choices.selectUniversities[selectCourseId]).val();if(uniValue==''){uniValue=null;}
if(courseValue==''){courseValue=null;}
var id={};if(uniValue!=null){id.uni=uniValue;}
if(courseValue!=null){id.course=courseValue;}
self.parent.displayObject.selectedList.set(selectGroupId,id);self.parent.dataObject.dataCookieObject.saveSelectedListObject(self.parent.displayObject.selectedList.array);var onLookup=function(sourceObject,key,value,data){var self=sourceObject;jQuery.each(data,function(course,status){jQuery('#choice_'+selectGroupId+'_uni option[value='+course+']').attr('class','status-'+status);});};self.parent.dataObject.lookupKeyValueFromServerOrCache(self,'course',courseValue,onLookup);self.redraw();}};self.options=jQuery.extend(true,{},defaultOptions,options);self.functions=jQuery.extend(true,{},defaultFunctions,functions);if(self.functions.onLoad){self.functions.onLoad(self);}}
ChoiceClass.prototype.redraw=function(){var self=this;self.parent.redraw();};ChoiceClass.prototype.buildSelect=function(id,items,initialText,onChange){var select=jQuery('<select id="'+id+'" name="'+id+'" class="unicourse"><option value="">'+initialText+'</option></select>');jQuery.each(items,function(i,item){select.append(jQuery('<option value="'+item.id+'">'+item.name+'</option>'));});if(onChange!=null){select.bind('change',onChange);}
return select;};"use strict";function ControllerClass(name,options,functions)
{var self=this;var defaultOptions={dataObject:{},displayObject:{}};var defaultFunctions={onLoad:function(controllerObject){var self=controllerObject;self.drawFixedVisualisations();self.redraw();},dataObject:{},displayObject:{}};self.name=name;self.options=jQuery.extend(true,{},defaultOptions,options);self.functions=jQuery.extend(true,{},defaultFunctions,functions);self.dataObject=new DataClass(self,name+'_dataobject',self.options.dataObject,self.functions.dataObject);if(self.options.searchObject!=null)
self.searchObject=new SearchClass(self,name+'_searchobject',self.options.searchObject,self.functions.searchObject);self.displayObject=new DisplayClass(self,name+'_displayobject',self.options.displayObject,self.functions.displayObject);if(self.options.choiceObject!=null)
self.choiceObject=new ChoiceClass(self,name+'_choiceobject',self.options.choiceObject,self.functions.choiceObject);if(self.functions.onLoad){self.functions.onLoad(self);};};ControllerClass.prototype.drawFixedVisualisations=function()
{var self=this;var selectedDisplayVisualisationObjects=self.displayObject.getSelectedDisplayVisualisationObjects();var displayVisualisationObjectsToRedraw=[];var dataTablesToLoad=new List({maxLength:selectedDisplayVisualisationObjects.length});jQuery.each(selectedDisplayVisualisationObjects,function(i,displayVisualisationObject){if(displayVisualisationObject.options.fixedVisualisation){displayVisualisationObjectsToRedraw.push(displayVisualisationObject);dataTablesToLoad.add(displayVisualisationObject.options.dataTable);}});var completeRedraw=function(controllerObject,selectedList_array,displayVisualisationObjects,data)
{var self=controllerObject;jQuery.each(displayVisualisationObjects,function(i,displayVisualisationObject){var visualisationData=data[displayVisualisationObject.options.dataTable];if(visualisationData!=null)
{displayVisualisationObject.redraw(null,visualisationData);}
else
{}});};if(dataTablesToLoad.length()>0){self.dataObject.dataServerObject.load(self,null,dataTablesToLoad.array,displayVisualisationObjectsToRedraw,completeRedraw);}};ControllerClass.prototype.redraw=function()
{var self=this;var selectedDisplayVisualisationObjects=self.displayObject.getSelectedDisplayVisualisationObjects();if(!selectedDisplayVisualisationObjects||selectedDisplayVisualisationObjects.length===0)
{console.log('Warning: cannot load data as there are no selectedVisualisations');return;}
if(self.displayObject.selectedList.length()==0)
{jQuery('#container-noselection').show("fast");jQuery('#container-selection').hide("fast");}else{jQuery('#container-noselection').hide("fast");jQuery('#container-selection').show("fast");}
var displayVisualisationObjectsToRedraw=[];var dataTablesToLoad=new List({maxLength:selectedDisplayVisualisationObjects.length});jQuery.each(selectedDisplayVisualisationObjects,function(i,displayVisualisationObject){if(self.displayObject.isRedrawRequired(displayVisualisationObject)){var cacheKey=self.dataObject.dataCacheObject.getCacheKey(displayVisualisationObject.options.dataTable,self.displayObject.selectedList.array);var cacheValue=self.dataObject.dataCacheObject.load(cacheKey);if(cacheValue!=null)
{displayVisualisationObject.redraw(self.displayObject.selectedList.array,cacheValue);}else{displayVisualisationObjectsToRedraw.push(displayVisualisationObject);dataTablesToLoad.add(displayVisualisationObject.options.dataTable);}}else{}});var setDrawn=function(controllerObject)
{var self=controllerObject;self.displayObject.setDrawn(self.displayObject.selectedList.array,self.displayObject.getSelectedDisplayVisualisationObjects())};var completeRedraw=function(controllerObject,selectedList_array,displayVisualisationObjects,data)
{var self=controllerObject;jQuery.each(displayVisualisationObjects,function(i,displayVisualisationObject){var cacheKey=self.dataObject.dataCacheObject.getCacheKey(displayVisualisationObject.options.dataTable,selectedList_array);var visualisationData=data[displayVisualisationObject.options.dataTable];if(visualisationData!=null)
{self.dataObject.dataCacheObject.save(cacheKey,visualisationData);displayVisualisationObject.redraw(selectedList_array,visualisationData);}
else
{}});setDrawn(self);};if(self.displayObject.selectedList.length()>0&&dataTablesToLoad.length()>0){self.dataObject.dataServerObject.load(self,self.displayObject.selectedList.array,dataTablesToLoad.array,displayVisualisationObjectsToRedraw,completeRedraw);}else{setDrawn(self);}};