1a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/*
2a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * noVNC: HTML5 VNC client
3a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Copyright (C) 2011 Joel Martin
4a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Licensed under LGPL-3 (see LICENSE.txt)
5a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat *
6a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * See README.md for usage and integration instructions.
7a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat */
8a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
9a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat"use strict";
10a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/*jslint bitwise: false, white: false */
11a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/*global Util, window, document */
12a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
13a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// Globals defined here
14a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvar WebUtil = {}, $D;
15a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
16a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/*
17a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Simple DOM selector by ID
18a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat */
19a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatif (!window.$D) {
20a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    window.$D = function (id) {
21a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        if (document.getElementById) {
22a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            return document.getElementById(id);
23a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        } else if (document.all) {
24a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            return document.all[id];
25a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        } else if (document.layers) {
26a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            return document.layers[id];
27a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        }
28a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        return undefined;
29a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    };
30a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
31a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
32a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
33a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/*
34a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * ------------------------------------------------------
35a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Namespaced in WebUtil
36a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * ------------------------------------------------------
37a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat */
38a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
39a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// init log level reading the logging HTTP param
40a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatWebUtil.init_logging = function() {
41a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    Util._log_level = (document.location.href.match(
42a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat         /logging=([A-Za-z0-9\._\-]*)/) ||
43a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat         ['', Util._log_level])[1];
44a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
45a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    Util.init_logging();
46a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat};
47a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatWebUtil.init_logging();
48a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
49a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
50a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatWebUtil.dirObj = function (obj, depth, parent) {
51a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    var i, msg = "", val = "";
52a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (! depth) { depth=2; }
53a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (! parent) { parent= ""; }
54a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
55a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    // Print the properties of the passed-in object
56a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    for (i in obj) {
57a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        if ((depth > 1) && (typeof obj[i] === "object")) {
58a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            // Recurse attributes that are objects
59a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            msg += WebUtil.dirObj(obj[i], depth-1, parent + "." + i);
60a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        } else {
61a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            //val = new String(obj[i]).replace("\n", " ");
62a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            if (typeof(obj[i]) === "undefined") {
63a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                val = "undefined";
64a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            } else {
65a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                val = obj[i].toString().replace("\n", " ");
66a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            }
67a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            if (val.length > 30) {
68a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                val = val.substr(0,30) + "...";
69a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            }
70a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            msg += parent + "." + i + ": " + val + "\n";
71a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        }
72a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
73a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    return msg;
74a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat};
75a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
76a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// Read a query string variable
77a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatWebUtil.getQueryVar = function(name, defVal) {
78a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    var re = new RegExp('[?][^#]*' + name + '=([^&#]*)');
79a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (typeof defVal === 'undefined') { defVal = null; }
80a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    return (document.location.href.match(re) || ['',defVal])[1];
81a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat};
82a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
83a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
84a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/*
85a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Cookie handling. Dervied from: http://www.quirksmode.org/js/cookies.html
86a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat */
87a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
88a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// No days means only for this browser session
89a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatWebUtil.createCookie = function(name,value,days) {
90a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    var date, expires;
91a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (days) {
92a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        date = new Date();
93a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        date.setTime(date.getTime()+(days*24*60*60*1000));
94a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        expires = "; expires="+date.toGMTString();
95a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
96a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    else {
97a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        expires = "";
98a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
99a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    document.cookie = name+"="+value+expires+"; path=/";
100a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat};
101a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
102a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatWebUtil.readCookie = function(name, defaultValue) {
103a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    var i, c, nameEQ = name + "=", ca = document.cookie.split(';');
104a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    for(i=0; i < ca.length; i += 1) {
105a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        c = ca[i];
106a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        while (c.charAt(0) === ' ') { c = c.substring(1,c.length); }
107a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        if (c.indexOf(nameEQ) === 0) { return c.substring(nameEQ.length,c.length); }
108a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
109a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    return (typeof defaultValue !== 'undefined') ? defaultValue : null;
110a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat};
111a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
112a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatWebUtil.eraseCookie = function(name) {
113a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    WebUtil.createCookie(name,"",-1);
114a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat};
115a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
116a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/*
117a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Alternate stylesheet selection
118a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat */
119a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatWebUtil.getStylesheets = function() { var i, links, sheets = [];
120a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    links = document.getElementsByTagName("link");
121a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    for (i = 0; i < links.length; i += 1) {
122a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        if (links[i].title &&
123a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            links[i].rel.toUpperCase().indexOf("STYLESHEET") > -1) {
124a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            sheets.push(links[i]);
125a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        }
126a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
127a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    return sheets;
128a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat};
129a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
130a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// No sheet means try and use value from cookie, null sheet used to
131a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// clear all alternates.
132a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatWebUtil.selectStylesheet = function(sheet) {
133a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    var i, link, sheets = WebUtil.getStylesheets();
134a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (typeof sheet === 'undefined') {
135a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        sheet = 'default';
136a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
137a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    for (i=0; i < sheets.length; i += 1) {
138a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        link = sheets[i];
139a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        if (link.title === sheet) {
140a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            Util.Debug("Using stylesheet " + sheet);
141a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            link.disabled = false;
142a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        } else {
143a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            //Util.Debug("Skipping stylesheet " + link.title);
144a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            link.disabled = true;
145a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        }
146a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
147a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    return sheet;
148a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat};
149