1 | <!DOCTYPE html>
|
2 |
|
3 | <html lang="en">
|
4 | <head>
|
5 | <meta charset="utf-8">
|
6 | <meta name="viewport" content="width=device-width">
|
7 | <title>CrossBrowdy API documentation Source: CrossBase/general/CB_Client.js</title>
|
8 |
|
9 | |
10 |
|
11 |
|
12 | <link type="text/css" rel="stylesheet" href="styles/sunlight.default.css">
|
13 |
|
14 | <link type="text/css" rel="stylesheet" href="styles/site.cosmo.css">
|
15 |
|
16 | </head>
|
17 |
|
18 | <body style="min-width:800px; overflow-wrap:break-word; word-wrap:break-word; word-break:break-word; line-break:strict; hyphens:none; -webkit-hyphens:none; -moz-hyphens:none;">
|
19 |
|
20 | <div class="navbar navbar-default navbar-fixed-top ">
|
21 | <div class="container">
|
22 | <div class="navbar-header">
|
23 | <a class="navbar-brand" href="index.html">CrossBrowdy API documentation</a>
|
24 | <button class="navbar-toggle" type="button" data-toggle="collapse" data-target="#topNavigation">
|
25 | <span class="icon-bar"></span>
|
26 | <span class="icon-bar"></span>
|
27 | <span class="icon-bar"></span>
|
28 | </button>
|
29 | </div>
|
30 | <div class="navbar-collapse collapse" id="topNavigation">
|
31 | <ul class="nav navbar-nav">
|
32 |
|
33 | <li class="dropdown">
|
34 | <a href="namespaces.list.html" class="dropdown-toggle" data-toggle="dropdown">Namespaces<b class="caret"></b></a>
|
35 | <ul class="dropdown-menu inline">
|
36 | <li><a href="CB_Arrays.html">CB_Arrays</a></li><li><a href="CB_AudioDetector.html">CB_AudioDetector</a></li><li><a href="CB_Client.html">CB_Client</a></li><li><a href="CB_Collisions.html">CB_Collisions</a></li><li><a href="CB_Configuration.html">CB_Configuration</a></li><li><a href="CB_Configuration.CrossBase.html">CB_Configuration.CrossBase</a></li><li><a href="CB_Configuration.CrossBrowdy.html">CB_Configuration.CrossBrowdy</a></li><li><a href="CB_Controllers.html">CB_Controllers</a></li><li><a href="CB_Controllers_Proprietary.html">CB_Controllers_Proprietary</a></li><li><a href="CB_Controllers_Proprietary.WII.html">CB_Controllers_Proprietary.WII</a></li><li><a href="CB_Controllers_Proprietary.WII_U.html">CB_Controllers_Proprietary.WII_U</a></li><li><a href="CB_Device.html">CB_Device</a></li><li><a href="CB_Device.AmbientLight.html">CB_Device.AmbientLight</a></li><li><a href="CB_Device.Battery.html">CB_Device.Battery</a></li><li><a href="CB_Device.Location.html">CB_Device.Location</a></li><li><a href="CB_Device.Motion.html">CB_Device.Motion</a></li><li><a href="CB_Device.Orientation.html">CB_Device.Orientation</a></li><li><a href="CB_Device.Proximity.html">CB_Device.Proximity</a></li><li><a href="CB_Device.Vibration.html">CB_Device.Vibration</a></li><li><a href="CB_Elements.html">CB_Elements</a></li><li><a href="CB_Events.html">CB_Events</a></li><li><a href="CB_Keyboard.html">CB_Keyboard</a></li><li><a href="CB_Keyboard.chars.html">CB_Keyboard.chars</a></li><li><a href="CB_Keyboard.extended.html">CB_Keyboard.extended</a></li><li><a href="CB_Keyboard.keys.html">CB_Keyboard.keys</a></li><li><a href="CB_Modules.html">CB_Modules</a></li><li><a href="CB_Mouse.html">CB_Mouse</a></li><li><a href="CB_Mouse.CursorImage.html">CB_Mouse.CursorImage</a></li><li><a href="CB_Net.html">CB_Net</a></li><li><a href="CB_Net.Fetch.html">CB_Net.Fetch</a></li><li><a href="CB_Net.REST.html">CB_Net.REST</a></li><li><a href="CB_Net.Sockets.html">CB_Net.Sockets</a></li><li><a href="CB_Net.Sockets.SockJS.html">CB_Net.Sockets.SockJS</a></li><li><a href="CB_Net.XHR.html">CB_Net.XHR</a></li><li><a href="CB_Pointer.html">CB_Pointer</a></li><li><a href="CB_Screen.html">CB_Screen</a></li><li><a href="CB_Speaker.html">CB_Speaker</a></li><li><a href="CB_Touch.html">CB_Touch</a></li><li><a href="CB_baseSymbols.html">CB_baseSymbols</a></li>
|
37 | </ul>
|
38 | </li>
|
39 |
|
40 | <li class="dropdown">
|
41 | <a href="classes.list.html" class="dropdown-toggle" data-toggle="dropdown">Classes<b class="caret"></b></a>
|
42 | <ul class="dropdown-menu inline">
|
43 | <li><a href="CB_AudioFile.html">CB_AudioFile</a></li><li><a href="CB_AudioFileCache.html">CB_AudioFileCache</a></li><li><a href="CB_AudioFileSprites.html">CB_AudioFileSprites</a></li><li><a href="CB_AudioFileSpritesPool.html">CB_AudioFileSpritesPool</a></li><li><a href="CB_AudioFile_API.AAPI.html">CB_AudioFile_API.AAPI</a></li><li><a href="CB_AudioFile_API.ACMP.html">CB_AudioFile_API.ACMP</a></li><li><a href="CB_AudioFile_API.SM2.html">CB_AudioFile_API.SM2</a></li><li><a href="CB_AudioFile_API.WAAPI.html">CB_AudioFile_API.WAAPI</a></li><li><a href="CB_Canvas.html">CB_Canvas</a></li><li><a href="CB_GraphicSprites.html">CB_GraphicSprites</a></li><li><a href="CB_GraphicSpritesScene.html">CB_GraphicSpritesScene</a></li>
|
44 | </ul>
|
45 | </li>
|
46 |
|
47 | <li class="dropdown">
|
48 | <a href="global.html" class="dropdown-toggle" data-toggle="dropdown">Global<b class="caret"></b></a>
|
49 | <ul class="dropdown-menu inline">
|
50 | <li><a href="global.html#CB_BASE_NAME">CB_BASE_NAME</a></li><li><a href="global.html#CB_CREDITS_DEFAULT">CB_CREDITS_DEFAULT</a></li><li><a href="global.html#CB_NAME">CB_NAME</a></li><li><a href="global.html#CB_OPTIONS">CB_OPTIONS</a></li><li><a href="global.html#CB_VERSION">CB_VERSION</a></li><li><a href="global.html#CB_addCredits">CB_addCredits</a></li><li><a href="global.html#CB_baseToBase">CB_baseToBase</a></li><li><a href="global.html#CB_baseToInt">CB_baseToInt</a></li><li><a href="global.html#CB_br2nl">CB_br2nl</a></li><li><a href="global.html#CB_brToNl">CB_brToNl</a></li><li><a href="global.html#CB_combineArraysOrObjects">CB_combineArraysOrObjects</a></li><li><a href="global.html#CB_combineAutomatically">CB_combineAutomatically</a></li><li><a href="global.html#CB_combineJSON">CB_combineJSON</a></li><li><a href="global.html#CB_combineURIParameters">CB_combineURIParameters</a></li><li><a href="global.html#CB_combineURLParameters">CB_combineURLParameters</a></li><li><a href="global.html#CB_console">CB_console</a></li><li><a href="global.html#CB_copyObject">CB_copyObject</a></li><li><a href="global.html#CB_countDecimalDigits">CB_countDecimalDigits</a></li><li><a href="global.html#CB_countDecimalPart">CB_countDecimalPart</a></li><li><a href="global.html#CB_countDecimals">CB_countDecimals</a></li><li><a href="global.html#CB_countIntegerDigits">CB_countIntegerDigits</a></li><li><a href="global.html#CB_countIntegerPart">CB_countIntegerPart</a></li><li><a href="global.html#CB_credits">CB_credits</a></li><li><a href="global.html#CB_forEach">CB_forEach</a></li><li><a href="global.html#CB_forceString">CB_forceString</a></li><li><a href="global.html#CB_getBase64StringObject">CB_getBase64StringObject</a></li><li><a href="global.html#CB_getCookie">CB_getCookie</a></li><li><a href="global.html#CB_getDatum">CB_getDatum</a></li><li><a href="global.html#CB_getJSONPropertyValue">CB_getJSONPropertyValue</a></li><li><a href="global.html#CB_getLZStringObject">CB_getLZStringObject</a></li><li><a href="global.html#CB_getValueIndex">CB_getValueIndex</a></li><li><a href="global.html#CB_getValuePath">CB_getValuePath</a></li><li><a href="global.html#CB_includeJSFile">CB_includeJSFile</a></li><li><a href="global.html#CB_indexOf">CB_indexOf</a></li><li><a href="global.html#CB_init">CB_init</a></li><li><a href="global.html#CB_intToBase">CB_intToBase</a></li><li><a href="global.html#CB_isArray">CB_isArray</a></li><li><a href="global.html#CB_isEmail">CB_isEmail</a></li><li><a href="global.html#CB_isFileLocal">CB_isFileLocal</a></li><li><a href="global.html#CB_isString">CB_isString</a></li><li><a href="global.html#CB_lastIndexOf">CB_lastIndexOf</a></li><li><a href="global.html#CB_ltrim">CB_ltrim</a></li><li><a href="global.html#CB_nl2br">CB_nl2br</a></li><li><a href="global.html#CB_nlToBr">CB_nlToBr</a></li><li><a href="global.html#CB_numberFormat">CB_numberFormat</a></li><li><a href="global.html#CB_numberOfDecimalDigits">CB_numberOfDecimalDigits</a></li><li><a href="global.html#CB_numberOfDecimals">CB_numberOfDecimals</a></li><li><a href="global.html#CB_numberOfIntegerDigits">CB_numberOfIntegerDigits</a></li><li><a href="global.html#CB_parseJSON">CB_parseJSON</a></li><li><a href="global.html#CB_parseString">CB_parseString</a></li><li><a href="global.html#CB_regularExpressionString">CB_regularExpressionString</a></li><li><a href="global.html#CB_renderString">CB_renderString</a></li><li><a href="global.html#CB_replaceAll">CB_replaceAll</a></li><li><a href="global.html#CB_rtrim">CB_rtrim</a></li><li><a href="global.html#CB_scriptPath">CB_scriptPath</a></li><li><a href="global.html#CB_scriptPathCalculate">CB_scriptPathCalculate</a></li><li><a href="global.html#CB_setCookie">CB_setCookie</a></li><li><a href="global.html#CB_setDatum">CB_setDatum</a></li><li><a href="global.html#CB_sizeOf">CB_sizeOf</a></li><li><a href="global.html#CB_sizeof">CB_sizeof</a></li><li><a href="global.html#CB_stringifyJSON">CB_stringifyJSON</a></li><li><a href="global.html#CB_symmetricCall">CB_symmetricCall</a></li><li><a href="global.html#CB_symmetricCallClear">CB_symmetricCallClear</a></li><li><a href="global.html#CB_this">CB_this</a></li><li><a href="global.html#CB_trim">CB_trim</a></li>
|
51 | </ul>
|
52 | </li>
|
53 |
|
54 | </ul>
|
55 |
|
56 | <div class="col-sm-3 col-md-3">
|
57 | <form class="navbar-form" role="search">
|
58 | <div class="input-group">
|
59 | <input type="text" class="form-control" placeholder="Search" name="q" id="search-input">
|
60 | <div class="input-group-btn">
|
61 | <button class="btn btn-default" id="search-submit"><i class="glyphicon glyphicon-search"></i></button>
|
62 | </div>
|
63 | </div>
|
64 | </form>
|
65 | </div>
|
66 |
|
67 | </div>
|
68 |
|
69 | </div>
|
70 | </div>
|
71 |
|
72 |
|
73 | <div class="container" id="toc-content" style="width:100%;">
|
74 | <div class="row" style="width:100%;">
|
75 |
|
76 |
|
77 | <div class="col-md-12">
|
78 |
|
79 | <div id="main">
|
80 |
|
81 |
|
82 | <h1 class="page-title">Source: CrossBase/general/CB_Client.js</h1>
|
83 |
|
84 | <section>
|
85 | <article>
|
86 | <pre
|
87 | class="sunlight-highlight-javascript linenums">/**
|
88 | * @file Web client (browser or engine) management. Contains the {@link CB_Client} static class.
|
89 | * @author Joan Alba Maldonado <workindalian@gmail.com>
|
90 | * @license Creative Commons Attribution 4.0 International. See more at {@link https://crossbrowdy.com/about#what_is_the_crossbrowdy_copyright_and_license}.
|
91 | */
|
92 |
|
93 |
|
94 | /**
|
95 | * Static class to manage the current client. It will return itself if it is tried to be instantiated. It can use [BrowserDetect]{@link https://quirksmode.org/js/detect.html} ([source code rescued]{@link https://gist.github.com/mitchellhislop/2018348}).
|
96 | * @namespace
|
97 | * @todo Think about implementing a getDocumentParents function (similar to {@link CB_Client.getWindowParents}).
|
98 | * @todo Think about implementing "onClose" event (to fire when app/web is going to be closed).
|
99 | */
|
100 | var CB_Client = function() { return CB_Client; };
|
101 | {
|
102 | CB_Client.initialized = false; //It will tells whether the object has been initialized or not.
|
103 |
|
104 |
|
105 | //Initializes all values:
|
106 | CB_Client.init = function()
|
107 | {
|
108 | //If this is the fist time:
|
109 | if (CB_Client.initialized) { return CB_Client; }
|
110 |
|
111 | //The object has been initialized:
|
112 | CB_Client.initialized = true;
|
113 |
|
114 | return CB_Client;
|
115 | }
|
116 |
|
117 |
|
118 | //Returns the most preferred language:
|
119 | CB_Client._getLanguagePreferred =
|
120 | function(allowNavigatorLanguages, PHPAcceptedLanguagesFirst)
|
121 | {
|
122 | return CB_Client._getLanguagesPreferred(allowNavigatorLanguages, PHPAcceptedLanguagesFirst)[0];
|
123 | };
|
124 |
|
125 | /**
|
126 | * Returns the most preferred language as a string.
|
127 | * @function
|
128 | * @param {boolean} [allowNavigatorLanguages={@link CB_Configuration.CrossBase.CB_Client_allowNavigatorLanguages_DEFAULT}] - Defines whether to allow using the [window.navigator.languages]{@link https://developer.mozilla.org/en-US/docs/Web/API/NavigatorLanguage/languages} property (if not available, it will proceed normally).
|
129 | * @param {boolean} [PHPAcceptedLanguagesFirst={@link CB_Configuration.CrossBase.CB_Client_PHPAcceptedLanguagesFirst_DEFAULT}] - If it is set to true, it will try to return the accepted languages found out by [PHP]{@link https://en.wikipedia.org/wiki/PHP} (if [PHP]{@link https://en.wikipedia.org/wiki/PHP} is available) in [$_SERVER]{@link http://php.net/manual/en/reserved.variables.server.php}['HTTP_ACCEPT_LANGUAGE'] or it will proceed normally otherwise.
|
130 | * @returns {string}
|
131 | * @todo Use other back-end ways to calculate the language (using Node.js, for example).
|
132 | */
|
133 | CB_Client.getLanguage = function(allowNavigatorLanguages, PHPAcceptedLanguagesFirst)
|
134 | {
|
135 | return CB_Client._getLanguagePreferred(allowNavigatorLanguages, PHPAcceptedLanguagesFirst);
|
136 | }
|
137 |
|
138 |
|
139 | //Returns the most preferred languages (an array):
|
140 | CB_Client._getLanguagesPreferred =
|
141 | function(allowNavigatorLanguages, PHPAcceptedLanguagesFirst)
|
142 | {
|
143 | if (typeof(PHPAcceptedLanguagesFirst) !== true && PHPAcceptedLanguagesFirst !== false) { PHPAcceptedLanguagesFirst = CB_Configuration[CB_BASE_NAME].CB_Client_PHPAcceptedLanguagesFirst_DEFAULT; }
|
144 | if (PHPAcceptedLanguagesFirst && typeof(CB_PHPAcceptedLanguages) !== "undefined" && CB_isArray(CB_PHPAcceptedLanguages) && CB_PHPAcceptedLanguages.length > 0) { return CB_PHPAcceptedLanguages; }
|
145 | if (allowNavigatorLanguages !== true && allowNavigatorLanguages !== false) { allowNavigatorLanguages = CB_Configuration[CB_BASE_NAME].CB_Client_allowNavigatorLanguages_DEFAULT; }
|
146 | if (allowNavigatorLanguages && window.navigator.languages) { return window.navigator.languages; }
|
147 | var languages = [];
|
148 | if (window.navigator.language && CB_indexOf(languages, window.navigator.language) === -1) { languages[languages.length] = window.navigator.language; }
|
149 | if (window.navigator.userLanguage && CB_indexOf(languages, window.navigator.userLanguage) === -1) { languages[languages.length] = window.navigator.userLanguage; }
|
150 | if (window.navigator.browserLanguage && CB_indexOf(languages, window.navigator.browserLanguage) === -1) { languages[languages.length] = window.navigator.browserLanguage; }
|
151 | if (window.navigator.systemLanguage && CB_indexOf(languages, window.navigator.systemLanguage) === -1) { languages[languages.length] = window.navigator.systemLanguage; }
|
152 | if (languages.length > 0) { return languages; }
|
153 | else { return [CB_Configuration[CB_BASE_NAME].CB_Client_language_DEFAULT]; }
|
154 | };
|
155 |
|
156 | /**
|
157 | * Returns the most preferred languages as an array of strings.
|
158 | * @function
|
159 | * @param {boolean} [allowNavigatorLanguages={@link CB_Configuration.CrossBase.CB_Client_allowNavigatorLanguages_DEFAULT}] - Defines whether to allow using the [window.navigator.languages]{@link https://developer.mozilla.org/en-US/docs/Web/API/NavigatorLanguage/languages} property (if not available, it will proceed normally).
|
160 | * @param {boolean} [PHPAcceptedLanguagesFirst={@link CB_Configuration.CrossBase.CB_Client_PHPAcceptedLanguagesFirst_DEFAULT}] - If it is set to true, it will try to return the accepted languages found out by [PHP]{@link https://en.wikipedia.org/wiki/PHP} (if [PHP]{@link https://en.wikipedia.org/wiki/PHP} is available) in [$_SERVER]{@link http://php.net/manual/en/reserved.variables.server.php}['HTTP_ACCEPT_LANGUAGE'] or it will proceed normally otherwise.
|
161 | * @returns {array}
|
162 | * @todo Use other back-end ways to calculate languages (using Node.js, for example).
|
163 | */
|
164 | CB_Client.getLanguages = function(allowNavigatorLanguages, PHPAcceptedLanguagesFirst)
|
165 | {
|
166 | return CB_Client._getLanguagesPreferred(allowNavigatorLanguages, PHPAcceptedLanguagesFirst);
|
167 | }
|
168 |
|
169 |
|
170 | /**
|
171 | * Sets a function to execute when the [languagechange]{@link https://developer.mozilla.org/en-US/docs/Web/Events/languagechange} event is fired (only for some web clients) or removes it.
|
172 | * @function
|
173 | * @param {function|null} eventFunction - Function that represents the event listener that will be called when the event is fired. If a null value is used, the event will be removed.
|
174 | * @param {boolean} [keepOldFunction=true] - Defines whether to also keep the previous listeners or remove them otherwise.
|
175 | * @param {boolean} [useCapture=false] - Defines whether the event we want to add will use capture or not. This parameter will be effective only if the current client supports the [addEventListener]{@link https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener} method and will be used as its third parameter.
|
176 | */
|
177 | CB_Client.onLanguageChanges = function(eventFunction, keepOldFunction, useCapture)
|
178 | {
|
179 | CB_Client._setEvent("languagechange", eventFunction, keepOldFunction, useCapture, window);
|
180 | }
|
181 |
|
182 |
|
183 | /**
|
184 | * Alias for {@link CB_Client.get}.
|
185 | * @function CB_Client.getBrowser
|
186 | * @see {@link CB_Client.get}
|
187 | */
|
188 | /**
|
189 | * Returns the current web client (if possible) as a string. It uses [BrowserDetect]{@link https://quirksmode.org/js/detect.html} ([source code rescued]{@link https://gist.github.com/mitchellhislop/2018348}) internally.
|
190 | * @function
|
191 | * @returns {string}
|
192 | */
|
193 | CB_Client.get = CB_Client.getBrowser = function()
|
194 | {
|
195 | return BrowserDetect.browser;
|
196 | }
|
197 |
|
198 |
|
199 | /**
|
200 | * Alias for {@link CB_Client.getVersion}.
|
201 | * @function CB_Client.getBrowserVersion
|
202 | * @see {@link CB_Client.getVersion}
|
203 | */
|
204 | /**
|
205 | * Returns the current web client version (if possible) as a string. It uses [BrowserDetect]{@link https://quirksmode.org/js/detect.html} ([source code rescued]{@link https://gist.github.com/mitchellhislop/2018348}) internally.
|
206 | * @function
|
207 | * @returns {string}
|
208 | */
|
209 | CB_Client.getVersion = CB_Client.getBrowserVersion = function()
|
210 | {
|
211 | return BrowserDetect.version + "";
|
212 | }
|
213 |
|
214 |
|
215 | /**
|
216 | * Alias for {@link CB_Client.getVersionMain}.
|
217 | * @function CB_Client.getBrowserVersionMain
|
218 | * @see {@link CB_Client.getVersionMain}
|
219 | */
|
220 | /**
|
221 | * Returns the current web client main version (first number), if possible, as an integer. It uses [BrowserDetect]{@link https://quirksmode.org/js/detect.html} ([source code rescued]{@link https://gist.github.com/mitchellhislop/2018348}) internally.
|
222 | * @function
|
223 | * @returns {integer}
|
224 | */
|
225 | CB_Client.getVersionMain = CB_Client.getBrowserVersionMain = function()
|
226 | {
|
227 | return parseInt(CB_Client.getBrowserVersion().split(".")[0]);
|
228 | }
|
229 |
|
230 |
|
231 | CB_Client._getWindowParentsReturnCache; //Stores the return result in order to optimize the execution next times.
|
232 | /**
|
233 | * Returns all the [window]{@link https://developer.mozilla.org/en-US/docs/Web/API/Window} objects, parents and last son (main one) in an array (with the topmost parent in the highest index). Useful in case the script is running in an [iframe]{@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe} or more.
|
234 | * @function
|
235 | * @returns {array}
|
236 | */
|
237 | CB_Client.getWindowParents = function()
|
238 | {
|
239 | //If it is not the first time we execute this function, uses the cache to return always the same:
|
240 | if (typeof(CB_Client._getWindowParentsReturnCache) !== "undefined" && CB_Client._getWindowParentsReturnCache !== null)
|
241 | {
|
242 | return CB_Client._getWindowParentsReturnCache;
|
243 | }
|
244 |
|
245 | var windowParents = [ window.self ];
|
246 | try
|
247 | {
|
248 | if (typeof(window.parent) !== "undefined" && window.parent !== null)
|
249 | {
|
250 | var currentParent = windowParents[0];//windowParents[windowParents.length - 1];
|
251 | while (typeof(currentParent.parent) !== "undefined" && currentParent !== currentParent.parent)
|
252 | {
|
253 | currentParent = currentParent.parent;
|
254 | windowParents[windowParents.length] = currentParent;
|
255 | }
|
256 | ///////windowBase = currentParent;
|
257 | }
|
258 | } catch(E) {}
|
259 |
|
260 | CB_Client._getWindowParentsReturnCache = windowParents;
|
261 |
|
262 | return windowParents;
|
263 | }
|
264 |
|
265 |
|
266 | CB_Client._getWindowBaseReturnCache; //Stores the return result in order to optimize the execution next times.
|
267 | /**
|
268 | * Returns the [window]{@link https://developer.mozilla.org/en-US/docs/Web/API/Window} object of the first parent (the topmost one). Useful in case the script is running in an [iframe]{@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe} or more.
|
269 | * @function
|
270 | * @returns {Object}
|
271 | */
|
272 | CB_Client.getWindowBase = function()
|
273 | {
|
274 | //If it is not the first time we execute this function, uses the cache to return always the same:
|
275 | if (typeof(CB_Client._getWindowBaseReturnCache) !== "undefined" && CB_Client._getWindowBaseReturnCache !== null)
|
276 | {
|
277 | return CB_Client._getWindowBaseReturnCache;
|
278 | }
|
279 |
|
280 | //By default, uses the current window object:
|
281 | var windowBase = window.self; //window;
|
282 |
|
283 | //Tries to get the topmost window (it can fail if it is not in the same domain or it is running locally):
|
284 | try
|
285 | {
|
286 | //If defined, we use window.top to get the topmost window:
|
287 | if (typeof(window.top) !== "undefined" && window.top !== null) { windowBase = window.top; }
|
288 | //...otherwise, we get all the parents and chose the last one (which will be the topmost):
|
289 | else
|
290 | {
|
291 | var windowParents = CB_Client.getWindowParents();
|
292 | windowBase = windowParents[windowParents.length - 1];
|
293 | }
|
294 | } catch(E) {}
|
295 |
|
296 | CB_Client._getWindowBaseReturnCache = windowBase;
|
297 |
|
298 | return windowBase;
|
299 | }
|
300 |
|
301 |
|
302 | CB_Client._getWindowReturnCache; //Stores the return result in order to optimize the execution next times.
|
303 | /**
|
304 | * Returns the [window]{@link https://developer.mozilla.org/en-US/docs/Web/API/Window} object (having in mind whether the script is running in one [iframe]{@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe} or more, if we want).
|
305 | * @function
|
306 | * @param {boolean} [mindIframes={@link CB_Configuration.CrossBase.MIND_IFRAMES}] - If set to true, it will try to get and return the topmost [window]{@link https://developer.mozilla.org/en-US/docs/Web/API/Window} object. Useful in case the script is running in an [iframe]{@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe} or more.
|
307 | * @returns {Object}
|
308 | */
|
309 | CB_Client.getWindow = function(mindIframes)
|
310 | {
|
311 | if (typeof(mindIframes) === "undefined" || mindIframes === null) { mindIframes = CB_Configuration[CB_BASE_NAME].MIND_IFRAMES; }
|
312 |
|
313 | //If it is not the first time we execute this function, uses the cache to return always the same:
|
314 | if (!mindIframes) { return window.self; }
|
315 | else if (typeof(CB_Client._getWindowReturnCache) !== "undefined" && CB_Client._getWindowReturnCache !== null)
|
316 | {
|
317 | return CB_Client._getWindowReturnCache;
|
318 | }
|
319 |
|
320 | //Gets the window chosen (if we arrived here, it means we mind iframes):
|
321 | CB_Client._getWindowReturnCache = CB_Client.getWindowBase(); //Stores the window chosen in the cache:
|
322 |
|
323 | return CB_Client._getWindowReturnCache;
|
324 | }
|
325 |
|
326 |
|
327 | /**
|
328 | * Returns the [document]{@link https://developer.mozilla.org/en-US/docs/Web/API/Window/document} object of the first parent (the topmost one). Useful in case the script is running in an [iframe]{@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe} or more.
|
329 | * @function
|
330 | * @returns {Object}
|
331 | */
|
332 | CB_Client.getDocumentBase = function()
|
333 | {
|
334 | //By default, uses the current document object:
|
335 | var documentBase = document;
|
336 |
|
337 | //Tries to get the document object of the topmost window (it can fail if it is not in the same domain or it is running locally):
|
338 | try { documentBase = CB_Client.getWindowBase().document; } catch(E) {}
|
339 |
|
340 | return documentBase;
|
341 | }
|
342 |
|
343 |
|
344 | /**
|
345 | * Returns the [document]{@link https://developer.mozilla.org/en-US/docs/Web/API/Window/document} object (having in mind whether the script is running in one [iframe]{@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe} or more, if we want).
|
346 | * @function
|
347 | * @param {boolean} [mindIframes={@link CB_Configuration.CrossBase.MIND_IFRAMES}] - If set to true, it will try to get and return the topmost [document]{@link https://developer.mozilla.org/en-US/docs/Web/API/Window/document} object. Useful in case the script is running in an [iframe]{@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe} or more.
|
348 | * @returns {Object}
|
349 | */
|
350 | CB_Client.getDocument = function(mindIframes)
|
351 | {
|
352 | if (typeof(mindIframes) === "undefined" || mindIframes === null) { mindIframes = CB_Configuration[CB_BASE_NAME].MIND_IFRAMES; }
|
353 |
|
354 | var documentChosen = document;
|
355 | if (mindIframes) { documentChosen = CB_Client.getDocumentBase(); }
|
356 |
|
357 | return documentChosen;
|
358 | }
|
359 |
|
360 |
|
361 | /**
|
362 | * Tells whether the [canvas]{@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas} element is supported natively or not.
|
363 | * @function
|
364 | * @returns {boolean}
|
365 | */
|
366 | CB_Client.supportsCanvas = function()
|
367 | {
|
368 | return CB_Configuration[CB_BASE_NAME]._supportsCanvas();
|
369 | }
|
370 |
|
371 |
|
372 | CB_Client._supportsCSS3TransformReturnCache;
|
373 | /**
|
374 | * Tells whether [CSS3]{@link https://developer.mozilla.org/en-US/docs/Web/CSS/CSS3} [transform]{@link https://developer.mozilla.org/en-US/docs/Web/CSS/transform} is supported natively or not.
|
375 | * @function
|
376 | * @returns {boolean}
|
377 | */
|
378 | CB_Client.supportsCSS3Transform = function()
|
379 | {
|
380 | if (typeof(CB_Client._supportsCSS3TransformReturnCache) === "undefined" || CB_Client._supportsCSS3TransformReturnCache === null)
|
381 | {
|
382 | var documentBodyStyle = document.body.style;
|
383 | CB_Client._supportsCSS3TransformReturnCache = (typeof(documentBodyStyle.transform) !== "undefined" || typeof(documentBodyStyle.WebkitTransform) !== "undefined" || typeof(documentBodyStyle.MozTransform) !== "undefined" || typeof(documentBodyStyle.OTransform) !== "undefined" || typeof(documentBodyStyle.MsTransform) !== "undefined" || typeof(documentBodyStyle.KhtmlTransform) !== "undefined");
|
384 | }
|
385 |
|
386 | return CB_Client._supportsCSS3TransformReturnCache;
|
387 | }
|
388 |
|
389 |
|
390 | /**
|
391 | * Function that tells whether [PHP]{@link https://en.wikipedia.org/wiki/PHP} is available or not.
|
392 | * @function
|
393 | * @returns {boolean}
|
394 | */
|
395 | CB_Client.supportsPHP = function()
|
396 | {
|
397 | return (typeof(CB_supportedPHP) !== "undefined" && CB_supportedPHP === "YES");
|
398 | }
|
399 |
|
400 |
|
401 | /**
|
402 | * Returns the available version of [PHP]{@link https://en.wikipedia.org/wiki/PHP} (if any), as either an array of strings or as a string.
|
403 | * @function
|
404 | * @param {boolean} [asString=false] - If set to true, returns the version as a string.
|
405 | * @returns {array|string}
|
406 | */
|
407 | CB_Client.getPHPVersion = function(asString)
|
408 | {
|
409 | if (typeof(CB_PHPVersion) === "undefined") { CB_PHPVersion = 0; }
|
410 | return asString ? (CB_PHPVersion + "") : (CB_PHPVersion + "").split(".");
|
411 | }
|
412 |
|
413 |
|
414 | /**
|
415 | * Function that tells whether [Node.js]{@link https://en.wikipedia.org/wiki/Node.js} is available (checks the availability of [process.versions.node]{@link https://nodejs.org/api/process.html#process_process_versions}) or not.
|
416 | * @function
|
417 | * @returns {boolean}
|
418 | */
|
419 | //* Source: Dan. B. @ http://stackoverflow.com/questions/17575790/environment-detection-node-js-or-browser
|
420 | CB_Client.supportsNodeJS = function()
|
421 | {
|
422 | return (typeof(process) === "object" && process !== null && typeof(process.versions) === "object" && typeof(process.versions.node) !== "undefined");
|
423 | }
|
424 |
|
425 |
|
426 | /**
|
427 | * Returns the available version of [Node.js]{@link https://en.wikipedia.org/wiki/Node.js} (if any), as either an array of strings or as a string.
|
428 | * @function
|
429 | * @param {boolean} [asString=false] - If set to true, returns the version as a string.
|
430 | * @returns {array|string}
|
431 | */
|
432 | CB_Client.getNodeJSVersion = function(asString)
|
433 | {
|
434 | if (typeof(process) === "object" && process !== null && CB_isString(process.version))
|
435 | {
|
436 | return asString ? process.version : process.version.replace(CB_regularExpressionString("-", true, true), ".").split(".");
|
437 | }
|
438 | else { return asString ? "0.0.0" : [0, 0, 0]; }
|
439 | }
|
440 |
|
441 |
|
442 | /**
|
443 | * Function that tells whether [Microsoft Silverlight]{@link https://en.wikipedia.org/wiki/Microsoft_Silverlight} plugin is available or not.
|
444 | * @function
|
445 | * @returns {boolean}
|
446 | */
|
447 | CB_Client.supportsSilverlight = function()
|
448 | {
|
449 | var isSilverlightInstalled = false;
|
450 | try
|
451 | {
|
452 | isSilverlightInstalled = !!(new ActiveXObject("AgControl.AgControl"));
|
453 | }
|
454 | catch(E)
|
455 | {
|
456 | if (navigator.plugins["Silverlight Plug-In"])
|
457 | {
|
458 | isSilverlightInstalled = true;
|
459 | }
|
460 | else { isSilverlightInstalled = false; }
|
461 | }
|
462 |
|
463 | return isSilverlightInstalled;
|
464 | }
|
465 |
|
466 |
|
467 | /**
|
468 | * Returns the available version of [Microsoft Silverlight]{@link https://en.wikipedia.org/wiki/Microsoft_Silverlight} plugin (if any), as either an array of strings or as a string.
|
469 | * @function
|
470 | * @param {boolean} [asString=false] - If set to true, returns the version as a string.
|
471 | * @returns {array|string}
|
472 | */
|
473 | CB_Client.getSilverlightVersion = function(asString)
|
474 | {
|
475 | if (navigator.plugins["Silverlight Plug-In"] && navigator.plugins["Silverlight Plug-In"].description && CB_isString(navigator.plugins["Silverlight Plug-In"].description) && CB_trim(navigator.plugins["Silverlight Plug-In"].description) !== "")
|
476 | {
|
477 | return asString ? navigator.plugins["Silverlight Plug-In"].description : navigator.plugins["Silverlight Plug-In"].description.replace(CB_regularExpressionString("-", true, true), ".").split(".");
|
478 | }
|
479 | else { return asString ? "0.0.0" : [0, 0, 0]; }
|
480 | }
|
481 |
|
482 |
|
483 |
|
484 | /**
|
485 | * Function that tells whether [Adobe Flash (formerly Macromedia Flash)]{@link https://en.wikipedia.org/wiki/Adobe_Flash_Player} plugin is available or not.
|
486 | * @function
|
487 | * @returns {boolean}
|
488 | */
|
489 | CB_Client.supportsFlash = function()
|
490 | {
|
491 | var isFlashInstalled = false;
|
492 |
|
493 | if ("ActiveXObject" in window)
|
494 | {
|
495 | try
|
496 | {
|
497 | isFlashInstalled = !!(new ActiveXObject("ShockwaveFlash.ShockwaveFlash"));
|
498 | }
|
499 | catch(E) { isFlashInstalled = false; }
|
500 | }
|
501 |
|
502 | if (!isFlashInstalled && typeof(navigator.mimeTypes) !== "undefined")
|
503 | {
|
504 | var mime = navigator.mimeTypes['application/x-shockwave-flash']
|
505 | if (typeof(mime) !== "undefined" && mime !== null && mime.enabledPlugin)
|
506 | {
|
507 | isFlashInstalled = true;//!!mime;
|
508 | }
|
509 | }
|
510 |
|
511 | if (!isFlashInstalled && typeof(navigator.plugins) !== "undefined")
|
512 | {
|
513 | var plugin = navigator.plugins["Shockwave Flash"];
|
514 | isFlashInstalled = !!plugin;
|
515 | }
|
516 |
|
517 | return isFlashInstalled;
|
518 | }
|
519 |
|
520 |
|
521 | /**
|
522 | * Returns the available version of [Adobe Flash (formerly Macromedia Flash)]{@link https://en.wikipedia.org/wiki/Adobe_Flash_Player} plugin, if any, as either an array of strings or as a string.
|
523 | * @function
|
524 | * @param {boolean} [asString=false] - If set to true, returns the version as a string.
|
525 | * @returns {array|string}
|
526 | */
|
527 | CB_Client.getFlashVersion = function(asString)
|
528 | {
|
529 | var version = "0.0.0";
|
530 |
|
531 | try
|
532 | {
|
533 | try
|
534 | {
|
535 | var axo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.6');
|
536 | try { axo.AllowScriptAccess = 'always'; }
|
537 | catch(E) { return asString ? '6.0.0' : '6.0.0'.split('.'); }
|
538 | }
|
539 | catch(E) {}
|
540 | version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
|
541 | version = version.replace(CB_regularExpressionString(",", true, true), ".");
|
542 | return asString ? version : version.split('.');
|
543 | }
|
544 | catch(E)
|
545 | {
|
546 | try
|
547 | {
|
548 | if (navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin)
|
549 | {
|
550 | version = (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]).description.replace(/\D+/g, ",").match(/^,?(.+),?$/)[1];
|
551 | version = version.replace(CB_regularExpressionString(",", true, true), ".");
|
552 | return asString ? version : version.split('.');
|
553 | }
|
554 | } catch(E) {}
|
555 | }
|
556 |
|
557 | return asString ? version : version.split('.');
|
558 | }
|
559 |
|
560 |
|
561 | /**
|
562 | * Tells whether the script is running locally (using "file:" protocol) or not.
|
563 | * @function
|
564 | * @param {boolean} [mindIframes={@link CB_Configuration.CrossBase.MIND_IFRAMES}] - If set to true, it will try to check the protocol of the topmost [window]{@link https://developer.mozilla.org/en-US/docs/Web/API/Window} object. Useful in case the script is running in an [iframe]{@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe} or more.
|
565 | * @returns {boolean}
|
566 | */
|
567 | CB_Client.isRunningLocally = function(mindIframes)
|
568 | {
|
569 | if (typeof(mindIframes) === "undefined" || mindIframes === null) { mindIframes = CB_Configuration[CB_BASE_NAME].MIND_IFRAMES; }
|
570 |
|
571 | var isRunningLocally = false; //We assume that the script is not running locally by default.
|
572 | var protocolUsed = "";
|
573 |
|
574 | try
|
575 | {
|
576 | var windowObject = CB_Client.getWindow(mindIframes);
|
577 | if (typeof(windowObject.location) !== "undefined" && typeof(windowObject.location.protocol) !== "undefined")
|
578 | {
|
579 | protocolUsed = windowObject.location.protocol;
|
580 | }
|
581 | }
|
582 | catch(E)
|
583 | {
|
584 | if (typeof(window.location) !== "undefined" && typeof(window.location.protocol) !== "undefined")
|
585 | {
|
586 | protocolUsed = window.location.protocol;
|
587 | }
|
588 | }
|
589 |
|
590 | if (protocolUsed === "file:") { isRunningLocally = true; }
|
591 | //else if (protocolUsed === "http:" || protocolUsed === "https:") { isRunningLocally = false; }
|
592 |
|
593 | return isRunningLocally;
|
594 | }
|
595 |
|
596 |
|
597 | CB_Client._isRunningOnNWjsReturnCache = null;
|
598 | /**
|
599 | * Tells whether the script is running on [NW.js (formerly node-webkit)]{@link https://nwjs.io/} or not.
|
600 | * @function
|
601 | * @returns {boolean}
|
602 | */
|
603 | //* Source: Kuf @ http://stackoverflow.com/questions/31968355/detect-if-web-app-is-running-in-nwjs
|
604 | CB_Client.isRunningOnNWjs = function()
|
605 | {
|
606 | if (typeof(CB_Client._isRunningOnNWjsReturnCache) !== "undefined" && CB_Client._isRunningOnNWjsReturnCache !== null) { return CB_Client._isRunningOnNWjsReturnCache; }
|
607 | if (typeof(nw) !== "undefined" && nw !== null) { return CB_Client._isRunningOnNWjsReturnCache = true; }
|
608 | try
|
609 | {
|
610 | return CB_Client._isRunningOnNWjsReturnCache = (typeof(require) === "function" && (typeof(nw) !== "undefined" && nw !== null && nw.App || typeof(require("nw.gui")) !== "undefined"));
|
611 | }
|
612 | catch(E) { return CB_Client._isRunningOnNWjsReturnCache = false; }
|
613 | }
|
614 |
|
615 |
|
616 | CB_Client._isRunningOnElctronReturnCache = null;
|
617 | /**
|
618 | * Tells whether the script is running on [Electron (Electron.js)]{@link https://electronjs.org/} or not.
|
619 | * @function
|
620 | * @returns {boolean}
|
621 | */
|
622 | //* Source: cheton @ https://github.com/cheton/is-electron/blob/master/index.js
|
623 | CB_Client.isRunningOnElectron = function()
|
624 | {
|
625 | if (typeof(CB_Client._isRunningOnElectronReturnCache) !== "undefined" && CB_Client._isRunningOnElectronReturnCache !== null) { return CB_Client._isRunningOnElectronReturnCache; }
|
626 | //if (typeof(nw) !== "undefined" && nw !== null) { return CB_Client._isRunningOnElectronReturnCache = true; }
|
627 | try
|
628 | {
|
629 | return CB_Client._isRunningOnElectronReturnCache = (typeof(navigator) === "object" && navigator !== null && typeof(navigator.userAgent) === "string" && navigator.userAgent.indexOf("Electron") !== -1);
|
630 | }
|
631 | catch(E) { return CB_Client._isRunningOnElectronReturnCache = false; }
|
632 | }
|
633 |
|
634 |
|
635 | /**
|
636 | * Exits and finishes the script. In a browser, it will try to close the window or at least abandon it redirecting to an empty one (or to a desired URL). In an app ([NW.js (formerly node-webkit)]{@link https://nwjs.io/}/[Electron (Electron.js)]{@link https://electronjs.org/}/[Apache Cordova]{@link https://cordova.apache.org/}/[Adobe PhoneGap]{@link https://phonegap.com/}/[Appcelerator Titanium SDK]{@link https://en.wikipedia.org/wiki/Appcelerator_Titanium}/[Appcelerator TideSDK (Titanium Desktop)]{@link https://github.com/appcelerator-archive/titanium_desktop}/[Weixin (WeChat)]{@link https://en.wikipedia.org/wiki/WeChat}/etc.), it will try to close the app.
|
637 | * @function
|
638 | * @param {boolean} [allowWindowCloseFallback=true] - Defines whether to allow using the [window.close]{@link https://developer.mozilla.org/en-US/docs/Web/API/Window/close} method as a fallback.
|
639 | * @param {boolean} [allowRedirectionFallback=true] - Defines whether to redirect the current client as a fallback (to the URL defined in the "redirectionAddress" parameter).
|
640 | * @param {boolean} [redirectionAddress='about:blank'] - Defines the URL where the current client will be redirected to in the case that the window cannot be closed. Only used if the "allowRedirectionFallback" parameter is set to true.
|
641 | * @todo Have in mind iframes (think about it).
|
642 | */
|
643 | CB_Client.exit = function(allowWindowCloseFallback, allowRedirectionFallback, redirectionAddress)
|
644 | {
|
645 | if (typeof(allowRedirectionFallback) === "undefined" || allowRedirectionFallback === null) { allowRedirectionFallback = true; }
|
646 | if (typeof(allowWindowCloseFallback) === "undefined" || allowWindowCloseFallback === null) { allowWindowCloseFallback = true; }
|
647 | if (typeof(redirectionAddress) === "undefined" || redirectionAddress === null) { redirectionAddress = "about:blank"; }
|
648 |
|
649 | var useFallback = true;
|
650 |
|
651 | //Tries to use NW.js (node-webkit) if available to quit the app:
|
652 | if (CB_Client.isRunningOnNWjs())
|
653 | {
|
654 | if (typeof(nw) !== "undefined" && nw !== null && nw.App && typeof(nw.App.closeAllWindows) === "function") { try { nw.App.closeAllWindows(); useFallback = false; } catch(E) { useFallback = true; } }
|
655 | if (useFallback && typeof(require) === "function")
|
656 | {
|
657 | try
|
658 | {
|
659 | var gui = require("nw.gui");
|
660 | if (typeof(gui) !== "undefined" && gui !== null && gui.App)
|
661 | {
|
662 | if (typeof(gui.App.closeAllWindows) === "function") { try { gui.App.closeAllWindows(); useFallback = false; } catch(E) { useFallback = true; } }
|
663 | if (useFallback && typeof(gui.App.quit) === "function") { try { gui.App.quit(); useFallback = false; } catch(E) { useFallback = true; } }
|
664 | }
|
665 | }
|
666 | catch(E) { useFallback = true; }
|
667 | }
|
668 | if (useFallback && typeof(nw) !== "undefined" && nw !== null && nw.App && typeof(nw.App.quit) === "function") { try { nw.App.quit(); useFallback = false; } catch(E) { useFallback = true; } }
|
669 | }
|
670 |
|
671 | //Tries to use Electron (Electron.js) if available to quit the app:
|
672 | if (CB_Client.isRunningOnElectron() && typeof(require) === "function")
|
673 | {
|
674 | try
|
675 | {
|
676 | var app = require('app');
|
677 | app.on("window-all-closed", app.quit);
|
678 | app.quit();
|
679 | useFallback = false;
|
680 | }
|
681 | catch(E) { useFallback = true; }
|
682 | }
|
683 |
|
684 | //If able, uses PhoneGap with navigator.app:
|
685 | if (typeof(navigator) !== "undefined" && typeof(navigator.app) !== "undefined" && typeof(navigator.app.exitApp) !== "undefined")
|
686 | {
|
687 | try { navigator.app.exitApp(); useFallback = false; } catch(E) { useFallback = true; }
|
688 | }
|
689 |
|
690 | //If able uses PhoneGap with navigator.device:
|
691 | if (typeof(navigator) !== "undefined" && typeof(navigator.device) !== "undefined" && typeof(navigator.device.exitApp) !== "undefined")
|
692 | {
|
693 | try { navigator.device.exitApp(); useFallback = false; } catch(E) { useFallback = true; }
|
694 | }
|
695 |
|
696 | //If able uses WeixinJSBridge (Weixin / Wechat JavaScript Bridge):
|
697 | if (typeof(WeixinJSBridge) !== "undefined" && typeof(WeixinJSBridge.call) !== "undefined")
|
698 | {
|
699 | //WeixinJSBridge.invoke("closeWindow", {}, function(e){});
|
700 | try { WeixinJSBridge.call("closeWindow"); useFallback = false; } catch(E) { useFallback = true; }
|
701 | }
|
702 |
|
703 | //If able uses Titanium/TideSDK:
|
704 | if (typeof(Ti) !== "undefined" && typeof(Ti.App) !== "undefined" && typeof(Ti.App.exit) !== "undefined")
|
705 | {
|
706 | try { Ti.App.exit(); useFallback = false; } catch(E) { useFallback = true; }
|
707 | }
|
708 |
|
709 | //If we want to close using the fallback:
|
710 | if (useFallback)
|
711 | {
|
712 | //Uses redirection if it is allowed:
|
713 | if (allowRedirectionFallback)
|
714 | {
|
715 | setTimeout(function() { location.href = redirectionAddress; }, 200); //Lets a little bit time to process window.close() (if allowed).
|
716 | }
|
717 |
|
718 | //Uses window.close() if it is allowed:
|
719 | if (allowWindowCloseFallback)
|
720 | {
|
721 | try
|
722 | {
|
723 |
|
724 | //if (navigator.userAgent.indexOf('MSIE') !== -1 && (navigator.appVersion.indexOf("MSIE 5") !== -1 || navigator.appVersion.indexOf("MSIE 6") !== -1))
|
725 | //{
|
726 | //CB_Client.getWindow().opener = top;
|
727 | //CB_Client.getWindow().close();
|
728 | //}
|
729 | //else
|
730 | //{
|
731 | //var ventana = CB_Client.getWindow().open("", "_self");
|
732 | //ventana.close();
|
733 | //}
|
734 |
|
735 |
|
736 | var thisWindow = window.open(allowRedirectionFallback ? redirectionAddress : "", "_self", "", "true");
|
737 | thisWindow.opener = top;
|
738 | CB_windowCloseEncapsulated = thisWindow.close;
|
739 | CB_windowCloseEncapsulated();
|
740 |
|
741 | //if (navigator.userAgent.indexOf('MSIE') !== -1 && (navigator.appVersion.indexOf("MSIE 5") !== -1 || navigator.appVersion.indexOf("MSIE 6") !== -1))
|
742 | //{
|
743 | //window.opener = top;
|
744 | //window.close();
|
745 | //}
|
746 |
|
747 | //var thisWindow = window.parent.open(allowRedirectionFallback ? redirectionAddress : location.href, "_self");
|
748 | //window.parent.close();
|
749 |
|
750 |
|
751 | //else
|
752 | //{
|
753 | //var thisWindow = CB_Client.getWindow(true).open(allowRedirectionFallback ? redirectionAddress : "", "_self", "", "true");
|
754 | //thisWindow.opener = CB_Client.getWindow().top;
|
755 | //CB_windowCloseEncapsulated = thisWindow.close;
|
756 | //CB_windowCloseEncapsulated();
|
757 | //}
|
758 | }
|
759 | catch(E)
|
760 | {
|
761 | try
|
762 | {
|
763 | var thisWindow = window.open(allowRedirectionFallback ? redirectionAddress : location.href, "_self");
|
764 | thisWindow.close();
|
765 | }
|
766 | catch(E)
|
767 | {
|
768 | try
|
769 | {
|
770 | window.opener = top;
|
771 | window.close();
|
772 | }
|
773 | catch(E)
|
774 | {
|
775 | try
|
776 | {
|
777 | window.opener = window;
|
778 | window.close();
|
779 | }
|
780 | catch(E)
|
781 | {
|
782 | try
|
783 | {
|
784 | window.opener = "CB_TryingToCloseWindow";
|
785 | window.close();
|
786 | }
|
787 | catch(E)
|
788 | {
|
789 | try { window.close(); } catch(E) { }
|
790 | }
|
791 | }
|
792 | }
|
793 | }
|
794 | }
|
795 | }
|
796 | }
|
797 | }
|
798 |
|
799 |
|
800 | /**
|
801 | * Redirects the current client to the desired location (having in mind whether the script is running in one [iframe]{@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe} or more, if we want).
|
802 | * @function
|
803 | * @param {string} address - The address where we want to go.
|
804 | * @param {string} [getData] - Any URL (GET) variables we want to send (as for example "data1=value1&data2=value2").
|
805 | * @param {boolean} [mindIframes={@link CB_Configuration.CrossBase.MIND_IFRAMES}] - If set to true, it will try to redirect the topmost [window]{@link https://developer.mozilla.org/en-US/docs/Web/API/Window} object. Useful in case the script is running in an [iframe]{@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe} or more.
|
806 | */
|
807 | CB_Client.redirectTo = function(address, getData, mindIframes)
|
808 | {
|
809 | getData = CB_ltrim(CB_trim(getData), ["&", "?"]);
|
810 | if (getData !== "")
|
811 | {
|
812 | if (address.indexOf("?") === -1) { getData = "?" + getData; }
|
813 | else { getData = "&" + getData; }
|
814 | }
|
815 |
|
816 | try { CB_Client.getWindow(mindIframes).location = address + getData; }
|
817 | catch(E) { window.location = address + getData; }
|
818 | }
|
819 |
|
820 |
|
821 |
|
822 | /**
|
823 | * Returns the current URL, if possible (having in mind whether the script is running in one [iframe]{@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe} or more, if we want).
|
824 | * @function
|
825 | * @param {boolean} [mindIframes={@link CB_Configuration.CrossBase.MIND_IFRAMES}] - If set to true, it will try to get the location of the topmost [window]{@link https://developer.mozilla.org/en-US/docs/Web/API/Window} object. Useful in case the script is running in an [iframe]{@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe} or more.
|
826 | * @returns {string}
|
827 | */
|
828 | CB_Client.getLocation = function(mindIframes)
|
829 | {
|
830 | var address = "";
|
831 | try
|
832 | {
|
833 | address = CB_Client.getWindow(mindIframes).location.href;
|
834 | }
|
835 | catch(E) { address = ""; }
|
836 | if (!address) { address = window.location.href; }
|
837 | return address;
|
838 | }
|
839 |
|
840 | /**
|
841 | * Returns the given address without the file (for example, if "http://whatever.com/index.html" is given, it will return "http://whatever.com/").
|
842 | * @function
|
843 | * @param {string} address - The address that we want to filter.
|
844 | * @param {string} [fallbackURL] - The address that we want it to return in the case that the given one is not allowed (used when "allowsLocal" does not allow a local address). If it contains a file, it will not be stripped out.
|
845 | * @param {boolean} [allowsLocal=true] - Defines whether to allow returning a local address or not. If it is set to false and the address is local, it will return the "fallbackURL" instead (without stripping out the file, if any).
|
846 | * @returns {string}
|
847 | */
|
848 | CB_Client.getAddressWithoutFile = function(address, fallbackURL, allowsLocal)
|
849 | {
|
850 | if (allowsLocal !== true && allowsLocal !== false) { allowsLocal = true; }
|
851 |
|
852 | address = CB_trim(address);
|
853 | address = CB_rtrim(address.substring(0, address.lastIndexOf("/")), "/") + "/";
|
854 |
|
855 | if (allowsLocal || address.indexOf("://localhost") === -1 && address.indexOf("://127.0.0.1") === -1 && address.indexOf("://192.168") === -1 || !CB_isString(fallbackURL))
|
856 | {
|
857 | return address;
|
858 | }
|
859 | else { return fallbackURL; }
|
860 | }
|
861 |
|
862 |
|
863 | /**
|
864 | * Returns the current URL without the file (for example, if "http://whatever.com/index.html" is the current URL, it will return "http://whatever.com/"), if possible (having in mind whether the script is running in one [iframe]{@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe} or more, if we want).
|
865 | * @function
|
866 | * @param {string} [fallbackURL] - The address that we want it to return in the case that the current one is not allowed (used when "allowsLocal" does not allow a local address). If it contains a file, it will not be stripped out.
|
867 | * @param {boolean} [allowsLocal=true] - Defines whether to allow returning a local address or not. If it is set to false and the current address is local, it will return the "fallbackURL" instead (without stripping out the file, if any).
|
868 | * @param {boolean} [mindIframes={@link CB_Configuration.CrossBase.MIND_IFRAMES}] - If set to true, it will try to get the location of the topmost [window]{@link https://developer.mozilla.org/en-US/docs/Web/API/Window} object. Useful in case the script is running in an [iframe]{@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe} or more.
|
869 | * @returns {string}
|
870 | */
|
871 | CB_Client.getLocationWithoutFile = function(fallbackURL, allowsLocal, mindIframes)
|
872 | {
|
873 | return CB_Client.getAddressWithoutFile(CB_Client.getLocation(mindIframes), fallbackURL, allowsLocal);
|
874 | }
|
875 |
|
876 |
|
877 | //var firstTimeShit = 0;
|
878 | /**
|
879 | * Gets the starting pixel of top or left coordinates for [getBoundingClientRect]{@link https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect} (it's not 0 in some Internet Explorer versions).
|
880 | * @function
|
881 | * @param {('left'|'top')} [leftOrTop='left'] - String that defines whether we want it to return the values for "left" or for "top".
|
882 | * @returns {integer}
|
883 | */
|
884 | CB_Client.getBoundingClientRectMargin = function(leftOrTop)
|
885 | {
|
886 | leftOrTop = leftOrTop.toLowerCase();
|
887 | if (leftOrTop === "" || leftOrTop !== "left" && leftOrTop !== "top") { leftOrTop = "left"; }
|
888 |
|
889 | var getBoundingClientRectMarginDiv = CB_Elements.id("getBoundingClientRectMarginDiv");
|
890 | if (getBoundingClientRectMarginDiv === null)
|
891 | {
|
892 | var getBoundingClientRectMarginDiv = document.createElement("div");
|
893 | getBoundingClientRectMarginDiv.id = "getBoundingClientRectMarginDiv";
|
894 | getBoundingClientRectMarginDiv.style.position = "absolute";
|
895 | getBoundingClientRectMarginDiv.style.width = getBoundingClientRectMarginDiv.style.height = "0px";
|
896 | getBoundingClientRectMarginDiv.style.visibility = "hidden";
|
897 | getBoundingClientRectMarginDiv.style.left = "0px";
|
898 | getBoundingClientRectMarginDiv.style.top = "0px";
|
899 | var tagBody = CB_Elements.tag("body", document);
|
900 | if (typeof(tagBody) !== "undefined" && tagBody !== null && typeof(tagBody[0]) !== "undefined" && tagBody[0] !== null)
|
901 | {
|
902 | tagBody[0].appendChild(getBoundingClientRectMarginDiv);
|
903 | //firstTimeShit = true;
|
904 | }
|
905 | }
|
906 |
|
907 | if (typeof(getBoundingClientRectMarginDiv.getBoundingClientRect) !== "undefined" && getBoundingClientRectMarginDiv.getBoundingClientRect !== null)
|
908 | {
|
909 | var rectMargin = getBoundingClientRectMarginDiv.getBoundingClientRect();
|
910 | var margin = 0;
|
911 | if (typeof(rectMargin[leftOrTop]) !== "undefined" && rectMargin[leftOrTop] !== null && !isNaN(rectMargin[leftOrTop]))
|
912 | {
|
913 | margin = rectMargin[leftOrTop];
|
914 | }
|
915 | }
|
916 |
|
917 | if (margin < 0)
|
918 | {
|
919 | if (leftOrTop === "left") { margin += CB_Screen.getScrollLeft(); }
|
920 | else { margin += CB_Screen.getScrollTop(); }
|
921 | if (margin < 0) { margin = 0; }
|
922 | }
|
923 |
|
924 | return margin;
|
925 | }
|
926 |
|
927 |
|
928 | /**
|
929 | * Tries to change the [document title]{@link https://developer.mozilla.org/en-US/docs/Web/API/Document/title} and returns it.
|
930 | * @function
|
931 | * @param {newTitle} newTitle - The desired new title.
|
932 | * @returns {string}
|
933 | */
|
934 | CB_Client.setTitle = function(newTitle)
|
935 | {
|
936 | CB_Client.getDocumentBase().title = newTitle;
|
937 | //Chrome and Opera fix:
|
938 | var tagTitle = CB_Elements.tag("title");
|
939 | if (typeof(tagTitle) !== "undefined" && tagTitle !== null && typeof(tagTitle[0]) !== "undefined" && tagTitle[0] !== null)
|
940 | {
|
941 | tagTitle = tagTitle[0];
|
942 | try { tagTitle.innerHTML = newTitle; } catch(E) {} //Catch to avoid IE8 error.
|
943 | }
|
944 | titleCurrent = CB_Client.getTitle();
|
945 | return titleCurrent;
|
946 | }
|
947 |
|
948 |
|
949 | /**
|
950 | * Returns the current [document title]{@link https://developer.mozilla.org/en-US/docs/Web/API/Document/title}.
|
951 | * @function
|
952 | * @returns {string}
|
953 | */
|
954 | CB_Client.getTitle = function()
|
955 | {
|
956 | var title = CB_trim(CB_Client.getDocumentBase().title);
|
957 | if (title === "")
|
958 | {
|
959 | //Chrome and Opera fix:
|
960 | var tagTitle = CB_Elements.tag("title");
|
961 | if (typeof(tagTitle) !== "undefined" && tagTitle !== null && typeof(tagTitle[0]) !== "undefined" && tagTitle[0] !== null)
|
962 | {
|
963 | tagTitle = tagTitle[0];
|
964 | try { title = tagTitle.innerHTML; } catch(E) { title = ""; } //Catch to avoid IE8 error.
|
965 | }
|
966 | }
|
967 | return title;
|
968 | }
|
969 |
|
970 |
|
971 | //Sets a function to execute when a desired event is fired:
|
972 | CB_Client._setEvent = function(eventName, eventFunction, keepOldFunction, useCapture, target)
|
973 | {
|
974 | //If they are not set, use default values for optional parameters:
|
975 | if (typeof(keepOldFunction) === "undefined" || keepOldFunction === null) { keepOldFunction = true; } //If not set, it keeps old function by default.
|
976 | if (typeof(target) === "undefined" || target === null)
|
977 | {
|
978 | target = window;
|
979 | }
|
980 |
|
981 | //If a function has been sent:
|
982 | if (typeof(eventFunction) === "function")
|
983 | {
|
984 | //If able, adds the function given to the event:
|
985 | CB_Events.add
|
986 | (
|
987 | target,
|
988 | eventName,
|
989 | function(e)
|
990 | {
|
991 | e = CB_Events.normalize(e);
|
992 | if (typeof(eventFunction) === "function") { return eventFunction(e); }
|
993 | return true;
|
994 | },
|
995 | useCapture,
|
996 | keepOldFunction,
|
997 | true
|
998 | );
|
999 | }
|
1000 | //...but if the function given is null, it will cancel the event:
|
1001 | else if (eventFunction === null)
|
1002 | {
|
1003 | CB_Events.removeByName(target, eventName);
|
1004 | }
|
1005 | }
|
1006 |
|
1007 |
|
1008 | }</pre>
|
1009 | </article>
|
1010 | </section>
|
1011 |
|
1012 |
|
1013 |
|
1014 |
|
1015 |
|
1016 | </div>
|
1017 | </div>
|
1018 |
|
1019 | <div class="clearfix"></div>
|
1020 |
|
1021 |
|
1022 |
|
1023 | </div>
|
1024 | </div>
|
1025 |
|
1026 |
|
1027 | <div class="modal fade" id="searchResults">
|
1028 | <div class="modal-dialog">
|
1029 | <div class="modal-content">
|
1030 | <div class="modal-header">
|
1031 | <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
1032 | <h4 class="modal-title">Search results</h4>
|
1033 | </div>
|
1034 | <div class="modal-body"></div>
|
1035 | <div class="modal-footer">
|
1036 | <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
1037 | </div>
|
1038 | </div>
|
1039 | </div>
|
1040 | </div>
|
1041 |
|
1042 |
|
1043 | <footer>
|
1044 |
|
1045 |
|
1046 | <span class="copyright">
|
1047 | <a href="printable/" target="_blank">See a more printer-friendly version</a><hr /><span style="color:#000000">© <address style="display:inline; font-style:normal;"><a href="https://crossbrowdy.com/" target="_blank">CrossBrowdy</a> API documentation</address> by <a href="https://joanalbamaldonado.com/" target="_blank">Joan Alba Maldonado</a> - <a href="https://creativecommons.org/licenses/by/4.0/" target="_blank">Creative Commons Attribution 4.0 International</a><br />DocStrap Copyright © 2012-2015 The contributors to the JSDoc3 and DocStrap projects.</span>
|
1048 | </span>
|
1049 |
|
1050 | <span class="jsdoc-message">
|
1051 | Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a>
|
1052 |
|
1053 | on Wed Mar 22nd 2023
|
1054 |
|
1055 | using the <a href="https://github.com/docstrap/docstrap">DocStrap template</a>.
|
1056 | </span>
|
1057 | </footer>
|
1058 |
|
1059 | <script src="scripts/docstrap.lib.js"></script>
|
1060 | <script src="scripts/toc.js"></script>
|
1061 |
|
1062 | <script type="text/javascript" src="scripts/fulltext-search-ui.js"></script>
|
1063 |
|
1064 |
|
1065 | <script>
|
1066 | $( function () {
|
1067 | $( "[id*='$']" ).each( function () {
|
1068 | var $this = $( this );
|
1069 |
|
1070 | $this.attr( "id", $this.attr( "id" ).replace( "$", "__" ) );
|
1071 | } );
|
1072 |
|
1073 | $( ".tutorial-section pre, .readme-section pre, pre.prettyprint.source" ).each( function () {
|
1074 | var $this = $( this );
|
1075 |
|
1076 | var example = $this.find( "code" );
|
1077 | exampleText = example.html();
|
1078 | var lang = /{@lang (.*?)}/.exec( exampleText );
|
1079 | if ( lang && lang[1] ) {
|
1080 | exampleText = exampleText.replace( lang[0], "" );
|
1081 | example.html( exampleText );
|
1082 | lang = lang[1];
|
1083 | } else {
|
1084 | var langClassMatch = example.parent()[0].className.match(/lang\-(\S+)/);
|
1085 | lang = langClassMatch ? langClassMatch[1] : "javascript";
|
1086 | }
|
1087 |
|
1088 | if ( lang ) {
|
1089 |
|
1090 | $this
|
1091 | .addClass( "sunlight-highlight-" + lang )
|
1092 | .addClass( "linenums" )
|
1093 | .html( example.html() );
|
1094 |
|
1095 | }
|
1096 | } );
|
1097 |
|
1098 | Sunlight.highlightAll( {
|
1099 | lineNumbers : true,
|
1100 | showMenu : true,
|
1101 | enableDoclinks : true
|
1102 | } );
|
1103 |
|
1104 | $.catchAnchorLinks( {
|
1105 | navbarOffset: 10
|
1106 | } );
|
1107 | $( "#toc" ).toc( {
|
1108 | anchorName : function ( i, heading, prefix ) {
|
1109 | return $( heading ).attr( "id" ) || ( prefix + i );
|
1110 | },
|
1111 | selectors : "#toc-content h1,#toc-content h2,#toc-content h3,#toc-content h4",
|
1112 | showAndHide : false,
|
1113 | smoothScrolling: true
|
1114 | } );
|
1115 |
|
1116 | $( "#main span[id^='toc']" ).addClass( "toc-shim" );
|
1117 | $( '.dropdown-toggle' ).dropdown();
|
1118 |
|
1119 | $( "table" ).each( function () {
|
1120 | var $this = $( this );
|
1121 | $this.addClass('table');
|
1122 | } );
|
1123 |
|
1124 | } );
|
1125 | </script>
|
1126 |
|
1127 |
|
1128 |
|
1129 |
|
1130 |
|
1131 | <script>
|
1132 | $( function () {
|
1133 | $( '#main' ).localScroll( {
|
1134 | offset : { top : 60 }
|
1135 | } );
|
1136 | $( "dt.name" ).each( function () {
|
1137 | var $this = $( this ).find("h4");
|
1138 | var icon = $( "<i/>" ).addClass( "icon-plus-sign" ).addClass( "pull-right" ).addClass( "icon-white" );
|
1139 | var dt = $(this);
|
1140 | var children = dt.next( "dd" );
|
1141 |
|
1142 | dt.prepend( icon ).css( {cursor : "pointer"} );
|
1143 | dt.addClass( "member-collapsed" ).addClass( "member" );
|
1144 |
|
1145 |
|
1146 | children.hide();
|
1147 |
|
1148 | dt.children().on( "click", function () {
|
1149 | children = dt.next( "dd" );
|
1150 | children.slideToggle( "fast", function () {
|
1151 |
|
1152 | if ( children.is( ":visible" ) ) {
|
1153 | icon.addClass( "icon-minus-sign" ).removeClass( "icon-plus-sign" ).removeClass( "icon-white" );
|
1154 | dt.addClass( "member-open" ).animate( "member-collapsed" );
|
1155 | } else {
|
1156 | icon.addClass( "icon-plus-sign" ).removeClass( "icon-minus-sign" ).addClass( "icon-white" );
|
1157 | dt.addClass( "member-collapsed" ).removeClass( "member-open" );
|
1158 | }
|
1159 | } );
|
1160 | } );
|
1161 |
|
1162 | } );
|
1163 | } );
|
1164 | </script>
|
1165 |
|
1166 |
|
1167 |
|
1168 |
|
1169 |
|
1170 |
|
1171 | <script type="text/javascript">
|
1172 | $(document).ready(function() {
|
1173 | SearcherDisplay.init();
|
1174 | });
|
1175 | </script>
|
1176 |
|
1177 |
|
1178 | </body>
|
1179 | </html>
|