hedera-web/js/vn/vn.js

381 lines
9.2 KiB
JavaScript
Raw Normal View History

2016-09-26 09:28:47 +00:00
2022-05-28 19:27:36 +00:00
require('mootools');
2016-09-26 09:28:47 +00:00
2022-11-19 13:00:13 +00:00
Vn = module.exports = {};
Object.assign(Vn, {
2022-05-28 19:27:36 +00:00
Locale : require('./locale')
2022-05-30 01:30:33 +00:00
,Enum : require('./enum')
,Type : require('./type')
2022-05-28 19:27:36 +00:00
,Object : require('./object')
2022-05-30 01:30:33 +00:00
,Mutators : require('./mutators')
2022-05-28 19:27:36 +00:00
,Browser : require('./browser')
,Cookie : require('./cookie')
,Date : require('./date')
,Value : require('./value')
,Url : require('./url')
2022-05-30 01:30:33 +00:00
,LotIface : require('./lot-iface')
,Lot : require('./lot')
,LotQuery : require('./lot-query')
2022-05-28 19:27:36 +00:00
,Hash : require('./hash')
2022-05-30 01:30:33 +00:00
,ParamIface : require('./param-iface')
,Param : require('./param')
,Spec : require('./spec')
,Model : require('./model')
,ModelIface : require('./model-iface')
,ModelProxy : require('./model-proxy')
,IteratorIface : require('./iterator-iface')
,Iterator : require('./iterator')
,Form : require('./form')
2022-05-28 19:27:36 +00:00
,Node : require('./node')
,NodeBuilder : require('./node-builder')
2022-06-06 12:49:18 +00:00
,Component : require('./component')
2022-05-28 19:27:36 +00:00
,Builder : require('./builder')
,JsonException : require('./json-exception')
,JsonConnection : require('./json-connection')
2016-09-26 09:28:47 +00:00
,Config: {}
,includes: {}
,cssIncludes: {}
,currentDeps: []
,currentCallback: null
2022-05-28 19:27:36 +00:00
,head: document.getElementsByTagName('head')[0]
,isMobileCached: null
2022-11-16 01:46:44 +00:00
,getVersion() {
2022-05-28 19:27:36 +00:00
if (this._version === undefined) {
2016-09-23 22:47:34 +00:00
var re = /[; ]vnVersion=([^\\s;]*)/;
2022-05-28 19:27:36 +00:00
var sMatch = (' '+ document.cookie).match(re);
this._version = (sMatch) ? '?'+ unescape(sMatch[1]) : '';
}
return this._version;
}
2022-11-11 19:31:17 +00:00
,setVersion(version) {
document.cookie = `vnVersion=${version}; SameSite=Lax;`;
}
/**
* Includes a new CSS stylesheet in the current document, if the stylesheet
* is already included, does nothing.
*
* @param {string} fileName The stylesheet file name
2022-05-26 06:08:31 +00:00
*/
2022-11-16 01:46:44 +00:00
,includeCss(fileName) {
var cssData = this.cssIncludes[fileName];
2022-05-28 19:27:36 +00:00
if (!cssData) {
var link = document.createElement('link');
link.rel = 'stylesheet';
link.type = 'text/css';
2022-05-28 19:27:36 +00:00
link.href = fileName + this.getVersion();
this.head.appendChild(link);
this.cssIncludes[fileName] =
{
included: true
,link: link
};
2022-05-28 19:27:36 +00:00
} else if (!cssData.included) {
cssData.link.disabled = false;
cssData.included = true;
}
}
/**
* Excludes a CSS stylesheet from the current document.
*
* @param {string} fileName The stylesheet file name
2022-05-26 06:08:31 +00:00
*/
2022-11-16 01:46:44 +00:00
,excludeCss(fileName) {
var cssData = this.cssIncludes[fileName];
2022-05-28 19:27:36 +00:00
if (cssData && cssData.included) {
cssData.link.disabled = true;
cssData.included = false;
}
}
2022-11-16 01:46:44 +00:00
,_createIncludeData(path) {
var includeData = {
depCount: 0
,success: false
,loaded: false
,callbacks: []
,dependants: []
};
this.includes[path] = includeData;
return includeData;
}
2022-11-16 01:46:44 +00:00
,_handleCallback(includeData, callback) {
if (!callback)
return;
if (includeData.success)
2022-05-28 19:27:36 +00:00
callback(includeData.loaded);
else
2022-05-28 19:27:36 +00:00
includeData.callbacks.push(callback);
}
2022-11-16 01:46:44 +00:00
,_resolveDeps(includeData) {
includeData.success = true;
var callbacks = includeData.callbacks;
2015-12-10 13:48:43 +00:00
if (callbacks)
for (var i = 0; i < callbacks.length; i++)
2022-05-28 19:27:36 +00:00
callbacks[i](includeData.loaded);
var dependants = includeData.dependants;
2015-12-10 13:48:43 +00:00
if (dependants)
2022-05-28 19:27:36 +00:00
for (var i = 0; i < dependants.length; i++) {
var dependant = dependants[i];
dependant.depCount--;
if (dependant.depCount == 0)
2022-05-28 19:27:36 +00:00
this._resolveDeps(dependant);
}
delete includeData.callbacks;
delete includeData.dependants;
delete includeData.depCount;
}
/**
* Initializes the library and calls the passed function when all
* includes and its dependencies are resolved.
* Should be called on the last statically incuded script.
*
* @param {Function} callback The main function
2022-05-26 06:08:31 +00:00
*/
2022-11-16 01:46:44 +00:00
,main(callback) {
2022-05-28 19:27:36 +00:00
if (this.mainCalled) {
Vn.warning("Vn: main method should be called only once");
return;
}
this.mainCalled = true;
this.mainCallback = callback;
var basePath = location.protocol +'//'+ location.host;
basePath += location.port ? ':'+ location.port : '';
basePath += location.pathname;
2022-05-28 19:27:36 +00:00
var scripts = this.head.getElementsByTagName('script');
var includes = this.currentDeps;
2022-05-28 19:27:36 +00:00
for (var i = 0; i < scripts.length; i++) {
var path = scripts[i].src.substr(basePath.length);
path = path.substr(0, path.indexOf('.js')) +'.js';
var includeData = this.includes[path];
2022-05-28 19:27:36 +00:00
if (includeData === undefined) {
this.currentDeps = includes;
2022-05-28 19:27:36 +00:00
var includeData = this._createIncludeData(path);
this._onScriptLoad(includeData, true);
}
}
2022-05-28 19:27:36 +00:00
includeData.callbacks.push(this._onMainDepsLoad.bind(this));
window.addEventListener('load', this._onWindowLoad.bind(this));
}
2022-11-16 01:46:44 +00:00
,_onMainDepsLoad() {
this.mainDepsLoaded = true;
2022-05-28 19:27:36 +00:00
this._callMain();
2015-09-24 11:50:27 +00:00
}
2022-11-16 01:46:44 +00:00
,_onWindowLoad() {
this.windowReady = true;
2022-05-28 19:27:36 +00:00
this._callMain();
}
2015-09-24 11:50:27 +00:00
2022-11-16 01:46:44 +00:00
,_callMain() {
if (this.mainCallback && this.windowReady && this.mainDepsLoaded)
2022-05-28 19:27:36 +00:00
this.mainCallback();
}
/**
* Includes a set of javascript files and sets it as dependecies of the
* current script.
*
* @param {...} The list of files as function arguments
2022-05-26 06:08:31 +00:00
*/
2022-11-16 01:46:44 +00:00
,include() {
2022-05-28 19:27:36 +00:00
for (var i = 0; i < arguments.length; i++) {
var includeData = this._realIncludeJs(arguments[i] +'.js');
if (!includeData.success)
2022-05-28 19:27:36 +00:00
this.currentDeps.push(includeData);
}
2015-09-24 11:50:27 +00:00
}
/**
* Downloads a set of resources and sets it as dependecies of the
* current script.
*
* @param {...} The list of files as function arguments
2022-05-26 06:08:31 +00:00
*/
2022-11-16 01:46:44 +00:00
,resource() {
2022-05-28 19:27:36 +00:00
for (var i = 0; i < arguments.length; i++) {
var includeData = this._realLoadXml(arguments[i]);
if (!includeData.success)
2022-05-28 19:27:36 +00:00
this.currentDeps.push(includeData);
}
2015-09-24 11:50:27 +00:00
}
/**
* Sets the function that will be called when current script dependencies
* are resolved.
*
* @param {Function} callback The callback function
2022-05-26 06:08:31 +00:00
*/
2022-11-16 01:46:44 +00:00
,define(callback) {
this.currentCallback = callback;
2015-09-24 11:50:27 +00:00
}
/**
* Includes a new Javascript in the current document, if the script
* is already included, does nothing and calls the callback.
*
* @param {string} fileName The script file name
* @param {Function} callback The function to call when script is
* downloaded and included
2022-05-26 06:08:31 +00:00
*/
2022-11-16 01:46:44 +00:00
,includeJs(fileName, callback, skipVersion) {
2022-05-28 19:27:36 +00:00
var includeData = this._realIncludeJs(fileName, skipVersion);
this._handleCallback(includeData, callback);
}
2022-11-16 01:46:44 +00:00
,_realIncludeJs(fileName, skipVersion) {
var includeData = this.includes[fileName];
2022-05-28 19:27:36 +00:00
if (includeData === undefined) {
includeData = this._createIncludeData(fileName);
var src = fileName;
if (!skipVersion)
2022-05-28 19:27:36 +00:00
src = src + this.getVersion();
2022-05-28 19:27:36 +00:00
var script = document.createElement('script');
script.type = 'text/javascript';
script.async = false;
script.src = src;
script.onload =
2022-05-28 19:27:36 +00:00
this._onScriptLoad.bind(this, includeData, true);
script.onerror =
2022-05-28 19:27:36 +00:00
this._onScriptLoad.bind(this, includeData, false);
script.onreadystatechange =
2022-05-28 19:27:36 +00:00
this._onScriptStateChange.bind(this, includeData, script);
2022-05-28 19:27:36 +00:00
this.head.appendChild(script);
}
return includeData;
}
2022-11-16 01:46:44 +00:00
,_onScriptStateChange(includeData, script) {
if (script.readyState == 'complete')
2022-05-28 19:27:36 +00:00
this._onScriptLoad(includeData, true);
}
2022-11-16 01:46:44 +00:00
,_onScriptLoad(includeData, loaded) {
includeData.loaded = loaded;
2022-05-28 19:27:36 +00:00
if (loaded) {
if (this.currentCallback)
2022-05-28 19:27:36 +00:00
includeData.callbacks.unshift(this.currentCallback);
var includes = this.currentDeps;
2015-09-24 11:50:27 +00:00
2022-05-28 19:27:36 +00:00
if (includes && includes.length > 0) {
includeData.depCount = includes.length;
for (var i = 0; i < includes.length; i++)
2022-05-28 19:27:36 +00:00
includes[i].dependants.push(includeData);
} else
this._resolveDeps(includeData);
} else
this._resolveDeps(includeData);
this.currentDeps = [];
this.currentCallback = null;
}
/**
* Request an XML file.
*
* @param {string} path The file path
* @param {Function} callback The function to call when file is downloaded
2022-05-26 06:08:31 +00:00
*/
2022-11-16 01:46:44 +00:00
,loadXml(path, callback) {
2022-05-28 19:27:36 +00:00
var includeData = this._realLoadXml(path);
this._handleCallback(includeData, callback);
}
2022-11-16 01:46:44 +00:00
,_realLoadXml(path) {
var includeData = this.includes[path];
2022-05-28 19:27:36 +00:00
if (includeData === undefined) {
includeData = this._createIncludeData(path);
2022-05-28 19:27:36 +00:00
var request = new XMLHttpRequest();
request.onreadystatechange =
2022-05-28 19:27:36 +00:00
this._onXmlReady.bind(this, includeData, request);
request.open('get', path + this.getVersion(), true);
request.send();
}
return includeData;
}
2022-11-16 01:46:44 +00:00
,_onXmlReady(includeData, request) {
if (request.readyState != 4)
return;
includeData.loaded = request.status == 200;
if (includeData.loaded)
includeData.xml = request.responseXML;
2022-05-28 19:27:36 +00:00
this._resolveDeps(includeData);
}
/**
* Gets the DOM object from an included XML file.
*
* @param {string} path The file path
* @return {Object} The DOM object
2022-05-26 06:08:31 +00:00
*/
2022-11-16 01:46:44 +00:00
,getXml(path) {
var includeData = this.includes[path];
if (!(includeData && includeData.success))
return null;
return includeData.xml;
}
/**
* Checks if user is using a mobile browser.
*
* return {boolean} %true if is mobile, %false otherwise.
2022-05-26 06:08:31 +00:00
*/
2022-11-16 01:46:44 +00:00
,isMobile() {
2022-05-28 19:27:36 +00:00
if (this.isMobileCached === null) {
var regExp = /(Android|webOS|iPhone|iPad|iPod|BlackBerry|Windows Phone)/i;
2022-05-28 19:27:36 +00:00
this.isMobileCached = navigator.userAgent.match(regExp);
}
return this.isMobileCached;
}
2022-11-19 13:00:13 +00:00
});