1/* 2 * noVNC: HTML5 VNC client 3 * Copyright (C) 2012 Joel Martin 4 * Copyright (C) 2013 NTT corp. 5 * Licensed under MPL 2.0 (see LICENSE.txt) 6 * 7 * See README.md for usage and integration instructions. 8 */ 9 10/*jslint bitwise: false, white: false, browser: true, devel: true */ 11/*global Util, window, document */ 12 13// Globals defined here 14var WebUtil = {}, $D; 15 16/* 17 * Simple DOM selector by ID 18 */ 19if (!window.$D) { 20 window.$D = function (id) { 21 if (document.getElementById) { 22 return document.getElementById(id); 23 } else if (document.all) { 24 return document.all[id]; 25 } else if (document.layers) { 26 return document.layers[id]; 27 } 28 return undefined; 29 }; 30} 31 32 33/* 34 * ------------------------------------------------------ 35 * Namespaced in WebUtil 36 * ------------------------------------------------------ 37 */ 38 39// init log level reading the logging HTTP param 40WebUtil.init_logging = function (level) { 41 "use strict"; 42 if (typeof level !== "undefined") { 43 Util._log_level = level; 44 } else { 45 var param = document.location.href.match(/logging=([A-Za-z0-9\._\-]*)/); 46 Util._log_level = (param || ['', Util._log_level])[1]; 47 } 48 Util.init_logging(); 49}; 50 51 52WebUtil.dirObj = function (obj, depth, parent) { 53 "use strict"; 54 if (! depth) { depth = 2; } 55 if (! parent) { parent = ""; } 56 57 // Print the properties of the passed-in object 58 var msg = ""; 59 for (var i in obj) { 60 if ((depth > 1) && (typeof obj[i] === "object")) { 61 // Recurse attributes that are objects 62 msg += WebUtil.dirObj(obj[i], depth - 1, parent + "." + i); 63 } else { 64 //val = new String(obj[i]).replace("\n", " "); 65 var val = ""; 66 if (typeof(obj[i]) === "undefined") { 67 val = "undefined"; 68 } else { 69 val = obj[i].toString().replace("\n", " "); 70 } 71 if (val.length > 30) { 72 val = val.substr(0, 30) + "..."; 73 } 74 msg += parent + "." + i + ": " + val + "\n"; 75 } 76 } 77 return msg; 78}; 79 80// Read a query string variable 81WebUtil.getQueryVar = function (name, defVal) { 82 "use strict"; 83 var re = new RegExp('.*[?&]' + name + '=([^&#]*)'), 84 match = document.location.href.match(re); 85 if (typeof defVal === 'undefined') { defVal = null; } 86 if (match) { 87 return decodeURIComponent(match[1]); 88 } else { 89 return defVal; 90 } 91}; 92 93 94/* 95 * Cookie handling. Dervied from: http://www.quirksmode.org/js/cookies.html 96 */ 97 98// No days means only for this browser session 99WebUtil.createCookie = function (name, value, days) { 100 "use strict"; 101 var date, expires; 102 if (days) { 103 date = new Date(); 104 date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); 105 expires = "; expires=" + date.toGMTString(); 106 } else { 107 expires = ""; 108 } 109 110 var secure; 111 if (document.location.protocol === "https:") { 112 secure = "; secure"; 113 } else { 114 secure = ""; 115 } 116 document.cookie = name + "=" + value + expires + "; path=/" + secure; 117}; 118 119WebUtil.readCookie = function (name, defaultValue) { 120 "use strict"; 121 var nameEQ = name + "=", 122 ca = document.cookie.split(';'); 123 124 for (var i = 0; i < ca.length; i += 1) { 125 var c = ca[i]; 126 while (c.charAt(0) === ' ') { c = c.substring(1, c.length); } 127 if (c.indexOf(nameEQ) === 0) { return c.substring(nameEQ.length, c.length); } 128 } 129 return (typeof defaultValue !== 'undefined') ? defaultValue : null; 130}; 131 132WebUtil.eraseCookie = function (name) { 133 "use strict"; 134 WebUtil.createCookie(name, "", -1); 135}; 136 137/* 138 * Setting handling. 139 */ 140 141WebUtil.initSettings = function (callback /*, ...callbackArgs */) { 142 "use strict"; 143 var callbackArgs = Array.prototype.slice.call(arguments, 1); 144 if (window.chrome && window.chrome.storage) { 145 window.chrome.storage.sync.get(function (cfg) { 146 WebUtil.settings = cfg; 147 console.log(WebUtil.settings); 148 if (callback) { 149 callback.apply(this, callbackArgs); 150 } 151 }); 152 } else { 153 // No-op 154 if (callback) { 155 callback.apply(this, callbackArgs); 156 } 157 } 158}; 159 160// No days means only for this browser session 161WebUtil.writeSetting = function (name, value) { 162 "use strict"; 163 if (window.chrome && window.chrome.storage) { 164 //console.log("writeSetting:", name, value); 165 if (WebUtil.settings[name] !== value) { 166 WebUtil.settings[name] = value; 167 window.chrome.storage.sync.set(WebUtil.settings); 168 } 169 } else { 170 localStorage.setItem(name, value); 171 } 172}; 173 174WebUtil.readSetting = function (name, defaultValue) { 175 "use strict"; 176 var value; 177 if (window.chrome && window.chrome.storage) { 178 value = WebUtil.settings[name]; 179 } else { 180 value = localStorage.getItem(name); 181 } 182 if (typeof value === "undefined") { 183 value = null; 184 } 185 if (value === null && typeof defaultValue !== undefined) { 186 return defaultValue; 187 } else { 188 return value; 189 } 190}; 191 192WebUtil.eraseSetting = function (name) { 193 "use strict"; 194 if (window.chrome && window.chrome.storage) { 195 window.chrome.storage.sync.remove(name); 196 delete WebUtil.settings[name]; 197 } else { 198 localStorage.removeItem(name); 199 } 200}; 201 202/* 203 * Alternate stylesheet selection 204 */ 205WebUtil.getStylesheets = function () { 206 "use strict"; 207 var links = document.getElementsByTagName("link"); 208 var sheets = []; 209 210 for (var i = 0; i < links.length; i += 1) { 211 if (links[i].title && 212 links[i].rel.toUpperCase().indexOf("STYLESHEET") > -1) { 213 sheets.push(links[i]); 214 } 215 } 216 return sheets; 217}; 218 219// No sheet means try and use value from cookie, null sheet used to 220// clear all alternates. 221WebUtil.selectStylesheet = function (sheet) { 222 "use strict"; 223 if (typeof sheet === 'undefined') { 224 sheet = 'default'; 225 } 226 227 var sheets = WebUtil.getStylesheets(); 228 for (var i = 0; i < sheets.length; i += 1) { 229 var link = sheets[i]; 230 if (link.title === sheet) { 231 Util.Debug("Using stylesheet " + sheet); 232 link.disabled = false; 233 } else { 234 //Util.Debug("Skipping stylesheet " + link.title); 235 link.disabled = true; 236 } 237 } 238 return sheet; 239}; 240