diff --git a/angular.html b/angular.html index b4a5c75..d0d93ac 100644 --- a/angular.html +++ b/angular.html @@ -12,7 +12,9 @@ + + diff --git a/css/download.css b/css/download.css new file mode 100644 index 0000000..82f7c07 --- /dev/null +++ b/css/download.css @@ -0,0 +1,82 @@ +.download-name { + font-size: 12px; +} +.active-download { + width: 100%; + margin-bottom: 10px; + background-color: rgb(245, 245, 245); + border: 1px solid rgba(0, 0, 0, 0.05); + border-radius: 4px 4px 4px 4px; + box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); +} +.waiting-download { + width: 100%; + margin-bottom: 10px; + background-color: rgb(245, 245, 245); + border: 1px solid rgba(0, 0, 0, 0.05); + border-radius: 4px 4px 4px 4px; + box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); +} +.stopped-download { + width: 100%; + margin-bottom: 10px; + background-color: rgb(245, 245, 245); + border: 1px solid rgba(0, 0, 0, 0.05); + border-radius: 4px 4px 4px 4px; + box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); +} +.stats { + margin-left: auto; + margin-right: auto; + text-align: center; +} +.stats li { + padding: 5px; +} + +.download-controls { + width: 60px; +} +.download-controls .btn-group { + height: 70px; + width: 100%; + float: right; +} +.download-controls .btn-group .btn:nth-child(1) { + width: 70%; +} +.download-controls .btn-group .btn:nth-child(2) { + width: 30%; +} + +.download-controls .btn-group .btn { + height: 100%; +} +.download-controls .btn-group .btn i { + height: 100%; + font-size: 28px; + color: gray; +} +.download-overview { + padding: 10px; + cursor: pointer; +} +.download-detail { + cursor: pointer; +} +.download-detail .stats li { + width: 150px; + margin-bottom: 5px; +} +.download-detail h4 { + margin-left: 10px; +} +.download-files { + width: 90%; + margin-left: auto; + margin-right: auto; +} +.download-files li { + padding: 5px; + margin: 5px; +} diff --git a/css/style.css b/css/style.css index 854b16a..262fe33 100644 --- a/css/style.css +++ b/css/style.css @@ -1,84 +1,6 @@ -.download-name { - font-size: 12px; -} -.active-download { - width: 100%; - margin-bottom: 10px; - background-color: rgb(245, 245, 245); - border: 1px solid rgba(0, 0, 0, 0.05); - border-radius: 4px 4px 4px 4px; - box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); -} -.waiting-download { - width: 100%; - margin-bottom: 10px; - background-color: rgb(245, 245, 245); - border: 1px solid rgba(0, 0, 0, 0.05); - border-radius: 4px 4px 4px 4px; - box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); -} -.stopped-download { - width: 100%; - margin-bottom: 10px; - background-color: rgb(245, 245, 245); - border: 1px solid rgba(0, 0, 0, 0.05); - border-radius: 4px 4px 4px 4px; - box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); -} -.stats { - margin-left: auto; - margin-right: auto; - text-align: center; -} -.stats li { - padding: 5px; -} - -.download-controls { - width: 60px; -} -.download-controls .btn-group { - height: 70px; - width: 100%; - float: right; -} -.download-controls .btn-group .btn:nth-child(1) { - width: 70%; -} -.download-controls .btn-group .btn:nth-child(2) { - width: 30%; -} - -.download-controls .btn-group .btn { - height: 100%; -} -.download-controls .btn-group .btn i { - height: 100%; - font-size: 28px; - color: gray; -} -.download-overview { - padding: 10px; - cursor: pointer; -} -.download-detail { - cursor: pointer; -} -.download-detail .stats li { - width: 150px; - margin-bottom: 5px; -} -.download-detail h4 { - margin-left: 10px; -} -.download-files { - width: 90%; - margin-left: auto; - margin-right: auto; -} -.download-files li { - padding: 5px; - margin: 5px; +/* fix modal overflow on low resolutions */ +.modal { + position: absolute; } @media all and (min-width: 980px) { body { diff --git a/index.html b/index.html index 59eefe3..ab85740 100755 --- a/index.html +++ b/index.html @@ -12,7 +12,9 @@ + + diff --git a/js/connection.js b/js/connection.js index 2bde23b..68da8a3 100644 --- a/js/connection.js +++ b/js/connection.js @@ -1,154 +1,163 @@ var JsonRPC = function(conf) { - if (!this instanceof JsonRPC) - return new JsonRPC(); - this.avgTimeout = 2000; - this.serverConf = conf; + if (!this instanceof JsonRPC) + return new JsonRPC(); + this.avgTimeout = 2000; + this.serverConf = conf; }; JsonRPC.prototype = { - encode: function(obj) { - return base64.btoa(JSON.stringify(obj)); - }, - ariaRequest: function(url, multicall, funcName, params, success, error) { - var startTime = new Date(); + encode: function(obj) { + return base64.btoa(JSON.stringify(obj)); + }, + ariaRequest: function(url, multicall, funcName, params, success, error) { + var startTime = new Date(); var conn = this; - $.ajax({ - url: url, - timeout: this.avgTimeout, - data: { - jsonrpc: 2.0, - id: 'webui', - method: funcName.search(/\./g) == -1 ? 'aria2.' + funcName : funcName, - params: params.length ? this.encode(params) : undefined - }, - success: function(data) { - conn.avgTimeout = 3 * (new Date() - startTime); - return success(data) - }, - error: error, - dataType: 'jsonp', - jsonp: 'jsoncallback' - }); - }, - invoke: function(opts) { - var rpc = this; - var scheme = rpc.serverConf.encryption ? 'https' : 'http'; - rpc.ariaRequest( - scheme + '://' + rpc.serverConf.host + ':' + rpc.serverConf.port + '/jsonrpc', - opts.multicall, - opts.func, - opts.params, - opts.success, - function() { - // check if authentication details are given, if yes then use a hack to support - // http authentication otherwise emit error - if (!rpc.serverConf.user.length) { - console.log("no user name and still error!!!"); - return opts.error(); - } + $.ajax({ + url: url, + timeout: this.avgTimeout, + data: { + jsonrpc: 2.0, + id: 'webui', + method: funcName.search(/\./g) == -1 ? 'aria2.' + funcName : funcName, + params: params.length ? this.encode(params) : undefined + }, + success: function(data) { + conn.avgTimeout = 3 * (new Date() - startTime); + return success(data) + }, + error: error, + dataType: 'jsonp', + jsonp: 'jsoncallback' + }); + }, + invoke: function(opts) { + var rpc = this; + var scheme = rpc.serverConf.encryption ? 'https' : 'http'; + rpc.ariaRequest( + scheme + '://' + rpc.serverConf.host + ':' + rpc.serverConf.port + '/jsonrpc', + opts.multicall, + opts.func, + opts.params, + opts.success, + function() { + // check if authentication details are given, if yes then use a hack to support + // http authentication otherwise emit error + if (!rpc.serverConf.user.length) { + console.log("no user name and still error!!!"); + return opts.error(); + } - var authUrl = scheme + '://' + - rpc.serverConf.user + ":" + - rpc.serverConf.pass + "@" + - rpc.serverConf.host + ':' + - rpc.serverConf.port + '/jsonrpc'; + var authUrl = scheme + '://' + + rpc.serverConf.user + ":" + + rpc.serverConf.pass + "@" + + rpc.serverConf.host + ':' + + rpc.serverConf.port + '/jsonrpc'; - // hack is to basically inject an image with same uri as the aria2 rpc url, - // most browsers will then cache the authentication details and we dont have - // to give them next time we make a request - var img = $('').attr("src", authUrl); - $('body').append(img); - img.remove(); + // hack is to basically inject an image with same uri as the aria2 rpc url, + // most browsers will then cache the authentication details and we dont have + // to give them next time we make a request + var img = $('').attr("src", authUrl); + $('body').append(img); + img.remove(); - // timeout to let the image load and then make a request, - setTimeout(function() { - rpc.ariaRequest( - authUrl, - opts.multicall, - opts.params, - opts.success, - opts.error - ); - }, rpc.avgTimeout); - } - ); - } + // timeout to let the image load and then make a request, + setTimeout(function() { + rpc.ariaRequest( + authUrl, + opts.multicall, + opts.params, + opts.success, + opts.error + ); + }, rpc.avgTimeout); + } + ); + } }; var SocketRPC = function(conf) { - if (!this instanceof SocketRPC) - return new SocketRPC(); + if (!this instanceof SocketRPC) + return new SocketRPC(); - var rpc = this; - rpc.serverConf = conf; - rpc.initialized = false; - rpc.handles = []; - var scheme = rpc.serverConf.encryption ? 'wss' : 'ws'; - rpc.sock = new WebSocket(scheme + '://' + conf.host + ':' + conf.port + '/jsonrpc'); - rpc.sock.onopen = function() { - rpc.initialized = true; - }; - rpc.sock.onclose = rpc.sock.onerror = function() { - _.each(rpc.handles, function(h) { h.error() }); - rpc.handles = []; - }; - rpc.sock.onmessage = function(message) { - var data = JSON.parse(message.data); - for (var i = rpc.handles.length; i--; ) { - if (rpc.handles[i].id === data.id) { - if (data.error) - rpc.handles[i].error(); - else - rpc.handles[i].success(data); - rpc.handles.splice(i, 1); - return; - } - } - }; + var rpc = this; + rpc.initialized = false; + rpc.serverConf = conf; + rpc.handles = []; + var scheme = rpc.serverConf.encryption ? 'wss' : 'ws'; + + if (typeof WebSocket == "undefined") + return; + + try { + rpc.sock = new WebSocket(scheme + '://' + conf.host + ':' + conf.port + '/jsonrpc'); + rpc.sock.onopen = function() { + rpc.initialized = true; + }; + rpc.sock.onclose = rpc.sock.onerror = function() { + _.each(rpc.handles, function(h) { h.error() }); + rpc.handles = []; + }; + rpc.sock.onmessage = function(message) { + var data = JSON.parse(message.data); + for (var i = rpc.handles.length; i--; ) { + if (rpc.handles[i].id === data.id) { + if (data.error) + rpc.handles[i].error(); + else + rpc.handles[i].success(data); + rpc.handles.splice(i, 1); + return; + } + } + }; + } + catch(ex) { + rpc.initialized = false; + } } SocketRPC.prototype = { - invoke: function(opts) { - var data = { - jsonrpc: 2.0, - id: 'webui_' + utils.randStr(), - method: opts.func.search(/\./g) == -1 ? 'aria2.' + opts.func : opts.func, - params: opts.params.length ? opts.params : undefined - }; + invoke: function(opts) { + var data = { + jsonrpc: 2.0, + id: 'webui_' + utils.randStr(), + method: opts.func.search(/\./g) == -1 ? 'aria2.' + opts.func : opts.func, + params: opts.params.length ? opts.params : undefined + }; - this.handles.push({ - success: opts.success, - error: opts.error, - id: data.id - }); - this.sock.send(JSON.stringify(data)); - }, + this.handles.push({ + success: opts.success, + error: opts.error, + id: data.id + }); + this.sock.send(JSON.stringify(data)); + }, }; var AriaConnection = function(conf) { - var conf = conf || { - host: 'localhost', - port: 6800, - user: '', - pass: '' - }; - var jRPC = new JsonRPC(conf); - if (typeof WebSocket != "undefined") { - var sockRPC = new SocketRPC(conf); - } + var conf = conf || { + host: 'localhost', + port: 6800, + user: '', + pass: '' + }; + var jRPC = new JsonRPC(conf); + if (typeof WebSocket != "undefined") { + var sockRPC = new SocketRPC(conf); + } - return { - conf: conf, - invoke: function(opts) { - opts = utils.mixin(opts, { - success: function() {}, - error: function() {}, - params: [], - func: '' - }); - if (!sockRPC || !sockRPC.initialized) - return jRPC.invoke(opts); - else - return sockRPC.invoke(opts); - } - }; + return { + conf: conf, + invoke: function(opts) { + opts = utils.mixin(opts, { + success: function() {}, + error: function() {}, + params: [], + func: '' + }); + if (!sockRPC || !sockRPC.initialized) + return jRPC.invoke(opts); + else + return sockRPC.invoke(opts); + } + }; } diff --git a/js/services/rpc/sockcall.js b/js/services/rpc/sockcall.js index 0c0781c..c256c2a 100644 --- a/js/services/rpc/sockcall.js +++ b/js/services/rpc/sockcall.js @@ -78,10 +78,15 @@ app.factory('$sockcall', ['$_', '$json', '$name', '$utils', function(_, JSON, na this.onerror(); } - this.sock = new WebSocket(this.scheme + '://' + conf.host + ':' + conf.port + '/jsonrpc'); - this.sock.onopen = this.onopen; - this.sock.onclose = this.sock.onerror = this.onerror; - this.sock.onmessage = this.onmessage; + try { + this.sock = new WebSocket(this.scheme + '://' + conf.host + ':' + conf.port + '/jsonrpc'); + this.sock.onopen = this.onopen; + this.sock.onclose = this.sock.onerror = this.onerror; + this.sock.onmessage = this.onmessage; + } + catch (ex) { + // ignoring IE securty exception on local ip addresses + } }, }; }]);