
var tctHelperFunctions={trimToMaxCharWords:function(wordstring,maxcharacters){var wordarray=wordstring.split(" ");var numwords=wordarray.length;var newstring="";var laststring="";for(var counter=0;counter<numwords;counter++){laststring=newstring
if(counter!=0){newstring+=(" "+wordarray[counter]);}
else{newstring+=wordarray[counter];}
if(newstring.length>maxcharacters){return(laststring+"...");}}
return newstring;},convertSymphonyDateToNiceDate:function(dataObj){var format=dataObj.format;var dateString=dataObj.dateString;switch(format){case"slash":var splitString=dateString.split("-");return(splitString[2]+"/"+splitString[1]+"/"+splitString[0]);break;}
return dateString;},cloneArray:function(dataObj){var anArray=dataObj.anArray;var returnArray=new Array();$.each(anArray,function(){returnArray.push(this);});return returnArray;},removeItemFromArray:function(dataObj){var anArray=dataObj.anArray;var removeItem=dataObj.anItem;var returnArray=new Array();$.each(anArray,function(){if(this!=removeItem){returnArray.push(this);}});return returnArray;}}
var TCTEventMapsCustomPanel=function(dataObj){this.map=dataObj.map;this.point=dataObj.point;this.type=dataObj.type;this.insertHTML=dataObj.insertHTML;this.content=$('<div class="evf-map-anchor"></div>').get()[0];this.panelOffset=dataObj.panelOffset;}
TCTEventMapsCustomPanel.prototype=new GOverlay();TCTEventMapsCustomPanel.prototype.initialize=function(){$(this.content).append(this.insertHTML);this.map.getPane(G_MAP_FLOAT_PANE).appendChild(this.content);};TCTEventMapsCustomPanel.prototype.remove=function(){this.content.parentNode.removeChild(this.content);}
TCTEventMapsCustomPanel.prototype.redraw=function(){var point=this.map.fromLatLngToDivPixel(this.point);this.content.style.left=point.x+this.panelOffset.left+'px';this.content.style.bottom=-point.y+this.panelOffset.bottom+'px';};var TCTEventMapsControls=function(dataObj){this.controller=dataObj.controller;this.domRootEl=dataObj.domRootEl;this.stateChangedFunc=dataObj.stateChangedFunc;this.controlStates=new Array();this.controlStatesKey=new Array();return this;}
TCTEventMapsControls.prototype={init:function(){var self=this;$(self.domRootEl).find("input").each(function(){var state=$(this).attr("checked");var aControlObj={domEl:this,state:(state)?"on":"off",name:$(this).attr("name")}
$(this).click(function(){aControlObj.state=(aControlObj.state=="on")?"off":"on";self.stateChanged({state:aControlObj});});self.controlStates.push(aControlObj);self.controlStatesKey[aControlObj.name]=aControlObj;});return self;},stateChanged:function(dataObj){var self=this;self.controller.liveSearchController.clearSearch();self.stateChangedFunc({state:dataObj.state});},getStateForType:function(dataObj){var self=this;return self.controlStatesKey[dataObj.type].state;}}
var TCTEventsLiveSearchController=function(dataObj){this.domRootEl=dataObj.domRootEl;this.domSelect=$(dataObj.domRootEl).find(".evf-search-by").get()[0];this.domInput=$(dataObj.domRootEl).find("input").get()[0];this.domButton=$(dataObj.domRootEl).find("button").get()[0];this.domClearButton=$(dataObj.domRootEl).find(".evf-search-clear").get()[0];this.selectedScope="all";this.onChangeFunc=dataObj.onChangeFunc;this.lastSearch="";this.lastScope="all";return this;}
TCTEventsLiveSearchController.prototype={init:function(){var self=this;$(self.domButton).click(function(){self.submitTookPlace();return false;});$(self.domRootEl).submit(function(){self.submitTookPlace();return false;});$(self.domClearButton).click(function(){self.clearSearch();return false;});return self;},submitTookPlace:function(){var self=this;var searchTerm=$(self.domInput).val().toLowerCase();var searchScope=$(self.domSelect).val();if((self.lastSearch!=searchTerm)||(self.lastScope!=searchScope)){self.lastSearch=searchTerm;self.lastScope=searchScope;self.onChangeFunc({searchTerm:searchTerm,searchScope:searchScope});}},clearSearch:function(){var self=this;$(self.domInput).val("");self.submitTookPlace();}}
TCTPointFinderController=function(){this.objLocalSearch=new GlocalSearch();return this;}
TCTPointFinderController.prototype={init:function(){var self=this;return self;},getPointFromPostcode:function(dataObj){var self=this;var postcode=dataObj.postcode;var postcodeFoundCallback=dataObj.postcodeFoundCallback;self.objLocalSearch.setSearchCompleteCallback(null,function(){if(self.objLocalSearch.results[0]){var resultLat=self.objLocalSearch.results[0].lat;var resultLng=self.objLocalSearch.results[0].lng;var point=new GLatLng(resultLat,resultLng);postcodeFoundCallback({success:true,point:point});}
else{postcodeFoundCallback({success:false,point:null});}});self.objLocalSearch.execute(postcode);}}
var TCTEventFinderController=function(dataObj){this.domRootEl=dataObj.domRootEl;this.domUpcomingEventsBlock=$(dataObj.domRootEl).find(".evf-event-info").get()[0];this.domUpcomingEventsList={slot1:$(this.domUpcomingEventsBlock).find(".evf-upcoming-events-list .eventslist-one").get()[0],slot2:$(this.domUpcomingEventsBlock).find(".evf-upcoming-events-list .eventslist-two").get()[0],slot3:$(this.domUpcomingEventsBlock).find(".evf-upcoming-events-list .eventslist-three").get()[0]}
this.domMap=$(this.domRootEl).find("#evf-map").get()[0];this.objMap="";this.jsonEvents=dataObj.jsonEvents;this.events=new Array();this.upcomingEvents=new Array();this.numEvents=this.jsonEvents.length;this.liveSearchController="";this.objMapControls="";this.baseIcon=new GIcon();this.lastMapPanelOwner="";this.startLocation="";this.numEventsInitialised=0;this.markerGroups=new Array();this.clusterPixelDistance=20;this.clusterPixelDistanceSquared=this.clusterPixelDistance*this.clusterPixelDistance;this.maxZoomLevel=12;return this;}
TCTEventFinderController.prototype={init:function(){var self=this;if(geoData){self.startLocation={lat:geoData.lat,lon:geoData.lon,zoom:9}}
else{self.startLocation={lat:52.429222,lon:-1.318359,zoom:6}}
self.createCustomIcons();self.initialiseMap({aDomMap:self.domMap,centrePoint:new GLatLng(self.startLocation.lat,self.startLocation.lon),zoomLevel:self.startLocation.zoom});self.objMapControls=new TCTEventMapsControls({controller:self,domRootEl:$(self.domRootEl).find(".evf-map-controls-holder").get()[0],stateChangedFunc:function(dataObj){self.filterEventsByType({state:dataObj.state});}}).init();for(var counter=0;counter<self.numEvents;counter++){self.events.push(new TCTMapEvent({jsonData:self.jsonEvents[counter],controller:self,objMap:self.objMap,pointFoundCallback:function(){if(++self.numEventsInitialised==self.numEvents){self.allEventsInitialised();}}}).init());}
self.initialiseEventsLists();self.initialiseUpcomingEventsBlock();this.liveSearchController=new TCTEventsLiveSearchController({domRootEl:$(this.domRootEl).find(".evf-live-search").get()[0],onChangeFunc:function(dataObj){self.filterEventsBySearch({searchTerm:dataObj.searchTerm,searchScope:dataObj.searchScope});}}).init();return self;},createCustomIcons:function(){var self=this;self.baseIcon.shadow="/assets/ui/map-events/icon.shadow.png";self.baseIcon.iconSize=new GSize(27,28);self.baseIcon.shadowSize=new GSize(27,28);self.baseIcon.iconAnchor=new GPoint(12,15);self.baseIcon.infoWindowAnchor=new GPoint(12,15);},createMarker:function(dataObj){var self=this;var type=dataObj.type;var point=dataObj.point;switch(type){case"official":var iconImage="/assets/ui/map-events/icon.orange.png";break;case"event":var iconImage="/assets/ui/map-events/icon.green.png";break;case"fundraiser":var iconImage="/assets/ui/map-events/icon.blue.png";break;case"challenge":var iconImage="/assets/ui/map-events/icon.red.png";break;default:var iconImage="/assets/ui/map-events/icon.orange.png";break;}
var thisIcon=new GIcon(self.baseIcon);thisIcon.image=iconImage;return new GMarker(point,{icon:thisIcon});},initialiseMap:function(dataObj){var self=this;var aDomMap=dataObj.aDomMap;var centrePoint=dataObj.centrePoint;self.zoomLevel=(dataObj.zoomLevel)?dataObj.zoomLevel:12;self.objMap=new GMap2(aDomMap);self.objMap.addControl(new GLargeMapControl3D(),new GControlPosition(G_ANCHOR_TOP_RIGHT,new GSize(10,10)));if(centrePoint){self.objMap.setCenter(centrePoint,self.zoomLevel);}
GEvent.addListener(self.objMap,"zoomend",function(previousZoom,currentZoom){if(currentZoom>self.maxZoomLevel){self.objMap.setZoom(self.maxZoomLevel);}else{self.groupMarkersForZoomLevel({zoomLevel:currentZoom});}});$(self.domRootEl).click(function(){if(self.lastMapPanelOwner){self.lastMapPanelOwner.removePanel();}});},groupMarkersForZoomLevel:function(dataObj){var self=this;self.zoomLevel=dataObj.zoomLevel;$.each(self.events,function(){this.forceHide();});$.each(self.markerGroups,function(){this.remove();});self.markerGroups=new Array();var items=tctHelperFunctions.cloneArray({anArray:self.events});while(items.length){var numItems=items.length;var groupArray=new Array();var startItem=items[0];for(var counter=1;counter<numItems;counter++){var distance=self.calculateDistanceBetweenMarkers({marker1:startItem,marker2:items[counter],zoomLevel:self.zoomLevel});if(distance<self.clusterPixelDistanceSquared){groupArray.push(items[counter]);}}
if(groupArray.length>0){groupArray.push(startItem);self.markerGroups.push(new TCTMarkerGroup({items:groupArray,controller:self,objMap:self.objMap}).init());}
else{startItem.reveal();}
items=tctHelperFunctions.removeItemFromArray({anItem:startItem,anArray:items});$.each(groupArray,function(){items=tctHelperFunctions.removeItemFromArray({anItem:this,anArray:items});});}},calculateDistanceBetweenMarkers:function(dataObj){var self=this;var marker1=dataObj.marker1;var marker2=dataObj.marker2;var zoomLevel=dataObj.zoomLevel;var p1=self.objMap.fromLatLngToContainerPixel(marker1.point);var p2=self.objMap.fromLatLngToContainerPixel(marker2.point);return(p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);},initialiseEventsLists:function(){var self=this;self.events.sort(function(a,b){return(parseInt(a.jsonData.closingDate.replace(/-/g,""))-parseInt(b.jsonData.closingDate.replace(/-/g,"")));});$.each(self.events,function(i){if(this.type!="official"||this.type=="event"||this.type=="trek-and-challenge"){self.upcomingEvents.push(this);}});},initialiseUpcomingEventsBlock:function(){var self=this;for(var counter=0;counter<3;counter++){var thisListEl=self.domUpcomingEventsList["slot"+(counter+1)];if(counter<self.upcomingEvents.length){var closingDate=tctHelperFunctions.convertSymphonyDateToNiceDate({format:"slash",dateString:self.upcomingEvents[counter].jsonData.closingDate});var dateTime=tctHelperFunctions.convertSymphonyDateToNiceDate({format:"slash",dateString:self.upcomingEvents[counter].jsonData.closingDate});var title=self.upcomingEvents[counter].jsonData.title;var dateField=(closingDate!=dateTime)?dateTime+" to "+closingDate:dateTime;var linkText="> More";var insertHTML="<p>"+dateField+"</p>";insertHTML+="<p>"+title+"</p>"
insertHTML+='<p><a href="'+self.upcomingEvents[counter].urlLink+'">'+linkText+'</a></p>';$(thisListEl).empty().append(insertHTML);$(thisListEl).removeClass("evf-hide-content");}}},allEventsInitialised:function(){var self=this;var all_events=self.events;$.each(self.events,function(i){if(!this.point){all_events.splice(i,1);}else{this.initialAddMarkerToMap();}});self.events=all_events;if(self.getNumberOfMarkersVisibleOnMap()==0){self.showAllMarkersOnMap();}
self.groupMarkersForZoomLevel({zoomLevel:self.zoomLevel});},filterEventsBySearch:function(dataObj){var self=this;var searchTerm=dataObj.searchTerm;var searchScope=dataObj.searchScope;$.each(self.events,function(){switch(searchScope){case"all":var searchTermFound=(this.allSearchableData.indexOf(searchTerm)!=-1);break;default:var searchTermFound=(this.jsonData[searchScope].toLowerCase().indexOf(searchTerm)!=-1);break;}
if((searchTermFound||!searchTerm)&&self.objMapControls.getStateForType({type:this.type})=="on"){this.isSearchVisible=true;this.reveal();}
else{this.isSearchVisible=false;this.hide();}});if(self.getNumberOfMarkersVisibleOnMap()==0){self.showAllMarkersOnMap();}
self.updateGroups();},filterEventsByType:function(dataObj){var self=this;var state=dataObj.state;$.each(self.events,function(){if(this.type==state.name){if(state.state=="on"){this.reveal();}
else{this.hide();}}});self.updateGroups();},getNumberOfVisibleMarkers:function(){var self=this;var numVisiblePoints=0;$.each(self.events,function(){if(this.isVisible){numVisiblePoints++;}});return numVisiblePoints;},getNumberOfMarkersVisibleOnMap:function(){var self=this;var bounds=self.objMap.getBounds();var southWest=bounds.getSouthWest();var northEast=bounds.getNorthEast();var numPointsInBounds=0;$.each(self.events,function(){if(this.isVisible&&this.point.lat()>southWest.lat()&&this.point.lat()<northEast.lat()&&this.point.lng()>southWest.lng()&&this.point.lng()<northEast.lng()){numPointsInBounds++;}});return numPointsInBounds;},showAllMarkersOnMap:function(){var self=this;if(self.getNumberOfVisibleMarkers()>0){var bounds=new GLatLngBounds();$.each(self.events,function(){if(this.isVisible){bounds.extend(this.point);}});var zoomLevel=self.objMap.getBoundsZoomLevel(bounds);if(zoomLevel>self.maxZoomLevel)zoomLevel=self.maxZoomLevel;self.objMap.setZoom(zoomLevel);self.objMap.setCenter(bounds.getCenter());}},updateGroups:function(){var self=this;$.each(self.markerGroups,function(){this.update();});}}
var TCTMarkerGroup=function(dataObj){this.items=dataObj.items,this.numItems=0;this.controller=dataObj.controller,this.objMap=dataObj.objMap;this.centrePoint="";this.bounds="";this.objPanel="";this.panelShowing=true;this.domPanel="";}
TCTMarkerGroup.prototype={init:function(){var self=this;self.randomNum=Math.random();self.bounds=new GLatLngBounds();$.each(self.items,function(){self.bounds.extend(this.point);this.isGrouped=true;if(this.isVisible&&this.isSearchVisible){self.numItems++;}});self.centrePoint=self.bounds.getCenter();self.initialiseGroupPanel();if(self.numItems<2){self.removeGroupPanelAndRevealVisibleMarkers();}
return self;},removeGroupPanelAndRevealVisibleMarkers:function(){var self=this;if(self.panelShowing){self.objMap.removeOverlay(self.objPanel);}
self.panelShowing=false;$.each(self.items,function(){if(this.isVisible&&this.isSearchVisible){this.isGrouped=false;this.forceReveal();}});},addGroupPanelAndHideVisibleMarkers:function(){var self=this;if(!self.panelShowing){self.objMap.addOverlay(self.objPanel);self.panelShowing=true;$.each(self.items,function(){this.isGrouped=true;this.forceHide();});}},update:function(){var self=this;self.numItems=0;$.each(self.items,function(){if(this.isVisible&&this.isSearchVisible){self.numItems++;}});$(self.domPanel).html(self.numItems.toString());if(self.numItems<2){self.removeGroupPanelAndRevealVisibleMarkers();}
else{self.addGroupPanelAndHideVisibleMarkers();}},zoomAndDisplayItems:function(){var self=this;var zoomLevel=self.objMap.getBoundsZoomLevel(self.bounds);if(zoomLevel>self.maxZoomLevel)zoomLevel=self.maxZoomLevel;self.objMap.setZoom(zoomLevel);self.objMap.setCenter(self.bounds.getCenter());},initialiseGroupPanel:function(){var self=this;self.objPanel=self.createGroupPanel();self.objMap.addOverlay(self.objPanel);},remove:function(){var self=this;self.objMap.removeOverlay(self.objPanel);$.each(self.items,function(){this.isGrouped=false;})
self="";},createGroupPanel:function(){var self=this;self.domPanel=self.getPopupContentHTML();$(self.domPanel).click(function(){self.zoomAndDisplayItems();return false;});var aPanel=new TCTEventMapsCustomPanel({map:self.objMap,point:self.centrePoint,insertHTML:self.domPanel,panelOffset:{left:-15,bottom:-16}});return aPanel;},getPopupContentHTML:function(){var self=this;var insertHTML='<div class="evf-group-panel">'+self.numItems+'</div>';return $(insertHTML).get()[0];}}
var TCTMapEvent=function(dataObj){this.jsonData=dataObj.jsonData,this.allSearchableData=(this.jsonData.title+" "+this.jsonData.description+" "+this.jsonData.address+" "+this.jsonData.location+this.jsonData.postcode+" "+this.jsonData.organiser).toLowerCase();this.point="";this.controller=dataObj.controller;this.objMap=dataObj.objMap;this.objMarker="";this.popupContentHTML="";this.objPointFinder=new TCTPointFinderController().init();this.type="";this.urlLink="./"+this.jsonData.type+"/"+this.jsonData.handle+"/";this.mapPanel="";this.isVisible=true;this.pointFoundCallback=dataObj.pointFoundCallback;this.isGrouped=false;this.isSearchVisible=true;return this;}
TCTMapEvent.prototype={init:function(){var self=this;switch(self.jsonData.type){case"events":self.type="event";break;case"fundraisers":self.type="fundraiser";break;case"treks-and-challenges":self.type="challenge";break;}
if(self.jsonData.officialEvent){self.type="official";}
var postcode=EventWrapper.unwrap(self.jsonData.urlhandle)+'';postcode=postcode.substring(postcode.indexOf('/')+1,postcode.length);if(postcode==''){postcode=self.jsonData.location+', UK';}else{postcode+=', UK';}
self.popupContentHTML=self.getPopupContentHTML();self.objPointFinder.getPointFromPostcode({postcode:postcode,callingObj:self,postcodeFoundCallback:function(dataObj){var success=dataObj.success;if(success==true){self.point=dataObj.point;self.initialiseMarker();}
if(self.pointFoundCallback){self.pointFoundCallback();}}});return self;},initialiseMarker:function(){var self=this;self.objMarker=self.controller.createMarker({type:self.type,point:self.point});GEvent.addListener(self.objMarker,"click",function(){self.displayPanel();self.objMap.panTo(self.point);return false;});},initialAddMarkerToMap:function(){var self=this;self.addMarkerToMap();if(self.controller.objMapControls.getStateForType({type:self.type})!="on"){self.isVisible=false;}
self.forceHide();},displayPanel:function(){var self=this;var aPanel=new TCTEventMapsCustomPanel({map:self.objMap,point:self.point,insertHTML:self.getPopupContentHTML(),panelOffset:{left:-30,bottom:10}});self.objMap.addOverlay(aPanel);if(self.controller.lastMapPanelOwner){self.controller.lastMapPanelOwner.removePanel();}
self.controller.lastMapPanelOwner=self;self.mapPanel=aPanel;},removePanel:function(){var self=this;self.objMap.removeOverlay(self.mapPanel);self.controller.lastMapPanelOwner="";},addMarkerToMap:function(){var self=this;self.objMap.addOverlay(self.objMarker);},getPopupContentHTML:function(){var self=this;var insertHTML='<div class="evf-popup-panel evf-popup-panel-'+self.type+'">';insertHTML+='<div class="evf-popup-panel-inner">';insertHTML+="<h5>"+self.jsonData.dateTime+"</h5>";insertHTML+="<h3>"+self.jsonData.title+"</h3>";insertHTML+="<p>"+tctHelperFunctions.trimToMaxCharWords(self.jsonData.description,100)+"</p>";insertHTML+='<a href="'+self.urlLink+'" class="more-info">Find out more</a>';insertHTML+='<div class="evf-popup-panel-arrow"></div>';insertHTML+="</div>";insertHTML+="</div>";var domPanel=$(insertHTML).get()[0];return domPanel;},hide:function(){var self=this;self.objMarker.hide();self.isVisible=false;if(self.controller.lastMapPanelOwner==self){self.removePanel();}},reveal:function(){var self=this;if(self.controller.objMapControls.getStateForType({type:this.type})=="on"){self.isVisible=true;if(!self.isGrouped&&self.isSearchVisible){self.objMarker.show();}}},forceHide:function(){var self=this;self.objMarker.hide();},forceReveal:function(){var self=this;self.objMarker.show();}}
var aTCTEventFinderController;$(document).ready(function(){$('div#google-maps-event-finder').each(function(){aTCTEventFinderController=new TCTEventFinderController({domRootEl:this,jsonEvents:tctEventsJSON}).init();});});
