$(document).ready(function() { var TeamBot = function(target) { var self = this; self.init = function() { var afterKnockout = function() { self.activeTeam = ko.observable(null); self.loadTeams(); // init team page router $(window).on('hashchange', self.routeChange); self.routeChange(); // setup observables self.teams = ko.observableArray([]); // returns a computed that returns a list of teams filtered by the gender provided self.teamsByGender = function(genderName) { return self.teamsFiltered(function(t) { return (t!=null && t.gender() == genderName) ? t : false; }); }; // returns a computed with the provided filterCallback applied self.teamsFiltered = function(filterCallback) { return ko.pureComputed(function() { var teams = self.teams(); var filtered = []; for(var i=0; i < teams.length; i++) { var team = filterCallback(teams[i]); if(team) { filtered.push(team); } } return filtered; }, self); }; ko.applyBindings(self); }; // make sure knockout is loaded if(typeof ko == 'undefined') { jQuery.ajax({ url: 'https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js', dataType: 'script', success: afterKnockout, async: true }); } else { afterKnockout(); } }; self.routeChange = function() { try { var params = [] if (location.hash.indexOf('#') !== -1) { // split fragment (e.g. #/foo/bar/id ) into params that can be passed into handler var fragment = location.hash.split('#')[1]; // trim leading / if applicable if(fragment.indexOf('/')==0) fragment = fragment.substr(1); params = fragment.split('/') } if (params.length > 0) { self.runRoute.apply(self, params); } else { self.runRoute.apply(self, [null]); } } catch (exc) { // map exception to a 404 route // runRoute('404') } }; self.runRoute = function(teamId) { if(teamId==null || teamId=='') { self.activeTeam(null); } else { $.ajax({ method: 'GET', url: 'https://goteambot.com/site/team/' + teamId + '/9bf9ef61-148a-44a8-82f9-f2b3bc6bd582', dataType: 'json', success: function(data, textStatus, jqXHR) { self.activeTeam(new TeamBot.Team(data)); }, error: function(jqXHR, textStatus, errorThrown) { alert("Error loading team page."); } }); } }; self.loadTeams = function() { $.ajax({ method: 'GET', url: 'https://goteambot.com/site/teams/179d738b-c805-4d3e-ac35-4f064355140a/9bf9ef61-148a-44a8-82f9-f2b3bc6bd582', dataType: 'json', success: function(data, textStatus, jqXHR) { self.teams([]); for(var i=0; i < data.teams.length; i++) { self.teams.push(new TeamBot.Team(data.teams[i])); } }, error: function(jqXHR, textStatus, errorThrown) { alert("Error loading teams."); } }); }; // initialize self self.init(); }; /** * */ TeamBot.Team = function(teamData) { var self = this; self.id = ko.observable(teamData.id); self.name = ko.observable(teamData.name); self.sport = ko.observable(teamData.sport); self.gender = ko.observable(teamData.gender); self.enabled = ko.observable(teamData.enabled); self.showRegistrationEvents = ko.observable(teamData.showRegistrationEvents); self.hasRegistrationEvents = ko.observable(teamData.hasRegistrationEvents); self.showBanner = ko.observable(teamData.showBanner); self.showPlayers = ko.observable(teamData.showPlayers); self.showCalendar = ko.observable(teamData.showCalendar); self.registerUrl = ko.observable(teamData.registerUrl); self.content = ko.observable(teamData.content); self.banner = ko.observable(teamData.banner); self.events = ko.observableArray(teamData.events); self.players = ko.observableArray(teamData.players); self.upcomingGames = ko.observableArray(teamData.upcomingGames); self.urlFragment = ko.pureComputed(function() { return '#/' + self.id() + '/'; }); self.teamICalUrl = ko.pureComputed(function() { return 'webcal://goteambot.com/team/ical/' + self.id() + '.ics'; }); }; window.teambot = new TeamBot("gameplan"); });