(function() { let lastGBP = 0.0, lastUSD = 0.0, _fasttimer, _slowTimer, myBTC = 3.49524333; let lows = { gbp: 0, usd: 0 }, highs = { gbp: 0, usd: 0 }; let list = [{ title: '101B ends', y: 2013, m: 9, d: 24, add: 1001 }, { title: 'Ends', y: 2016, m: 4, d: 4 }]; MicroEvent.mixin(this); let self = this; let addDays = function(myDate, days) { return new Date(myDate.getTime() + days * 24 * 60 * 60 * 1000); }; let getDays = function(startdate, enddate) { let r, s, e; s = startdate.getTime(); e = enddate.getTime(); r = (e - s) / (24 * 60 * 60 * 1000); return r; }; let tick = function() { let today = new Date(); let start101 = new Date(); let end101; let endContract = new Date(); let third = new Date(); start101.setFullYear(2013, 9, 24); end101 = addDays(start101, 1001); endContract.setFullYear(2017, 6, 5); third.setFullYear(2013, 7, 25); /*$('#one').text('101B ends: ' + Math.ceil(getDays(today, end101)) + ' days / ' + Math.ceil(getDays(today, end101) / 7) + ' weeks');*/ $('#one').hide(); $('#two').text('Ends: ' + Math.ceil(getDays(today, endContract)) + ' days / ' + Math.ceil(getDays(today, endContract) / 7) + ' weeks'); $('#three').hide(); }; let get_weather = function() { navigator.geolocation.getCurrentPosition(show_weather); }; this.bind('displayWeather', function(data) { $('#weather').html(data.currently.summary + ' ' + data.currently.temperature + '°c ' + data.daily.summary + ''); }); var show_weather = function(position) { let latitude = position.coords.latitude; let longitude = position.coords.longitude; // let's show a map or do something interesting! $.ajax({ type: 'GET', url: 'https://api.forecast.io/forecast/9ad2a41d420f3cf4960571bb886f710c/' + latitude.toString() + ',' + longitude.toString() + '?units=uk2', data: '', dataType: 'jsonp', timeout: 10000, context: $('body'), contentType: ('application/json'), headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'PUT, GET, POST, DELETE, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type' }, success: function(data) { self.trigger('displayWeather', data); }, error: function(xhr, type) { console.log('ajax error'); console.log(xhr); console.log(type); } }); }; let updateBTC = function(g, u) { let title, total, elm = $('#btc'); if (lastGBP !== 0) { elm.removeClass(); if (g > lastGBP) { elm.addClass('up'); } else if (g < lastGBP) { elm.addClass('down'); } } else { lows.gbp = g; lows.usd = u; highs.gbp = g; highs.usd = u; } lastGBP = g; lastUSD = u; if (g < lows.gbp) lows.gbp = g; if (u < lows.usd) lows.usd = u; if (highs.gbp < g) highs.gbp = g; if (highs.usd < u) highs.usd = u; total = myBTC * g; title = 'High: $' + parseFloat(highs.usd.toFixed(2)) + ' / Low $' + parseFloat(lows.usd.toFixed(2)); elm.html('$' + parseFloat(u.toFixed(2)) + ' / £' + parseFloat(g.toFixed(2)) + ' (£' + parseFloat(total.toFixed(2)) + ')'); elm.prop('title', title); }; let updateFX = function(data) { let elm = $('#fx'); elm.html('£1 = $' + parseFloat(data.gpbe.toFixed(2)) + ' = ' + parseFloat(data.sekex.toFixed(2)) + ' SEK'); }; this.bind('updateFX', function(data) { $('#fx').html('£1 = $' + parseFloat(data.gpbe.toFixed(2)) + ' = ' + parseFloat(data.sekex.toFixed(2)) + ' SEK'); }); let btcValue = function() { let url = '/btc'; $.ajax({ type: 'GET', url: url, data: '', dataType: 'json', timeout: 10000, //contentType: ('application/json'), headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'PUT, GET, POST, DELETE, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type' }, success: function(data) { // console.log(data); let gbp = data.bpi.GBP.rate_float, usd = data.bpi.USD.rate_float; updateBTC(gbp, usd); }, error: function(xhr, type) { console.log('ajax error'); console.log(xhr); console.log(type); } }); }; /*this.bind('getBTC', function() { btcValue(); });*/ let getFX = function() { let url = '/fx'; $.ajax({ type: 'GET', url: url, data: '', dataType: 'json', timeout: 10000, //contentType: ('application/json'), headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'PUT, GET, POST, DELETE, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type' }, success: function(data) { let gpbex = (1 / data.rates.GBP); let sekex = (gpbex * data.rates.SEK); let fxdata = { usd: 1, gbp: data.rates.GBP, sek: data.rates.SEK, gpbe: gpbex, sekex: sekex }; self.trigger('updateFX', fxdata); }, error: function(xhr, type) { console.log('ajax error'); console.log(xhr); console.log(type); } }); }; this.bind('getFX', function() { getFX(); }); let getNextTrainTime = function(toStation, fromStation) { let url = '/getnexttraintimes?from=' + fromStation + '&to=' + toStation; let target = fromStation + toStation; $.ajax({ type: 'GET', url: url, data: '', dataType: 'json', timeout: 10000, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'PUT, GET, POST, DELETE, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type' }, success: function(data) { updateTrain(target, data); }, error: function(xhr, type) { console.log('ajax error'); console.log(xhr); console.log(type); } }); }; var updateTrain = function(n, obj) { let elm = $('#' + n); let output, status; output = (obj.eta == 'On Time') ? obj.eta : obj.sta; status = (obj.eta == 'On Time') ? 'delayed' : 'ontime'; elm.html(output); elm.removeClass('delayed').removeClass('ontime').addClass( status); //elm.addClass( status); }; let getTrainsCB = function(results) { let dest$ = $('#trainResults'); let html = new EJS({url: '/template/trains.ejs'}).render(results); dest$.empty(); dest$.append(html); dest$.toggle(); }; let getTrains = function(from, to) { let url = '/gettrains?from=' + from + '&to=' + to; $.ajax({ type: 'GET', url: url, data: '', dataType: 'json', timeout: 10000, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'PUT, GET, POST, DELETE, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type' }, success: function(data) { getTrainsCB(data); }, error: function(xhr, type) { console.log('ajax error'); console.log(xhr); console.log(type); } }); }; let formatPassword = function(data) { let dest$ = $('#passwordOut'); let html = new EJS({url: '/template/password.ejs'}).render(data); dest$.empty(); dest$.append(html); dest$.show(); }; let generatePassword = function(from, to) { let url = '/generate'; $.ajax({ type: 'GET', url: url, data: '', dataType: 'json', timeout: 10000, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'PUT, GET, POST, DELETE, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type' }, success: function(data) { formatPassword(data); }, error: function(xhr, type) { console.log('ajax error'); console.log(xhr); console.log(type); } }); }; tick(); get_weather(); self.trigger('getBTC'); self.trigger('getFX'); getNextTrainTime('dbe', 'glq'); getNextTrainTime('glq', 'dbe'); // start 15 minute timer _fastTimer = setInterval(function() { self.trigger('getBTC'); getNextTrainTime('dbe', 'glq'); getNextTrainTime('glq', 'dbe'); }, (60000)); _slowTimer = setInterval(function() { self.trigger('getFX'); get_weather(); }, (60000 * 15)); $('#dbeglq').on('click', function() { self.trigger('getTrains', 'dbe', 'glq'); }); $('#glqdbe').on('click', function() { self.trigger('getTrains', 'glq', 'dbe'); }); $('#newPassword').on('click', function() { generatePassword(); }); this.bind('getTrains', function(start, end) { getTrains(start, end); }); document.title = 'Slack'; })(); let popitout = function(url) { let newwindow = window.open(url, 'name', 'height=600,width=570'); if (window.focus) { newwindow.focus(); } return false; }; let popitoutSmall = function(url) { let newwindow = window.open(url, 'name', 'height=400,width=520'); if (window.focus) { newwindow.focus(); } return false; };