| 
									
										
										
										
											2010-07-12 22:04:42 +08:00
										 |  |  | $(document).ready(function() { | 
					
						
							| 
									
										
										
										
											2012-10-23 23:35:17 +08:00
										 |  |  |     replace_content('outer', format('login', {})); | 
					
						
							| 
									
										
										
										
											2013-10-10 00:55:23 +08:00
										 |  |  |     start_app_login(); | 
					
						
							| 
									
										
										
										
											2011-05-06 01:30:45 +08:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-06 21:39:09 +08:00
										 |  |  | function dispatcher_add(fun) { | 
					
						
							|  |  |  |     dispatcher_modules.push(fun); | 
					
						
							| 
									
										
										
										
											2011-05-06 23:01:20 +08:00
										 |  |  |     if (dispatcher_modules.length == extension_count) { | 
					
						
							| 
									
										
										
										
											2011-05-06 21:39:09 +08:00
										 |  |  |         start_app(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function dispatcher() { | 
					
						
							|  |  |  |     for (var i in dispatcher_modules) { | 
					
						
							|  |  |  |         dispatcher_modules[i](this); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-23 00:45:53 +08:00
										 |  |  | function set_auth_pref(userinfo) { | 
					
						
							| 
									
										
										
										
											2013-10-31 19:22:31 +08:00
										 |  |  |     var b64 = b64_encode_utf8(userinfo); | 
					
						
							| 
									
										
										
										
											2014-09-23 00:45:53 +08:00
										 |  |  |     store_pref('auth', encodeURIComponent(b64)); | 
					
						
							| 
									
										
										
										
											2013-10-10 00:55:23 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-06 23:51:08 +08:00
										 |  |  | function login_route () { | 
					
						
							|  |  |  |     var userpass = '' + this.params['username'] + ':' + this.params['password'], | 
					
						
							|  |  |  |         location = window.location.href, | 
					
						
							|  |  |  |         hash = window.location.hash; | 
					
						
							| 
									
										
										
										
											2014-09-23 00:45:53 +08:00
										 |  |  |     set_auth_pref(decodeURIComponent(userpass)); | 
					
						
							| 
									
										
										
										
											2013-11-06 23:51:08 +08:00
										 |  |  |     location = location.substr(0, location.length - hash.length); | 
					
						
							|  |  |  |     window.location.replace(location); | 
					
						
							|  |  |  |     // because we change url, we don't need to hit check_login as
 | 
					
						
							|  |  |  |     // we'll end up doing that at the bottom of start_app_login after
 | 
					
						
							|  |  |  |     // we've changed url.
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-28 19:45:43 +08:00
										 |  |  | function login_route_with_path() { | 
					
						
							|  |  |  |   var params = ('' + this.params['splat']).split('/'); | 
					
						
							| 
									
										
										
										
											2016-09-19 20:14:20 +08:00
										 |  |  |   var user = params.shift(); | 
					
						
							|  |  |  |   var pass = params.shift(); | 
					
						
							|  |  |  |   var userpass = '' + user + ':' + pass, | 
					
						
							|  |  |  |         location = window.location.href, | 
					
						
							|  |  |  |         hash = window.location.hash; | 
					
						
							|  |  |  |     set_auth_pref(decodeURIComponent(userpass)); | 
					
						
							|  |  |  |     location = location.substr(0, location.length - hash.length) + '#/' + params.join('/'); | 
					
						
							|  |  |  |     check_login(); | 
					
						
							|  |  |  |     window.location.replace(location); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-23 23:35:17 +08:00
										 |  |  | function start_app_login() { | 
					
						
							| 
									
										
										
										
											2012-11-14 21:51:04 +08:00
										 |  |  |     app = new Sammy.Application(function () { | 
					
						
							| 
									
										
										
										
											2012-10-23 23:35:17 +08:00
										 |  |  |         this.put('#/login', function() { | 
					
						
							|  |  |  |             username = this.params['username']; | 
					
						
							|  |  |  |             password = this.params['password']; | 
					
						
							| 
									
										
										
										
											2014-09-23 00:45:53 +08:00
										 |  |  |             set_auth_pref(username + ':' + password); | 
					
						
							| 
									
										
										
										
											2012-11-03 00:31:30 +08:00
										 |  |  |             check_login(); | 
					
						
							| 
									
										
										
										
											2012-10-23 23:35:17 +08:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2015-04-14 05:22:19 +08:00
										 |  |  |         this.get('#/login/:username/:password', login_route); | 
					
						
							| 
									
										
										
										
											2016-09-28 19:45:43 +08:00
										 |  |  |         this.get(/\#\/login\/(.*)/, login_route_with_path); | 
					
						
							| 
									
										
										
										
											2012-10-23 23:35:17 +08:00
										 |  |  |     }); | 
					
						
							|  |  |  |     app.run(); | 
					
						
							| 
									
										
										
										
											2014-09-23 00:45:53 +08:00
										 |  |  |     if (get_pref('auth') != null) { | 
					
						
							| 
									
										
										
										
											2012-11-03 00:31:30 +08:00
										 |  |  |         check_login(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function check_login() { | 
					
						
							| 
									
										
										
										
											2014-01-31 21:40:48 +08:00
										 |  |  |     user = JSON.parse(sync_get('/whoami')); | 
					
						
							| 
									
										
										
										
											2012-11-03 00:31:30 +08:00
										 |  |  |     if (user == false) { | 
					
						
							| 
									
										
										
										
											2014-09-23 00:45:53 +08:00
										 |  |  |         clear_pref('auth'); | 
					
						
							| 
									
										
										
										
											2012-11-03 00:31:30 +08:00
										 |  |  |         replace_content('login-status', '<p>Login failed</p>'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else { | 
					
						
							| 
									
										
										
										
											2013-11-06 23:58:32 +08:00
										 |  |  |         replace_content('outer', format('layout', {})); | 
					
						
							| 
									
										
										
										
											2014-01-31 21:40:48 +08:00
										 |  |  |         setup_global_vars(); | 
					
						
							| 
									
										
										
										
											2012-11-03 00:31:30 +08:00
										 |  |  |         setup_constant_events(); | 
					
						
							|  |  |  |         update_vhosts(); | 
					
						
							|  |  |  |         update_interval(); | 
					
						
							|  |  |  |         setup_extensions(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2012-10-23 23:35:17 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-06 01:30:45 +08:00
										 |  |  | function start_app() { | 
					
						
							| 
									
										
										
										
											2013-10-10 00:24:41 +08:00
										 |  |  |     if (app !== undefined) { | 
					
						
							| 
									
										
										
										
											2013-10-10 00:16:47 +08:00
										 |  |  |         app.unload(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2012-11-14 21:51:04 +08:00
										 |  |  |     // Oh boy. Sammy uses various different methods to determine if
 | 
					
						
							|  |  |  |     // the URL hash has changed. Unsurprisingly this is a native event
 | 
					
						
							|  |  |  |     // in modern browsers, and falls back to an icky polling function
 | 
					
						
							|  |  |  |     // in MSIE. But it looks like there's a bug. The polling function
 | 
					
						
							|  |  |  |     // should get installed when the app is started. But it's guarded
 | 
					
						
							|  |  |  |     // behind if (Sammy.HashLocationProxy._interval != null). And of
 | 
					
						
							|  |  |  |     // course that's not specific to the application; it's pretty
 | 
					
						
							|  |  |  |     // global. So we need to manually clear that in order for links to
 | 
					
						
							|  |  |  |     // work in MSIE.
 | 
					
						
							|  |  |  |     // Filed as https://github.com/quirkey/sammy/issues/171
 | 
					
						
							|  |  |  |     //
 | 
					
						
							|  |  |  |     // Note for when we upgrade: HashLocationProxy has become
 | 
					
						
							|  |  |  |     // DefaultLocationProxy in later versions, but otherwise the issue
 | 
					
						
							|  |  |  |     // remains.
 | 
					
						
							| 
									
										
										
										
											2016-02-17 13:31:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-28 06:00:09 +08:00
										 |  |  |     // updated to the version  0.7.6 this _interval = null is fixed
 | 
					
						
							|  |  |  |     // just leave the history here.
 | 
					
						
							|  |  |  |     //Sammy.HashLocationProxy._interval = null;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-14 21:51:04 +08:00
										 |  |  |     app = new Sammy.Application(dispatcher); | 
					
						
							| 
									
										
										
										
											2010-08-23 23:32:17 +08:00
										 |  |  |     app.run(); | 
					
						
							| 
									
										
										
										
											2012-11-03 01:41:31 +08:00
										 |  |  |     var url = this.location.toString(); | 
					
						
							|  |  |  |     if (url.indexOf('#') == -1) { | 
					
						
							|  |  |  |         this.location = url + '#/'; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-05-06 01:30:45 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2010-07-12 22:04:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-08 00:23:11 +08:00
										 |  |  | function setup_constant_events() { | 
					
						
							|  |  |  |     $('#update-every').change(function() { | 
					
						
							|  |  |  |             var interval = $(this).val(); | 
					
						
							| 
									
										
										
										
											2011-01-18 02:06:02 +08:00
										 |  |  |             store_pref('interval', interval); | 
					
						
							| 
									
										
										
										
											2011-01-14 19:33:34 +08:00
										 |  |  |             if (interval == '') | 
					
						
							|  |  |  |                 interval = null; | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 interval = parseInt(interval); | 
					
						
							| 
									
										
										
										
											2010-10-08 00:23:11 +08:00
										 |  |  |             set_timer_interval(interval); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |     $('#show-vhost').change(function() { | 
					
						
							|  |  |  |             current_vhost = $(this).val(); | 
					
						
							| 
									
										
										
										
											2011-01-18 01:23:54 +08:00
										 |  |  |             store_pref('vhost', current_vhost); | 
					
						
							| 
									
										
										
										
											2010-10-08 00:23:11 +08:00
										 |  |  |             update(); | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2010-11-09 19:42:43 +08:00
										 |  |  |     if (!vhosts_interesting) { | 
					
						
							|  |  |  |         $('#vhost-form').hide(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-10-08 00:23:11 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function update_vhosts() { | 
					
						
							|  |  |  |     var vhosts = JSON.parse(sync_get('/vhosts')); | 
					
						
							| 
									
										
										
										
											2010-11-09 19:42:43 +08:00
										 |  |  |     vhosts_interesting = vhosts.length > 1; | 
					
						
							|  |  |  |     if (vhosts_interesting) | 
					
						
							|  |  |  |         $('#vhost-form').show(); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         $('#vhost-form').hide(); | 
					
						
							| 
									
										
										
										
											2010-10-08 00:23:11 +08:00
										 |  |  |     var select = $('#show-vhost').get(0); | 
					
						
							|  |  |  |     select.options.length = vhosts.length + 1; | 
					
						
							|  |  |  |     var index = 0; | 
					
						
							|  |  |  |     for (var i = 0; i < vhosts.length; i++) { | 
					
						
							|  |  |  |         var vhost = vhosts[i].name; | 
					
						
							| 
									
										
										
										
											2011-01-18 21:32:47 +08:00
										 |  |  |         select.options[i + 1] = new Option(vhost, vhost); | 
					
						
							| 
									
										
										
										
											2010-10-08 00:23:11 +08:00
										 |  |  |         if (vhost == current_vhost) index = i + 1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     select.selectedIndex = index; | 
					
						
							| 
									
										
										
										
											2011-01-18 21:32:47 +08:00
										 |  |  |     current_vhost = select.options[index].value; | 
					
						
							| 
									
										
										
										
											2011-01-18 01:32:26 +08:00
										 |  |  |     store_pref('vhost', current_vhost); | 
					
						
							| 
									
										
										
										
											2010-10-08 00:23:11 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-06 01:30:45 +08:00
										 |  |  | function setup_extensions() { | 
					
						
							|  |  |  |     var extensions = JSON.parse(sync_get('/extensions')); | 
					
						
							| 
									
										
										
										
											2016-07-15 05:35:35 +08:00
										 |  |  |     extension_count = 0; | 
					
						
							| 
									
										
										
										
											2011-05-06 01:30:45 +08:00
										 |  |  |     for (var i in extensions) { | 
					
						
							|  |  |  |         var extension = extensions[i]; | 
					
						
							| 
									
										
										
										
											2016-07-15 05:35:35 +08:00
										 |  |  |         if ($.isPlainObject(extension) && extension.hasOwnProperty("javascript")) { | 
					
						
							|  |  |  |             dynamic_load(extension.javascript); | 
					
						
							|  |  |  |             extension_count++; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2011-05-06 01:30:45 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function dynamic_load(filename) { | 
					
						
							|  |  |  |     var element = document.createElement('script'); | 
					
						
							|  |  |  |     element.setAttribute('type', 'text/javascript'); | 
					
						
							|  |  |  |     element.setAttribute('src', 'js/' + filename); | 
					
						
							|  |  |  |     document.getElementsByTagName("head")[0].appendChild(element); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-18 02:06:02 +08:00
										 |  |  | function update_interval() { | 
					
						
							| 
									
										
										
										
											2011-01-21 19:20:01 +08:00
										 |  |  |     var intervalStr = get_pref('interval'); | 
					
						
							|  |  |  |     var interval; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (intervalStr == null)    interval = 5000; | 
					
						
							|  |  |  |     else if (intervalStr == '') interval = null; | 
					
						
							|  |  |  |     else                        interval = parseInt(intervalStr); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (isNaN(interval)) interval = null; // Prevent DoS if cookie malformed
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-18 02:06:02 +08:00
										 |  |  |     set_timer_interval(interval); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     var select = $('#update-every').get(0); | 
					
						
							|  |  |  |     var opts = select.options; | 
					
						
							|  |  |  |     for (var i = 0; i < opts.length; i++) { | 
					
						
							| 
									
										
										
										
											2011-01-21 19:20:01 +08:00
										 |  |  |         if (opts[i].value == intervalStr) { | 
					
						
							| 
									
										
										
										
											2011-01-18 02:06:02 +08:00
										 |  |  |             select.selectedIndex = i; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-10-08 00:23:11 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-24 01:32:33 +08:00
										 |  |  | function go_to(url) { | 
					
						
							| 
									
										
										
										
											2012-11-21 01:02:41 +08:00
										 |  |  |     this.location = url; | 
					
						
							| 
									
										
										
										
											2010-08-24 01:32:33 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-29 22:59:39 +08:00
										 |  |  | function set_timer_interval(interval) { | 
					
						
							|  |  |  |     timer_interval = interval; | 
					
						
							| 
									
										
										
										
											2010-10-14 20:15:26 +08:00
										 |  |  |     reset_timer(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function reset_timer() { | 
					
						
							| 
									
										
										
										
											2010-09-29 22:59:39 +08:00
										 |  |  |     clearInterval(timer); | 
					
						
							|  |  |  |     if (timer_interval != null) { | 
					
						
							| 
									
										
										
										
											2010-09-29 23:56:03 +08:00
										 |  |  |         timer = setInterval('partial_update()', timer_interval); | 
					
						
							| 
									
										
										
										
											2010-09-29 22:59:39 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2010-07-13 00:11:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-09 20:17:19 +08:00
										 |  |  | function update_manual(div, query) { | 
					
						
							|  |  |  |     var path; | 
					
						
							|  |  |  |     var template; | 
					
						
							| 
									
										
										
										
											2014-10-03 00:09:06 +08:00
										 |  |  |     if (query == 'memory' || query == 'binary') { | 
					
						
							|  |  |  |         path = current_reqs['node']['path'] + '?' + query + '=true'; | 
					
						
							|  |  |  |         template = query; | 
					
						
							| 
									
										
										
										
											2012-10-09 20:17:19 +08:00
										 |  |  |     } | 
					
						
							|  |  |  |     var data = JSON.parse(sync_get(path)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     replace_content(div, format(template, data)); | 
					
						
							| 
									
										
										
										
											2012-10-09 23:33:44 +08:00
										 |  |  |     postprocess_partial(); | 
					
						
							| 
									
										
										
										
											2012-10-09 20:17:19 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-23 23:32:17 +08:00
										 |  |  | function render(reqs, template, highlight) { | 
					
						
							|  |  |  |     current_template = template; | 
					
						
							|  |  |  |     current_reqs = reqs; | 
					
						
							| 
									
										
										
										
											2014-11-05 20:03:54 +08:00
										 |  |  |     for (var i in outstanding_reqs) { | 
					
						
							|  |  |  |         outstanding_reqs[i].abort(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     outstanding_reqs = []; | 
					
						
							| 
									
										
										
										
											2010-08-23 23:32:17 +08:00
										 |  |  |     current_highlight = highlight; | 
					
						
							| 
									
										
										
										
											2010-09-29 23:56:03 +08:00
										 |  |  |     update(); | 
					
						
							| 
									
										
										
										
											2010-09-29 22:59:39 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-29 23:56:03 +08:00
										 |  |  | function update() { | 
					
						
							| 
									
										
										
										
											2012-12-07 19:35:40 +08:00
										 |  |  |     replace_content('debug', ''); | 
					
						
							| 
									
										
										
										
											2010-09-29 22:59:39 +08:00
										 |  |  |     clearInterval(timer); | 
					
						
							| 
									
										
										
										
											2010-10-08 00:23:11 +08:00
										 |  |  |     with_update(function(html) { | 
					
						
							| 
									
										
										
										
											2012-06-13 00:36:24 +08:00
										 |  |  |             update_navigation(); | 
					
						
							| 
									
										
										
										
											2010-09-29 22:59:39 +08:00
										 |  |  |             replace_content('main', html); | 
					
						
							|  |  |  |             postprocess(); | 
					
						
							| 
									
										
										
										
											2010-10-12 00:05:06 +08:00
										 |  |  |             postprocess_partial(); | 
					
						
							| 
									
										
										
										
											2012-11-16 21:27:31 +08:00
										 |  |  |             render_charts(); | 
					
						
							| 
									
										
										
										
											2011-01-27 20:15:23 +08:00
										 |  |  |             maybe_scroll(); | 
					
						
							| 
									
										
										
										
											2010-10-14 20:15:26 +08:00
										 |  |  |             reset_timer(); | 
					
						
							| 
									
										
										
										
											2010-09-29 22:59:39 +08:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2010-07-13 20:03:36 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-29 23:56:03 +08:00
										 |  |  | function partial_update() { | 
					
						
							| 
									
										
										
										
											2015-10-13 21:53:20 +08:00
										 |  |  |     if (!$(".pagination_class").is(":focus")) { | 
					
						
							|  |  |  |         if ($('.updatable').length > 0) { | 
					
						
							|  |  |  |             if (update_counter >= 200) { | 
					
						
							|  |  |  |                 update_counter = 0; | 
					
						
							|  |  |  |                 full_refresh(); | 
					
						
							|  |  |  |                 return; | 
					
						
							| 
									
										
										
										
											2010-09-29 22:59:39 +08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2015-10-13 21:53:20 +08:00
										 |  |  |             with_update(function(html) { | 
					
						
							|  |  |  |                 update_counter++; | 
					
						
							|  |  |  |                 replace_content('scratch', html); | 
					
						
							|  |  |  |                 var befores = $('#main .updatable'); | 
					
						
							|  |  |  |                 var afters = $('#scratch .updatable'); | 
					
						
							|  |  |  |                 if (befores.length != afters.length) { | 
					
						
							|  |  |  |                     throw("before/after mismatch"); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 for (var i = 0; i < befores.length; i++) { | 
					
						
							|  |  |  |                     $(befores[i]).empty().append($(afters[i]).contents()); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 replace_content('scratch', ''); | 
					
						
							|  |  |  |                 postprocess_partial(); | 
					
						
							|  |  |  |                 render_charts(); | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-11-03 16:23:05 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-09-29 22:59:39 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-13 00:36:24 +08:00
										 |  |  | function update_navigation() { | 
					
						
							|  |  |  |     var l1 = ''; | 
					
						
							|  |  |  |     var l2 = ''; | 
					
						
							|  |  |  |     var descend = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (var k in NAVIGATION) { | 
					
						
							|  |  |  |         var val = NAVIGATION[k]; | 
					
						
							|  |  |  |         var path = val; | 
					
						
							|  |  |  |         while (!leaf(path)) { | 
					
						
							| 
									
										
										
										
											2013-09-19 20:29:25 +08:00
										 |  |  |             path = first_showable_child(path); | 
					
						
							| 
									
										
										
										
											2012-06-13 00:36:24 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |         var selected = false; | 
					
						
							|  |  |  |         if (contains_current_highlight(val)) { | 
					
						
							|  |  |  |             selected = true; | 
					
						
							|  |  |  |             if (!leaf(val)) { | 
					
						
							|  |  |  |                 descend = nav(val); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (show(path)) { | 
					
						
							|  |  |  |             l1 += '<li><a href="' + nav(path) + '"' + | 
					
						
							|  |  |  |                 (selected ? ' class="selected"' : '') + '>' + k + '</a></li>'; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (descend) { | 
					
						
							|  |  |  |         l2 = obj_to_ul(descend); | 
					
						
							|  |  |  |         $('#main').addClass('with-rhs'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else { | 
					
						
							|  |  |  |         $('#main').removeClass('with-rhs'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     replace_content('tabs', l1); | 
					
						
							|  |  |  |     replace_content('rhs', l2); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function nav(pair) { | 
					
						
							|  |  |  |     return pair[0]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function show(pair) { | 
					
						
							| 
									
										
										
										
											2013-09-19 20:29:25 +08:00
										 |  |  |     return jQuery.inArray(pair[1], user_tags) != -1; | 
					
						
							| 
									
										
										
										
											2012-06-13 00:36:24 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function leaf(pair) { | 
					
						
							|  |  |  |     return typeof(nav(pair)) == 'string'; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-19 20:29:25 +08:00
										 |  |  | function first_showable_child(pair) { | 
					
						
							|  |  |  |     var items = pair[0]; | 
					
						
							|  |  |  |     var ks = keys(items); | 
					
						
							|  |  |  |     for (var i = 0; i < ks.length; i++) { | 
					
						
							|  |  |  |         var child = items[ks[i]]; | 
					
						
							|  |  |  |         if (show(child)) return child; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return items[ks[0]]; // We'll end up not showing it anyway
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-13 00:36:24 +08:00
										 |  |  | function contains_current_highlight(val) { | 
					
						
							|  |  |  |     if (leaf(val)) { | 
					
						
							|  |  |  |         return current_highlight == nav(val); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else { | 
					
						
							|  |  |  |         var b = false; | 
					
						
							|  |  |  |         for (var k in val) { | 
					
						
							|  |  |  |             b |= contains_current_highlight(val[k]); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return b; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function obj_to_ul(val) { | 
					
						
							|  |  |  |     var res = '<ul>'; | 
					
						
							|  |  |  |     for (var k in val) { | 
					
						
							|  |  |  |         var obj = val[k]; | 
					
						
							| 
									
										
										
										
											2013-09-19 20:29:25 +08:00
										 |  |  |         if (show(obj)) { | 
					
						
							|  |  |  |             res += '<li>'; | 
					
						
							|  |  |  |             if (leaf(obj)) { | 
					
						
							|  |  |  |                 res += '<a href="' + nav(obj) + '"' + | 
					
						
							|  |  |  |                     (current_highlight == nav(obj) ? ' class="selected"' : '') + | 
					
						
							|  |  |  |                     '>' + k + '</a>'; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else { | 
					
						
							|  |  |  |                 res += obj_to_ul(nav(obj)); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             res += '</li>'; | 
					
						
							| 
									
										
										
										
											2012-06-13 00:36:24 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return res + '</ul>'; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-27 20:15:23 +08:00
										 |  |  | function full_refresh() { | 
					
						
							|  |  |  |     store_pref('position', x_position() + ',' + y_position()); | 
					
						
							|  |  |  |     location.reload(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function maybe_scroll() { | 
					
						
							|  |  |  |     var pos = get_pref('position'); | 
					
						
							|  |  |  |     if (pos) { | 
					
						
							|  |  |  |         clear_pref('position'); | 
					
						
							|  |  |  |         var xy = pos.split(","); | 
					
						
							|  |  |  |         window.scrollTo(parseInt(xy[0]), parseInt(xy[1])); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function x_position() { | 
					
						
							|  |  |  |     return window.pageXOffset ? | 
					
						
							|  |  |  |         window.pageXOffset : | 
					
						
							|  |  |  |         document.documentElement.scrollLeft ? | 
					
						
							|  |  |  |         document.documentElement.scrollLeft : | 
					
						
							|  |  |  |         document.body.scrollLeft; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function y_position() { | 
					
						
							|  |  |  |     return window.pageYOffset ? | 
					
						
							|  |  |  |         window.pageYOffset : | 
					
						
							|  |  |  |         document.documentElement.scrollTop ? | 
					
						
							|  |  |  |         document.documentElement.scrollTop : | 
					
						
							|  |  |  |         document.body.scrollTop; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-08 00:23:11 +08:00
										 |  |  | function with_update(fun) { | 
					
						
							| 
									
										
										
										
											2016-10-05 23:50:36 +08:00
										 |  |  |     if(outstanding_reqs.length > 0){ | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-10-12 00:05:06 +08:00
										 |  |  |     with_reqs(apply_state(current_reqs), [], function(json) { | 
					
						
							| 
									
										
										
										
											2010-08-23 23:32:17 +08:00
										 |  |  |             var html = format(current_template, json); | 
					
						
							| 
									
										
										
										
											2010-09-29 22:59:39 +08:00
										 |  |  |             fun(html); | 
					
						
							| 
									
										
										
										
											2010-08-31 23:44:12 +08:00
										 |  |  |             update_status('ok'); | 
					
						
							| 
									
										
										
										
											2010-08-24 01:32:33 +08:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2016-10-05 23:50:36 +08:00
										 |  |  |     return true; | 
					
						
							| 
									
										
										
										
											2010-08-24 01:32:33 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-12 00:05:06 +08:00
										 |  |  | function apply_state(reqs) { | 
					
						
							|  |  |  |     var reqs2 = {}; | 
					
						
							|  |  |  |     for (k in reqs) { | 
					
						
							|  |  |  |         var req = reqs[k]; | 
					
						
							| 
									
										
										
										
											2013-01-25 22:57:04 +08:00
										 |  |  |         var options = {}; | 
					
						
							|  |  |  |         if (typeof(req) == "object") { | 
					
						
							|  |  |  |             options = req.options; | 
					
						
							|  |  |  |             req = req.path; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-10-12 00:05:06 +08:00
										 |  |  |         var req2; | 
					
						
							| 
									
										
										
										
											2013-01-25 22:57:04 +08:00
										 |  |  |         if (options['vhost'] != undefined && current_vhost != '') { | 
					
						
							| 
									
										
										
										
											2015-10-22 18:46:52 +08:00
										 |  |  |             var indexPage = req.indexOf("?page="); | 
					
						
							|  |  |  |             if (indexPage >- 1) { | 
					
						
							| 
									
										
										
										
											2015-10-13 21:53:20 +08:00
										 |  |  | 				pageUrl = req.substr(indexPage); | 
					
						
							| 
									
										
										
										
											2015-10-22 20:35:37 +08:00
										 |  |  | 				req2 = req.substr(0,indexPage) + '/' + esc(current_vhost) + pageUrl; | 
					
						
							| 
									
										
										
										
											2015-10-13 21:53:20 +08:00
										 |  |  |             } else | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               req2 = req + '/' + esc(current_vhost); | 
					
						
							| 
									
										
										
										
											2010-10-12 00:05:06 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |         else { | 
					
						
							|  |  |  |             req2 = req; | 
					
						
							| 
									
										
										
										
											2010-10-08 00:23:11 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2012-12-20 01:58:36 +08:00
										 |  |  |         var qs = []; | 
					
						
							| 
									
										
										
										
											2013-01-25 22:57:04 +08:00
										 |  |  |         if (options['sort'] != undefined && current_sort != null) { | 
					
						
							| 
									
										
										
										
											2012-12-20 01:58:36 +08:00
										 |  |  |             qs.push('sort=' + current_sort); | 
					
						
							|  |  |  |             qs.push('sort_reverse=' + current_sort_reverse); | 
					
						
							| 
									
										
										
										
											2010-10-12 00:05:06 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2013-02-01 02:27:20 +08:00
										 |  |  |         if (options['ranges'] != undefined) { | 
					
						
							|  |  |  |             for (i in options['ranges']) { | 
					
						
							|  |  |  |                 var type = options['ranges'][i]; | 
					
						
							| 
									
										
										
										
											2014-09-25 18:44:51 +08:00
										 |  |  |                 var range = get_pref('chart-range').split('|'); | 
					
						
							| 
									
										
										
										
											2013-02-01 02:27:20 +08:00
										 |  |  |                 var prefix; | 
					
						
							|  |  |  |                 if (type.substring(0, 8) == 'lengths-') { | 
					
						
							|  |  |  |                     prefix = 'lengths'; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 else if (type.substring(0, 10) == 'msg-rates-') { | 
					
						
							|  |  |  |                     prefix = 'msg_rates'; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 else if (type.substring(0, 11) == 'data-rates-') { | 
					
						
							|  |  |  |                     prefix = 'data_rates'; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2014-06-11 23:33:53 +08:00
										 |  |  |                 else if (type == 'node-stats') { | 
					
						
							|  |  |  |                     prefix = 'node_stats'; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2013-02-01 02:27:20 +08:00
										 |  |  |                 qs.push(prefix + '_age=' + parseInt(range[0])); | 
					
						
							|  |  |  |                 qs.push(prefix + '_incr=' + parseInt(range[1])); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-10-12 00:05:06 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-06-16 18:31:54 +08:00
										 |  |  |         /* Unknown options are used as query parameters as is. */ | 
					
						
							|  |  |  |         Object.keys(options).forEach(function (key) { | 
					
						
							|  |  |  |           /* Skip known keys we already handled and undefined parameters. */ | 
					
						
							|  |  |  |           if (key == 'vhost' || key == 'sort' || key == 'ranges') | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |           if (!key || options[key] == undefined) | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           qs.push(esc(key) + '=' + esc(options[key])); | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2012-12-20 01:58:36 +08:00
										 |  |  |         qs = qs.join('&'); | 
					
						
							| 
									
										
										
										
											2015-11-03 16:23:05 +08:00
										 |  |  |         if (qs != '') | 
					
						
							|  |  |  |             if (req2.indexOf("?page=") >- 1) | 
					
						
							| 
									
										
										
										
											2015-10-22 15:55:36 +08:00
										 |  |  |             qs = '&' + qs; | 
					
						
							|  |  |  |              else | 
					
						
							|  |  |  |             qs = '?' + qs; | 
					
						
							| 
									
										
										
										
											2015-11-03 16:23:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-12 00:05:06 +08:00
										 |  |  |         reqs2[k] = req2 + qs; | 
					
						
							| 
									
										
										
										
											2010-10-08 00:23:11 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-10-12 00:05:06 +08:00
										 |  |  |     return reqs2; | 
					
						
							| 
									
										
										
										
											2010-10-08 00:23:11 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-28 22:34:15 +08:00
										 |  |  | function show_popup(type, text, mode) { | 
					
						
							| 
									
										
										
										
											2010-10-16 01:11:42 +08:00
										 |  |  |     var cssClass = '.form-popup-' + type; | 
					
						
							| 
									
										
										
										
											2010-10-15 01:09:36 +08:00
										 |  |  |     function hide() { | 
					
						
							| 
									
										
										
										
											2013-01-28 22:34:15 +08:00
										 |  |  |         if (mode == 'fade') { | 
					
						
							|  |  |  |             $(cssClass).fadeOut(200, function() { | 
					
						
							| 
									
										
										
										
											2010-10-15 01:09:36 +08:00
										 |  |  |                 $(this).remove(); | 
					
						
							|  |  |  |             }); | 
					
						
							| 
									
										
										
										
											2013-01-28 22:34:15 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |         else { | 
					
						
							|  |  |  |             $(cssClass).slideUp(200, function() { | 
					
						
							|  |  |  |                 $(this).remove(); | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-10-15 01:09:36 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     hide(); | 
					
						
							| 
									
										
										
										
											2015-12-23 21:18:36 +08:00
										 |  |  |     if ($(cssClass).length && type === 'help' && | 
					
						
							|  |  |  |         $(cssClass).text().indexOf(text.replace(/<[^>]*>/g, '')) != -1 ) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-10-16 01:11:42 +08:00
										 |  |  |     $('h1').after(format('error-popup', {'type': type, 'text': text})); | 
					
						
							| 
									
										
										
										
											2013-01-28 22:34:15 +08:00
										 |  |  |     if (mode == 'fade') { | 
					
						
							|  |  |  |         $(cssClass).fadeIn(200); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else { | 
					
						
							|  |  |  |         $(cssClass).center().slideDown(200); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-02-28 21:23:53 +08:00
										 |  |  |     $(cssClass + ' span').click(function () { | 
					
						
							|  |  |  |         $('.popup-owner').removeClass('popup-owner'); | 
					
						
							|  |  |  |         hide(); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2010-09-09 01:00:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-16 18:50:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-17 13:31:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-16 18:50:03 +08:00
										 |  |  |    function submit_import(form) { | 
					
						
							|  |  |  |        var idx = $("select[name='vhost-upload'] option:selected").index() | 
					
						
							| 
									
										
										
										
											2016-02-18 00:25:31 +08:00
										 |  |  |        var vhost = ((idx <=0 ) ? "" : "/" + esc($("select[name='vhost-upload'] option:selected").val())); | 
					
						
							|  |  |  |        form.action ="api/definitions" + vhost + '?auth=' + get_pref('auth'); | 
					
						
							| 
									
										
										
										
											2016-02-16 18:50:03 +08:00
										 |  |  |        form.submit(); | 
					
						
							|  |  |  |      }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-24 01:32:33 +08:00
										 |  |  | function postprocess() { | 
					
						
							| 
									
										
										
										
											2016-12-30 23:52:13 +08:00
										 |  |  |     $('form.confirm-queue').submit(function() { | 
					
						
							|  |  |  |         return confirm("Are you sure? The queue is going to be deleted. " + | 
					
						
							|  |  |  |                        "Messages cannot be recovered after deletion."); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |     $('form.confirm-purge-queue').submit(function() { | 
					
						
							|  |  |  |         return confirm("Are you sure? Messages cannot be recovered after purging."); | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2010-08-24 17:24:50 +08:00
										 |  |  |     $('form.confirm').submit(function() { | 
					
						
							|  |  |  |             return confirm("Are you sure? This object cannot be recovered " + | 
					
						
							|  |  |  |                            "after deletion."); | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2015-02-27 20:34:04 +08:00
										 |  |  |     $('div.section h2, div.section-hidden h2').die().live('click', function() { | 
					
						
							| 
									
										
										
										
											2011-01-18 01:12:03 +08:00
										 |  |  |             toggle_visibility($(this)); | 
					
						
							| 
									
										
										
										
											2010-08-24 17:57:19 +08:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2010-08-25 17:46:08 +08:00
										 |  |  |     $('label').map(function() { | 
					
						
							|  |  |  |             if ($(this).attr('for') == '') { | 
					
						
							|  |  |  |                 var id = 'auto-label-' + Math.floor(Math.random()*1000000000); | 
					
						
							|  |  |  |                 var input = $(this).parents('tr').first().find('input, select'); | 
					
						
							| 
									
										
										
										
											2010-09-29 20:22:46 +08:00
										 |  |  |                 if (input.attr('id') == '') { | 
					
						
							|  |  |  |                     $(this).attr('for', id); | 
					
						
							|  |  |  |                     input.attr('id', id); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2010-08-25 17:46:08 +08:00
										 |  |  |             } | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2011-10-13 23:32:55 +08:00
										 |  |  |     $('#download-definitions').click(function() { | 
					
						
							| 
									
										
										
										
											2016-02-16 00:21:14 +08:00
										 |  |  |             var idx = $("select[name='vhost-download'] option:selected").index() | 
					
						
							| 
									
										
										
										
											2016-02-16 00:33:01 +08:00
										 |  |  |             var vhost = ((idx <=0 ) ? "" : "/" + esc($("select[name='vhost-download'] option:selected").val())); | 
					
						
							| 
									
										
										
										
											2016-02-16 00:21:14 +08:00
										 |  |  |             var path = 'api/definitions' + vhost + '?download=' + | 
					
						
							| 
									
										
										
										
											2013-05-10 00:26:19 +08:00
										 |  |  |                 esc($('#download-filename').val()) + | 
					
						
							| 
									
										
										
										
											2014-09-23 00:45:53 +08:00
										 |  |  |                 '&auth=' + get_pref('auth'); | 
					
						
							| 
									
										
										
										
											2010-10-01 01:28:28 +08:00
										 |  |  |             window.location = path; | 
					
						
							|  |  |  |             setTimeout('app.run()'); | 
					
						
							| 
									
										
										
										
											2010-09-29 20:22:46 +08:00
										 |  |  |             return false; | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2016-02-16 18:50:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-09 20:17:19 +08:00
										 |  |  |     $('.update-manual').click(function() { | 
					
						
							|  |  |  |             update_manual($(this).attr('for'), $(this).attr('query')); | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2011-01-28 01:18:21 +08:00
										 |  |  |     $('input, select').die(); | 
					
						
							| 
									
										
										
										
											2013-05-14 01:10:59 +08:00
										 |  |  |     $('.multifield input').live('keyup', function() { | 
					
						
							|  |  |  |             update_multifields(); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |     $('.multifield select').live('change', function() { | 
					
						
							| 
									
										
										
										
											2010-10-12 21:08:17 +08:00
										 |  |  |             update_multifields(); | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2011-05-25 22:50:31 +08:00
										 |  |  |     $('.controls-appearance').change(function() { | 
					
						
							| 
									
										
										
										
											2013-11-22 23:32:44 +08:00
										 |  |  |         var params = $(this).get(0).options; | 
					
						
							|  |  |  |         var selected = $(this).val(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for (i = 0; i < params.length; i++) { | 
					
						
							|  |  |  |             var param = params[i].value; | 
					
						
							|  |  |  |             if (param == selected) { | 
					
						
							|  |  |  |                 $('#' + param + '-div').slideDown(100); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 $('#' + param + '-div').slideUp(100); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-12-09 01:40:10 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2011-01-17 21:25:21 +08:00
										 |  |  |     $('.help').die().live('click', function() { | 
					
						
							| 
									
										
										
										
											2015-04-14 05:22:19 +08:00
										 |  |  |         help($(this).attr('id')); | 
					
						
							| 
									
										
										
										
											2011-01-17 21:25:21 +08:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2014-09-19 22:19:43 +08:00
										 |  |  |     $('.popup-options-link').die().live('click', function() { | 
					
						
							| 
									
										
										
										
											2013-02-28 21:23:53 +08:00
										 |  |  |         var remove = $('.popup-owner').length == 1 && | 
					
						
							|  |  |  |                      $('.popup-owner').get(0) == $(this).get(0); | 
					
						
							|  |  |  |         $('.popup-owner').removeClass('popup-owner'); | 
					
						
							|  |  |  |         if (remove) { | 
					
						
							| 
									
										
										
										
											2014-09-19 22:19:43 +08:00
										 |  |  |             $('.form-popup-options').fadeOut(200, function() { | 
					
						
							| 
									
										
										
										
											2013-02-28 21:23:53 +08:00
										 |  |  |                 $(this).remove(); | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else { | 
					
						
							|  |  |  |             $(this).addClass('popup-owner'); | 
					
						
							| 
									
										
										
										
											2014-09-19 22:19:43 +08:00
										 |  |  |             var template = $(this).attr('type') + '-options'; | 
					
						
							|  |  |  |             show_popup('options', format(template, {span: $(this)}), | 
					
						
							| 
									
										
										
										
											2013-02-28 21:23:53 +08:00
										 |  |  |                        'fade'); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2012-11-16 21:27:31 +08:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2014-06-05 00:44:19 +08:00
										 |  |  |     $('.rate-visibility-option').die().live('click', function() { | 
					
						
							|  |  |  |         var k = $(this).attr('data-pref'); | 
					
						
							|  |  |  |         var show = get_pref(k) !== 'true'; | 
					
						
							|  |  |  |         store_pref(k, '' + show); | 
					
						
							|  |  |  |         partial_update(); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2011-01-28 01:18:21 +08:00
										 |  |  |     $('input, select').live('focus', function() { | 
					
						
							|  |  |  |         update_counter = 0; // If there's interaction, reset the counter.
 | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2012-12-11 19:22:29 +08:00
										 |  |  |     $('.tag-link').click(function() { | 
					
						
							|  |  |  |         $('#tags').val($(this).attr('tag')); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2014-09-11 23:27:39 +08:00
										 |  |  |     $('.argument-link').click(function() { | 
					
						
							|  |  |  |         var field = $(this).attr('field'); | 
					
						
							|  |  |  |         var row = $('#' + field).find('.mf').last(); | 
					
						
							|  |  |  |         var key = row.find('input').first(); | 
					
						
							| 
									
										
										
										
											2017-01-03 15:49:36 +08:00
										 |  |  |         var value = row.find('input').last(); | 
					
						
							| 
									
										
										
										
											2014-09-11 23:27:39 +08:00
										 |  |  |         var type = row.find('select').last(); | 
					
						
							|  |  |  |         key.val($(this).attr('key')); | 
					
						
							| 
									
										
										
										
											2017-01-03 15:49:36 +08:00
										 |  |  |         value.val($(this).attr('value')); | 
					
						
							| 
									
										
										
										
											2014-09-11 23:27:39 +08:00
										 |  |  |         type.val($(this).attr('type')); | 
					
						
							|  |  |  |         update_multifields(); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2012-11-16 21:27:31 +08:00
										 |  |  |     $('form.auto-submit select, form.auto-submit input').live('click', function(){ | 
					
						
							|  |  |  |         $(this).parents('form').submit(); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2013-04-08 21:00:06 +08:00
										 |  |  |     $('#filter').die().live('keyup', debounce(update_filter, 500)); | 
					
						
							| 
									
										
										
										
											2013-11-13 19:09:44 +08:00
										 |  |  |     $('#filter-regex-mode').change(update_filter_regex_mode); | 
					
						
							| 
									
										
										
										
											2013-04-25 23:13:44 +08:00
										 |  |  |     $('#truncate').die().live('keyup', debounce(update_truncate, 500)); | 
					
						
							| 
									
										
										
										
											2010-09-30 20:19:54 +08:00
										 |  |  |     if (! user_administrator) { | 
					
						
							|  |  |  |         $('.administrator-only').remove(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-11-03 16:23:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-12 21:08:17 +08:00
										 |  |  |     update_multifields(); | 
					
						
							| 
									
										
										
										
											2010-08-07 00:52:26 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-15 18:44:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-22 18:46:52 +08:00
										 |  |  | function url_pagination_template(template, defaultPage, defaultPageSize){ | 
					
						
							| 
									
										
										
										
											2015-11-13 05:25:01 +08:00
										 |  |  |    return  '/' + template + '?page=' + fmt_page_number_request(template, defaultPage) + | 
					
						
							| 
									
										
										
										
											2016-01-26 06:51:53 +08:00
										 |  |  |                        '&page_size=' +  fmt_page_size_request(template, defaultPageSize) + | 
					
						
							| 
									
										
										
										
											2015-11-13 05:25:01 +08:00
										 |  |  |                        '&name=' + fmt_filter_name_request(template, "") + | 
					
						
							| 
									
										
										
										
											2016-01-26 06:51:53 +08:00
										 |  |  |                        '&use_regex=' + ((fmt_regex_request(template,"") == "checked" ? 'true' : 'false')); | 
					
						
							| 
									
										
										
										
											2015-11-13 05:25:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-15 18:44:36 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-22 15:55:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-17 23:59:49 +08:00
										 |  |  | function stored_page_info(template, page_start){ | 
					
						
							|  |  |  |     var pageSize = $('#' + template+'-pagesize').val(); | 
					
						
							| 
									
										
										
										
											2015-11-18 00:31:55 +08:00
										 |  |  |     var filterName = $('#' + template+'-name').val(); | 
					
						
							| 
									
										
										
										
											2016-01-26 06:51:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-17 23:59:49 +08:00
										 |  |  |     store_pref(template + '_current_page_number', page_start); | 
					
						
							| 
									
										
										
										
											2015-11-13 05:25:01 +08:00
										 |  |  |     if (filterName != null && filterName != undefined) { | 
					
						
							| 
									
										
										
										
											2015-11-17 23:59:49 +08:00
										 |  |  |         store_pref(template + '_current_filter_name', filterName); | 
					
						
							| 
									
										
										
										
											2015-11-13 05:25:01 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-11-17 23:59:49 +08:00
										 |  |  |     var regex_on =  $("#" + template + "-filter-regex-mode").is(':checked'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (regex_on != null && regex_on != undefined) { | 
					
						
							|  |  |  |         store_pref(template + '_current_regex', regex_on ? "checked" : " " ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-03 16:23:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-22 18:46:52 +08:00
										 |  |  |     if (pageSize != null && pageSize != undefined) { | 
					
						
							| 
									
										
										
										
											2015-11-17 23:59:49 +08:00
										 |  |  |         store_pref(template + '_current_page_size', pageSize); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-01-26 06:51:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-13 21:53:20 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-17 23:59:49 +08:00
										 |  |  | function update_pages(template, page_start){ | 
					
						
							| 
									
										
										
										
											2015-11-18 00:31:55 +08:00
										 |  |  |      stored_page_info(template, page_start); | 
					
						
							| 
									
										
										
										
											2015-11-17 23:59:49 +08:00
										 |  |  |      switch (template) { | 
					
						
							|  |  |  |          case 'queues' : renderQueues(); break; | 
					
						
							|  |  |  |          case 'exchanges' : renderExchanges(); break; | 
					
						
							| 
									
										
										
										
											2015-11-20 16:57:22 +08:00
										 |  |  |          case 'connections' : renderConnections(); break; | 
					
						
							| 
									
										
										
										
											2015-11-17 23:59:49 +08:00
										 |  |  |          case 'channels' : renderChannels(); break; | 
					
						
							|  |  |  |      } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-10-13 21:53:20 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-17 23:59:49 +08:00
										 |  |  | function renderQueues() { | 
					
						
							|  |  |  |     render({'queues':  {path: url_pagination_template('queues', 1, 100), | 
					
						
							|  |  |  |                         options: {sort:true, vhost:true, pagination:true}}, | 
					
						
							|  |  |  |                         'vhosts': '/vhosts'}, 'queues', '#/queues'); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function renderExchanges() { | 
					
						
							|  |  |  |     render({'exchanges':  {path: url_pagination_template('exchanges', 1, 100), | 
					
						
							|  |  |  |                           options: {sort:true, vhost:true, pagination:true}}, | 
					
						
							|  |  |  |                          'vhosts': '/vhosts'}, 'exchanges', '#/exchanges'); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function renderConnections() { | 
					
						
							| 
									
										
										
										
											2016-01-26 06:51:53 +08:00
										 |  |  |     render({'connections': {path:  url_pagination_template('connections', 1, 100), | 
					
						
							| 
									
										
										
										
											2015-11-17 23:59:49 +08:00
										 |  |  |                             options: {sort:true}}}, | 
					
						
							|  |  |  |                             'connections', '#/connections'); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function renderChannels() { | 
					
						
							| 
									
										
										
										
											2016-01-26 06:51:53 +08:00
										 |  |  |     render({'channels': {path:  url_pagination_template('channels', 1, 100), | 
					
						
							| 
									
										
										
										
											2015-11-17 23:59:49 +08:00
										 |  |  |                         options: {sort:true}}}, | 
					
						
							|  |  |  |                         'channels', '#/channels'); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-13 05:25:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-24 18:28:51 +08:00
										 |  |  | function update_pages_from_ui(sender) { | 
					
						
							|  |  |  |     update_pages(current_template, !!$(sender).attr('data-page-start') ? $(sender).attr('data-page-start') : $(sender).val()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-17 23:59:49 +08:00
										 |  |  | function postprocess_partial() { | 
					
						
							| 
									
										
										
										
											2016-01-24 18:28:51 +08:00
										 |  |  |     $('.pagination_class_input').keypress(function(e) { | 
					
						
							|  |  |  |         if (e.keyCode == 13) { | 
					
						
							|  |  |  |             update_pages_from_ui(this); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $('.pagination_class_checkbox').click(function(e) { | 
					
						
							|  |  |  |         update_pages_from_ui(this); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $('.pagination_class_select').change(function(e) { | 
					
						
							|  |  |  |         update_pages_from_ui(this); | 
					
						
							| 
									
										
										
										
											2015-11-13 05:25:01 +08:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-27 20:34:04 +08:00
										 |  |  |     setup_visibility(); | 
					
						
							| 
									
										
										
										
											2010-10-12 00:05:06 +08:00
										 |  |  |     $('.sort').click(function() { | 
					
						
							|  |  |  |             var sort = $(this).attr('sort'); | 
					
						
							|  |  |  |             if (current_sort == sort) { | 
					
						
							|  |  |  |                 current_sort_reverse = ! current_sort_reverse; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else { | 
					
						
							|  |  |  |                 current_sort = sort; | 
					
						
							|  |  |  |                 current_sort_reverse = false; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             update(); | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2013-04-26 19:30:52 +08:00
										 |  |  |     // TODO remove this hack when we get rid of "updatable"
 | 
					
						
							|  |  |  |     if ($('#filter-warning-show').length > 0) { | 
					
						
							|  |  |  |         $('#filter-truncate').addClass('filter-warning'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else { | 
					
						
							|  |  |  |         $('#filter-truncate').removeClass('filter-warning'); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-10-12 00:05:06 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-12 21:08:17 +08:00
										 |  |  | function update_multifields() { | 
					
						
							| 
									
										
										
										
											2013-05-14 01:10:59 +08:00
										 |  |  |     $('div.multifield').each(function(index) { | 
					
						
							|  |  |  |         update_multifield($(this), true); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function update_multifield(multifield, dict) { | 
					
						
							|  |  |  |     var largest_id = 0; | 
					
						
							|  |  |  |     var empty_found = false; | 
					
						
							|  |  |  |     var name = multifield.attr('id'); | 
					
						
							| 
									
										
										
										
											2014-09-11 23:27:39 +08:00
										 |  |  |     var type_inputs = $('#' + name + ' *[name$="_mftype"]'); | 
					
						
							|  |  |  |     type_inputs.each(function(index) { | 
					
						
							| 
									
										
										
										
											2013-05-14 01:10:59 +08:00
										 |  |  |         var re = new RegExp(name + '_([0-9]*)_mftype'); | 
					
						
							|  |  |  |         var match = $(this).attr('name').match(re); | 
					
						
							|  |  |  |         if (!match) return; | 
					
						
							|  |  |  |         var id = parseInt(match[1]); | 
					
						
							|  |  |  |         largest_id = Math.max(id, largest_id); | 
					
						
							|  |  |  |         var prefix = name + '_' + id; | 
					
						
							|  |  |  |         var type = $(this).val(); | 
					
						
							|  |  |  |         var input = $('#' + prefix + '_mfvalue'); | 
					
						
							|  |  |  |         if (type == 'list') { | 
					
						
							|  |  |  |             if (input.size() == 1) { | 
					
						
							|  |  |  |                 input.replaceWith('<div class="multifield-sub" id="' + prefix + | 
					
						
							|  |  |  |                                   '"></div>'); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             update_multifield($('#' + prefix), false); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else { | 
					
						
							|  |  |  |             if (input.size() == 1) { | 
					
						
							|  |  |  |                 var key = dict ? $('#' + prefix + '_mfkey').val() : ''; | 
					
						
							|  |  |  |                 var value = input.val(); | 
					
						
							|  |  |  |                 if (key == '' && value == '') { | 
					
						
							| 
									
										
										
										
											2014-09-11 23:27:39 +08:00
										 |  |  |                     if (index == type_inputs.length - 1) { | 
					
						
							|  |  |  |                         empty_found = true; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     else { | 
					
						
							|  |  |  |                         $(this).parents('.mf').first().remove(); | 
					
						
							| 
									
										
										
										
											2010-10-12 21:08:17 +08:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2012-05-02 00:52:04 +08:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2010-10-12 21:08:17 +08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2013-05-14 01:10:59 +08:00
										 |  |  |             else { | 
					
						
							|  |  |  |                 $('#' + prefix).replaceWith(multifield_input(prefix, 'value', | 
					
						
							|  |  |  |                                                              'text')); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |     if (!empty_found) { | 
					
						
							|  |  |  |         var prefix = name + '_' + (largest_id + 1); | 
					
						
							|  |  |  |         var t = multifield.hasClass('string-only') ? 'hidden' : 'select'; | 
					
						
							|  |  |  |         var val_type = multifield_input(prefix, 'value', 'text') + ' ' + | 
					
						
							|  |  |  |             multifield_input(prefix, 'type', t); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (dict) { | 
					
						
							| 
									
										
										
										
											2014-09-11 23:27:39 +08:00
										 |  |  |             multifield.append('<table class="mf"><tr><td>' + | 
					
						
							| 
									
										
										
										
											2013-05-14 01:10:59 +08:00
										 |  |  |                               multifield_input(prefix, 'key', 'text') + | 
					
						
							|  |  |  |                               '</td><td class="equals"> = </td><td>' + | 
					
						
							|  |  |  |                               val_type + '</td></tr></table>'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else { | 
					
						
							| 
									
										
										
										
											2014-09-11 23:27:39 +08:00
										 |  |  |             multifield.append('<div class="mf">' + val_type + '</div>'); | 
					
						
							| 
									
										
										
										
											2013-05-14 01:10:59 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function multifield_input(prefix, suffix, type) { | 
					
						
							|  |  |  |     if (type == 'hidden' ) { | 
					
						
							|  |  |  |         return '<input type="hidden" id="' + prefix + '_mf' + suffix + | 
					
						
							|  |  |  |             '" name="' + prefix + '_mf' + suffix + '" value="string"/>'; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (type == 'text' ) { | 
					
						
							|  |  |  |         return '<input type="text" id="' + prefix + '_mf' + suffix + | 
					
						
							|  |  |  |             '" name="' + prefix + '_mf' + suffix + '" value=""/>'; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (type == 'select' ) { | 
					
						
							|  |  |  |         return '<select id="' + prefix + '_mf' + suffix + '" name="' + prefix + | 
					
						
							|  |  |  |             '_mf' + suffix + '">' + | 
					
						
							|  |  |  |             '<option value="string">String</option>' + | 
					
						
							|  |  |  |             '<option value="number">Number</option>' + | 
					
						
							|  |  |  |             '<option value="boolean">Boolean</option>' + | 
					
						
							|  |  |  |             '<option value="list">List</option>' + | 
					
						
							|  |  |  |             '</select>'; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-10-12 21:08:17 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-13 19:09:44 +08:00
										 |  |  | function update_filter_regex(jElem) { | 
					
						
							| 
									
										
										
										
											2013-11-13 00:41:31 +08:00
										 |  |  |     current_filter_regex = null; | 
					
						
							| 
									
										
										
										
											2013-11-13 19:09:44 +08:00
										 |  |  |     jElem.parents('.filter').children('.status-error').remove(); | 
					
						
							|  |  |  |     if (current_filter_regex_on && $.trim(current_filter).length > 0) { | 
					
						
							| 
									
										
										
										
											2013-11-13 00:41:31 +08:00
										 |  |  |         try { | 
					
						
							|  |  |  |             current_filter_regex = new RegExp(current_filter,'i'); | 
					
						
							| 
									
										
										
										
											2013-11-13 19:09:44 +08:00
										 |  |  |         } catch (e) { | 
					
						
							|  |  |  |             jElem.parents('.filter').append('<p class="status-error">' + | 
					
						
							|  |  |  |                                             e.message + '</p>'); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2013-11-13 00:41:31 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function update_filter_regex_mode() { | 
					
						
							|  |  |  |     current_filter_regex_on = $(this).is(':checked'); | 
					
						
							| 
									
										
										
										
											2013-11-13 19:09:44 +08:00
										 |  |  |     update_filter_regex($(this)); | 
					
						
							| 
									
										
										
										
											2013-11-13 00:41:31 +08:00
										 |  |  |     partial_update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-08 21:00:06 +08:00
										 |  |  | function update_filter() { | 
					
						
							|  |  |  |     current_filter = $(this).val(); | 
					
						
							| 
									
										
										
										
											2013-11-13 01:09:02 +08:00
										 |  |  |     var table = $(this).parents('table').first(); | 
					
						
							|  |  |  |     table.removeClass('filter-active'); | 
					
						
							|  |  |  |     if ($(this).val() != '') { | 
					
						
							|  |  |  |         table.addClass('filter-active'); | 
					
						
							| 
									
										
										
										
											2013-04-26 17:50:46 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-11-13 19:09:44 +08:00
										 |  |  |     update_filter_regex($(this)); | 
					
						
							| 
									
										
										
										
											2013-04-26 17:50:46 +08:00
										 |  |  |     partial_update(); | 
					
						
							| 
									
										
										
										
											2013-04-25 23:13:44 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function update_truncate() { | 
					
						
							| 
									
										
										
										
											2013-04-26 19:59:53 +08:00
										 |  |  |     var current_truncate_str = | 
					
						
							|  |  |  |         $(this).val().replace(new RegExp('\\D', 'g'), ''); | 
					
						
							|  |  |  |     if (current_truncate_str == '') | 
					
						
							|  |  |  |         current_truncate_str = '0'; | 
					
						
							|  |  |  |     if ($(this).val() != current_truncate_str) | 
					
						
							|  |  |  |         $(this).val(current_truncate_str); | 
					
						
							|  |  |  |     current_truncate = parseInt(current_truncate_str, 10); | 
					
						
							| 
									
										
										
										
											2013-04-25 23:13:44 +08:00
										 |  |  |     store_pref('truncate', current_truncate); | 
					
						
							| 
									
										
										
										
											2013-04-08 21:00:06 +08:00
										 |  |  |     partial_update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-18 01:12:03 +08:00
										 |  |  | function setup_visibility() { | 
					
						
							|  |  |  |     $('div.section,div.section-hidden').each(function(_index) { | 
					
						
							|  |  |  |         var pref = section_pref(current_template, | 
					
						
							|  |  |  |                                 $(this).children('h2').text()); | 
					
						
							|  |  |  |         var show = get_pref(pref); | 
					
						
							|  |  |  |         if (show == null) { | 
					
						
							|  |  |  |             show = $(this).hasClass('section'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else { | 
					
						
							| 
									
										
										
										
											2011-01-18 02:13:00 +08:00
										 |  |  |             show = show == 't'; | 
					
						
							| 
									
										
										
										
											2011-01-18 01:12:03 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |         if (show) { | 
					
						
							|  |  |  |             $(this).addClass('section-visible'); | 
					
						
							| 
									
										
										
										
											2014-10-02 22:41:36 +08:00
										 |  |  |             // Workaround for... something. Although div.hider is
 | 
					
						
							|  |  |  |             // display:block anyway, not explicitly setting this
 | 
					
						
							|  |  |  |             // prevents the first slideToggle() from animating
 | 
					
						
							|  |  |  |             // successfully; instead the element just vanishes.
 | 
					
						
							|  |  |  |             $(this).find('.hider').attr('style', 'display:block;'); | 
					
						
							| 
									
										
										
										
											2011-01-18 01:12:03 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |         else { | 
					
						
							|  |  |  |             $(this).addClass('section-invisible'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function toggle_visibility(item) { | 
					
						
							|  |  |  |     var hider = item.next(); | 
					
						
							|  |  |  |     var all = item.parent(); | 
					
						
							|  |  |  |     var pref = section_pref(current_template, item.text()); | 
					
						
							|  |  |  |     item.next().slideToggle(100); | 
					
						
							|  |  |  |     if (all.hasClass('section-visible')) { | 
					
						
							|  |  |  |         if (all.hasClass('section')) | 
					
						
							| 
									
										
										
										
											2011-01-18 02:13:00 +08:00
										 |  |  |             store_pref(pref, 'f'); | 
					
						
							| 
									
										
										
										
											2011-01-18 01:12:03 +08:00
										 |  |  |         else | 
					
						
							|  |  |  |             clear_pref(pref); | 
					
						
							|  |  |  |         all.removeClass('section-visible'); | 
					
						
							|  |  |  |         all.addClass('section-invisible'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else { | 
					
						
							|  |  |  |         if (all.hasClass('section-hidden')) | 
					
						
							| 
									
										
										
										
											2011-01-18 02:13:00 +08:00
										 |  |  |             store_pref(pref, 't'); | 
					
						
							| 
									
										
										
										
											2011-01-18 01:12:03 +08:00
										 |  |  |         else | 
					
						
							|  |  |  |             clear_pref(pref); | 
					
						
							|  |  |  |         all.removeClass('section-invisible'); | 
					
						
							|  |  |  |         all.addClass('section-visible'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-25 22:17:27 +08:00
										 |  |  | function publish_msg(params0) { | 
					
						
							|  |  |  |     var params = params_magic(params0); | 
					
						
							| 
									
										
										
										
											2011-02-24 01:59:34 +08:00
										 |  |  |     var path = fill_path_template('/exchanges/:vhost/:name/publish', params); | 
					
						
							| 
									
										
										
										
											2011-02-25 22:17:27 +08:00
										 |  |  |     params['payload_encoding'] = 'string'; | 
					
						
							|  |  |  |     params['properties'] = {}; | 
					
						
							| 
									
										
										
										
											2011-02-25 22:27:09 +08:00
										 |  |  |     params['properties']['delivery_mode'] = parseInt(params['delivery_mode']); | 
					
						
							| 
									
										
										
										
											2011-02-25 22:17:27 +08:00
										 |  |  |     if (params['headers'] != '') | 
					
						
							|  |  |  |         params['properties']['headers'] = params['headers']; | 
					
						
							| 
									
										
										
										
											2014-04-24 20:20:29 +08:00
										 |  |  |     var props = [['content_type',     'str'], | 
					
						
							|  |  |  |                  ['content_encoding', 'str'], | 
					
						
							|  |  |  |                  ['correlation_id',   'str'], | 
					
						
							|  |  |  |                  ['reply_to',         'str'], | 
					
						
							|  |  |  |                  ['expiration',       'str'], | 
					
						
							|  |  |  |                  ['message_id',       'str'], | 
					
						
							|  |  |  |                  ['type',             'str'], | 
					
						
							|  |  |  |                  ['user_id',          'str'], | 
					
						
							|  |  |  |                  ['app_id',           'str'], | 
					
						
							|  |  |  |                  ['cluster_id',       'str'], | 
					
						
							|  |  |  |                  ['priority',         'int'], | 
					
						
							|  |  |  |                  ['timestamp',        'int']]; | 
					
						
							| 
									
										
										
										
											2011-02-25 22:17:27 +08:00
										 |  |  |     for (var i in props) { | 
					
						
							| 
									
										
										
										
											2014-04-24 20:20:29 +08:00
										 |  |  |         var name = props[i][0]; | 
					
						
							|  |  |  |         var type = props[i][1]; | 
					
						
							|  |  |  |         if (params['props'][name] != undefined && params['props'][name] != '') { | 
					
						
							|  |  |  |             var value = params['props'][name]; | 
					
						
							|  |  |  |             if (type == 'int') value = parseInt(value); | 
					
						
							|  |  |  |             params['properties'][name] = value; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2011-02-25 22:17:27 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-02-24 01:59:34 +08:00
										 |  |  |     with_req('POST', path, JSON.stringify(params), function(resp) { | 
					
						
							|  |  |  |             var result = jQuery.parseJSON(resp.responseText); | 
					
						
							|  |  |  |             if (result.routed) { | 
					
						
							|  |  |  |                 show_popup('info', 'Message published.'); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 show_popup('warn', 'Message published, but not routed.'); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-22 22:00:20 +08:00
										 |  |  | function get_msgs(params) { | 
					
						
							|  |  |  |     var path = fill_path_template('/queues/:vhost/:name/get', params); | 
					
						
							|  |  |  |     with_req('POST', path, JSON.stringify(params), function(resp) { | 
					
						
							|  |  |  |             var msgs = jQuery.parseJSON(resp.responseText); | 
					
						
							|  |  |  |             if (msgs.length == 0) { | 
					
						
							|  |  |  |                 show_popup('info', 'Queue is empty'); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 $('#msg-wrapper').slideUp(200); | 
					
						
							|  |  |  |                 replace_content('msg-wrapper', format('messages', {'msgs': msgs})); | 
					
						
							|  |  |  |                 $('#msg-wrapper').slideDown(200); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2011-02-22 02:20:33 +08:00
										 |  |  |         }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-07 00:52:26 +08:00
										 |  |  | function with_reqs(reqs, acc, fun) { | 
					
						
							| 
									
										
										
										
											2010-09-02 19:58:34 +08:00
										 |  |  |     if (keys(reqs).length > 0) { | 
					
						
							|  |  |  |         var key = keys(reqs)[0]; | 
					
						
							| 
									
										
										
										
											2011-02-22 22:00:20 +08:00
										 |  |  |         with_req('GET', reqs[key], null, function(resp) { | 
					
						
							| 
									
										
										
										
											2010-08-31 23:44:12 +08:00
										 |  |  |                 acc[key] = jQuery.parseJSON(resp.responseText); | 
					
						
							|  |  |  |                 var remainder = {}; | 
					
						
							|  |  |  |                 for (var k in reqs) { | 
					
						
							|  |  |  |                     if (k != key) remainder[k] = reqs[k]; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 with_reqs(remainder, acc, fun); | 
					
						
							| 
									
										
										
										
											2010-08-07 00:52:26 +08:00
										 |  |  |             }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else { | 
					
						
							|  |  |  |         fun(acc); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-13 00:31:16 +08:00
										 |  |  | function replace_content(id, html) { | 
					
						
							| 
									
										
										
										
											2011-01-28 19:12:29 +08:00
										 |  |  |     $("#" + id).html(html); | 
					
						
							| 
									
										
										
										
											2010-07-13 00:31:16 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-20 21:31:59 +08:00
										 |  |  | var ejs_cached = {}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-12 22:04:42 +08:00
										 |  |  | function format(template, json) { | 
					
						
							| 
									
										
										
										
											2014-10-06 20:05:52 +08:00
										 |  |  |     try { | 
					
						
							| 
									
										
										
										
											2013-09-20 21:31:59 +08:00
										 |  |  |         var cache = true; | 
					
						
							|  |  |  |         if (!(template in ejs_cached)) { | 
					
						
							|  |  |  |             ejs_cached[template] = true; | 
					
						
							|  |  |  |             cache = false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         var tmpl = new EJS({url: 'js/tmpl/' + template + '.ejs', cache: cache}); | 
					
						
							| 
									
										
										
										
											2010-07-17 00:38:06 +08:00
										 |  |  |         return tmpl.render(json); | 
					
						
							| 
									
										
										
										
											2014-10-06 20:05:52 +08:00
										 |  |  |     } catch (err) { | 
					
						
							|  |  |  |         clearInterval(timer); | 
					
						
							|  |  |  |         debug(err['name'] + ": " + err['message']); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-07-12 22:04:42 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-31 23:44:12 +08:00
										 |  |  | function update_status(status) { | 
					
						
							| 
									
										
										
										
											2010-07-13 00:31:16 +08:00
										 |  |  |     var text; | 
					
						
							|  |  |  |     if (status == 'ok') | 
					
						
							| 
									
										
										
										
											2011-01-14 19:45:45 +08:00
										 |  |  |         text = "Last update: " + fmt_date(new Date()); | 
					
						
							| 
									
										
										
										
											2011-01-14 19:33:34 +08:00
										 |  |  |     else if (status == 'error') { | 
					
						
							|  |  |  |         var next_try = new Date(new Date().getTime() + timer_interval); | 
					
						
							|  |  |  |         text = "Error: could not connect to server since " + | 
					
						
							| 
									
										
										
										
											2011-01-14 19:45:45 +08:00
										 |  |  |             fmt_date(last_successful_connect) + ".<br/>Will retry at " + | 
					
						
							|  |  |  |             fmt_date(next_try) + "."; | 
					
						
							| 
									
										
										
										
											2011-01-14 19:33:34 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-09-29 22:59:39 +08:00
										 |  |  |     else | 
					
						
							|  |  |  |         throw("Unknown status " + status); | 
					
						
							| 
									
										
										
										
											2010-07-13 00:31:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-17 00:38:06 +08:00
										 |  |  |     var html = format('status', {status: status, text: text}); | 
					
						
							| 
									
										
										
										
											2010-07-13 00:31:16 +08:00
										 |  |  |     replace_content('status', html); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-23 23:35:17 +08:00
										 |  |  | function auth_header() { | 
					
						
							| 
									
										
										
										
											2014-09-23 00:45:53 +08:00
										 |  |  |     return "Basic " + decodeURIComponent(get_pref('auth')); | 
					
						
							| 
									
										
										
										
											2012-10-23 23:35:17 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-22 22:00:20 +08:00
										 |  |  | function with_req(method, path, body, fun) { | 
					
						
							| 
									
										
										
										
											2010-07-12 22:04:42 +08:00
										 |  |  |     var json; | 
					
						
							| 
									
										
										
										
											2010-09-03 20:23:04 +08:00
										 |  |  |     var req = xmlHttpRequest(); | 
					
						
							| 
									
										
										
										
											2011-06-08 00:25:00 +08:00
										 |  |  |     req.open(method, 'api' + path, true ); | 
					
						
							| 
									
										
										
										
											2012-10-23 23:35:17 +08:00
										 |  |  |     req.setRequestHeader('authorization', auth_header()); | 
					
						
							| 
									
										
										
										
											2015-04-14 05:22:19 +08:00
										 |  |  |     req.setRequestHeader('x-vhost', current_vhost); | 
					
						
							| 
									
										
										
										
											2010-07-12 22:04:42 +08:00
										 |  |  |     req.onreadystatechange = function () { | 
					
						
							|  |  |  |         if (req.readyState == 4) { | 
					
						
							| 
									
										
										
										
											2014-11-05 20:03:54 +08:00
										 |  |  |             var ix = jQuery.inArray(req, outstanding_reqs); | 
					
						
							|  |  |  |             if (ix != -1) { | 
					
						
							|  |  |  |                 outstanding_reqs.splice(ix, 1); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2011-03-16 19:34:55 +08:00
										 |  |  |             if (check_bad_response(req, true)) { | 
					
						
							| 
									
										
										
										
											2011-01-14 19:33:34 +08:00
										 |  |  |                 last_successful_connect = new Date(); | 
					
						
							| 
									
										
										
										
											2010-08-31 23:44:12 +08:00
										 |  |  |                 fun(req); | 
					
						
							| 
									
										
										
										
											2010-07-12 22:04:42 +08:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2014-11-05 20:03:54 +08:00
										 |  |  |     outstanding_reqs.push(req); | 
					
						
							| 
									
										
										
										
											2011-02-22 22:00:20 +08:00
										 |  |  |     req.send(body); | 
					
						
							| 
									
										
										
										
											2010-07-12 22:04:42 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2010-07-13 20:03:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-08 23:27:34 +08:00
										 |  |  | function sync_get(path) { | 
					
						
							|  |  |  |     return sync_req('GET', [], path); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-25 01:46:30 +08:00
										 |  |  | function sync_put(sammy, path_template) { | 
					
						
							| 
									
										
										
										
											2010-09-09 01:00:32 +08:00
										 |  |  |     return sync_req('PUT', sammy.params, path_template); | 
					
						
							| 
									
										
										
										
											2010-08-25 01:46:30 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-11 20:36:15 +08:00
										 |  |  | function sync_delete(sammy, path_template, options) { | 
					
						
							|  |  |  |     return sync_req('DELETE', sammy.params, path_template, options); | 
					
						
							| 
									
										
										
										
											2010-08-25 01:46:30 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-02 00:26:51 +08:00
										 |  |  | function sync_post(sammy, path_template) { | 
					
						
							| 
									
										
										
										
											2010-09-09 01:00:32 +08:00
										 |  |  |     return sync_req('POST', sammy.params, path_template); | 
					
						
							| 
									
										
										
										
											2010-09-02 00:26:51 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-11 20:36:15 +08:00
										 |  |  | function sync_req(type, params0, path_template, options) { | 
					
						
							| 
									
										
										
										
											2011-03-09 02:43:14 +08:00
										 |  |  |     var params; | 
					
						
							| 
									
										
										
										
											2010-10-15 01:09:36 +08:00
										 |  |  |     var path; | 
					
						
							|  |  |  |     try { | 
					
						
							| 
									
										
										
										
											2011-03-09 02:43:14 +08:00
										 |  |  |         params = params_magic(params0); | 
					
						
							| 
									
										
										
										
											2010-10-15 01:09:36 +08:00
										 |  |  |         path = fill_path_template(path_template, params); | 
					
						
							|  |  |  |     } catch (e) { | 
					
						
							| 
									
										
										
										
											2011-01-17 21:25:21 +08:00
										 |  |  |         show_popup('warn', e); | 
					
						
							| 
									
										
										
										
											2010-10-15 01:09:36 +08:00
										 |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-09-03 20:23:04 +08:00
										 |  |  |     var req = xmlHttpRequest(); | 
					
						
							| 
									
										
										
										
											2011-06-08 00:25:00 +08:00
										 |  |  |     req.open(type, 'api' + path, false); | 
					
						
							| 
									
										
										
										
											2010-08-24 01:32:33 +08:00
										 |  |  |     req.setRequestHeader('content-type', 'application/json'); | 
					
						
							| 
									
										
										
										
											2012-10-23 23:35:17 +08:00
										 |  |  |     req.setRequestHeader('authorization', auth_header()); | 
					
						
							| 
									
										
										
										
											2013-01-11 20:36:15 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (options != undefined || options != null) { | 
					
						
							|  |  |  | 	if (options.headers != undefined || options.headers != null) { | 
					
						
							|  |  |  | 	    jQuery.each(options.headers, function (k, v) { | 
					
						
							|  |  |  | 		req.setRequestHeader(k, v); | 
					
						
							|  |  |  | 	    }); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-03 20:23:04 +08:00
										 |  |  |     try { | 
					
						
							| 
									
										
										
										
											2010-09-29 14:18:23 +08:00
										 |  |  |         if (type == 'GET') | 
					
						
							|  |  |  |             req.send(null); | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             req.send(JSON.stringify(params)); | 
					
						
							| 
									
										
										
										
											2010-09-03 20:23:04 +08:00
										 |  |  |     } | 
					
						
							|  |  |  |     catch (e) { | 
					
						
							|  |  |  |         if (e.number == 0x80004004) { | 
					
						
							|  |  |  |             // 0x80004004 means "Operation aborted."
 | 
					
						
							|  |  |  |             // http://support.microsoft.com/kb/186063
 | 
					
						
							|  |  |  |             // MSIE6 appears to do this in response to HTTP 204.
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-08-24 01:32:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-16 19:34:55 +08:00
										 |  |  |     if (check_bad_response(req, false)) { | 
					
						
							| 
									
										
										
										
											2011-03-16 19:11:13 +08:00
										 |  |  |         if (type == 'GET') | 
					
						
							|  |  |  |             return req.responseText; | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else { | 
					
						
							| 
									
										
										
										
											2010-09-09 01:00:32 +08:00
										 |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-03-16 19:11:13 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2010-09-09 01:00:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-16 19:34:55 +08:00
										 |  |  | function check_bad_response(req, full_page_404) { | 
					
						
							| 
									
										
										
										
											2010-09-03 20:23:04 +08:00
										 |  |  |     // 1223 == 204 - see http://www.enhanceie.com/ie/bugs.asp
 | 
					
						
							|  |  |  |     // MSIE7 and 8 appear to do this in response to HTTP 204.
 | 
					
						
							| 
									
										
										
										
											2011-03-16 19:11:13 +08:00
										 |  |  |     if ((req.status >= 200 && req.status < 300) || req.status == 1223) { | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-03-16 19:34:55 +08:00
										 |  |  |     else if (req.status == 404 && full_page_404) { | 
					
						
							|  |  |  |         var html = format('404', {}); | 
					
						
							|  |  |  |         replace_content('main', html); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-10-22 18:46:52 +08:00
										 |  |  |     else if (req.status >= 400 && req.status <= 404) { | 
					
						
							| 
									
										
										
										
											2011-03-16 19:11:13 +08:00
										 |  |  |         var reason = JSON.parse(req.responseText).reason; | 
					
						
							|  |  |  |         if (typeof(reason) != 'string') reason = JSON.stringify(reason); | 
					
						
							| 
									
										
										
										
											2015-10-22 15:55:36 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         var error = JSON.parse(req.responseText).error; | 
					
						
							|  |  |  |         if (typeof(error) != 'string') error = JSON.stringify(error); | 
					
						
							| 
									
										
										
										
											2015-11-03 16:23:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-03 18:38:24 +08:00
										 |  |  |         if (error == 'bad_request' || error == 'not_found' || error == 'not_authorised') { | 
					
						
							| 
									
										
										
										
											2016-01-20 20:01:09 +08:00
										 |  |  |             show_popup('warn', reason); | 
					
						
							|  |  |  |         } else if (error == 'page_out_of_range') { | 
					
						
							| 
									
										
										
										
											2015-11-17 23:59:49 +08:00
										 |  |  |             var seconds = 60; | 
					
						
							|  |  |  |             if (last_page_out_of_range_error > 0) | 
					
						
							| 
									
										
										
										
											2015-11-03 16:23:05 +08:00
										 |  |  |                     seconds = (new Date().getTime() - last_page_out_of_range_error.getTime())/1000; | 
					
						
							| 
									
										
										
										
											2015-11-17 23:59:49 +08:00
										 |  |  |             if (seconds > 3) { | 
					
						
							|  |  |  |                  Sammy.log('server reports page is out of range, redirecting to page 1'); | 
					
						
							| 
									
										
										
										
											2015-11-19 17:33:20 +08:00
										 |  |  |                  var contexts = ["queues", "exchanges", "connections", "channels"]; | 
					
						
							| 
									
										
										
										
											2015-11-19 19:42:35 +08:00
										 |  |  |                  var matches = /api\/(.*)\?/.exec(req.responseURL); | 
					
						
							|  |  |  |                  if (matches != null && matches.length > 1) { | 
					
						
							| 
									
										
										
										
											2015-12-30 09:29:36 +08:00
										 |  |  |                      contexts.forEach(function(item) { | 
					
						
							| 
									
										
										
										
											2015-11-19 19:42:35 +08:00
										 |  |  |                          if (matches[1].indexOf(item) == 0) {update_pages(item, 1)}; | 
					
						
							| 
									
										
										
										
											2015-12-30 09:29:36 +08:00
										 |  |  |                      }); | 
					
						
							| 
									
										
										
										
											2016-01-25 16:58:09 +08:00
										 |  |  |                  } else update_pages(current_template, 1); | 
					
						
							| 
									
										
										
										
											2016-01-26 06:51:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-30 09:29:36 +08:00
										 |  |  |                  last_page_out_of_range_error = new Date(); | 
					
						
							| 
									
										
										
										
											2015-11-17 23:59:49 +08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2016-01-20 20:01:09 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-10-13 21:53:20 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-03-16 19:11:13 +08:00
										 |  |  |     else if (req.status == 408) { | 
					
						
							|  |  |  |         update_status('timeout'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (req.status == 0) { // Non-MSIE: could not connect
 | 
					
						
							|  |  |  |         update_status('error'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (req.status > 12000) { // MSIE: could not connect
 | 
					
						
							|  |  |  |         update_status('error'); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-08-12 01:21:48 +08:00
										 |  |  |     else if (req.status == 503) { // Proxy: could not connect
 | 
					
						
							|  |  |  |         update_status('error'); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-03-16 19:11:13 +08:00
										 |  |  |     else { | 
					
						
							| 
									
										
										
										
											2010-08-25 00:13:47 +08:00
										 |  |  |         debug("Got response code " + req.status + " with body " + | 
					
						
							|  |  |  |               req.responseText); | 
					
						
							| 
									
										
										
										
											2011-03-16 19:11:13 +08:00
										 |  |  |         clearInterval(timer); | 
					
						
							| 
									
										
										
										
											2010-08-24 01:32:33 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-09-08 23:27:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-16 19:11:13 +08:00
										 |  |  |     return false; | 
					
						
							| 
									
										
										
										
											2010-08-24 01:32:33 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2010-07-13 20:03:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-25 01:46:30 +08:00
										 |  |  | function fill_path_template(template, params) { | 
					
						
							|  |  |  |     var re = /:[a-zA-Z_]*/g; | 
					
						
							|  |  |  |     return template.replace(re, function(m) { | 
					
						
							| 
									
										
										
										
											2010-10-15 01:09:36 +08:00
										 |  |  |             var str = esc(params[m.substring(1)]); | 
					
						
							|  |  |  |             if (str == '') { | 
					
						
							|  |  |  |                 throw(m.substring(1) + " is required"); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return str; | 
					
						
							| 
									
										
										
										
											2010-08-25 01:46:30 +08:00
										 |  |  |         }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-09 01:40:10 +08:00
										 |  |  | function params_magic(params) { | 
					
						
							| 
									
										
										
										
											2014-09-11 23:27:39 +08:00
										 |  |  |     return check_password(maybe_remove_fields(collapse_multifields(params))); | 
					
						
							| 
									
										
										
										
											2010-12-09 01:40:10 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-12 21:08:17 +08:00
										 |  |  | function collapse_multifields(params0) { | 
					
						
							| 
									
										
										
										
											2013-05-15 22:19:11 +08:00
										 |  |  |     function set(x) { return x != '' && x != undefined } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-12 21:08:17 +08:00
										 |  |  |     var params = {}; | 
					
						
							| 
									
										
										
										
											2013-05-14 20:30:43 +08:00
										 |  |  |     var ks = keys(params0); | 
					
						
							|  |  |  |     var ids = []; | 
					
						
							|  |  |  |     for (i in ks) { | 
					
						
							|  |  |  |         var key = ks[i]; | 
					
						
							|  |  |  |         var match = key.match(/([a-z]*)_([0-9_]*)_mftype/); | 
					
						
							|  |  |  |         var match2 = key.match(/[a-z]*_[0-9_]*_mfkey/); | 
					
						
							|  |  |  |         var match3 = key.match(/[a-z]*_[0-9_]*_mfvalue/); | 
					
						
							| 
									
										
										
										
											2012-06-07 22:25:44 +08:00
										 |  |  |         if (match == null && match2 == null && match3 == null) { | 
					
						
							| 
									
										
										
										
											2010-10-12 21:08:17 +08:00
										 |  |  |             params[key] = params0[key]; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else if (match == null) { | 
					
						
							|  |  |  |             // Do nothing, value is handled below
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else { | 
					
						
							|  |  |  |             var name = match[1]; | 
					
						
							|  |  |  |             var id = match[2]; | 
					
						
							| 
									
										
										
										
											2013-05-14 20:30:43 +08:00
										 |  |  |             ids.push([name, id]); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     ids.sort(); | 
					
						
							|  |  |  |     var id_map = {}; | 
					
						
							|  |  |  |     for (i in ids) { | 
					
						
							|  |  |  |         var name = ids[i][0]; | 
					
						
							|  |  |  |         var id = ids[i][1]; | 
					
						
							|  |  |  |         if (params[name] == undefined) { | 
					
						
							|  |  |  |             params[name] = {}; | 
					
						
							|  |  |  |             id_map[name] = {}; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         var id_parts = id.split('_'); | 
					
						
							|  |  |  |         var k = params0[name + '_' + id_parts[0] + '_mfkey']; | 
					
						
							|  |  |  |         var v = params0[name + '_' + id + '_mfvalue']; | 
					
						
							|  |  |  |         var t = params0[name + '_' + id + '_mftype']; | 
					
						
							| 
									
										
										
										
											2013-05-15 22:04:33 +08:00
										 |  |  |         var val = null; | 
					
						
							| 
									
										
										
										
											2014-04-23 21:10:59 +08:00
										 |  |  |         var top_level = id_parts.length == 1; | 
					
						
							| 
									
										
										
										
											2013-05-15 22:04:33 +08:00
										 |  |  |         if (t == 'list') { | 
					
						
							|  |  |  |             val = []; | 
					
						
							|  |  |  |             id_map[name][id] = val; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2014-04-23 21:10:59 +08:00
										 |  |  |         else if ((set(k) && top_level) || set(v)) { | 
					
						
							| 
									
										
										
										
											2013-05-14 20:30:43 +08:00
										 |  |  |             if (t == 'boolean') { | 
					
						
							|  |  |  |                 if (v != 'true' && v != 'false') | 
					
						
							|  |  |  |                     throw(k + ' must be "true" or "false"; got ' + v); | 
					
						
							|  |  |  |                 val = (v == 'true'); | 
					
						
							| 
									
										
										
										
											2010-10-12 21:08:17 +08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2013-05-14 20:30:43 +08:00
										 |  |  |             else if (t == 'number') { | 
					
						
							|  |  |  |                 var n = parseFloat(v); | 
					
						
							|  |  |  |                 if (isNaN(n)) | 
					
						
							|  |  |  |                     throw(k + ' must be a number; got ' + v); | 
					
						
							|  |  |  |                 val = n; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else { | 
					
						
							|  |  |  |                 val = v; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2013-05-15 22:04:33 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |         if (val != null) { | 
					
						
							| 
									
										
										
										
											2014-04-23 21:10:59 +08:00
										 |  |  |             if (top_level) { | 
					
						
							| 
									
										
										
										
											2013-05-14 20:30:43 +08:00
										 |  |  |                 params[name][k] = val; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else { | 
					
						
							|  |  |  |                 var prefix = id_parts.slice(0, id_parts.length - 1).join('_'); | 
					
						
							|  |  |  |                 id_map[name][prefix].push(val); | 
					
						
							| 
									
										
										
										
											2010-10-12 21:08:17 +08:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return params; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-09 02:43:14 +08:00
										 |  |  | function check_password(params) { | 
					
						
							|  |  |  |     if (params['password'] != undefined) { | 
					
						
							| 
									
										
										
										
											2012-03-08 21:17:16 +08:00
										 |  |  |         if (params['password'] == '') { | 
					
						
							|  |  |  |             throw("Please specify a password."); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2011-03-09 02:43:14 +08:00
										 |  |  |         if (params['password'] != params['password_confirm']) { | 
					
						
							|  |  |  |             throw("Passwords do not match."); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         delete params['password_confirm']; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return params; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-25 22:50:31 +08:00
										 |  |  | function maybe_remove_fields(params) { | 
					
						
							|  |  |  |     $('.controls-appearance').each(function(index) { | 
					
						
							| 
									
										
										
										
											2013-11-22 23:32:44 +08:00
										 |  |  |         var options = $(this).get(0).options; | 
					
						
							|  |  |  |         var selected = $(this).val(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for (i = 0; i < options.length; i++) { | 
					
						
							|  |  |  |             var option = options[i].value; | 
					
						
							|  |  |  |             if (option != selected) { | 
					
						
							|  |  |  |                 delete params[option]; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2011-05-25 22:50:31 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2013-11-22 23:32:44 +08:00
										 |  |  |         delete params[$(this).attr('name')]; | 
					
						
							| 
									
										
										
										
											2011-05-25 22:50:31 +08:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2010-12-09 01:40:10 +08:00
										 |  |  |     return params; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-02 01:31:16 +08:00
										 |  |  | function put_parameter(sammy, mandatory_keys, num_keys, bool_keys, | 
					
						
							|  |  |  |                        arrayable_keys) { | 
					
						
							| 
									
										
										
										
											2012-05-18 22:33:13 +08:00
										 |  |  |     for (var i in sammy.params) { | 
					
						
							|  |  |  |         if (i === 'length' || !sammy.params.hasOwnProperty(i)) continue; | 
					
						
							| 
									
										
										
										
											2012-11-20 23:51:50 +08:00
										 |  |  |         if (sammy.params[i] == '' && jQuery.inArray(i, mandatory_keys) == -1) { | 
					
						
							| 
									
										
										
										
											2012-05-18 22:33:13 +08:00
										 |  |  |             delete sammy.params[i]; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2012-11-20 23:51:50 +08:00
										 |  |  |         else if (jQuery.inArray(i, num_keys) != -1) { | 
					
						
							| 
									
										
										
										
											2012-05-18 22:33:13 +08:00
										 |  |  |             sammy.params[i] = parseInt(sammy.params[i]); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2012-11-20 23:51:50 +08:00
										 |  |  |         else if (jQuery.inArray(i, bool_keys) != -1) { | 
					
						
							| 
									
										
										
										
											2012-09-07 20:15:56 +08:00
										 |  |  |             sammy.params[i] = sammy.params[i] == 'true'; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2013-02-02 01:31:16 +08:00
										 |  |  |         else if (jQuery.inArray(i, arrayable_keys) != -1) { | 
					
						
							|  |  |  |             sammy.params[i] = sammy.params[i].split(' '); | 
					
						
							|  |  |  |             if (sammy.params[i].length == 1) { | 
					
						
							|  |  |  |                 sammy.params[i] = sammy.params[i][0]; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2012-05-18 22:33:13 +08:00
										 |  |  |     } | 
					
						
							|  |  |  |     var params = {"component": sammy.params.component, | 
					
						
							| 
									
										
										
										
											2012-08-08 00:39:09 +08:00
										 |  |  |                   "vhost":     sammy.params.vhost, | 
					
						
							| 
									
										
										
										
											2012-10-22 22:07:50 +08:00
										 |  |  |                   "name":      sammy.params.name, | 
					
						
							| 
									
										
										
										
											2012-05-18 22:33:13 +08:00
										 |  |  |                   "value":     params_magic(sammy.params)}; | 
					
						
							| 
									
										
										
										
											2012-08-08 00:39:09 +08:00
										 |  |  |     delete params.value.vhost; | 
					
						
							| 
									
										
										
										
											2012-05-18 22:33:13 +08:00
										 |  |  |     delete params.value.component; | 
					
						
							| 
									
										
										
										
											2012-10-22 22:07:50 +08:00
										 |  |  |     delete params.value.name; | 
					
						
							| 
									
										
										
										
											2012-05-18 22:33:13 +08:00
										 |  |  |     sammy.params = params; | 
					
						
							| 
									
										
										
										
											2012-10-22 22:07:50 +08:00
										 |  |  |     if (sync_put(sammy, '/parameters/:component/:vhost/:name')) update(); | 
					
						
							| 
									
										
										
										
											2012-05-18 22:33:13 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-03 20:06:16 +08:00
										 |  |  | function put_cast_params(sammy, path, mandatory_keys, num_keys, bool_keys) { | 
					
						
							| 
									
										
										
										
											2012-10-08 22:06:56 +08:00
										 |  |  |     for (var i in sammy.params) { | 
					
						
							|  |  |  |         if (i === 'length' || !sammy.params.hasOwnProperty(i)) continue; | 
					
						
							| 
									
										
										
										
											2012-11-20 23:51:50 +08:00
										 |  |  |         if (sammy.params[i] == '' && jQuery.inArray(i, mandatory_keys) == -1) { | 
					
						
							| 
									
										
										
										
											2012-10-08 22:06:56 +08:00
										 |  |  |             delete sammy.params[i]; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2012-11-20 23:51:50 +08:00
										 |  |  |         else if (jQuery.inArray(i, num_keys) != -1) { | 
					
						
							| 
									
										
										
										
											2012-10-08 22:06:56 +08:00
										 |  |  |             sammy.params[i] = parseInt(sammy.params[i]); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2012-11-20 23:51:50 +08:00
										 |  |  |         else if (jQuery.inArray(i, bool_keys) != -1) { | 
					
						
							| 
									
										
										
										
											2012-10-08 22:06:56 +08:00
										 |  |  |             sammy.params[i] = sammy.params[i] == 'true'; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-10-03 20:06:16 +08:00
										 |  |  |     if (sync_put(sammy, path)) update(); | 
					
						
							| 
									
										
										
										
											2012-10-08 22:06:56 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2012-05-18 22:33:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-19 22:19:43 +08:00
										 |  |  | function update_column_options(sammy) { | 
					
						
							|  |  |  |     var mode = sammy.params['mode']; | 
					
						
							|  |  |  |     for (var group in COLUMNS[mode]) { | 
					
						
							|  |  |  |         var options = COLUMNS[mode][group]; | 
					
						
							|  |  |  |         for (var i = 0; i < options.length; i++) { | 
					
						
							|  |  |  |             var key = options[i][0]; | 
					
						
							|  |  |  |             var value = sammy.params[mode + '-' + key] != undefined; | 
					
						
							|  |  |  |             store_pref('column-' + mode + '-' + key, value); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     partial_update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-13 20:03:36 +08:00
										 |  |  | function debug(str) { | 
					
						
							|  |  |  |     $('<p>' + str + '</p>').appendTo('#debug'); | 
					
						
							| 
									
										
										
										
											2010-09-02 19:58:34 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function keys(obj) { | 
					
						
							|  |  |  |     var ks = []; | 
					
						
							|  |  |  |     for (var k in obj) { | 
					
						
							|  |  |  |         ks.push(k); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return ks; | 
					
						
							| 
									
										
										
										
											2010-09-03 20:23:04 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-14 05:22:19 +08:00
										 |  |  | // Don't use the jQuery AJAX support, it seems to have trouble reporting
 | 
					
						
							| 
									
										
										
										
											2010-09-03 20:23:04 +08:00
										 |  |  | // server-down type errors.
 | 
					
						
							|  |  |  | function xmlHttpRequest() { | 
					
						
							|  |  |  |     var res; | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |         res = new XMLHttpRequest(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     catch(e) { | 
					
						
							|  |  |  |         res = new ActiveXObject("Microsoft.XMLHttp"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return res; | 
					
						
							| 
									
										
										
										
											2010-09-09 01:00:32 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2010-10-16 01:11:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-07 19:39:57 +08:00
										 |  |  | // Our base64 library takes a string that is really a byte sequence,
 | 
					
						
							|  |  |  | // and will throw if given a string with chars > 255 (and hence not
 | 
					
						
							|  |  |  | // DTRT for chars > 127). So encode a unicode string as a UTF-8
 | 
					
						
							|  |  |  | // sequence of "bytes".
 | 
					
						
							|  |  |  | function b64_encode_utf8(str) { | 
					
						
							|  |  |  |     return base64.encode(encode_utf8(str)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // encodeURIComponent handles utf-8, unescape does not. Neat!
 | 
					
						
							|  |  |  | function encode_utf8(str) { | 
					
						
							|  |  |  |   return unescape(encodeURIComponent(str)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-16 01:11:42 +08:00
										 |  |  | (function($){ | 
					
						
							|  |  |  |     $.fn.extend({ | 
					
						
							|  |  |  |         center: function () { | 
					
						
							|  |  |  |             return this.each(function() { | 
					
						
							|  |  |  |                 var top = ($(window).height() - $(this).outerHeight()) / 2; | 
					
						
							|  |  |  |                 var left = ($(window).width() - $(this).outerWidth()) / 2; | 
					
						
							|  |  |  |                 $(this).css({margin:0, top: (top > 0 ? top : 0)+'px', left: (left > 0 ? left : 0)+'px'}); | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2012-10-08 22:06:56 +08:00
										 |  |  | })(jQuery); | 
					
						
							| 
									
										
										
										
											2013-04-08 21:00:06 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | function debounce(f, delay) { | 
					
						
							|  |  |  |     var timeout = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return function() { | 
					
						
							|  |  |  |         var obj = this; | 
					
						
							|  |  |  |         var args = arguments; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         function delayed () { | 
					
						
							|  |  |  |             f.apply(obj, args); | 
					
						
							|  |  |  |             timeout = null; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (timeout) clearTimeout(timeout); | 
					
						
							|  |  |  |         timeout = setTimeout(delayed, delay); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-10-03 20:06:16 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | function rename_multifield(params, from, to) { | 
					
						
							|  |  |  |     var new_params = {}; | 
					
						
							|  |  |  |     for(var key in params){ | 
					
						
							|  |  |  |         var match = key.match("^" + from + "_[0-9_]*_mftype$"); | 
					
						
							|  |  |  |         var match2 = key.match("^" + from +  "_[0-9_]*_mfkey$"); | 
					
						
							|  |  |  |         var match3 = key.match("^" + from + "_[0-9_]*_mfvalue$"); | 
					
						
							|  |  |  |         if (match != null) { | 
					
						
							|  |  |  |             new_params[match[0].replace(from, to)] = params[match]; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else if (match2 != null) { | 
					
						
							|  |  |  |             new_params[match2[0].replace(from, to)] = params[match2]; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else if (match3 != null) { | 
					
						
							|  |  |  |             new_params[match3[0].replace(from, to)] = params[match3]; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else { | 
					
						
							|  |  |  |             new_params[key] = params[key] | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return new_params; | 
					
						
							|  |  |  | } |