| 1 | <!DOCTYPE html>\r |
| 2 | <html>\r |
| 3 | <head>\r |
| 4 | <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>\r |
| 5 | <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">\r |
| 6 | <base target="_blank">\r |
| 7 | \r |
| 8 | <title> Kiwi IRC </title>\r |
| 9 | \r |
| 10 | <link rel="shortcut icon" href="<%base_path%>/assets/img/favicon.ico">\r |
| 11 | \r |
| 12 | <link rel="stylesheet" type="text/css" href="<%base_path%>/assets/css/style.css" />\r |
| 13 | <link rel="stylesheet" type="text/css" href="<%base_path%>/assets/css/font-awesome.min.css" />\r |
| 14 | <!--[if IE 7]>\r |
| 15 | <link rel="stylesheet" type="text/css" href="/kiwi/assets/css/font-awesome-ie7.css" />\r |
| 16 | <![endif]-->\r |
| 17 | </head>\r |
| 18 | <body>\r |
| 19 | \r |
| 20 | <script type="text/html" id="tmpl_application">\r |
| 21 | <div id="kiwi" class="theme_relaxed">\r |
| 22 | <div class="toolbar">\r |
| 23 | <div class="app_tools">\r |
| 24 | <ul class="main">\r |
| 25 | <li class="settings"><i class="icon-cogs" title="Settings"></i></li>\r |
| 26 | <li class="startup"><i class="icon-home" title="Home"></i></li>\r |
| 27 | <li><a href="https://kiwiirc.com/" target="_blank"><img src="<%base_path%>/assets/img/ico.png" alt="KiwiIRC" title="KiwiIRC" /></a></li>\r |
| 28 | </ul>\r |
| 29 | </div>\r |
| 30 | \r |
| 31 | <div class="tabs"></div>\r |
| 32 | \r |
| 33 | <div class="topic">\r |
| 34 | <div contenteditable="true"></div>\r |
| 35 | </div>\r |
| 36 | \r |
| 37 | <div class="status_message"></div>\r |
| 38 | </div>\r |
| 39 | \r |
| 40 | <div class="memberlists_resize_handle"></div>\r |
| 41 | \r |
| 42 | <div class="panels">\r |
| 43 | <div class="panel_container container1"></div>\r |
| 44 | </div>\r |
| 45 | \r |
| 46 | <div class="right_bar disabled">\r |
| 47 | <div class="right-bar-toggle"><i class=""></i></div>\r |
| 48 | <div class="right-bar-content">\r |
| 49 | <div class="channel_tools">\r |
| 50 | <i class="icon-info-sign channel_info" title="Channel Info"></i>\r |
| 51 | <i class="icon-signout channel_part" title="Leave Channel"></i>\r |
| 52 | <i class="icon-double-angle-right right-bar-toggle-inner" title="Hide"></i>\r |
| 53 | </div>\r |
| 54 | <div class="memberlists"></div>\r |
| 55 | </div>\r |
| 56 | </div>\r |
| 57 | \r |
| 58 | <div class="controlbox">\r |
| 59 | <div class="input">\r |
| 60 | <span class="nick"> </span>\r |
| 61 | <div class="input_wrap"><textarea class="inp"></textarea></div>\r |
| 62 | <div class="input_tools"></div>\r |
| 63 | </div>\r |
| 64 | </div>\r |
| 65 | </div>\r |
| 66 | </script>\r |
| 67 | \r |
| 68 | \r |
| 69 | <script type="text/html" id="tmpl_channel_info">\r |
| 70 | <div class="channel_info">\r |
| 71 | <b class="channel_url"><a href=""></a></b>\r |
| 72 | \r |
| 73 | <form>\r |
| 74 | <div class="control-group channel_info_modes">\r |
| 75 | <label>\r |
| 76 | <input type="checkbox" name="channel_mute" class="channel-mode" data-mode="m" />\r |
| 77 | Moderated chat\r |
| 78 | </label>\r |
| 79 | <label>\r |
| 80 | <input type="checkbox" name="channel_invite" class="channel-mode" data-mode="i" />\r |
| 81 | Invite only\r |
| 82 | </label>\r |
| 83 | <label>\r |
| 84 | <input type="checkbox" name="channel_topic" class="channel-mode" data-mode="t" />\r |
| 85 | Only operators can change the topic\r |
| 86 | </label>\r |
| 87 | <label>\r |
| 88 | <input type="checkbox" name="channel_external_messages" class="channel-mode" data-mode="n" />\r |
| 89 | Block messages from outside this channel\r |
| 90 | </label>\r |
| 91 | </div>\r |
| 92 | \r |
| 93 | <div class="control-group">\r |
| 94 | <label>\r |
| 95 | Password\r |
| 96 | <input type="text" name="channel_key" class="channel-mode" data-mode="k" />\r |
| 97 | </label>\r |
| 98 | </div>\r |
| 99 | \r |
| 100 | \r |
| 101 | <div class="control-group channel-banlist">\r |
| 102 | <button class="toggle_banlist">Toggle banlist</button> <span class="banlist-status"></span>\r |
| 103 | <table>\r |
| 104 | <thead>\r |
| 105 | <tr>\r |
| 106 | <td>Ban Mask</td>\r |
| 107 | <td>Added By</td>\r |
| 108 | <td>Date Added</td>\r |
| 109 | <td></td>\r |
| 110 | </tr>\r |
| 111 | </thead>\r |
| 112 | <tbody>\r |
| 113 | </tbody>\r |
| 114 | </table>\r |
| 115 | </div>\r |
| 116 | </form>\r |
| 117 | </div>\r |
| 118 | </script>\r |
| 119 | \r |
| 120 | \r |
| 121 | <script type="text/html" id="tmpl_userbox">\r |
| 122 | <div class="userbox">\r |
| 123 | <a class="close_menu if_op op"><i class="icon-star"></i><%= op %></a>\r |
| 124 | <a class="close_menu if_op deop"><i class="icon-star-empty"></i><%= de_op %></a>\r |
| 125 | <a class="close_menu if_op voice"><i class="icon-volume-up"></i><%= voice %></a>\r |
| 126 | <a class="close_menu if_op devoice"><i class="icon-volume-off"></i><%= de_voice %></a>\r |
| 127 | <a class="close_menu if_op kick"><i class="icon-remove"></i><%= kick %></a>\r |
| 128 | <a class="close_menu if_op ban"><i class="icon-ban-circle"></i><%= ban %></a>\r |
| 129 | \r |
| 130 | <a class="close_menu query"><i class="icon-comment"></i><%= message %></a>\r |
| 131 | <a class="close_menu info"><i class="icon-info-sign"></i><%= info %></a>\r |
| 132 | <a class="close_menu ignore"><label><i><input type="checkbox" /></i><%= ignore %></label></a>\r |
| 133 | </div>\r |
| 134 | </script>\r |
| 135 | \r |
| 136 | <script type="text/html" id="tmpl_nickchange">\r |
| 137 | <form class="nickchange">\r |
| 138 | <label for="nickchange"><%= new_nick %>:</label> <input type="text" mozactionhint="done" autocomplete="off" spellcheck="false"/> <button><%= change %></button> <a class="cancel"><%= cancel %></a>\r |
| 139 | </form>\r |
| 140 | </script>\r |
| 141 | \r |
| 142 | <script type="text/html" id="tmpl_new_connection_info">\r |
| 143 | <div style="margin:1em 20px;">\r |
| 144 | <img src="<%base_path%>/assets/img/ico.png" alt="KiwiIRC Logo" title="Kiwi IRC" style="display:block; margin:0 auto;"/> <br />\r |
| 145 | <p style="font-style:italic;">A <strong>hand-crafted IRC client</strong> that you can enjoy. Designed to be used <strong>easily</strong> and <strong>freely</strong>.</p>\r |
| 146 | \r |
| 147 | <p style="font-size:0.9em;margin-top:2em;">Peek at the <a href="https://www.kiwiirc.com/">Kiwi IRC homepage</a> for more information or to find out how to embed it on your own website. Looking for source code? Try the <a href="http://github.com/prawnsalad/KiwiIRC/">GitHub</a> page. This network of people may not be associated with Kiwi IRC itself.</p>\r |
| 148 | </div>\r |
| 149 | </script>\r |
| 150 | \r |
| 151 | <script type="text/html" id="tmpl_server_select">\r |
| 152 | <div class="server_select">\r |
| 153 | \r |
| 154 | <div class="side_panel" style="position:absolute;top:0px;left:320px;">\r |
| 155 | <div class="content" style="position:relative;width:300px;">\r |
| 156 | </div>\r |
| 157 | </div>\r |
| 158 | \r |
| 159 | <div class="server_details" style="position:relative;width:320px;">\r |
| 160 | <div class="status"><%= think_nick %></div>\r |
| 161 | \r |
| 162 | <form>\r |
| 163 | <div class="basic">\r |
| 164 | <table>\r |
| 165 | <tr class="nick">\r |
| 166 | <td><label for="server_select_nick"><%= nickname %></label></td>\r |
| 167 | <td><input type="text" class="nick" id="server_select_nick"></td>\r |
| 168 | </tr>\r |
| 169 | \r |
| 170 | <tr class="have_pass">\r |
| 171 | <td colspan="2">\r |
| 172 | <label for="server_select_show_pass"><%= have_password %></label> <input type="checkbox" id="server_select_show_pass" style="width:auto;" />\r |
| 173 | </td>\r |
| 174 | </tr>\r |
| 175 | \r |
| 176 | <tr class="pass">\r |
| 177 | <td><label for="server_select_password"><%= password %></label></td>\r |
| 178 | <td><input type="password" class="password" id="server_select_password"></td>\r |
| 179 | </tr>\r |
| 180 | \r |
| 181 | <tr class="channel">\r |
| 182 | <td><label for="server_select_channel"><%= channel %></label></td>\r |
| 183 | <td>\r |
| 184 | <div style="position:relative;">\r |
| 185 | <input type="text" class="channel" id="server_select_channel">\r |
| 186 | <i class="icon-key" title="<%= channel_key %>"></i>\r |
| 187 | </div>\r |
| 188 | </td>\r |
| 189 | </tr>\r |
| 190 | \r |
| 191 | <tr class="have_key">\r |
| 192 | <td colspan="2">\r |
| 193 | <label for="server_select_show_channel_key"><%= require_key %></label> <input type="checkbox" id="server_select_show_channel_key" style="width:auto;" />\r |
| 194 | </td>\r |
| 195 | </tr>\r |
| 196 | \r |
| 197 | <tr class="key">\r |
| 198 | <td><label for="server_select_channel_key"><%= key %></label></td>\r |
| 199 | <td><input type="password" class="channel_key" id="server_select_channel_key"></td>\r |
| 200 | </tr>\r |
| 201 | \r |
| 202 | <tr class="start">\r |
| 203 | <td></td>\r |
| 204 | <td><button type="submit"><%= start %></button></td>\r |
| 205 | </tr>\r |
| 206 | </table>\r |
| 207 | \r |
| 208 | <a href="" onclick="return false;" class="show_more"><%= server_network %> <i class="icon-caret-down"></i></a>\r |
| 209 | </div>\r |
| 210 | \r |
| 211 | \r |
| 212 | <div class="more">\r |
| 213 | <table>\r |
| 214 | <tr class="server">\r |
| 215 | <td><label for="server_select_server"><%= server %></label></td>\r |
| 216 | <td><input type="text" class="server" id="server_select_server"></td>\r |
| 217 | <tr>\r |
| 218 | \r |
| 219 | <tr class="port">\r |
| 220 | <td><label for="server_select_port"><%= port %></label></td>\r |
| 221 | <td><input type="text" class="port" id="server_select_port"></td>\r |
| 222 | </tr>\r |
| 223 | \r |
| 224 | <tr class="ssl">\r |
| 225 | <td><label for="server_select_ssl">SSL</label></td>\r |
| 226 | <td><input type="checkbox" class="ssl" id="server_select_ssl"></td>\r |
| 227 | </tr>\r |
| 228 | </table>\r |
| 229 | </div>\r |
| 230 | </form>\r |
| 231 | \r |
| 232 | <a class="kiwi_logo" href="https://kiwiirc.com/" target="_blank">\r |
| 233 | <h1><span><%= powered_by %></span> <img src="<%base_path%>/assets/img/ico.png" alt="KiwiIRC Logo" title="Kiwi IRC" /></h1>\r |
| 234 | </a>\r |
| 235 | </div>\r |
| 236 | </div>\r |
| 237 | </script>\r |
| 238 | \r |
| 239 | <script type="text/html" id="tmpl_theme_thumbnail">\r |
| 240 | <a class="thumbnail" data-setting="theme" data-value="<%= name.toLowerCase() %>" href="#">\r |
| 241 | <div class="thumbnail_wrapper"><div class="theme_color" style="background-color: <%= thumbnail_colour %>;"></div></div>\r |
| 242 | <div class="caption"><u><%= name %></u></div>\r |
| 243 | </a>\r |
| 244 | </script>\r |
| 245 | \r |
| 246 | <script type="text/html" id="tmpl_applet_settings">\r |
| 247 | <div class="settings_container">\r |
| 248 | <form>\r |
| 249 | <section>\r |
| 250 | <h6>Theme</h6>\r |
| 251 | <div class="control-group">\r |
| 252 | <div class="thumbnails">\r |
| 253 | <% _.forEach(theme_thumbnails, function(thumbnail) { %>\r |
| 254 | <%= thumbnail %>\r |
| 255 | <% }); %>\r |
| 256 | </div>\r |
| 257 | </div>\r |
| 258 | </section>\r |
| 259 | \r |
| 260 | <section>\r |
| 261 | <h6>Channels</h6>\r |
| 262 | <div class="control-group">\r |
| 263 | <div class="radio">\r |
| 264 | <label>\r |
| 265 | <input type="radio" name="channel_list_style" data-setting="channel_list_style" value="tabs">\r |
| 266 | <%= tabs %>\r |
| 267 | </label>\r |
| 268 | </div>\r |
| 269 | <div class="radio">\r |
| 270 | <label>\r |
| 271 | <input type="radio" name="channel_list_style" data-setting="channel_list_style" value="list">\r |
| 272 | <%= list %><small class="text-muted">(<%= large_amounts_of_chans %>)</small>\r |
| 273 | </label>\r |
| 274 | </div>\r |
| 275 | </div>\r |
| 276 | </section>\r |
| 277 | \r |
| 278 | <section>\r |
| 279 | <h6>Chat window</h6>\r |
| 280 | <div class="control-group">\r |
| 281 | <div class="checkbox">\r |
| 282 | <label>\r |
| 283 | <input data-setting="show_joins_parts" type="checkbox">\r |
| 284 | <%= join_part %>\r |
| 285 | </label>\r |
| 286 | </div>\r |
| 287 | <div class="checkbox">\r |
| 288 | <label>\r |
| 289 | <input data-setting="count_all_activity" type="checkbox">\r |
| 290 | <%= count_all_activity %>\r |
| 291 | </label>\r |
| 292 | </div>\r |
| 293 | <div class="checkbox">\r |
| 294 | <label>\r |
| 295 | <input data-setting="show_timestamps" type="checkbox">\r |
| 296 | <%= timestamps %>\r |
| 297 | </label>\r |
| 298 | </div>\r |
| 299 | <div class="checkbox">\r |
| 300 | <label>\r |
| 301 | <input data-setting="use_24_hour_timestamps" type="checkbox">\r |
| 302 | <%= timestamp_24 %>\r |
| 303 | </label>\r |
| 304 | </div>\r |
| 305 | <div class="checkbox">\r |
| 306 | <label>\r |
| 307 | <input data-setting="mute_sounds" type="checkbox">\r |
| 308 | <%= mute %>\r |
| 309 | </label>\r |
| 310 | </div>\r |
| 311 | <div class="checkbox">\r |
| 312 | <label>\r |
| 313 | <input data-setting="show_emoticons" type="checkbox">\r |
| 314 | <%= emoticons %>\r |
| 315 | </label>\r |
| 316 | </div>\r |
| 317 | <label>\r |
| 318 | <input data-setting="scrollback" class="input-small" type="text" size="4" pattern="\d*">\r |
| 319 | <span><%= scroll_history %></span>\r |
| 320 | </label>\r |
| 321 | </div>\r |
| 322 | </section>\r |
| 323 | \r |
| 324 | <section class="language">\r |
| 325 | <h6>Language</h6>\r |
| 326 | <div class="control-group">\r |
| 327 | <select data-setting="locale">\r |
| 328 | <option value=""></li>\r |
| 329 | <% _.forEach(languages, function(lang) { %>\r |
| 330 | <option value="<%= lang.tag %>"><%= lang.language %></li>\r |
| 331 | <% }); %>\r |
| 332 | </select>\r |
| 333 | <br>\r |
| 334 | <small><%= locale_restart_needed %></small>\r |
| 335 | </div>\r |
| 336 | </section>\r |
| 337 | \r |
| 338 | <section class="protocol_handler">\r |
| 339 | <h6><%= default_client %></h6>\r |
| 340 | <div class="control-group">\r |
| 341 | <button class="register_protocol"><%= make_default %></button>\r |
| 342 | <br>\r |
| 343 | <small><%= default_note %></small>\r |
| 344 | </div>\r |
| 345 | </section>\r |
| 346 | \r |
| 347 | <section class="notification_enabler">\r |
| 348 | <h6><%= html5_notifications %></h6>\r |
| 349 | <div class="control-group">\r |
| 350 | <button class="enable_notifications"><%= enable_notifications %></button>\r |
| 351 | </div>\r |
| 352 | </section>\r |
| 353 | </form>\r |
| 354 | </div>\r |
| 355 | </script>\r |
| 356 | \r |
| 357 | \r |
| 358 | <script type="text/html" id="tmpl_channel_list">\r |
| 359 | <div class="applet_chanlist">\r |
| 360 | <table>\r |
| 361 | <thead style="font-weight: bold;">\r |
| 362 | <tr>\r |
| 363 | <td><a class="channel_name_title"><%= channel_name %></a></td>\r |
| 364 | <td><a class="users_title"><%= users %></a></td>\r |
| 365 | <td style="padding-left: 2em;"><%= topic %></td>\r |
| 366 | </tr>\r |
| 367 | </thead>\r |
| 368 | <tbody style="vertical-align: top;">\r |
| 369 | </tbody>\r |
| 370 | </table>\r |
| 371 | </div>\r |
| 372 | </script>\r |
| 373 | \r |
| 374 | \r |
| 375 | <script type="text/html" id="tmpl_script_editor">\r |
| 376 | <div style="height:100%;">\r |
| 377 | <style>\r |
| 378 | #kiwi .script_editor .se_toolbar { padding: 10px 20px; }\r |
| 379 | #kiwi .script_editor .se_toolbar span.status { margin-left:2em; font-style:italic; }\r |
| 380 | #kiwi .script_editor .se_toolbar button { height:30px; padding:0 1em; }\r |
| 381 | #kiwi .script_editor .se_toolbar button i { font-size:1.2em; margin-left:3px; }\r |
| 382 | </style>\r |
| 383 | <div class="script_editor" style="height:100%; position:relative;">\r |
| 384 | <div class="se_toolbar"><button class="btn_save"><%= save %><i class="icon-save"></i></button><span class="status"></span></div>\r |
| 385 | <div class="editor" style="position:absolute;top:50px;bottom:0px;left:0px;right:0px;"></div>\r |
| 386 | </div>\r |
| 387 | </div>\r |
| 388 | </script>\r |
| 389 | \r |
| 390 | \r |
| 391 | <script src="<%base_path%>/assets/libs/jquery-1.11.0.min.js"></script>\r |
| 392 | <script>\r |
| 393 | /* Script loader (https://github.com/ded/script.js) */\r |
| 394 | (function(a,b,c){typeof c["module"]!="undefined"&&c.module.exports?c.module.exports=b():typeof c["define"]!="undefined"&&c["define"]=="function"&&c.define.amd?define(a,b):c[a]=b()})("$script",function(){function p(a,b){for(var c=0,d=a.length;c<d;++c)if(!b(a[c]))return j;return 1}function q(a,b){p(a,function(a){return!b(a)})}function r(a,b,i){function o(a){return a.call?a():d[a]}function t(){if(!--n){d[m]=1,l&&l();for(var a in f)p(a.split("|"),o)&&!q(f[a],o)&&(f[a]=[])}}a=a[k]?a:[a];var j=b&&b.call,l=j?b:i,m=j?a.join(""):b,n=a.length;return setTimeout(function(){q(a,function(a){if(h[a])return m&&(e[m]=1),h[a]==2&&t();h[a]=1,m&&(e[m]=1),s(!c.test(a)&&g?g+a+".js":a,t)})},0),r}function s(c,d){var e=a.createElement("script"),f=j;e.onload=e.onerror=e[o]=function(){if(e[m]&&!/^c|loade/.test(e[m])||f)return;e.onload=e[o]=null,f=1,h[c]=2,d()},e.async=1,e.src=c,b.insertBefore(e,b.firstChild)}var a=document,b=a.getElementsByTagName("head")[0],c=/^https?:\/\//,d={},e={},f={},g,h={},i="string",j=!1,k="push",l="DOMContentLoaded",m="readyState",n="addEventListener",o="onreadystatechange";return!a[m]&&a[n]&&(a[n](l,function t(){a.removeEventListener(l,t,j),a[m]="complete"},j),a[m]="loading"),r.get=s,r.order=function(a,b,c){(function d(e){e=a.shift(),a.length?r(e,d):r(e,b,c)})()},r.path=function(a){g=a},r.ready=function(a,b,c){a=a[k]?a:[a];var e=[];return!q(a,function(a){d[a]||e[k](a)})&&p(a,function(a){return d[a]})?b():!function(a){f[a]=f[a]||[],f[a][k](b),c&&c(e)}(a.join("|")),r},r},this)\r |
| 395 | \r |
| 396 | \r |
| 397 | // Avoid `console` errors in browsers that lack a console. (https://github.com/h5bp/html5-boilerplate)\r |
| 398 | function normalizeConsole() {\r |
| 399 | var method;\r |
| 400 | var noop = function () {};\r |
| 401 | var methods = [\r |
| 402 | 'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',\r |
| 403 | 'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',\r |
| 404 | 'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',\r |
| 405 | 'timeStamp', 'trace', 'warn'\r |
| 406 | ];\r |
| 407 | var length = methods.length;\r |
| 408 | var console = (window.console = window.console || {});\r |
| 409 | \r |
| 410 | while (length--) {\r |
| 411 | method = methods[length];\r |
| 412 | \r |
| 413 | // Only stub undefined methods.\r |
| 414 | if (!console[method]) {\r |
| 415 | console[method] = noop;\r |
| 416 | }\r |
| 417 | }\r |
| 418 | };\r |
| 419 | \r |
| 420 | function getQueryVariable(variable) {\r |
| 421 | var query = window.location.search.substring(1);\r |
| 422 | var vars = query.split('&');\r |
| 423 | for (var i = 0; i < vars.length; i++) {\r |
| 424 | var pair = vars[i].replace(/\+/g, '%20').split('=');\r |
| 425 | if (decodeURIComponent(pair[0]) == variable) {\r |
| 426 | return decodeURIComponent(pair[1]);\r |
| 427 | }\r |
| 428 | }\r |
| 429 | }\r |
| 430 | \r |
| 431 | (function () {\r |
| 432 | var base_path = '<%base_path%>', // Entry path for the kiwi application\r |
| 433 | scripts = [],\r |
| 434 | opts = {\r |
| 435 | container: $('body'),\r |
| 436 | base_path: base_path,\r |
| 437 | settings_path: base_path + '/assets/settings.json'\r |
| 438 | };\r |
| 439 | \r |
| 440 | normalizeConsole();\r |
| 441 | \r |
| 442 | /**\r |
| 443 | * Job bootup manager\r |
| 444 | * Once all jobs have completed, call any registered completed functions\r |
| 445 | */\r |
| 446 | var jobs = new (function BootManager() {\r |
| 447 | var completed_jobs = { };\r |
| 448 | \r |
| 449 | // Functions to call once all jobs have completed\r |
| 450 | var completed_callbacks = [];\r |
| 451 | \r |
| 452 | \r |
| 453 | function callCompletedFunctions(fn) {\r |
| 454 | $.each(completed_callbacks, function(idx, fn) {\r |
| 455 | fn();\r |
| 456 | });\r |
| 457 | \r |
| 458 | completed_callbacks = [];\r |
| 459 | };\r |
| 460 | \r |
| 461 | \r |
| 462 | this.finishJob = function(job_name) {\r |
| 463 | if (typeof completed_jobs[job_name] === 'undefined') {\r |
| 464 | return;\r |
| 465 | }\r |
| 466 | \r |
| 467 | completed_jobs[job_name] = true;\r |
| 468 | \r |
| 469 | // Check if all our jobs have completed\r |
| 470 | var all_jobs_completed = true;\r |
| 471 | $.each(completed_jobs, function(idx, completed) {\r |
| 472 | if (!completed) {\r |
| 473 | all_jobs_completed = false;\r |
| 474 | return false;\r |
| 475 | }\r |
| 476 | });\r |
| 477 | \r |
| 478 | if (all_jobs_completed) {\r |
| 479 | callCompletedFunctions();\r |
| 480 | }\r |
| 481 | };\r |
| 482 | \r |
| 483 | \r |
| 484 | this.onFinish = function(fn) {\r |
| 485 | completed_callbacks.push(fn);\r |
| 486 | };\r |
| 487 | \r |
| 488 | \r |
| 489 | this.registerJob = function(job_name) {\r |
| 490 | completed_jobs[job_name] = false;\r |
| 491 | };\r |
| 492 | })();\r |
| 493 | \r |
| 494 | \r |
| 495 | // Run after all dependancies have been loaded\r |
| 496 | jobs.onFinish(function startApp() {\r |
| 497 | // Kiwi IRC version this is built from\r |
| 498 | kiwi.build_version = '<%build_version%>';\r |
| 499 | \r |
| 500 | // Start the app after loading plugins\r |
| 501 | kiwi.init(opts, function() {\r |
| 502 | if (opts.client_plugins && opts.client_plugins.length > 0) {\r |
| 503 | \r |
| 504 | // Wait until all plugins are loaded before starting the app\r |
| 505 | kiwi.plugins.once('loaded', function() {\r |
| 506 | kiwi.start();\r |
| 507 | });\r |
| 508 | \r |
| 509 | _.each(opts.client_plugins, function (plugin_url) {\r |
| 510 | kiwi.plugins.load(plugin_url);\r |
| 511 | });\r |
| 512 | \r |
| 513 | } else {\r |
| 514 | \r |
| 515 | // No plugins were needed so start the app\r |
| 516 | kiwi.start();\r |
| 517 | }\r |
| 518 | });\r |
| 519 | });\r |
| 520 | \r |
| 521 | \r |
| 522 | // Load each script\r |
| 523 | jobs.registerJob('load_scripts');\r |
| 524 | var cur_script = 0;\r |
| 525 | function loadNextScript () {\r |
| 526 | var to_load,\r |
| 527 | base = base_path + '/';\r |
| 528 | \r |
| 529 | // Start the kiwi app if all scripts have been loaded\r |
| 530 | if (cur_script === scripts.length) {\r |
| 531 | jobs.finishJob('load_scripts');\r |
| 532 | return;\r |
| 533 | }\r |
| 534 | \r |
| 535 | if (typeof scripts[cur_script] === 'string') {\r |
| 536 | to_load = base + scripts[cur_script];\r |
| 537 | } else {\r |
| 538 | to_load = [];\r |
| 539 | for(var idx in scripts[cur_script]) {\r |
| 540 | to_load.push(base + scripts[cur_script][idx]);\r |
| 541 | }\r |
| 542 | }\r |
| 543 | \r |
| 544 | $script(to_load, loadNextScript);\r |
| 545 | \r |
| 546 | cur_script++;\r |
| 547 | }\r |
| 548 | \r |
| 549 | // If we're not interested in debug libs, start loading production files\r |
| 550 | if (!getQueryVariable('debug')) {\r |
| 551 | scripts.push(['assets/libs/lodash.min.js']);\r |
| 552 | scripts.push([\r |
| 553 | 'assets/libs/backbone.min.js',\r |
| 554 | 'assets/libs/jed.js'\r |
| 555 | ]);\r |
| 556 | scripts.push([\r |
| 557 | 'assets/kiwi.min.js',\r |
| 558 | 'assets/libs/engine.io.bundle.min.js'\r |
| 559 | ]);\r |
| 560 | \r |
| 561 | loadNextScript();\r |
| 562 | }\r |
| 563 | \r |
| 564 | // Load application settings\r |
| 565 | jobs.registerJob('load_settings');\r |
| 566 | $.getJSON(opts.settings_path, function (data) {\r |
| 567 | opts.server_settings = data.server_settings;\r |
| 568 | opts.client_plugins = data.client_plugins;\r |
| 569 | opts.translations = data.translations;\r |
| 570 | opts.locale = data.locale;\r |
| 571 | opts.themes = data.themes;\r |
| 572 | \r |
| 573 | if (typeof data.kiwi_server !== 'undefined')\r |
| 574 | opts.kiwi_server = data.kiwi_server;\r |
| 575 | \r |
| 576 | jobs.finishJob('load_settings');\r |
| 577 | \r |
| 578 | // If debugging, grab the debug scripts and load them\r |
| 579 | if (getQueryVariable('debug')) {\r |
| 580 | scripts = scripts.concat(data.scripts);\r |
| 581 | loadNextScript();\r |
| 582 | }\r |
| 583 | \r |
| 584 | // Load themes\r |
| 585 | if (opts.themes) {\r |
| 586 | $.each(opts.themes, function (theme_idx, theme) {\r |
| 587 | var disabled = (opts.server_settings.client.settings.theme.toLowerCase() !== theme.name.toLowerCase()),\r |
| 588 | rel = (disabled?'alternate ':'') + 'stylesheet' /*+ (disabled?' prefetch':'')*/;\r |
| 589 | \r |
| 590 | var link = $.parseHTML('<link rel="' + rel + '" type="text/css" data-theme href="'+ opts.base_path + '/assets/themes/' + theme.name.toLowerCase() + '/style.css" title="' + theme.name.toLowerCase() + '" ' + (disabled?'disabled':'') + '/>');\r |
| 591 | link.disabled = disabled;\r |
| 592 | \r |
| 593 | $(link).appendTo($('head'));\r |
| 594 | });\r |
| 595 | }\r |
| 596 | });\r |
| 597 | \r |
| 598 | jobs.registerJob('window_load');\r |
| 599 | window.onload = function() {\r |
| 600 | jobs.finishJob('window_load');\r |
| 601 | };\r |
| 602 | })();\r |
| 603 | </script>\r |
| 604 | </body>\r |
| 605 | </html>\r |