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
+ }
},
};
}]);