commit 3e1087fd70910351e625c94570ef6fb42b9e1e45 Author: martind2000 Date: Tue Mar 8 21:52:21 2016 +0000 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..56877ed --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +# https://git-scm.com/docs/gitignore +# https://help.github.com/articles/ignoring-files +# Example .gitignore files: https://github.com/github/gitignore +/bower_components/ +/node_modules/ +.idea +/.idea diff --git a/app.js b/app.js new file mode 100644 index 0000000..66a6652 --- /dev/null +++ b/app.js @@ -0,0 +1,38 @@ +/*var app = require('express').createServer(); +app.get('/', function(req, res) { + res.send('Hello from AppFog.com'); +}); +app.listen(process.env.VCAP_APP_PORT || 3000);*/ + + +var express = require('express'), path = require('path'), http = require('http'); +var app = express(); +app.configure(function() { + app.set('port', process.env.VCAP_APP_PORT || 3000); + app.use(express.logger('dev')); + /* 'default', 'short', 'tiny', 'dev' */ + app.use(express.methodOverride()); + app.use(express.bodyParser()); + app.use(function(req, res, next) { + res.header("Access-Control-Allow-Origin", "*"); + res.header("Access-Control-Allow-Headers", "X-Requested-With"); + next(); + }); + app.use(app.router); + app.use(express.static(path.join(__dirname, 'www'))); +app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); +}); + + +/** + * Routing handlers + */ + + +/** + * create the server + */ +http.createServer(app).listen(app.get('port'), function() { + console.log("Express server listening on port " + app.get('port')); +}); + diff --git a/app/Robots.txt b/app/Robots.txt new file mode 100644 index 0000000..4e0bfc5 --- /dev/null +++ b/app/Robots.txt @@ -0,0 +1,2 @@ +User-Agent: * +Disallow: / \ No newline at end of file diff --git a/app/app.js b/app/app.js new file mode 100644 index 0000000..e627ea8 --- /dev/null +++ b/app/app.js @@ -0,0 +1,390 @@ +(function () { + + var lastGBP = 0.0, + lastUSD = 0.0, + _fasttimer, _slowTimer, myBTC = 3.49524333; + var lows = { + gbp: 0, + usd: 0 + }, + highs = { + gbp: 0, + usd: 0 + }; + + var list = [{ + title: '101B ends', + y: 2013, + m: 9, + d: 24, + add: 1001 + }, + { + title: 'Ends', + y: 2016, + m: 4, + d: 4 + }]; + + MicroEvent.mixin(this); + var self = this; + + var addDays = function (myDate, days) { + return new Date(myDate.getTime() + days * 24 * 60 * 60 * 1000); + }; + + var getDays = function (startdate, enddate) { + var r, s, e; + s = startdate.getTime(); + e = enddate.getTime(); + r = (e - s) / (24 * 60 * 60 * 1000); + return r; + }; + + var tick = function () { + var today = new Date(); + var start101 = new Date(); + var end101; + var endContract = new Date(); + var third = new Date(); + start101.setFullYear(2013, 9, 24); + end101 = addDays(start101, 1001); + endContract.setFullYear(2016, 4, 4); + third.setFullYear(2013, 7, 25); + $('#one').text('101B ends: ' + Math.ceil(getDays(today, + end101)) + " days / " + Math.ceil(getDays(today, + end101) / 7) + " weeks"); + $('#two').text('Ends: ' + Math.ceil(getDays(today, + endContract)) + " days / " + Math.ceil(getDays(today, + endContract) / 7) + " weeks"); + $('#three').hide(); + }; + + var 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) { + var latitude = position.coords.latitude; + var longitude = position.coords.longitude; + // let's show a map or do something interesting! + $.ajax({ + type: 'GET', + url: 'https://api.forecast.io/forecast/0657dc0d81c037cbc89ca88e383b6bbf/' + 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); + } + }); + }; + + var updateBTC = function (g, u) { + var 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); + }; + + var updateFX = function (data) { + var 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"); + }); + + + var btcValue = function () { + var 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); + var 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(); + }); + + var getFX = function () { + var 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) { + var gpbex = (1 / data.rates.GBP); + var sekex = (gpbex * data.rates.SEK); + var 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(); + }); + + var getNextTrainTime = function (toStation, fromStation) { + var url = '/getnexttraintimes?from=' + fromStation + '&to=' + toStation; + var 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) { + var elm = $('#' + n); + + var output, status; + + output = (obj.eta == "On Time") ? obj.eta : obj.sta; + status = (obj.eta == "On Time") ? 'delayed' : 'ontime'; + + elm.html(output); + elm.prop('class', status); + }; + + var getTrainsCB = function (results) { + var dest$ = $('#trainResults'); + var html = new EJS({url: '/template/trains.ejs'}).render(results); + + dest$.empty(); + dest$.append(html); + dest$.toggle(); + }; + + var getTrains = function (from, to) { + var 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); + } + }); + }; + + var formatPassword = function (data) { + + var dest$ = $('#passwordOut'); + var html = new EJS({url: '/template/password.ejs'}).render(data); + dest$.empty(); + dest$.append(html); + dest$.show(); + }; + + var generatePassword = function (from, to) { + var 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'; +})(); + +var popitout = function (url) { + var newwindow = window.open(url, 'name', 'height=600,width=570'); + if (window.focus) { + newwindow.focus() + } + return false; +}; + +var popitoutSmall = function (url) { + var newwindow = window.open(url, 'name', 'height=400,width=520'); + if (window.focus) { + newwindow.focus() + } + return false; +}; diff --git a/app/app.min.js b/app/app.min.js new file mode 100644 index 0000000..02b9da6 --- /dev/null +++ b/app/app.min.js @@ -0,0 +1,10 @@ +(function(){var c=0,m=0,g=0,n=0,h=0;MicroEvent.mixin(this);var e=this,k=function(a,b){var d;d=a.getTime();return(b.getTime()-d)/864E5};this.bind("displayWeather",function(a){console.log("Update weather event:");$("#weather").html(a.currently.summary+" "+a.currently.temperature+"°c "+a.daily.summary+"")});var p=function(a){$.ajax({type:"GET",url:"https://api.forecast.io/forecast/0657dc0d81c037cbc89ca88e383b6bbf/"+a.coords.latitude.toString()+","+a.coords.longitude.toString()+"?units=uk2", + data:"",dataType:"jsonp",timeout:1E4,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(a){e.trigger("displayWeather",a)},error:function(a,d){console.log("ajax error");console.log(a);console.log(d)}})},t=function(){$.ajax({type:"GET",url:"/btc",data:"",dataType:"json",timeout:1E4,headers:{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"PUT, GET, POST, DELETE, OPTIONS", + "Access-Control-Allow-Headers":"Content-Type"},success:function(a){var b=a.bpi.GBP.rate_float;a=a.bpi.USD.rate_float;var d,q,f=$("#btc");0!==c?(f.removeClass(),b>c?f.addClass("up"):b