@base-framework/base 2.6.6 → 2.6.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/base.js +1 -1
- package/dist/base.js.map +2 -2
- package/package.json +1 -1
package/dist/base.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/shared/objects.js", "../src/data-tracker.js", "../src/main.js", "../src/events.js", "../src/modules/ajax/ajax.js", "../src/modules/data-binder/data-pub-sub.js", "../src/modules/data-binder/source.js", "../src/modules/data-binder/one-way-source.js", "../src/modules/data-binder/connection.js", "../src/modules/data-binder/one-way-connection.js", "../src/modules/data-binder/two-way-source.js", "../src/modules/data-binder/data-source.js", "../src/modules/data-binder/element-source.js", "../src/modules/data-binder/two-way-connection.js", "../src/modules/data-binder/connection-tracker.js", "../src/modules/data-binder/data-binder.js", "../src/modules/data/attrs.js", "../src/modules/data/basic-data.js", "../src/modules/data/data-utils.js", "../src/modules/data/deep-data.js", "../src/modules/data/simple-data.js", "../src/modules/data/model-service.js", "../src/modules/data/model.js", "../src/modules/state/state-target.js", "../src/modules/state/state.js", "../src/modules/layout/layout-parser.js", "../src/modules/html-builder/html-builder.js", "../src/modules/layout/watcher-helper.js", "../src/modules/component/jot.js", "../src/modules/layout/layout-builder.js", "../src/modules/component/unit.js", "../src/modules/component/event-helper.js", "../src/modules/component/state-helper.js", "../src/modules/component/component.js", "../src/modules/router/nav-link.js", "../src/modules/router/utils.js", "../src/modules/router/component-helper.js", "../src/modules/import/import.js", "../src/modules/router/route.js", "../src/modules/router/history-controller.js", "../src/modules/router/router.js", "../src/modules/atom/atom.js", "../src/base.js"],
|
|
4
|
-
"sourcesContent": ["\r\nexport const Objects =\r\n{\r\n /**\r\n\t * This will create a new object.\r\n\t *\r\n\t * @param {object} [object] An object to extend.\r\n\t * @return {object}\r\n\t */\r\n\tcreateObject(object)\r\n\t{\r\n\t\treturn Object.create(object);\r\n\t},\r\n\r\n\t/**\r\n\t * This will extend an object to another object.\r\n\t *\r\n\t * @param {(function|object)} sourceObj\r\n\t * @param {(function|object)} targetObj\r\n\t * @return {object}\r\n\t */\r\n\textendObject(sourceObj, targetObj)\r\n\t{\r\n\t\tif(typeof sourceObj === 'undefined' || typeof targetObj === 'undefined')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tfor(var property in sourceObj)\r\n\t\t{\r\n\t\t\tif(sourceObj.hasOwnProperty(property) && typeof targetObj[property] === 'undefined')\r\n\t\t\t{\r\n\t\t\t\ttargetObj[property] = sourceObj[property];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn targetObj;\r\n\t},\r\n\r\n\t/**\r\n\t * This will clone an object.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @return {object}\r\n\t */\r\n\tcloneObject(obj)\r\n\t{\r\n\t\tif(!obj)\r\n\t\t{\r\n\t\t\treturn {};\r\n\t\t}\r\n\r\n\t\treturn JSON.parse(JSON.stringify(obj));\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the class prototype.\r\n\t *\r\n\t * @param {(function|object)} object\r\n\t * @return {object}\r\n\t */\r\n\t_getClassObject(object)\r\n\t{\r\n\t\treturn (typeof object === 'function')? object.prototype : object;\r\n\t},\r\n\r\n\t/**\r\n\t * This will extend an object to another object.\r\n\t *\r\n\t * @param {(function|object)} sourceClass\r\n\t * @param {(function|object)} targetClass\r\n\t * @return {object}\r\n\t */\r\n\textendClass(sourceClass, targetClass)\r\n\t{\r\n\t\t/* if we are using a class constructor function\r\n\t\twe want to get the class prototype object */\r\n\t\tlet source = this._getClassObject(sourceClass),\r\n\t\ttarget = this._getClassObject(targetClass);\r\n\r\n\t\tif(typeof source !== 'object' || typeof target !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to create a new object and add the source\r\n\t\tprototype to the new object */\r\n\t\tlet obj = Object.create(source);\r\n\r\n\t\t/* we want to add any additional properties from the\r\n\t\ttarget class to the new object */\r\n\t\tfor(var prop in target)\r\n\t\t{\r\n\t\t\tobj[prop] = target[prop];\r\n\t\t}\r\n\r\n\t\treturn obj;\r\n\t}\r\n};", "/**\r\n * TrackerTypes\r\n *\r\n * This will add and remove tracker types to the data tracker.\r\n *\r\n */\r\nconst TrackerTypes =\r\n{\r\n /**\r\n * @member {object} The Type and callBack that is called\r\n * when the type is removed from the object.\r\n */\r\n types: {},\r\n\r\n /**\r\n * This will add a type.\r\n * @param {string} type\r\n * @param {function} callBack The function to call when an object\r\n * is having the type removed.\r\n */\r\n add(type, callBack)\r\n {\r\n this.types[type] = callBack;\r\n },\r\n\r\n /**\r\n * This will get a type or return false.\r\n * @param {string} type\r\n * @return {(function|boolean)} The callBack or false.\r\n */\r\n get(type)\r\n {\r\n return this.types[type] || false;\r\n },\r\n\r\n /**\r\n * This will remove a type.\r\n * @param {string} type\r\n */\r\n remove(type)\r\n {\r\n delete this.types[type];\r\n }\r\n};\r\n\r\n/**\r\n * Tracker\r\n *\r\n * This will create a tracker for an object that will\r\n * store each type added and the data stored to\r\n * each type.\r\n *\r\n * @class\r\n */\r\nclass Tracker\r\n{\r\n /**\r\n * @constructor\r\n */\r\n constructor()\r\n {\r\n /**\r\n * @member {object} types\r\n */\r\n this.types = {};\r\n }\r\n\r\n /**\r\n * This will add data to a type.\r\n *\r\n * @public\r\n * @param {string} addingType The type of data.\r\n * @param {*} data The data to store\r\n */\r\n add(addingType, data)\r\n {\r\n let type = this.types[addingType] || (this.types[addingType] = []);\r\n type.push(data);\r\n }\r\n\r\n /**\r\n * This will get all the data stored to a data type.\r\n * @param {string} type\r\n * @return {*|boolean} the data or false.\r\n */\r\n get(type)\r\n {\r\n return this.types[type] || false;\r\n }\r\n\r\n /**\r\n * This will call the callBack with the data.\r\n *\r\n * @private\r\n * @param {function} callBack\r\n * @param {*} data\r\n */\r\n removeByCallBack(callBack, data)\r\n {\r\n if(typeof callBack === 'function')\r\n {\r\n callBack(data);\r\n }\r\n }\r\n\r\n /**\r\n * This will remove the data by type.\r\n *\r\n * @private\r\n * @param {string} removingType\r\n */\r\n removeType(removingType)\r\n {\r\n let types = this.types;\r\n if(types)\r\n {\r\n let type = types[removingType];\r\n if(type.length)\r\n {\r\n let data,\r\n callBack = TrackerTypes.get(removingType);\r\n for(var i = 0, length = type.length; i < length; i++)\r\n {\r\n data = type[i];\r\n if(data)\r\n {\r\n // this will stop any circular referrences\r\n type[i] = null;\r\n\r\n this.removeByCallBack(callBack, data);\r\n }\r\n }\r\n delete types[type];\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * This will remove the data by type or all if no type is\r\n * set.\r\n *\r\n * @public\r\n * @param {string} [type]\r\n */\r\n remove(type)\r\n {\r\n if(type)\r\n {\r\n this.removeType(type);\r\n }\r\n else\r\n {\r\n let types = this.types;\r\n for(var prop in types)\r\n {\r\n if(types.hasOwnProperty(prop))\r\n {\r\n type = types[prop];\r\n if(!type)\r\n {\r\n continue;\r\n }\r\n\r\n this.removeType(prop);\r\n }\r\n }\r\n\r\n delete this.types;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * DataTracker\r\n *\r\n * This will add data tracking for objects. The DataTracker is\r\n * a single point where any data can be tracked to an object\r\n * or element. Modules can register types to store their own\r\n * data that can allow the data to be removed when the element\r\n * is removed.\r\n *\r\n * @class\r\n */\r\nexport class DataTracker\r\n{\r\n /**\r\n * @constructor\r\n */\r\n constructor()\r\n {\r\n /**\r\n * @private\r\n * @member trackers This is an object that stores all tracker\r\n * objects by tracking id.\r\n */\r\n this.trackers = {};\r\n\r\n /**\r\n * @private\r\n * @member {int} trackingCount\r\n */\r\n this.trackingCount = 0;\r\n }\r\n\r\n /**\r\n * This will add a new type to the data tracker.\r\n *\r\n * @public\r\n * @param {string} type The new type.\r\n * @param {function} callBack The callBack to help clean\r\n * up data when removed.\r\n */\r\n addType(type, callBack)\r\n {\r\n TrackerTypes.add(type, callBack);\r\n }\r\n\r\n /**\r\n * This will remove a type from the data tracker.\r\n * @param {string} type\r\n */\r\n removeType(type)\r\n {\r\n TrackerTypes.remove(type);\r\n }\r\n\r\n /**\r\n * This will get the object tracking id or set it if\r\n * not set.\r\n *\r\n * @param {object} obj\r\n * @return {string}\r\n */\r\n getTrackingId(obj)\r\n {\r\n return obj.trackingId || (obj.trackingId = 'dt' + this.trackingCount++);\r\n }\r\n\r\n /**\r\n * This will add data to an object.\r\n *\r\n * @param {object} obj\r\n * @param {string} type The type name.\r\n * @param {*} data The data to track.\r\n */\r\n add(obj, type, data)\r\n {\r\n const id = this.getTrackingId(obj),\r\n tracker = this.find(id);\r\n\r\n tracker.add(type, data);\r\n }\r\n\r\n /**\r\n * This will get the data from a type or the tracker object\r\n * if type is not set.\r\n *\r\n * @param {object} obj\r\n * @param {string} [type]\r\n * @return {*}\r\n */\r\n get(obj, type)\r\n {\r\n const id = obj.trackingId;\r\n let tracker = this.trackers[id];\r\n if(!tracker)\r\n {\r\n return false;\r\n }\r\n\r\n return (type)? tracker.get(type) : tracker;\r\n }\r\n\r\n /**\r\n * This will get the tracker or create a new tracker\r\n * if no tracker is set.\r\n *\r\n * @param {string} id\r\n * @return {object} The tracker.\r\n */\r\n find(id)\r\n {\r\n let trackers = this.trackers;\r\n return (trackers[id] || (trackers[id] = new Tracker()));\r\n }\r\n\r\n /**\r\n\t * This will check if an object is empty.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @return {boolean}\r\n\t */\r\n\tisEmpty(obj)\r\n\t{\r\n\t\tif(!obj || typeof obj !== 'object')\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t/* we want to loop through each property and\r\n\t\tcheck if it belongs to the object directly */\r\n\t\tfor(var key in obj)\r\n\t\t{\r\n\t\t\tif(obj.hasOwnProperty(key))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n /**\r\n * This will remove a type or all data for an object if\r\n * no type is set.\r\n *\r\n * @param {object} obj\r\n * @param {stirng} [type]\r\n */\r\n remove(obj, type)\r\n {\r\n const id = obj.trackingId;\r\n if(!id)\r\n {\r\n return true;\r\n }\r\n\r\n let tracker = this.trackers[id];\r\n if(!tracker)\r\n {\r\n return false;\r\n }\r\n\r\n if(type)\r\n {\r\n tracker.remove(type);\r\n\r\n /* this will remove the msg from the elements\r\n if no elements are listed under the msg */\r\n if(this.isEmpty(tracker.types))\r\n {\r\n delete this.trackers[id];\r\n }\r\n }\r\n else\r\n {\r\n tracker.remove();\r\n\r\n delete this.trackers[id];\r\n }\r\n }\r\n}", "/**\r\n * Base Framework\r\n * @version 2.6.0\r\n * @author Chris Durfee\r\n * @file This is a javascript framework to allow complex\r\n * functions to work in many browsers and versions.\r\n */\r\n\r\n import {Objects} from './shared/objects.js';\r\n import {DataTracker} from './data-tracker.js';\r\n\r\nconst global = window;\r\n\r\n/**\r\n * base framework constructor\r\n * @class\r\n */\r\nclass Base\r\n{\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {string} version\r\n\t\t */\r\n\t\tthis.version = '2.6.0';\r\n\r\n\t\t/**\r\n\t\t * @member {array} errors\r\n\t\t */\r\n\t\tthis.errors = [];\r\n\r\n\t\t/**\r\n\t\t * @member {object} dataTracker\r\n\t\t */\r\n\t\tthis.dataTracker = new DataTracker();\r\n\t}\r\n\r\n\t/**\r\n\t * this will augement the base framework with new functionality.\r\n\t *\r\n\t * @param {object} methods The new methods to add.\r\n\t * @return {object} An instance of base.\r\n\t */\r\n\taugment(methods)\r\n\t{\r\n\t\tif(!methods || typeof methods !== 'object')\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tconst prototype = this.constructor.prototype;\r\n\t\tfor(var property in methods)\r\n\t\t{\r\n\t\t\tif(methods.hasOwnProperty(property))\r\n\t\t\t{\r\n\t\t\t\tprototype[property] = methods[property];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will convert a nodelist into an array.\r\n\t *\r\n\t * @param {object} list\r\n\t * @return {array}\r\n\t */\r\n\tlistToArray(list)\r\n\t{\r\n\t\treturn Array.prototype.slice.call(list);\r\n\t}\r\n\r\n\t/**\r\n\t * This will override a method function with a new function.\r\n\t *\r\n\t * @param {object} obj The object being modified.\r\n\t * @param {string} methodName the method name being overriden.\r\n\t * @param {function} overrideMethod The new function to call.\r\n\t * @param {array} args The args to pass to the first function call.\r\n\t *\r\n\t * @return {*} The results of the function being called.\r\n\t */\r\n\toverride(obj, methodName, overrideMethod, args)\r\n\t{\r\n\t\treturn (obj[methodName] = overrideMethod).apply(obj, this.listToArray(args));\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the last error.\r\n\t * @return {(object|boolean)} The last error or false.\r\n\t */\r\n\tgetLastError()\r\n\t{\r\n\t\tconst errors = this.errors;\r\n\t\treturn (errors.length)? errors.pop() : false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an error.\r\n\t *\r\n\t * @param {object} err\r\n\t */\r\n\taddError(err)\r\n\t{\r\n\t\tthis.errors.push(err);\r\n\t}\r\n\r\n\t/**\r\n\t * This will parse a query string.\r\n\t *\r\n\t * @param {string} [str] The string to parse or the global\r\n\t * location will be parsed.\r\n\t * @param {bool} [decode]\r\n\t * @return {object}\r\n\t */\r\n\tparseQueryString(str, decode)\r\n\t{\r\n\t\tif(typeof str !== 'string')\r\n\t\t{\r\n\t\t\tstr = global.location.search;\r\n\t\t}\r\n\r\n\t\tlet objURL = {},\r\n\t\tregExp = /([^?=&]+)(=([^&]*))?/g;\r\n\t\tstr.replace(regExp, function(a, b, c, d)\r\n\t\t{\r\n\t\t\t/* we want to save the key and the\r\n\t\t\tvalue to the objURL */\r\n\t\t\tobjURL[b] = (decode !== false)? decodeURIComponent(d) : d;\r\n\t\t});\r\n\r\n\t\treturn objURL;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if an object is empty.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @return {boolean}\r\n\t */\r\n\tisEmpty(obj)\r\n\t{\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t/* we want to loop through each property and\r\n\t\tcheck if it belongs to the object directly */\r\n\t\tfor(var key in obj)\r\n\t\t{\r\n\t\t\tif(obj.hasOwnProperty(key))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * This will select an element by id.\r\n\t *\r\n\t * @param {string} id\r\n\t * @return {(object|boolean)} The element object or false.\r\n\t */\r\n\tgetById(id)\r\n\t{\r\n\t\tif(typeof id !== 'string')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tlet obj = document.getElementById(id);\r\n\t\treturn (obj || false);\r\n\t}\r\n\r\n\t/**\r\n\t * This will select elements by name.\r\n\t *\r\n\t * @param {string} name\r\n\t * @return {(object|boolean)} The elements array or false.\r\n\t */\r\n\tgetByName(name)\r\n\t{\r\n\t\tif(typeof name !== 'string')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tlet obj = document.getElementsByName(name);\r\n\t\treturn (obj)? this.listToArray(obj) : false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will select by css selector.\r\n\t *\r\n\t * @param {string} selector\r\n\t * @param {boolean} single Set to true if you only want one result.\r\n\t * @return {*}\r\n\t */\r\n\tgetBySelector(selector, single)\r\n\t{\r\n\t\tif(typeof selector !== 'string')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to check if we are only selecting\r\n\t\tthe first element or all elements */\r\n\t\tsingle = single || false;\r\n\t\tif(single === true)\r\n\t\t{\r\n\t\t\tlet obj = document.querySelector(selector);\r\n\t\t\treturn (obj || false);\r\n\t\t}\r\n\r\n\t\tlet elements = document.querySelectorAll(selector);\r\n\t\tif(elements)\r\n\t\t{\r\n\t\t\t/* if there is only one result just return the\r\n\t\t\tfirst element in the node list */\r\n\t\t\treturn (elements.length === 1)? elements[0] : this.listToArray(elements);\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get or set the innerHTML or an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} [html] If the html is not set, the html of the\r\n\t * element will be returned.\r\n\t *\r\n\t * @return {(string|void)}\r\n\t */\r\n\thtml(obj, html)\r\n\t{\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to check if we are getting the\r\n\t\thtml or adding the html */\r\n\t\tif(this.isUndefined(html) === false)\r\n\t\t{\r\n\t\t\tobj.innerHTML = html;\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\treturn obj.innerHTML;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the css property of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} value\r\n\t * @return {object} an instance of base.\r\n\t */\r\n\tsetCss(obj, property, value)\r\n\t{\r\n\t\tif(this.isObject(obj) === false || this.isUndefined(property))\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tproperty = this.uncamelCase(property);\r\n\t\tobj.style[property] = value;\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the css property of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @return {(string|null)}\r\n\t */\r\n\tgetCss(obj, property)\r\n\t{\r\n\t\tif(!obj || typeof property === 'undefined')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tproperty = this.uncamelCase(property);\r\n\t\tvar css = obj.style[property];\r\n\t\tif(css !== '')\r\n\t\t{\r\n\t\t\treturn css;\r\n\t\t}\r\n\r\n\t\t/* we want to check if we have an inherited\r\n\t\tvalue */\r\n\t\tvar currentValue = null,\r\n\t\tcurrentStyle = obj.currentStyle;\r\n\t\tif(currentStyle && (currentValue = currentStyle[property]))\r\n\t\t{\r\n\t\t\tcss = currentValue;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tvar inheritedStyle = window.getComputedStyle(obj, null);\r\n\t\t\tif(inheritedStyle)\r\n\t\t\t{\r\n\t\t\t\tcss = inheritedStyle[property];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn css;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get or set the css propety or an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} [value]\r\n\t * @return {(string|void)}\r\n\t */\r\n\tcss(obj, property, value)\r\n\t{\r\n\t\t/* we want to check if we are getting the\r\n\t\tvalue or setting the value */\r\n\t\tif(typeof value !== 'undefined')\r\n\t\t{\r\n\t\t\tthis.setCss(obj, property, value);\r\n\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\treturn this.getCss(obj, property);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an attribute from an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @return {object} an instance of base.\r\n\t */\r\n\tremoveAttr(obj, property)\r\n\t{\r\n\t\tif(this.isObject(obj))\r\n\t\t{\r\n\t\t\tobj.removeAttribute(property);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set an attribute of an element.\r\n\t *\r\n\t * @private\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} value\r\n\t * @return {void}\r\n\t */\r\n\tsetAttr(obj, property, value)\r\n\t{\r\n\t\tobj.setAttribute(property, value);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get an attribute of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @return {string}\r\n\t */\r\n\tgetAttr(obj, property)\r\n\t{\r\n\t\treturn obj.getAttribute(property);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get or set an attribute from an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} [value]\r\n\t * @return {(string|void)}\r\n\t */\r\n\tattr(obj, property, value)\r\n\t{\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to check if we are getting the\r\n\t\tvalue or setting the value */\r\n\t\tif(typeof value !== 'undefined')\r\n\t\t{\r\n\t\t\t/* we want to check to set the value */\r\n\t\t\tthis.setAttr(obj, property, value);\r\n\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\treturn this.getAttr(obj, property);\r\n\t}\r\n\r\n\t/**\r\n\t * This will prefix a string with \"data-\" if not set.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} prop\r\n\t * @return {string}\r\n\t */\r\n\t_checkDataPrefix(prop)\r\n\t{\r\n\t\tif(typeof prop !== 'string')\r\n\t\t{\r\n\t\t\treturn prop;\r\n\t\t}\r\n\r\n\t\t/* we want to de camelcase if set */\r\n\t\tprop = base.uncamelCase(prop);\r\n\t\tif(prop.substring(0, 5) !== 'data-')\r\n\t\t{\r\n\t\t\tprop = 'data-' + prop;\r\n\t\t}\r\n\r\n\t\treturn prop;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove \"data-\" from a string.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} prop\r\n\t * @return {string}\r\n\t */\r\n\t_removeDataPrefix(prop)\r\n\t{\r\n\t\tif(typeof prop === 'string' && prop.substring(0, 5) === 'data-')\r\n\t\t{\r\n\t\t\tprop = prop.substring(5);\r\n\t\t}\r\n\t\treturn prop;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set data to an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} value\r\n\t */\r\n\tsetData(obj, property, value)\r\n\t{\r\n\t\t/* this will return the property without the data prefix */\r\n\t\tproperty = this._removeDataPrefix(property);\r\n\t\tproperty = base.camelCase(property);\r\n\r\n\t\tobj.dataset[property] = value;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get data from an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} value\r\n\t * @return {string}\r\n\t */\r\n\tgetData(obj, property)\r\n\t{\r\n\t\tproperty = base.camelCase(this._removeDataPrefix(property));\r\n\t\treturn obj.dataset[property];\r\n\t}\r\n\r\n\t/**\r\n\t * This will get or set data to an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} [value]\r\n\t * @return {(string|void)}\r\n\t */\r\n\tdata(obj, property, value)\r\n\t{\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(typeof value !== 'undefined')\r\n\t\t{\r\n\t\t\tthis.setData(obj, property, value);\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\treturn this.getData(obj, property);\r\n\t}\r\n\r\n\t/**\r\n\t * This will find elements in an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} queryString\r\n\t * @return {array}\r\n\t */\r\n\tfind(obj, queryString)\r\n\t{\r\n\t\tif(!obj || typeof queryString !== 'string')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn obj.querySelectorAll(queryString);\r\n\t}\r\n\r\n\t/**\r\n\t * This will display an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @return {object} An instance of base.\r\n\t */\r\n\tshow(obj)\r\n\t{\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/* we want to get the previous display style\r\n\t\tfrom the data-style-display attr */\r\n\t\tlet previous = this.data(obj, 'style-display'),\r\n\t\tvalue = (typeof previous === 'string')? previous : '';\r\n\r\n\t\tthis.css(obj, 'display', value);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will hide an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @return {object} An instance of base.\r\n\t */\r\n\thide(obj)\r\n\t{\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/* we want to set the previous display style\r\n\t\ton the element as a data attr */\r\n\t\tlet previous = this.css(obj, 'display');\r\n\t\tif(previous !== 'none' && previous)\r\n\t\t{\r\n\t\t\tthis.data(obj, 'style-display', previous);\r\n\t\t}\r\n\r\n\t\tthis.css(obj, 'display', 'none');\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will toggle the display an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @return {object} An instance of base.\r\n\t */\r\n\ttoggle(obj)\r\n\t{\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tlet mode = this.css(obj, 'display');\r\n\t\tif(mode !== 'none')\r\n\t\t{\r\n\t\t\tthis.hide(obj);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.show(obj);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will camelCase a string.\r\n\t *\r\n\t * @param {string} str\r\n\t * @return {(string|boolean)} The string or false.\r\n\t */\r\n\tcamelCase(str)\r\n\t{\r\n\t\tif(typeof str !== 'string')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet regExp = /(-|\\s|\\_)+\\w{1}/g;\r\n\t\treturn str.replace(regExp, function(match)\r\n\t\t{\r\n\t\t\treturn match[1].toUpperCase();\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will uncamel-case a string.\r\n\t *\r\n\t * @param {string} str\r\n\t * @param {string} delimiter\r\n\t * @return {(string|boolean)} The string or false.\r\n\t */\r\n\tuncamelCase(str, delimiter)\r\n\t{\r\n\t\tif(typeof str !== 'string')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tdelimiter = delimiter || '-';\r\n\r\n\t\tlet regExp = /([A-Z]{1,})/g;\r\n\t\treturn str.replace(regExp, function(match)\r\n\t\t{\r\n\t\t\treturn delimiter + match.toLowerCase();\r\n\t\t}).toLowerCase();\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the size of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @return {(object|boolean)} A size object or false.\r\n\t */\r\n\tgetSize(obj)\r\n\t{\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\twidth: this.getWidth(obj),\r\n\t\t\theight: this.getHeight(obj)\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the width of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @return {(int|boolean)} A width or false.\r\n\t */\r\n\tgetWidth(obj)\r\n\t{\r\n\t\t/* we want to check if the object is not supplied */\r\n\t\treturn (this.isObject(obj))? obj.offsetWidth : false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the height of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @return {(int|boolean)} A height or false.\r\n\t */\r\n\tgetHeight(obj)\r\n\t{\r\n\t\t/* we want to check if the object is not supplied */\r\n\t\treturn (this.isObject(obj))? obj.offsetHeight : false;\r\n\t}\r\n\r\n\t/**\r\n\t* This will get the scroll position.\r\n\t*\r\n\t* @param {object} [obj] The element or document element if not set.\r\n\t* @return {object}\r\n\t*/\r\n\tgetScrollPosition(obj)\r\n\t{\r\n\t\tlet left = 0, top = 0;\r\n\t\tswitch(typeof obj)\r\n\t\t{\r\n\t\t\tcase 'undefined':\r\n\t\t\t\tobj = document.documentElement;\r\n\t\t\t\tleft = (window.pageXOffset || obj.scrollLeft);\r\n\t\t\t\ttop = (window.pageYOffset || obj.scrollTop);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'object':\r\n\t\t\t\tleft = obj.scrollLeft;\r\n\t\t\t\ttop = obj.scrollTop;\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tleft: left - (obj.clientLeft || 0),\r\n\t\t\ttop: top - (obj.clientTop || 0)\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the scroll top position.\r\n\t *\r\n\t * @param {object} [obj] The element or document element if not set.\r\n\t * @return {object}\r\n\t */\r\n\tgetScrollTop(obj)\r\n\t{\r\n\t\tlet position = this.getScrollPosition(obj);\r\n\t\treturn position.top;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the scroll left position.\r\n\t *\r\n\t * @param {object} [obj] The element or document element if not set.\r\n\t * @return {object}\r\n\t */\r\n\tgetScrollLeft(obj)\r\n\t{\r\n\t\tlet position = this.getScrollPosition(obj);\r\n\t\treturn position.left;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the window size.\r\n\t *\r\n\t * @return {object}\r\n\t */\r\n\tgetWindowSize()\r\n\t{\r\n\t\tlet w = window,\r\n\t\tdoc = document,\r\n\t\tde = doc.documentElement,\r\n\t\tb = doc.getElementsByTagName('body')[0],\r\n\t\twidth = w.innerWidth || de.clientWidth || b.clientWidth,\r\n\t\theight = w.innerHeight || de.clientHeight || b.clientHeight;\r\n\r\n\t\treturn {\r\n\t\t\twidth,\r\n\t\t\theight\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the document size.\r\n\t *\r\n\t * @return {object}\r\n\t */\r\n\tgetDocumentSize()\r\n\t{\r\n\t\tlet doc = document,\r\n\t\tbody = doc.body,\r\n\t\thtml = doc.documentElement,\r\n\r\n\t\theight = Math.max(\r\n\t\t\tbody.scrollHeight,\r\n\t\t\tbody.offsetHeight,\r\n\t\t\thtml.clientHeight,\r\n\t\t\thtml.scrollHeight,\r\n\t\t\thtml.offsetHeight\r\n\t\t),\r\n\r\n\t\twidth = Math.max(\r\n\t\t\tbody.scrollWidth,\r\n\t\t\tbody.offsetWidth,\r\n\t\t\thtml.clientWidth,\r\n\t\t\thtml.scrollWidth,\r\n\t\t\thtml.offsetWidth\r\n\t\t);\r\n\r\n\t\treturn {\r\n\t\t\twidth,\r\n\t\t\theight\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the document height.\r\n\t *\r\n\t * @return {object}\r\n\t */\r\n\tgetDocumentHeight()\r\n\t{\r\n\t\treturn this.getDocumentSize().height;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the value from a property on an object.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {*} [defaultText] A value if no value is set.\r\n\t * @return {string}\r\n\t */\r\n\tgetProperty(obj, property, defaultText)\r\n\t{\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tlet value = obj[property];\r\n\t\tif(typeof value !== 'undefined')\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\t/* if no value was available\r\n\t\twe want to return an empty string */\r\n\t\treturn (typeof defaultText !== 'undefined')? defaultText : '';\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the position of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {boolean} [depth] The number of levels, default is 1, 0 is to the root.\r\n\t * @return {object}\r\n\t */\r\n\tposition(obj, depth = 1)\r\n\t{\r\n\t\tlet position = {x: 0, y: 0};\r\n\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn position;\r\n\t\t}\r\n\r\n\t\t/* if the depth is 0 we will travel to the\r\n\t\ttop element */\r\n\t\tlet count = 0;\r\n\t\twhile(obj && (depth === 0 || count < depth))\r\n\t\t{\r\n\t\t\tcount++;\r\n\t\t\tposition.x += (obj.offsetLeft + obj.clientLeft);\r\n\t\t\tposition.y += (obj.offsetTop + obj.clientTop);\r\n\t\t\tobj = obj.offsetParent;\r\n\t\t}\r\n\r\n\t\treturn position;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a class to an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} tmpClassName\r\n\t */\r\n\taddClass(obj, tmpClassName)\r\n\t{\r\n\t\tif(this.isObject(obj) === false || tmpClassName === '')\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif(typeof tmpClassName === 'string')\r\n\t\t{\r\n\t\t\t/* we want to divide the string by spaces and\r\n\t\t\tadd any class listed */\r\n\t\t\tlet adding = tmpClassName.split(' ');\r\n\t\t\tfor(var i = 0, maxLength = adding.length; i < maxLength; i++)\r\n\t\t\t{\r\n\t\t\t\tobj.classList.add(tmpClassName);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a class or classes from an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} [tmpClassName]\r\n\t */\r\n\tremoveClass(obj, tmpClassName)\r\n\t{\r\n\t\tif(this.isObject(obj) === false || tmpClassName === '')\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/* if no className was specified we will remove all classes from object */\r\n\t\tif(typeof tmpClassName === 'undefined')\r\n\t\t{\r\n\t\t\tobj.className = '';\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tobj.classList.remove(tmpClassName);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if an element has a class.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} tmpClassName\r\n\t * @return {boolean}\r\n\t */\r\n\thasClass(obj, tmpClassName)\r\n\t{\r\n\t\tif(this.isObject(obj) === false || tmpClassName === '')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn obj.classList.contains(tmpClassName);\r\n\t}\r\n\r\n\t/**\r\n\t * This will toggle a class on an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} tmpClassName\r\n\t * @return {object} An instance of base.\r\n\t */\r\n\ttoggleClass(obj, tmpClassName)\r\n\t{\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tobj.classList.toggle(tmpClassName);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the type of a variable.\r\n\t *\r\n\t * @param {*} data\r\n\t * @return {string}\r\n\t */\r\n\tgetType(data)\r\n\t{\r\n\t\tconst type = typeof data;\r\n\t\tif(type !== 'object')\r\n\t\t{\r\n\t\t\treturn type;\r\n\t\t}\r\n\r\n\t\treturn (this.isArray(data))? 'array' : type;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if a request is undefined.\r\n\t *\r\n\t * @param {mixed} data\r\n\t */\r\n\tisUndefined(data)\r\n\t{\r\n\t\treturn (typeof data === 'undefined');\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if the request is an object.\r\n\t * @param {object} obj\r\n\t * @return {boolean}\r\n\t */\r\n\tisObject(obj)\r\n\t{\r\n\t\treturn (!obj || typeof obj !== 'object')? false : true;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if the variable is an array.\r\n\t *\r\n\t * @param {*} array\r\n\t * @return {boolean}\r\n\t */\r\n\tisArray(array)\r\n\t{\r\n\t\treturn Array.isArray(array);\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if a value is found in an array.\r\n\t *\r\n\t * @param {array} array\r\n\t * @param {string} element\r\n\t * @param {int} [fromIndex]\r\n\t * @return {int} This will return -1 if not found.\r\n\t */\r\n\tinArray(array, element, fromIndex)\r\n\t{\r\n\t\tif(!array || typeof array !== 'object')\r\n\t\t{\r\n\t\t\treturn -1;\r\n\t\t}\r\n\r\n\t\treturn array.indexOf(element, fromIndex);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a callBack.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {function} method\r\n\t * @param {array} [argArray] Default args to pass.\r\n\t * @param {boolean} [addArgs] Set to add merge args from the\r\n\t * curried function.\r\n\t *\r\n\t * @return {(function|boolean)} The callBack function or false.\r\n\t */\r\n\tcreateCallBack(obj, method, argArray, addArgs)\r\n\t{\r\n\t\tif(typeof method !== 'function')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\targArray = argArray || [];\r\n\t\treturn function(...args)\r\n\t\t{\r\n\t\t\tif(addArgs === true)\r\n\t\t\t{\r\n\t\t\t\targArray = argArray.concat(args);\r\n\t\t\t}\r\n\r\n\t\t\treturn method.apply(obj, argArray);\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will bind scope to a method.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {function} method\r\n\t * @return {function}\r\n\t */\r\n\tbind(obj, method)\r\n\t{\r\n\t\treturn method.bind(obj);\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepare a json object to be used in an\r\n\t * xhr request. This will sanitize the object values\r\n\t * by encoding them to not break the param string.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {bool} [removeNewLines]\r\n\t * @return {string}\r\n\t */\r\n\tprepareJsonUrl(obj, removeNewLines = false)\r\n\t{\r\n\t\tvar escapeChars = (str) =>\r\n\t\t{\r\n\t\t\tif(typeof str !== 'string')\r\n\t\t\t{\r\n\t\t\t\tstr = String(str);\r\n\t\t\t}\r\n\r\n\t\t\tif(removeNewLines)\r\n\t\t\t{\r\n\t\t\t\tlet newLine = /\\n/g;\r\n\t\t\t\tstr = str.replace(newLine, \"\\\\n\");\r\n\t\t\t}\r\n\r\n\t\t\tlet tab = /\\t/g;\r\n\t\t\treturn str.replace(tab, \"\\\\t\");\r\n\t\t};\r\n\r\n\t\tvar sanitize = (text) =>\r\n\t\t{\r\n\t\t\tif(typeof text !== 'string')\r\n\t\t\t{\r\n\t\t\t\treturn text;\r\n\t\t\t}\r\n\r\n\t\t\t/* we need to escape chars and encode the uri\r\n\t\t\tcomponents */\r\n\t\t\ttext = escapeChars(text);\r\n\t\t\ttext = encodeURIComponent(text);\r\n\r\n\t\t\t/* we want to re-encode the double quotes so they\r\n\t\t\twill be escaped by the json encoder */\r\n\t\t\tlet pattern = /\\%22/g;\r\n\t\t\treturn text.replace(pattern, '\"');\r\n\t\t};\r\n\r\n\t\tvar prepareUrl = (data) =>\r\n\t\t{\r\n\t\t\tlet type = typeof data;\r\n\t\t\tif(type === \"undefined\")\r\n\t\t\t{\r\n\t\t\t\treturn data;\r\n\t\t\t}\r\n\r\n\t\t\tif(type !== 'object')\r\n\t\t\t{\r\n\t\t\t\tdata = sanitize(data);\r\n\t\t\t\treturn data;\r\n\t\t\t}\r\n\r\n\t\t\tlet value;\r\n\t\t\tfor(var prop in data)\r\n\t\t\t{\r\n\t\t\t\tif(data.hasOwnProperty(prop))\r\n\t\t\t\t{\r\n\t\t\t\t\tvalue = data[prop];\r\n\t\t\t\t\tif(value === null)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tdata[prop] = (typeof value)? prepareUrl(value) : sanitize(value);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn data;\r\n\t\t};\r\n\r\n\t\t/* we want to check to clone object so we won't modify the\r\n\t\toriginal object */\r\n\t\tlet before = (typeof obj === 'object')? this.cloneObject(obj) : obj,\r\n\t\tafter = prepareUrl(before);\r\n\t\treturn this.jsonEncode(after);\r\n\t}\r\n\r\n\t/**\r\n\t * This will parse JSON data.\r\n\t *\r\n\t * @param {string} data\r\n\t * @return {*}\r\n\t */\r\n\tjsonDecode(data)\r\n\t{\r\n\t\treturn (typeof data !== \"undefined\" && data.length > 0)? JSON.parse(data) : false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will encode JSON data.\r\n\t *\r\n\t * @param {*} data\r\n\t * @return {string}\r\n\t */\r\n\tjsonEncode(data)\r\n\t{\r\n\t\treturn (typeof data !== \"undefined\")? JSON.stringify(data) : false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will parse xml data.\r\n\t *\r\n\t * @param {string} data\r\n\t * @return {object}\r\n\t */\r\n\txmlParse(data)\r\n\t{\r\n\t\tif(typeof data === \"undefined\")\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tvar parser = new DOMParser();\r\n\t\treturn parser.parseFromString(data, \"text/xml\");\r\n\t}\r\n}\r\n\r\n/**\r\n * This will return the base prototype to allow the module\r\n * to be added to base as a module.\r\n *\r\n * @static\r\n * @return {object} the base prototype.\r\n */\r\nBase.prototype.extend = (function()\r\n{\r\n\treturn Base.prototype;\r\n})();\r\n\r\n/**\r\n * This is the instance of base that all modules will use.\r\n * @global\r\n */\r\nexport const base = new Base();\r\n\r\n/**\r\n * This will add the Objects method to base.\r\n */\r\nbase.augment(Objects);\r\n\r\n/**\r\n * This will count the properties of an object.\r\n *\r\n * @param {object} obj\r\n * @return {int}\r\n */\r\nlet countProperty = (obj) =>\r\n{\r\n\tlet count = 0;\r\n\t/* we want to count each property of the object */\r\n\tfor(var property in obj)\r\n\t{\r\n\t\tif(obj.hasOwnProperty(property))\r\n\t\t{\r\n\t\t\tcount++;\r\n\t\t\t/* we want to do a recursive count to get\r\n\t\t\tany child properties */\r\n\t\t\tif(typeof obj[property] === 'object')\r\n\t\t\t{\r\n\t\t\t\tcount += countProperty(obj[property]);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn count;\r\n};\r\n\r\n/**\r\n * This will validate if the object properties match another object.\r\n *\r\n * @param {object} obj1\r\n * @param {object} obj2\r\n * @return {boolean}\r\n */\r\nlet matchProperties = (obj1, obj2) =>\r\n{\r\n\tlet matched = false;\r\n\r\n\tif(typeof obj1 !== 'object' || typeof obj2 !== 'object')\r\n\t{\r\n\t\treturn matched;\r\n\t}\r\n\r\n\t/* we want to check each object1 property to the\r\n\tobject 2 property */\r\n\tfor(var property in obj1)\r\n\t{\r\n\t\t/* we want to check if the property is owned by the\r\n\t\tobject and that they have matching types */\r\n\t\tif(!obj1.hasOwnProperty(property) || !obj2.hasOwnProperty(property))\r\n\t\t{\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tlet value1 = obj1[property],\r\n\t\tvalue2 = obj2[property];\r\n\r\n\t\tif(typeof value1 !== typeof value2)\r\n\t\t{\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\t/* we want to check if the type is an object */\r\n\t\tif(typeof value1 === 'object')\r\n\t\t{\r\n\t\t\t/* this will do a recursive check to the\r\n\t\t\tchild properties */\r\n\t\t\tmatched = matchProperties(value1, value2);\r\n\t\t\tif(matched !== true)\r\n\t\t\t{\r\n\t\t\t\t/* if a property did not match we can stop\r\n\t\t\t\tthe comparison */\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif(value1 === value2)\r\n\t\t\t{\r\n\t\t\t\tmatched = true;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn matched;\r\n};\r\n\r\n/**\r\n * This will compare if two objects match.\r\n *\r\n * @param {object} obj1\r\n * @param {object} obj2\r\n * @return {boolean}\r\n */\r\nlet compareObjects = (obj1, obj2) =>\r\n{\r\n\t/* we want to check if they have the same number of\r\n\tproperties */\r\n\tlet option1Count = countProperty(obj1),\r\n\toption2Count = countProperty(obj2);\r\n\tif(option1Count !== option2Count)\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\treturn matchProperties(obj1, obj2);\r\n};\r\n\r\nbase.augment(\r\n{\r\n\t/**\r\n\t * This will compare if two values match.\r\n\t *\r\n\t * @param {*} option1\r\n\t * @param {*} option2\r\n\t * @return {boolean}\r\n\t */\r\n\tequals(option1, option2)\r\n\t{\r\n\t\t/* we want to check if there types match */\r\n\t\tlet option1Type = typeof option1,\r\n\t\toption2Type = typeof option2;\r\n\t\tif(option1Type !== option2Type)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we need to check if the options are objects\r\n\t\tbecause we will want to match all the\r\n\t\tproperties */\r\n\t\tif(option1Type === 'object')\r\n\t\t{\r\n\t\t\treturn compareObjects(option1, option2);\r\n\t\t}\r\n\r\n\t\treturn (option1 === option2);\r\n\t}\r\n});", "\r\nimport {base} from './main.js';\r\nexport {base} from './main.js';\r\n\r\nconst dataTracker = base.dataTracker;\r\n\r\nexport const events =\r\n{\r\n /**\r\n * This will get the events on an element.\r\n *\r\n * @param {object} obj\r\n * @return {(array|boolean)}\r\n */\r\n getEvents(obj)\r\n {\r\n if(base.isObject(obj) === false)\r\n {\r\n return false;\r\n }\r\n return dataTracker.get(obj, 'events');\r\n },\r\n\r\n /**\r\n * This will create an object to use with the dataTracker.\r\n *\r\n * @param {string} event The event name.\r\n * @param {object} obj\r\n * @param {function} fn\r\n * @param {boolean} [capture]\r\n * @param {boolean} [swapped]\r\n * @param {function} [originalFn]\r\n * @return {object}\r\n */\r\n create(event, obj, fn, capture = false, swapped = false, originalFn = null)\r\n {\r\n /* we want to check if the swapped param was set */\r\n swapped = (swapped === true);\r\n\r\n return {\r\n event,\r\n obj,\r\n fn,\r\n capture,\r\n swapped,\r\n originalFn\r\n };\r\n },\r\n\r\n /**\r\n * This will add an event to an object.\r\n *\r\n * @param {string} event The event name.\r\n * @param {object} obj\r\n * @param {function} fn\r\n * @param {(object|boolean)} [capture]\r\n * @param {boolean} [swapped]\r\n * @param {function} [originalFn]\r\n */\r\n add(event, obj, fn, capture = false, swapped = false, originalFn = null)\r\n {\r\n if(base.isObject(obj) === false)\r\n {\r\n return this;\r\n }\r\n\r\n /* we want to create an event object and add it the\r\n the active events to track */\r\n let data = this.create(event, obj, fn, capture, swapped, originalFn);\r\n dataTracker.add(obj, 'events', data);\r\n\r\n obj.addEventListener(event, fn, capture);\r\n\r\n return this;\r\n },\r\n\r\n /**\r\n * This will remove an event from an object.\r\n *\r\n * @param {string} event The event name.\r\n * @param {object} obj\r\n * @param {function} fn\r\n * @param {(object|boolean)} [capture]\r\n * @return {object} a reference to the event object.\r\n */\r\n remove(event, obj, fn, capture = false)\r\n {\r\n let result = this.getEvent(event, obj, fn, capture);\r\n if(result === false)\r\n {\r\n return this;\r\n }\r\n\r\n if(typeof result === 'object')\r\n {\r\n /* we want to use the remove event method and just\r\n pass the listener object */\r\n this.removeEvent(result);\r\n }\r\n return this;\r\n },\r\n\r\n /**\r\n * This will remove an event listener.\r\n * @param {object} listener\r\n * @return {object} a reference to the event object.\r\n */\r\n removeEvent(listener)\r\n {\r\n if(typeof listener === 'object')\r\n {\r\n let obj = listener.obj;\r\n obj.removeEventListener(listener.event, listener.fn, listener.capture);\r\n }\r\n return this;\r\n },\r\n\r\n /**\r\n * This will search for an event.\r\n *\r\n * @protected\r\n * @param {string} event The event name.\r\n * @param {object} obj\r\n * @param {function} fn\r\n * @param {boolean} [capture]\r\n * @return {(object|boolean)}\r\n */\r\n getEvent(event, obj, fn, capture)\r\n {\r\n if(typeof obj !== 'object')\r\n {\r\n return false;\r\n }\r\n\r\n let events = this.getEvents(obj);\r\n if(!events || events.length < 1)\r\n {\r\n return false;\r\n }\r\n\r\n let eventObj = this.create(event, obj, fn, capture);\r\n /* if the search returns anything but false we\r\n found our active event */\r\n return this.search(eventObj, events);\r\n },\r\n\r\n /**\r\n * This will search for an event from the object events.\r\n *\r\n * @param {object} eventObj\r\n * @param {array} events\r\n * @return {(object|boolean)}\r\n */\r\n search(eventObj, events)\r\n {\r\n let listener,\r\n swappable = this.isSwappable(eventObj.event);\r\n for(var i = 0, maxLength = events.length; i < maxLength; i++)\r\n {\r\n listener = events[i];\r\n if(listener.event !== eventObj.event || listener.obj !== eventObj.obj)\r\n {\r\n continue;\r\n }\r\n\r\n if(listener.fn === eventObj.fn || (swappable === true && listener.originalFn === eventObj.fn))\r\n {\r\n return listener;\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n\r\n /**\r\n * This will remove all events on an object.\r\n *\r\n * @param {object} obj\r\n * @return {object} a reference to the events object.\r\n */\r\n removeEvents(obj)\r\n {\r\n if(base.isObject(obj) === false)\r\n {\r\n return this;\r\n }\r\n\r\n dataTracker.remove(obj, 'events');\r\n\r\n return this;\r\n },\r\n\r\n /**\r\n * @member {array} swap The swappable events.\r\n */\r\n swap: [\r\n 'DOMMouseScroll',\r\n 'wheel',\r\n 'mousewheel',\r\n 'mousemove',\r\n 'popstate'\r\n ],\r\n\r\n /**\r\n * This will a event type to the swappable array.\r\n *\r\n * @param {string} type\r\n */\r\n addSwapped(type)\r\n {\r\n this.swap.push(type);\r\n },\r\n\r\n /**\r\n * This will check if an event is swappable.\r\n *\r\n * @param {string} event\r\n * @return {boolean}\r\n */\r\n isSwappable(event)\r\n {\r\n /* we want to check if the event type is in the\r\n swapped event array */\r\n let index = base.inArray(this.swap, event);\r\n return (index > -1);\r\n }\r\n};\r\n\r\n/* this will register the event system to the\r\ndata tracker to remove events that have been\r\nadded in layouts. */\r\ndataTracker.addType('events', (data) =>\r\n{\r\n events.removeEvent(data);\r\n});\r\n\r\nbase.augment(\r\n{\r\n /**\r\n * @param object events\r\n */\r\n events,\r\n\r\n /**\r\n * This will add an event to an object.\r\n *\r\n * @param {string} event The event name.\r\n * @param {object} obj\r\n * @param {function} fn\r\n * @param {boolean} [capture]\r\n * @return {object} An instance of base.\r\n */\r\n addListener(event, obj, fn, capture)\r\n {\r\n this.events.add(event, obj, fn, capture);\r\n\r\n return this;\r\n },\r\n\r\n /**\r\n * This will add an event to an object.\r\n *\r\n * @param {string} event The event name.\r\n * @param {object} obj\r\n * @param {function} fn\r\n * @param {boolean} [capture]\r\n * @return {object} An instance of base.\r\n */\r\n on(event, obj, fn, capture)\r\n {\r\n let events = this.events;\r\n if(this.isArray(event))\r\n {\r\n let evt;\r\n for(var i = 0, length = event.length; i < length; i++)\r\n {\r\n evt = event[i];\r\n events.add(evt, obj, fn, capture);\r\n }\r\n }\r\n else\r\n {\r\n events.add(event, obj, fn, capture);\r\n }\r\n return this;\r\n },\r\n\r\n /**\r\n * This will remove an event from an object.\r\n *\r\n * @param {string} event The event name.\r\n * @param {object} obj\r\n * @param {function} fn\r\n * @param {boolean} [capture]\r\n * @return {object} An instance of base.\r\n */\r\n off(event, obj, fn, capture)\r\n {\r\n let events = this.events;\r\n if(this.isArray(event))\r\n {\r\n var evt;\r\n for(var i = 0, length = event.length; i < length; i++)\r\n {\r\n evt = event[i];\r\n events.remove(evt, obj, fn, capture);\r\n }\r\n }\r\n else\r\n {\r\n events.remove(event, obj, fn, capture);\r\n }\r\n return this;\r\n },\r\n\r\n /**\r\n * This will remove an event from an object.\r\n *\r\n * @param {string} event The event name.\r\n * @param {object} obj\r\n * @param {function} fn\r\n * @param {boolean} [capture]\r\n * @return {object} An instance of base.\r\n */\r\n removeListener(event, obj, fn, capture)\r\n {\r\n /* we want to remove this from the active events */\r\n this.events.remove(event, obj, fn, capture);\r\n\r\n return this;\r\n },\r\n\r\n /**\r\n * This will create a custom event.\r\n *\r\n * @protected\r\n * @param {object} event\r\n * @param {string} eventType\r\n * @param {object} [settings]\r\n * @param {object} [params]\r\n * @return {object}\r\n */\r\n _createEvent(event, eventType, settings, params)\r\n {\r\n let e;\r\n if(eventType === 'HTMLEvents')\r\n {\r\n e = new Event(event);\r\n }\r\n else if(eventType === 'MouseEvents')\r\n {\r\n e = new MouseEvent(event, settings);\r\n }\r\n else\r\n {\r\n e = new CustomEvent(event, params);\r\n }\r\n return e;\r\n },\r\n\r\n /**\r\n * This will create a custom event. This supports html, mouse,\r\n * and customevents.\r\n *\r\n * @param {string} event\r\n * @param {object} obj\r\n * @param {object} [options]\r\n * @param {object} [params]\r\n * @return {object}\r\n */\r\n createEvent(event, obj, options, params)\r\n {\r\n if(this.isObject(obj) === false)\r\n {\r\n return false;\r\n }\r\n\r\n let settings =\r\n {\r\n pointerX: 0,\r\n pointerY: 0,\r\n button: 0,\r\n view: window,\r\n detail: 1,\r\n screenX: 0,\r\n screenY: 0,\r\n clientX: 0,\r\n clientY: 0,\r\n ctrlKey: false,\r\n altKey: false,\r\n shiftKey: false,\r\n metaKey: false,\r\n bubbles: true,\r\n cancelable: true,\r\n relatedTarget: null\r\n };\r\n\r\n if(base.isObject(options))\r\n {\r\n settings = Object.assign(settings, options);\r\n }\r\n\r\n let eventType = this._getEventType(event);\r\n return this._createEvent(event, eventType, settings, params);\r\n },\r\n\r\n /**\r\n * This will get thetype of an event.\r\n *\r\n * @protected\r\n * @param {string} event\r\n * @return {string}\r\n */\r\n _getEventType(event)\r\n {\r\n let eventTypes = {\r\n 'HTMLEvents': /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/,\r\n 'MouseEvents': /^(?:click|dblclick|mouse(?:down|up|over|move|out))$/\r\n },\r\n\r\n value,\r\n eventType = 'CustomEvent';\r\n for(var prop in eventTypes)\r\n {\r\n if(eventTypes.hasOwnProperty(prop))\r\n {\r\n value = eventTypes[prop];\r\n if(event.match(value))\r\n {\r\n eventType = prop;\r\n break;\r\n }\r\n }\r\n }\r\n return eventType;\r\n },\r\n\r\n /**\r\n * This will trigger an event.\r\n *\r\n * @param {(string|object)} event\r\n * @param {object} obj\r\n * @param {object} [params]\r\n * @return {object}\r\n */\r\n trigger(event, obj, params)\r\n {\r\n if(this.isObject(obj) === false)\r\n {\r\n return this;\r\n }\r\n\r\n let e = (typeof event === 'string')? this.createEvent(event, obj, null, params) : event;\r\n obj.dispatchEvent(e);\r\n return this;\r\n },\r\n\r\n /**\r\n * @member {string} mouseWheelEventType The mouse wheel event name.\r\n * @protected\r\n */\r\n mouseWheelEventType: null,\r\n\r\n /**\r\n * This will get the system mouse event.\r\n *\r\n * @protected\r\n * @return {string}\r\n */\r\n getWheelEventType()\r\n {\r\n /* this will check what mouse wheel type\r\n the client supports\r\n @return (string) the event name */\r\n let getMouseWheelType = () =>\r\n {\r\n let type = 'wheel';\r\n if('onmousewheel' in self)\r\n {\r\n type = 'mousewheel';\r\n }\r\n else if('DOMMouseScroll' in self)\r\n {\r\n type = 'DOMMouseScroll';\r\n }\r\n return type;\r\n };\r\n\r\n /* this will get the event type or\r\n one time set the type and return the type */\r\n return this.mouseWheelEventType || (\r\n this.mouseWheelEventType = getMouseWheelType()\r\n );\r\n },\r\n\r\n /**\r\n * This will add a mouse event to an object.\r\n *\r\n * @param {function} callBackFn\r\n * @param {object} [obj]\r\n * @param {boolean} [cancelDefault]\r\n * @param {boolean} capture\r\n * @return {object} base object.\r\n */\r\n onMouseWheel(callBackFn, obj, cancelDefault, capture)\r\n {\r\n if(typeof obj === \"undefined\")\r\n {\r\n obj = window;\r\n }\r\n\r\n /* we want to return the mousewheel data\r\n to this private callback function before\r\n returning to the call back function*/\r\n let mouseWheelResults = (e) =>\r\n {\r\n e = e || window.event;\r\n let delta = Math.max(-1, Math.min(1, (-e.deltaY || e.wheelDelta || -e.detail)));\r\n\r\n /* we can now send the mouse wheel results to\r\n the call back function */\r\n if(typeof callBackFn === 'function')\r\n {\r\n callBackFn(delta, e);\r\n }\r\n\r\n /* we want to check to cancel default */\r\n if(cancelDefault === true)\r\n {\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n let event = this.getWheelEventType();\r\n this.events.add(event, obj, mouseWheelResults, capture, true, callBackFn);\r\n return this;\r\n },\r\n\r\n /**\r\n * This will remove a mouse event\r\n *\r\n * @param {function} callBackFn\r\n * @param {object} [obj]\r\n * @param {boolean} capture\r\n * @return {object} base object.\r\n */\r\n offMouseWheel(callBackFn, obj, capture)\r\n {\r\n if(typeof obj === \"undefined\")\r\n {\r\n obj = window;\r\n }\r\n\r\n let event = this.getWheelEventType();\r\n this.off(event, obj, callBackFn, capture);\r\n return this;\r\n },\r\n\r\n /**\r\n * This will prevent default on an event.\r\n *\r\n * @param {object} e\r\n * @return {object} base object.\r\n */\r\n preventDefault(e)\r\n {\r\n e = e || window.event;\r\n\r\n if(typeof e.preventDefault === 'function')\r\n {\r\n e.preventDefault();\r\n }\r\n else\r\n {\r\n e.returnValue = false;\r\n }\r\n\r\n return this;\r\n },\r\n\r\n /**\r\n * This will stop an event from propigating.\r\n *\r\n * @param {object} e\r\n * @return {object} base object.\r\n */\r\n stopPropagation(e)\r\n {\r\n e = e || window.event;\r\n\r\n if(typeof e.stopPropagation === 'function')\r\n {\r\n e.stopPropagation();\r\n }\r\n else\r\n {\r\n e.cancelBubble = true;\r\n }\r\n\r\n return this;\r\n }\r\n});", "import {base} from '../../core.js';\r\n\r\n/**\r\n * This is the default xhr (ajax) settings.\r\n */\r\nlet XhrDefaultSettings =\r\n{\r\n\turl: '',\r\n\r\n\t/* this is the responseType of the server\r\n\tresponse (string) */\r\n\tresponseType: 'json',\r\n\r\n\t/* this is the server method */\r\n\tmethod: 'POST',\r\n\r\n\t/* this can fix a param string to be added\r\n\tto every ajax request */\r\n\tfixedParams: '',\r\n\r\n\t/* headers (object) */\r\n\theaders:\r\n\t{\r\n\t\t'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'\r\n\t},\r\n\r\n\tbeforeSend: [],\r\n\r\n\t/* this will set the ajax request to async (bool) */\r\n\tasync: true,\r\n\r\n\t/* cross domain (bool) */\r\n\tcrossDomain: false,\r\n\r\n\t/* cors with credentials (bool) */\r\n\twithCredentials: false,\r\n\r\n\t/* events (function) */\r\n\tcompleted: null,\r\n\tfailed: null,\r\n\taborted: null,\r\n\tprogress: null\r\n};\r\n\r\n/* this will add ajax settings to the base class */\r\nbase.augment(\r\n{\r\n\t/**\r\n\t * @member {object} xhrSettings\r\n\t */\r\n\txhrSettings: XhrDefaultSettings,\r\n\r\n\t/**\r\n\t * This will add fixed params to each xhr request.\r\n\t *\r\n\t * @param {(string|object)} params\r\n\t */\r\n\taddFixedParams(params)\r\n\t{\r\n\t\tthis.xhrSettings.fixedParams = params;\r\n\t},\r\n\r\n\t/**\r\n\t * This will add a callback that will be called before\r\n\t * each request.\r\n\t *\r\n\t * @param {function} callBack\r\n\t */\r\n\tbeforeSend(callBack)\r\n\t{\r\n\t\tthis.xhrSettings.beforeSend.push(callBack);\r\n\t},\r\n\r\n\t/**\r\n\t * This will update the xhr settings.\r\n\t *\r\n\t * @param {object} settingsObj\r\n\t */\r\n\tajaxSettings(settingsObj)\r\n\t{\r\n\t\tif(typeof settingsObj === 'object')\r\n\t\t{\r\n\t\t\tthis.xhrSettings = this.extendClass(base.xhrSettings, settingsObj);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * This will reset the xhr settings.\r\n\t */\r\n\tresetAjaxSettings()\r\n\t{\r\n\t\tthis.xhrSettings = XhrDefaultSettings;\r\n\t}\r\n});\r\n\r\n/**\r\n * This will make an xhr (ajax) request.\r\n *\r\n * @param {string} url\r\n * @param {string} params\r\n * @param {function} callBackFn\r\n * @param {string} responseType\r\n * @param {string} [method=POST]\r\n * @param {boolean} async\r\n *\r\n * or\r\n *\r\n * @param {object} settings\r\n * @example\r\n * {\r\n * \turl: '',\r\n * \tparams: '',\r\n * \tcompleted(response)\r\n * \t{\r\n *\r\n * \t}\r\n * }\r\n *\r\n * @return {object} xhr object.\r\n */\r\nexport const ajax = (...args) =>\r\n{\r\n\t/* we want to save the args so we can check\r\n\twhich way we are adding the ajax settings */\r\n\tconst ajax = new XhrRequest(args);\r\n\treturn ajax.xhr;\r\n};\r\n\r\n/**\r\n * XhrRequest\r\n *\r\n * This will create an xhr request object.\r\n * @class\r\n */\r\nexport class XhrRequest\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {*} args\r\n\t */\r\n\tconstructor(args)\r\n\t{\r\n\t\tthis.settings = null;\r\n\t\tthis.xhr = null;\r\n\t\tthis.setup(args);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the xhr request.\r\n\t *\r\n\t * @protected\r\n\t * @param {*} args\r\n\t * @return {(object|boolean)}\r\n\t */\r\n\tsetup(args)\r\n\t{\r\n\t\tthis.getXhrSettings(args);\r\n\r\n\t\tlet xhr = this.xhr = this.createXHR();\r\n\t\tif(xhr === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst {method, url, async} = this.settings;\r\n\t\txhr.open(method, url, async);\r\n\r\n\t\tthis.setupHeaders();\r\n\t\tthis.addXhrEvents();\r\n\t\tthis.beforeSend();\r\n\r\n\t\t/* this will setup the params and send the\r\n\t\txhr request */\r\n\t\txhr.send(this.getParams());\r\n\t}\r\n\r\n\t/**\r\n\t * This will call all before send callbacks.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tbeforeSend()\r\n\t{\r\n\t\tlet items = base.xhrSettings.beforeSend;\r\n\t\tif(items.length < 1)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet xhr = this.xhr;\r\n\t\tlet settings = this.settings;\r\n\t\tfor(var i = 0, length = items.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar callBack = items[i];\r\n\t\t\tif(callBack)\r\n\t\t\t{\r\n\t\t\t\tcallBack(xhr, settings);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will convert an object to a string.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} object\r\n\t * @return {string}\r\n\t */\r\n\tobjectToString(object)\r\n\t{\r\n\t\tlet params = [];\r\n\t\tfor (var prop in object)\r\n\t\t{\r\n\t\t\tif(object.hasOwnProperty(prop))\r\n\t\t\t{\r\n\t\t\t\tparams.push(prop + '=' + object[prop]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn params.join('&');\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the base params to the request params.\r\n\t *\r\n\t * @protected\r\n\t * @param {*} params\r\n\t * @param {*} addingParams\r\n\t * @return {*}\r\n\t */\r\n\tsetupParams(params, addingParams)\r\n\t{\r\n\t\tlet paramsType = typeof params;\r\n\t\tif(addingParams)\r\n\t\t{\r\n\t\t\t/* this will convert the adding params to match\r\n\t\t\tthe params type */\r\n\t\t\tlet addingType = typeof addingParams;\r\n\t\t\tif(paramsType === 'string')\r\n\t\t\t{\r\n\t\t\t\tif(addingType !== 'string')\r\n\t\t\t\t{\r\n\t\t\t\t\taddingParams = this.objectToString(addingParams);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst char = (params === '')? '?' : '&';\r\n\t\t\t\tparams += char + addingParams;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tif(addingType === 'string')\r\n\t\t\t\t{\r\n\t\t\t\t\taddingParams = base.parseQueryString(addingParams, false);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(params instanceof FormData)\r\n\t\t\t\t{\r\n\t\t\t\t\tfor(var key in addingParams)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif(addingParams.hasOwnProperty(key))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tparams.append(key, addingParams[key]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if(paramsType === 'object')\r\n\t\t\t\t{\r\n\t\t\t\t\t/* we don't want to modify the original object\r\n\t\t\t\t\tso we need to clone the object before extending */\r\n\t\t\t\t\tparams = base.cloneObject(params);\r\n\r\n\t\t\t\t\tparams = Object.assign(addingParams, params);\r\n\t\t\t\t\tparams = this.objectToString(params);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif((params instanceof FormData) === false && paramsType === 'object')\r\n\t\t\t{\r\n\t\t\t\tparams = this.objectToString(params);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn params;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the params.\r\n\t * @protected\r\n\t * @return {*}\r\n\t */\r\n\tgetParams()\r\n\t{\r\n\t\tlet settings = this.settings,\r\n\t\tparams = settings.params;\r\n\r\n\t\tlet fixedParams = settings.fixedParams;\r\n\t\tif(params)\r\n\t\t{\r\n\t\t\tparams = this.setupParams(params, fixedParams);\r\n\t\t}\r\n\t\telse if(fixedParams)\r\n\t\t{\r\n\t\t\tparams = this.setupParams(fixedParams);\r\n\t\t}\r\n\r\n\t\treturn params;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the settings from the args.\r\n\t *\r\n\t * @protected\r\n\t * @param {array} args\r\n\t */\r\n\tgetXhrSettings(args)\r\n\t{\r\n\t\t/* we want to create a clone of the default\r\n\t\tsettings before adding the new settings */\r\n\t\tlet settings = this.settings = Object.create(base.xhrSettings);\r\n\r\n\t\t/* we want to check if we are adding the ajax settings by\r\n\t\tindividual args or by a settings object */\r\n\t\tif(args.length >= 2 && typeof args[0] !== 'object')\r\n\t\t{\r\n\t\t\tfor(var i = 0, maxLength = args.length; i < maxLength; i++)\r\n\t\t\t{\r\n\t\t\t\tvar arg = args[i];\r\n\r\n\t\t\t\tswitch(i)\r\n\t\t\t\t{\r\n\t\t\t\t\tcase 0:\r\n\t\t\t\t\t\tsettings.url = arg;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 1:\r\n\t\t\t\t\t\tsettings.params = arg;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 2:\r\n\t\t\t\t\t\tsettings.completed = arg;\r\n\t\t\t\t\t\tsettings.failed = arg;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 3:\r\n\t\t\t\t\t\tsettings.responseType = arg || 'json';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 4:\r\n\t\t\t\t\t\tsettings.method = (arg)? arg.toUpperCase() : 'POST';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 5:\r\n\t\t\t\t\t\tsettings.async = (typeof arg !== 'undefined')? arg : true;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t/* override the default settings with the args\r\n\t\t\tsettings object */\r\n\t\t\tsettings = this.settings = base.extendClass(this.settings, args[0]);\r\n\r\n\t\t\t/* we want to check to add the completed callback\r\n\t\t\tas the error and aborted if not set */\r\n\t\t\tif(typeof settings.completed === 'function')\r\n\t\t\t{\r\n\t\t\t\tif(typeof settings.failed !== 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tsettings.failed = settings.completed;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(typeof settings.aborted !== 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tsettings.aborted = settings.failed;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will create the xhr object.\r\n\t *\r\n\t * @protected\r\n\t * @return {(object|boolean)}\r\n\t */\r\n\tcreateXHR()\r\n\t{\r\n\t\t/* we want to check to setup the xhr by\r\n\t\tthe crossDomain settings */\r\n\t\tlet settings = this.settings,\r\n\r\n\t\txhr = new XMLHttpRequest();\r\n\t\txhr.responseType = settings.responseType;\r\n\r\n\t\tif(settings.withCredentials === true)\r\n\t\t{\r\n\t\t\txhr.withCredentials = true;\r\n\t\t}\r\n\r\n\t\treturn xhr;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the request headers.\r\n\t */\r\n\tsetupHeaders()\r\n\t{\r\n\t\tlet settings = this.settings;\r\n\t\tif(settings && typeof settings.headers === 'object')\r\n\t\t{\r\n\t\t\t/* we want to add a header for each\r\n\t\t\tproperty in the object */\r\n\t\t\tlet headers = settings.headers;\r\n\t\t\tfor(var header in headers)\r\n\t\t\t{\r\n\t\t\t\tif(headers.hasOwnProperty(header))\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.xhr.setRequestHeader(header, headers[header]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the request status.\r\n\t *\r\n\t * @param {object} e\r\n\t * @param {string} [overrideType]\r\n\t */\r\n\tupdate(e, overrideType)\r\n\t{\r\n\t\tlet xhr = this.xhr;\r\n\r\n\t\t/* this will remove the xhr events from the active events\r\n\t\tafter the events are completed, aborted, or errored */\r\n\t\tlet removeEvents = () =>\r\n\t\t{\r\n\t\t\tlet events = base.events;\r\n\t\t\tevents.removeEvents(xhr.upload);\r\n\t\t\tevents.removeEvents(xhr);\r\n\t\t};\r\n\r\n\t\tlet settings = this.settings;\r\n\t\tif(!settings)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet type = overrideType || e.type;\r\n\t\tswitch(type)\r\n\t\t{\r\n\t\t\tcase 'load':\r\n\t\t\t\tif(typeof settings.completed === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tlet response = this.getResponseData();\r\n\t\t\t\t\tsettings.completed(response, this.xhr);\r\n\t\t\t\t}\r\n\t\t\t\tremoveEvents();\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'error':\r\n\t\t\t\tif(typeof settings.failed === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tsettings.failed(false, this.xhr);\r\n\t\t\t\t}\r\n\t\t\t\tremoveEvents();\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'progress':\r\n\t\t\t\tif(typeof settings.progress === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tsettings.progress(e);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'abort':\r\n\t\t\t\tif(typeof settings.aborted === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tsettings.aborted(false, this.xhr);\r\n\t\t\t\t}\r\n\t\t\t\tremoveEvents();\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the response data.\r\n\t *\r\n\t * @return {*}\r\n\t */\r\n\tgetResponseData()\r\n\t{\r\n\t\tlet xhr = this.xhr,\r\n\t\tresponse = xhr.response;\r\n\r\n\t\tconst responseType = xhr.responseType;\r\n\t\tif(!responseType || responseType === 'text')\r\n\t\t{\r\n\t\t\treturn xhr.responseText;\r\n\t\t}\r\n\r\n\t\treturn response;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the xhr events.\r\n\t */\r\n\taddXhrEvents()\r\n\t{\r\n\t\tlet settings = this.settings;\r\n\t\tif(!settings)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet xhr = this.xhr,\r\n\t\tcallBack = base.bind(this, this.update);\r\n\t\tbase.on(['load', 'error', 'abort'], xhr, callBack);\r\n\t\tbase.on('progress', xhr.upload, callBack);\r\n\t}\r\n}", "let lastToken = -1;\r\n\r\n/**\r\n * DataPubSub\r\n *\r\n * This is a pub sub class to allow subscribers to\r\n * listen for updates when published by publishers.\r\n * @class\r\n */\r\nexport class DataPubSub\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {object} callBacks\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis.callBacks = {};\r\n\r\n\t\t/**\r\n\t\t * @member {int} lastToken\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis.lastToken = -1;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get a subscriber array.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @return {array}\r\n\t */\r\n\tget(msg)\r\n\t{\r\n\t\tlet callBacks = this.callBacks;\r\n\t\treturn (callBacks[msg] || (callBacks[msg] = []));\r\n\t}\r\n\r\n\t/**\r\n\t * This will reset pub sub.\r\n\t */\r\n\treset()\r\n\t{\r\n\t\tthis.callBacks = {};\r\n\t\tthis.lastToken = -1;\r\n\t\tlastToken = -1;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a subscriber.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @param {function} callBack\r\n\t * @return {string} The subscriber token.\r\n\t */\r\n\ton(msg, callBack)\r\n\t{\r\n\t\tlet token = (++lastToken),\r\n\t\tlist = this.get(msg);\r\n\t\tlist.push({\r\n\t\t\ttoken: token,\r\n\t\t\tcallBack: callBack\r\n\t\t});\r\n\t\treturn token;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a subscriber.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @param {string} token\r\n\t */\r\n\toff(msg, token)\r\n\t{\r\n\t\tlet list = this.callBacks[msg] || false;\r\n\t\tif(list === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet length = list.length;\r\n\t\tfor (var i = 0; i < length; i++ )\r\n\t\t{\r\n\t\t\tvar item = list[i];\r\n\t\t\tif(item.token === token)\r\n\t\t\t{\r\n\t\t\t\tlist.splice(i, 1);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will delete a message.\r\n\t *\r\n\t * @param {string} msg\r\n\t */\r\n\tremove(msg)\r\n\t{\r\n\t\tlet callBacks = this.callBacks;\r\n\t\tif(callBacks[msg])\r\n\t\t{\r\n\t\t\tdelete callBacks[msg];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish a message.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @param {string} value\r\n\t * @param {object} committer\r\n\t */\r\n\tpublish(msg)\r\n\t{\r\n\t\tlet i, length,\r\n\t\tlist = this.callBacks[msg] || false;\r\n\t\tif(list === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet args = Array.prototype.slice.call(arguments, 1);\r\n\r\n\t\tlength = list.length;\r\n\t\tfor (i = 0; i < length; i++)\r\n\t\t{\r\n\t\t\tvar item = list[i];\r\n\t\t\tif(!item)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\titem.callBack.apply(this, args);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport const pubSub = new DataPubSub();", "/**\r\n * Source\r\n *\r\n * This will create a new source to use with\r\n * a connection.\r\n * @class\r\n */\r\nexport class Source\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {string} msg\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis.msg = null;\r\n\r\n\t\t/**\r\n\t\t * @member {string} token\r\n\t\t */\r\n\t\tthis.token = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the token.\r\n\t *\r\n\t * @param {string} token\r\n\t */\r\n\tsetToken(token)\r\n\t{\r\n\t\tthis.token = token;\r\n\t}\r\n}", "import {Source} from './source.js';\r\n\r\n/**\r\n * OneWaySource\r\n *\r\n * This will create a one way source to use with\r\n * a connection.\r\n * @class\r\n * @augments Source\r\n */\r\nexport class OneWaySource extends Source\r\n{\r\n\t/**\r\n\t * This will setup the data source.\r\n\t *\r\n\t * @param {object} data\r\n\t */\r\n\tconstructor(data)\r\n\t{\r\n\t\tsuper();\r\n\t\tthis.data = data;\r\n\t}\r\n\r\n\t/**\r\n\t * This will subscribe to a message.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @param {function} callBack\r\n\t */\r\n\tsubscribe(msg, callBack)\r\n\t{\r\n\t\tthis.msg = msg;\r\n\t\tthis.token = this.data.on(msg, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will unsubscribe from the message.\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\t\tthis.data.off(this.msg, this.token);\r\n\t}\r\n}", "/**\r\n * Connection\r\n *\r\n * This will create a connection.\r\n * @class\r\n */\r\nexport class Connection\r\n{\r\n\t/**\r\n\t * This will be used to unsubscribe.\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\r\n\t}\r\n}", "import {OneWaySource} from './one-way-source.js';\r\nimport {Connection} from './connection.js';\r\n\r\n/**\r\n * OneWayConnection\r\n *\r\n * This will create a one way connection.\r\n * @class\r\n * @augments Connection\r\n */\r\nexport class OneWayConnection extends Connection\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\tsuper();\r\n\r\n\t\t/**\r\n\t\t * @member {object} source\r\n\t\t */\r\n\t\tthis.source = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the connection source.\r\n\t *\r\n\t * @param {object} data\r\n\t * @return {object}\r\n\t */\r\n\taddSource(data)\r\n\t{\r\n\t\treturn (this.source = new OneWaySource(data));\r\n\t}\r\n\r\n\t/**\r\n\t * This will be used to unsubscribe.\r\n\t * @override\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\t\tthis.source.unsubscribe();\r\n\t\tthis.source = null;\r\n\t}\r\n}", "import {Source} from './source.js';\r\nimport {pubSub} from './data-pub-sub.js';\r\n\r\n/**\r\n * TwoWaySource\r\n *\r\n * This will create a two way source to use with\r\n * a connection.\r\n * @class\r\n * @augments Source\r\n */\r\nexport class TwoWaySource extends Source\r\n{\r\n\t/**\r\n\t * This will subscribe to a message.\r\n\t *\r\n\t * @param {string} msg\r\n\t */\r\n\tsubscribe(msg)\r\n\t{\r\n\t\tthis.msg = msg;\r\n\t\tlet callBack = this.callBack.bind(this);\r\n\t\tthis.token = pubSub.on(msg, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will unsubscribe from a message.\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\t\tpubSub.off(this.msg, this.token);\r\n\t}\r\n\r\n\t/**\r\n\t * Override this to setup cource callBack.\r\n\t */\r\n\tcallBack()\r\n\t{\r\n\r\n\t}\r\n}", "import {TwoWaySource} from './two-way-source.js';\r\n\r\n/**\r\n * DataSource\r\n *\r\n * This will create a data source to use with\r\n * a connection.\r\n * @class\r\n * @augments TwoWaySource\r\n */\r\nexport class DataSource extends TwoWaySource\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t */\r\n\tconstructor(data, prop)\r\n\t{\r\n\t\tsuper();\r\n\t\tthis.data = data;\r\n\t\tthis.prop = prop;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the data value.\r\n\t *\r\n\t * @param {*} value\r\n\t */\r\n\tset(value)\r\n\t{\r\n\t\tthis.data.set(this.prop, value);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the data value.\r\n\t */\r\n\tget()\r\n\t{\r\n\t\treturn this.data.get(this.prop);\r\n\t}\r\n\r\n\t/**\r\n\t * The callBack when updated.\r\n\t *\r\n\t * @param {*} value\r\n\t * @param {object} committer\r\n\t */\r\n\tcallBack(value, committer)\r\n\t{\r\n\t\tif(this.data !== committer)\r\n\t\t{\r\n\t\t\tthis.data.set(this.prop, value, committer);\r\n\t\t}\r\n\t}\r\n}", "import {base} from '../../core.js';\r\nimport {TwoWaySource} from './two-way-source.js';\r\n\r\n/**\r\n * This will set an element attr by the setAttribute method.\r\n *\r\n * @param {object} element\r\n * @param {string} attr\r\n * @param {mixed} value\r\n */\r\nconst SetAttr = (element, attr, value) =>\r\n{\r\n\tbase.setAttr(element, attr, value);\r\n};\r\n\r\nconst UpdateRadioAttr = (element, attr, value) =>\r\n{\r\n\telement.checked = (element.value === value);\r\n};\r\n\r\nconst UpdateCheckboxAttr = (element, attr, value) =>\r\n{\r\n\tvalue = (value == 1);\r\n\tUpdateAttr(element, attr, value);\r\n};\r\n\r\n/**\r\n * This will update an element attr by the bracket notation.\r\n *\r\n * @param {object} element\r\n * @param {string} attr\r\n * @param {nixed} value\r\n */\r\nconst UpdateAttr = (element, attr, value) =>\r\n{\r\n\telement[attr] = value;\r\n};\r\n\r\nconst GetAttr = (element, attr) =>\r\n{\r\n\treturn base.getAttr(element, attr);\r\n};\r\n\r\nconst GetAttribute = (element, attr) =>\r\n{\r\n\treturn element[attr];\r\n};\r\n\r\n/**\r\n * ElementSource\r\n *\r\n * This will create an element source to use with\r\n * a connection.\r\n * @class\r\n * @augments TwoWaySource\r\n */\r\nexport class ElementSource extends TwoWaySource\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} element\r\n\t * @param {string} attr\r\n\t * @param {(string|function)} [filter]\r\n\t */\r\n\tconstructor(element, attr, filter)\r\n\t{\r\n\t\tsuper();\r\n\t\tthis.element = element;\r\n\t\tthis.attr = this.getAttrBind(attr);\r\n\t\tthis.addSetMethod(element, this.attr);\r\n\r\n\t\tthis.filter = (typeof filter === 'string')? this.setupFilter(filter) : filter;\r\n\t}\r\n\r\n\taddSetMethod(element, attr)\r\n\t{\r\n\t\tif(attr.substring(4, 1) === '-')\r\n\t\t{\r\n\t\t\tthis.setValue = SetAttr;\r\n\t\t\tthis.getValue = GetAttr;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.getValue = GetAttribute;\r\n\r\n\t\t\tvar type = element.type;\r\n\t\t\tif(type)\r\n\t\t\t{\r\n\t\t\t\tswitch(type)\r\n\t\t\t\t{\r\n\t\t\t\t\tcase 'checkbox':\r\n\t\t\t\t\t\tthis.setValue = UpdateCheckboxAttr;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tcase 'radio':\r\n\t\t\t\t\t\tthis.setValue = UpdateRadioAttr;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.setValue = UpdateAttr;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the bind attribute.\r\n\t *\r\n\t * @param {string} [customAttr]\r\n\t * @return {string}\r\n\t */\r\n\tgetAttrBind(customAttr)\r\n\t{\r\n\t\t/* this will setup the custom attr if the prop\r\n\t\thas specified one. */\r\n\t\tif(customAttr)\r\n\t\t{\r\n\t\t\treturn customAttr;\r\n\t\t}\r\n\r\n\t\tlet attr = 'textContent';\r\n\t\t/* if no custom attr has been requested we will get the\r\n\t\tdefault attr of the element */\r\n\t\tlet element = this.element;\r\n\t\tif(!(element && typeof element === 'object'))\r\n\t\t{\r\n\t\t\treturn attr;\r\n\t\t}\r\n\r\n\t\tlet tagName = element.tagName.toLowerCase();\r\n\t\tif (tagName === \"input\" || tagName === \"textarea\" || tagName === \"select\")\r\n\t\t{\r\n\t\t\tlet type = element.type;\r\n\t\t\tif(type)\r\n\t\t\t{\r\n\t\t\t\tswitch(type)\r\n\t\t\t\t{\r\n\t\t\t\t\tcase 'checkbox':\r\n\t\t\t\t\t\tattr = 'checked';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'file':\r\n\t\t\t\t\t\tattr = 'files';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tattr = 'value';\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tattr = 'value';\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn attr;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup a filter callBack.\r\n\t *\r\n\t * @param {string} filter\r\n\t * @return {function}\r\n\t */\r\n\tsetupFilter(filter)\r\n\t{\r\n\t\tlet pattern = /(\\[\\[[^\\]]+\\]\\])/;\r\n\t\treturn (value) =>\r\n\t\t{\r\n\t\t\treturn filter.replace(pattern, value);\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will set a value on an element.\r\n\t *\r\n\t * @param {*} value\r\n\t */\r\n\tset(value)\r\n\t{\r\n\t\tlet element = this.element;\r\n\t\tif(!element || typeof element !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* this will check to apply the option filter before\r\n\t\tsetting the value */\r\n\t\tif(this.filter)\r\n\t\t{\r\n\t\t\tvalue = this.filter(value);\r\n\t\t}\r\n\r\n\t\tthis.setValue(element, this.attr, value);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the value from an element.\r\n\t */\r\n\tget()\r\n\t{\r\n\t\tlet element = this.element;\r\n\t\tif(!element || typeof element !== 'object')\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\treturn this.getValue(element, this.attr);\r\n\t}\r\n\r\n\t/**\r\n\t * The callBack when updated.\r\n\t *\r\n\t * @param {*} value\r\n\t * @param {object} committer\r\n\t */\r\n\tcallBack(value, committer)\r\n\t{\r\n\t\tif(committer !== this.element)\r\n\t\t{\r\n\t\t\tthis.set(value);\r\n\t\t}\r\n\t}\r\n}", "import {DataSource} from './data-source.js';\r\nimport {ElementSource} from './element-source.js';\r\nimport {Connection} from './connection.js';\r\n\r\n/**\r\n * TwoWayConnection\r\n *\r\n * This will setup a two way connection.\r\n * @class\r\n * @augments Connection\r\n */\r\nexport class TwoWayConnection extends Connection\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\tsuper();\r\n\r\n\t\tthis.element = null;\r\n\t\tthis.data = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the element source.\r\n\t *\r\n\t * @param {object} element\r\n\t * @param {string} attr\r\n\t * @param {(string|function)} filter\r\n\t * @return {object}\r\n\t */\r\n\taddElement(element, attr, filter)\r\n\t{\r\n\t\treturn (this.element = new ElementSource(element, attr, filter));\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the data source.\r\n\t *\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @return {object}\r\n\t */\r\n\taddData(data, prop)\r\n\t{\r\n\t\treturn (this.data = new DataSource(data, prop));\r\n\t}\r\n\r\n\t/**\r\n\t * This will unsubscribe from a source.\r\n\t *\r\n\t * @param {object} source\r\n\t */\r\n\tunsubscribeSource(source)\r\n\t{\r\n\t\tif(source)\r\n\t\t{\r\n\t\t\tsource.unsubscribe();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will be used to unsubscribe.\r\n\t * @override\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\t\tthis.unsubscribeSource(this.element);\r\n\t\tthis.unsubscribeSource(this.data);\r\n\r\n\t\tthis.element = null;\r\n\t\tthis.data = null;\r\n\t}\r\n}", "import {base} from '../../core.js';\r\n\r\n/**\r\n * ConnectionTracker\r\n *\r\n * This will create a new connection tracker to track active\r\n * connections in the data binder.\r\n * @class\r\n */\r\nexport class ConnectionTracker\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {object} connections\r\n\t\t */\r\n\t\tthis.connections = {};\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a new connection to be tracked.\r\n\t *\r\n\t * @param {string} id\r\n\t * @param {string} attr\r\n\t * @param {object} connection\r\n\t * @return {object}\r\n\t */\r\n\tadd(id, attr, connection)\r\n\t{\r\n\t\tlet connections = this.find(id);\r\n\t\treturn (connections[attr] = connection);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get a connection.\r\n\t *\r\n\t * @param {string} id\r\n\t * @param {string} attr\r\n\t * @return {(object|bool)}\r\n\t */\r\n\tget(id, attr)\r\n\t{\r\n\t\tlet connections = this.connections[id];\r\n\t\tif(connections)\r\n\t\t{\r\n\t\t\treturn (connections[attr] || false);\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will find a connection.\r\n\t *\r\n\t * @param {string} id\r\n\t * @return {object}\r\n\t */\r\n\tfind(id)\r\n\t{\r\n\t\tlet connections = this.connections;\r\n\t\treturn (connections[id] || (connections[id] = {}));\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a connection or all connections by id.\r\n\t * @param {string} id\r\n\t * @param {string} [attr]\r\n\t */\r\n\tremove(id, attr)\r\n\t{\r\n\t\tlet connections = this.connections[id];\r\n\t\tif(!connections)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet connection;\r\n\t\tif(attr)\r\n\t\t{\r\n\t\t\tconnection = connections[attr];\r\n\t\t\tif(connection)\r\n\t\t\t{\r\n\t\t\t\tconnection.unsubscribe();\r\n\t\t\t\tdelete connections[attr];\r\n\t\t\t}\r\n\r\n\t\t\t/* this will remove the msg from the elements\r\n\t\t\tif no elements are listed under the msg */\r\n\t\t\tif(base.isEmpty(connections))\r\n\t\t\t{\r\n\t\t\t\tdelete this.connections[id];\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tfor(var prop in connections)\r\n\t\t\t{\r\n\t\t\t\tif(connections.hasOwnProperty(prop))\r\n\t\t\t\t{\r\n\t\t\t\t\tconnection = connections[prop];\r\n\t\t\t\t\tif(connection)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tconnection.unsubscribe();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tdelete this.connections[id];\r\n\t\t}\r\n\t}\r\n}", "import {base} from '../../core.js';\r\nexport {DataPubSub} from './data-pub-sub.js';\r\nimport {pubSub} from './data-pub-sub.js';\r\nimport {OneWayConnection} from './one-way-connection.js';\r\nimport {TwoWayConnection} from './two-way-connection.js';\r\nimport {ConnectionTracker} from './connection-tracker.js';\r\n\r\n/**\r\n * DataBinder\r\n *\r\n * This will create a data binder object that can\r\n * create one way and two way data bindings.\r\n * @class\r\n */\r\nexport class DataBinder\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\tthis.version = \"1.0.1\";\r\n\t\tthis.attr = 'bindId';\r\n\r\n\t\t/**\r\n\t\t * @member {array} blockedKeys\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis.blockedKeys = [\r\n\t\t\t20, //caps lock\r\n\t\t\t37, //arrows\r\n\t\t\t38,\r\n\t\t\t39,\r\n\t\t\t40\r\n\t\t];\r\n\r\n\t\tthis.connections = new ConnectionTracker();\r\n\r\n\t\tthis.idCount = 0;\r\n\t\tthis.setup();\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the events.\r\n\t * @protected\r\n\t */\r\n\tsetup()\r\n\t{\r\n\t\tthis.setupEvents();\r\n\t}\r\n\r\n\t/**\r\n\t * This will bind an element to a data property.\r\n\t *\r\n\t * @param {object} element\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @param {(string|function)} [filter]\r\n\t * @return {object} an instance of the databinder.\r\n\t */\r\n\tbind(element, data, prop, filter)\r\n\t{\r\n\t\tlet bindProp = prop,\r\n\t\tbindAttr = null;\r\n\r\n\t\tif(prop.indexOf(':') !== -1)\r\n\t\t{\r\n\t\t\t/* this will setup the custom attr if the prop\r\n\t\t\thas specified one. */\r\n\t\t\tlet parts = prop.split(':');\r\n\t\t\tif(parts.length > 1)\r\n\t\t\t{\r\n\t\t\t\tbindProp = parts[1];\r\n\t\t\t\tbindAttr = parts[0];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/* this will setup the model bind attr to the\r\n\t\telement and assign a bind id attr to support\r\n\t\ttwo way binding */\r\n\t\tlet connection = this.setupConnection(element, data, bindProp, bindAttr, filter);\r\n\r\n\t\t/* we want to get the starting value of the\r\n\t\tdata and set it on our element */\r\n\t\tlet connectionElement = connection.element,\r\n\t\tvalue = data.get(bindProp);\r\n\t\tif(typeof value !== 'undefined')\r\n\t\t{\r\n\t\t\tconnectionElement.set(value);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t/* this will set the element value\r\n\t\t\tas the prop value */\r\n\t\t\tvalue = connectionElement.get();\r\n\t\t\tif(value !== '')\r\n\t\t\t{\r\n\t\t\t\tconnection.data.set(value);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will bind an element to a data property.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} element\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @param {string} customAttr\r\n\t * @param {(string|function)} [filter]\r\n\t * @return {object} The new connection.\r\n\t */\r\n\tsetupConnection(element, data, prop, customAttr, filter)\r\n\t{\r\n\t\tlet id = this.getBindId(element),\r\n\t\tconnection = new TwoWayConnection(),\r\n\r\n\t\t// this will create the data source\r\n\t\tdataSource = connection.addData(data, prop);\r\n\t\t// this will subscribe the data to the element\r\n\t\tdataSource.subscribe(id);\r\n\r\n\t\t/* this will add the data binding\r\n\t\tattr to our element so it will subscribe to\r\n\t\tthe two data changes */\r\n\t\tlet dataId = data.getDataId(),\r\n\t\tmsg = dataId + ':' + prop;\r\n\r\n\t\t// this will create the element source\r\n\t\tlet elementSource = connection.addElement(element, customAttr, filter);\r\n\t\t// this will subscribe the element to the data\r\n\t\telementSource.subscribe(msg);\r\n\r\n\t\tthis.addConnection(id, 'bind', connection);\r\n\r\n\t\treturn connection;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a new connection to the\r\n\t * connection tracker.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} id\r\n\t * @param {string} attr\r\n\t * @param {object} connection\r\n\t */\r\n\taddConnection(id, attr, connection)\r\n\t{\r\n\t\tthis.connections.add(id, attr, connection);\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the bind id.\r\n\t *\r\n\t * @param {object} element\r\n\t */\r\n\tsetBindId(element)\r\n\t{\r\n\t\tlet id = 'db-' + this.idCount++;\r\n\t\telement.dataset[this.attr] = id;\r\n\t\telement[this.attr] = id;\r\n\t\treturn id;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the bind id.\r\n\t *\r\n\t * @param {object} element\r\n\t * @return {string}\r\n\t */\r\n\tgetBindId(element)\r\n\t{\r\n\t\treturn element[this.attr] || this.setBindId(element);\r\n\t}\r\n\r\n\t/**\r\n\t * This will unbind the element.\r\n\t *\r\n\t * @param {object} element\r\n\t * @return {object} an instance of the data binder.\r\n\t */\r\n\tunbind(element)\r\n\t{\r\n\t\tlet id = element[this.attr];\r\n\t\tif(id)\r\n\t\t{\r\n\t\t\tthis.connections.remove(id);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup a watcher for an element.\r\n\t *\r\n\t * @param {object} element\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @param {function} callBack\r\n\t */\r\n\twatch(element, data, prop, callBack)\r\n\t{\r\n\t\tif(!element || typeof element !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet connection = new OneWayConnection();\r\n\r\n\t\t// this will create the one way source\r\n\t\tconst source = connection.addSource(data);\r\n\t\tsource.subscribe(prop, callBack);\r\n\r\n\t\t// this will add the new connection to the connection tracker\r\n\t\tconst id = this.getBindId(element),\r\n\t\tattr = data.getDataId() + ':' + prop;\r\n\t\tthis.addConnection(id, attr, connection);\r\n\r\n\t\tlet value = data.get(prop);\r\n\t\tif(typeof value !== 'undefined')\r\n\t\t{\r\n\t\t\tcallBack(value);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a watcher from an element.\r\n\t *\r\n\t * @param {object} element\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t */\r\n\tunwatch(element, data, prop)\r\n\t{\r\n\t\tif(!element || typeof element !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet id = element[this.attr];\r\n\t\tif(id)\r\n\t\t{\r\n\t\t\tlet attr = data.getDataId() + ':' + prop;\r\n\t\t\tthis.connections.remove(id, attr);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish to the pub sub.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @param {*} value\r\n\t * @param {object} committer\r\n\t * @return {object} an instance of the data binder.\r\n\t */\r\n\tpublish(msg, value, committer)\r\n\t{\r\n\t\tpubSub.publish(msg, value, committer);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if an element is bound.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} element\r\n\t * @return {boolean}\r\n\t */\r\n\tisDataBound(element)\r\n\t{\r\n\t\tif(element)\r\n\t\t{\r\n\t\t\tlet id = element[this.attr];\r\n\t\t\tif(id)\r\n\t\t\t{\r\n\t\t\t\treturn id;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tisBlocked(evt)\r\n\t{\r\n\t\tif(evt.type !== 'keyup')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* this will check to block ctrl, shift or alt +\r\n\t\tbuttons */\r\n\t\treturn (this.blockedKeys.indexOf(evt.keyCode) !== -1);\r\n\t}\r\n\r\n\t/**\r\n\t * This is the callBack for the chnage event.\r\n\t *\r\n\t * @param {object} evt\r\n\t */\r\n\tbindHandler(evt)\r\n\t{\r\n\t\tif(this.isBlocked(evt))\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tlet target = evt.target || evt.srcElement,\r\n\t\tid = this.isDataBound(target);\r\n\t\tif(id)\r\n\t\t{\r\n\t\t\tlet connection = this.connections.get(id, 'bind');\r\n\t\t\tif(connection)\r\n\t\t\t{\r\n\t\t\t\tlet value = connection.element.get();\r\n\t\t\t\t/* this will publish to the ui and to the\r\n\t\t\t\tmodel that subscribes to the element */\r\n\t\t\t\tpubSub.publish(id, value, target);\r\n\t\t\t}\r\n\t\t}\r\n\t\tevt.stopPropagation();\r\n\t}\r\n\r\n\t/**\r\n\t * This wil setup the events.\r\n\t * @protected\r\n\t */\r\n\tsetupEvents()\r\n\t{\r\n\t\tthis.changeHandler = this.bindHandler.bind(this);\r\n\r\n\t\tthis.addEvents();\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the events.\r\n\t */\r\n\taddEvents()\r\n\t{\r\n\t\tbase.on([\"change\", \"keyup\"], document, this.changeHandler, false);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the events.\r\n\t */\r\n\tremoveEvents()\r\n\t{\r\n\t\tbase.off([\"change\", \"keyup\"], document, this.changeHandler, false);\r\n\t}\r\n}\r\n\r\nexport const dataBinder = new DataBinder();", "/**\r\n * This will clone an object.\r\n *\r\n * @param {object} obj\r\n */\r\nexport const cloneObject = (obj) =>\r\n{\r\n return JSON.parse(JSON.stringify(obj));\r\n};\r\n\r\n/**\r\n * This will get the data attribute settings.\r\n *\r\n * @param {object} settings\r\n * @return {object}\r\n */\r\nexport const setupAttrSettings = (settings) =>\r\n{\r\n\tlet attributes = {};\r\n\tif(!settings && typeof settings !== 'object')\r\n\t{\r\n\t\treturn attributes;\r\n\t}\r\n\r\n\tsettings = cloneObject(settings);\r\n\r\n\tfor(var prop in settings)\r\n\t{\r\n\t\tif(settings.hasOwnProperty(prop))\r\n\t\t{\r\n\t\t\tvar setting = settings[prop];\r\n\t\t\tif(typeof setting !== 'function')\r\n\t\t\t{\r\n\t\t\t\tattributes[prop] = setting;\r\n\t\t\t\tdelete settings[prop];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn attributes;\r\n};", "import {DataPubSub} from '../data-binder/data-pub-sub.js';\r\nimport {setupAttrSettings} from './attrs.js';\r\n\r\n/**\r\n * BasicData\r\n *\r\n * This will create a bindable base class. This will\r\n * allow shallow one level deep data to be created\r\n * and watched.\r\n *\r\n * @class\r\n */\r\nexport class BasicData\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} [settings]\r\n\t */\r\n\tconstructor(settings)\r\n\t{\r\n\t\tthis.dirty = false;\r\n\t\tthis.links = {};\r\n\r\n\t\tthis._init();\r\n\t\tthis.setup();\r\n\r\n\t\t/**\r\n\t\t * @member {string} dataTypeId\r\n\t\t */\r\n\t\tthis.dataTypeId = 'bd';\r\n\r\n\t\t/* this will setup the event sub for\r\n\t\tone way binding */\r\n\t\tthis.eventSub = new DataPubSub();\r\n\r\n\t\t/* this will set the construct attributes */\r\n\t\tlet attributes = setupAttrSettings(settings);\r\n\t\tthis.set(attributes);\r\n\t}\r\n\r\n\tsetup()\r\n\t{\r\n\t\tthis.stage = {};\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the number and unique id of the data object.\r\n\t * @protected\r\n\t */\r\n\t_init()\r\n\t{\r\n\t\tconst constructor = this.constructor;\r\n\t\tthis._dataNumber = (typeof constructor._dataNumber === 'undefined')? constructor._dataNumber = 0 : (++constructor._dataNumber);\r\n\r\n\t\tthis._id = 'dt-' + this._dataNumber;\r\n\t\tthis._dataId = this._id + ':';\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the data id.\r\n\t * @return {string}\r\n\t */\r\n\tgetDataId()\r\n\t{\r\n\t\treturn this._id;\r\n\t}\r\n\r\n\t/**\r\n\t * This is a placeholder.\r\n\t */\r\n\tremove()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup a one way bind.\r\n\t *\r\n\t * @param {string} attrName\r\n\t * @param {function} callBack\r\n\t * @return {string} The subscription token.\r\n\t */\r\n\ton(attrName, callBack)\r\n\t{\r\n\t\tlet message = attrName + ':change';\r\n\t\tlet token = this.eventSub.on(message, callBack);\r\n\t\treturn token;\r\n\t}\r\n\r\n\t/**\r\n\t * This will unbind from a one way bind.\r\n\t *\r\n\t * @param {string} attrName\r\n\t * @param {string} token\r\n\t */\r\n\toff(attrName, token)\r\n\t{\r\n\t\tlet message = attrName + ':change';\r\n\t\tthis.eventSub.off(message, token);\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the attribute value.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t * @param {object} committer\r\n\t */\r\n\t_setAttr(attr, val, committer)\r\n\t{\r\n\t\tlet prevValue = this.stage[attr];\r\n\t\tif(val === prevValue)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tthis.stage[attr] = val;\r\n\r\n\t\tcommitter = committer || this;\r\n\r\n\t\t/* this will publish the data to the data binder\r\n\t\tto update any ui elements that are subscribed */\r\n\t\tthis._publish(attr, val, committer, prevValue);\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the data value of an attribute or attributes.\r\n\t *\r\n\t * @param {string} key\r\n\t * @param {*} value\r\n\t *\r\n\t * or\r\n\t *\r\n\t * @param {object} data\r\n\t * @return {object} this\r\n\t */\r\n\tset(...args)\r\n\t{\r\n\t\tif(typeof args[0] === 'object')\r\n\t\t{\r\n\t\t\tlet [items, committer, stopMerge] = args;\r\n\r\n\t\t\tfor(var attr in items)\r\n\t\t\t{\r\n\t\t\t\tif(items.hasOwnProperty(attr))\r\n\t\t\t\t{\r\n\t\t\t\t\tvar item = items[attr];\r\n\t\t\t\t\tif(typeof item === 'function')\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis._setAttr(attr, item, committer, stopMerge);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis._setAttr(...args);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the model data.\r\n\t */\r\n\tgetModelData()\r\n\t{\r\n\t\treturn this.stage;\r\n\t}\r\n\r\n\t/**\r\n\t * This will delete an attribute.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t */\r\n\t_deleteAttr(obj, attr)\r\n\t{\r\n\t\tdelete obj[attr];\r\n\t}\r\n\r\n\t/**\r\n\t * This will toggle a bool attribute.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @return {object} this\r\n\t */\r\n\ttoggle(attr)\r\n\t{\r\n\t\tif(typeof attr === 'undefined')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.set(attr, !this.get(attr));\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will increment an attribute.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @return {object} this\r\n\t */\r\n\tincrement(attr)\r\n\t{\r\n\t\tif(typeof attr === 'undefined')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet val = this.get(attr);\r\n\t\tthis.set(attr, ++val);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will decrement an attribute.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @return {object} this\r\n\t */\r\n\tdecrement(attr)\r\n\t{\r\n\t\tif(typeof attr === 'undefined')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet val = this.get(attr);\r\n\t\tthis.set(attr, --val);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the key value if it is null.\r\n\t *\r\n\t * @param {string} key\r\n\t * @param {mixed} value\r\n\t * @return {object} this\r\n\t */\r\n\tifNull(key, value)\r\n\t{\r\n\t\tif(this.get(key) === null)\r\n\t\t{\r\n\t\t\tthis.set(key, value);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the data local storage key.\r\n\t *\r\n\t * @param {string} key\r\n\t */\r\n\tsetKey(key)\r\n\t{\r\n\t\tthis.key = key;\r\n\t}\r\n\r\n\t/**\r\n\t * This will restore the data from local storage.\r\n\t *\r\n\t * @param {mixed} defaultValue\r\n\t * @returns {bool|void}\r\n\t */\r\n\tresume(defaultValue)\r\n\t{\r\n\t\tlet key = this.key;\r\n\t\tif(!key)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet data;\r\n\t\tlet value = localStorage.getItem(key);\r\n\t\tif(value === null)\r\n\t\t{\r\n\t\t\tif(defaultValue)\r\n\t\t\t{\r\n\t\t\t\tdata = defaultValue;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tdata = JSON.parse(value);\r\n\t\t}\r\n\r\n\t\tthis.set(data);\r\n\t}\r\n\r\n\t/**\r\n\t * This will store the data to the local stoage under\r\n\t * the storage key.\r\n\t *\r\n\t * @returns {bool|void}\r\n\t */\r\n\tstore()\r\n\t{\r\n\t\tlet key = this.key;\r\n\t\tif(!key)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet data = this.get();\r\n\t\tif(!data)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet value = JSON.stringify(data);\r\n\t\tlocalStorage.setItem(key, value);\r\n\t}\r\n\r\n\t/**\r\n\t * This will delete a property value or the model data.\r\n\t *\r\n\t * @param {string} [attrName]\r\n\t * @return {*}\r\n\t */\r\n\tdelete(attrName)\r\n\t{\r\n\t\tif(typeof attrName !== 'undefined')\r\n\t\t{\r\n\t\t\tthis._deleteAttr(this.stage, attrName);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// this will clear the stage and attributes\r\n\t\tthis.setup();\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the value of an attribute.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @return {*}\r\n\t */\r\n\t_getAttr(obj, attr)\r\n\t{\r\n\t\treturn obj[attr];\r\n\t}\r\n\r\n\t/**\r\n\t * This will get a property value or the model data.\r\n\t *\r\n\t * @param {string} [attrName]\r\n\t * @return {*}\r\n\t */\r\n\tget(attrName)\r\n\t{\r\n\t\tif(typeof attrName !== 'undefined')\r\n\t\t{\r\n\t\t\treturn this._getAttr(this.stage, attrName);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn this.getModelData();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will link a data source property to another data source.\r\n\t *\r\n\t * @param {object} data\r\n\t * @param {string|object} attr\r\n\t * @param {string} alias\r\n\t * @return {string|array}\r\n\t */\r\n\tlink(data, attr, alias)\r\n\t{\r\n\t\t// this will get the data source attrs if sending a whole data object\r\n\t\tif(arguments.length === 1 && data.isData === true)\r\n\t\t{\r\n\t\t\tattr = data.get();\r\n\t\t}\r\n\r\n\t\tif(typeof attr !== 'object')\r\n\t\t{\r\n\t\t\treturn this.remoteLink(data, attr, alias);\r\n\t\t}\r\n\r\n\t\tlet tokens = [];\r\n\t\tfor(var prop in attr)\r\n\t\t{\r\n\t\t\tif(attr.hasOwnProperty(prop) === false)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\ttokens.push(this.remoteLink(data, prop));\r\n\t\t}\r\n\t\treturn tokens;\r\n\t}\r\n\r\n\t/**\r\n\t * This will link a remote data source by property.\r\n\t *\r\n\t * @param {object} data\r\n\t * @param {string} attr\r\n\t * @param {string} alias\r\n\t * @return {string}\r\n\t */\r\n\tremoteLink(data, attr, alias)\r\n\t{\r\n\t\tlet childAttr = alias || attr;\r\n\t\tlet value = data.get(attr);\r\n\t\tif(typeof value !== 'undefined' && this.get(attr) !== value)\r\n\t\t{\r\n\t\t\tthis.set(attr, value);\r\n\t\t}\r\n\r\n\t\tlet token = data.on(attr, (propValue, committer) =>\r\n\t\t{\r\n\t\t\tif(committer === this)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tthis.set(childAttr, propValue, data);\r\n\t\t});\r\n\r\n\t\tthis.addLink(token, data);\r\n\r\n\t\tlet remoteToken = this.on(childAttr, (propValue, committer) =>\r\n\t\t{\r\n\t\t\tif(committer === data)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tdata.set(attr, propValue, this);\r\n\t\t});\r\n\r\n\t\tdata.addLink(remoteToken, this);\r\n\t\treturn token;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a link token to the links array.\r\n\t *\r\n\t * @param {string} token\r\n\t * @param {object} data\r\n\t */\r\n\taddLink(token, data)\r\n\t{\r\n\t\tthis.links[token] = data;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a link or all links.\r\n\t *\r\n\t * @param {string} [token]\r\n\t */\r\n\tunlink(token)\r\n\t{\r\n\t\tif(token)\r\n\t\t{\r\n\t\t\tthis.removeLink(token);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet links = this.links;\r\n\t\tif(links.length)\r\n\t\t{\r\n\t\t\tfor(var i = 0, length = links.length; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tthis.removeLink(links[i], false);\r\n\t\t\t}\r\n\t\t\tthis.links = [];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the linked subscription.\r\n\t *\r\n\t * @param {string} token\r\n\t * @param {bool} removeFromLinks\r\n\t */\r\n\tremoveLink(token, removeFromLinks)\r\n\t{\r\n\t\tlet data = this.links[token];\r\n\t\tif(data)\r\n\t\t{\r\n\t\t\tdata.off(token);\r\n\t\t}\r\n\r\n\t\tif(removeFromLinks === false)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tdelete this.links[token];\r\n\t}\r\n}\r\n\r\nBasicData.prototype.isData = true;", "export const DataUtils =\r\n{\r\n /**\r\n * @param {RexExp} deepDataPattern\r\n */\r\n\tdeepDataPattern: /(\\w+)|(?:\\[(\\d)\\))/g,\r\n\r\n\t/**\r\n\t * This will check if a string has deep data.\r\n\t *\r\n\t * @param {string} str\r\n\t * @return {bool}\r\n\t */\r\n\thasDeepData(str)\r\n\t{\r\n\t\treturn (str.indexOf('.') !== -1 || str.indexOf('[') !== -1);\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the deep data segments\r\n\t * @param {string} str\r\n\t * @return {array}\r\n\t */\r\n\tgetSegments(str)\r\n\t{\r\n\t\tvar pattern = this.deepDataPattern;\r\n\t\treturn str.match(pattern);\r\n\t}\r\n};", "import {BasicData} from './basic-data.js';\r\nimport {cloneObject} from './attrs.js';\r\nimport {DataUtils as utils} from './data-utils.js';\r\nimport {dataBinder} from '../data-binder/data-binder.js';\r\n\r\n/**\r\n * Data\r\n *\r\n * This will create a new data object that can be used to\r\n * bind elements to values.\r\n * @class\r\n * @augments BasicData\r\n */\r\nexport class Data extends BasicData\r\n{\r\n\t/**\r\n\t * This will setup the stage and attributes object.\r\n\t */\r\n\tsetup()\r\n\t{\r\n\t\tthis.attributes = {};\r\n\t\tthis.stage = {};\r\n\t}\r\n\r\n\t/**\r\n\t * This will update an attribute value.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t */\r\n\t_updateAttr(obj, attr, val)\r\n\t{\r\n\t\t/* this will check if we need to update\r\n\t\tdeep nested data */\r\n\t\tif(utils.hasDeepData(attr))\r\n\t\t{\r\n\t\t\tlet prop,\r\n\t\t\tprops = utils.getSegments(attr),\r\n\t\t\tlength = props.length,\r\n\t\t\tend = length - 1;\r\n\r\n\t\t\tfor (var i = 0; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tprop = props[i];\r\n\r\n\t\t\t\t/* this will add the value to the last prop */\r\n\t\t\t\tif(i === end)\r\n\t\t\t\t{\r\n\t\t\t\t\tobj[prop] = val;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (obj[prop] === undefined)\r\n\t\t\t\t{\r\n\t\t\t\t\t/* this will check to setup a new object\r\n\t\t\t\t\tor an array if the prop is a number */\r\n\t\t\t\t\tobj[prop] = isNaN(prop)? {} : [];\r\n\t\t\t\t}\r\n\t\t\t\tobj = obj[prop];\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tobj[attr] = val;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the attribute value.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t * @param {object} committer\r\n\t * @param {boolean} stopMerge\r\n\t */\r\n\t_setAttr(attr, val, committer, stopMerge)\r\n\t{\r\n\t\tif(typeof val !== 'object' && val === this.get(attr))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/* this will check to update the model based on who\r\n\t\tupdated it. if the data binder updated the data only\r\n\t\tthe stage data is updated */\r\n\t\tif(!committer && stopMerge !== true)\r\n\t\t{\r\n\t\t\t/* this will update the attribute data because\r\n\t\t\tit was updated outside the data binder */\r\n\t\t\tthis._updateAttr(this.attributes, attr, val);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif(this.dirty === false)\r\n\t\t\t{\r\n\t\t\t\tthis.dirty = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._updateAttr(this.stage, attr, val);\r\n\r\n\t\t/* this will publish the data to the data binder\r\n\t\tto update any ui elements that are subscribed */\r\n\t\tcommitter = committer || this;\r\n\t\tthis._publish(attr, val, committer);\r\n\t}\r\n\r\n\t/**\r\n\t * This will link a data attr object to another data object.\r\n\t *\r\n\t * @param {object} data\r\n\t * @param {string} attr\r\n\t */\r\n\tlinkAttr(data, attr)\r\n\t{\r\n\t\tlet value = data.get(attr);\r\n\t\tif(value)\r\n\t\t{\r\n\t\t\tfor(var prop in value)\r\n\t\t\t{\r\n\t\t\t\tif(value.hasOwnProperty(prop))\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.link(data, attr + '.' + prop, prop);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a new data source by scoping the parent\r\n\t * data attr and linking the two sources.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {object} [constructor]\r\n\t * @returns {object}\r\n\t */\r\n\tscope(attr, constructor)\r\n\t{\r\n\t\tlet value = this.get(attr);\r\n\t\tif(!value)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconstructor = constructor || this.constructor;\r\n\t\tlet data = new constructor(value);\r\n\r\n\t\t/* this will link the new data to the parent attr */\r\n\t\tdata.linkAttr(this, attr);\r\n\t\treturn data;\r\n\t}\r\n\r\n\t/**\r\n\t * This will splice a value from an array and set\r\n\t * the result.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {int} index\r\n\t * @return {object} this\r\n\t */\r\n\tsplice(attr, index)\r\n\t{\r\n\t\tthis.delete(attr + '[' + index + ']');\r\n\t\tthis.refresh(attr);\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a value to an array and set the result.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {mixed} value\r\n\t * @return {object} this\r\n\t */\r\n\tpush(attr, value)\r\n\t{\r\n\t\tlet currentValue = this.get(attr);\r\n\t\tif(Array.isArray(currentValue) === false)\r\n\t\t{\r\n\t\t\tcurrentValue = [];\r\n\t\t}\r\n\r\n\t\tcurrentValue.push(value);\r\n\t\tthis.set(attr, currentValue);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a value to an array and set the result.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {mixed} value\r\n\t * @return {object} this\r\n\t */\r\n\tunshift(attr, value)\r\n\t{\r\n\t\tlet currentValue = this.get(attr);\r\n\t\tif(Array.isArray(currentValue) === false)\r\n\t\t{\r\n\t\t\tcurrentValue = [];\r\n\t\t}\r\n\r\n\t\tcurrentValue.unshift(value);\r\n\t\tthis.set(attr, currentValue);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a value to an array and set the result.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @return {mixed} this\r\n\t */\r\n\tshift(attr)\r\n\t{\r\n\t\tlet currentValue = this.get(attr);\r\n\t\tif(Array.isArray(currentValue) === false)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tlet value = currentValue.shift();\r\n\t\tthis.set(attr, currentValue);\r\n\t\treturn value;\r\n\t}\r\n\r\n\t/**\r\n\t * This will pop the last value from an array and set the result.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @return {mixed}\r\n\t */\r\n\tpop(attr)\r\n\t{\r\n\t\tlet currentValue = this.get(attr);\r\n\t\tif(Array.isArray(currentValue) === false)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tlet value = currentValue.pop();\r\n\t\tthis.set(attr, currentValue);\r\n\t\treturn value;\r\n\t}\r\n\r\n\t/**\r\n\t * This will refresh the value.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @return {object} this\r\n\t */\r\n\trefresh(attr)\r\n\t{\r\n\t\tthis.set(attr, this.get(attr));\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish an update to the data binder.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t * @param {*} committer\r\n\t */\r\n\t_publish(attr, val, committer)\r\n\t{\r\n\t\tthis.publish(attr, val, committer);\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish deep and simple data to the data binder.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t * @param {object} committer\r\n\t */\r\n\tpublishDeep(attr, val, committer)\r\n\t{\r\n\t\tif(utils.hasDeepData(attr))\r\n\t\t{\r\n\t\t\tlet prop,\r\n\t\t\tprops = utils.getSegments(attr),\r\n\t\t\tlength = props.length,\r\n\t\t\tend = length - 1;\r\n\r\n\t\t\t/* the path is a string equivalent of the javascript dot notation path\r\n\t\t\tof the object being published. */\r\n\t\t\tlet path = '',\r\n\t\t\tobj = this.stage;\r\n\t\t\tfor (var i = 0; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tprop = props[i];\r\n\r\n\t\t\t\t/* we need to setup the object to go to the next level\r\n\t\t\t\tof the data object before calling the next property. */\r\n\t\t\t\tobj = obj[prop];\r\n\r\n\t\t\t\tif (i > 0)\r\n\t\t\t\t{\r\n\t\t\t\t\t/* this will add the property to the path based on if its an\r\n\t\t\t\t\tobject property or an array. */\r\n\t\t\t\t\tif(isNaN(prop))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tpath += '.' + prop;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tpath = prop;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar publish;\r\n\t\t\t\tif(i === end)\r\n\t\t\t\t{\r\n\t\t\t\t\t/* if the loop is on the last pass it only needs to publish\r\n\t\t\t\t\tthe val. */\r\n\t\t\t\t\tpublish = val;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\t/* we only want to publish the modified branches. we need to\r\n\t\t\t\t\tget the next property in the props array and create a publish\r\n\t\t\t\t\tobject or array with the next property value. */\r\n\t\t\t\t\tvar nextProp = props[i + 1];\r\n\t\t\t\t\tif(isNaN(nextProp) === false)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tpath += '[' + nextProp + ']';\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar nextAttr = {};\r\n\t\t\t\t\tnextAttr[nextProp] = obj[nextProp];\r\n\t\t\t\t\tpublish = nextAttr;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.publish(path, publish, committer);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.publish(attr, val, committer);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish an update to the data binder.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} pathString\r\n\t * @param {*} obj\r\n\t * @param {*} committer\r\n\t */\r\n\tpublish(pathString, obj, committer)\r\n\t{\r\n\t\tpathString = pathString || \"\";\r\n\t\tthis._publishAttr(pathString, obj, committer);\r\n\r\n\t\tif(obj && typeof obj === 'object')\r\n\t\t{\r\n\t\t\tlet subPath, value;\r\n\t\t\tif(Array.isArray(obj))\r\n\t\t\t{\r\n\t\t\t\tlet length = obj.length;\r\n\t\t\t\tfor(var i = 0; i < length; i++)\r\n\t\t\t\t{\r\n\t\t\t\t\tvalue = obj[i];\r\n\t\t\t\t\tsubPath = pathString + '[' + i + ']';\r\n\t\t\t\t\tthis._checkPublish(subPath, value, committer);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tfor(var prop in obj)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(obj.hasOwnProperty(prop))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tvalue = obj[prop];\r\n\t\t\t\t\t\tsubPath = pathString + '.' + prop;\r\n\t\t\t\t\t\tthis._checkPublish(subPath, value, committer);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t_checkPublish(subPath, val, committer)\r\n\t{\r\n\t\tif(!val || typeof val !== 'object')\r\n\t\t{\r\n\t\t\tthis._publishAttr(subPath, val, committer);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.publish(subPath, val, committer);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish an update on an attribute.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} subPath\r\n\t * @param {*} val\r\n\t * @param {object} committer\r\n\t */\r\n\t_publishAttr(subPath, val, committer)\r\n\t{\r\n\t\t/* save path and value */\r\n\t\tdataBinder.publish(this._dataId + subPath, val, committer);\r\n\r\n\t\tlet message = subPath + ':change';\r\n\t\tthis.eventSub.publish(message, val, committer);\r\n\t}\r\n\r\n\t/**\r\n\t * This will merge the attribute with the stage.\r\n\t * @protected\r\n\t */\r\n\tmergeStage()\r\n\t{\r\n\t\t/* this will clone the stage object to the\r\n\t\tattribute object */\r\n\t\tthis.attributes = cloneObject(this.stage);\r\n\t\tthis.dirty = false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the model data.\r\n\t */\r\n\tgetModelData()\r\n\t{\r\n\t\tthis.mergeStage();\r\n\t\treturn this.attributes;\r\n\t}\r\n\r\n\t/**\r\n\t * This will revert the stage back to the previous attributes.\r\n\t */\r\n\trevert()\r\n\t{\r\n\t\t/* this will reset the stage to the previous\r\n\t\tattributes */\r\n\t\tthis.set(this.attributes);\r\n\t\tthis.dirty = false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will delete an attribute.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @return {*}\r\n\t */\r\n\t_deleteAttr(obj, attr)\r\n\t{\r\n\t\tif(utils.hasDeepData(attr))\r\n\t\t{\r\n\t\t\tlet props = utils.getSegments(attr),\r\n\t\t\tlength = props.length,\r\n\t\t\tend = length - 1;\r\n\r\n\t\t\tfor (var i = 0; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tvar prop = props[i];\r\n\t\t\t\tvar propValue = obj[prop];\r\n\t\t\t\tif (propValue !== undefined)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(i === end)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif(Array.isArray(obj))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tobj.splice(prop, 1);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tdelete obj[prop];\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tobj = propValue;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tdelete obj[attr];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the value of an attribute.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @return {*}\r\n\t */\r\n\t_getAttr(obj, attr)\r\n\t{\r\n\t\tif(utils.hasDeepData(attr))\r\n\t\t{\r\n\t\t\tlet props = utils.getSegments(attr),\r\n\t\t\tlength = props.length,\r\n\t\t\tend = length - 1;\r\n\r\n\t\t\tfor (var i = 0; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tvar prop = props[i];\r\n\t\t\t\tvar propValue = obj[prop];\r\n\t\t\t\tif (propValue !== undefined)\r\n\t\t\t\t{\r\n\t\t\t\t\tobj = propValue;\r\n\r\n\t\t\t\t\tif(i === end)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\treturn obj;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn obj[attr];\r\n\t\t}\r\n\t}\r\n}", "import {BasicData} from './basic-data.js';\r\nimport {dataBinder} from '../data-binder/data-binder.js';\r\n\r\n/**\r\n * SimpleData\r\n *\r\n * This will extend Data to add a simple data object\r\n * that doesn't allow deep nested data.\r\n * @class\r\n * @augments BasicData\r\n */\r\nexport class SimpleData extends BasicData\r\n{\r\n\t/**\r\n\t * This will publish an update to the data binder.\r\n\t *\r\n\t * @override\r\n\t * @protected\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t * @param {*} committer\r\n\t * @param {*} prevValue\r\n\t */\r\n\t_publish(attr, val, committer, prevValue)\r\n\t{\r\n\t\tlet message = attr + ':change';\r\n\t\tthis.eventSub.publish(message, val, committer);\r\n\r\n\t\tcommitter = committer || this;\r\n\r\n\t\tdataBinder.publish(this._dataId + attr, val, committer);\r\n\t}\r\n}", "import {ajax} from '../ajax/ajax.js';\r\nimport {base} from '../../core.js';\r\n\r\n/**\r\n * ModelService\r\n *\r\n * This will create a new model service.\r\n * @class\r\n */\r\nexport class ModelService\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} model\r\n\t */\r\n\tconstructor(model)\r\n\t{\r\n\t\t/**\r\n\t\t * @member {object} model\r\n\t\t */\r\n\t\tthis.model = model;\r\n\r\n\t\t/**\r\n\t\t * @member {string} objectType The return type.\r\n\t\t */\r\n\t\tthis.objectType = this.objectType || 'item';\r\n\r\n\t\tthis.url = '';\r\n\t\tthis.validateCallBack = null;\r\n\t\tthis.init();\r\n\t}\r\n\r\n\tinit()\r\n\t{\r\n\t\tlet model = this.model;\r\n\t\tif(model && model.url)\r\n\t\t{\r\n\t\t\tthis.url = model.url;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if the model is valid.\r\n\t *\r\n\t * @return {boolean}\r\n\t */\r\n\tisValid()\r\n\t{\r\n\t\tlet result = this.validate();\r\n\t\tif(result !== false)\r\n\t\t{\r\n\t\t\tlet callBack = this.validateCallBack;\r\n\t\t\tif(typeof callBack === 'function')\r\n\t\t\t{\r\n\t\t\t\tcallBack(result);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n\r\n\t/**\r\n\t * This should be overriden to validate the model\r\n\t * before submitting.\r\n\t *\r\n\t * @return {boolean}\r\n\t */\r\n\tvalidate()\r\n\t{\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * This can be overriden to add default params\r\n\t * with each request.\r\n\t *\r\n\t * @protected\r\n\t * @return {string}\r\n\t */\r\n\tgetDefaultParams()\r\n\t{\r\n\t\treturn '';\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the request params.\r\n\t *\r\n\t * @protected\r\n\t * @param {(string|object)} params\r\n\t * @return {(string|object)}\r\n\t */\r\n\tsetupParams(params)\r\n\t{\r\n\t\tlet defaults = this.getDefaultParams();\r\n\t\tparams = this.addParams(params, defaults);\r\n\t\treturn params;\r\n\t}\r\n\r\n\t/**\r\n\t * This will convert an object to a string.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} object\r\n\t * @return {string}\r\n\t */\r\n\tobjectToString(object)\r\n\t{\r\n\t\tconst params = [];\r\n\t\tfor (var prop in object)\r\n\t\t{\r\n\t\t\tif(object.hasOwnProperty(prop))\r\n\t\t\t{\r\n\t\t\t\tparams.push(prop + '=' + object[prop]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn params.join('&');\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the params.\r\n\t *\r\n\t * @protected\r\n\t * @param {*} params\r\n\t * @param {*} addingParams\r\n\t * @return {(string|object)}\r\n\t */\r\n\taddParams(params, addingParams)\r\n\t{\r\n\t\tparams = params || {};\r\n\t\tif(typeof params === 'string')\r\n\t\t{\r\n\t\t\tparams = base.parseQueryString(params, false);\r\n\t\t}\r\n\r\n\t\tif(!addingParams)\r\n\t\t{\r\n\t\t\treturn (!this._isFormData(params))? this.objectToString(params) : params;\r\n\t\t}\r\n\r\n\t\tif(typeof addingParams === 'string')\r\n\t\t{\r\n\t\t\taddingParams = base.parseQueryString(addingParams, false);\r\n\t\t}\r\n\r\n\t\tif(this._isFormData(params))\r\n\t\t{\r\n\t\t\tfor(var key in addingParams)\r\n\t\t\t{\r\n\t\t\t\tif(addingParams.hasOwnProperty(key))\r\n\t\t\t\t{\r\n\t\t\t\t\tparams.append(key, addingParams[key]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tparams = Object.assign(params, addingParams);\r\n\t\t\tparams = this.objectToString(params);\r\n\t\t}\r\n\r\n\t\treturn params;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the model by id.\r\n\t *\r\n\t * @param {string} [instanceParams]\r\n\t * @param {function} [callBack]\r\n\t * @return {object}\r\n\t */\r\n\tget(instanceParams, callBack)\r\n\t{\r\n\t\tlet id = this.model.get('id'),\r\n\t\tparams = 'op=get' +\r\n\t\t\t\t\t\t'&id=' + id;\r\n\r\n\t\tlet model = this.model;\r\n\t\treturn this._get('', params, instanceParams, callBack, (response) =>\r\n\t\t{\r\n\t\t\tif(response)\r\n\t\t\t{\r\n\t\t\t\t/* this will update the model with the get request\r\n\t\t\t\tresponse */\r\n\t\t\t\tlet object = this.getObject(response);\r\n\t\t\t\tif(object)\r\n\t\t\t\t{\r\n\t\t\t\t\tmodel.set(object);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the object from the response.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} response\r\n\t * @return {object}\r\n\t */\r\n\tgetObject(response)\r\n\t{\r\n\t\t/* this will update the model with the get request\r\n\t\tresponse */\r\n\t\tlet object = response[this.objectType] || response;\r\n\t\treturn object || false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will return a string with the model data json encoded.\r\n\t *\r\n\t * @protected\r\n\t * @return {string}\r\n\t */\r\n\tsetupObjectData()\r\n\t{\r\n\t\tlet item = this.model.get();\r\n\t\treturn this.objectType + '=' + base.prepareJsonUrl(item);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add or update the model.\r\n\t *\r\n\t * @param {string} [instanceParams]\r\n\t * @param {function} [callBack]\r\n\t * @return {object}\r\n\t */\r\n\tsetup(instanceParams, callBack)\r\n\t{\r\n\t\tif(!this.isValid())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet params = 'op=setup' +\r\n\t\t\t\t\t\t'&' + this.setupObjectData();\r\n\r\n\t\t/* this will add the instance params with the\r\n\t\tmethod params */\r\n\t\tparams = this.addParams(params, instanceParams, instanceParams);\r\n\r\n\t\treturn this._put('', params, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the model.\r\n\t *\r\n\t * @param {string} [instanceParams]\r\n\t * @param {function} [callBack]\r\n\t * @return {object}\r\n\t */\r\n\tadd(instanceParams, callBack)\r\n\t{\r\n\t\tif(!this.isValid())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet params = 'op=add' +\r\n\t\t\t\t\t\t'&' + this.setupObjectData();\r\n\r\n\t\treturn this._post('', params, instanceParams, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the model.\r\n\t *\r\n\t * @param {string} [instanceParams]\r\n\t * @param {function} [callBack]\r\n\t * @return {object}\r\n\t */\r\n\tupdate(instanceParams, callBack)\r\n\t{\r\n\t\tif(!this.isValid())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet params = 'op=update' +\r\n\t\t\t\t\t\t'&' + this.setupObjectData();\r\n\r\n\t\treturn this._patch('', params, instanceParams, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will delete the model.\r\n\t *\r\n\t * @param {string} [instanceParams]\r\n\t * @param {function} [callBack]\r\n\t * @return {object}\r\n\t */\r\n\tdelete(instanceParams, callBack)\r\n\t{\r\n\t\tlet id = this.model.get('id'),\r\n\t\tparams = 'op=delete' +\r\n\t\t\t\t\t\t'&id=' + id;\r\n\r\n\t\treturn this._delete('', params, instanceParams, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will list rows of the model.\r\n\t *\r\n\t * @param {string} [instanceParams]\r\n\t * @param {function} [callBack]\r\n\t * @param {int} start\r\n\t * @param {int} count\r\n\t * @param {string} filter\r\n\t * @return {object}\r\n\t */\r\n\tall(instanceParams, callBack, start, count, filter)\r\n\t{\r\n\t\tfilter = filter || '';\r\n\t\tstart = !isNaN(start)? start : 0;\r\n\t\tcount = !isNaN(count)? count : 50;\r\n\r\n\t\tlet params = 'op=all' +\r\n\t\t\t\t\t\t'&option=' + filter +\r\n\t\t\t\t\t\t'&start=' + start +\r\n\t\t\t\t\t\t'&stop=' + count;\r\n\r\n\t\treturn this._get('', params, instanceParams, callBack);\r\n\t}\r\n\r\n\tgetUrl(url)\r\n\t{\r\n\t\tlet baseUrl = this.url;\r\n\t\tif(!url)\r\n\t\t{\r\n\t\t\treturn baseUrl;\r\n\t\t}\r\n\r\n\t\tif(url[0] === '?')\r\n\t\t{\r\n\t\t\treturn baseUrl + url;\r\n\t\t}\r\n\r\n\t\treturn baseUrl += '/' + url;\r\n\t}\r\n\r\n\t/**\r\n\t * This will make an ajax request.\r\n\t *\r\n\t * @param {string} url\r\n\t * @param {string} method\r\n\t * @param {(string|object)} params\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @param {object}\r\n\t */\r\n\tsetupRequest(url, method, params, callBack, requestCallBack)\r\n\t{\r\n\t\tlet settings = {\r\n\t\t\turl: this.getUrl(url),\r\n\t\t\tmethod,\r\n\t\t\tparams,\r\n\t\t\tcompleted: (response, xhr) =>\r\n\t\t\t{\r\n\t\t\t\tif(typeof requestCallBack === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\trequestCallBack(response);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getResponse(response, callBack, xhr);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tlet overrideHeader = this._isFormData(params);\r\n\t\tif(overrideHeader)\r\n\t\t{\r\n\t\t\tsettings.headers = {};\r\n\t\t}\r\n\r\n\t\treturn ajax(settings);\r\n\t}\r\n\r\n\t_isFormData(data)\r\n\t{\r\n\t\treturn data instanceof FormData;\r\n\t}\r\n\r\n\t/**\r\n\t * This will make an ajax request.\r\n\t *\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @param {object}\r\n\t */\r\n\trequest(params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\treturn this._request('', 'POST', params, instanceParams, callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make a GET request.\r\n\t *\r\n\t * @param {string} url\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @param {object}\r\n\t */\r\n\t_get(url, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\tparams = this.setupParams(params);\r\n\t\tparams = this.addParams(params, instanceParams);\r\n\r\n\t\turl = url || '';\r\n\r\n\t\tif(params)\r\n\t\t{\r\n\t\t\turl += '?' + params;\r\n\t\t}\r\n\r\n\t\treturn this.setupRequest(url, \"GET\", '', callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make a POST request.\r\n\t *\r\n\t * @param {string} url\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @param {object}\r\n\t */\r\n\t_post(url, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\treturn this._request(url, 'POST', params, instanceParams, callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make a PUT request.\r\n\t *\r\n\t * @param {string} url\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @param {object}\r\n\t */\r\n\t_put(url, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\treturn this._request(url, 'PUT', params, instanceParams, callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make a PATCH request.\r\n\t *\r\n\t * @param {string} url\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @param {object}\r\n\t */\r\n\t_patch(url, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\treturn this._request(url, 'PATCH', params, instanceParams, callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make a DELETE request.\r\n\t *\r\n\t * @param {string} url\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @param {object}\r\n\t */\r\n\t_delete(url, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\treturn this._request(url, 'DELETE', params, instanceParams, callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make an ajax request.\r\n\t *\r\n\t * @param {string} url\r\n\t * @param {string} method\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @param {object}\r\n\t */\r\n\t_request(url, method, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\tparams = this.setupParams(params);\r\n\t\tparams = this.addParams(params, instanceParams);\r\n\r\n\t\treturn this.setupRequest(url, method, params, callBack, requestCallBack);\r\n\t}\r\n\r\n\tgetResponse(response, callBack, xhr)\r\n\t{\r\n\t\t/* this will check to return the response\r\n\t\tto the callBack function */\r\n\t\tif(typeof callBack === 'function')\r\n\t\t{\r\n\t\t\tcallBack(response, xhr);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic extend(child)\r\n\t{\r\n\t\tif(!child)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tvar parent = this;\r\n\t\tclass service extends parent\r\n\t\t{\r\n\t\t\tconstructor(model)\r\n\t\t\t{\r\n\t\t\t\tsuper(model);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tObject.assign(service.prototype, child);\r\n\r\n\t\treturn service;\r\n\t}\r\n}", "import {Data} from './deep-data.js';\r\nimport {ModelService} from './model-service.js';\r\nimport {setupAttrSettings} from './attrs.js';\r\n\r\n/**\r\n * This will get the defaults from the settings.\r\n *\r\n * @param {object} settings\r\n * @return {object}\r\n */\r\nconst setupDefaultAttr = (settings) =>\r\n{\r\n\tlet attributes = {};\r\n\tif(!settings || typeof settings !== 'object')\r\n\t{\r\n\t\treturn attributes;\r\n\t}\r\n\r\n\tlet defaults = settings.defaults;\r\n\tif(!defaults)\r\n\t{\r\n\t\treturn attributes;\r\n\t}\r\n\r\n\tfor(var prop in defaults)\r\n\t{\r\n\t\tif(defaults.hasOwnProperty(prop))\r\n\t\t{\r\n\t\t\tvar attr = defaults[prop];\r\n\t\t\tif(typeof attr !== 'function')\r\n\t\t\t{\r\n\t\t\t\tattributes[prop] = attr;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tdelete settings.defaults;\r\n\treturn attributes;\r\n};\r\n\r\n/**\r\n * This will get the xhr settings.\r\n *\r\n * @param {object} settings\r\n * @return {object}\r\n */\r\nconst getXhr = (settings) =>\r\n{\r\n\tif(!settings || typeof settings.xhr !== 'object')\r\n\t{\r\n\t\treturn {};\r\n\t}\r\n\r\n\tlet settingsXhr = settings.xhr,\r\n\txhr = Object.assign({}, settingsXhr);\r\n\tdelete settings.xhr;\r\n\treturn xhr;\r\n};\r\n\r\n/* this will track the number of model types */\r\nlet modelTypeNumber = 0;\r\n\r\n/**\r\n * Model\r\n *\r\n * This will extend Data to add a model that can specify\r\n * a service that connects to a remote source.\r\n */\r\nexport class Model extends Data\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} [settings]\r\n\t */\r\n\tconstructor(settings)\r\n\t{\r\n\t\tsuper(settings);\r\n\t\tthis.initialize();\r\n\t}\r\n\r\n\t/**\r\n\t * This adds a method to call if you want the model\r\n\t * to do something when its initialized.\r\n\t */\r\n\tinitialize()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will extend the model to a child model.\r\n\t *\r\n\t * @param {object} [settings]\r\n\t * @return {class}\r\n\t */\r\n\tstatic extend(settings = {})\r\n\t{\r\n\t\tconst parent = this,\r\n\t\txhr = getXhr(settings),\r\n\t\tservice = this.prototype.service.extend(xhr);\r\n\r\n\t\t/* this will setup the default attribute settings for\r\n\t\tthe model */\r\n\t\tlet defaultAttributes = setupDefaultAttr(settings);\r\n\t\tclass model extends parent\r\n\t\t{\r\n\t\t\tconstructor(instanceSettings)\r\n\t\t\t{\r\n\t\t\t\t/* this will get the instance attributes that\r\n\t\t\t\tthe model will set as attribute data */\r\n\t\t\t\tlet instanceAttr = setupAttrSettings(instanceSettings);\r\n\r\n\t\t\t\t/* we want to extend the default attr with the\r\n\t\t\t\tinstance attr before we set the data and call\r\n\t\t\t\tthe parent constructor */\r\n\t\t\t\tinstanceAttr = Object.assign({}, defaultAttributes, instanceAttr);\r\n\t\t\t\tsuper(instanceAttr);\r\n\r\n\t\t\t\t/* this will setup the model service and\r\n\t\t\t\tpass the new model instance to the service */\r\n\t\t\t\tthis.xhr = new service(this);\r\n\t\t\t}\r\n\r\n\t\t\tdataTypeId = 'bm' + (modelTypeNumber++);\r\n\t\t}\r\n\r\n\t\tObject.assign(model.prototype, settings);\r\n\t\tmodel.prototype.service = service;\r\n\r\n\t\treturn model;\r\n\t}\r\n}\r\n\r\nModel.prototype.service = ModelService;", "\r\n import {SimpleData} from '../data/data.js';\r\n import {state} from './state.js';\r\n\r\n /**\r\n * StateTarget\r\n *\r\n * This will create a state target to track the state\r\n * of an object.\r\n * @class\r\n * @augments SimpleData\r\n */\r\nexport class StateTarget extends SimpleData\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {string} id\r\n\t */\r\n\tconstructor(id)\r\n\t{\r\n\t\tsuper();\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\t/**\r\n\t * This will restore a state to the controller.\r\n\t */\r\n\trestore()\r\n\t{\r\n\t\tstate.restore(this.id, this);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the target from the controller.\r\n\t */\r\n\tremove()\r\n\t{\r\n\t\tstate.remove(this.id);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an action to the target.\r\n\t *\r\n\t * @param {string} action\r\n\t * @param {*} state\r\n\t */\r\n\taddAction(action, state)\r\n\t{\r\n\t\tif(typeof state !== 'undefined')\r\n\t\t{\r\n\t\t\tthis.set(action, state);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the state of an action.\r\n\t *\r\n\t * @param {string} action\r\n\t * @return {*}\r\n\t */\r\n\tgetState(action)\r\n\t{\r\n\t\treturn this.get(action);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an action or a callBack\r\n\t * from an action. if no token is passed the\r\n\t * whole action is removed.\r\n\t *\r\n\t * @param {string} action\r\n\t * @param {string} [token]\r\n\t */\r\n\tremoveAction(action, token)\r\n\t{\r\n\t\t/* if we have a token then the token will be\r\n\t\tthe only item removed */\r\n\t\tif(token)\r\n\t\t{\r\n\t\t\tthis.off(action, token);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tlet actions = this.stage;\r\n\t\t\tif(typeof actions[action] !== 'undefined')\r\n\t\t\t{\r\n\t\t\t\tdelete actions[action];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}", "\r\n import {StateTarget} from './state-target.js';\r\n\r\n /**\r\n * StateController\r\n *\r\n * This will create a state controller that can\r\n * add and remove targets, actions, and action\r\n * subscriber callBack functions.\r\n *\r\n * @class\r\n */\r\nclass StateController\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\tthis.targets = {};\r\n\t}\r\n\r\n\t/**\r\n\t * This will restore a state target.\r\n\t *\r\n\t * @param {string} id\r\n\t * @param {object} target\r\n\t */\r\n\trestore(id, target)\r\n\t{\r\n\t\tthis.targets[id] = target;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the state target.\r\n\t *\r\n\t * @param {string} id\r\n\t * @return {object}\r\n\t */\r\n\tgetTarget(id)\r\n\t{\r\n\t\tlet targets = this.targets;\r\n\t\treturn (targets[id] || (targets[id] = new StateTarget(id)));\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the state of an action.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t */\r\n\tgetActionState(targetId, action)\r\n\t{\r\n\t\tconst target = this.getTarget(targetId);\r\n\t\treturn target.get(action);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a new target.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} [action]\r\n\t * @param {*} [state] the primary action state\r\n\t * @return {object}\r\n\t */\r\n\tadd(targetId, action, state)\r\n\t{\r\n\t\tconst target = this.getTarget(targetId);\r\n\t\tif(action)\r\n\t\t{\r\n\t\t\ttarget.addAction(action, state);\r\n\t\t}\r\n\t\treturn target;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a new action to a target.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t * @param {string} [state]\r\n\t * @return {object}\r\n\t */\r\n\taddAction(targetId, action, state)\r\n\t{\r\n\t\treturn this.add(targetId, action, state);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the action from a target.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t * @param {string} [token]\r\n\t */\r\n\tremoveAction(targetId, action, token)\r\n\t{\r\n\t\tthis.off(targetId, action, token);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a new subscriber to the action.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t * @param {function} callBack\r\n\t * @return {string}\r\n\t */\r\n\ton(targetId, action, callBack)\r\n\t{\r\n\t\tlet target = this.getTarget(targetId);\r\n\t\tif(action)\r\n\t\t{\r\n\t\t\treturn target.on(action, callBack);\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a subscriber from an action.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t * @param {string} token\r\n\t */\r\n\toff(targetId, action, token)\r\n\t{\r\n\t\tthis.remove(targetId, action, token);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a target or action or callBack.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} [action]\r\n\t * @param {string} [token]\r\n\t */\r\n\tremove(targetId, action, token)\r\n\t{\r\n\t\tlet targets = this.targets,\r\n\t\ttarget = targets[targetId];\r\n\t\tif(!target)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(action)\r\n\t\t{\r\n\t\t\ttarget.off(action, token);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tdelete targets[targetId];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the action state.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t * @param {*} state\r\n\t */\r\n\tset(targetId, action, state)\r\n\t{\r\n\t\tvar target = this.getTarget(targetId);\r\n\t\ttarget.set(action, state);\r\n\t}\r\n}\r\n\r\nexport const state = new StateController();", "/**\r\n * LayoutParser\r\n *\r\n * This will parse JSON layouts.\r\n * @class\r\n */\r\nexport class LayoutParser\r\n{\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {array} _reserved\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis._reserved = [\r\n\t\t\t'tag',\r\n\t\t\t'bind',\r\n\t\t\t'onCreated',\r\n\t\t\t'route',\r\n\t\t\t'switch',\r\n\t\t\t'useParent',\r\n\t\t\t'useState',\r\n\t\t\t'useData',\r\n\t\t\t'addState',\r\n\t\t\t'map',\r\n\t\t\t'for',\r\n\t\t\t'html',\r\n\t\t\t'onSet',\r\n\t\t\t'onState',\r\n\t\t\t'watch',\r\n\t\t\t'context',\r\n\t\t\t'useContext',\r\n\t\t\t'addContext',\r\n\t\t\t'role',\r\n\t\t\t'aria',\r\n\t\t\t'cache'\r\n\t\t];\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the tag name of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @return {string}\r\n\t */\r\n\tgetElementTag(obj)\r\n\t{\r\n\t\tlet type = 'div',\r\n\t\tnode = obj.tag || obj.t;\r\n\t\tif (typeof node !== 'undefined')\r\n\t\t{\r\n\t\t\ttype = obj.tag = node;\r\n\t\t}\r\n\r\n\t\treturn type;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the element children.\r\n\t *\r\n\t * @param {object} obj\r\n\t */\r\n\tsetupChildren(obj)\r\n\t{\r\n\t\tif(obj.nest)\r\n\t\t{\r\n\t\t\tobj.children = obj.nest;\r\n\t\t\tobj.nest = null;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will parse a layout element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @return {object}\r\n\t */\r\n\tparseElement(obj)\r\n\t{\r\n\t\tlet attr = {},\r\n\t\tchildren = [];\r\n\r\n\t\tlet tag = this.getElementTag(obj);\r\n\t\tif(tag === 'button')\r\n\t\t{\r\n\t\t\tattr.type = attr.type || 'button';\r\n\t\t}\r\n\r\n\t\tthis.setupChildren(obj);\r\n\t\tconst reserved = this._reserved;\r\n\r\n\t\tfor (var key in obj)\r\n\t\t{\r\n\t\t\tif (obj.hasOwnProperty(key))\r\n\t\t\t{\r\n\t\t\t\tvar value = obj[key];\r\n\t\t\t\tif (value === undefined || value === null)\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (reserved.indexOf(key) !== -1)\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/* we need to filter the children from the attr\r\n\t\t\t\tsettings. the children need to keep their order. */\r\n\t\t\t\tif (typeof value !== 'object')\r\n\t\t\t\t{\r\n\t\t\t\t\tattr[key] = value;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tif (key === 'children')\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t//Array.prototype.push.apply(children, value);\r\n\t\t\t\t\t\tchildren = children.concat(value);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tchildren.push(value);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\ttag,\r\n\t\t\tattr,\r\n\t\t\tchildren\r\n\t\t};\r\n\t}\r\n}", "import {base} from '../../core.js';\r\nimport {dataBinder} from '../data-binder/data-binder.js';\r\n\r\nconst dataTracker = base.dataTracker;\r\n\r\nconst NORMALIZED_NAMES =\r\n{\r\n\tclass: 'className',\r\n\ttext: 'textContent',\r\n\tfor: 'htmlFor',\r\n\treadonly: 'readOnly',\r\n\tmaxlength: 'maxLength',\r\n\tcellspacing: 'cellSpacing',\r\n\trowspan: 'rowSpan',\r\n\tcolspan: 'colSpan',\r\n\ttabindex: 'tabIndex',\r\n\tcelpadding: 'cellPadding',\r\n\tuseMap: 'useMap',\r\n\tframeborder: 'frameBorder',\r\n\tcontenteditable: 'contentEditable'\r\n};\r\n\r\n/**\r\n * This will get the javascript property name.\r\n *\r\n * @param {string} prop\r\n * @return {string}\r\n */\r\nexport const normalizeAttr = (prop) =>\r\n{\r\n\treturn NORMALIZED_NAMES[prop] || prop;\r\n};\r\n\r\n/**\r\n * This will remove on from a property.\r\n *\r\n * @param {string} prop\r\n * @return {string}\r\n */\r\nexport const removeEventPrefix = (prop) =>\r\n{\r\n\tif(typeof prop === 'string' && prop.substring(0, 2) === 'on')\r\n\t{\r\n\t\treturn prop.substring(2);\r\n\t}\r\n\treturn prop;\r\n};\r\n\r\n/**\r\n * htmlBuilder\r\n *\r\n * This will create an html builder object that can create\r\n * and remove dom elements.\r\n * @class\r\n */\r\nexport class htmlBuilder\r\n{\r\n\t/**\r\n\t * This will create a new element.\r\n\t *\r\n\t * @param {string} nodeName The node name.\r\n\t * @param {object} attrObject The node attributes.\r\n\t * @param {object} container The node container.\r\n\t * @param {boolean} [prepend=false] Add to the begining of the container.\r\n\t * @return {object} The new element.\r\n\t */\r\n\tcreate(nodeName, attrObject, container, prepend)\r\n\t{\r\n\t\tlet obj = document.createElement(nodeName);\r\n\t\tthis._addElementAttrs(obj, attrObject);\r\n\r\n\t\t/* we want to check if the new element should be\r\n\t\tadded to the begining or end */\r\n\t\tif(prepend === true)\r\n\t\t{\r\n\t\t\tthis.prepend(container, obj);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.append(container, obj);\r\n\t\t}\r\n\t\treturn obj;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the element attributes.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} obj\r\n\t * @param {object} attrObject\r\n\t */\r\n\t_addElementAttrs(obj, attrObject)\r\n\t{\r\n\t\t/* we want to check if we have attrributes to add */\r\n\t\tif(!attrObject || typeof attrObject !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we need to add the type if set to stop ie\r\n\t\tfrom removing the value if set after the value is\r\n\t\tadded */\r\n\t\tlet type = attrObject.type;\r\n\t\tif(typeof type !== 'undefined')\r\n\t\t{\r\n\t\t\tbase.setAttr(obj, 'type', type);\r\n\t\t}\r\n\r\n\t\t/* we want to add each attr to the obj */\r\n\t\tfor(var prop in attrObject)\r\n\t\t{\r\n\t\t\t/* we have already added the type so we need to\r\n\t\t\tskip if the prop is type */\r\n\t\t\tif(attrObject.hasOwnProperty(prop) === false || prop === 'type')\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tvar attrPropValue = attrObject[prop];\r\n\r\n\t\t\t/* we want to check to add the attr settings\r\n\t\t\t by property name */\r\n\t\t\tif(prop === 'innerHTML')\r\n\t\t\t{\r\n\t\t\t\tobj.innerHTML = attrPropValue;\r\n\t\t\t}\r\n\t\t\telse if(prop.substring(4, 1) === '-')\r\n\t\t\t{\r\n\t\t\t\t// this will handle data and aria attributes\r\n\t\t\t\tbase.setAttr(obj, prop, attrPropValue);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tthis.addAttr(obj, prop, attrPropValue);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will add html to an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} content\r\n\t */\r\n\taddHtml(obj, content)\r\n\t{\r\n\t\tif(typeof content !== 'undefined' && content !== '')\r\n\t\t{\r\n\t\t\t/* we need to check if we are adding inner\r\n\t\t\thtml content or just a string */\r\n\t\t\tlet pattern = /(?:<[a-z][\\s\\S]*>)/i;\r\n\t\t\tif(pattern.test(content))\r\n\t\t\t{\r\n\t\t\t\t/* html */\r\n\t\t\t\tobj.innerHTML = content;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\t/* string */\r\n\t\t\t\tobj.textContent = content;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an element attribute.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {object} attr\r\n\t * @param {string} value\r\n\t */\r\n\taddAttr(obj, attr, value)\r\n\t{\r\n\t\tif(value === '' || !attr)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to check to add a value or an event listener */\r\n\t\tlet type = typeof value;\r\n\t\tif(type === 'function')\r\n\t\t{\r\n\t\t\t/* this will add the event using the base events\r\n\t\t\tso the event is tracked */\r\n\t\t\tattr = removeEventPrefix(attr);\r\n\t\t\tbase.addListener(attr, obj, value);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tlet attrName = normalizeAttr(attr);\r\n\t\t\tobj[attrName] = value;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a doc fragment.\r\n\t *\r\n\t * @return {object}\r\n\t */\r\n\tcreateDocFragment()\r\n\t{\r\n\t\treturn document.createDocumentFragment();\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a text node.\r\n\t *\r\n\t * @param {string} text\r\n\t * @param {object} container\r\n\t * @return {object}\r\n\t */\r\n\tcreateTextNode(text, container)\r\n\t{\r\n\t\tlet obj = document.createTextNode(text);\r\n\r\n\t\tif(container)\r\n\t\t{\r\n\t\t\tthis.append(container, obj);\r\n\t\t}\r\n\t\treturn obj;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a text node.\r\n\t *\r\n\t * @param {string} text\r\n\t * @param {object} container\r\n\t * @return {object}\r\n\t */\r\n\tcreateCommentNode(text, container)\r\n\t{\r\n\t\tlet obj = document.createComment(text);\r\n\r\n\t\tif(container)\r\n\t\t{\r\n\t\t\tthis.append(container, obj);\r\n\t\t}\r\n\t\treturn obj;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create the options on a select.\r\n\t *\r\n\t * @param {object} selectElem\r\n\t * @param {array} optionArray\r\n\t * @param {string} [defaultValue]\r\n\t */\r\n\tsetupSelectOptions(selectElem, optionArray, defaultValue)\r\n\t{\r\n\t\tif(!selectElem || typeof selectElem !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(!optionArray || !optionArray.length)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* create each option then add it to the select */\r\n\t\tfor(var n = 0, maxLength = optionArray.length; n < maxLength; n++)\r\n\t\t{\r\n\t\t\tvar settings = optionArray[n];\r\n\t\t\tvar option = selectElem.options[n] = new Option(settings.label, settings.value);\r\n\r\n\t\t\t/* we can select an option if a default value\r\n\t\t\thas been sumbitted */\r\n\t\t\tif(defaultValue !== null && option.value == defaultValue)\r\n\t\t\t{\r\n\t\t\t\toption.selected = true;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an elements data.\r\n\t *\r\n\t * @param {object} ele\r\n\t */\r\n\tremoveElementData(ele)\r\n\t{\r\n\t\t/* we want to do a recursive remove child\r\n\t\tremoval */\r\n\t\tlet children = ele.childNodes;\r\n\t\tif(children)\r\n\t\t{\r\n\t\t\tlet length = children.length - 1;\r\n\t\t\tfor(var i = length; i >= 0; i--)\r\n\t\t\t{\r\n\t\t\t\tvar child = children[i];\r\n\t\t\t\tif(child)\r\n\t\t\t\t{\r\n\t\t\t\t\t/* this will remove the child element data\r\n\t\t\t\t\tbefore the parent is removed */\r\n\t\t\t\t\tthis.removeElementData(child);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tdataTracker.remove(ele);\r\n\r\n\t\tlet bound = ele.bindId;\r\n\t\tif(bound)\r\n\t\t{\r\n\t\t\t/* this will check to remove any data bindings\r\n\t\t\tto the element */\r\n\t\t\tdataBinder.unbind(ele);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an element and its data.\r\n\t *\r\n\t * @param {object} obj\r\n\t */\r\n\tremoveElement(obj)\r\n\t{\r\n\t\tlet container;\r\n\r\n\t\tif(!obj || !(container = obj.parentNode))\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/* this will remove all element data and binding\r\n\t\tand remove from the parent container */\r\n\t\tthis.removeElementData(obj);\r\n\t\tcontainer.removeChild(obj);\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an element.\r\n\t *\r\n\t * @param {object} child\r\n\t */\r\n\tremoveChild(child)\r\n\t{\r\n\t\tthis.removeElement(child);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove all elements from the container.\r\n\t *\r\n\t * @param {object} container\r\n\t */\r\n\tremoveAll(container)\r\n\t{\r\n\t\tif(typeof container === 'object')\r\n\t\t{\r\n\t\t\tlet children = container.childNodes;\r\n\t\t\tfor(var child in children)\r\n\t\t\t{\r\n\t\t\t\tif(children.hasOwnProperty(child))\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.removeElementData(children[child]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcontainer.innerHTML = '';\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This change the parent of an element.\r\n\t *\r\n\t * @param {object} child\r\n\t * @param {object} newParent\r\n\t */\r\n\tchangeParent(child, newParent)\r\n\t{\r\n\t\tnewParent.appendChild(child);\r\n\t}\r\n\r\n\t/**\r\n\t * This will append a child element.\r\n\t *\r\n\t * @param {object} parent\r\n\t * @param {object} child\r\n\t */\r\n\tappend(parent, child)\r\n\t{\r\n\t\tswitch(typeof parent)\r\n\t\t{\r\n\t\t\tcase \"object\":\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"undefined\":\r\n\t\t\t\tparent = document.body;\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tparent.appendChild(child);\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepend a child element.\r\n\t *\r\n\t * @param {object} parent\r\n\t * @param {object} child\r\n\t * @param {object} [optionalNode]\r\n\t */\r\n\tprepend(parent, child, optionalNode)\r\n\t{\r\n\t\tswitch(typeof parent)\r\n\t\t{\r\n\t\t\tcase \"object\":\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"undefined\":\r\n\t\t\t\tparent = document.body;\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tvar node = optionalNode || parent.firstChild;\r\n\t\tparent.insertBefore(child, node);\r\n\t}\r\n\r\n\t/**\r\n\t * This will clone an element.\r\n\t *\r\n\t * @param {object} node\r\n\t * @param {boolean} deepCopy\r\n\t * @return {object}\r\n\t */\r\n\tclone(node, deepCopy)\r\n\t{\r\n\t\tif(!node || typeof node !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tdeepCopy = deepCopy || false;\r\n\t\treturn node.cloneNode(deepCopy);\r\n\t}\r\n}", "import {base} from '../../core.js';\r\nimport {dataBinder} from '../data-binder/data-binder.js';\r\n\r\nconst WATCHER_PATTERN = /(\\[\\[(.*?)\\]\\])/g;\r\n\r\n/**\r\n * WatcherHelper\r\n *\r\n * This helper creates watcher callBacks, parses watcher strings\r\n * and sets up watchers.\r\n */\r\nexport const WatcherHelper =\r\n{\r\n\t/**\r\n\t * This will get the property names to be watched.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} string\r\n\t * @return {(array|null)}\r\n\t */\r\n\t_getWatcherProps(string)\r\n\t{\r\n\t\tlet pattern = /\\[\\[(.*?)\\]\\]/g,\r\n\t\tmatches = string.match(pattern);\r\n\t\tif(matches)\r\n\t\t{\r\n\t\t\tpattern = /(\\[\\[|\\]\\])/g;\r\n\t\t\tfor(var i = 0, length = matches.length; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tmatches[i] = matches[i].replace(pattern, '');\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn matches;\r\n\t},\r\n\r\n\t/**\r\n\t * This will update an element attribute.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {string} attr\r\n\t * @param {string} value\r\n\t */\r\n\tupdateAttr(ele, attr, value)\r\n\t{\r\n\t\tif(attr === 'text' || attr === 'textContent')\r\n\t\t{\r\n\t\t\tele.textContent = value;\r\n\t\t}\r\n\t\telse if(attr === 'innerHTML')\r\n\t\t{\r\n\t\t\tele.innerHTML = value;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif(attr.substring(4, 1) === '-')\r\n\t\t\t{\r\n\t\t\t\tbase.setAttr(ele, attr, value);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tele[attr] = value;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * This will get a watcher callBack.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {(string|array)} data\r\n\t * @param {string} string\r\n\t * @param {string} attr\r\n\t * @param {boolean} isArray\r\n\t * @return {function}\r\n\t */\r\n\t_getWatcherCallBack(ele, data, string, attr, isArray)\r\n\t{\r\n\t\treturn () =>\r\n\t\t{\r\n\t\t\tlet count = 0,\r\n\t\t\tvalue = string.replace(WATCHER_PATTERN, function()\r\n\t\t\t{\r\n\t\t\t\tlet watcherData = (isArray)? data[count] : data;\r\n\t\t\t\tcount++;\r\n\r\n\t\t\t\tlet result = watcherData.get(arguments[2]);\r\n\t\t\t\treturn (typeof result !== 'undefined'? result : '');\r\n\t\t\t});\r\n\t\t\tthis.updateAttr(ele, attr, value);\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the parent data.\r\n\t *\r\n\t * @param {object} parent\r\n\t * @returns {object|null}\r\n\t */\r\n\tgetParentData(parent)\r\n\t{\r\n\t\tif(parent.data)\r\n\t\t{\r\n\t\t\treturn parent.data;\r\n\t\t}\r\n\r\n\t\tif(parent.context && parent.context.data)\r\n\t\t{\r\n\t\t\treturn parent.context.data;\r\n\t\t}\r\n\r\n\t\tif(parent.state)\r\n\t\t{\r\n\t\t\treturn parent.state;\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t},\r\n\r\n\t/**\r\n\t * This will get a watcher value.\r\n\t *\r\n\t * @private\r\n\t * @param {(string|object)} settings\r\n\t * @param {object} parent\r\n\t * @return {array}\r\n\t */\r\n\tgetValue(settings, parent)\r\n\t{\r\n\t\tif(typeof settings === 'string')\r\n\t\t{\r\n\t\t\tsettings =\r\n\t\t\t{\r\n\t\t\t\tvalue: settings\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tlet value = settings.value;\r\n\t\tif(Array.isArray(value) === false)\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * This will setup an array watcher based on a string.\r\n\t\t\t */\r\n\t\t\tvalue = [value, this.getParentData(parent)];\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * This will check to add the default data.\r\n\t\t\t */\r\n\t\t\tif(value.length < 2)\r\n\t\t\t{\r\n\t\t\t\tvalue.push(this.getParentData(parent));\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn value;\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the prop values.\r\n\t *\r\n\t * @param {object} data\r\n\t * @param {string} string\r\n\t * @param {bool} isArray\r\n\t * @return {array}\r\n\t */\r\n\tgetPropValues(data, props, isArray)\r\n\t{\r\n\t\tlet values = [];\r\n\r\n\t\tfor(var i = 0, length = props.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar watcherData = (isArray)? data[i] : data;\r\n\t\t\tvar value = watcherData.get(props[i]);\r\n\t\t\tvalue = (typeof value !== 'undefined'? value : '');\r\n\t\t\tvalues.push(value);\r\n\t\t}\r\n\r\n\t\treturn values;\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the watcher callBack.\r\n\t *\r\n\t * @param {object} settings\r\n\t * @param {object} ele\r\n\t * @param {object} data\r\n\t * @param {string} string\r\n\t * @param {bool} isDataArray\r\n\t * @return {function}\r\n\t */\r\n\tgetCallBack(settings, ele, data, string, isDataArray)\r\n\t{\r\n\t\tlet callBack,\r\n\t\toverrideCallBack = settings.callBack;\r\n\t\tif(typeof overrideCallBack === 'function')\r\n\t\t{\r\n\t\t\tlet props = string.match(WATCHER_PATTERN);\r\n\t\t\tlet isMultiProp = (props && props.length > 1);\r\n\t\t\tcallBack = (value, committer) =>\r\n\t\t\t{\r\n\t\t\t\tvalue = (isMultiProp !== true)? value : this.getPropValues(data, props, isDataArray);\r\n\t\t\t\toverrideCallBack(ele, value, committer);\r\n\t\t\t};\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tlet attr = settings.attr || 'textContent';\r\n\t\t\tcallBack = this._getWatcherCallBack(ele, data, string, attr, isDataArray);\r\n\t\t}\r\n\t\treturn callBack;\r\n\t},\r\n\r\n\t/**\r\n\t * This will add a data watcher.\r\n\t *\r\n\t * @private\r\n\t * @param {object} ele\r\n\t * @param {(string|object)} settings\r\n\t * @param {object} parent\r\n\t */\r\n\taddDataWatcher(ele, settings, parent)\r\n\t{\r\n\t\tlet value = this.getValue(settings, parent),\r\n\t\tdata = value[1];\r\n\t\tif(!data)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet string = value[0],\r\n\t\tisDataArray = Array.isArray(data);\r\n\r\n\t\tlet callBack = this.getCallBack(settings, ele, data, string, isDataArray),\r\n\t\tprops = this._getWatcherProps(string);\r\n\t\tfor(var i = 0, length = props.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar watcherData = (isDataArray)? data[i] : data;\r\n\t\t\tthis.addWatcher(ele, watcherData, props[i], callBack);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * This will setup a data watcher.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {(string|object)} settings\r\n\t * @param {object} parent\r\n\t */\r\n\tsetup(ele, settings, parent)\r\n\t{\r\n\t\tif(!settings)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif(Array.isArray(settings))\r\n\t\t{\r\n\t\t\tsettings = {\r\n\t\t\t\tattr: settings[2],\r\n\t\t\t\tvalue: [settings[0], settings[1]]\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tthis.addDataWatcher(ele, settings, parent);\r\n\t},\r\n\r\n\t/**\r\n\t * This will add a watcher.\r\n\t *\r\n\t * @private\r\n\t * @param {object} ele\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @param {function} callBack\r\n\t */\r\n\taddWatcher(ele, data, prop, callBack)\r\n\t{\r\n\t\tdataBinder.watch(ele, data, prop, callBack);\r\n\t}\r\n};", "import {Unit} from './unit.js';\r\nimport {Component} from './component.js';\r\n\r\n/**\r\n * This will store the jot shorthand method alaises.\r\n */\r\nconst JOT_SHORTHAND_METHODS =\r\n{\r\n created: 'onCreated',\r\n state: 'setupStates',\r\n events: 'setupEevents',\r\n before: 'beforeSetup',\r\n render: 'render',\r\n after: 'afterSetup',\r\n destroy: 'beforeDestroy'\r\n};\r\n\r\n/**\r\n * This will get the jot method by value. If the method is an\r\n * object, it will be nested in a function.\r\n *\r\n * @param {object|function} value\r\n * @returns {function}\r\n */\r\nconst getJotShorthandMethod = (value) =>\r\n{\r\n const valueType = (typeof value);\r\n return (valueType === 'function')? value : function()\r\n {\r\n return value;\r\n };\r\n};\r\n\r\n/**\r\n * This will create a jot component object that will be used\r\n * to create the jot component.\r\n *\r\n * @param {object} settings\r\n * @returns {object}\r\n */\r\nconst JotComponent = (settings) =>\r\n{\r\n const component = {};\r\n if(!settings)\r\n {\r\n return component;\r\n }\r\n\r\n for(var prop in settings)\r\n {\r\n if(settings.hasOwnProperty(prop) === false)\r\n {\r\n continue;\r\n }\r\n\r\n let value = settings[prop];\r\n let alias = JOT_SHORTHAND_METHODS[prop];\r\n if(alias)\r\n {\r\n component[alias] = getJotShorthandMethod(value);\r\n continue;\r\n }\r\n\r\n component[prop] = value;\r\n }\r\n\r\n return component;\r\n};\r\n\r\n/**\r\n * This will create a component class.\r\n *\r\n * @param {object} settings\r\n * @returns {class}\r\n */\r\nconst createComponentClass = (settings) =>\r\n{\r\n class Child extends Component\r\n {\r\n\r\n }\r\n\r\n Object.assign(Child.prototype, settings);\r\n return Child;\r\n};\r\n\r\n/**\r\n * This will create a unit class.\r\n *\r\n * @param {object} settings\r\n * @returns {class}\r\n */\r\n const createUnitClass = (settings) =>\r\n {\r\n class Child extends Unit\r\n {\r\n\r\n }\r\n\r\n Object.assign(Child.prototype, settings);\r\n return Child;\r\n };\r\n\r\n/**\r\n * This will create a shorthand component.\r\n *\r\n * @param {object|function} layout\r\n * @returns {function}\r\n */\r\nexport const Jot = function(layout)\r\n{\r\n if(!layout)\r\n {\r\n return null;\r\n }\r\n\r\n let settings;\r\n switch(typeof layout)\r\n {\r\n case 'object':\r\n if(layout.render)\r\n {\r\n settings = JotComponent(layout);\r\n return createComponentClass(settings);\r\n }\r\n\r\n settings = {\r\n render: function()\r\n {\r\n return layout;\r\n }\r\n };\r\n\r\n // this will create a stateless and dataless unit\r\n return createUnitClass(settings);\r\n case 'function':\r\n settings = {\r\n render: layout\r\n };\r\n\r\n // this will create a stateless and dataless unit\r\n return createUnitClass(settings);\r\n }\r\n};", "import {base} from '../../core.js';\r\nimport {LayoutParser} from './layout-parser.js';\r\nimport {dataBinder} from '../data-binder/data-binder.js';\r\nimport {htmlBuilder, normalizeAttr, removeEventPrefix} from '../html-builder/html-builder.js';\r\nimport {WatcherHelper} from './watcher-helper.js';\r\nimport {Jot} from \"../component/jot.js\";\r\n\r\n/**\r\n * This will create a watch element.\r\n *\r\n * @param {object} data\r\n * @param {string} prop\r\n * @returns {function}\r\n */\r\nexport const Watch = function(data, prop)\r\n{\r\n\treturn function(callBack)\r\n\t{\r\n\t\treturn {\r\n\t\t\tonSet: [data, prop, (ele, value) =>\r\n\t\t\t{\r\n\t\t\t\treturn callBack(value);\r\n\t\t\t}]\r\n\t\t};\r\n\t};\r\n};\r\n\r\n/**\r\n * This will track the context from an atom to remove\r\n * it when the element is removed.\r\n */\r\nbase.dataTracker.addType('context', function(data)\r\n{\r\n\tif(!data)\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\tdata.parent.removeContextBranch(data.branch);\r\n});\r\n\r\nconst parser = new LayoutParser();\r\n\r\n/**\r\n * LayoutBuilder\r\n *\r\n * This will build JSON layouts.\r\n *\r\n * @class\r\n * @augments htmlBuilder\r\n */\r\nexport class LayoutBuilder extends htmlBuilder\r\n{\r\n\t/**\r\n\t * This will create a new element.\r\n\t *\r\n\t * @override\r\n\t * @param {string} nodeName The node name.\r\n\t * @param {object} attrObject The node attributes.\r\n\t * @param {object} container The node container.\r\n\t * @param {object} parent\r\n\t * @return {object} The new element.\r\n\t */\r\n\tcreate(nodeName, attrObject, container, parent)\r\n\t{\r\n\t\tlet obj = document.createElement(nodeName);\r\n\t\tthis._addElementAttrs(obj, attrObject, parent);\r\n\t\tthis.append(container, obj);\r\n\t\treturn obj;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the element attributes.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} obj\r\n\t * @param {object} attrObject\r\n\t * @param {object} parent\r\n\t */\r\n\t_addElementAttrs(obj, attrObject, parent)\r\n\t{\r\n\t\t/* we want to check if we have attrributes to add */\r\n\t\tif(!attrObject || typeof attrObject !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we need to add the type if set to stop ie\r\n\t\tfrom removing the value if set after the value is\r\n\t\tadded */\r\n\t\tlet type = attrObject.type;\r\n\t\tif(typeof type !== 'undefined')\r\n\t\t{\r\n\t\t\tbase.setAttr(obj, 'type', type);\r\n\t\t}\r\n\r\n\t\t/* we want to add each attr to the obj */\r\n\t\tfor(var prop in attrObject)\r\n\t\t{\r\n\t\t\t/* we have already added the type so we need to\r\n\t\t\tskip if the prop is type */\r\n\t\t\tif(attrObject.hasOwnProperty(prop) === false || prop === 'type')\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tvar attrPropValue = attrObject[prop];\r\n\r\n\t\t\t/* we want to check to add the attr settings\r\n\t\t\t\tby property name */\r\n\t\t\tif(prop === 'innerHTML')\r\n\t\t\t{\r\n\t\t\t\tobj.innerHTML = attrPropValue;\r\n\t\t\t}\r\n\t\t\telse if(prop.indexOf('-') !== -1)\r\n\t\t\t{\r\n\t\t\t\t// this will handle data and aria attributes\r\n\t\t\t\tbase.setAttr(obj, prop, attrPropValue);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tthis.addAttr(obj, prop, attrPropValue, parent);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an element attribute.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {object} attr\r\n\t * @param {string} value\r\n\t */\r\n\taddAttr(obj, attr, value, parent)\r\n\t{\r\n\t\tif(value === '' || !attr)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to check to add a value or an event listener */\r\n\t\tlet type = typeof value;\r\n\t\tif(type === 'function')\r\n\t\t{\r\n\t\t\t/* this will add the event using the base events\r\n\t\t\tso the event is tracked */\r\n\t\t\tattr = removeEventPrefix(attr);\r\n\t\t\tbase.addListener(attr, obj, function(e)\r\n\t\t\t{\r\n\t\t\t\tvalue.call(this, e, parent);\r\n\t\t\t});\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tlet attrName = normalizeAttr(attr);\r\n\t\t\tobj[attrName] = value;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will render a function/Unit/Component.\r\n\t *\r\n\t * @param {object|function} layout\r\n\t * @param {object} container\r\n\t * @param {object} [parent]\r\n\t * @returns {object} The layout Unit or Component\r\n\t */\r\n\trender(layout, container, parent)\r\n\t{\r\n\t\tif(!layout)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tswitch(typeof layout)\r\n\t\t{\r\n\t\t\tcase 'object':\r\n\t\t\t\tif(layout.isUnit === true)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.createComponent(layout, container, parent);\r\n\t\t\t\t\treturn layout;\r\n\t\t\t\t}\r\n\t\t\tdefault:\r\n\t\t\t\tlet component = Jot(layout);\r\n\t\t\t\tlet jot = new component();\r\n\t\t\t\tthis.createComponent(jot, container, parent);\r\n\t\t\t\treturn jot;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will build a JSON layout.\r\n\t *\r\n\t * @param {object} obj The JSON layout.\r\n\t * @param {object} [container] The parent receiving the layout.\r\n\t * @param {object} [parent] The component adding the layout.\r\n\t * @return {object} The doc Frag element.\r\n\t */\r\n\tbuild(obj, container, parent)\r\n\t{\r\n\t\tlet fragment = this.createDocFragment();\r\n\r\n\t\tif (Array.isArray(obj))\r\n\t\t{\r\n\t\t\tlet item;\r\n\t\t\tfor (var i = 0, length = obj.length; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\titem = obj[i];\r\n\t\t\t\tthis.buildElement(item, fragment, parent);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.buildElement(obj, fragment, parent);\r\n\t\t}\r\n\r\n\t\tif(container && typeof container === 'object')\r\n\t\t{\r\n\t\t\tcontainer.appendChild(fragment);\r\n\t\t}\r\n\t\treturn fragment;\r\n\t}\r\n\r\n\t/**\r\n\t * This will build an element or component.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {object} container\r\n\t * @param {object} [parent] The component adding the layout.\r\n\t */\r\n\tbuildElement(obj, container, parent)\r\n\t{\r\n\t\tif(!obj)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif(obj.component || obj.isUnit === true)\r\n\t\t{\r\n\t\t\tthis.createComponent(obj, container, parent);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.createElement(obj, container, parent);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will append a child element to a parent.\r\n\t *\r\n\t * @override\r\n\t * @param {object} parent\r\n\t * @param {object} child\r\n\t */\r\n\tappend(parent, child)\r\n\t{\r\n\t\tparent.appendChild(child);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create an element.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} obj\r\n\t * @param {object} container\r\n\t * @param {object} [parent] The component adding the layout.\r\n\t */\r\n\tcreateElement(obj, container, parent)\r\n\t{\r\n\t\tlet settings = parser.parseElement(obj),\r\n\t\tele = this.createNode(settings, container, parent);\r\n\r\n\t\tconst propName = obj.cache;\r\n\t\tif(parent && propName)\r\n\t\t{\r\n\t\t\tparent[propName] = ele;\r\n\t\t}\r\n\r\n\t\t/* we want to recursively add the children to\r\n\t\tthe new element */\r\n\t\tlet children = settings.children;\r\n\t\tif (children.length > 0)\r\n\t\t{\r\n\t\t\tlet child;\r\n\t\t\tfor (var i = 0, length = children.length; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tchild = children[i];\r\n\t\t\t\tif(child === null)\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.buildElement(child, ele, parent);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.addElementDirectives(ele, obj, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the element directives.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {object} obj\r\n\t * @param {object} [parent]\r\n\t */\r\n\taddElementDirectives(ele, obj, parent)\r\n\t{\r\n\t\tif(typeof obj.onCreated === 'function')\r\n\t\t{\r\n\t\t\tobj.onCreated(ele, parent);\r\n\t\t}\r\n\r\n\t\t/* this will check to bind the element to\r\n\t\tthe prop of a data */\r\n\t\tlet bind = obj.bind;\r\n\t\tif(bind)\r\n\t\t{\r\n\t\t\tthis.bindElement(ele, bind, parent);\r\n\t\t}\r\n\r\n\t\tif(obj.route)\r\n\t\t{\r\n\t\t\tthis.addRoute(ele, obj.route, parent);\r\n\t\t}\r\n\r\n\t\tif(obj.switch)\r\n\t\t{\r\n\t\t\tthis.addSwitch(ele, obj.switch, parent);\r\n\t\t}\r\n\r\n\t\tif(obj.html)\r\n\t\t{\r\n\t\t\tthis.addHtml(ele, obj.html);\r\n\t\t}\r\n\r\n\t\tif(obj.useContext)\r\n\t\t{\r\n\t\t\tthis.useContext(ele, obj.useContext, parent);\r\n\t\t}\r\n\r\n\t\tif(obj.addContext)\r\n\t\t{\r\n\t\t\tthis.addContext(ele, obj.addContext, parent);\r\n\t\t}\r\n\r\n\t\tif(obj.context)\r\n\t\t{\r\n\t\t\tthis.context(ele, obj.context, parent);\r\n\t\t}\r\n\r\n\t\tif(obj.role)\r\n\t\t{\r\n\t\t\tthis.addRole(ele, obj.role, parent);\r\n\t\t}\r\n\r\n\t\tif(obj.aria)\r\n\t\t{\r\n\t\t\tthis.addAria(ele, obj.aria, parent);\r\n\t\t}\r\n\r\n\t\tif(parent)\r\n\t\t{\r\n\t\t\tlet onState = obj.onState;\r\n\t\t\tif(onState && onState.length)\r\n\t\t\t{\r\n\t\t\t\tthis.onState(ele, onState, parent);\r\n\t\t\t}\r\n\r\n\t\t\tlet onSet = obj.onSet;\r\n\t\t\tif(onSet && onSet.length)\r\n\t\t\t{\r\n\t\t\t\tthis.onSet(ele, onSet, parent);\r\n\t\t\t}\r\n\r\n\t\t\tlet map = obj.map;\r\n\t\t\tif(map && map.length)\r\n\t\t\t{\r\n\t\t\t\tthis.map(ele, map, parent);\r\n\t\t\t}\r\n\r\n\t\t\tlet forBind = obj.for;\r\n\t\t\tif(forBind && forBind.length)\r\n\t\t\t{\r\n\t\t\t\tthis.for(ele, forBind, parent);\r\n\t\t\t}\r\n\r\n\t\t\tlet useParent = obj.useParent;\r\n\t\t\tif(useParent)\r\n\t\t\t{\r\n\t\t\t\tthis.useParent(ele, useParent, parent);\r\n\t\t\t}\r\n\r\n\t\t\tlet useData = obj.useData;\r\n\t\t\tif(useData)\r\n\t\t\t{\r\n\t\t\t\tthis.useData(ele, useData, parent);\r\n\t\t\t}\r\n\r\n\t\t\tlet useState = obj.useState;\r\n\t\t\tif(useState)\r\n\t\t\t{\r\n\t\t\t\tthis.useState(ele, useState, parent);\r\n\t\t\t}\r\n\r\n\t\t\tlet addState = obj.addState;\r\n\t\t\tif(addState)\r\n\t\t\t{\r\n\t\t\t\tthis.addState(ele, addState, parent);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif(obj.watch)\r\n\t\t{\r\n\t\t\tthis.watch(ele, obj.watch, parent);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the data source from the parent component.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} [parent]\r\n\t * @return {(object|boolean)}\r\n\t */\r\n\t_getDataSource(parent)\r\n\t{\r\n\t\tif(!parent)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(parent.data)\r\n\t\t{\r\n\t\t\treturn parent.data;\r\n\t\t}\r\n\r\n\t\tif(parent.context && parent.context.data)\r\n\t\t{\r\n\t\t\treturn parent.context.data;\r\n\t\t}\r\n\r\n\t\tif(parent.state)\r\n\t\t{\r\n\t\t\treturn parent.state;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will bind an element to data.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {(string|array)} bind\r\n\t * @param {*} parent\r\n\t */\r\n\tbindElement(ele, bind, parent)\r\n\t{\r\n\t\tlet data, prop, filter;\r\n\r\n\t\tif(typeof bind === 'string')\r\n\t\t{\r\n\t\t\tdata = this._getDataSource(parent);\r\n\t\t\tif(!data)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tprop = bind;\r\n\t\t}\r\n\t\telse if(Array.isArray(bind))\r\n\t\t{\r\n\t\t\tif((typeof bind[0] !== 'object'))\r\n\t\t\t{\r\n\t\t\t\tlet dataSource = this._getDataSource(parent);\r\n\t\t\t\tif(!dataSource)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tbind.unshift(dataSource);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t[data, prop, filter] = bind;\r\n\t\t}\r\n\r\n\t\tdataBinder.bind(ele, data, prop, filter);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a route.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {(object|array)} route\r\n\t * @param {object} parent\r\n\t */\r\n\taddRoute(ele, route, parent)\r\n\t{\r\n\t\tif(!route)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(base.isArray(route))\r\n\t\t{\r\n\t\t\tfor(var i = 0, length = route.length; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tthis.setupRoute(ele, route[i], parent);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.setupRoute(ele, route, parent);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup a route.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {object} route\r\n\t * @param {object} parent\r\n\t */\r\n\tsetupRoute(ele, route, parent)\r\n\t{\r\n\t\t// this will check to resume route\r\n\t\t// if(this.checkResume(route))\r\n\t\t// {\r\n\t\t// \tthis.resumeRoute(ele, route.component.route);\r\n\t\t// \treturn;\r\n\t\t// }\r\n\r\n\t\troute.container = ele;\r\n\t\troute.parent = parent;\r\n\t\tlet newRoute = base.router.add(route);\r\n\r\n\t\tthis.trackRoute(ele, newRoute);\r\n\t}\r\n\r\n\t/**\r\n\t * This will check to resume route.\r\n\t *\r\n\t * @param {object} route\r\n\t */\r\n\tcheckResume(route)\r\n\t{\r\n\t\treturn (route && route.component && route.component.route);\r\n\t}\r\n\r\n\t/**\r\n\t * This will resume a route.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {object} route\r\n\t */\r\n\tresumeRoute(ele, route)\r\n\t{\r\n\t\tbase.router.resume(route, ele);\r\n\r\n\t\tthis.trackRoute(ele, route);\r\n\t}\r\n\r\n\t/**\r\n\t * This will track a route.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {object} route\r\n\t */\r\n\ttrackRoute(ele, route)\r\n\t{\r\n\t\tbase.dataTracker.add(ele, 'routes',\r\n\t\t{\r\n\t\t\troute\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a switch.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {array} group\r\n\t * @param {object} parent\r\n\t */\r\n\taddSwitch(ele, group, parent)\r\n\t{\r\n\t\tlet route = group[0];\r\n\t\t// this will check to resume switch\r\n\t\t// if(this.checkResume(route))\r\n\t\t// {\r\n\t\t// \tthis.resumeSwitch(ele, group);\r\n\t\t// \treturn;\r\n\t\t// }\r\n\r\n\t\tfor(var i = 0, length = group.length; i < length; i++)\r\n\t\t{\r\n\t\t\troute = group[i];\r\n\t\t\troute.container = ele;\r\n\t\t\troute.parent = parent;\r\n\t\t}\r\n\r\n\t\tlet id = base.router.addSwitch(group);\r\n\t\tthis.trackSwitch(ele, id);\r\n\t}\r\n\r\n\tresumeSwitch(ele, group)\r\n\t{\r\n\t\tlet id = base.router.resumeSwitch(group, ele);\r\n\t\tthis.trackSwitch(ele, id);\r\n\t}\r\n\r\n\t/**\r\n\t * This will track a switch.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {int} id\r\n\t */\r\n\ttrackSwitch(ele, id)\r\n\t{\r\n\t\tbase.dataTracker.add(ele, 'switch',\r\n\t\t{\r\n\t\t\tid\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will add aria attributes.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {array} role\r\n\t * @param {object} parent\r\n\t */\r\n\taddRole(ele, role, parent)\r\n\t{\r\n\t\tif(!role)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif(role)\r\n\t\t{\r\n\t\t\tbase.setAttr(ele, 'role', role);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will add aria attributes.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {array} attributes\r\n\t * @param {object} parent\r\n\t */\r\n\taddAria(ele, attributes, parent)\r\n\t{\r\n\t\tif(!attributes)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet role = attributes.role;\r\n\t\tif(role)\r\n\t\t{\r\n\t\t\tbase.setAttr(ele, 'role', role);\r\n\t\t\tattributes.role = null;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This will setup the onSet callBack.\r\n\t\t *\r\n\t\t * @param {string} attr\r\n\t\t * @return {function}\r\n\t\t */\r\n\t\tconst onSetCallBack = (attr) =>\r\n\t\t{\r\n\t\t\treturn (ele, val) =>\r\n\t\t\t{\r\n\t\t\t\tvar text = (val)? \"true\" : \"false\";\r\n\t\t\t\tbase.setAttr(ele, attr, text);\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\tfor(var prop in attributes)\r\n\t\t{\r\n\t\t\tif(attributes.hasOwnProperty(prop) === false || attributes[prop] === null)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tvar value = attributes[prop];\r\n\t\t\tvar attr = 'aria-' + prop;\r\n\r\n\t\t\t/* this will setup an onSet to change the attr value\r\n\t\t\twhen the data chnages. */\r\n\t\t\tif(Array.isArray(value))\r\n\t\t\t{\r\n\t\t\t\tvalue.push(onSetCallBack(attr));\r\n\t\t\t\tthis.onSet(ele, value, parent);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tbase.setAttr(ele, attr, value);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the parent context.\r\n\t *\r\n\t * @param {object|null} parent\r\n\t * @returns {object|null}\r\n\t */\r\n\tgetParentContext(parent)\r\n\t{\r\n\t\treturn (!parent)? null : parent.getContext();\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the context attributes.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {function} context\r\n\t * @param {object} [parent]\r\n\t */\r\n\tcontext(ele, context, parent)\r\n\t{\r\n\t\tif(typeof context !== 'function')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet parentContext = this.getParentContext(parent);\r\n\t\tlet attributes = context(parentContext);\r\n\t\tif(!attributes)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._addElementAttrs(ele, attributes, parent);\r\n\t\tthis.addElementDirectives(ele, attributes, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will use the parent context.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {function} callBack\r\n\t * @param {object} [parent]\r\n\t * @returns {void}\r\n\t */\r\n\tuseContext(ele, callBack, parent)\r\n\t{\r\n\t\tif(typeof callBack !== 'function')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet parentContext = this.getParentContext(parent);\r\n\t\tcallBack(parentContext);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add context the parent context.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {array} callBack\r\n\t * @param {object} [parent]\r\n\t * @returns {void}\r\n\t */\r\n\taddContext(ele, callBack, parent)\r\n\t{\r\n\t\tif(typeof callBack !== 'function' || !parent)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet parentContext = this.getParentContext(parent);\r\n\t\tlet childContext = callBack(parentContext);\r\n\t\tif(!childContext)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tparent.addContextBranch(childContext[0], childContext[1]);\r\n\t}\r\n\r\n\t/**\r\n\t * This will track the child context on the element.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {string} branchName\r\n\t * @param {object} parent\r\n\t */\r\n\ttrackContext(ele, branchName, parent)\r\n\t{\r\n\t\tbase.dataTracker.add(ele, 'context',\r\n\t\t{\r\n\t\t\tbranch: branchName,\r\n\t\t\tparent: parent\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a watcher.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {(array|object)} watcher\r\n\t * @param {object} [parent]\r\n\t */\r\n\twatch(ele, watcher, parent)\r\n\t{\r\n\t\tif(!watcher)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(Array.isArray(watcher) && typeof watcher[0] !== 'string')\r\n\t\t{\r\n\t\t\tfor(var i = 0, length = watcher.length; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tWatcherHelper.setup(ele, watcher[i], parent);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tWatcherHelper.setup(ele, watcher, parent);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will pass the parent state to the callBack.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {function} callBack\r\n\t * @param {object} parent\r\n\t */\r\n\tuseParent(ele, callBack, parent)\r\n\t{\r\n\t\tif(!callBack || !parent)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tcallBack(parent, ele);\r\n\t}\r\n\r\n\t/**\r\n\t * This will pass the parent state to the callBack.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {function} callBack\r\n\t * @param {object} parent\r\n\t */\r\n\tuseData(ele, callBack, parent)\r\n\t{\r\n\t\tif(!callBack || !parent)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tcallBack(parent.data, ele);\r\n\t}\r\n\r\n\t/**\r\n\t * This will pass the parent state to the callBack.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {function} callBack\r\n\t * @param {object} parent\r\n\t */\r\n\tuseState(ele, callBack, parent)\r\n\t{\r\n\t\tif(!callBack || !parent)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tcallBack(parent.state, ele);\r\n\t}\r\n\r\n\t/**\r\n\t * This will pass the parent state to the callBack.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {function} callBack\r\n\t * @param {object} parent\r\n\t */\r\n\taddState(ele, callBack, parent)\r\n\t{\r\n\t\tif(!callBack || !parent)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(parent.stateHelper)\r\n\t\t{\r\n\t\t\tlet state = parent.state;\r\n\t\t\tlet states = callBack(state);\r\n\t\t\tparent.stateHelper.addStates(states);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will map children to the element.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {array} settings\r\n\t * @param {object} parent\r\n\t */\r\n\tmap(ele, settings, parent)\r\n\t{\r\n\t\tlet items = settings[0];\r\n\t\tif(!items || items.length < 1)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet item = settings[1];\r\n\t\tlet children = [];\r\n\t\tfor(var i = 0, length = items.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar row = items[i];\r\n\t\t\tif(!row)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tvar layout = item(row, i);\r\n\t\t\tif(layout === null)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tchildren.push(layout);\r\n\t\t}\r\n\r\n\t\treturn this.build(children, ele, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will watch a data attr and update the\r\n\t * children to the element when the attr value is updated.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {array} settings\r\n\t * @param {object} parent\r\n\t */\r\n\tfor(ele, settings, parent)\r\n\t{\r\n\t\tlet data, prop, item, scope;\r\n\r\n\t\tif(settings.length < 3)\r\n\t\t{\r\n\t\t\tconst parentData = this.getParentSetData(parent);\r\n\t\t\tif(!parentData)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tdata = parentData;\r\n\t\t\tprop = settings[0];\r\n\t\t\titem = settings[1];\r\n\t\t\tscope = settings[2];\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tdata = settings[0];\r\n\t\t\tprop = settings[1];\r\n\t\t\titem = settings[2];\r\n\t\t\tscope = settings[3];\r\n\t\t}\r\n\r\n\t\tlet scopeData = (scope !== false);\r\n\t\tdataBinder.watch(ele, data, prop, (items) =>\r\n\t\t{\r\n\t\t\tthis.removeAll(ele);\r\n\t\t\tif(!items || items.length < 1)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tlet children = [];\r\n\t\t\tfor(var i = 0, length = items.length; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tvar scoped = (scopeData)? data.scope(prop + '[' + i + ']') : null;\r\n\t\t\t\tvar layout = item(items[i], i, scoped);\r\n\t\t\t\tif(layout === null)\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tchildren.push(layout);\r\n\t\t\t}\r\n\r\n\t\t\treturn this.build(children, ele, parent);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an onState watcher.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {array} onState\r\n\t * @param {object} parent\r\n\t */\r\n\tonState(ele, onState, parent)\r\n\t{\r\n\t\tthis.onUpdate(ele, parent.state, onState, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the parent set data.\r\n\t *\r\n\t * @param {object} parent\r\n\t * @returns {object|null}\r\n\t */\r\n\tgetParentSetData(parent)\r\n\t{\r\n\t\tif(parent.data)\r\n\t\t{\r\n\t\t\treturn parent.data;\r\n\t\t}\r\n\r\n\t\tif(parent.context && parent.context.data)\r\n\t\t{\r\n\t\t\treturn parent.context.data;\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an onSet watcher.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {array} onSet\r\n\t * @param {object} parent\r\n\t */\r\n\tonSet(ele, onSet, parent)\r\n\t{\r\n\t\tconst data = this.getParentSetData(parent);\r\n\t\tthis.onUpdate(ele, data, onSet, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup a data watcher.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @param {(function|object)} callBack\r\n\t * @param {string} parent\r\n\t */\r\n\tonUpdate(ele, data, settings, parent)\r\n\t{\r\n\t\tlet prop,\r\n\t\tcallBack,\r\n\t\tupdate;\r\n\r\n\t\tif(base.isArray(settings[0]))\r\n\t\t{\r\n\t\t\tfor(var i = 0, maxLength = settings.length; i < maxLength; i++)\r\n\t\t\t{\r\n\t\t\t\tvar itemSettings = settings[i];\r\n\t\t\t\tif(!itemSettings)\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.onUpdate(ele, data, itemSettings, parent);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif(settings.length < 3)\r\n\t\t{\r\n\t\t\t[prop, callBack] = settings;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t[data, prop, callBack] = settings;\r\n\t\t}\r\n\r\n\t\tif(!data || !prop)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tswitch(typeof callBack)\r\n\t\t{\r\n\t\t\tcase 'object':\r\n\t\t\t\tupdate = (value) =>\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.addClass(ele, callBack, value);\r\n\t\t\t\t};\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'function':\r\n\t\t\t\tupdate = (value) =>\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.updateElement(ele, callBack, prop, value, parent);\r\n\t\t\t\t};\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tdataBinder.watch(ele, data, prop, update);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup a data watcher.\r\n\t *\r\n\t * @private\r\n\t * @param {object} ele\r\n\t * @param {function} callBack\r\n\t * @param {string} value\r\n\t * @param {string} parent\r\n\t */\r\n\tupdateElement(ele, callBack, prop, value, parent)\r\n\t{\r\n\t\tlet result = callBack(ele, value, parent);\r\n\t\tswitch(typeof result)\r\n\t\t{\r\n\t\t\tcase 'object':\r\n\t\t\t\tif(parent && result && result.isUnit === true && parent.persist === true && parent.state)\r\n\t\t\t\t{\r\n\t\t\t\t\tlet key = prop + ':' + value,\r\n\t\t\t\t\tstate = parent.state,\r\n\t\t\t\t\tpreviousResult = state.get(key);\r\n\t\t\t\t\tif(typeof previousResult !== 'undefined')\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tresult = previousResult;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tstate.set(key, result);\r\n\t\t\t\t}\r\n\t\t\t\tthis.rebuild(ele, result, parent);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'string':\r\n\t\t\t\tthis.addHtml(ele, result);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will add or remove a class from an element.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {object} stateStyles\r\n\t * @param {*} newValue\r\n\t */\r\n\taddClass(ele, stateStyles, newValue)\r\n\t{\r\n\t\tfor(var prop in stateStyles)\r\n\t\t{\r\n\t\t\tif(!stateStyles.hasOwnProperty(prop) || !prop)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tif(stateStyles[prop] === newValue)\r\n\t\t\t{\r\n\t\t\t\tbase.addClass(ele, prop);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tbase.removeClass(ele, prop);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will reset an element innerHTML and rebuild.\r\n\t *\r\n\t * @private\r\n\t * @param {object} ele\r\n\t * @param {object} layout\r\n\t * @param {object} parent\r\n\t */\r\n\trebuild(ele, layout, parent)\r\n\t{\r\n\t\tthis.removeAll(ele);\r\n\t\tthis.build(layout, ele, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a component.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} obj\r\n\t * @param {object} container\r\n\t * @param {object} parent\r\n\t */\r\n\tcreateComponent(obj, container, parent)\r\n\t{\r\n\t\t// this will allow both cached components or native components\r\n\t\tconst component = obj.component || obj;\r\n\t\tcomponent.parent = parent;\r\n\r\n\t\tif(parent && parent.persist === true && component.persist !== false)\r\n\t\t{\r\n\t\t\tcomponent.persist = true;\r\n\t\t}\r\n\r\n\t\tif(component.cacheable && parent)\r\n\t\t{\r\n\t\t\tparent[component.cacheable] = component;\r\n\t\t}\r\n\r\n\t\tcomponent.setup(container);\r\n\r\n\t\tif(obj.component && typeof obj.onCreated === 'function')\r\n\t\t{\r\n\t\t\tobj.onCreated(component);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a node.\r\n\t *\r\n\t * @param {object} settings\r\n\t * @param {object} container\r\n\t * @param {object} parent\r\n\t * @return {object}\r\n\t */\r\n\tcreateNode(settings, container, parent)\r\n\t{\r\n\t\tlet tag = settings.tag;\r\n\t\tif(tag === 'text')\r\n\t\t{\r\n\t\t\tlet attr = settings.attr;\r\n\t\t\tlet text = attr.textContent || attr.text;\r\n\t\t\treturn this.createTextNode(text, container);\r\n\t\t}\r\n\t\telse if(tag === 'comment')\r\n\t\t{\r\n\t\t\tlet attr = settings.attr;\r\n\t\t\tlet text = attr.text;\r\n\t\t\treturn this.createCommentNode(text, container);\r\n\t\t}\r\n\r\n\t\treturn this.create(tag, settings.attr, container, parent);\r\n\t}\r\n}\r\n\r\nexport const builder = new LayoutBuilder();\r\n\r\nbase.augment(\r\n{\r\n\t/**\r\n\t * This will build a JSON layout.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {object} [container]\r\n\t * @param {object} [parent]\r\n\t * @return {object}\r\n\t */\r\n\tbuildLayout(obj, container, parent)\r\n\t{\r\n\t\tbuilder.build(obj, container, parent);\r\n\t}\r\n});", "import {base} from '../../core.js';\r\nimport {builder} from '../layout/layout-builder.js';\r\nimport {dataBinder} from '../data-binder/data-binder.js';\r\n\r\n/* this will register the component system to the\r\ndata tracker to remove components that have been\r\nnested in layouts. */\r\nbase.dataTracker.addType('components', (data) =>\r\n{\r\n\tif(!data)\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\r\n\tlet component = data.component;\r\n\tif(component && component.rendered === true)\r\n\t{\r\n\t\tcomponent.prepareDestroy();\r\n\t}\r\n});\r\n\r\nlet unitNumber = 0;\r\n\r\n/**\r\n * Unit\r\n *\r\n * @class\r\n *\r\n * This will allow units to be extended\r\n * from a single factory.\r\n *\r\n * @example\r\n * var Alert = base.Unit.extend(\r\n *\t{\r\n *\t\tconstructor: function(props)\r\n *\t\t{\r\n *\t\t\t// this will setup the component id\r\n *\t\t\tbase.Component.call(this, props);\r\n *\t\t},\r\n *\r\n *\t\trender: function()\r\n *\t\t{\r\n *\t\t\treturn {\r\n *\r\n *\t\t\t};\r\n *\t\t}\r\n *\t});\r\n */\r\nexport class Unit\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} [props]\r\n\t */\r\n\tconstructor(props)\r\n\t{\r\n\t\t/**\r\n\t\t * @param {bool} isUnit\r\n\t\t */\r\n\t\tthis.isUnit = true;\r\n\r\n\t\tthis.init();\r\n\t\tthis.setupProps(props);\r\n\t\tthis.onCreated();\r\n\r\n\t\tthis.rendered = false;\r\n\t\tthis.container = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the component number and unique\r\n\t * instance id for the component elements.\r\n\t * @protected\r\n\t */\r\n\tinit()\r\n\t{\r\n\t\tthis.id = 'cp-' + (unitNumber++);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the component props.\r\n\t *\r\n\t * @param {object} [props]\r\n\t */\r\n\tsetupProps(props)\r\n\t{\r\n\t\tif(!props || typeof props !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tfor(var prop in props)\r\n\t\t{\r\n\t\t\tif(props.hasOwnProperty(prop))\r\n\t\t\t{\r\n\t\t\t\tthis[prop] = props[prop];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the parent context.\r\n\t *\r\n\t * @returns {object|null}\r\n\t */\r\n\tgetParentContext()\r\n\t{\r\n\t\tif(!this.parent)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn this.parent.getContext();\r\n\t}\r\n\r\n\t/**\r\n\t * This will set up the context.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tsetupContext()\r\n\t{\r\n\t\tlet parentContext = this.getParentContext();\r\n\t\tlet context = this.setContext(parentContext);\r\n\t\tif(context)\r\n\t\t{\r\n\t\t\tthis.context = context;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.context = parentContext;\r\n\t\tthis.setupAddingContext();\r\n\t}\r\n\r\n\t/**\r\n\t * This will set up the adding context.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tsetupAddingContext()\r\n\t{\r\n\t\tlet parentContext = this.context;\r\n\t\tlet context = this.addContext(parentContext);\r\n\t\tif(!context)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet branchName = context[0];\r\n\t\tif(!branchName)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.addingContext = true;\r\n\t\tthis.contextBranchName = branchName;\r\n\t\tthis.addContextBranch(branchName, context[1]);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a branch to the context.\r\n\t *\r\n\t * @param {string} branchName\r\n\t * @param {mixed} value\r\n\t */\r\n\taddContextBranch(branchName, value)\r\n\t{\r\n\t\tthis.context = this.context || {};\r\n\t\tthis.context[branchName] = value;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the component context.\r\n\t *\r\n\t * @param {object|null} context\r\n\t * @returns {object|null}\r\n\t */\r\n\tsetContext(context)\r\n\t{\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add context to the parent context.\r\n\t *\r\n\t * @param {object|null} context\r\n\t * @return {array|null}\r\n\t */\r\n\taddContext(context)\r\n\t{\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the added context from the parent.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tremoveContext()\r\n\t{\r\n\t\tif(!this.addingContext)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.removeContextBranch(this.contextBranchName);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a context branch.\r\n\t *\r\n\t * @param {string} branch\r\n\t * @returns {void}\r\n\t */\r\n\tremoveContextBranch(branch)\r\n\t{\r\n\t\tif(!branch)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tdelete this.context[branch];\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the context.\r\n\t *\r\n\t * @returns {object|null}\r\n\t */\r\n\tgetContext()\r\n\t{\r\n\t\treturn this.context;\r\n\t}\r\n\r\n\t/**\r\n\t * override this to do something when created.\r\n\t */\r\n\tonCreated()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will render the component.\r\n\t *\r\n\t * @return {object}\r\n\t */\r\n\trender()\r\n\t{\r\n\t\treturn {\r\n\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will cache the layout panel and set the main id.\r\n\t * @param {object} layout\r\n\t * @return {object}\r\n\t */\r\n\t_cacheRoot(layout)\r\n\t{\r\n\t\tif(!layout)\r\n\t\t{\r\n\t\t\treturn layout;\r\n\t\t}\r\n\r\n\t\tif(!layout.id)\r\n\t\t{\r\n\t\t\tlayout.id = this.getId();\r\n\t\t}\r\n\r\n\t\tlayout.cache = 'panel';\r\n\t\treturn layout;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create the component layout.\r\n\t * @protected\r\n\t * @return {object}\r\n\t */\r\n\t_createLayout()\r\n\t{\r\n\t\tif(this.persist)\r\n\t\t{\r\n\t\t\treturn this._layout || (this._layout = this.render());\r\n\t\t}\r\n\r\n\t\treturn this.render();\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepare the layout.\r\n\t *\r\n\t * @protected\r\n\t * @return {object}\r\n\t */\r\n\tprepareLayout()\r\n\t{\r\n\t\tlet layout = this._createLayout();\r\n\t\treturn this._cacheRoot(layout);\r\n\t}\r\n\r\n\t/**\r\n\t * This will build the layout.\r\n\t * @protected\r\n\t */\r\n\tbuildLayout()\r\n\t{\r\n\t\tlet layout = this.prepareLayout();\r\n\t\tthis.build(layout, this.container);\r\n\r\n\t\tbase.dataTracker.add(this.panel, 'components',\r\n\t\t{\r\n\t\t\tcomponent: this\r\n\t\t});\r\n\r\n\t\tthis.rendered = true;\r\n\t}\r\n\r\n\t/**\r\n\t * This will build a layout.\r\n\t *\r\n\t * @param {object} layout\r\n\t * @param {object} container\r\n\t * @return {object}\r\n\t */\r\n\tbuild(layout, container)\r\n\t{\r\n\t\treturn builder.build(layout, container, this);\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepend layout to a container.\r\n\t *\r\n\t * @param {object} layout\r\n\t * @param {object} container\r\n\t * @param {object} [optionalNode]\r\n\t */\r\n\tprepend(layout, container, optionalNode)\r\n\t{\r\n\t\tvar frag = this.build(layout, null);\r\n\t\tbuilder.prepend(container, frag, optionalNode);\r\n\t}\r\n\r\n\t/**\r\n\t * This will rebuild a layout.\r\n\t *\r\n\t * @param {object} layout\r\n\t * @param {object} container\r\n\t * @return {object}\r\n\t */\r\n\trebuild(layout, container)\r\n\t{\r\n\t\treturn builder.rebuild(container, layout, this);\r\n\t}\r\n\r\n\t/**\r\n\t * This will render the content on condition of a property.\r\n\t *\r\n\t * @param {mixed} prop\r\n\t * @param {mixed} content\r\n\t * @returns {object}\r\n\t */\r\n\tif(prop, content)\r\n\t{\r\n\t\treturn (!prop)? null : (content || prop);\r\n\t}\r\n\r\n\t/**\r\n\t * This will map an array to children elements.\r\n\t *\r\n\t * @param {array} items\r\n\t * @param {function} callBack\r\n\t * @returns {array}\r\n\t */\r\n\tmap(items, callBack)\r\n\t{\r\n\t\tlet children = [];\r\n\t\tif(!items || items.length < 1)\r\n\t\t{\r\n\t\t\treturn children;\r\n\t\t}\r\n\r\n\t\tfor(var i = 0, length = items.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar item = callBack(items[i], i);\r\n\t\t\tchildren.push(item);\r\n\t\t}\r\n\t\treturn children;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove children from an element.\r\n\t *\r\n\t * @param {object} layout\r\n\t * @param {object} container\r\n\t * @return {object}\r\n\t */\r\n\tremoveAll(ele)\r\n\t{\r\n\t\treturn builder.removeAll(ele);\r\n\t}\r\n\r\n\t/**\r\n\t * This will cache an element when its created by\r\n\t * saving a reference to it as a property on the\r\n\t * component.\r\n\t *\r\n\t * @param {string} propName The name to use as\r\n\t * the reference.\r\n\t * @param {object} layout\r\n\t * @param {function} [callBack]\r\n\t * @return {object}\r\n\t */\r\n\tcache(propName, layout, callBack)\r\n\t{\r\n\t\tif(!layout || typeof layout !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(layout.isUnit === true)\r\n\t\t{\r\n\t\t\tlayout =\r\n\t\t\t{\r\n\t\t\t\tcomponent: layout\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tlayout.onCreated = (element) =>\r\n\t\t{\r\n\t\t\tthis[propName] = element;\r\n\r\n\t\t\tif(typeof callBack === 'function')\r\n\t\t\t{\r\n\t\t\t\tcallBack(element);\r\n\t\t\t}\r\n\t\t};\r\n\t\treturn layout;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get an id of the component or the full\r\n\t * id that has the component id prepended to the\r\n\t * requested id.\r\n\t *\r\n\t * @param {string} [id]\r\n\t * @return {string}\r\n\t */\r\n\tgetId(id)\r\n\t{\r\n\t\tlet mainId = this.id;\r\n\t\tif(typeof id === 'string')\r\n\t\t{\r\n\t\t\tmainId += '-' + id;\r\n\t\t}\r\n\t\treturn mainId;\r\n\t}\r\n\r\n\t/**\r\n\t * This will initialize the component.\r\n\t * @protected\r\n\t */\r\n\tinitialize()\r\n\t{\r\n\t\tthis.setupContext();\r\n\t\tthis.beforeSetup();\r\n\t\tthis.buildLayout();\r\n\t\tthis.afterSetup();\r\n\t}\r\n\r\n\t/**\r\n\t * override this to do something before setup.\r\n\t */\r\n\tbeforeSetup()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * override this to do something after setup.\r\n\t */\r\n\tafterSetup()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup and render the component.\r\n\t * @param {object} container\r\n\t */\r\n\tsetup(container)\r\n\t{\r\n\t\tthis.container = container;\r\n\t\tthis.initialize();\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the component.\r\n\t * @protected\r\n\t */\r\n\tremove()\r\n\t{\r\n\t\tthis.prepareDestroy();\r\n\t\tthis.removeContext();\r\n\r\n\t\tlet panel = this.panel || this.id;\r\n\t\tbuilder.removeElement(panel);\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepare the component to be destroyed.\r\n\t */\r\n\tprepareDestroy()\r\n\t{\r\n\t\tthis.rendered = false;\r\n\t\tthis.beforeDestroy();\r\n\t}\r\n\r\n\t/**\r\n\t * Override this to do something before destroy.\r\n\t */\r\n\tbeforeDestroy()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will destroy the component.\r\n\t */\r\n\tdestroy()\r\n\t{\r\n\t\tthis.remove();\r\n\t}\r\n\r\n\t/**\r\n\t * This will bind and element to data.\r\n\t *\r\n\t * @param {object} element\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @param {function} filter\r\n\t */\r\n\tbindElement(element, data, prop, filter)\r\n\t{\r\n\t\tif(element)\r\n\t\t{\r\n\t\t\tdataBinder.bind(element, data, prop, filter);\r\n\t\t}\r\n\t}\r\n}", "import {base} from '../../core.js';\r\n\r\n/**\r\n * EventHelper\r\n *\r\n * This will create an event object to make\r\n * adding and removing events easier.\r\n * @class\r\n */\r\nexport class EventHelper\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\tthis.events = [];\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an array of events.\r\n\t *\r\n\t * @param {array} events\r\n\t */\r\n\taddEvents(events)\r\n\t{\r\n\t\tlet length = events.length;\r\n\t\tif(length < 1)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet event;\r\n\t\tfor(var i = 0; i < length; i++)\r\n\t\t{\r\n\t\t\tevent = events[i];\r\n\t\t\tthis.on(...event);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an event.\r\n\t *\r\n\t * @param {string} event\r\n\t * @param {object} obj\r\n\t * @param {function} callBack\r\n\t * @param {boolean} capture\r\n\t */\r\n\ton(event, obj, callBack, capture)\r\n\t{\r\n\t\tbase.on(event, obj, callBack, capture);\r\n\r\n\t\tthis.events.push({\r\n\t\t\tevent,\r\n\t\t\tobj,\r\n\t\t\tcallBack,\r\n\t\t\tcapture\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an event.\r\n\t *\r\n\t * @param {string} event\r\n\t * @param {object} obj\r\n\t * @param {function} callBack\r\n\t * @param {boolean} capture\r\n\t */\r\n\toff(event, obj, callBack, capture)\r\n\t{\r\n\t\tbase.off(event, obj, callBack, capture);\r\n\r\n\t\tlet option,\r\n\t\tevents = this.events;\r\n\t\tfor(var i = 0, length = events.length; i < length; i++)\r\n\t\t{\r\n\t\t\toption = events[i];\r\n\t\t\tif(option.event === event && option.obj === obj)\r\n\t\t\t{\r\n\t\t\t\tevents.splice(i, 1);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will set all events.\r\n\t */\r\n\tset()\r\n\t{\r\n\t\tlet event,\r\n\t\tevents = this.events;\r\n\t\tfor(var i = 0, length = events.length; i < length; i++)\r\n\t\t{\r\n\t\t\tevent = events[i];\r\n\t\t\tbase.on(event.event, event.obj, event.callBack, event.capture);\r\n\t\t}\r\n\t}\r\n\r\n\tunset()\r\n\t{\r\n\t\tlet event,\r\n\t\tevents = this.events;\r\n\t\tfor(var i = 0, length = events.length; i < length; i++)\r\n\t\t{\r\n\t\t\tevent = events[i];\r\n\t\t\tbase.off(event.event, event.obj, event.callBack, event.capture);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will reset the events.\r\n\t */\r\n\treset()\r\n\t{\r\n\t\tthis.unset();\r\n\t\tthis.events = [];\r\n\t}\r\n}", "import {state} from '../state/state.js';\r\n\r\n/**\r\n * StateHelper\r\n *\r\n * This is a helper to manage component states.\r\n */\r\nexport class StateHelper\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} state\r\n\t * @param {object} states\r\n\t */\r\n\tconstructor(state, states)\r\n\t{\r\n\t\tthis.remoteStates = [];\r\n\r\n\t\tlet actions = this.convertStates(states);\r\n\t\tthis.addStatesToTarget(state, actions);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add states to a state.\r\n\t *\r\n\t * @param {object} state\r\n\t * @param {object} states\r\n\t */\r\n\taddStates(state, states)\r\n\t{\r\n\t\tlet actions = this.convertStates(states);\r\n\t\tthis.addStatesToTarget(state, actions);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a state object.\r\n\t *\r\n\t * @param {string} action\r\n\t * @param {*} state\r\n\t * @param {function} callBack\r\n\t * @param {string} [targetId]\r\n\t * @return {object}\r\n\t */\r\n\tcreateState(action, state, callBack, targetId)\r\n\t{\r\n\t\treturn {\r\n\t\t\taction,\r\n\t\t\tstate,\r\n\t\t\tcallBack,\r\n\t\t\ttargetId,\r\n\t\t\ttoken: null\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will convert an action object to a state array.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} action\r\n\t * @return {array}\r\n\t */\r\n\tconvertStates(action)\r\n\t{\r\n\t\tlet actions = [];\r\n\t\tfor(var prop in action)\r\n\t\t{\r\n\t\t\tif(action.hasOwnProperty(prop) === false)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\telse if(prop === 'remotes')\r\n\t\t\t{\r\n\t\t\t\tthis.setupRemoteStates(action[prop], actions);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tvar targetId = null,\r\n\t\t\tcallBack = null,\r\n\t\t\tstate = action[prop];\r\n\t\t\tif(state && typeof state === 'object')\r\n\t\t\t{\r\n\t\t\t\tcallBack = state.callBack;\r\n\t\t\t\ttargetId = state.id || state.targetId;\r\n\t\t\t\tstate = state.state;\r\n\t\t\t}\r\n\r\n\t\t\tactions.push(this.createState(\r\n\t\t\t\tprop,\r\n\t\t\t\tstate,\r\n\t\t\t\tcallBack,\r\n\t\t\t\ttargetId\r\n\t\t\t));\r\n\t\t}\r\n\t\treturn actions;\r\n\t}\r\n\r\n\tsetupRemoteStates(remotes, actions)\r\n\t{\r\n\t\tlet remote;\r\n\t\tfor(var i = 0, length = remotes.length; i < length; i++)\r\n\t\t{\r\n\t\t\tremote = remotes[i];\r\n\t\t\tif(!remote)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tfor(var prop in remote)\r\n\t\t\t{\r\n\t\t\t\tif(remote.hasOwnProperty(prop) === false || prop === 'id')\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar callBack = null,\r\n\t\t\t\tvalue = remote[prop],\r\n\t\t\t\tstate = (value !== null)? value : undefined;\r\n\t\t\t\tif(state && typeof state === 'object')\r\n\t\t\t\t{\r\n\t\t\t\t\tcallBack = state.callBack;\r\n\t\t\t\t\tstate = state.state;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tactions.push(this.createState(\r\n\t\t\t\t\tprop,\r\n\t\t\t\t\tstate,\r\n\t\t\t\t\tcallBack,\r\n\t\t\t\t\tremote.id\r\n\t\t\t\t));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove remote states.\r\n\t */\r\n\tremoveRemoteStates()\r\n\t{\r\n\t\tlet remoteStates = this.remoteStates;\r\n\t\tif(remoteStates)\r\n\t\t{\r\n\t\t\tthis.removeActions(remoteStates);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the actions.\r\n\t *\r\n\t * @param {array} actions\r\n\t */\r\n\tremoveActions(actions)\r\n\t{\r\n\t\tif(actions.length < 1)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor(var i = 0, length = actions.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar action = actions[i];\r\n\t\t\tstate.remove(action.targetId, action.action, action.token);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will restore a state.\r\n\t *\r\n\t * @param {object} state\r\n\t */\r\n\trestore(state)\r\n\t{\r\n\t\tstate.restore();\r\n\r\n\t\tlet remotes = this.remoteStates;\r\n\t\tif(!remotes)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor(var i = 0, length = remotes.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar action = remotes[i];\r\n\t\t\taction.token = this.bindRemoteState(state, action.action, action.targetId);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup a two way bind to a remote state.\r\n\t *\r\n\t * @param {object} target\r\n\t * @param {string} actionEvent\r\n\t * @param {string} remoteTargetId\r\n\t * @return {string}\r\n\t */\r\n\tbindRemoteState(target, actionEvent, remoteTargetId)\r\n\t{\r\n\t\tconst remoteTarget = state.getTarget(remoteTargetId);\r\n\r\n\t\treturn target.link(remoteTarget, actionEvent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the states to the target.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} state\r\n\t * @param {array} actions\r\n\t */\r\n\taddStatesToTarget(state, actions)\r\n\t{\r\n\t\tlet remotes = this.remoteStates;\r\n\r\n\t\tfor(var i = 0, length = actions.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar action = actions[i],\r\n\t\t\ttoken = this.addAction(state, action);\r\n\r\n\t\t\tif(action.targetId)\r\n\t\t\t{\r\n\t\t\t\taction.token = token;\r\n\t\t\t\tremotes.push(action);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif(remotes.length < 1)\r\n\t\t{\r\n\t\t\tthis.remoteStates = null;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an action.\r\n\t *\r\n\t * @param {object} target\r\n\t * @param {object} action\r\n\t */\r\n\taddAction(target, action)\r\n\t{\r\n\t\tlet token,\r\n\t\tactionEvent = action.action;\r\n\r\n\t\t/* this will check to select the remote target if set */\r\n\t\tlet targetId = action.targetId;\r\n\t\tif(targetId)\r\n\t\t{\r\n\t\t\ttoken = this.bindRemoteState(target, actionEvent, targetId);\r\n\t\t}\r\n\r\n\t\tif(typeof action.state !== 'undefined')\r\n\t\t{\r\n\t\t\ttarget.addAction(actionEvent, action.state);\r\n\t\t}\r\n\r\n\t\tlet callBack = action.callBack;\r\n\t\tif(typeof callBack === 'function')\r\n\t\t{\r\n\t\t\ttarget.on(actionEvent, callBack);\r\n\t\t}\r\n\r\n\t\treturn token;\r\n\t}\r\n}", "import {base} from '../../core.js';\r\nimport {Unit} from './unit.js';\r\nimport {state} from '../state/state.js';\r\nimport {EventHelper} from './event-helper.js';\r\nimport {StateHelper} from './state-helper.js';\r\n\r\nexport {Unit} from './unit.js';\r\nexport {Jot} from './jot.js';\r\nexport {Watch} from '../layout/layout-builder.js';\r\n\r\n/**\r\n * Component\r\n *\r\n * @class\r\n * @augments Unit\r\n *\r\n * This will allow components to be extended\r\n * from a single factory.\r\n *\r\n * @example\r\n * class QuickFlashPanel extends base.Component\r\n *\t{\r\n *\t\tconstructor(props)\r\n *\t\t{\r\n *\t\t\t// this will setup the component id\r\n *\t\t\tsuper(props);\r\n *\t\t},\r\n *\r\n *\t\trender()\r\n *\t\t{\r\n *\t\t\treturn {\r\n *\r\n *\t\t\t};\r\n *\t\t}\r\n *\t}\r\n */\r\nexport class Component extends Unit\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} [props]\r\n\t */\r\n\tconstructor(props)\r\n\t{\r\n\t\tsuper(props);\r\n\r\n\t\t/**\r\n\t\t * @param {bool} isComponent\r\n\t\t */\r\n\t\tthis.isComponent = true;\r\n\r\n\t\t/* this will allow the component to override the\r\n\t\tstate target id to add a custom id */\r\n\t\t/**\r\n\t\t * @member {string} [stateTargetId] // optional override of state id\r\n\t\t */\r\n\t\tthis.stateTargetId = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will initialize the component.\r\n\t * @protected\r\n\t */\r\n\tinitialize()\r\n\t{\r\n\t\tthis.setupContext();\r\n\t\tthis.beforeSetup();\r\n\t\tthis.addStates();\r\n\t\tthis.buildLayout();\r\n\t\tthis.addEvents();\r\n\t\tthis.afterSetup();\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the state target.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} [id]\r\n\t */\r\n\tsetupStateTarget(id)\r\n\t{\r\n\t\tlet targetId = id || this.stateTargetId || this.id;\r\n\t\tthis.state = state.getTarget(targetId);\r\n\t}\r\n\r\n\t/**\r\n\t * Override this to setup the component states.\r\n\t * @return {object}\r\n\t */\r\n\tsetupStates()\r\n\t{\r\n\t\t/*\r\n\t\treturn {\r\n\t\t\taction: 'state'\r\n\t\t};\r\n\r\n\t\tor\r\n\r\n\t\treturn {\r\n\t\t\taction:\r\n\t\t\t{\r\n\t\t\t\tstate: 'state',\r\n\t\t\t\tcallBack(state, prevState)\r\n\t\t\t\t{\r\n\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};*/\r\n\r\n\t\treturn {\r\n\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the states.\r\n\t * @protected\r\n\t */\r\n\taddStates()\r\n\t{\r\n\t\t/* this will check to restore previous a previous state if the\r\n\t\tcomponent has been preserved. */\r\n\t\tlet state = this.state;\r\n\t\tif(state)\r\n\t\t{\r\n\t\t\tthis.stateHelper.restore(state);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/* this will only setupa state manager if\r\n\t\twe have states */\r\n\t\tlet states = this.setupStates();\r\n\t\tif(base.isEmpty(states))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.setupStateTarget();\r\n\t\tthis.stateHelper = new StateHelper(this.state, states);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the states.\r\n\t * @protected\r\n\t */\r\n\tremoveStates()\r\n\t{\r\n\t\tlet state = this.state;\r\n\t\tif(!state)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tthis.stateHelper.removeRemoteStates();\r\n\t\tstate.remove();\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the event helper.\r\n\t *\r\n\t * @protected\r\n\t */\r\n\tsetupEventHelper()\r\n\t{\r\n\t\tif(!this.events)\r\n\t\t{\r\n\t\t\tthis.events = new EventHelper();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the events.\r\n\t *\r\n\t * @protected\r\n\t * @return {array}\r\n\t */\r\n\tsetupEvents()\r\n\t{\r\n\t\treturn [\r\n\t\t\t//['action', element, function(e){}, false]\r\n\t\t];\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the events.\r\n\t *\r\n\t * @protected\r\n\t */\r\n\taddEvents()\r\n\t{\r\n\t\tlet events = this.setupEvents();\r\n\t\tif(events.length < 1)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tthis.setupEventHelper();\r\n\t\tthis.events.addEvents(events);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the events.\r\n\t * @protected\r\n\t */\r\n\tremoveEvents()\r\n\t{\r\n\t\tlet events = this.events;\r\n\t\tif(events)\r\n\t\t{\r\n\t\t\tevents.reset();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepare the component to be destroyed.\r\n\t */\r\n\tprepareDestroy()\r\n\t{\r\n\t\tthis.rendered = false;\r\n\t\tthis.beforeDestroy();\r\n\t\tthis.removeEvents();\r\n\t\tthis.removeStates();\r\n\t\tthis.removeContext();\r\n\r\n\t\tif(this.data && this.persist === false)\r\n\t\t{\r\n\t\t\tthis.data.unlink();\r\n\t\t}\r\n\t}\r\n}", "import {router} from './router.js';\r\nimport {Component} from '../component/component.js';\r\n\r\n/**\r\n * NavLink\r\n *\r\n * This will create a nav link that will add an active\r\n * class when the browser route path matches the link\r\n * href.\r\n *\r\n * @class\r\n */\r\nexport class NavLink extends Component\r\n{\r\n /**\r\n * This will configure the link active class.\r\n *\r\n * @protected\r\n */\r\n beforeSetup()\r\n {\r\n this.selectedClass = this.activeClass || 'active';\r\n }\r\n\r\n /**\r\n * This will render the component.\r\n *\r\n * @return {object}\r\n */\r\n render()\r\n {\r\n let href = this.href,\r\n text = this.text,\r\n watchers = this.setupWatchers(href, text);\r\n\r\n return {\r\n tag: 'a',\r\n className: this.className || null,\r\n onState: ['selected', {\r\n [this.selectedClass]: true\r\n }],\r\n href: this.getString(href),\r\n text: this.getString(text),\r\n children: this.children,\r\n watch: watchers\r\n };\r\n }\r\n\r\n /**\r\n * This will get string.\r\n *\r\n * @param {string} string\r\n * @return {(string|null)}\r\n */\r\n getString(string)\r\n {\r\n let type = typeof string;\r\n return (type !== 'object' && type !== 'undefined')? string : null;\r\n }\r\n\r\n /**\r\n * This will setup the watchers.\r\n *\r\n * @protected\r\n * @param {string} href\r\n * @param {string} text\r\n * @return {array}\r\n */\r\n setupWatchers(href, text)\r\n {\r\n let exact = (this.exact !== false),\r\n data = router.data;\r\n\r\n let watchers = [];\r\n\r\n if(href && typeof href === 'object')\r\n {\r\n watchers.push(\r\n {\r\n attr: 'href',\r\n value: href\r\n });\r\n }\r\n\r\n if(text && typeof text === 'object')\r\n {\r\n watchers.push(\r\n {\r\n attr: 'text',\r\n value: text\r\n });\r\n }\r\n\r\n watchers.push({\r\n value: ['[[path]]', data],\r\n callBack: (ele, value) =>\r\n {\r\n let path = ele.pathname + ele.hash;\r\n\t\t\t\tlet selected = exact? (value === path) : (new RegExp('^' + ele.pathname + '($|#|\\/|\\\\.).*').test(value));\r\n this.update(ele, selected);\r\n }\r\n });\r\n\r\n return watchers;\r\n }\r\n\r\n setupStates()\r\n {\r\n return {\r\n selected: false\r\n };\r\n }\r\n\r\n /**\r\n * This will update the class on the element.\r\n *\r\n * @param {object} ele\r\n * @param {bool} selected\r\n */\r\n update(ele, selected)\r\n {\r\n this.state.set('selected', selected);\r\n }\r\n}", "/**\r\n * Utils\r\n *\r\n * These are some helper functions for the router.\r\n */\r\nexport const Utils =\r\n{\r\n\t/**\r\n\t * This will remove the begining and ending slashes from a url.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @return {string}\r\n\t */\r\n\tremoveSlashes(uri)\r\n\t{\r\n\t\tif(typeof uri === 'string')\r\n\t\t{\r\n\t\t\tif(uri.substring(0, 1) === '/')\r\n\t\t\t{\r\n\t\t\t\turi = uri.substring(1);\r\n\t\t\t}\r\n\r\n\t\t\tif(uri.substring(-1) === '/')\r\n\t\t\t{\r\n\t\t\t\turi = uri.substring(0, uri.length - 1);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn uri;\r\n\t}\r\n};", "import { builder } from \"../layout/layout-builder.js\";\r\n\r\n/**\r\n * ComponentHelper\r\n *\r\n * This will create a helper to create and destroy components\r\n * that are added to a route.\r\n * @class\r\n */\r\nexport class ComponentHelper\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} route\r\n\t * @param {object} settings\r\n\t */\r\n\tconstructor(route, settings)\r\n\t{\r\n\t\tthis.route = route;\r\n\r\n\t\tthis.template = settings.component;\r\n\t\tthis.component = null;\r\n\t\tthis.hasTemplate = false;\r\n\r\n\t\tthis.setup = false;\r\n\t\tthis.container = settings.container;\r\n\t\tthis.persist = settings.persist;\r\n\t\tthis.parent = settings.parent;\r\n\r\n\t\tthis.setupTemplate();\r\n\t}\r\n\r\n\t/**\r\n\t * This will create the component.\r\n\t *\r\n\t * @param {object} params\r\n\t */\r\n\tfocus(params)\r\n\t{\r\n\t\tif(this.setup === false)\r\n\t\t{\r\n\t\t\tthis.create();\r\n\t\t}\r\n\r\n\t\tthis.update(params);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the template.\r\n\t * @protected\r\n\t */\r\n\tsetupTemplate()\r\n\t{\r\n\t\tlet template = this.template;\r\n\t\tif(typeof template === 'string')\r\n\t\t{\r\n\t\t\ttemplate = this.template = window[template];\r\n\t\t\tif(!template)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet type = typeof template;\r\n\t\tif(type === 'function')\r\n\t\t{\r\n\t\t\tthis.component = new this.template({\r\n\t\t\t\troute: this.route,\r\n\t\t\t\tpersist: this.persist,\r\n\t\t\t\tparent: this.parent\r\n\t\t\t});\r\n\t\t}\r\n\t\telse if(type === 'object')\r\n\t\t{\r\n\t\t\tif(!this.template.isUnit)\r\n\t\t\t{\r\n\t\t\t\tthis.template = Jot(this.template);\r\n\t\t\t}\r\n\r\n\t\t\tlet comp = this.component = this.template;\r\n\t\t\tlet persist = (comp.persist !== false);\r\n\r\n\t\t\tcomp.route = this.route;\r\n\t\t\tcomp.persist = persist;\r\n\t\t\tcomp.parent = this.parent;\r\n\t\t\tthis.persist = persist;\r\n\t\t}\r\n\r\n\t\tthis.hasTemplate = true;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create the route component.\r\n\t * @protected\r\n\t */\r\n\tcreate()\r\n\t{\r\n\t\tif(!this.hasTemplate)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tthis.setup = true;\r\n\r\n\t\tlet comp = this.component;\r\n\t\tif(!this.persist || !comp)\r\n\t\t{\r\n\t\t\tcomp = this.component = this.template;\r\n\t\t}\r\n\r\n\t\tbuilder.render(comp, this.container, this.parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the component.\r\n\t */\r\n\tremove()\r\n\t{\r\n\t\tif(this.setup !== true)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tthis.setup = false;\r\n\r\n\t\tlet component = this.component;\r\n\t\tif(!component)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(typeof component.destroy === 'function')\r\n\t\t{\r\n\t\t\tcomponent.destroy();\r\n\t\t}\r\n\r\n\t\t// this will remove the reference to the component if persit is false\r\n\t\tif(this.persist === false)\r\n\t\t{\r\n\t\t\tthis.component = null;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will call the component update method and pass the params.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} params\r\n\t */\r\n\tupdate(params)\r\n\t{\r\n\t\tlet component = this.component;\r\n\t\tif(!component)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(typeof component.update === 'function')\r\n\t\t{\r\n\t\t\tcomponent.update(params);\r\n\t\t}\r\n\t}\r\n}", "import {builder} from '../layout/layout-builder.js';\r\nimport {Jot} from \"../component/jot.js\";\r\n\r\n/**\r\n * This will track previously loaded scripts and styles.\r\n */\r\nconst loaded = [];\r\n\r\n/**\r\n * This will check if a script or style has been loaded.\r\n *\r\n * @param {string} src\r\n * @return {bool}\r\n */\r\nconst isLoaded = (src) => loaded.indexOf(src) !== -1;\r\n\r\n/**\r\n * This will create a script atom.\r\n *\r\n * @param {object} props\r\n * @return {object}\r\n */\r\nconst Script = (props) => ({\r\n tag: 'script',\r\n src: props.src,\r\n async: false,\r\n load(e)\r\n {\r\n loaded.push(props.src);\r\n\r\n const callBack = props.load;\r\n if(callBack)\r\n {\r\n callBack();\r\n }\r\n }\r\n});\r\n\r\n/**\r\n * This will create a style atom.\r\n *\r\n * @param {object} props\r\n * @return {object}\r\n */\r\nconst Style = (props) => ({\r\n tag: 'link',\r\n rel: 'stylesheet',\r\n type: 'text/css',\r\n href: props.src,\r\n load(e)\r\n {\r\n loaded.push(props.src);\r\n\r\n const callBack = props.load;\r\n if(callBack)\r\n {\r\n callBack();\r\n }\r\n }\r\n});\r\n\r\n/**\r\n * Group\r\n *\r\n * This will setup a depends group to load all\r\n * dependencies before loaded the script.\r\n */\r\nclass Group\r\n{\r\n constructor(callBack)\r\n {\r\n this.percent = 0;\r\n this.loaded = 0;\r\n this.total = 0;\r\n this.callBack = callBack || null;\r\n }\r\n\r\n /**\r\n * This will add the resource to the document.\r\n *\r\n * @param {string} src\r\n */\r\n add(src)\r\n {\r\n this.total++;\r\n let atom;\r\n\r\n const load = this.update.bind(this);\r\n if(src.indexOf('.css') !== -1)\r\n {\r\n atom = Style({\r\n load,\r\n src\r\n });\r\n }\r\n else\r\n {\r\n atom = Script({\r\n load,\r\n src\r\n });\r\n }\r\n\r\n builder.build(atom, document.head);\r\n }\r\n\r\n /**\r\n * This will add the dependencies to the document.\r\n *\r\n * @param {array} files\r\n */\r\n addFiles(files)\r\n {\r\n if(!files)\r\n {\r\n return;\r\n }\r\n\r\n for(var i = 0, length = files.length; i < length; i++)\r\n {\r\n var src = files[i];\r\n if(!isLoaded(src))\r\n {\r\n this.add(src);\r\n }\r\n }\r\n }\r\n\r\n update()\r\n {\r\n const percent = this.updateProgress();\r\n if(percent >= 100)\r\n {\r\n var callBack = this.callBack;\r\n if(callBack)\r\n {\r\n callBack();\r\n }\r\n }\r\n }\r\n\r\n updateProgress()\r\n {\r\n ++this.loaded;\r\n return (this.percent = Math.floor(this.loaded / this.total * 100));\r\n }\r\n}\r\n\r\n/**\r\n * This will load the module.\r\n *\r\n * @param {string} src\r\n * @param {function} callBack\r\n * @return {object}\r\n */\r\nconst loadModule = (src, callBack) =>\r\n{\r\n import(src).then(module =>\r\n {\r\n if(callBack)\r\n {\r\n callBack(module);\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * This will check if an object is a contructor.\r\n *\r\n * @param {object|function} object\r\n * @returns {bool}\r\n */\r\nconst isConstructor = (object) =>\r\n{\r\n if(!object)\r\n {\r\n return false;\r\n }\r\n\r\n return (typeof object?.prototype?.constructor === 'function');\r\n};\r\n\r\n/**\r\n * This will render the module.\r\n *\r\n * @param {object} layout\r\n * @param {object} ele\r\n * @param {object} parent\r\n * @param {function} callBack\r\n * @return {object}\r\n */\r\nconst render = (layout, ele, parent) =>\r\n{\r\n const frag = builder.build(layout, null, parent);\r\n const firstChild = frag.firstChild;\r\n ele.after(frag);\r\n return firstChild;\r\n};\r\n\r\n/**\r\n * This will create a comment.\r\n *\r\n * @param {object} props\r\n * @returns {object}\r\n */\r\nconst Comment = (props) => ({\r\n tag: 'comment',\r\n text: 'import placeholder',\r\n onCreated: props.onCreated\r\n});\r\n\r\n/**\r\n * This will create an import wrapper component that\r\n * will wrap the comment atom to pass route to the\r\n * imported layout.\r\n *\r\n * @param {object} props\r\n * @returns {object}\r\n */\r\nconst ImportWrapper = Jot(\r\n{\r\n render()\r\n {\r\n return Comment(\r\n {\r\n onCreated: (ele) =>\r\n {\r\n const src = this.src;\r\n if(!src)\r\n {\r\n return;\r\n }\r\n\r\n /**\r\n * This will set up a resource group to load the\r\n * depends before the module.\r\n */\r\n if(this.depends)\r\n {\r\n const group = new Group(() =>\r\n {\r\n this.loadAndRender(ele);\r\n });\r\n\r\n group.addFiles(this.depends);\r\n return;\r\n }\r\n\r\n this.loadAndRender(ele);\r\n }\r\n });\r\n },\r\n\r\n /**\r\n * This will get the layout.\r\n *\r\n * @param {object} module\r\n * @returns {object|null}\r\n */\r\n getLayout(module)\r\n {\r\n let layout = module.default;\r\n if(!layout)\r\n {\r\n return null;\r\n }\r\n\r\n /**\r\n * This will check if the import is useing a custom\r\n * callback to set up the module.\r\n */\r\n const callBack = this.callBack;\r\n if(callBack)\r\n {\r\n layout = callBack(layout);\r\n }\r\n else\r\n {\r\n if(isConstructor(layout))\r\n {\r\n /**\r\n * This will set up the layout as a component and pass\r\n * the import props like persist and route.\r\n */\r\n layout = new layout();\r\n layout.route = this.route;\r\n\r\n if(this.persist)\r\n {\r\n layout.persist = true;\r\n }\r\n }\r\n else\r\n {\r\n /**\r\n * This will set up the layout as a n atom.\r\n */\r\n layout = layout();\r\n }\r\n }\r\n\r\n return (this.layout = layout);\r\n },\r\n\r\n /**\r\n * This will load the module and render the layout.\r\n *\r\n * @param {object} ele\r\n */\r\n loadAndRender(ele)\r\n {\r\n loadModule(this.src, (module) =>\r\n {\r\n this.loaded = true;\r\n const layout = this.layout || this.getLayout(module);\r\n this.layoutRoot = render(layout, ele, this.parent);\r\n });\r\n },\r\n\r\n /**\r\n * This will check if the layout should be updated.\r\n *\r\n * @param {object} layout\r\n * @returns {bool}\r\n */\r\n shouldUpdate(layout)\r\n {\r\n if(this.updateLayout === true)\r\n {\r\n return true;\r\n }\r\n\r\n return (this.updateLayout = (layout && layout.isUnit && typeof layout.update === 'function'));\r\n },\r\n\r\n /**\r\n * This will update the module layout.\r\n *\r\n * @param {object} params\r\n */\r\n updateModuleLayout(params)\r\n {\r\n const layout = this.layout;\r\n if(this.shouldUpdate(layout))\r\n {\r\n layout.update(params);\r\n }\r\n },\r\n\r\n /**\r\n * This will call if the import is added to a route. This will pass\r\n * the update params to the imported layout.\r\n *\r\n * @param {object} params\r\n */\r\n update(params)\r\n {\r\n if(this.loaded === true)\r\n {\r\n this.updateModuleLayout(params);\r\n }\r\n },\r\n\r\n /**\r\n * This will remove the imported layout when the\r\n * comment is being removed.\r\n *\r\n * @returns {void}\r\n */\r\n beforeDestroy()\r\n {\r\n if(!this.layoutRoot)\r\n {\r\n return;\r\n }\r\n\r\n builder.removeElement(this.layoutRoot);\r\n }\r\n});\r\n\r\n/**\r\n * This will import a module.\r\n *\r\n * @param {object} props\r\n * @returns {object}\r\n */\r\nexport const Import = (props) =>\r\n{\r\n return new ImportWrapper(props);\r\n};", "import {ComponentHelper} from './component-helper.js';\r\nimport {SimpleData} from '../data/data.js';\r\nimport {Import} from '../import/import.js';\r\n\r\n/**\r\n * This will setup a route uri pattern.\r\n *\r\n * @param {string} uri\r\n * @return {string}\r\n */\r\nconst routePattern = (uri) =>\r\n{\r\n\tlet uriQuery = \"\";\r\n\tif(uri)\r\n\t{\r\n\t\tlet filter = /\\//g;\r\n\t\turiQuery = uri.replace(filter, \"\\/\");\r\n\r\n\t\t/* this will setup for optional slashes before the optional params */\r\n\t\tlet optionalSlash = /(\\/):[^\\/(]*?\\?/g;\r\n\t\turiQuery = uriQuery.replace(optionalSlash, (str) =>\r\n\t\t{\r\n\t\t\tlet pattern = /\\//g;\r\n\t\t\treturn str.replace(pattern, '(?:$|\\/)');\r\n\t\t});\r\n\r\n\t\t/* this will setup for optional params and params\r\n\t\tand stop at the last slash or query start */\r\n\t\tlet param = /(:[^\\/?&($]+)/g;\r\n\t\tlet optionalParams = /(\\?\\/+\\*?)/g;\r\n\t\turiQuery = uriQuery.replace(optionalParams, '?\\/*');\r\n\t\turiQuery = uriQuery.replace(param, (str) =>\r\n\t\t{\r\n\t\t\treturn (str.indexOf('.') < 0)? '([^\\/|?]+)' : '([^\\/|?]+.*)';\r\n\t\t});\r\n\r\n\t\t/* we want to setup the wild card and param\r\n\t\tchecks to be modified to the route uri string */\r\n\t\tlet allowAll = /(\\*)/g;\r\n\t\turiQuery = uriQuery.replace(allowAll, '.*');\r\n\t}\r\n\r\n\t/* we want to set and string end if the wild card is not set */\r\n\turiQuery += (uri[uri.length - 1] === '*')? '' : '$';\r\n\treturn uriQuery;\r\n};\r\n\r\n/**\r\n * This will get the default route params.\r\n *\r\n * @param {array} params\r\n * @return {(object|null)}\r\n */\r\nconst getParamDefaults = (params) =>\r\n{\r\n\tif(params.length)\r\n\t{\r\n\t\tlet defaults = {};\r\n\t\tfor(var i = 0, length = params.length; i < length; i++)\r\n\t\t{\r\n\t\t\tdefaults[params[i]] = null;\r\n\t\t}\r\n\t\treturn defaults;\r\n\t}\r\n\treturn null;\r\n};\r\n\r\n/**\r\n * This will get the param keys from the uri.\r\n *\r\n * @param {string} uri\r\n * @return {array}\r\n */\r\nconst paramPattern = (uri) =>\r\n{\r\n\tlet params = [];\r\n\tif(!uri)\r\n\t{\r\n\t\treturn params;\r\n\t}\r\n\r\n\tlet filter = /[\\*?]/g;\r\n\turi = uri.replace(filter, '');\r\n\r\n\tlet pattern = /:(.[^.\\/?&($]+)\\?*/g,\r\n\tmatches = uri.match(pattern);\r\n\tif(matches === null)\r\n\t{\r\n\t\treturn params;\r\n\t}\r\n\r\n\tfor(var i = 0, maxLength = matches.length; i < maxLength; i++)\r\n\t{\r\n\t\tvar param = matches[i];\r\n\t\tif(param)\r\n\t\t{\r\n\t\t\tparam = param.replace(':', '');\r\n\t\t\tparams.push(param);\r\n\t\t}\r\n\t}\r\n\treturn params;\r\n};\r\n\r\nlet routeCount = 0;\r\n\r\n/**\r\n * Route\r\n *\r\n * This will create a route.\r\n * @class\r\n * @augments SimpleData\r\n */\r\nexport class Route extends SimpleData\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} settings\r\n\t */\r\n\tconstructor(settings)\r\n\t{\r\n\t\tlet uri = settings.baseUri;\r\n\r\n\t\tconst paramKeys = paramPattern(uri);\r\n\t\tlet params = getParamDefaults(paramKeys);\r\n\t\tsuper(params);\r\n\r\n\t\tthis.uri = uri;\r\n\t\tthis.paramKeys = paramKeys;\r\n\r\n\t\tthis.setupRoute(settings);\r\n\t\tthis.set('active', false);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the route settings.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} settings\r\n\t */\r\n\tsetupRoute(settings)\r\n\t{\r\n\t\tthis.id = settings.id || 'bs-rte-' + routeCount++;\r\n\r\n\t\tthis.path = null;\r\n\t\tthis.referralPath = null;\r\n\r\n\t\t/* route reg ex */\r\n\t\tlet uriMatch = routePattern(this.uri);\r\n\t\tthis.uriQuery = new RegExp('^' + uriMatch);\r\n\r\n\t\t/* params */\r\n\t\tthis.params = null;\r\n\r\n\t\t/* this will setup the template and route component\r\n\t\tif one has been set */\r\n\t\tthis.setupComponentHelper(settings);\r\n\r\n\t\tthis.callBack = settings.callBack;\r\n\t\tthis.title = settings.title;\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the route title.\r\n\t *\r\n\t * @param {string|function} title\r\n\t */\r\n\tsetTitle(title)\r\n\t{\r\n\t\tbase.router.updateTitle({\r\n\t\t\ttitle: title,\r\n\t\t\tstage: this.stage\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will deactivate the route.\r\n\t */\r\n\tdeactivate()\r\n\t{\r\n\t\tthis.set('active', false);\r\n\r\n\t\tlet controller = this.controller;\r\n\t\tif(controller)\r\n\t\t{\r\n\t\t\tcontroller.remove();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the route layout.\r\n\t *\r\n\t * @param {object} settings\r\n\t * @returns {object|null}\r\n\t */\r\n\tgetLayout(settings)\r\n\t{\r\n\t\tif(settings.component)\r\n\t\t{\r\n\t\t\treturn settings.component;\r\n\t\t}\r\n\r\n\t\tlet imported = settings.import;\r\n\t\tif(!imported)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tif(typeof imported === 'string')\r\n\t\t{\r\n\t\t\timported = {\r\n\t\t\t\tsrc: imported\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn Import(imported);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the route layout.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} settings\r\n\t */\r\n\tsetupComponentHelper(settings)\r\n\t{\r\n\t\tconst component = this.getLayout(settings);\r\n\t\tif(component)\r\n\t\t{\r\n\t\t\tlet {container, persist = false, parent} = settings;\r\n\r\n\t\t\tconst helperSettings =\r\n\t\t\t{\r\n\t\t\t\tcomponent,\r\n\t\t\t\tcontainer,\r\n\t\t\t\tpersist,\r\n\t\t\t\tparent\r\n\t\t\t};\r\n\t\t\tthis.controller = new ComponentHelper(this, helperSettings);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will resume the route.\r\n\t *\r\n\t * @param {object} container\r\n\t */\r\n\tresume(container)\r\n\t{\r\n\t\tlet controller = this.controller;\r\n\t\tif(controller)\r\n\t\t{\r\n\t\t\tcontroller.container = container;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the route path.\r\n\t *\r\n\t * @param {string} path\r\n\t * @param {string} referralPath\r\n\t */\r\n\tsetPath(path, referralPath)\r\n\t{\r\n\t\tthis.path = path;\r\n\t\tthis.referralPath = referralPath;\r\n\t}\r\n\r\n\t/**\r\n\t * This will select the route.\r\n\t */\r\n\tselect()\r\n\t{\r\n\t\tthis.set('active', true);\r\n\r\n\t\tlet params = this.stage,\r\n\t\tcallBack = this.callBack;\r\n\t\tif(typeof callBack === 'function')\r\n\t\t{\r\n\t\t\tcallBack(params);\r\n\t\t}\r\n\r\n\t\tlet controller = this.controller;\r\n\t\tif(controller)\r\n\t\t{\r\n\t\t\tcontroller.focus(params);\r\n\t\t}\r\n\r\n\t\tlet path = this.path;\r\n\t\tif(!path)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet hash = path.split('#')[1];\r\n\t\tif(!hash)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.scrollToId(hash);\r\n\t}\r\n\r\n\t/**\r\n\t * This will scroll to the element by id.\r\n\t *\r\n\t * @param {string} hash\r\n\t * @returns void\r\n\t */\r\n\tscrollToId(hash)\r\n\t{\r\n\t\tif(!hash)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet ele = document.getElementById(hash);\r\n\t\tif(!ele)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tele.scrollIntoView(true);\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if a route matches the path.\r\n\t *\r\n\t * @param {string} path\r\n\t * @return {(object|boolean)}\r\n\t */\r\n\tmatch(path)\r\n\t{\r\n\t\tlet matched = false;\r\n\r\n\t\t/* we want to check to use the supplied uri or get the\r\n\t\tcurrent uri if not setup */\r\n\t\tlet result = path.match(this.uriQuery);\r\n\t\tif(result === null)\r\n\t\t{\r\n\t\t\tthis.resetParams();\r\n\t\t\treturn matched;\r\n\t\t}\r\n\r\n\t\tif(result && typeof result === 'object')\r\n\t\t{\r\n\t\t\t/* this will remove the first match from the\r\n\t\t\tthe params */\r\n\t\t\tresult.shift();\r\n\t\t\tmatched = result;\r\n\t\t\t/* this will get the uri params of the route\r\n\t\t\tand if set will save them to the route */\r\n\t\t\tthis.setParams(result);\r\n\t\t}\r\n\r\n\t\treturn matched;\r\n\t}\r\n\r\n\t/**\r\n\t * This will reset the params.\r\n\t */\r\n\tresetParams()\r\n\t{\r\n\t\tthis.stage = {};\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the params.\r\n\t *\r\n\t * @param {object} values\r\n\t */\r\n\tsetParams(values)\r\n\t{\r\n\t\tif(values && typeof values === 'object')\r\n\t\t{\r\n\t\t\tlet keys = this.paramKeys;\r\n\t\t\tif(keys)\r\n\t\t\t{\r\n\t\t\t\tlet params = {};\r\n\t\t\t\tfor(var i = 0, maxL = keys.length; i < maxL; i++)\r\n\t\t\t\t{\r\n\t\t\t\t\tvar key = keys[i];\r\n\t\t\t\t\tif(typeof key !== 'undefined')\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tparams[key] = values[i];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tthis.set(params);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the params.\r\n\t *\r\n\t * @return {object}\r\n\t */\r\n\tgetParams()\r\n\t{\r\n\t\treturn this.stage;\r\n\t}\r\n}", "import {base} from '../../core.js';\r\n\r\n/**\r\n * History\r\n *\r\n * This will setup the history controller.\r\n * @class\r\n */\r\nexport class HistoryController\r\n{\r\n /**\r\n * This will check if browser based navigation is supported\r\n *\r\n * @returns boolean\r\n */\r\n static browserIsSupported()\r\n {\r\n return ('history' in window && 'pushState' in window.history);\r\n }\r\n\r\n /**\r\n * This will create a History Object based on navigation support\r\n *\r\n * @param {Router} router\r\n * @returns History\r\n */\r\n static setup(router)\r\n {\r\n if(HistoryController.browserIsSupported())\r\n {\r\n return new BrowserHistory(router).setup();\r\n }\r\n return new HashHistory(router).setup();\r\n }\r\n}\r\n\r\nlet routerNumber = 0;\r\n\r\n/**\r\n * History\r\n *\r\n * This will setup the history controller.\r\n * @class\r\n */\r\nclass History\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} router\r\n\t */\r\n\tconstructor(router)\r\n\t{\r\n\t\tthis.router = router;\r\n\t\tthis.locationId = 'base-app-router-' + routerNumber++;\r\n\t\tthis.callBack = this.check.bind(this);\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if the history api is supported\r\n\t * and add events.\r\n\t *\r\n\t * @return {object} a reference to the object.\r\n\t */\r\n\tsetup()\r\n\t{\r\n\t\tthis.addEvent();\r\n\t\treturn this;\r\n\t}\r\n}\r\n\r\nclass BrowserHistory extends History\r\n{\r\n\t/**\r\n\t * This will add the events.\r\n\t *\r\n\t * @return {object} a reference to the object.\r\n\t */\r\n\taddEvent()\r\n\t{\r\n\t\tbase.on('popstate', window, this.callBack);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the events.\r\n\t *\r\n\t * @return {object} a reference to the object.\r\n\t */\r\n\tremoveEvent()\r\n\t{\r\n\t\tbase.off('popstate', window, this.callBack);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check to activate the router.\r\n\t *\r\n\t * @param {object} evt\r\n\t */\r\n\tcheck(evt)\r\n\t{\r\n\t\t/* we want to check if the event has a state and if the\r\n\t\tstate location is from the background */\r\n\t\tlet state = evt.state;\r\n\t\tif(!state || state.location !== this.locationId)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tevt.preventDefault();\r\n\t\tevt.stopPropagation();\r\n\r\n\t\tthis.router.checkActiveRoutes(state.uri);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a state object.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @param {*} data\r\n\t * @return {object}\r\n\t */\r\n\tcreateState(uri, data)\r\n\t{\r\n\t\tlet stateObj = {\r\n\t\t\tlocation: this.locationId,\r\n\t\t\turi: uri\r\n\t\t};\r\n\r\n\t\tif(data && typeof data === 'object')\r\n\t\t{\r\n\t\t\tstateObj = Object.assign(stateObj, data);\r\n\t\t}\r\n\r\n\t\treturn stateObj;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a state to the history.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @param {object} data\r\n\t * @param {boolean} replace\r\n\t * @return {object} a reference to the object.\r\n\t */\r\n\taddState(uri, data, replace)\r\n\t{\r\n\t\tlet history = window.history,\r\n\t\tlastState = history.state;\r\n\r\n\t\tif(lastState && lastState.uri === uri)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tlet stateObj = this.createState(uri, data);\r\n\r\n\t\t/* this will check to push state or\r\n\t\treplace state */\r\n\t\treplace = (replace === true);\r\n\t\tlet method = (replace === false)? 'pushState' : 'replaceState';\r\n\t\thistory[method](stateObj, null, uri);\r\n\r\n\t\treturn this;\r\n\t}\r\n}\r\n\r\nclass HashHistory extends History\r\n{\r\n\t/**\r\n\t * This will add the events.\r\n\t *\r\n\t * @return {object} a reference to the object.\r\n\t */\r\n\taddEvent()\r\n\t{\r\n\t\tbase.on('hashchange', window, this.callBack);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the events.\r\n\t *\r\n\t * @return {object} a reference to the object.\r\n\t */\r\n\tremoveEvent()\r\n\t{\r\n\t\tbase.off('hashchange', window, this.callBack);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check to activate the router.\r\n\t *\r\n\t * @param {object} evt\r\n\t */\r\n\tcheck(evt)\r\n\t{\r\n\t\tthis.router.checkActiveRoutes(evt.newURL);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a state to the history.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @param {object} data\r\n\t * @param {boolean} replace\r\n\t * @return {object} a reference to the object.\r\n\t */\r\n\taddState(uri, data, replace)\r\n\t{\r\n\t\twindow.location.hash = uri;\r\n\r\n\t\treturn this;\r\n\t}\r\n}", "import {base} from '../../core.js';\r\nimport {Data} from '../data/data.js';\r\nexport {NavLink} from './nav-link.js';\r\nimport {Utils} from './utils.js';\r\nimport {Route} from './route.js';\r\nimport {HistoryController} from './history-controller.js';\r\n\r\n/* this will register the route system to the\r\ndata tracker to remove routes that have been\r\nnested in layouts. */\r\nbase.dataTracker.addType('routes', (data) =>\r\n{\r\n\tif(!data)\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\tconst route = data.route;\r\n\tif(route)\r\n\t{\r\n\t\trouter.removeRoute(route);\r\n\t}\r\n});\r\n\r\nbase.dataTracker.addType('switch', (data) =>\r\n{\r\n\tif(!data)\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\tlet id = data.id;\r\n\trouter.removeSwitch(id);\r\n});\r\n\r\n/**\r\n * Router\r\n *\r\n * This will create a browser router.\r\n * @class\r\n */\r\nexport class Router\r\n{\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {string} version\r\n\t\t */\r\n\t\tthis.version = '1.0.2';\r\n\r\n\t\t/* this is the root of the uri for the routing object\r\n\t\tand the base title */\r\n\t\tthis.baseURI = '/';\r\n\t\tthis.title = '';\r\n\r\n\t\tthis.lastPath = null;\r\n\t\tthis.path = null;\r\n\r\n\t\t/* this will be used to access our history object */\r\n\t\tthis.history = null;\r\n\t\tthis.callBackLink = null;\r\n\t\tthis.location = window.location;\r\n\r\n\t\t/* this will store each route added to the\r\n\t\trouter. */\r\n\t\tthis.routes = [];\r\n\t\tthis.switches = {};\r\n\t\tthis.switchCount = 0;\r\n\r\n\t\t/**\r\n\t\t * @member {object} data\r\n\t\t */\r\n\t\tthis.data = new Data(\r\n\t\t{\r\n\t\t\tpath: ''\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup our history object.\r\n\t */\r\n\tsetupHistory()\r\n\t{\r\n\t\tthis.history = HistoryController.setup(this);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a new route.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} settings\r\n\t * @return {object}\r\n\t */\r\n\tcreateRoute(settings)\r\n\t{\r\n\t\tlet uri = settings.uri || '*';\r\n\t\tsettings.baseUri = this.createURI(uri);\r\n\r\n\t\tlet route = new Route(settings);\r\n\t\treturn route;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a new route to the router.\r\n\t *\r\n\t * @param {object} settings\r\n\t * @return {object}\r\n\t */\r\n\tadd(settings)\r\n\t{\r\n\t\tif(typeof settings !== 'object')\r\n\t\t{\r\n\t\t\tlet args = arguments;\r\n\t\t\tsettings =\r\n\t\t\t{\r\n\t\t\t\turi: args[0],\r\n\t\t\t\tcomponent: args[1],\r\n\t\t\t\tcallBack: args[2],\r\n\t\t\t\ttitle: args[3],\r\n\t\t\t\tid: args[4],\r\n\t\t\t\tcontainer: args[5]\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tconst route = this.createRoute(settings);\r\n\t\tthis.addRoute(route);\r\n\t\treturn route;\r\n\t}\r\n\r\n\taddRoute(route)\r\n\t{\r\n\t\tthis.routes.push(route);\r\n\t\tthis.checkRoute(route, this.getPath());\r\n\t}\r\n\r\n\t/**\r\n\t * This will resume a route.\r\n\t *\r\n\t * @param {object} route\r\n\t * @param {object} container\r\n\t */\r\n\tresume(route, container)\r\n\t{\r\n\t\troute.resume(container);\r\n\t\tthis.addRoute(route);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the base path.\r\n\t *\r\n\t * @protected\r\n\t * @return {string}\r\n\t */\r\n\tgetBasePath()\r\n\t{\r\n\t\tif(!this.basePath)\r\n\t\t{\r\n\t\t\tlet pathURI = this.baseURI || '';\r\n\t\t\tif((pathURI[pathURI.length - 1] !== '/'))\r\n\t\t\t{\r\n\t\t\t\tpathURI += '/';\r\n\t\t\t}\r\n\t\t\tthis.basePath = pathURI;\r\n\t\t}\r\n\t\treturn this.basePath;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a uri.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} uri\r\n\t * @return {string}\r\n\t */\r\n\tcreateURI(uri)\r\n\t{\r\n\t\tlet baseUri = this.getBasePath();\r\n\t\treturn (baseUri + Utils.removeSlashes(uri));\r\n\t}\r\n\r\n\t/**\r\n\t * This will get a route by uri.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @return {(object|boolean)}\r\n\t */\r\n\tgetRoute(uri)\r\n\t{\r\n\t\tlet routes = this.routes,\r\n\t\tlength = routes.length;\r\n\t\tif(length > 0)\r\n\t\t{\r\n\t\t\tfor(var i = 0; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tvar route = routes[i];\r\n\t\t\t\tif(route.uri === uri)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn route;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get a route by id.\r\n\t *\r\n\t * @param {string} id\r\n\t * @return {(object|boolean)}\r\n\t */\r\n\tgetRouteById(id)\r\n\t{\r\n\t\tlet routes = this.routes,\r\n\t\tlength = routes.length;\r\n\t\tif(length > 0)\r\n\t\t{\r\n\t\t\tfor(var i = 0; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tvar route = routes[i];\r\n\t\t\t\tif(route.id === id)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn route;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a route.\r\n\t *\r\n\t * @param {object} route\r\n\t */\r\n\tremoveRoute(route)\r\n\t{\r\n\t\tlet routes = this.routes,\r\n\t\tindex = routes.indexOf(route);\r\n\t\tif(index > -1)\r\n\t\t{\r\n\t\t\troutes.splice(index, 1);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a switch.\r\n\t *\r\n\t * @param {array} group\r\n\t * @return {string} the switch id.\r\n\t */\r\n\taddSwitch(group)\r\n\t{\r\n\t\tlet id = this.switchCount++;\r\n\t\tlet switchArray = this.getSwitchGroup(id);\r\n\r\n\t\tfor(var i = 0, length = group.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar route = this.createRoute(group[i]);\r\n\t\t\tswitchArray.push(route);\r\n\t\t}\r\n\r\n\t\tthis.checkGroup(switchArray, this.getPath());\r\n\t\treturn id;\r\n\t}\r\n\r\n\t/**\r\n\t * This will resume a switch.\r\n\t *\r\n\t * @param {object} group\r\n\t * @param {object} container\r\n\t * @return {int} the switch id.\r\n\t */\r\n\tresumeSwitch(group, container)\r\n\t{\r\n\t\tlet id = this.switchCount++;\r\n\t\tlet switchArray = this.getSwitchGroup(id);\r\n\r\n\t\tfor(var i = 0, length = group.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar route = group[i].component.route;\r\n\t\t\troute.resume(container);\r\n\t\t\tswitchArray.push(route);\r\n\t\t}\r\n\r\n\t\tthis.checkGroup(switchArray, this.getPath());\r\n\t\treturn id;\r\n\t}\r\n\r\n\tgetSwitchGroup(id)\r\n\t{\r\n\t\treturn (this.switches[id] = []);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a switch by id.\r\n\t *\r\n\t * @param {string} id\r\n\t */\r\n\tremoveSwitch(id)\r\n\t{\r\n\t\tlet switches = this.switches;\r\n\t\tif(switches[id])\r\n\t\t{\r\n\t\t\tdelete switches[id];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a route by uri.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @return {object} a reference to the router object.\r\n\t */\r\n\tremove(uri)\r\n\t{\r\n\t\turi = this.createURI(uri);\r\n\r\n\t\tlet route = this.getRoute(uri);\r\n\t\tif(route !== false)\r\n\t\t{\r\n\t\t\tthis.removeRoute(route);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the router.\r\n\t *\r\n\t * @param {string} [baseURI]\r\n\t * @param {string} [title]\r\n\t * @return {object} a reference to the router object.\r\n\t */\r\n\tsetup(baseURI, title)\r\n\t{\r\n\t\tthis.baseURI = baseURI || '/';\r\n\t\tthis.updateBaseTag(this.baseURI);\r\n\t\tthis.title = (typeof title !== 'undefined')? title : '';\r\n\r\n\t\tthis.setupHistory();\r\n\r\n\t\tthis.data.set('path', this.getPath());\r\n\r\n\t\tthis.callBackLink = this.checkLink.bind(this);\r\n\t\tbase.on('click', document, this.callBackLink);\r\n\r\n\t\t/* this will route to the first url entered\r\n\t\twhen the router loads. this will fix the issue\r\n\t\tthat stopped the first endpoint from being\r\n\t\tadded to the history */\r\n\t\tlet endPoint = this.getEndPoint();\r\n\t\tthis.navigate(endPoint, null, true);\r\n\t\treturn this;\r\n\t}\r\n\r\n\tupdateBaseTag(url)\r\n\t{\r\n\t\t/* this will modify the base tag to ref from\r\n\t\tthe base url for all xhr */\r\n\t\tlet ele = document.getElementsByTagName('base');\r\n\t\tif(ele.length)\r\n\t\t{\r\n\t\t\tele[0].href = url;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the parent element link.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @return {(object|boolean)}\r\n\t */\r\n\tgetParentLink(ele)\r\n\t{\r\n\t\tlet target = ele.parentNode;\r\n\t\twhile(target !== null)\r\n\t\t{\r\n\t\t\tif(target.nodeName.toLowerCase() === 'a')\r\n\t\t\t{\r\n\t\t\t\treturn target;\r\n\t\t\t}\r\n\r\n\t\t\ttarget = target.parentNode;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if a link was routed.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} evt\r\n\t */\r\n\tcheckLink(evt)\r\n\t{\r\n\t\tif(evt.ctrlKey === true)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tlet target = evt.target || evt.srcElement;\r\n\t\tif(target.nodeName.toLowerCase() !== 'a')\r\n\t\t{\r\n\t\t\t/* this will check to get the parent to check\r\n\t\t\tif the child is contained in a link */\r\n\t\t\ttarget = this.getParentLink(target);\r\n\t\t\tif(target === false)\r\n\t\t\t{\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif(target.target === '_blank' || base.data(target, 'cancel-route'))\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tlet href = target.getAttribute('href');\r\n\t\tif(typeof href !== 'undefined')\r\n\t\t{\r\n\t\t\tlet baseUri = this.baseURI,\r\n\t\t\tpath = (baseUri !== '/')? href.replace(baseUri, '') : href;\r\n\t\t\tthis.navigate(path);\r\n\r\n\t\t\tevt.preventDefault();\r\n\t\t\tevt.stopPropagation();\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will reset the router.\r\n\t *\r\n\t * @return {object} a reference to the router object.\r\n\t */\r\n\treset()\r\n\t{\r\n\t\tthis.routes = [];\r\n\t\tthis.switches = [];\r\n\t\tthis.switchCount = 0;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check the active routes.\r\n\t *\r\n\t * @return {object} a reference to the router object.\r\n\t */\r\n\tactivate()\r\n\t{\r\n\t\tthis.checkActiveRoutes();\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will navigate the router.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @param {object} [data]\r\n\t * @param {boolean} [replace]\r\n\t * @return {object} a reference to the router object.\r\n\t */\r\n\tnavigate(uri, data, replace)\r\n\t{\r\n\t\turi = this.createURI(uri);\r\n\t\tthis.history.addState(uri, data, replace);\r\n\t\tthis.activate();\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the data path.\r\n\t * @protected\r\n\t */\r\n\tupdatePath()\r\n\t{\r\n\t\tlet path = this.getPath();\r\n\t\tthis.data.set('path', path);\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the title.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} route\r\n\t */\r\n\tupdateTitle(route)\r\n\t{\r\n\t\tif(!route || !route.title)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tlet getTitle = (title) =>\r\n\t\t{\r\n\t\t\t/* this will uppercase each word in a string\r\n\t\t\t@param (string) str = the string to uppercase\r\n\t\t\t@return (string) the uppercase string */\r\n\t\t\tlet toTitleCase = (str) =>\r\n\t\t\t{\r\n\t\t\t\tlet pattern = /\\w\\S*/;\r\n\t\t\t\treturn str.replace(pattern, (txt) =>\r\n\t\t\t\t{\r\n\t\t\t\t\treturn txt.charAt(0).toUpperCase() + txt.substring(1).toLowerCase();\r\n\t\t\t\t});\r\n\t\t\t};\r\n\r\n\r\n\t\t\t/* this will replace the params in the title\r\n\t\t\t@param (string) str = the route title\r\n\t\t\t@return (string) the title string */\r\n\t\t\tlet replaceParams = (str) =>\r\n\t\t\t{\r\n\t\t\t\tif(str.indexOf(':') > -1)\r\n\t\t\t\t{\r\n\t\t\t\t\tlet params = route.stage;\r\n\t\t\t\t\tfor(var prop in params)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif(params.hasOwnProperty(prop))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tvar param = params[prop],\r\n\t\t\t\t\t\t\tpattern = new RegExp(':' + prop, 'gi');\r\n\t\t\t\t\t\t\tstr = str.replace(pattern, param);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn str;\r\n\t\t\t};\r\n\r\n\t\t\tif(title)\r\n\t\t\t{\r\n\t\t\t\tif(typeof title === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\ttitle = title(route.stage);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/* we want to replace any params in the title\r\n\t\t\t\tand uppercase the title */\r\n\t\t\t\ttitle = replaceParams(title);\r\n\t\t\t\ttitle = toTitleCase(title);\r\n\r\n\t\t\t\t/* we want to check to add the base title to the\r\n\t\t\t\tto the end of the title */\r\n\t\t\t\tif(this.title !== '')\r\n\t\t\t\t{\r\n\t\t\t\t\ttitle += \" - \" + this.title;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn title;\r\n\t\t};\r\n\r\n\t\tlet title = route.title;\r\n\t\tdocument.title = getTitle(title);\r\n\t}\r\n\r\n\t/**\r\n\t * This will check the routes to match the path.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} [path]\r\n\t */\r\n\tcheckActiveRoutes(path)\r\n\t{\r\n\t\tthis.lastPath = path;\r\n\r\n\t\tpath = path || this.getPath();\r\n\t\tthis.path = path;\r\n\r\n\t\tlet routes = this.routes,\r\n\t\tlength = routes.length;\r\n\r\n\t\tlet route;\r\n\t\tfor(var i = 0; i < length; i++)\r\n\t\t{\r\n\t\t\troute = routes[i];\r\n\t\t\tif(typeof route === 'undefined')\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tthis.checkRoute(route, path);\r\n\t\t}\r\n\r\n\t\tthis.checkSwitches(path);\r\n\t\tthis.updatePath();\r\n\t}\r\n\r\n\t/**\r\n\t * This will check the switches to match the path.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} [path]\r\n\t */\r\n\tcheckSwitches(path)\r\n\t{\r\n\t\tlet switches = this.switches;\r\n\t\tfor(var id in switches)\r\n\t\t{\r\n\t\t\tif(switches.hasOwnProperty(id) === false)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tvar group = switches[id];\r\n\t\t\tthis.checkGroup(group, path);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will check a group to match a path.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} group\r\n\t * @param {string} path\r\n\t */\r\n\tcheckGroup(group, path)\r\n\t{\r\n\t\tlet check = false,\r\n\t\troute, firstRoute, lastSelected, selected, hasController = false;\r\n\r\n\t\tfor(var i = 0, length = group.length; i < length; i++)\r\n\t\t{\r\n\t\t\troute = group[i];\r\n\t\t\tif(typeof route === 'undefined')\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t/* we want to save the first route in the switch\r\n\t\t\tso it can be selected if no route is active */\r\n\t\t\tif(i === 0)\r\n\t\t\t{\r\n\t\t\t\tfirstRoute = route;\r\n\t\t\t}\r\n\r\n\t\t\tif(!lastSelected && route.get('active'))\r\n\t\t\t{\r\n\t\t\t\tlastSelected = route;\r\n\t\t\t}\r\n\r\n\t\t\tif(check !== false)\r\n\t\t\t{\r\n\t\t\t\tif(hasController)\r\n\t\t\t\t{\r\n\t\t\t\t\troute.deactivate();\r\n\t\t\t\t}\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t/* we will break the loop on the first match */\r\n\t\t\tcheck = route.match(path);\r\n\t\t\tif(check !== false)\r\n\t\t\t{\r\n\t\t\t\tselected = route;\r\n\r\n\t\t\t\tif(route.controller)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.select(route);\r\n\t\t\t\t\thasController = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif(selected === undefined)\r\n\t\t{\r\n\t\t\tthis.select(firstRoute);\r\n\r\n\t\t\tif(lastSelected && firstRoute !== lastSelected)\r\n\t\t\t{\r\n\t\t\t\tlastSelected.deactivate();\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif(lastSelected)\r\n\t\t\t{\r\n\t\t\t\tif(hasController && selected !== lastSelected)\r\n\t\t\t\t{\r\n\t\t\t\t\tlastSelected.deactivate();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if(firstRoute && hasController === false)\r\n\t\t\t{\r\n\t\t\t\tthis.select(firstRoute);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if a route matches the path.\r\n\t *\r\n\t * @param {object} route\r\n\t * @param {string} path\r\n\t * @return {boolean}\r\n\t */\r\n\tcheckRoute(route, path)\r\n\t{\r\n\t\tlet check = this.check(route, path);\r\n\t\tif(check !== false)\r\n\t\t{\r\n\t\t\tthis.select(route);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\troute.deactivate();\r\n\t\t}\r\n\t\treturn check;\r\n\t}\r\n\r\n\t/**\r\n\t * This will select a route if the route matches the path.\r\n\t *\r\n\t * @param {object} route\r\n\t * @param {string} [path]\r\n\t */\r\n\tcheck(route, path)\r\n\t{\r\n\t\t/* we want to check if the route has been\r\n\t\tdeleted from the routes */\r\n\t\tif(!route)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to check to use the supplied uri or get the\r\n\t\tcurrent uri if not setup */\r\n\t\tpath = path || this.getPath();\r\n\r\n\t\t/* we want to check if the route uri matches the path uri */\r\n\t\treturn (route.match(path) !== false);\r\n\t}\r\n\r\n\t/**\r\n\t * This will select the route.\r\n\t *\r\n\t * @param {object} route\r\n\t */\r\n\tselect(route)\r\n\t{\r\n\t\tif(!route)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\troute.setPath(this.path, this.lastPath);\r\n\t\troute.select();\r\n\t\tthis.updateTitle(route);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the endpoint.\r\n\t *\r\n\t * @return {string}\r\n\t */\r\n\tgetEndPoint()\r\n\t{\r\n\t\tlet path = this.getPath();\r\n\t\treturn (path.replace(this.baseURI, '') || '/');\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the router events.\r\n\t */\r\n\tdestroy()\r\n\t{\r\n\t\tbase.off('click', document, this.callBackLink);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the location pathname.\r\n\t *\r\n\t * @return {string}\r\n\t */\r\n\tgetPath()\r\n\t{\r\n\t\t/* we want to get the window location path */\r\n\t\tlet location = this.location,\r\n\t\tpath = this.path = location.pathname;\r\n\r\n\t\tif(this.history.type === 'hash')\r\n\t\t{\r\n\t\t\treturn location.hash.replace('#', '');\r\n\t\t}\r\n\r\n\t\treturn path + location.search + location.hash;\r\n\t}\r\n}\r\n\r\nexport const router = new Router();", "import {Objects} from \"../../shared/objects.js\";\r\n\r\n/**\r\n * Atom\r\n *\r\n * This will create an interface for atoms to\r\n * extend from a parent atom.\r\n * @class\r\n */\r\nexport const Atom = function()\r\n{\r\n\r\n};\r\n\r\n/**\r\n * This will extend the atom to a child atom.\r\n * @static\r\n * @param {(object|function)}\r\n * @return {function} The child atom constructor.\r\n */\r\nAtom.extend = function extend(childLayout)\r\n{\r\n\tlet parent = this;\r\n\r\n\t/*\r\n\tthis will setup a layout function to call to standardize\r\n\tthe interface for non function atoms.\r\n\t*/\r\n\tif(typeof childLayout === 'object')\r\n\t{\r\n\t\tlet layoutObject = childLayout;\r\n\t\tchildLayout = (props) =>\r\n\t\t{\r\n\t\t\treturn Objects.cloneObject(layoutObject);\r\n\t\t};\r\n\t}\r\n\r\n\tconst child = (props = {}) =>\r\n\t{\r\n\t\tprops = props || {};\r\n\t\tlet layout = childLayout(props),\r\n\r\n\t\t// we want to check to merge the layout with the parent layout\r\n\t\tparentLayout = parent(props);\r\n\t\tif(typeof parentLayout === 'object')\r\n\t\t{\r\n\t\t\tlayout = Objects.extendObject(parentLayout, layout);\r\n\t\t}\r\n\t\treturn layout;\r\n\t};\r\n\r\n\tchild.extend = extend;\r\n\treturn child;\r\n};", "import {base} from './core.js';\r\nimport {ajax} from './modules/ajax/ajax.js';\r\nimport {dataBinder} from './modules/data-binder/data-binder.js';\r\nimport {Data, SimpleData, Model} from './modules/data/data.js';\r\nimport {state} from './modules/state/state.js';\r\nimport {router, NavLink} from './modules/router/router.js';\r\nimport {builder} from './modules/layout/layout-builder.js';\r\nimport {Unit, Component, Jot, Watch} from './modules/component/component.js';\r\nimport {Atom} from './modules/atom/atom.js';\r\n\r\nbase.augment(\r\n{\r\n ajax,\r\n dataBinder,\r\n Data,\r\n SimpleData,\r\n Model,\r\n state,\r\n builder,\r\n router,\r\n Component\r\n});\r\n\r\nexport {\r\n base,\r\n ajax,\r\n dataBinder,\r\n Data,\r\n SimpleData,\r\n Model,\r\n state,\r\n builder,\r\n router,\r\n Unit,\r\n Component,\r\n Jot,\r\n Watch,\r\n NavLink,\r\n Atom\r\n};\r\n\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["\r\nexport const Objects =\r\n{\r\n /**\r\n\t * This will create a new object.\r\n\t *\r\n\t * @param {object} [object] An object to extend.\r\n\t * @return {object}\r\n\t */\r\n\tcreateObject(object)\r\n\t{\r\n\t\treturn Object.create(object);\r\n\t},\r\n\r\n\t/**\r\n\t * This will extend an object to another object.\r\n\t *\r\n\t * @param {(function|object)} sourceObj\r\n\t * @param {(function|object)} targetObj\r\n\t * @return {object}\r\n\t */\r\n\textendObject(sourceObj, targetObj)\r\n\t{\r\n\t\tif(typeof sourceObj === 'undefined' || typeof targetObj === 'undefined')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tfor(var property in sourceObj)\r\n\t\t{\r\n\t\t\tif(sourceObj.hasOwnProperty(property) && typeof targetObj[property] === 'undefined')\r\n\t\t\t{\r\n\t\t\t\ttargetObj[property] = sourceObj[property];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn targetObj;\r\n\t},\r\n\r\n\t/**\r\n\t * This will clone an object.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @return {object}\r\n\t */\r\n\tcloneObject(obj)\r\n\t{\r\n\t\tif(!obj)\r\n\t\t{\r\n\t\t\treturn {};\r\n\t\t}\r\n\r\n\t\treturn JSON.parse(JSON.stringify(obj));\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the class prototype.\r\n\t *\r\n\t * @param {(function|object)} object\r\n\t * @return {object}\r\n\t */\r\n\t_getClassObject(object)\r\n\t{\r\n\t\treturn (typeof object === 'function')? object.prototype : object;\r\n\t},\r\n\r\n\t/**\r\n\t * This will extend an object to another object.\r\n\t *\r\n\t * @param {(function|object)} sourceClass\r\n\t * @param {(function|object)} targetClass\r\n\t * @return {object}\r\n\t */\r\n\textendClass(sourceClass, targetClass)\r\n\t{\r\n\t\t/* if we are using a class constructor function\r\n\t\twe want to get the class prototype object */\r\n\t\tlet source = this._getClassObject(sourceClass),\r\n\t\ttarget = this._getClassObject(targetClass);\r\n\r\n\t\tif(typeof source !== 'object' || typeof target !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to create a new object and add the source\r\n\t\tprototype to the new object */\r\n\t\tlet obj = Object.create(source);\r\n\r\n\t\t/* we want to add any additional properties from the\r\n\t\ttarget class to the new object */\r\n\t\tfor(var prop in target)\r\n\t\t{\r\n\t\t\tobj[prop] = target[prop];\r\n\t\t}\r\n\r\n\t\treturn obj;\r\n\t}\r\n};", "/**\r\n * TrackerTypes\r\n *\r\n * This will add and remove tracker types to the data tracker.\r\n *\r\n */\r\nconst TrackerTypes =\r\n{\r\n /**\r\n * @member {object} The Type and callBack that is called\r\n * when the type is removed from the object.\r\n */\r\n types: {},\r\n\r\n /**\r\n * This will add a type.\r\n * @param {string} type\r\n * @param {function} callBack The function to call when an object\r\n * is having the type removed.\r\n */\r\n add(type, callBack)\r\n {\r\n this.types[type] = callBack;\r\n },\r\n\r\n /**\r\n * This will get a type or return false.\r\n * @param {string} type\r\n * @return {(function|boolean)} The callBack or false.\r\n */\r\n get(type)\r\n {\r\n return this.types[type] || false;\r\n },\r\n\r\n /**\r\n * This will remove a type.\r\n * @param {string} type\r\n */\r\n remove(type)\r\n {\r\n delete this.types[type];\r\n }\r\n};\r\n\r\n/**\r\n * Tracker\r\n *\r\n * This will create a tracker for an object that will\r\n * store each type added and the data stored to\r\n * each type.\r\n *\r\n * @class\r\n */\r\nclass Tracker\r\n{\r\n /**\r\n * @constructor\r\n */\r\n constructor()\r\n {\r\n /**\r\n * @member {object} types\r\n */\r\n this.types = {};\r\n }\r\n\r\n /**\r\n * This will add data to a type.\r\n *\r\n * @public\r\n * @param {string} addingType The type of data.\r\n * @param {*} data The data to store\r\n */\r\n add(addingType, data)\r\n {\r\n let type = this.types[addingType] || (this.types[addingType] = []);\r\n type.push(data);\r\n }\r\n\r\n /**\r\n * This will get all the data stored to a data type.\r\n * @param {string} type\r\n * @return {*|boolean} the data or false.\r\n */\r\n get(type)\r\n {\r\n return this.types[type] || false;\r\n }\r\n\r\n /**\r\n * This will call the callBack with the data.\r\n *\r\n * @private\r\n * @param {function} callBack\r\n * @param {*} data\r\n */\r\n removeByCallBack(callBack, data)\r\n {\r\n if(typeof callBack === 'function')\r\n {\r\n callBack(data);\r\n }\r\n }\r\n\r\n /**\r\n * This will remove the data by type.\r\n *\r\n * @private\r\n * @param {string} removingType\r\n */\r\n removeType(removingType)\r\n {\r\n let types = this.types;\r\n if(types)\r\n {\r\n let type = types[removingType];\r\n if(type.length)\r\n {\r\n let data,\r\n callBack = TrackerTypes.get(removingType);\r\n for(var i = 0, length = type.length; i < length; i++)\r\n {\r\n data = type[i];\r\n if(data)\r\n {\r\n // this will stop any circular referrences\r\n type[i] = null;\r\n\r\n this.removeByCallBack(callBack, data);\r\n }\r\n }\r\n delete types[type];\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * This will remove the data by type or all if no type is\r\n * set.\r\n *\r\n * @public\r\n * @param {string} [type]\r\n */\r\n remove(type)\r\n {\r\n if(type)\r\n {\r\n this.removeType(type);\r\n }\r\n else\r\n {\r\n let types = this.types;\r\n for(var prop in types)\r\n {\r\n if(types.hasOwnProperty(prop))\r\n {\r\n type = types[prop];\r\n if(!type)\r\n {\r\n continue;\r\n }\r\n\r\n this.removeType(prop);\r\n }\r\n }\r\n\r\n delete this.types;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * DataTracker\r\n *\r\n * This will add data tracking for objects. The DataTracker is\r\n * a single point where any data can be tracked to an object\r\n * or element. Modules can register types to store their own\r\n * data that can allow the data to be removed when the element\r\n * is removed.\r\n *\r\n * @class\r\n */\r\nexport class DataTracker\r\n{\r\n /**\r\n * @constructor\r\n */\r\n constructor()\r\n {\r\n /**\r\n * @private\r\n * @member trackers This is an object that stores all tracker\r\n * objects by tracking id.\r\n */\r\n this.trackers = {};\r\n\r\n /**\r\n * @private\r\n * @member {int} trackingCount\r\n */\r\n this.trackingCount = 0;\r\n }\r\n\r\n /**\r\n * This will add a new type to the data tracker.\r\n *\r\n * @public\r\n * @param {string} type The new type.\r\n * @param {function} callBack The callBack to help clean\r\n * up data when removed.\r\n */\r\n addType(type, callBack)\r\n {\r\n TrackerTypes.add(type, callBack);\r\n }\r\n\r\n /**\r\n * This will remove a type from the data tracker.\r\n * @param {string} type\r\n */\r\n removeType(type)\r\n {\r\n TrackerTypes.remove(type);\r\n }\r\n\r\n /**\r\n * This will get the object tracking id or set it if\r\n * not set.\r\n *\r\n * @param {object} obj\r\n * @return {string}\r\n */\r\n getTrackingId(obj)\r\n {\r\n return obj.trackingId || (obj.trackingId = 'dt' + this.trackingCount++);\r\n }\r\n\r\n /**\r\n * This will add data to an object.\r\n *\r\n * @param {object} obj\r\n * @param {string} type The type name.\r\n * @param {*} data The data to track.\r\n */\r\n add(obj, type, data)\r\n {\r\n const id = this.getTrackingId(obj),\r\n tracker = this.find(id);\r\n\r\n tracker.add(type, data);\r\n }\r\n\r\n /**\r\n * This will get the data from a type or the tracker object\r\n * if type is not set.\r\n *\r\n * @param {object} obj\r\n * @param {string} [type]\r\n * @return {*}\r\n */\r\n get(obj, type)\r\n {\r\n const id = obj.trackingId;\r\n let tracker = this.trackers[id];\r\n if(!tracker)\r\n {\r\n return false;\r\n }\r\n\r\n return (type)? tracker.get(type) : tracker;\r\n }\r\n\r\n /**\r\n * This will get the tracker or create a new tracker\r\n * if no tracker is set.\r\n *\r\n * @param {string} id\r\n * @return {object} The tracker.\r\n */\r\n find(id)\r\n {\r\n let trackers = this.trackers;\r\n return (trackers[id] || (trackers[id] = new Tracker()));\r\n }\r\n\r\n /**\r\n\t * This will check if an object is empty.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @return {boolean}\r\n\t */\r\n\tisEmpty(obj)\r\n\t{\r\n\t\tif(!obj || typeof obj !== 'object')\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t/* we want to loop through each property and\r\n\t\tcheck if it belongs to the object directly */\r\n\t\tfor(var key in obj)\r\n\t\t{\r\n\t\t\tif(obj.hasOwnProperty(key))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n /**\r\n * This will remove a type or all data for an object if\r\n * no type is set.\r\n *\r\n * @param {object} obj\r\n * @param {stirng} [type]\r\n */\r\n remove(obj, type)\r\n {\r\n const id = obj.trackingId;\r\n if(!id)\r\n {\r\n return true;\r\n }\r\n\r\n let tracker = this.trackers[id];\r\n if(!tracker)\r\n {\r\n return false;\r\n }\r\n\r\n if(type)\r\n {\r\n tracker.remove(type);\r\n\r\n /* this will remove the msg from the elements\r\n if no elements are listed under the msg */\r\n if(this.isEmpty(tracker.types))\r\n {\r\n delete this.trackers[id];\r\n }\r\n }\r\n else\r\n {\r\n tracker.remove();\r\n\r\n delete this.trackers[id];\r\n }\r\n }\r\n}", "/**\r\n * Base Framework\r\n * @version 2.6.0\r\n * @author Chris Durfee\r\n * @file This is a javascript framework to allow complex\r\n * functions to work in many browsers and versions.\r\n */\r\n\r\n import {Objects} from './shared/objects.js';\r\n import {DataTracker} from './data-tracker.js';\r\n\r\nconst global = window;\r\n\r\n/**\r\n * base framework constructor\r\n * @class\r\n */\r\nclass Base\r\n{\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {string} version\r\n\t\t */\r\n\t\tthis.version = '2.6.0';\r\n\r\n\t\t/**\r\n\t\t * @member {array} errors\r\n\t\t */\r\n\t\tthis.errors = [];\r\n\r\n\t\t/**\r\n\t\t * @member {object} dataTracker\r\n\t\t */\r\n\t\tthis.dataTracker = new DataTracker();\r\n\t}\r\n\r\n\t/**\r\n\t * this will augement the base framework with new functionality.\r\n\t *\r\n\t * @param {object} methods The new methods to add.\r\n\t * @return {object} An instance of base.\r\n\t */\r\n\taugment(methods)\r\n\t{\r\n\t\tif(!methods || typeof methods !== 'object')\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tconst prototype = this.constructor.prototype;\r\n\t\tfor(var property in methods)\r\n\t\t{\r\n\t\t\tif(methods.hasOwnProperty(property))\r\n\t\t\t{\r\n\t\t\t\tprototype[property] = methods[property];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will convert a nodelist into an array.\r\n\t *\r\n\t * @param {object} list\r\n\t * @return {array}\r\n\t */\r\n\tlistToArray(list)\r\n\t{\r\n\t\treturn Array.prototype.slice.call(list);\r\n\t}\r\n\r\n\t/**\r\n\t * This will override a method function with a new function.\r\n\t *\r\n\t * @param {object} obj The object being modified.\r\n\t * @param {string} methodName the method name being overriden.\r\n\t * @param {function} overrideMethod The new function to call.\r\n\t * @param {array} args The args to pass to the first function call.\r\n\t *\r\n\t * @return {*} The results of the function being called.\r\n\t */\r\n\toverride(obj, methodName, overrideMethod, args)\r\n\t{\r\n\t\treturn (obj[methodName] = overrideMethod).apply(obj, this.listToArray(args));\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the last error.\r\n\t * @return {(object|boolean)} The last error or false.\r\n\t */\r\n\tgetLastError()\r\n\t{\r\n\t\tconst errors = this.errors;\r\n\t\treturn (errors.length)? errors.pop() : false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an error.\r\n\t *\r\n\t * @param {object} err\r\n\t */\r\n\taddError(err)\r\n\t{\r\n\t\tthis.errors.push(err);\r\n\t}\r\n\r\n\t/**\r\n\t * This will parse a query string.\r\n\t *\r\n\t * @param {string} [str] The string to parse or the global\r\n\t * location will be parsed.\r\n\t * @param {bool} [decode]\r\n\t * @return {object}\r\n\t */\r\n\tparseQueryString(str, decode)\r\n\t{\r\n\t\tif(typeof str !== 'string')\r\n\t\t{\r\n\t\t\tstr = global.location.search;\r\n\t\t}\r\n\r\n\t\tlet objURL = {},\r\n\t\tregExp = /([^?=&]+)(=([^&]*))?/g;\r\n\t\tstr.replace(regExp, function(a, b, c, d)\r\n\t\t{\r\n\t\t\t/* we want to save the key and the\r\n\t\t\tvalue to the objURL */\r\n\t\t\tobjURL[b] = (decode !== false)? decodeURIComponent(d) : d;\r\n\t\t});\r\n\r\n\t\treturn objURL;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if an object is empty.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @return {boolean}\r\n\t */\r\n\tisEmpty(obj)\r\n\t{\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t/* we want to loop through each property and\r\n\t\tcheck if it belongs to the object directly */\r\n\t\tfor(var key in obj)\r\n\t\t{\r\n\t\t\tif(obj.hasOwnProperty(key))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * This will select an element by id.\r\n\t *\r\n\t * @param {string} id\r\n\t * @return {(object|boolean)} The element object or false.\r\n\t */\r\n\tgetById(id)\r\n\t{\r\n\t\tif(typeof id !== 'string')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tlet obj = document.getElementById(id);\r\n\t\treturn (obj || false);\r\n\t}\r\n\r\n\t/**\r\n\t * This will select elements by name.\r\n\t *\r\n\t * @param {string} name\r\n\t * @return {(object|boolean)} The elements array or false.\r\n\t */\r\n\tgetByName(name)\r\n\t{\r\n\t\tif(typeof name !== 'string')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tlet obj = document.getElementsByName(name);\r\n\t\treturn (obj)? this.listToArray(obj) : false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will select by css selector.\r\n\t *\r\n\t * @param {string} selector\r\n\t * @param {boolean} single Set to true if you only want one result.\r\n\t * @return {*}\r\n\t */\r\n\tgetBySelector(selector, single)\r\n\t{\r\n\t\tif(typeof selector !== 'string')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to check if we are only selecting\r\n\t\tthe first element or all elements */\r\n\t\tsingle = single || false;\r\n\t\tif(single === true)\r\n\t\t{\r\n\t\t\tlet obj = document.querySelector(selector);\r\n\t\t\treturn (obj || false);\r\n\t\t}\r\n\r\n\t\tlet elements = document.querySelectorAll(selector);\r\n\t\tif(elements)\r\n\t\t{\r\n\t\t\t/* if there is only one result just return the\r\n\t\t\tfirst element in the node list */\r\n\t\t\treturn (elements.length === 1)? elements[0] : this.listToArray(elements);\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get or set the innerHTML or an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} [html] If the html is not set, the html of the\r\n\t * element will be returned.\r\n\t *\r\n\t * @return {(string|void)}\r\n\t */\r\n\thtml(obj, html)\r\n\t{\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to check if we are getting the\r\n\t\thtml or adding the html */\r\n\t\tif(this.isUndefined(html) === false)\r\n\t\t{\r\n\t\t\tobj.innerHTML = html;\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\treturn obj.innerHTML;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the css property of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} value\r\n\t * @return {object} an instance of base.\r\n\t */\r\n\tsetCss(obj, property, value)\r\n\t{\r\n\t\tif(this.isObject(obj) === false || this.isUndefined(property))\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tproperty = this.uncamelCase(property);\r\n\t\tobj.style[property] = value;\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the css property of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @return {(string|null)}\r\n\t */\r\n\tgetCss(obj, property)\r\n\t{\r\n\t\tif(!obj || typeof property === 'undefined')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tproperty = this.uncamelCase(property);\r\n\t\tvar css = obj.style[property];\r\n\t\tif(css !== '')\r\n\t\t{\r\n\t\t\treturn css;\r\n\t\t}\r\n\r\n\t\t/* we want to check if we have an inherited\r\n\t\tvalue */\r\n\t\tvar currentValue = null,\r\n\t\tcurrentStyle = obj.currentStyle;\r\n\t\tif(currentStyle && (currentValue = currentStyle[property]))\r\n\t\t{\r\n\t\t\tcss = currentValue;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tvar inheritedStyle = window.getComputedStyle(obj, null);\r\n\t\t\tif(inheritedStyle)\r\n\t\t\t{\r\n\t\t\t\tcss = inheritedStyle[property];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn css;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get or set the css propety or an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} [value]\r\n\t * @return {(string|void)}\r\n\t */\r\n\tcss(obj, property, value)\r\n\t{\r\n\t\t/* we want to check if we are getting the\r\n\t\tvalue or setting the value */\r\n\t\tif(typeof value !== 'undefined')\r\n\t\t{\r\n\t\t\tthis.setCss(obj, property, value);\r\n\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\treturn this.getCss(obj, property);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an attribute from an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @return {object} an instance of base.\r\n\t */\r\n\tremoveAttr(obj, property)\r\n\t{\r\n\t\tif(this.isObject(obj))\r\n\t\t{\r\n\t\t\tobj.removeAttribute(property);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set an attribute of an element.\r\n\t *\r\n\t * @private\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} value\r\n\t * @return {void}\r\n\t */\r\n\tsetAttr(obj, property, value)\r\n\t{\r\n\t\tobj.setAttribute(property, value);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get an attribute of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @return {string}\r\n\t */\r\n\tgetAttr(obj, property)\r\n\t{\r\n\t\treturn obj.getAttribute(property);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get or set an attribute from an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} [value]\r\n\t * @return {(string|void)}\r\n\t */\r\n\tattr(obj, property, value)\r\n\t{\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to check if we are getting the\r\n\t\tvalue or setting the value */\r\n\t\tif(typeof value !== 'undefined')\r\n\t\t{\r\n\t\t\t/* we want to check to set the value */\r\n\t\t\tthis.setAttr(obj, property, value);\r\n\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\treturn this.getAttr(obj, property);\r\n\t}\r\n\r\n\t/**\r\n\t * This will prefix a string with \"data-\" if not set.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} prop\r\n\t * @return {string}\r\n\t */\r\n\t_checkDataPrefix(prop)\r\n\t{\r\n\t\tif(typeof prop !== 'string')\r\n\t\t{\r\n\t\t\treturn prop;\r\n\t\t}\r\n\r\n\t\t/* we want to de camelcase if set */\r\n\t\tprop = base.uncamelCase(prop);\r\n\t\tif(prop.substring(0, 5) !== 'data-')\r\n\t\t{\r\n\t\t\tprop = 'data-' + prop;\r\n\t\t}\r\n\r\n\t\treturn prop;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove \"data-\" from a string.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} prop\r\n\t * @return {string}\r\n\t */\r\n\t_removeDataPrefix(prop)\r\n\t{\r\n\t\tif(typeof prop === 'string' && prop.substring(0, 5) === 'data-')\r\n\t\t{\r\n\t\t\tprop = prop.substring(5);\r\n\t\t}\r\n\t\treturn prop;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set data to an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} value\r\n\t */\r\n\tsetData(obj, property, value)\r\n\t{\r\n\t\t/* this will return the property without the data prefix */\r\n\t\tproperty = this._removeDataPrefix(property);\r\n\t\tproperty = base.camelCase(property);\r\n\r\n\t\tobj.dataset[property] = value;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get data from an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} value\r\n\t * @return {string}\r\n\t */\r\n\tgetData(obj, property)\r\n\t{\r\n\t\tproperty = base.camelCase(this._removeDataPrefix(property));\r\n\t\treturn obj.dataset[property];\r\n\t}\r\n\r\n\t/**\r\n\t * This will get or set data to an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} [value]\r\n\t * @return {(string|void)}\r\n\t */\r\n\tdata(obj, property, value)\r\n\t{\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(typeof value !== 'undefined')\r\n\t\t{\r\n\t\t\tthis.setData(obj, property, value);\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\treturn this.getData(obj, property);\r\n\t}\r\n\r\n\t/**\r\n\t * This will find elements in an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} queryString\r\n\t * @return {array}\r\n\t */\r\n\tfind(obj, queryString)\r\n\t{\r\n\t\tif(!obj || typeof queryString !== 'string')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn obj.querySelectorAll(queryString);\r\n\t}\r\n\r\n\t/**\r\n\t * This will display an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @return {object} An instance of base.\r\n\t */\r\n\tshow(obj)\r\n\t{\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/* we want to get the previous display style\r\n\t\tfrom the data-style-display attr */\r\n\t\tlet previous = this.data(obj, 'style-display'),\r\n\t\tvalue = (typeof previous === 'string')? previous : '';\r\n\r\n\t\tthis.css(obj, 'display', value);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will hide an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @return {object} An instance of base.\r\n\t */\r\n\thide(obj)\r\n\t{\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/* we want to set the previous display style\r\n\t\ton the element as a data attr */\r\n\t\tlet previous = this.css(obj, 'display');\r\n\t\tif(previous !== 'none' && previous)\r\n\t\t{\r\n\t\t\tthis.data(obj, 'style-display', previous);\r\n\t\t}\r\n\r\n\t\tthis.css(obj, 'display', 'none');\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will toggle the display an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @return {object} An instance of base.\r\n\t */\r\n\ttoggle(obj)\r\n\t{\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tlet mode = this.css(obj, 'display');\r\n\t\tif(mode !== 'none')\r\n\t\t{\r\n\t\t\tthis.hide(obj);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.show(obj);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will camelCase a string.\r\n\t *\r\n\t * @param {string} str\r\n\t * @return {(string|boolean)} The string or false.\r\n\t */\r\n\tcamelCase(str)\r\n\t{\r\n\t\tif(typeof str !== 'string')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet regExp = /(-|\\s|\\_)+\\w{1}/g;\r\n\t\treturn str.replace(regExp, function(match)\r\n\t\t{\r\n\t\t\treturn match[1].toUpperCase();\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will uncamel-case a string.\r\n\t *\r\n\t * @param {string} str\r\n\t * @param {string} delimiter\r\n\t * @return {(string|boolean)} The string or false.\r\n\t */\r\n\tuncamelCase(str, delimiter)\r\n\t{\r\n\t\tif(typeof str !== 'string')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tdelimiter = delimiter || '-';\r\n\r\n\t\tlet regExp = /([A-Z]{1,})/g;\r\n\t\treturn str.replace(regExp, function(match)\r\n\t\t{\r\n\t\t\treturn delimiter + match.toLowerCase();\r\n\t\t}).toLowerCase();\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the size of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @return {(object|boolean)} A size object or false.\r\n\t */\r\n\tgetSize(obj)\r\n\t{\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\twidth: this.getWidth(obj),\r\n\t\t\theight: this.getHeight(obj)\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the width of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @return {(int|boolean)} A width or false.\r\n\t */\r\n\tgetWidth(obj)\r\n\t{\r\n\t\t/* we want to check if the object is not supplied */\r\n\t\treturn (this.isObject(obj))? obj.offsetWidth : false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the height of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @return {(int|boolean)} A height or false.\r\n\t */\r\n\tgetHeight(obj)\r\n\t{\r\n\t\t/* we want to check if the object is not supplied */\r\n\t\treturn (this.isObject(obj))? obj.offsetHeight : false;\r\n\t}\r\n\r\n\t/**\r\n\t* This will get the scroll position.\r\n\t*\r\n\t* @param {object} [obj] The element or document element if not set.\r\n\t* @return {object}\r\n\t*/\r\n\tgetScrollPosition(obj)\r\n\t{\r\n\t\tlet left = 0, top = 0;\r\n\t\tswitch(typeof obj)\r\n\t\t{\r\n\t\t\tcase 'undefined':\r\n\t\t\t\tobj = document.documentElement;\r\n\t\t\t\tleft = (window.pageXOffset || obj.scrollLeft);\r\n\t\t\t\ttop = (window.pageYOffset || obj.scrollTop);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'object':\r\n\t\t\t\tleft = obj.scrollLeft;\r\n\t\t\t\ttop = obj.scrollTop;\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tleft: left - (obj.clientLeft || 0),\r\n\t\t\ttop: top - (obj.clientTop || 0)\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the scroll top position.\r\n\t *\r\n\t * @param {object} [obj] The element or document element if not set.\r\n\t * @return {object}\r\n\t */\r\n\tgetScrollTop(obj)\r\n\t{\r\n\t\tlet position = this.getScrollPosition(obj);\r\n\t\treturn position.top;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the scroll left position.\r\n\t *\r\n\t * @param {object} [obj] The element or document element if not set.\r\n\t * @return {object}\r\n\t */\r\n\tgetScrollLeft(obj)\r\n\t{\r\n\t\tlet position = this.getScrollPosition(obj);\r\n\t\treturn position.left;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the window size.\r\n\t *\r\n\t * @return {object}\r\n\t */\r\n\tgetWindowSize()\r\n\t{\r\n\t\tlet w = window,\r\n\t\tdoc = document,\r\n\t\tde = doc.documentElement,\r\n\t\tb = doc.getElementsByTagName('body')[0],\r\n\t\twidth = w.innerWidth || de.clientWidth || b.clientWidth,\r\n\t\theight = w.innerHeight || de.clientHeight || b.clientHeight;\r\n\r\n\t\treturn {\r\n\t\t\twidth,\r\n\t\t\theight\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the document size.\r\n\t *\r\n\t * @return {object}\r\n\t */\r\n\tgetDocumentSize()\r\n\t{\r\n\t\tlet doc = document,\r\n\t\tbody = doc.body,\r\n\t\thtml = doc.documentElement,\r\n\r\n\t\theight = Math.max(\r\n\t\t\tbody.scrollHeight,\r\n\t\t\tbody.offsetHeight,\r\n\t\t\thtml.clientHeight,\r\n\t\t\thtml.scrollHeight,\r\n\t\t\thtml.offsetHeight\r\n\t\t),\r\n\r\n\t\twidth = Math.max(\r\n\t\t\tbody.scrollWidth,\r\n\t\t\tbody.offsetWidth,\r\n\t\t\thtml.clientWidth,\r\n\t\t\thtml.scrollWidth,\r\n\t\t\thtml.offsetWidth\r\n\t\t);\r\n\r\n\t\treturn {\r\n\t\t\twidth,\r\n\t\t\theight\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the document height.\r\n\t *\r\n\t * @return {object}\r\n\t */\r\n\tgetDocumentHeight()\r\n\t{\r\n\t\treturn this.getDocumentSize().height;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the value from a property on an object.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {*} [defaultText] A value if no value is set.\r\n\t * @return {string}\r\n\t */\r\n\tgetProperty(obj, property, defaultText)\r\n\t{\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tlet value = obj[property];\r\n\t\tif(typeof value !== 'undefined')\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\t/* if no value was available\r\n\t\twe want to return an empty string */\r\n\t\treturn (typeof defaultText !== 'undefined')? defaultText : '';\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the position of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {boolean} [depth] The number of levels, default is 1, 0 is to the root.\r\n\t * @return {object}\r\n\t */\r\n\tposition(obj, depth = 1)\r\n\t{\r\n\t\tlet position = {x: 0, y: 0};\r\n\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn position;\r\n\t\t}\r\n\r\n\t\t/* if the depth is 0 we will travel to the\r\n\t\ttop element */\r\n\t\tlet count = 0;\r\n\t\twhile(obj && (depth === 0 || count < depth))\r\n\t\t{\r\n\t\t\tcount++;\r\n\t\t\tposition.x += (obj.offsetLeft + obj.clientLeft);\r\n\t\t\tposition.y += (obj.offsetTop + obj.clientTop);\r\n\t\t\tobj = obj.offsetParent;\r\n\t\t}\r\n\r\n\t\treturn position;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a class to an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} tmpClassName\r\n\t */\r\n\taddClass(obj, tmpClassName)\r\n\t{\r\n\t\tif(this.isObject(obj) === false || tmpClassName === '')\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif(typeof tmpClassName === 'string')\r\n\t\t{\r\n\t\t\t/* we want to divide the string by spaces and\r\n\t\t\tadd any class listed */\r\n\t\t\tlet adding = tmpClassName.split(' ');\r\n\t\t\tfor(var i = 0, maxLength = adding.length; i < maxLength; i++)\r\n\t\t\t{\r\n\t\t\t\tobj.classList.add(tmpClassName);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a class or classes from an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} [tmpClassName]\r\n\t */\r\n\tremoveClass(obj, tmpClassName)\r\n\t{\r\n\t\tif(this.isObject(obj) === false || tmpClassName === '')\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/* if no className was specified we will remove all classes from object */\r\n\t\tif(typeof tmpClassName === 'undefined')\r\n\t\t{\r\n\t\t\tobj.className = '';\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tobj.classList.remove(tmpClassName);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if an element has a class.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} tmpClassName\r\n\t * @return {boolean}\r\n\t */\r\n\thasClass(obj, tmpClassName)\r\n\t{\r\n\t\tif(this.isObject(obj) === false || tmpClassName === '')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn obj.classList.contains(tmpClassName);\r\n\t}\r\n\r\n\t/**\r\n\t * This will toggle a class on an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} tmpClassName\r\n\t * @return {object} An instance of base.\r\n\t */\r\n\ttoggleClass(obj, tmpClassName)\r\n\t{\r\n\t\tif(this.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tobj.classList.toggle(tmpClassName);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the type of a variable.\r\n\t *\r\n\t * @param {*} data\r\n\t * @return {string}\r\n\t */\r\n\tgetType(data)\r\n\t{\r\n\t\tconst type = typeof data;\r\n\t\tif(type !== 'object')\r\n\t\t{\r\n\t\t\treturn type;\r\n\t\t}\r\n\r\n\t\treturn (this.isArray(data))? 'array' : type;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if a request is undefined.\r\n\t *\r\n\t * @param {mixed} data\r\n\t */\r\n\tisUndefined(data)\r\n\t{\r\n\t\treturn (typeof data === 'undefined');\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if the request is an object.\r\n\t * @param {object} obj\r\n\t * @return {boolean}\r\n\t */\r\n\tisObject(obj)\r\n\t{\r\n\t\treturn (!obj || typeof obj !== 'object')? false : true;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if the variable is an array.\r\n\t *\r\n\t * @param {*} array\r\n\t * @return {boolean}\r\n\t */\r\n\tisArray(array)\r\n\t{\r\n\t\treturn Array.isArray(array);\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if a value is found in an array.\r\n\t *\r\n\t * @param {array} array\r\n\t * @param {string} element\r\n\t * @param {int} [fromIndex]\r\n\t * @return {int} This will return -1 if not found.\r\n\t */\r\n\tinArray(array, element, fromIndex)\r\n\t{\r\n\t\tif(!array || typeof array !== 'object')\r\n\t\t{\r\n\t\t\treturn -1;\r\n\t\t}\r\n\r\n\t\treturn array.indexOf(element, fromIndex);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a callBack.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {function} method\r\n\t * @param {array} [argArray] Default args to pass.\r\n\t * @param {boolean} [addArgs] Set to add merge args from the\r\n\t * curried function.\r\n\t *\r\n\t * @return {(function|boolean)} The callBack function or false.\r\n\t */\r\n\tcreateCallBack(obj, method, argArray, addArgs)\r\n\t{\r\n\t\tif(typeof method !== 'function')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\targArray = argArray || [];\r\n\t\treturn function(...args)\r\n\t\t{\r\n\t\t\tif(addArgs === true)\r\n\t\t\t{\r\n\t\t\t\targArray = argArray.concat(args);\r\n\t\t\t}\r\n\r\n\t\t\treturn method.apply(obj, argArray);\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will bind scope to a method.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {function} method\r\n\t * @return {function}\r\n\t */\r\n\tbind(obj, method)\r\n\t{\r\n\t\treturn method.bind(obj);\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepare a json object to be used in an\r\n\t * xhr request. This will sanitize the object values\r\n\t * by encoding them to not break the param string.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {bool} [removeNewLines]\r\n\t * @return {string}\r\n\t */\r\n\tprepareJsonUrl(obj, removeNewLines = false)\r\n\t{\r\n\t\tvar escapeChars = (str) =>\r\n\t\t{\r\n\t\t\tif(typeof str !== 'string')\r\n\t\t\t{\r\n\t\t\t\tstr = String(str);\r\n\t\t\t}\r\n\r\n\t\t\tif(removeNewLines)\r\n\t\t\t{\r\n\t\t\t\tlet newLine = /(\\n|\\r\\n)/g;\r\n\t\t\t\tstr = str.replace(newLine, \"\\\\n\");\r\n\t\t\t}\r\n\r\n\t\t\tlet tab = /\\t/g;\r\n\t\t\treturn str.replace(tab, \"\\\\t\");\r\n\t\t};\r\n\r\n\t\tvar sanitize = (text) =>\r\n\t\t{\r\n\t\t\tif(typeof text !== 'string')\r\n\t\t\t{\r\n\t\t\t\treturn text;\r\n\t\t\t}\r\n\r\n\t\t\t/* we need to escape chars and encode the uri\r\n\t\t\tcomponents */\r\n\t\t\ttext = escapeChars(text);\r\n\t\t\ttext = encodeURIComponent(text);\r\n\r\n\t\t\t/* we want to re-encode the double quotes so they\r\n\t\t\twill be escaped by the json encoder */\r\n\t\t\tlet pattern = /\\%22/g;\r\n\t\t\treturn text.replace(pattern, '\"');\r\n\t\t};\r\n\r\n\t\tvar prepareUrl = (data) =>\r\n\t\t{\r\n\t\t\tlet type = typeof data;\r\n\t\t\tif(type === \"undefined\")\r\n\t\t\t{\r\n\t\t\t\treturn data;\r\n\t\t\t}\r\n\r\n\t\t\tif(type !== 'object')\r\n\t\t\t{\r\n\t\t\t\tdata = sanitize(data);\r\n\t\t\t\treturn data;\r\n\t\t\t}\r\n\r\n\t\t\tlet value;\r\n\t\t\tfor(var prop in data)\r\n\t\t\t{\r\n\t\t\t\tif(data.hasOwnProperty(prop))\r\n\t\t\t\t{\r\n\t\t\t\t\tvalue = data[prop];\r\n\t\t\t\t\tif(value === null)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tdata[prop] = (typeof value)? prepareUrl(value) : sanitize(value);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn data;\r\n\t\t};\r\n\r\n\t\t/* we want to check to clone object so we won't modify the\r\n\t\toriginal object */\r\n\t\tlet before = (typeof obj === 'object')? this.cloneObject(obj) : obj,\r\n\t\tafter = prepareUrl(before);\r\n\t\treturn this.jsonEncode(after);\r\n\t}\r\n\r\n\t/**\r\n\t * This will parse JSON data.\r\n\t *\r\n\t * @param {string} data\r\n\t * @return {*}\r\n\t */\r\n\tjsonDecode(data)\r\n\t{\r\n\t\treturn (typeof data !== \"undefined\" && data.length > 0)? JSON.parse(data) : false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will encode JSON data.\r\n\t *\r\n\t * @param {*} data\r\n\t * @return {string}\r\n\t */\r\n\tjsonEncode(data)\r\n\t{\r\n\t\treturn (typeof data !== \"undefined\")? JSON.stringify(data) : false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will parse xml data.\r\n\t *\r\n\t * @param {string} data\r\n\t * @return {object}\r\n\t */\r\n\txmlParse(data)\r\n\t{\r\n\t\tif(typeof data === \"undefined\")\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tvar parser = new DOMParser();\r\n\t\treturn parser.parseFromString(data, \"text/xml\");\r\n\t}\r\n}\r\n\r\n/**\r\n * This will return the base prototype to allow the module\r\n * to be added to base as a module.\r\n *\r\n * @static\r\n * @return {object} the base prototype.\r\n */\r\nBase.prototype.extend = (function()\r\n{\r\n\treturn Base.prototype;\r\n})();\r\n\r\n/**\r\n * This is the instance of base that all modules will use.\r\n * @global\r\n */\r\nexport const base = new Base();\r\n\r\n/**\r\n * This will add the Objects method to base.\r\n */\r\nbase.augment(Objects);\r\n\r\n/**\r\n * This will count the properties of an object.\r\n *\r\n * @param {object} obj\r\n * @return {int}\r\n */\r\nlet countProperty = (obj) =>\r\n{\r\n\tlet count = 0;\r\n\t/* we want to count each property of the object */\r\n\tfor(var property in obj)\r\n\t{\r\n\t\tif(obj.hasOwnProperty(property))\r\n\t\t{\r\n\t\t\tcount++;\r\n\t\t\t/* we want to do a recursive count to get\r\n\t\t\tany child properties */\r\n\t\t\tif(typeof obj[property] === 'object')\r\n\t\t\t{\r\n\t\t\t\tcount += countProperty(obj[property]);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn count;\r\n};\r\n\r\n/**\r\n * This will validate if the object properties match another object.\r\n *\r\n * @param {object} obj1\r\n * @param {object} obj2\r\n * @return {boolean}\r\n */\r\nlet matchProperties = (obj1, obj2) =>\r\n{\r\n\tlet matched = false;\r\n\r\n\tif(typeof obj1 !== 'object' || typeof obj2 !== 'object')\r\n\t{\r\n\t\treturn matched;\r\n\t}\r\n\r\n\t/* we want to check each object1 property to the\r\n\tobject 2 property */\r\n\tfor(var property in obj1)\r\n\t{\r\n\t\t/* we want to check if the property is owned by the\r\n\t\tobject and that they have matching types */\r\n\t\tif(!obj1.hasOwnProperty(property) || !obj2.hasOwnProperty(property))\r\n\t\t{\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tlet value1 = obj1[property],\r\n\t\tvalue2 = obj2[property];\r\n\r\n\t\tif(typeof value1 !== typeof value2)\r\n\t\t{\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\t/* we want to check if the type is an object */\r\n\t\tif(typeof value1 === 'object')\r\n\t\t{\r\n\t\t\t/* this will do a recursive check to the\r\n\t\t\tchild properties */\r\n\t\t\tmatched = matchProperties(value1, value2);\r\n\t\t\tif(matched !== true)\r\n\t\t\t{\r\n\t\t\t\t/* if a property did not match we can stop\r\n\t\t\t\tthe comparison */\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif(value1 === value2)\r\n\t\t\t{\r\n\t\t\t\tmatched = true;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn matched;\r\n};\r\n\r\n/**\r\n * This will compare if two objects match.\r\n *\r\n * @param {object} obj1\r\n * @param {object} obj2\r\n * @return {boolean}\r\n */\r\nlet compareObjects = (obj1, obj2) =>\r\n{\r\n\t/* we want to check if they have the same number of\r\n\tproperties */\r\n\tlet option1Count = countProperty(obj1),\r\n\toption2Count = countProperty(obj2);\r\n\tif(option1Count !== option2Count)\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\treturn matchProperties(obj1, obj2);\r\n};\r\n\r\nbase.augment(\r\n{\r\n\t/**\r\n\t * This will compare if two values match.\r\n\t *\r\n\t * @param {*} option1\r\n\t * @param {*} option2\r\n\t * @return {boolean}\r\n\t */\r\n\tequals(option1, option2)\r\n\t{\r\n\t\t/* we want to check if there types match */\r\n\t\tlet option1Type = typeof option1,\r\n\t\toption2Type = typeof option2;\r\n\t\tif(option1Type !== option2Type)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we need to check if the options are objects\r\n\t\tbecause we will want to match all the\r\n\t\tproperties */\r\n\t\tif(option1Type === 'object')\r\n\t\t{\r\n\t\t\treturn compareObjects(option1, option2);\r\n\t\t}\r\n\r\n\t\treturn (option1 === option2);\r\n\t}\r\n});", "\r\nimport {base} from './main.js';\r\nexport {base} from './main.js';\r\n\r\nconst dataTracker = base.dataTracker;\r\n\r\nexport const events =\r\n{\r\n /**\r\n * This will get the events on an element.\r\n *\r\n * @param {object} obj\r\n * @return {(array|boolean)}\r\n */\r\n getEvents(obj)\r\n {\r\n if(base.isObject(obj) === false)\r\n {\r\n return false;\r\n }\r\n return dataTracker.get(obj, 'events');\r\n },\r\n\r\n /**\r\n * This will create an object to use with the dataTracker.\r\n *\r\n * @param {string} event The event name.\r\n * @param {object} obj\r\n * @param {function} fn\r\n * @param {boolean} [capture]\r\n * @param {boolean} [swapped]\r\n * @param {function} [originalFn]\r\n * @return {object}\r\n */\r\n create(event, obj, fn, capture = false, swapped = false, originalFn = null)\r\n {\r\n /* we want to check if the swapped param was set */\r\n swapped = (swapped === true);\r\n\r\n return {\r\n event,\r\n obj,\r\n fn,\r\n capture,\r\n swapped,\r\n originalFn\r\n };\r\n },\r\n\r\n /**\r\n * This will add an event to an object.\r\n *\r\n * @param {string} event The event name.\r\n * @param {object} obj\r\n * @param {function} fn\r\n * @param {(object|boolean)} [capture]\r\n * @param {boolean} [swapped]\r\n * @param {function} [originalFn]\r\n */\r\n add(event, obj, fn, capture = false, swapped = false, originalFn = null)\r\n {\r\n if(base.isObject(obj) === false)\r\n {\r\n return this;\r\n }\r\n\r\n /* we want to create an event object and add it the\r\n the active events to track */\r\n let data = this.create(event, obj, fn, capture, swapped, originalFn);\r\n dataTracker.add(obj, 'events', data);\r\n\r\n obj.addEventListener(event, fn, capture);\r\n\r\n return this;\r\n },\r\n\r\n /**\r\n * This will remove an event from an object.\r\n *\r\n * @param {string} event The event name.\r\n * @param {object} obj\r\n * @param {function} fn\r\n * @param {(object|boolean)} [capture]\r\n * @return {object} a reference to the event object.\r\n */\r\n remove(event, obj, fn, capture = false)\r\n {\r\n let result = this.getEvent(event, obj, fn, capture);\r\n if(result === false)\r\n {\r\n return this;\r\n }\r\n\r\n if(typeof result === 'object')\r\n {\r\n /* we want to use the remove event method and just\r\n pass the listener object */\r\n this.removeEvent(result);\r\n }\r\n return this;\r\n },\r\n\r\n /**\r\n * This will remove an event listener.\r\n * @param {object} listener\r\n * @return {object} a reference to the event object.\r\n */\r\n removeEvent(listener)\r\n {\r\n if(typeof listener === 'object')\r\n {\r\n let obj = listener.obj;\r\n obj.removeEventListener(listener.event, listener.fn, listener.capture);\r\n }\r\n return this;\r\n },\r\n\r\n /**\r\n * This will search for an event.\r\n *\r\n * @protected\r\n * @param {string} event The event name.\r\n * @param {object} obj\r\n * @param {function} fn\r\n * @param {boolean} [capture]\r\n * @return {(object|boolean)}\r\n */\r\n getEvent(event, obj, fn, capture)\r\n {\r\n if(typeof obj !== 'object')\r\n {\r\n return false;\r\n }\r\n\r\n let events = this.getEvents(obj);\r\n if(!events || events.length < 1)\r\n {\r\n return false;\r\n }\r\n\r\n let eventObj = this.create(event, obj, fn, capture);\r\n /* if the search returns anything but false we\r\n found our active event */\r\n return this.search(eventObj, events);\r\n },\r\n\r\n /**\r\n * This will search for an event from the object events.\r\n *\r\n * @param {object} eventObj\r\n * @param {array} events\r\n * @return {(object|boolean)}\r\n */\r\n search(eventObj, events)\r\n {\r\n let listener,\r\n swappable = this.isSwappable(eventObj.event);\r\n for(var i = 0, maxLength = events.length; i < maxLength; i++)\r\n {\r\n listener = events[i];\r\n if(listener.event !== eventObj.event || listener.obj !== eventObj.obj)\r\n {\r\n continue;\r\n }\r\n\r\n if(listener.fn === eventObj.fn || (swappable === true && listener.originalFn === eventObj.fn))\r\n {\r\n return listener;\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n\r\n /**\r\n * This will remove all events on an object.\r\n *\r\n * @param {object} obj\r\n * @return {object} a reference to the events object.\r\n */\r\n removeEvents(obj)\r\n {\r\n if(base.isObject(obj) === false)\r\n {\r\n return this;\r\n }\r\n\r\n dataTracker.remove(obj, 'events');\r\n\r\n return this;\r\n },\r\n\r\n /**\r\n * @member {array} swap The swappable events.\r\n */\r\n swap: [\r\n 'DOMMouseScroll',\r\n 'wheel',\r\n 'mousewheel',\r\n 'mousemove',\r\n 'popstate'\r\n ],\r\n\r\n /**\r\n * This will a event type to the swappable array.\r\n *\r\n * @param {string} type\r\n */\r\n addSwapped(type)\r\n {\r\n this.swap.push(type);\r\n },\r\n\r\n /**\r\n * This will check if an event is swappable.\r\n *\r\n * @param {string} event\r\n * @return {boolean}\r\n */\r\n isSwappable(event)\r\n {\r\n /* we want to check if the event type is in the\r\n swapped event array */\r\n let index = base.inArray(this.swap, event);\r\n return (index > -1);\r\n }\r\n};\r\n\r\n/* this will register the event system to the\r\ndata tracker to remove events that have been\r\nadded in layouts. */\r\ndataTracker.addType('events', (data) =>\r\n{\r\n events.removeEvent(data);\r\n});\r\n\r\nbase.augment(\r\n{\r\n /**\r\n * @param object events\r\n */\r\n events,\r\n\r\n /**\r\n * This will add an event to an object.\r\n *\r\n * @param {string} event The event name.\r\n * @param {object} obj\r\n * @param {function} fn\r\n * @param {boolean} [capture]\r\n * @return {object} An instance of base.\r\n */\r\n addListener(event, obj, fn, capture)\r\n {\r\n this.events.add(event, obj, fn, capture);\r\n\r\n return this;\r\n },\r\n\r\n /**\r\n * This will add an event to an object.\r\n *\r\n * @param {string} event The event name.\r\n * @param {object} obj\r\n * @param {function} fn\r\n * @param {boolean} [capture]\r\n * @return {object} An instance of base.\r\n */\r\n on(event, obj, fn, capture)\r\n {\r\n let events = this.events;\r\n if(this.isArray(event))\r\n {\r\n let evt;\r\n for(var i = 0, length = event.length; i < length; i++)\r\n {\r\n evt = event[i];\r\n events.add(evt, obj, fn, capture);\r\n }\r\n }\r\n else\r\n {\r\n events.add(event, obj, fn, capture);\r\n }\r\n return this;\r\n },\r\n\r\n /**\r\n * This will remove an event from an object.\r\n *\r\n * @param {string} event The event name.\r\n * @param {object} obj\r\n * @param {function} fn\r\n * @param {boolean} [capture]\r\n * @return {object} An instance of base.\r\n */\r\n off(event, obj, fn, capture)\r\n {\r\n let events = this.events;\r\n if(this.isArray(event))\r\n {\r\n var evt;\r\n for(var i = 0, length = event.length; i < length; i++)\r\n {\r\n evt = event[i];\r\n events.remove(evt, obj, fn, capture);\r\n }\r\n }\r\n else\r\n {\r\n events.remove(event, obj, fn, capture);\r\n }\r\n return this;\r\n },\r\n\r\n /**\r\n * This will remove an event from an object.\r\n *\r\n * @param {string} event The event name.\r\n * @param {object} obj\r\n * @param {function} fn\r\n * @param {boolean} [capture]\r\n * @return {object} An instance of base.\r\n */\r\n removeListener(event, obj, fn, capture)\r\n {\r\n /* we want to remove this from the active events */\r\n this.events.remove(event, obj, fn, capture);\r\n\r\n return this;\r\n },\r\n\r\n /**\r\n * This will create a custom event.\r\n *\r\n * @protected\r\n * @param {object} event\r\n * @param {string} eventType\r\n * @param {object} [settings]\r\n * @param {object} [params]\r\n * @return {object}\r\n */\r\n _createEvent(event, eventType, settings, params)\r\n {\r\n let e;\r\n if(eventType === 'HTMLEvents')\r\n {\r\n e = new Event(event);\r\n }\r\n else if(eventType === 'MouseEvents')\r\n {\r\n e = new MouseEvent(event, settings);\r\n }\r\n else\r\n {\r\n e = new CustomEvent(event, params);\r\n }\r\n return e;\r\n },\r\n\r\n /**\r\n * This will create a custom event. This supports html, mouse,\r\n * and customevents.\r\n *\r\n * @param {string} event\r\n * @param {object} obj\r\n * @param {object} [options]\r\n * @param {object} [params]\r\n * @return {object}\r\n */\r\n createEvent(event, obj, options, params)\r\n {\r\n if(this.isObject(obj) === false)\r\n {\r\n return false;\r\n }\r\n\r\n let settings =\r\n {\r\n pointerX: 0,\r\n pointerY: 0,\r\n button: 0,\r\n view: window,\r\n detail: 1,\r\n screenX: 0,\r\n screenY: 0,\r\n clientX: 0,\r\n clientY: 0,\r\n ctrlKey: false,\r\n altKey: false,\r\n shiftKey: false,\r\n metaKey: false,\r\n bubbles: true,\r\n cancelable: true,\r\n relatedTarget: null\r\n };\r\n\r\n if(base.isObject(options))\r\n {\r\n settings = Object.assign(settings, options);\r\n }\r\n\r\n let eventType = this._getEventType(event);\r\n return this._createEvent(event, eventType, settings, params);\r\n },\r\n\r\n /**\r\n * This will get thetype of an event.\r\n *\r\n * @protected\r\n * @param {string} event\r\n * @return {string}\r\n */\r\n _getEventType(event)\r\n {\r\n let eventTypes = {\r\n 'HTMLEvents': /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/,\r\n 'MouseEvents': /^(?:click|dblclick|mouse(?:down|up|over|move|out))$/\r\n },\r\n\r\n value,\r\n eventType = 'CustomEvent';\r\n for(var prop in eventTypes)\r\n {\r\n if(eventTypes.hasOwnProperty(prop))\r\n {\r\n value = eventTypes[prop];\r\n if(event.match(value))\r\n {\r\n eventType = prop;\r\n break;\r\n }\r\n }\r\n }\r\n return eventType;\r\n },\r\n\r\n /**\r\n * This will trigger an event.\r\n *\r\n * @param {(string|object)} event\r\n * @param {object} obj\r\n * @param {object} [params]\r\n * @return {object}\r\n */\r\n trigger(event, obj, params)\r\n {\r\n if(this.isObject(obj) === false)\r\n {\r\n return this;\r\n }\r\n\r\n let e = (typeof event === 'string')? this.createEvent(event, obj, null, params) : event;\r\n obj.dispatchEvent(e);\r\n return this;\r\n },\r\n\r\n /**\r\n * @member {string} mouseWheelEventType The mouse wheel event name.\r\n * @protected\r\n */\r\n mouseWheelEventType: null,\r\n\r\n /**\r\n * This will get the system mouse event.\r\n *\r\n * @protected\r\n * @return {string}\r\n */\r\n getWheelEventType()\r\n {\r\n /* this will check what mouse wheel type\r\n the client supports\r\n @return (string) the event name */\r\n let getMouseWheelType = () =>\r\n {\r\n let type = 'wheel';\r\n if('onmousewheel' in self)\r\n {\r\n type = 'mousewheel';\r\n }\r\n else if('DOMMouseScroll' in self)\r\n {\r\n type = 'DOMMouseScroll';\r\n }\r\n return type;\r\n };\r\n\r\n /* this will get the event type or\r\n one time set the type and return the type */\r\n return this.mouseWheelEventType || (\r\n this.mouseWheelEventType = getMouseWheelType()\r\n );\r\n },\r\n\r\n /**\r\n * This will add a mouse event to an object.\r\n *\r\n * @param {function} callBackFn\r\n * @param {object} [obj]\r\n * @param {boolean} [cancelDefault]\r\n * @param {boolean} capture\r\n * @return {object} base object.\r\n */\r\n onMouseWheel(callBackFn, obj, cancelDefault, capture)\r\n {\r\n if(typeof obj === \"undefined\")\r\n {\r\n obj = window;\r\n }\r\n\r\n /* we want to return the mousewheel data\r\n to this private callback function before\r\n returning to the call back function*/\r\n let mouseWheelResults = (e) =>\r\n {\r\n e = e || window.event;\r\n let delta = Math.max(-1, Math.min(1, (-e.deltaY || e.wheelDelta || -e.detail)));\r\n\r\n /* we can now send the mouse wheel results to\r\n the call back function */\r\n if(typeof callBackFn === 'function')\r\n {\r\n callBackFn(delta, e);\r\n }\r\n\r\n /* we want to check to cancel default */\r\n if(cancelDefault === true)\r\n {\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n let event = this.getWheelEventType();\r\n this.events.add(event, obj, mouseWheelResults, capture, true, callBackFn);\r\n return this;\r\n },\r\n\r\n /**\r\n * This will remove a mouse event\r\n *\r\n * @param {function} callBackFn\r\n * @param {object} [obj]\r\n * @param {boolean} capture\r\n * @return {object} base object.\r\n */\r\n offMouseWheel(callBackFn, obj, capture)\r\n {\r\n if(typeof obj === \"undefined\")\r\n {\r\n obj = window;\r\n }\r\n\r\n let event = this.getWheelEventType();\r\n this.off(event, obj, callBackFn, capture);\r\n return this;\r\n },\r\n\r\n /**\r\n * This will prevent default on an event.\r\n *\r\n * @param {object} e\r\n * @return {object} base object.\r\n */\r\n preventDefault(e)\r\n {\r\n e = e || window.event;\r\n\r\n if(typeof e.preventDefault === 'function')\r\n {\r\n e.preventDefault();\r\n }\r\n else\r\n {\r\n e.returnValue = false;\r\n }\r\n\r\n return this;\r\n },\r\n\r\n /**\r\n * This will stop an event from propigating.\r\n *\r\n * @param {object} e\r\n * @return {object} base object.\r\n */\r\n stopPropagation(e)\r\n {\r\n e = e || window.event;\r\n\r\n if(typeof e.stopPropagation === 'function')\r\n {\r\n e.stopPropagation();\r\n }\r\n else\r\n {\r\n e.cancelBubble = true;\r\n }\r\n\r\n return this;\r\n }\r\n});", "import {base} from '../../core.js';\r\n\r\n/**\r\n * This is the default xhr (ajax) settings.\r\n */\r\nlet XhrDefaultSettings =\r\n{\r\n\turl: '',\r\n\r\n\t/* this is the responseType of the server\r\n\tresponse (string) */\r\n\tresponseType: 'json',\r\n\r\n\t/* this is the server method */\r\n\tmethod: 'POST',\r\n\r\n\t/* this can fix a param string to be added\r\n\tto every ajax request */\r\n\tfixedParams: '',\r\n\r\n\t/* headers (object) */\r\n\theaders:\r\n\t{\r\n\t\t'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'\r\n\t},\r\n\r\n\tbeforeSend: [],\r\n\r\n\t/* this will set the ajax request to async (bool) */\r\n\tasync: true,\r\n\r\n\t/* cross domain (bool) */\r\n\tcrossDomain: false,\r\n\r\n\t/* cors with credentials (bool) */\r\n\twithCredentials: false,\r\n\r\n\t/* events (function) */\r\n\tcompleted: null,\r\n\tfailed: null,\r\n\taborted: null,\r\n\tprogress: null\r\n};\r\n\r\n/* this will add ajax settings to the base class */\r\nbase.augment(\r\n{\r\n\t/**\r\n\t * @member {object} xhrSettings\r\n\t */\r\n\txhrSettings: XhrDefaultSettings,\r\n\r\n\t/**\r\n\t * This will add fixed params to each xhr request.\r\n\t *\r\n\t * @param {(string|object)} params\r\n\t */\r\n\taddFixedParams(params)\r\n\t{\r\n\t\tthis.xhrSettings.fixedParams = params;\r\n\t},\r\n\r\n\t/**\r\n\t * This will add a callback that will be called before\r\n\t * each request.\r\n\t *\r\n\t * @param {function} callBack\r\n\t */\r\n\tbeforeSend(callBack)\r\n\t{\r\n\t\tthis.xhrSettings.beforeSend.push(callBack);\r\n\t},\r\n\r\n\t/**\r\n\t * This will update the xhr settings.\r\n\t *\r\n\t * @param {object} settingsObj\r\n\t */\r\n\tajaxSettings(settingsObj)\r\n\t{\r\n\t\tif(typeof settingsObj === 'object')\r\n\t\t{\r\n\t\t\tthis.xhrSettings = this.extendClass(base.xhrSettings, settingsObj);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * This will reset the xhr settings.\r\n\t */\r\n\tresetAjaxSettings()\r\n\t{\r\n\t\tthis.xhrSettings = XhrDefaultSettings;\r\n\t}\r\n});\r\n\r\n/**\r\n * This will make an xhr (ajax) request.\r\n *\r\n * @param {string} url\r\n * @param {string} params\r\n * @param {function} callBackFn\r\n * @param {string} responseType\r\n * @param {string} [method=POST]\r\n * @param {boolean} async\r\n *\r\n * or\r\n *\r\n * @param {object} settings\r\n * @example\r\n * {\r\n * \turl: '',\r\n * \tparams: '',\r\n * \tcompleted(response)\r\n * \t{\r\n *\r\n * \t}\r\n * }\r\n *\r\n * @return {object} xhr object.\r\n */\r\nexport const ajax = (...args) =>\r\n{\r\n\t/* we want to save the args so we can check\r\n\twhich way we are adding the ajax settings */\r\n\tconst ajax = new XhrRequest(args);\r\n\treturn ajax.xhr;\r\n};\r\n\r\n/**\r\n * XhrRequest\r\n *\r\n * This will create an xhr request object.\r\n * @class\r\n */\r\nexport class XhrRequest\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {*} args\r\n\t */\r\n\tconstructor(args)\r\n\t{\r\n\t\tthis.settings = null;\r\n\t\tthis.xhr = null;\r\n\t\tthis.setup(args);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the xhr request.\r\n\t *\r\n\t * @protected\r\n\t * @param {*} args\r\n\t * @return {(object|boolean)}\r\n\t */\r\n\tsetup(args)\r\n\t{\r\n\t\tthis.getXhrSettings(args);\r\n\r\n\t\tlet xhr = this.xhr = this.createXHR();\r\n\t\tif(xhr === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst {method, url, async} = this.settings;\r\n\t\txhr.open(method, url, async);\r\n\r\n\t\tthis.setupHeaders();\r\n\t\tthis.addXhrEvents();\r\n\t\tthis.beforeSend();\r\n\r\n\t\t/* this will setup the params and send the\r\n\t\txhr request */\r\n\t\txhr.send(this.getParams());\r\n\t}\r\n\r\n\t/**\r\n\t * This will call all before send callbacks.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tbeforeSend()\r\n\t{\r\n\t\tlet items = base.xhrSettings.beforeSend;\r\n\t\tif(items.length < 1)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet xhr = this.xhr;\r\n\t\tlet settings = this.settings;\r\n\t\tfor(var i = 0, length = items.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar callBack = items[i];\r\n\t\t\tif(callBack)\r\n\t\t\t{\r\n\t\t\t\tcallBack(xhr, settings);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will convert an object to a string.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} object\r\n\t * @return {string}\r\n\t */\r\n\tobjectToString(object)\r\n\t{\r\n\t\tlet params = [];\r\n\t\tfor (var prop in object)\r\n\t\t{\r\n\t\t\tif(object.hasOwnProperty(prop))\r\n\t\t\t{\r\n\t\t\t\tparams.push(prop + '=' + object[prop]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn params.join('&');\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the base params to the request params.\r\n\t *\r\n\t * @protected\r\n\t * @param {*} params\r\n\t * @param {*} addingParams\r\n\t * @return {*}\r\n\t */\r\n\tsetupParams(params, addingParams)\r\n\t{\r\n\t\tlet paramsType = typeof params;\r\n\t\tif(addingParams)\r\n\t\t{\r\n\t\t\t/* this will convert the adding params to match\r\n\t\t\tthe params type */\r\n\t\t\tlet addingType = typeof addingParams;\r\n\t\t\tif(paramsType === 'string')\r\n\t\t\t{\r\n\t\t\t\tif(addingType !== 'string')\r\n\t\t\t\t{\r\n\t\t\t\t\taddingParams = this.objectToString(addingParams);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst char = (params === '')? '?' : '&';\r\n\t\t\t\tparams += char + addingParams;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tif(addingType === 'string')\r\n\t\t\t\t{\r\n\t\t\t\t\taddingParams = base.parseQueryString(addingParams, false);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(params instanceof FormData)\r\n\t\t\t\t{\r\n\t\t\t\t\tfor(var key in addingParams)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif(addingParams.hasOwnProperty(key))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tparams.append(key, addingParams[key]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if(paramsType === 'object')\r\n\t\t\t\t{\r\n\t\t\t\t\t/* we don't want to modify the original object\r\n\t\t\t\t\tso we need to clone the object before extending */\r\n\t\t\t\t\tparams = base.cloneObject(params);\r\n\r\n\t\t\t\t\tparams = Object.assign(addingParams, params);\r\n\t\t\t\t\tparams = this.objectToString(params);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif((params instanceof FormData) === false && paramsType === 'object')\r\n\t\t\t{\r\n\t\t\t\tparams = this.objectToString(params);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn params;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the params.\r\n\t * @protected\r\n\t * @return {*}\r\n\t */\r\n\tgetParams()\r\n\t{\r\n\t\tlet settings = this.settings,\r\n\t\tparams = settings.params;\r\n\r\n\t\tlet fixedParams = settings.fixedParams;\r\n\t\tif(params)\r\n\t\t{\r\n\t\t\tparams = this.setupParams(params, fixedParams);\r\n\t\t}\r\n\t\telse if(fixedParams)\r\n\t\t{\r\n\t\t\tparams = this.setupParams(fixedParams);\r\n\t\t}\r\n\r\n\t\treturn params;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the settings from the args.\r\n\t *\r\n\t * @protected\r\n\t * @param {array} args\r\n\t */\r\n\tgetXhrSettings(args)\r\n\t{\r\n\t\t/* we want to create a clone of the default\r\n\t\tsettings before adding the new settings */\r\n\t\tlet settings = this.settings = Object.create(base.xhrSettings);\r\n\r\n\t\t/* we want to check if we are adding the ajax settings by\r\n\t\tindividual args or by a settings object */\r\n\t\tif(args.length >= 2 && typeof args[0] !== 'object')\r\n\t\t{\r\n\t\t\tfor(var i = 0, maxLength = args.length; i < maxLength; i++)\r\n\t\t\t{\r\n\t\t\t\tvar arg = args[i];\r\n\r\n\t\t\t\tswitch(i)\r\n\t\t\t\t{\r\n\t\t\t\t\tcase 0:\r\n\t\t\t\t\t\tsettings.url = arg;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 1:\r\n\t\t\t\t\t\tsettings.params = arg;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 2:\r\n\t\t\t\t\t\tsettings.completed = arg;\r\n\t\t\t\t\t\tsettings.failed = arg;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 3:\r\n\t\t\t\t\t\tsettings.responseType = arg || 'json';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 4:\r\n\t\t\t\t\t\tsettings.method = (arg)? arg.toUpperCase() : 'POST';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 5:\r\n\t\t\t\t\t\tsettings.async = (typeof arg !== 'undefined')? arg : true;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t/* override the default settings with the args\r\n\t\t\tsettings object */\r\n\t\t\tsettings = this.settings = base.extendClass(this.settings, args[0]);\r\n\r\n\t\t\t/* we want to check to add the completed callback\r\n\t\t\tas the error and aborted if not set */\r\n\t\t\tif(typeof settings.completed === 'function')\r\n\t\t\t{\r\n\t\t\t\tif(typeof settings.failed !== 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tsettings.failed = settings.completed;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(typeof settings.aborted !== 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tsettings.aborted = settings.failed;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will create the xhr object.\r\n\t *\r\n\t * @protected\r\n\t * @return {(object|boolean)}\r\n\t */\r\n\tcreateXHR()\r\n\t{\r\n\t\t/* we want to check to setup the xhr by\r\n\t\tthe crossDomain settings */\r\n\t\tlet settings = this.settings,\r\n\r\n\t\txhr = new XMLHttpRequest();\r\n\t\txhr.responseType = settings.responseType;\r\n\r\n\t\tif(settings.withCredentials === true)\r\n\t\t{\r\n\t\t\txhr.withCredentials = true;\r\n\t\t}\r\n\r\n\t\treturn xhr;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the request headers.\r\n\t */\r\n\tsetupHeaders()\r\n\t{\r\n\t\tlet settings = this.settings;\r\n\t\tif(settings && typeof settings.headers === 'object')\r\n\t\t{\r\n\t\t\t/* we want to add a header for each\r\n\t\t\tproperty in the object */\r\n\t\t\tlet headers = settings.headers;\r\n\t\t\tfor(var header in headers)\r\n\t\t\t{\r\n\t\t\t\tif(headers.hasOwnProperty(header))\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.xhr.setRequestHeader(header, headers[header]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the request status.\r\n\t *\r\n\t * @param {object} e\r\n\t * @param {string} [overrideType]\r\n\t */\r\n\tupdate(e, overrideType)\r\n\t{\r\n\t\tlet xhr = this.xhr;\r\n\r\n\t\t/* this will remove the xhr events from the active events\r\n\t\tafter the events are completed, aborted, or errored */\r\n\t\tlet removeEvents = () =>\r\n\t\t{\r\n\t\t\tlet events = base.events;\r\n\t\t\tevents.removeEvents(xhr.upload);\r\n\t\t\tevents.removeEvents(xhr);\r\n\t\t};\r\n\r\n\t\tlet settings = this.settings;\r\n\t\tif(!settings)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet type = overrideType || e.type;\r\n\t\tswitch(type)\r\n\t\t{\r\n\t\t\tcase 'load':\r\n\t\t\t\tif(typeof settings.completed === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tlet response = this.getResponseData();\r\n\t\t\t\t\tsettings.completed(response, this.xhr);\r\n\t\t\t\t}\r\n\t\t\t\tremoveEvents();\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'error':\r\n\t\t\t\tif(typeof settings.failed === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tsettings.failed(false, this.xhr);\r\n\t\t\t\t}\r\n\t\t\t\tremoveEvents();\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'progress':\r\n\t\t\t\tif(typeof settings.progress === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tsettings.progress(e);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'abort':\r\n\t\t\t\tif(typeof settings.aborted === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tsettings.aborted(false, this.xhr);\r\n\t\t\t\t}\r\n\t\t\t\tremoveEvents();\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the response data.\r\n\t *\r\n\t * @return {*}\r\n\t */\r\n\tgetResponseData()\r\n\t{\r\n\t\tlet xhr = this.xhr,\r\n\t\tresponse = xhr.response;\r\n\r\n\t\tconst responseType = xhr.responseType;\r\n\t\tif(!responseType || responseType === 'text')\r\n\t\t{\r\n\t\t\treturn xhr.responseText;\r\n\t\t}\r\n\r\n\t\treturn response;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the xhr events.\r\n\t */\r\n\taddXhrEvents()\r\n\t{\r\n\t\tlet settings = this.settings;\r\n\t\tif(!settings)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet xhr = this.xhr,\r\n\t\tcallBack = base.bind(this, this.update);\r\n\t\tbase.on(['load', 'error', 'abort'], xhr, callBack);\r\n\t\tbase.on('progress', xhr.upload, callBack);\r\n\t}\r\n}", "let lastToken = -1;\r\n\r\n/**\r\n * DataPubSub\r\n *\r\n * This is a pub sub class to allow subscribers to\r\n * listen for updates when published by publishers.\r\n * @class\r\n */\r\nexport class DataPubSub\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {object} callBacks\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis.callBacks = {};\r\n\r\n\t\t/**\r\n\t\t * @member {int} lastToken\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis.lastToken = -1;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get a subscriber array.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @return {array}\r\n\t */\r\n\tget(msg)\r\n\t{\r\n\t\tlet callBacks = this.callBacks;\r\n\t\treturn (callBacks[msg] || (callBacks[msg] = []));\r\n\t}\r\n\r\n\t/**\r\n\t * This will reset pub sub.\r\n\t */\r\n\treset()\r\n\t{\r\n\t\tthis.callBacks = {};\r\n\t\tthis.lastToken = -1;\r\n\t\tlastToken = -1;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a subscriber.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @param {function} callBack\r\n\t * @return {string} The subscriber token.\r\n\t */\r\n\ton(msg, callBack)\r\n\t{\r\n\t\tlet token = (++lastToken),\r\n\t\tlist = this.get(msg);\r\n\t\tlist.push({\r\n\t\t\ttoken: token,\r\n\t\t\tcallBack: callBack\r\n\t\t});\r\n\t\treturn token;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a subscriber.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @param {string} token\r\n\t */\r\n\toff(msg, token)\r\n\t{\r\n\t\tlet list = this.callBacks[msg] || false;\r\n\t\tif(list === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet length = list.length;\r\n\t\tfor (var i = 0; i < length; i++ )\r\n\t\t{\r\n\t\t\tvar item = list[i];\r\n\t\t\tif(item.token === token)\r\n\t\t\t{\r\n\t\t\t\tlist.splice(i, 1);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will delete a message.\r\n\t *\r\n\t * @param {string} msg\r\n\t */\r\n\tremove(msg)\r\n\t{\r\n\t\tlet callBacks = this.callBacks;\r\n\t\tif(callBacks[msg])\r\n\t\t{\r\n\t\t\tdelete callBacks[msg];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish a message.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @param {string} value\r\n\t * @param {object} committer\r\n\t */\r\n\tpublish(msg)\r\n\t{\r\n\t\tlet i, length,\r\n\t\tlist = this.callBacks[msg] || false;\r\n\t\tif(list === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet args = Array.prototype.slice.call(arguments, 1);\r\n\r\n\t\tlength = list.length;\r\n\t\tfor (i = 0; i < length; i++)\r\n\t\t{\r\n\t\t\tvar item = list[i];\r\n\t\t\tif(!item)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\titem.callBack.apply(this, args);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport const pubSub = new DataPubSub();", "/**\r\n * Source\r\n *\r\n * This will create a new source to use with\r\n * a connection.\r\n * @class\r\n */\r\nexport class Source\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {string} msg\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis.msg = null;\r\n\r\n\t\t/**\r\n\t\t * @member {string} token\r\n\t\t */\r\n\t\tthis.token = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the token.\r\n\t *\r\n\t * @param {string} token\r\n\t */\r\n\tsetToken(token)\r\n\t{\r\n\t\tthis.token = token;\r\n\t}\r\n}", "import {Source} from './source.js';\r\n\r\n/**\r\n * OneWaySource\r\n *\r\n * This will create a one way source to use with\r\n * a connection.\r\n * @class\r\n * @augments Source\r\n */\r\nexport class OneWaySource extends Source\r\n{\r\n\t/**\r\n\t * This will setup the data source.\r\n\t *\r\n\t * @param {object} data\r\n\t */\r\n\tconstructor(data)\r\n\t{\r\n\t\tsuper();\r\n\t\tthis.data = data;\r\n\t}\r\n\r\n\t/**\r\n\t * This will subscribe to a message.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @param {function} callBack\r\n\t */\r\n\tsubscribe(msg, callBack)\r\n\t{\r\n\t\tthis.msg = msg;\r\n\t\tthis.token = this.data.on(msg, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will unsubscribe from the message.\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\t\tthis.data.off(this.msg, this.token);\r\n\t}\r\n}", "/**\r\n * Connection\r\n *\r\n * This will create a connection.\r\n * @class\r\n */\r\nexport class Connection\r\n{\r\n\t/**\r\n\t * This will be used to unsubscribe.\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\r\n\t}\r\n}", "import {OneWaySource} from './one-way-source.js';\r\nimport {Connection} from './connection.js';\r\n\r\n/**\r\n * OneWayConnection\r\n *\r\n * This will create a one way connection.\r\n * @class\r\n * @augments Connection\r\n */\r\nexport class OneWayConnection extends Connection\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\tsuper();\r\n\r\n\t\t/**\r\n\t\t * @member {object} source\r\n\t\t */\r\n\t\tthis.source = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the connection source.\r\n\t *\r\n\t * @param {object} data\r\n\t * @return {object}\r\n\t */\r\n\taddSource(data)\r\n\t{\r\n\t\treturn (this.source = new OneWaySource(data));\r\n\t}\r\n\r\n\t/**\r\n\t * This will be used to unsubscribe.\r\n\t * @override\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\t\tthis.source.unsubscribe();\r\n\t\tthis.source = null;\r\n\t}\r\n}", "import {Source} from './source.js';\r\nimport {pubSub} from './data-pub-sub.js';\r\n\r\n/**\r\n * TwoWaySource\r\n *\r\n * This will create a two way source to use with\r\n * a connection.\r\n * @class\r\n * @augments Source\r\n */\r\nexport class TwoWaySource extends Source\r\n{\r\n\t/**\r\n\t * This will subscribe to a message.\r\n\t *\r\n\t * @param {string} msg\r\n\t */\r\n\tsubscribe(msg)\r\n\t{\r\n\t\tthis.msg = msg;\r\n\t\tlet callBack = this.callBack.bind(this);\r\n\t\tthis.token = pubSub.on(msg, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will unsubscribe from a message.\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\t\tpubSub.off(this.msg, this.token);\r\n\t}\r\n\r\n\t/**\r\n\t * Override this to setup cource callBack.\r\n\t */\r\n\tcallBack()\r\n\t{\r\n\r\n\t}\r\n}", "import {TwoWaySource} from './two-way-source.js';\r\n\r\n/**\r\n * DataSource\r\n *\r\n * This will create a data source to use with\r\n * a connection.\r\n * @class\r\n * @augments TwoWaySource\r\n */\r\nexport class DataSource extends TwoWaySource\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t */\r\n\tconstructor(data, prop)\r\n\t{\r\n\t\tsuper();\r\n\t\tthis.data = data;\r\n\t\tthis.prop = prop;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the data value.\r\n\t *\r\n\t * @param {*} value\r\n\t */\r\n\tset(value)\r\n\t{\r\n\t\tthis.data.set(this.prop, value);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the data value.\r\n\t */\r\n\tget()\r\n\t{\r\n\t\treturn this.data.get(this.prop);\r\n\t}\r\n\r\n\t/**\r\n\t * The callBack when updated.\r\n\t *\r\n\t * @param {*} value\r\n\t * @param {object} committer\r\n\t */\r\n\tcallBack(value, committer)\r\n\t{\r\n\t\tif(this.data !== committer)\r\n\t\t{\r\n\t\t\tthis.data.set(this.prop, value, committer);\r\n\t\t}\r\n\t}\r\n}", "import {base} from '../../core.js';\r\nimport {TwoWaySource} from './two-way-source.js';\r\n\r\n/**\r\n * This will set an element attr by the setAttribute method.\r\n *\r\n * @param {object} element\r\n * @param {string} attr\r\n * @param {mixed} value\r\n */\r\nconst SetAttr = (element, attr, value) =>\r\n{\r\n\tbase.setAttr(element, attr, value);\r\n};\r\n\r\nconst UpdateRadioAttr = (element, attr, value) =>\r\n{\r\n\telement.checked = (element.value === value);\r\n};\r\n\r\nconst UpdateCheckboxAttr = (element, attr, value) =>\r\n{\r\n\tvalue = (value == 1);\r\n\tUpdateAttr(element, attr, value);\r\n};\r\n\r\n/**\r\n * This will update an element attr by the bracket notation.\r\n *\r\n * @param {object} element\r\n * @param {string} attr\r\n * @param {nixed} value\r\n */\r\nconst UpdateAttr = (element, attr, value) =>\r\n{\r\n\telement[attr] = value;\r\n};\r\n\r\nconst GetAttr = (element, attr) =>\r\n{\r\n\treturn base.getAttr(element, attr);\r\n};\r\n\r\nconst GetAttribute = (element, attr) =>\r\n{\r\n\treturn element[attr];\r\n};\r\n\r\n/**\r\n * ElementSource\r\n *\r\n * This will create an element source to use with\r\n * a connection.\r\n * @class\r\n * @augments TwoWaySource\r\n */\r\nexport class ElementSource extends TwoWaySource\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} element\r\n\t * @param {string} attr\r\n\t * @param {(string|function)} [filter]\r\n\t */\r\n\tconstructor(element, attr, filter)\r\n\t{\r\n\t\tsuper();\r\n\t\tthis.element = element;\r\n\t\tthis.attr = this.getAttrBind(attr);\r\n\t\tthis.addSetMethod(element, this.attr);\r\n\r\n\t\tthis.filter = (typeof filter === 'string')? this.setupFilter(filter) : filter;\r\n\t}\r\n\r\n\taddSetMethod(element, attr)\r\n\t{\r\n\t\tif(attr.substring(4, 1) === '-')\r\n\t\t{\r\n\t\t\tthis.setValue = SetAttr;\r\n\t\t\tthis.getValue = GetAttr;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.getValue = GetAttribute;\r\n\r\n\t\t\tvar type = element.type;\r\n\t\t\tif(type)\r\n\t\t\t{\r\n\t\t\t\tswitch(type)\r\n\t\t\t\t{\r\n\t\t\t\t\tcase 'checkbox':\r\n\t\t\t\t\t\tthis.setValue = UpdateCheckboxAttr;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tcase 'radio':\r\n\t\t\t\t\t\tthis.setValue = UpdateRadioAttr;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.setValue = UpdateAttr;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the bind attribute.\r\n\t *\r\n\t * @param {string} [customAttr]\r\n\t * @return {string}\r\n\t */\r\n\tgetAttrBind(customAttr)\r\n\t{\r\n\t\t/* this will setup the custom attr if the prop\r\n\t\thas specified one. */\r\n\t\tif(customAttr)\r\n\t\t{\r\n\t\t\treturn customAttr;\r\n\t\t}\r\n\r\n\t\tlet attr = 'textContent';\r\n\t\t/* if no custom attr has been requested we will get the\r\n\t\tdefault attr of the element */\r\n\t\tlet element = this.element;\r\n\t\tif(!(element && typeof element === 'object'))\r\n\t\t{\r\n\t\t\treturn attr;\r\n\t\t}\r\n\r\n\t\tlet tagName = element.tagName.toLowerCase();\r\n\t\tif (tagName === \"input\" || tagName === \"textarea\" || tagName === \"select\")\r\n\t\t{\r\n\t\t\tlet type = element.type;\r\n\t\t\tif(type)\r\n\t\t\t{\r\n\t\t\t\tswitch(type)\r\n\t\t\t\t{\r\n\t\t\t\t\tcase 'checkbox':\r\n\t\t\t\t\t\tattr = 'checked';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'file':\r\n\t\t\t\t\t\tattr = 'files';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tattr = 'value';\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tattr = 'value';\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn attr;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup a filter callBack.\r\n\t *\r\n\t * @param {string} filter\r\n\t * @return {function}\r\n\t */\r\n\tsetupFilter(filter)\r\n\t{\r\n\t\tlet pattern = /(\\[\\[[^\\]]+\\]\\])/;\r\n\t\treturn (value) =>\r\n\t\t{\r\n\t\t\treturn filter.replace(pattern, value);\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will set a value on an element.\r\n\t *\r\n\t * @param {*} value\r\n\t */\r\n\tset(value)\r\n\t{\r\n\t\tlet element = this.element;\r\n\t\tif(!element || typeof element !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* this will check to apply the option filter before\r\n\t\tsetting the value */\r\n\t\tif(this.filter)\r\n\t\t{\r\n\t\t\tvalue = this.filter(value);\r\n\t\t}\r\n\r\n\t\tthis.setValue(element, this.attr, value);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the value from an element.\r\n\t */\r\n\tget()\r\n\t{\r\n\t\tlet element = this.element;\r\n\t\tif(!element || typeof element !== 'object')\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\treturn this.getValue(element, this.attr);\r\n\t}\r\n\r\n\t/**\r\n\t * The callBack when updated.\r\n\t *\r\n\t * @param {*} value\r\n\t * @param {object} committer\r\n\t */\r\n\tcallBack(value, committer)\r\n\t{\r\n\t\tif(committer !== this.element)\r\n\t\t{\r\n\t\t\tthis.set(value);\r\n\t\t}\r\n\t}\r\n}", "import {DataSource} from './data-source.js';\r\nimport {ElementSource} from './element-source.js';\r\nimport {Connection} from './connection.js';\r\n\r\n/**\r\n * TwoWayConnection\r\n *\r\n * This will setup a two way connection.\r\n * @class\r\n * @augments Connection\r\n */\r\nexport class TwoWayConnection extends Connection\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\tsuper();\r\n\r\n\t\tthis.element = null;\r\n\t\tthis.data = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the element source.\r\n\t *\r\n\t * @param {object} element\r\n\t * @param {string} attr\r\n\t * @param {(string|function)} filter\r\n\t * @return {object}\r\n\t */\r\n\taddElement(element, attr, filter)\r\n\t{\r\n\t\treturn (this.element = new ElementSource(element, attr, filter));\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the data source.\r\n\t *\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @return {object}\r\n\t */\r\n\taddData(data, prop)\r\n\t{\r\n\t\treturn (this.data = new DataSource(data, prop));\r\n\t}\r\n\r\n\t/**\r\n\t * This will unsubscribe from a source.\r\n\t *\r\n\t * @param {object} source\r\n\t */\r\n\tunsubscribeSource(source)\r\n\t{\r\n\t\tif(source)\r\n\t\t{\r\n\t\t\tsource.unsubscribe();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will be used to unsubscribe.\r\n\t * @override\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\t\tthis.unsubscribeSource(this.element);\r\n\t\tthis.unsubscribeSource(this.data);\r\n\r\n\t\tthis.element = null;\r\n\t\tthis.data = null;\r\n\t}\r\n}", "import {base} from '../../core.js';\r\n\r\n/**\r\n * ConnectionTracker\r\n *\r\n * This will create a new connection tracker to track active\r\n * connections in the data binder.\r\n * @class\r\n */\r\nexport class ConnectionTracker\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {object} connections\r\n\t\t */\r\n\t\tthis.connections = {};\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a new connection to be tracked.\r\n\t *\r\n\t * @param {string} id\r\n\t * @param {string} attr\r\n\t * @param {object} connection\r\n\t * @return {object}\r\n\t */\r\n\tadd(id, attr, connection)\r\n\t{\r\n\t\tlet connections = this.find(id);\r\n\t\treturn (connections[attr] = connection);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get a connection.\r\n\t *\r\n\t * @param {string} id\r\n\t * @param {string} attr\r\n\t * @return {(object|bool)}\r\n\t */\r\n\tget(id, attr)\r\n\t{\r\n\t\tlet connections = this.connections[id];\r\n\t\tif(connections)\r\n\t\t{\r\n\t\t\treturn (connections[attr] || false);\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will find a connection.\r\n\t *\r\n\t * @param {string} id\r\n\t * @return {object}\r\n\t */\r\n\tfind(id)\r\n\t{\r\n\t\tlet connections = this.connections;\r\n\t\treturn (connections[id] || (connections[id] = {}));\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a connection or all connections by id.\r\n\t * @param {string} id\r\n\t * @param {string} [attr]\r\n\t */\r\n\tremove(id, attr)\r\n\t{\r\n\t\tlet connections = this.connections[id];\r\n\t\tif(!connections)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet connection;\r\n\t\tif(attr)\r\n\t\t{\r\n\t\t\tconnection = connections[attr];\r\n\t\t\tif(connection)\r\n\t\t\t{\r\n\t\t\t\tconnection.unsubscribe();\r\n\t\t\t\tdelete connections[attr];\r\n\t\t\t}\r\n\r\n\t\t\t/* this will remove the msg from the elements\r\n\t\t\tif no elements are listed under the msg */\r\n\t\t\tif(base.isEmpty(connections))\r\n\t\t\t{\r\n\t\t\t\tdelete this.connections[id];\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tfor(var prop in connections)\r\n\t\t\t{\r\n\t\t\t\tif(connections.hasOwnProperty(prop))\r\n\t\t\t\t{\r\n\t\t\t\t\tconnection = connections[prop];\r\n\t\t\t\t\tif(connection)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tconnection.unsubscribe();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tdelete this.connections[id];\r\n\t\t}\r\n\t}\r\n}", "import {base} from '../../core.js';\r\nexport {DataPubSub} from './data-pub-sub.js';\r\nimport {pubSub} from './data-pub-sub.js';\r\nimport {OneWayConnection} from './one-way-connection.js';\r\nimport {TwoWayConnection} from './two-way-connection.js';\r\nimport {ConnectionTracker} from './connection-tracker.js';\r\n\r\n/**\r\n * DataBinder\r\n *\r\n * This will create a data binder object that can\r\n * create one way and two way data bindings.\r\n * @class\r\n */\r\nexport class DataBinder\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\tthis.version = \"1.0.1\";\r\n\t\tthis.attr = 'bindId';\r\n\r\n\t\t/**\r\n\t\t * @member {array} blockedKeys\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis.blockedKeys = [\r\n\t\t\t20, //caps lock\r\n\t\t\t37, //arrows\r\n\t\t\t38,\r\n\t\t\t39,\r\n\t\t\t40\r\n\t\t];\r\n\r\n\t\tthis.connections = new ConnectionTracker();\r\n\r\n\t\tthis.idCount = 0;\r\n\t\tthis.setup();\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the events.\r\n\t * @protected\r\n\t */\r\n\tsetup()\r\n\t{\r\n\t\tthis.setupEvents();\r\n\t}\r\n\r\n\t/**\r\n\t * This will bind an element to a data property.\r\n\t *\r\n\t * @param {object} element\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @param {(string|function)} [filter]\r\n\t * @return {object} an instance of the databinder.\r\n\t */\r\n\tbind(element, data, prop, filter)\r\n\t{\r\n\t\tlet bindProp = prop,\r\n\t\tbindAttr = null;\r\n\r\n\t\tif(prop.indexOf(':') !== -1)\r\n\t\t{\r\n\t\t\t/* this will setup the custom attr if the prop\r\n\t\t\thas specified one. */\r\n\t\t\tlet parts = prop.split(':');\r\n\t\t\tif(parts.length > 1)\r\n\t\t\t{\r\n\t\t\t\tbindProp = parts[1];\r\n\t\t\t\tbindAttr = parts[0];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/* this will setup the model bind attr to the\r\n\t\telement and assign a bind id attr to support\r\n\t\ttwo way binding */\r\n\t\tlet connection = this.setupConnection(element, data, bindProp, bindAttr, filter);\r\n\r\n\t\t/* we want to get the starting value of the\r\n\t\tdata and set it on our element */\r\n\t\tlet connectionElement = connection.element,\r\n\t\tvalue = data.get(bindProp);\r\n\t\tif(typeof value !== 'undefined')\r\n\t\t{\r\n\t\t\tconnectionElement.set(value);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t/* this will set the element value\r\n\t\t\tas the prop value */\r\n\t\t\tvalue = connectionElement.get();\r\n\t\t\tif(value !== '')\r\n\t\t\t{\r\n\t\t\t\tconnection.data.set(value);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will bind an element to a data property.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} element\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @param {string} customAttr\r\n\t * @param {(string|function)} [filter]\r\n\t * @return {object} The new connection.\r\n\t */\r\n\tsetupConnection(element, data, prop, customAttr, filter)\r\n\t{\r\n\t\tlet id = this.getBindId(element),\r\n\t\tconnection = new TwoWayConnection(),\r\n\r\n\t\t// this will create the data source\r\n\t\tdataSource = connection.addData(data, prop);\r\n\t\t// this will subscribe the data to the element\r\n\t\tdataSource.subscribe(id);\r\n\r\n\t\t/* this will add the data binding\r\n\t\tattr to our element so it will subscribe to\r\n\t\tthe two data changes */\r\n\t\tlet dataId = data.getDataId(),\r\n\t\tmsg = dataId + ':' + prop;\r\n\r\n\t\t// this will create the element source\r\n\t\tlet elementSource = connection.addElement(element, customAttr, filter);\r\n\t\t// this will subscribe the element to the data\r\n\t\telementSource.subscribe(msg);\r\n\r\n\t\tthis.addConnection(id, 'bind', connection);\r\n\r\n\t\treturn connection;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a new connection to the\r\n\t * connection tracker.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} id\r\n\t * @param {string} attr\r\n\t * @param {object} connection\r\n\t */\r\n\taddConnection(id, attr, connection)\r\n\t{\r\n\t\tthis.connections.add(id, attr, connection);\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the bind id.\r\n\t *\r\n\t * @param {object} element\r\n\t */\r\n\tsetBindId(element)\r\n\t{\r\n\t\tlet id = 'db-' + this.idCount++;\r\n\t\telement.dataset[this.attr] = id;\r\n\t\telement[this.attr] = id;\r\n\t\treturn id;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the bind id.\r\n\t *\r\n\t * @param {object} element\r\n\t * @return {string}\r\n\t */\r\n\tgetBindId(element)\r\n\t{\r\n\t\treturn element[this.attr] || this.setBindId(element);\r\n\t}\r\n\r\n\t/**\r\n\t * This will unbind the element.\r\n\t *\r\n\t * @param {object} element\r\n\t * @return {object} an instance of the data binder.\r\n\t */\r\n\tunbind(element)\r\n\t{\r\n\t\tlet id = element[this.attr];\r\n\t\tif(id)\r\n\t\t{\r\n\t\t\tthis.connections.remove(id);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup a watcher for an element.\r\n\t *\r\n\t * @param {object} element\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @param {function} callBack\r\n\t */\r\n\twatch(element, data, prop, callBack)\r\n\t{\r\n\t\tif(!element || typeof element !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet connection = new OneWayConnection();\r\n\r\n\t\t// this will create the one way source\r\n\t\tconst source = connection.addSource(data);\r\n\t\tsource.subscribe(prop, callBack);\r\n\r\n\t\t// this will add the new connection to the connection tracker\r\n\t\tconst id = this.getBindId(element),\r\n\t\tattr = data.getDataId() + ':' + prop;\r\n\t\tthis.addConnection(id, attr, connection);\r\n\r\n\t\tlet value = data.get(prop);\r\n\t\tif(typeof value !== 'undefined')\r\n\t\t{\r\n\t\t\tcallBack(value);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a watcher from an element.\r\n\t *\r\n\t * @param {object} element\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t */\r\n\tunwatch(element, data, prop)\r\n\t{\r\n\t\tif(!element || typeof element !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet id = element[this.attr];\r\n\t\tif(id)\r\n\t\t{\r\n\t\t\tlet attr = data.getDataId() + ':' + prop;\r\n\t\t\tthis.connections.remove(id, attr);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish to the pub sub.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @param {*} value\r\n\t * @param {object} committer\r\n\t * @return {object} an instance of the data binder.\r\n\t */\r\n\tpublish(msg, value, committer)\r\n\t{\r\n\t\tpubSub.publish(msg, value, committer);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if an element is bound.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} element\r\n\t * @return {boolean}\r\n\t */\r\n\tisDataBound(element)\r\n\t{\r\n\t\tif(element)\r\n\t\t{\r\n\t\t\tlet id = element[this.attr];\r\n\t\t\tif(id)\r\n\t\t\t{\r\n\t\t\t\treturn id;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tisBlocked(evt)\r\n\t{\r\n\t\tif(evt.type !== 'keyup')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* this will check to block ctrl, shift or alt +\r\n\t\tbuttons */\r\n\t\treturn (this.blockedKeys.indexOf(evt.keyCode) !== -1);\r\n\t}\r\n\r\n\t/**\r\n\t * This is the callBack for the chnage event.\r\n\t *\r\n\t * @param {object} evt\r\n\t */\r\n\tbindHandler(evt)\r\n\t{\r\n\t\tif(this.isBlocked(evt))\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tlet target = evt.target || evt.srcElement,\r\n\t\tid = this.isDataBound(target);\r\n\t\tif(id)\r\n\t\t{\r\n\t\t\tlet connection = this.connections.get(id, 'bind');\r\n\t\t\tif(connection)\r\n\t\t\t{\r\n\t\t\t\tlet value = connection.element.get();\r\n\t\t\t\t/* this will publish to the ui and to the\r\n\t\t\t\tmodel that subscribes to the element */\r\n\t\t\t\tpubSub.publish(id, value, target);\r\n\t\t\t}\r\n\t\t}\r\n\t\tevt.stopPropagation();\r\n\t}\r\n\r\n\t/**\r\n\t * This wil setup the events.\r\n\t * @protected\r\n\t */\r\n\tsetupEvents()\r\n\t{\r\n\t\tthis.changeHandler = this.bindHandler.bind(this);\r\n\r\n\t\tthis.addEvents();\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the events.\r\n\t */\r\n\taddEvents()\r\n\t{\r\n\t\tbase.on([\"change\", \"keyup\"], document, this.changeHandler, false);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the events.\r\n\t */\r\n\tremoveEvents()\r\n\t{\r\n\t\tbase.off([\"change\", \"keyup\"], document, this.changeHandler, false);\r\n\t}\r\n}\r\n\r\nexport const dataBinder = new DataBinder();", "/**\r\n * This will clone an object.\r\n *\r\n * @param {object} obj\r\n */\r\nexport const cloneObject = (obj) =>\r\n{\r\n return JSON.parse(JSON.stringify(obj));\r\n};\r\n\r\n/**\r\n * This will get the data attribute settings.\r\n *\r\n * @param {object} settings\r\n * @return {object}\r\n */\r\nexport const setupAttrSettings = (settings) =>\r\n{\r\n\tlet attributes = {};\r\n\tif(!settings && typeof settings !== 'object')\r\n\t{\r\n\t\treturn attributes;\r\n\t}\r\n\r\n\tsettings = cloneObject(settings);\r\n\r\n\tfor(var prop in settings)\r\n\t{\r\n\t\tif(settings.hasOwnProperty(prop))\r\n\t\t{\r\n\t\t\tvar setting = settings[prop];\r\n\t\t\tif(typeof setting !== 'function')\r\n\t\t\t{\r\n\t\t\t\tattributes[prop] = setting;\r\n\t\t\t\tdelete settings[prop];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn attributes;\r\n};", "import {DataPubSub} from '../data-binder/data-pub-sub.js';\r\nimport {setupAttrSettings} from './attrs.js';\r\n\r\n/**\r\n * BasicData\r\n *\r\n * This will create a bindable base class. This will\r\n * allow shallow one level deep data to be created\r\n * and watched.\r\n *\r\n * @class\r\n */\r\nexport class BasicData\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} [settings]\r\n\t */\r\n\tconstructor(settings)\r\n\t{\r\n\t\tthis.dirty = false;\r\n\t\tthis.links = {};\r\n\r\n\t\tthis._init();\r\n\t\tthis.setup();\r\n\r\n\t\t/**\r\n\t\t * @member {string} dataTypeId\r\n\t\t */\r\n\t\tthis.dataTypeId = 'bd';\r\n\r\n\t\t/* this will setup the event sub for\r\n\t\tone way binding */\r\n\t\tthis.eventSub = new DataPubSub();\r\n\r\n\t\t/* this will set the construct attributes */\r\n\t\tlet attributes = setupAttrSettings(settings);\r\n\t\tthis.set(attributes);\r\n\t}\r\n\r\n\tsetup()\r\n\t{\r\n\t\tthis.stage = {};\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the number and unique id of the data object.\r\n\t * @protected\r\n\t */\r\n\t_init()\r\n\t{\r\n\t\tconst constructor = this.constructor;\r\n\t\tthis._dataNumber = (typeof constructor._dataNumber === 'undefined')? constructor._dataNumber = 0 : (++constructor._dataNumber);\r\n\r\n\t\tthis._id = 'dt-' + this._dataNumber;\r\n\t\tthis._dataId = this._id + ':';\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the data id.\r\n\t * @return {string}\r\n\t */\r\n\tgetDataId()\r\n\t{\r\n\t\treturn this._id;\r\n\t}\r\n\r\n\t/**\r\n\t * This is a placeholder.\r\n\t */\r\n\tremove()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup a one way bind.\r\n\t *\r\n\t * @param {string} attrName\r\n\t * @param {function} callBack\r\n\t * @return {string} The subscription token.\r\n\t */\r\n\ton(attrName, callBack)\r\n\t{\r\n\t\tlet message = attrName + ':change';\r\n\t\tlet token = this.eventSub.on(message, callBack);\r\n\t\treturn token;\r\n\t}\r\n\r\n\t/**\r\n\t * This will unbind from a one way bind.\r\n\t *\r\n\t * @param {string} attrName\r\n\t * @param {string} token\r\n\t */\r\n\toff(attrName, token)\r\n\t{\r\n\t\tlet message = attrName + ':change';\r\n\t\tthis.eventSub.off(message, token);\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the attribute value.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t * @param {object} committer\r\n\t */\r\n\t_setAttr(attr, val, committer)\r\n\t{\r\n\t\tlet prevValue = this.stage[attr];\r\n\t\tif(val === prevValue)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tthis.stage[attr] = val;\r\n\r\n\t\tcommitter = committer || this;\r\n\r\n\t\t/* this will publish the data to the data binder\r\n\t\tto update any ui elements that are subscribed */\r\n\t\tthis._publish(attr, val, committer, prevValue);\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the data value of an attribute or attributes.\r\n\t *\r\n\t * @param {string} key\r\n\t * @param {*} value\r\n\t *\r\n\t * or\r\n\t *\r\n\t * @param {object} data\r\n\t * @return {object} this\r\n\t */\r\n\tset(...args)\r\n\t{\r\n\t\tif(typeof args[0] === 'object')\r\n\t\t{\r\n\t\t\tlet [items, committer, stopMerge] = args;\r\n\r\n\t\t\tfor(var attr in items)\r\n\t\t\t{\r\n\t\t\t\tif(items.hasOwnProperty(attr))\r\n\t\t\t\t{\r\n\t\t\t\t\tvar item = items[attr];\r\n\t\t\t\t\tif(typeof item === 'function')\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis._setAttr(attr, item, committer, stopMerge);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis._setAttr(...args);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the model data.\r\n\t */\r\n\tgetModelData()\r\n\t{\r\n\t\treturn this.stage;\r\n\t}\r\n\r\n\t/**\r\n\t * This will delete an attribute.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t */\r\n\t_deleteAttr(obj, attr)\r\n\t{\r\n\t\tdelete obj[attr];\r\n\t}\r\n\r\n\t/**\r\n\t * This will toggle a bool attribute.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @return {object} this\r\n\t */\r\n\ttoggle(attr)\r\n\t{\r\n\t\tif(typeof attr === 'undefined')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.set(attr, !this.get(attr));\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will increment an attribute.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @return {object} this\r\n\t */\r\n\tincrement(attr)\r\n\t{\r\n\t\tif(typeof attr === 'undefined')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet val = this.get(attr);\r\n\t\tthis.set(attr, ++val);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will decrement an attribute.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @return {object} this\r\n\t */\r\n\tdecrement(attr)\r\n\t{\r\n\t\tif(typeof attr === 'undefined')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet val = this.get(attr);\r\n\t\tthis.set(attr, --val);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the key value if it is null.\r\n\t *\r\n\t * @param {string} key\r\n\t * @param {mixed} value\r\n\t * @return {object} this\r\n\t */\r\n\tifNull(key, value)\r\n\t{\r\n\t\tif(this.get(key) === null)\r\n\t\t{\r\n\t\t\tthis.set(key, value);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the data local storage key.\r\n\t *\r\n\t * @param {string} key\r\n\t */\r\n\tsetKey(key)\r\n\t{\r\n\t\tthis.key = key;\r\n\t}\r\n\r\n\t/**\r\n\t * This will restore the data from local storage.\r\n\t *\r\n\t * @param {mixed} defaultValue\r\n\t * @returns {bool|void}\r\n\t */\r\n\tresume(defaultValue)\r\n\t{\r\n\t\tlet key = this.key;\r\n\t\tif(!key)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet data;\r\n\t\tlet value = localStorage.getItem(key);\r\n\t\tif(value === null)\r\n\t\t{\r\n\t\t\tif(defaultValue)\r\n\t\t\t{\r\n\t\t\t\tdata = defaultValue;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tdata = JSON.parse(value);\r\n\t\t}\r\n\r\n\t\tthis.set(data);\r\n\t}\r\n\r\n\t/**\r\n\t * This will store the data to the local stoage under\r\n\t * the storage key.\r\n\t *\r\n\t * @returns {bool|void}\r\n\t */\r\n\tstore()\r\n\t{\r\n\t\tlet key = this.key;\r\n\t\tif(!key)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet data = this.get();\r\n\t\tif(!data)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet value = JSON.stringify(data);\r\n\t\tlocalStorage.setItem(key, value);\r\n\t}\r\n\r\n\t/**\r\n\t * This will delete a property value or the model data.\r\n\t *\r\n\t * @param {string} [attrName]\r\n\t * @return {*}\r\n\t */\r\n\tdelete(attrName)\r\n\t{\r\n\t\tif(typeof attrName !== 'undefined')\r\n\t\t{\r\n\t\t\tthis._deleteAttr(this.stage, attrName);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// this will clear the stage and attributes\r\n\t\tthis.setup();\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the value of an attribute.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @return {*}\r\n\t */\r\n\t_getAttr(obj, attr)\r\n\t{\r\n\t\treturn obj[attr];\r\n\t}\r\n\r\n\t/**\r\n\t * This will get a property value or the model data.\r\n\t *\r\n\t * @param {string} [attrName]\r\n\t * @return {*}\r\n\t */\r\n\tget(attrName)\r\n\t{\r\n\t\tif(typeof attrName !== 'undefined')\r\n\t\t{\r\n\t\t\treturn this._getAttr(this.stage, attrName);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn this.getModelData();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will link a data source property to another data source.\r\n\t *\r\n\t * @param {object} data\r\n\t * @param {string|object} attr\r\n\t * @param {string} alias\r\n\t * @return {string|array}\r\n\t */\r\n\tlink(data, attr, alias)\r\n\t{\r\n\t\t// this will get the data source attrs if sending a whole data object\r\n\t\tif(arguments.length === 1 && data.isData === true)\r\n\t\t{\r\n\t\t\tattr = data.get();\r\n\t\t}\r\n\r\n\t\tif(typeof attr !== 'object')\r\n\t\t{\r\n\t\t\treturn this.remoteLink(data, attr, alias);\r\n\t\t}\r\n\r\n\t\tlet tokens = [];\r\n\t\tfor(var prop in attr)\r\n\t\t{\r\n\t\t\tif(attr.hasOwnProperty(prop) === false)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\ttokens.push(this.remoteLink(data, prop));\r\n\t\t}\r\n\t\treturn tokens;\r\n\t}\r\n\r\n\t/**\r\n\t * This will link a remote data source by property.\r\n\t *\r\n\t * @param {object} data\r\n\t * @param {string} attr\r\n\t * @param {string} alias\r\n\t * @return {string}\r\n\t */\r\n\tremoteLink(data, attr, alias)\r\n\t{\r\n\t\tlet childAttr = alias || attr;\r\n\t\tlet value = data.get(attr);\r\n\t\tif(typeof value !== 'undefined' && this.get(attr) !== value)\r\n\t\t{\r\n\t\t\tthis.set(attr, value);\r\n\t\t}\r\n\r\n\t\tlet token = data.on(attr, (propValue, committer) =>\r\n\t\t{\r\n\t\t\tif(committer === this)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tthis.set(childAttr, propValue, data);\r\n\t\t});\r\n\r\n\t\tthis.addLink(token, data);\r\n\r\n\t\tlet remoteToken = this.on(childAttr, (propValue, committer) =>\r\n\t\t{\r\n\t\t\tif(committer === data)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tdata.set(attr, propValue, this);\r\n\t\t});\r\n\r\n\t\tdata.addLink(remoteToken, this);\r\n\t\treturn token;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a link token to the links array.\r\n\t *\r\n\t * @param {string} token\r\n\t * @param {object} data\r\n\t */\r\n\taddLink(token, data)\r\n\t{\r\n\t\tthis.links[token] = data;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a link or all links.\r\n\t *\r\n\t * @param {string} [token]\r\n\t */\r\n\tunlink(token)\r\n\t{\r\n\t\tif(token)\r\n\t\t{\r\n\t\t\tthis.removeLink(token);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet links = this.links;\r\n\t\tif(links.length)\r\n\t\t{\r\n\t\t\tfor(var i = 0, length = links.length; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tthis.removeLink(links[i], false);\r\n\t\t\t}\r\n\t\t\tthis.links = [];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the linked subscription.\r\n\t *\r\n\t * @param {string} token\r\n\t * @param {bool} removeFromLinks\r\n\t */\r\n\tremoveLink(token, removeFromLinks)\r\n\t{\r\n\t\tlet data = this.links[token];\r\n\t\tif(data)\r\n\t\t{\r\n\t\t\tdata.off(token);\r\n\t\t}\r\n\r\n\t\tif(removeFromLinks === false)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tdelete this.links[token];\r\n\t}\r\n}\r\n\r\nBasicData.prototype.isData = true;", "export const DataUtils =\r\n{\r\n /**\r\n * @param {RexExp} deepDataPattern\r\n */\r\n\tdeepDataPattern: /(\\w+)|(?:\\[(\\d)\\))/g,\r\n\r\n\t/**\r\n\t * This will check if a string has deep data.\r\n\t *\r\n\t * @param {string} str\r\n\t * @return {bool}\r\n\t */\r\n\thasDeepData(str)\r\n\t{\r\n\t\treturn (str.indexOf('.') !== -1 || str.indexOf('[') !== -1);\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the deep data segments\r\n\t * @param {string} str\r\n\t * @return {array}\r\n\t */\r\n\tgetSegments(str)\r\n\t{\r\n\t\tvar pattern = this.deepDataPattern;\r\n\t\treturn str.match(pattern);\r\n\t}\r\n};", "import {BasicData} from './basic-data.js';\r\nimport {cloneObject} from './attrs.js';\r\nimport {DataUtils as utils} from './data-utils.js';\r\nimport {dataBinder} from '../data-binder/data-binder.js';\r\n\r\n/**\r\n * Data\r\n *\r\n * This will create a new data object that can be used to\r\n * bind elements to values.\r\n * @class\r\n * @augments BasicData\r\n */\r\nexport class Data extends BasicData\r\n{\r\n\t/**\r\n\t * This will setup the stage and attributes object.\r\n\t */\r\n\tsetup()\r\n\t{\r\n\t\tthis.attributes = {};\r\n\t\tthis.stage = {};\r\n\t}\r\n\r\n\t/**\r\n\t * This will update an attribute value.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t */\r\n\t_updateAttr(obj, attr, val)\r\n\t{\r\n\t\t/* this will check if we need to update\r\n\t\tdeep nested data */\r\n\t\tif(utils.hasDeepData(attr))\r\n\t\t{\r\n\t\t\tlet prop,\r\n\t\t\tprops = utils.getSegments(attr),\r\n\t\t\tlength = props.length,\r\n\t\t\tend = length - 1;\r\n\r\n\t\t\tfor (var i = 0; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tprop = props[i];\r\n\r\n\t\t\t\t/* this will add the value to the last prop */\r\n\t\t\t\tif(i === end)\r\n\t\t\t\t{\r\n\t\t\t\t\tobj[prop] = val;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (obj[prop] === undefined)\r\n\t\t\t\t{\r\n\t\t\t\t\t/* this will check to setup a new object\r\n\t\t\t\t\tor an array if the prop is a number */\r\n\t\t\t\t\tobj[prop] = isNaN(prop)? {} : [];\r\n\t\t\t\t}\r\n\t\t\t\tobj = obj[prop];\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tobj[attr] = val;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the attribute value.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t * @param {object} committer\r\n\t * @param {boolean} stopMerge\r\n\t */\r\n\t_setAttr(attr, val, committer, stopMerge)\r\n\t{\r\n\t\tif(typeof val !== 'object' && val === this.get(attr))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/* this will check to update the model based on who\r\n\t\tupdated it. if the data binder updated the data only\r\n\t\tthe stage data is updated */\r\n\t\tif(!committer && stopMerge !== true)\r\n\t\t{\r\n\t\t\t/* this will update the attribute data because\r\n\t\t\tit was updated outside the data binder */\r\n\t\t\tthis._updateAttr(this.attributes, attr, val);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif(this.dirty === false)\r\n\t\t\t{\r\n\t\t\t\tthis.dirty = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._updateAttr(this.stage, attr, val);\r\n\r\n\t\t/* this will publish the data to the data binder\r\n\t\tto update any ui elements that are subscribed */\r\n\t\tcommitter = committer || this;\r\n\t\tthis._publish(attr, val, committer);\r\n\t}\r\n\r\n\t/**\r\n\t * This will link a data attr object to another data object.\r\n\t *\r\n\t * @param {object} data\r\n\t * @param {string} attr\r\n\t */\r\n\tlinkAttr(data, attr)\r\n\t{\r\n\t\tlet value = data.get(attr);\r\n\t\tif(value)\r\n\t\t{\r\n\t\t\tfor(var prop in value)\r\n\t\t\t{\r\n\t\t\t\tif(value.hasOwnProperty(prop))\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.link(data, attr + '.' + prop, prop);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a new data source by scoping the parent\r\n\t * data attr and linking the two sources.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {object} [constructor]\r\n\t * @returns {object}\r\n\t */\r\n\tscope(attr, constructor)\r\n\t{\r\n\t\tlet value = this.get(attr);\r\n\t\tif(!value)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconstructor = constructor || this.constructor;\r\n\t\tlet data = new constructor(value);\r\n\r\n\t\t/* this will link the new data to the parent attr */\r\n\t\tdata.linkAttr(this, attr);\r\n\t\treturn data;\r\n\t}\r\n\r\n\t/**\r\n\t * This will splice a value from an array and set\r\n\t * the result.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {int} index\r\n\t * @return {object} this\r\n\t */\r\n\tsplice(attr, index)\r\n\t{\r\n\t\tthis.delete(attr + '[' + index + ']');\r\n\t\tthis.refresh(attr);\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a value to an array and set the result.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {mixed} value\r\n\t * @return {object} this\r\n\t */\r\n\tpush(attr, value)\r\n\t{\r\n\t\tlet currentValue = this.get(attr);\r\n\t\tif(Array.isArray(currentValue) === false)\r\n\t\t{\r\n\t\t\tcurrentValue = [];\r\n\t\t}\r\n\r\n\t\tcurrentValue.push(value);\r\n\t\tthis.set(attr, currentValue);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a value to an array and set the result.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {mixed} value\r\n\t * @return {object} this\r\n\t */\r\n\tunshift(attr, value)\r\n\t{\r\n\t\tlet currentValue = this.get(attr);\r\n\t\tif(Array.isArray(currentValue) === false)\r\n\t\t{\r\n\t\t\tcurrentValue = [];\r\n\t\t}\r\n\r\n\t\tcurrentValue.unshift(value);\r\n\t\tthis.set(attr, currentValue);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a value to an array and set the result.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @return {mixed} this\r\n\t */\r\n\tshift(attr)\r\n\t{\r\n\t\tlet currentValue = this.get(attr);\r\n\t\tif(Array.isArray(currentValue) === false)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tlet value = currentValue.shift();\r\n\t\tthis.set(attr, currentValue);\r\n\t\treturn value;\r\n\t}\r\n\r\n\t/**\r\n\t * This will pop the last value from an array and set the result.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @return {mixed}\r\n\t */\r\n\tpop(attr)\r\n\t{\r\n\t\tlet currentValue = this.get(attr);\r\n\t\tif(Array.isArray(currentValue) === false)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tlet value = currentValue.pop();\r\n\t\tthis.set(attr, currentValue);\r\n\t\treturn value;\r\n\t}\r\n\r\n\t/**\r\n\t * This will refresh the value.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @return {object} this\r\n\t */\r\n\trefresh(attr)\r\n\t{\r\n\t\tthis.set(attr, this.get(attr));\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish an update to the data binder.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t * @param {*} committer\r\n\t */\r\n\t_publish(attr, val, committer)\r\n\t{\r\n\t\tthis.publish(attr, val, committer);\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish deep and simple data to the data binder.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t * @param {object} committer\r\n\t */\r\n\tpublishDeep(attr, val, committer)\r\n\t{\r\n\t\tif(utils.hasDeepData(attr))\r\n\t\t{\r\n\t\t\tlet prop,\r\n\t\t\tprops = utils.getSegments(attr),\r\n\t\t\tlength = props.length,\r\n\t\t\tend = length - 1;\r\n\r\n\t\t\t/* the path is a string equivalent of the javascript dot notation path\r\n\t\t\tof the object being published. */\r\n\t\t\tlet path = '',\r\n\t\t\tobj = this.stage;\r\n\t\t\tfor (var i = 0; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tprop = props[i];\r\n\r\n\t\t\t\t/* we need to setup the object to go to the next level\r\n\t\t\t\tof the data object before calling the next property. */\r\n\t\t\t\tobj = obj[prop];\r\n\r\n\t\t\t\tif (i > 0)\r\n\t\t\t\t{\r\n\t\t\t\t\t/* this will add the property to the path based on if its an\r\n\t\t\t\t\tobject property or an array. */\r\n\t\t\t\t\tif(isNaN(prop))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tpath += '.' + prop;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tpath = prop;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar publish;\r\n\t\t\t\tif(i === end)\r\n\t\t\t\t{\r\n\t\t\t\t\t/* if the loop is on the last pass it only needs to publish\r\n\t\t\t\t\tthe val. */\r\n\t\t\t\t\tpublish = val;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\t/* we only want to publish the modified branches. we need to\r\n\t\t\t\t\tget the next property in the props array and create a publish\r\n\t\t\t\t\tobject or array with the next property value. */\r\n\t\t\t\t\tvar nextProp = props[i + 1];\r\n\t\t\t\t\tif(isNaN(nextProp) === false)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tpath += '[' + nextProp + ']';\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar nextAttr = {};\r\n\t\t\t\t\tnextAttr[nextProp] = obj[nextProp];\r\n\t\t\t\t\tpublish = nextAttr;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.publish(path, publish, committer);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.publish(attr, val, committer);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish an update to the data binder.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} pathString\r\n\t * @param {*} obj\r\n\t * @param {*} committer\r\n\t */\r\n\tpublish(pathString, obj, committer)\r\n\t{\r\n\t\tpathString = pathString || \"\";\r\n\t\tthis._publishAttr(pathString, obj, committer);\r\n\r\n\t\tif(obj && typeof obj === 'object')\r\n\t\t{\r\n\t\t\tlet subPath, value;\r\n\t\t\tif(Array.isArray(obj))\r\n\t\t\t{\r\n\t\t\t\tlet length = obj.length;\r\n\t\t\t\tfor(var i = 0; i < length; i++)\r\n\t\t\t\t{\r\n\t\t\t\t\tvalue = obj[i];\r\n\t\t\t\t\tsubPath = pathString + '[' + i + ']';\r\n\t\t\t\t\tthis._checkPublish(subPath, value, committer);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tfor(var prop in obj)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(obj.hasOwnProperty(prop))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tvalue = obj[prop];\r\n\t\t\t\t\t\tsubPath = pathString + '.' + prop;\r\n\t\t\t\t\t\tthis._checkPublish(subPath, value, committer);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t_checkPublish(subPath, val, committer)\r\n\t{\r\n\t\tif(!val || typeof val !== 'object')\r\n\t\t{\r\n\t\t\tthis._publishAttr(subPath, val, committer);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.publish(subPath, val, committer);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish an update on an attribute.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} subPath\r\n\t * @param {*} val\r\n\t * @param {object} committer\r\n\t */\r\n\t_publishAttr(subPath, val, committer)\r\n\t{\r\n\t\t/* save path and value */\r\n\t\tdataBinder.publish(this._dataId + subPath, val, committer);\r\n\r\n\t\tlet message = subPath + ':change';\r\n\t\tthis.eventSub.publish(message, val, committer);\r\n\t}\r\n\r\n\t/**\r\n\t * This will merge the attribute with the stage.\r\n\t * @protected\r\n\t */\r\n\tmergeStage()\r\n\t{\r\n\t\t/* this will clone the stage object to the\r\n\t\tattribute object */\r\n\t\tthis.attributes = cloneObject(this.stage);\r\n\t\tthis.dirty = false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the model data.\r\n\t */\r\n\tgetModelData()\r\n\t{\r\n\t\tthis.mergeStage();\r\n\t\treturn this.attributes;\r\n\t}\r\n\r\n\t/**\r\n\t * This will revert the stage back to the previous attributes.\r\n\t */\r\n\trevert()\r\n\t{\r\n\t\t/* this will reset the stage to the previous\r\n\t\tattributes */\r\n\t\tthis.set(this.attributes);\r\n\t\tthis.dirty = false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will delete an attribute.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @return {*}\r\n\t */\r\n\t_deleteAttr(obj, attr)\r\n\t{\r\n\t\tif(utils.hasDeepData(attr))\r\n\t\t{\r\n\t\t\tlet props = utils.getSegments(attr),\r\n\t\t\tlength = props.length,\r\n\t\t\tend = length - 1;\r\n\r\n\t\t\tfor (var i = 0; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tvar prop = props[i];\r\n\t\t\t\tvar propValue = obj[prop];\r\n\t\t\t\tif (propValue !== undefined)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(i === end)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif(Array.isArray(obj))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tobj.splice(prop, 1);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tdelete obj[prop];\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tobj = propValue;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tdelete obj[attr];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the value of an attribute.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @return {*}\r\n\t */\r\n\t_getAttr(obj, attr)\r\n\t{\r\n\t\tif(utils.hasDeepData(attr))\r\n\t\t{\r\n\t\t\tlet props = utils.getSegments(attr),\r\n\t\t\tlength = props.length,\r\n\t\t\tend = length - 1;\r\n\r\n\t\t\tfor (var i = 0; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tvar prop = props[i];\r\n\t\t\t\tvar propValue = obj[prop];\r\n\t\t\t\tif (propValue !== undefined)\r\n\t\t\t\t{\r\n\t\t\t\t\tobj = propValue;\r\n\r\n\t\t\t\t\tif(i === end)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\treturn obj;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn obj[attr];\r\n\t\t}\r\n\t}\r\n}", "import {BasicData} from './basic-data.js';\r\nimport {dataBinder} from '../data-binder/data-binder.js';\r\n\r\n/**\r\n * SimpleData\r\n *\r\n * This will extend Data to add a simple data object\r\n * that doesn't allow deep nested data.\r\n * @class\r\n * @augments BasicData\r\n */\r\nexport class SimpleData extends BasicData\r\n{\r\n\t/**\r\n\t * This will publish an update to the data binder.\r\n\t *\r\n\t * @override\r\n\t * @protected\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t * @param {*} committer\r\n\t * @param {*} prevValue\r\n\t */\r\n\t_publish(attr, val, committer, prevValue)\r\n\t{\r\n\t\tlet message = attr + ':change';\r\n\t\tthis.eventSub.publish(message, val, committer);\r\n\r\n\t\tcommitter = committer || this;\r\n\r\n\t\tdataBinder.publish(this._dataId + attr, val, committer);\r\n\t}\r\n}", "import {ajax} from '../ajax/ajax.js';\r\nimport {base} from '../../core.js';\r\n\r\n/**\r\n * ModelService\r\n *\r\n * This will create a new model service.\r\n * @class\r\n */\r\nexport class ModelService\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} model\r\n\t */\r\n\tconstructor(model)\r\n\t{\r\n\t\t/**\r\n\t\t * @member {object} model\r\n\t\t */\r\n\t\tthis.model = model;\r\n\r\n\t\t/**\r\n\t\t * @member {string} objectType The return type.\r\n\t\t */\r\n\t\tthis.objectType = this.objectType || 'item';\r\n\r\n\t\tthis.url = '';\r\n\t\tthis.validateCallBack = null;\r\n\t\tthis.init();\r\n\t}\r\n\r\n\tinit()\r\n\t{\r\n\t\tlet model = this.model;\r\n\t\tif(model && model.url)\r\n\t\t{\r\n\t\t\tthis.url = model.url;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if the model is valid.\r\n\t *\r\n\t * @return {boolean}\r\n\t */\r\n\tisValid()\r\n\t{\r\n\t\tlet result = this.validate();\r\n\t\tif(result !== false)\r\n\t\t{\r\n\t\t\tlet callBack = this.validateCallBack;\r\n\t\t\tif(typeof callBack === 'function')\r\n\t\t\t{\r\n\t\t\t\tcallBack(result);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n\r\n\t/**\r\n\t * This should be overriden to validate the model\r\n\t * before submitting.\r\n\t *\r\n\t * @return {boolean}\r\n\t */\r\n\tvalidate()\r\n\t{\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * This can be overriden to add default params\r\n\t * with each request.\r\n\t *\r\n\t * @protected\r\n\t * @return {string}\r\n\t */\r\n\tgetDefaultParams()\r\n\t{\r\n\t\treturn '';\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the request params.\r\n\t *\r\n\t * @protected\r\n\t * @param {(string|object)} params\r\n\t * @return {(string|object)}\r\n\t */\r\n\tsetupParams(params)\r\n\t{\r\n\t\tlet defaults = this.getDefaultParams();\r\n\t\tparams = this.addParams(params, defaults);\r\n\t\treturn params;\r\n\t}\r\n\r\n\t/**\r\n\t * This will convert an object to a string.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} object\r\n\t * @return {string}\r\n\t */\r\n\tobjectToString(object)\r\n\t{\r\n\t\tconst params = [];\r\n\t\tfor (var prop in object)\r\n\t\t{\r\n\t\t\tif(object.hasOwnProperty(prop))\r\n\t\t\t{\r\n\t\t\t\tparams.push(prop + '=' + object[prop]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn params.join('&');\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the params.\r\n\t *\r\n\t * @protected\r\n\t * @param {*} params\r\n\t * @param {*} addingParams\r\n\t * @return {(string|object)}\r\n\t */\r\n\taddParams(params, addingParams)\r\n\t{\r\n\t\tparams = params || {};\r\n\t\tif(typeof params === 'string')\r\n\t\t{\r\n\t\t\tparams = base.parseQueryString(params, false);\r\n\t\t}\r\n\r\n\t\tif(!addingParams)\r\n\t\t{\r\n\t\t\treturn (!this._isFormData(params))? this.objectToString(params) : params;\r\n\t\t}\r\n\r\n\t\tif(typeof addingParams === 'string')\r\n\t\t{\r\n\t\t\taddingParams = base.parseQueryString(addingParams, false);\r\n\t\t}\r\n\r\n\t\tif(this._isFormData(params))\r\n\t\t{\r\n\t\t\tfor(var key in addingParams)\r\n\t\t\t{\r\n\t\t\t\tif(addingParams.hasOwnProperty(key))\r\n\t\t\t\t{\r\n\t\t\t\t\tparams.append(key, addingParams[key]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tparams = Object.assign(params, addingParams);\r\n\t\t\tparams = this.objectToString(params);\r\n\t\t}\r\n\r\n\t\treturn params;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the model by id.\r\n\t *\r\n\t * @param {string} [instanceParams]\r\n\t * @param {function} [callBack]\r\n\t * @return {object}\r\n\t */\r\n\tget(instanceParams, callBack)\r\n\t{\r\n\t\tlet id = this.model.get('id'),\r\n\t\tparams = 'op=get' +\r\n\t\t\t\t\t\t'&id=' + id;\r\n\r\n\t\tlet model = this.model;\r\n\t\treturn this._get('', params, instanceParams, callBack, (response) =>\r\n\t\t{\r\n\t\t\tif(response)\r\n\t\t\t{\r\n\t\t\t\t/* this will update the model with the get request\r\n\t\t\t\tresponse */\r\n\t\t\t\tlet object = this.getObject(response);\r\n\t\t\t\tif(object)\r\n\t\t\t\t{\r\n\t\t\t\t\tmodel.set(object);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the object from the response.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} response\r\n\t * @return {object}\r\n\t */\r\n\tgetObject(response)\r\n\t{\r\n\t\t/* this will update the model with the get request\r\n\t\tresponse */\r\n\t\tlet object = response[this.objectType] || response;\r\n\t\treturn object || false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will return a string with the model data json encoded.\r\n\t *\r\n\t * @protected\r\n\t * @return {string}\r\n\t */\r\n\tsetupObjectData()\r\n\t{\r\n\t\tlet item = this.model.get();\r\n\t\treturn this.objectType + '=' + base.prepareJsonUrl(item);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add or update the model.\r\n\t *\r\n\t * @param {string} [instanceParams]\r\n\t * @param {function} [callBack]\r\n\t * @return {object}\r\n\t */\r\n\tsetup(instanceParams, callBack)\r\n\t{\r\n\t\tif(!this.isValid())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet params = 'op=setup' +\r\n\t\t\t\t\t\t'&' + this.setupObjectData();\r\n\r\n\t\treturn this._put('', params, instanceParams, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the model.\r\n\t *\r\n\t * @param {string} [instanceParams]\r\n\t * @param {function} [callBack]\r\n\t * @return {object}\r\n\t */\r\n\tadd(instanceParams, callBack)\r\n\t{\r\n\t\tif(!this.isValid())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet params = 'op=add' +\r\n\t\t\t\t\t\t'&' + this.setupObjectData();\r\n\r\n\t\treturn this._post('', params, instanceParams, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the model.\r\n\t *\r\n\t * @param {string} [instanceParams]\r\n\t * @param {function} [callBack]\r\n\t * @return {object}\r\n\t */\r\n\tupdate(instanceParams, callBack)\r\n\t{\r\n\t\tif(!this.isValid())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet params = 'op=update' +\r\n\t\t\t\t\t\t'&' + this.setupObjectData();\r\n\r\n\t\treturn this._patch('', params, instanceParams, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will delete the model.\r\n\t *\r\n\t * @param {string} [instanceParams]\r\n\t * @param {function} [callBack]\r\n\t * @return {object}\r\n\t */\r\n\tdelete(instanceParams, callBack)\r\n\t{\r\n\t\tlet id = this.model.get('id'),\r\n\t\tparams = 'op=delete' +\r\n\t\t\t\t\t\t'&id=' + id;\r\n\r\n\t\treturn this._delete('', params, instanceParams, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will list rows of the model.\r\n\t *\r\n\t * @param {string} [instanceParams]\r\n\t * @param {function} [callBack]\r\n\t * @param {int} start\r\n\t * @param {int} count\r\n\t * @param {string} filter\r\n\t * @return {object}\r\n\t */\r\n\tall(instanceParams, callBack, start, count, filter)\r\n\t{\r\n\t\tfilter = filter || '';\r\n\t\tstart = !isNaN(start)? start : 0;\r\n\t\tcount = !isNaN(count)? count : 50;\r\n\r\n\t\tlet params = 'op=all' +\r\n\t\t\t\t\t\t'&option=' + filter +\r\n\t\t\t\t\t\t'&start=' + start +\r\n\t\t\t\t\t\t'&stop=' + count;\r\n\r\n\t\treturn this._get('', params, instanceParams, callBack);\r\n\t}\r\n\r\n\tgetUrl(url)\r\n\t{\r\n\t\tlet baseUrl = this.url;\r\n\t\tif(!url)\r\n\t\t{\r\n\t\t\treturn baseUrl;\r\n\t\t}\r\n\r\n\t\tif(url[0] === '?')\r\n\t\t{\r\n\t\t\treturn baseUrl + url;\r\n\t\t}\r\n\r\n\t\treturn baseUrl += '/' + url;\r\n\t}\r\n\r\n\t/**\r\n\t * This will make an ajax request.\r\n\t *\r\n\t * @param {string} url\r\n\t * @param {string} method\r\n\t * @param {(string|object)} params\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @param {object}\r\n\t */\r\n\tsetupRequest(url, method, params, callBack, requestCallBack)\r\n\t{\r\n\t\tlet settings = {\r\n\t\t\turl: this.getUrl(url),\r\n\t\t\tmethod,\r\n\t\t\tparams,\r\n\t\t\tcompleted: (response, xhr) =>\r\n\t\t\t{\r\n\t\t\t\tif(typeof requestCallBack === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\trequestCallBack(response);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getResponse(response, callBack, xhr);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tlet overrideHeader = this._isFormData(params);\r\n\t\tif(overrideHeader)\r\n\t\t{\r\n\t\t\tsettings.headers = {};\r\n\t\t}\r\n\r\n\t\treturn ajax(settings);\r\n\t}\r\n\r\n\t_isFormData(data)\r\n\t{\r\n\t\treturn data instanceof FormData;\r\n\t}\r\n\r\n\t/**\r\n\t * This will make an ajax request.\r\n\t *\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @param {object}\r\n\t */\r\n\trequest(params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\treturn this._request('', 'POST', params, instanceParams, callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make a GET request.\r\n\t *\r\n\t * @param {string} url\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @param {object}\r\n\t */\r\n\t_get(url, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\tparams = this.setupParams(params);\r\n\t\tparams = this.addParams(params, instanceParams);\r\n\r\n\t\turl = url || '';\r\n\r\n\t\tif(params)\r\n\t\t{\r\n\t\t\turl += '?' + params;\r\n\t\t}\r\n\r\n\t\treturn this.setupRequest(url, \"GET\", '', callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make a POST request.\r\n\t *\r\n\t * @param {string} url\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @param {object}\r\n\t */\r\n\t_post(url, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\treturn this._request(url, 'POST', params, instanceParams, callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make a PUT request.\r\n\t *\r\n\t * @param {string} url\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @param {object}\r\n\t */\r\n\t_put(url, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\treturn this._request(url, 'PUT', params, instanceParams, callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make a PATCH request.\r\n\t *\r\n\t * @param {string} url\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @param {object}\r\n\t */\r\n\t_patch(url, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\treturn this._request(url, 'PATCH', params, instanceParams, callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make a DELETE request.\r\n\t *\r\n\t * @param {string} url\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @param {object}\r\n\t */\r\n\t_delete(url, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\treturn this._request(url, 'DELETE', params, instanceParams, callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make an ajax request.\r\n\t *\r\n\t * @param {string} url\r\n\t * @param {string} method\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @param {object}\r\n\t */\r\n\t_request(url, method, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\tparams = this.setupParams(params);\r\n\t\tparams = this.addParams(params, instanceParams);\r\n\r\n\t\treturn this.setupRequest(url, method, params, callBack, requestCallBack);\r\n\t}\r\n\r\n\tgetResponse(response, callBack, xhr)\r\n\t{\r\n\t\t/* this will check to return the response\r\n\t\tto the callBack function */\r\n\t\tif(typeof callBack === 'function')\r\n\t\t{\r\n\t\t\tcallBack(response, xhr);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic extend(child)\r\n\t{\r\n\t\tif(!child)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tvar parent = this;\r\n\t\tclass service extends parent\r\n\t\t{\r\n\t\t\tconstructor(model)\r\n\t\t\t{\r\n\t\t\t\tsuper(model);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tObject.assign(service.prototype, child);\r\n\r\n\t\treturn service;\r\n\t}\r\n}", "import {Data} from './deep-data.js';\r\nimport {ModelService} from './model-service.js';\r\nimport {setupAttrSettings} from './attrs.js';\r\n\r\n/**\r\n * This will get the defaults from the settings.\r\n *\r\n * @param {object} settings\r\n * @return {object}\r\n */\r\nconst setupDefaultAttr = (settings) =>\r\n{\r\n\tlet attributes = {};\r\n\tif(!settings || typeof settings !== 'object')\r\n\t{\r\n\t\treturn attributes;\r\n\t}\r\n\r\n\tlet defaults = settings.defaults;\r\n\tif(!defaults)\r\n\t{\r\n\t\treturn attributes;\r\n\t}\r\n\r\n\tfor(var prop in defaults)\r\n\t{\r\n\t\tif(defaults.hasOwnProperty(prop))\r\n\t\t{\r\n\t\t\tvar attr = defaults[prop];\r\n\t\t\tif(typeof attr !== 'function')\r\n\t\t\t{\r\n\t\t\t\tattributes[prop] = attr;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tdelete settings.defaults;\r\n\treturn attributes;\r\n};\r\n\r\n/**\r\n * This will get the xhr settings.\r\n *\r\n * @param {object} settings\r\n * @return {object}\r\n */\r\nconst getXhr = (settings) =>\r\n{\r\n\tif(!settings || typeof settings.xhr !== 'object')\r\n\t{\r\n\t\treturn {};\r\n\t}\r\n\r\n\tlet settingsXhr = settings.xhr,\r\n\txhr = Object.assign({}, settingsXhr);\r\n\tdelete settings.xhr;\r\n\treturn xhr;\r\n};\r\n\r\n/* this will track the number of model types */\r\nlet modelTypeNumber = 0;\r\n\r\n/**\r\n * Model\r\n *\r\n * This will extend Data to add a model that can specify\r\n * a service that connects to a remote source.\r\n */\r\nexport class Model extends Data\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} [settings]\r\n\t */\r\n\tconstructor(settings)\r\n\t{\r\n\t\tsuper(settings);\r\n\t\tthis.initialize();\r\n\t}\r\n\r\n\t/**\r\n\t * This adds a method to call if you want the model\r\n\t * to do something when its initialized.\r\n\t */\r\n\tinitialize()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will extend the model to a child model.\r\n\t *\r\n\t * @param {object} [settings]\r\n\t * @return {class}\r\n\t */\r\n\tstatic extend(settings = {})\r\n\t{\r\n\t\tconst parent = this,\r\n\t\txhr = getXhr(settings),\r\n\t\tservice = this.prototype.service.extend(xhr);\r\n\r\n\t\t/* this will setup the default attribute settings for\r\n\t\tthe model */\r\n\t\tlet defaultAttributes = setupDefaultAttr(settings);\r\n\t\tclass model extends parent\r\n\t\t{\r\n\t\t\tconstructor(instanceSettings)\r\n\t\t\t{\r\n\t\t\t\t/* this will get the instance attributes that\r\n\t\t\t\tthe model will set as attribute data */\r\n\t\t\t\tlet instanceAttr = setupAttrSettings(instanceSettings);\r\n\r\n\t\t\t\t/* we want to extend the default attr with the\r\n\t\t\t\tinstance attr before we set the data and call\r\n\t\t\t\tthe parent constructor */\r\n\t\t\t\tinstanceAttr = Object.assign({}, defaultAttributes, instanceAttr);\r\n\t\t\t\tsuper(instanceAttr);\r\n\r\n\t\t\t\t/* this will setup the model service and\r\n\t\t\t\tpass the new model instance to the service */\r\n\t\t\t\tthis.xhr = new service(this);\r\n\t\t\t}\r\n\r\n\t\t\tdataTypeId = 'bm' + (modelTypeNumber++);\r\n\t\t}\r\n\r\n\t\tObject.assign(model.prototype, settings);\r\n\t\tmodel.prototype.service = service;\r\n\r\n\t\treturn model;\r\n\t}\r\n}\r\n\r\nModel.prototype.service = ModelService;", "\r\n import {SimpleData} from '../data/data.js';\r\n import {state} from './state.js';\r\n\r\n /**\r\n * StateTarget\r\n *\r\n * This will create a state target to track the state\r\n * of an object.\r\n * @class\r\n * @augments SimpleData\r\n */\r\nexport class StateTarget extends SimpleData\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {string} id\r\n\t */\r\n\tconstructor(id)\r\n\t{\r\n\t\tsuper();\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\t/**\r\n\t * This will restore a state to the controller.\r\n\t */\r\n\trestore()\r\n\t{\r\n\t\tstate.restore(this.id, this);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the target from the controller.\r\n\t */\r\n\tremove()\r\n\t{\r\n\t\tstate.remove(this.id);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an action to the target.\r\n\t *\r\n\t * @param {string} action\r\n\t * @param {*} state\r\n\t */\r\n\taddAction(action, state)\r\n\t{\r\n\t\tif(typeof state !== 'undefined')\r\n\t\t{\r\n\t\t\tthis.set(action, state);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the state of an action.\r\n\t *\r\n\t * @param {string} action\r\n\t * @return {*}\r\n\t */\r\n\tgetState(action)\r\n\t{\r\n\t\treturn this.get(action);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an action or a callBack\r\n\t * from an action. if no token is passed the\r\n\t * whole action is removed.\r\n\t *\r\n\t * @param {string} action\r\n\t * @param {string} [token]\r\n\t */\r\n\tremoveAction(action, token)\r\n\t{\r\n\t\t/* if we have a token then the token will be\r\n\t\tthe only item removed */\r\n\t\tif(token)\r\n\t\t{\r\n\t\t\tthis.off(action, token);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tlet actions = this.stage;\r\n\t\t\tif(typeof actions[action] !== 'undefined')\r\n\t\t\t{\r\n\t\t\t\tdelete actions[action];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}", "\r\n import {StateTarget} from './state-target.js';\r\n\r\n /**\r\n * StateController\r\n *\r\n * This will create a state controller that can\r\n * add and remove targets, actions, and action\r\n * subscriber callBack functions.\r\n *\r\n * @class\r\n */\r\nclass StateController\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\tthis.targets = {};\r\n\t}\r\n\r\n\t/**\r\n\t * This will restore a state target.\r\n\t *\r\n\t * @param {string} id\r\n\t * @param {object} target\r\n\t */\r\n\trestore(id, target)\r\n\t{\r\n\t\tthis.targets[id] = target;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the state target.\r\n\t *\r\n\t * @param {string} id\r\n\t * @return {object}\r\n\t */\r\n\tgetTarget(id)\r\n\t{\r\n\t\tlet targets = this.targets;\r\n\t\treturn (targets[id] || (targets[id] = new StateTarget(id)));\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the state of an action.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t */\r\n\tgetActionState(targetId, action)\r\n\t{\r\n\t\tconst target = this.getTarget(targetId);\r\n\t\treturn target.get(action);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a new target.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} [action]\r\n\t * @param {*} [state] the primary action state\r\n\t * @return {object}\r\n\t */\r\n\tadd(targetId, action, state)\r\n\t{\r\n\t\tconst target = this.getTarget(targetId);\r\n\t\tif(action)\r\n\t\t{\r\n\t\t\ttarget.addAction(action, state);\r\n\t\t}\r\n\t\treturn target;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a new action to a target.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t * @param {string} [state]\r\n\t * @return {object}\r\n\t */\r\n\taddAction(targetId, action, state)\r\n\t{\r\n\t\treturn this.add(targetId, action, state);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the action from a target.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t * @param {string} [token]\r\n\t */\r\n\tremoveAction(targetId, action, token)\r\n\t{\r\n\t\tthis.off(targetId, action, token);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a new subscriber to the action.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t * @param {function} callBack\r\n\t * @return {string}\r\n\t */\r\n\ton(targetId, action, callBack)\r\n\t{\r\n\t\tlet target = this.getTarget(targetId);\r\n\t\tif(action)\r\n\t\t{\r\n\t\t\treturn target.on(action, callBack);\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a subscriber from an action.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t * @param {string} token\r\n\t */\r\n\toff(targetId, action, token)\r\n\t{\r\n\t\tthis.remove(targetId, action, token);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a target or action or callBack.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} [action]\r\n\t * @param {string} [token]\r\n\t */\r\n\tremove(targetId, action, token)\r\n\t{\r\n\t\tlet targets = this.targets,\r\n\t\ttarget = targets[targetId];\r\n\t\tif(!target)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(action)\r\n\t\t{\r\n\t\t\ttarget.off(action, token);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tdelete targets[targetId];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the action state.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t * @param {*} state\r\n\t */\r\n\tset(targetId, action, state)\r\n\t{\r\n\t\tvar target = this.getTarget(targetId);\r\n\t\ttarget.set(action, state);\r\n\t}\r\n}\r\n\r\nexport const state = new StateController();", "/**\r\n * LayoutParser\r\n *\r\n * This will parse JSON layouts.\r\n * @class\r\n */\r\nexport class LayoutParser\r\n{\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {array} _reserved\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis._reserved = [\r\n\t\t\t'tag',\r\n\t\t\t'bind',\r\n\t\t\t'onCreated',\r\n\t\t\t'route',\r\n\t\t\t'switch',\r\n\t\t\t'useParent',\r\n\t\t\t'useState',\r\n\t\t\t'useData',\r\n\t\t\t'addState',\r\n\t\t\t'map',\r\n\t\t\t'for',\r\n\t\t\t'html',\r\n\t\t\t'onSet',\r\n\t\t\t'onState',\r\n\t\t\t'watch',\r\n\t\t\t'context',\r\n\t\t\t'useContext',\r\n\t\t\t'addContext',\r\n\t\t\t'role',\r\n\t\t\t'aria',\r\n\t\t\t'cache'\r\n\t\t];\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the tag name of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @return {string}\r\n\t */\r\n\tgetElementTag(obj)\r\n\t{\r\n\t\tlet type = 'div',\r\n\t\tnode = obj.tag || obj.t;\r\n\t\tif (typeof node !== 'undefined')\r\n\t\t{\r\n\t\t\ttype = obj.tag = node;\r\n\t\t}\r\n\r\n\t\treturn type;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the element children.\r\n\t *\r\n\t * @param {object} obj\r\n\t */\r\n\tsetupChildren(obj)\r\n\t{\r\n\t\tif(obj.nest)\r\n\t\t{\r\n\t\t\tobj.children = obj.nest;\r\n\t\t\tobj.nest = null;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will parse a layout element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @return {object}\r\n\t */\r\n\tparseElement(obj)\r\n\t{\r\n\t\tlet attr = {},\r\n\t\tchildren = [];\r\n\r\n\t\tlet tag = this.getElementTag(obj);\r\n\t\tif(tag === 'button')\r\n\t\t{\r\n\t\t\tattr.type = attr.type || 'button';\r\n\t\t}\r\n\r\n\t\tthis.setupChildren(obj);\r\n\t\tconst reserved = this._reserved;\r\n\r\n\t\tfor (var key in obj)\r\n\t\t{\r\n\t\t\tif (obj.hasOwnProperty(key))\r\n\t\t\t{\r\n\t\t\t\tvar value = obj[key];\r\n\t\t\t\tif (value === undefined || value === null)\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (reserved.indexOf(key) !== -1)\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/* we need to filter the children from the attr\r\n\t\t\t\tsettings. the children need to keep their order. */\r\n\t\t\t\tif (typeof value !== 'object')\r\n\t\t\t\t{\r\n\t\t\t\t\tattr[key] = value;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tif (key === 'children')\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t//Array.prototype.push.apply(children, value);\r\n\t\t\t\t\t\tchildren = children.concat(value);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tchildren.push(value);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\ttag,\r\n\t\t\tattr,\r\n\t\t\tchildren\r\n\t\t};\r\n\t}\r\n}", "import {base} from '../../core.js';\r\nimport {dataBinder} from '../data-binder/data-binder.js';\r\n\r\nconst dataTracker = base.dataTracker;\r\n\r\nconst NORMALIZED_NAMES =\r\n{\r\n\tclass: 'className',\r\n\ttext: 'textContent',\r\n\tfor: 'htmlFor',\r\n\treadonly: 'readOnly',\r\n\tmaxlength: 'maxLength',\r\n\tcellspacing: 'cellSpacing',\r\n\trowspan: 'rowSpan',\r\n\tcolspan: 'colSpan',\r\n\ttabindex: 'tabIndex',\r\n\tcelpadding: 'cellPadding',\r\n\tuseMap: 'useMap',\r\n\tframeborder: 'frameBorder',\r\n\tcontenteditable: 'contentEditable'\r\n};\r\n\r\n/**\r\n * This will get the javascript property name.\r\n *\r\n * @param {string} prop\r\n * @return {string}\r\n */\r\nexport const normalizeAttr = (prop) =>\r\n{\r\n\treturn NORMALIZED_NAMES[prop] || prop;\r\n};\r\n\r\n/**\r\n * This will remove on from a property.\r\n *\r\n * @param {string} prop\r\n * @return {string}\r\n */\r\nexport const removeEventPrefix = (prop) =>\r\n{\r\n\tif(typeof prop === 'string' && prop.substring(0, 2) === 'on')\r\n\t{\r\n\t\treturn prop.substring(2);\r\n\t}\r\n\treturn prop;\r\n};\r\n\r\n/**\r\n * htmlBuilder\r\n *\r\n * This will create an html builder object that can create\r\n * and remove dom elements.\r\n * @class\r\n */\r\nexport class htmlBuilder\r\n{\r\n\t/**\r\n\t * This will create a new element.\r\n\t *\r\n\t * @param {string} nodeName The node name.\r\n\t * @param {object} attrObject The node attributes.\r\n\t * @param {object} container The node container.\r\n\t * @param {boolean} [prepend=false] Add to the begining of the container.\r\n\t * @return {object} The new element.\r\n\t */\r\n\tcreate(nodeName, attrObject, container, prepend)\r\n\t{\r\n\t\tlet obj = document.createElement(nodeName);\r\n\t\tthis._addElementAttrs(obj, attrObject);\r\n\r\n\t\t/* we want to check if the new element should be\r\n\t\tadded to the begining or end */\r\n\t\tif(prepend === true)\r\n\t\t{\r\n\t\t\tthis.prepend(container, obj);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.append(container, obj);\r\n\t\t}\r\n\t\treturn obj;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the element attributes.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} obj\r\n\t * @param {object} attrObject\r\n\t */\r\n\t_addElementAttrs(obj, attrObject)\r\n\t{\r\n\t\t/* we want to check if we have attrributes to add */\r\n\t\tif(!attrObject || typeof attrObject !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we need to add the type if set to stop ie\r\n\t\tfrom removing the value if set after the value is\r\n\t\tadded */\r\n\t\tlet type = attrObject.type;\r\n\t\tif(typeof type !== 'undefined')\r\n\t\t{\r\n\t\t\tbase.setAttr(obj, 'type', type);\r\n\t\t}\r\n\r\n\t\t/* we want to add each attr to the obj */\r\n\t\tfor(var prop in attrObject)\r\n\t\t{\r\n\t\t\t/* we have already added the type so we need to\r\n\t\t\tskip if the prop is type */\r\n\t\t\tif(attrObject.hasOwnProperty(prop) === false || prop === 'type')\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tvar attrPropValue = attrObject[prop];\r\n\r\n\t\t\t/* we want to check to add the attr settings\r\n\t\t\t by property name */\r\n\t\t\tif(prop === 'innerHTML')\r\n\t\t\t{\r\n\t\t\t\tobj.innerHTML = attrPropValue;\r\n\t\t\t}\r\n\t\t\telse if(prop.substring(4, 1) === '-')\r\n\t\t\t{\r\n\t\t\t\t// this will handle data and aria attributes\r\n\t\t\t\tbase.setAttr(obj, prop, attrPropValue);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tthis.addAttr(obj, prop, attrPropValue);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will add html to an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} content\r\n\t */\r\n\taddHtml(obj, content)\r\n\t{\r\n\t\tif(typeof content !== 'undefined' && content !== '')\r\n\t\t{\r\n\t\t\t/* we need to check if we are adding inner\r\n\t\t\thtml content or just a string */\r\n\t\t\tlet pattern = /(?:<[a-z][\\s\\S]*>)/i;\r\n\t\t\tif(pattern.test(content))\r\n\t\t\t{\r\n\t\t\t\t/* html */\r\n\t\t\t\tobj.innerHTML = content;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\t/* string */\r\n\t\t\t\tobj.textContent = content;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an element attribute.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {object} attr\r\n\t * @param {string} value\r\n\t */\r\n\taddAttr(obj, attr, value)\r\n\t{\r\n\t\tif(value === '' || !attr)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to check to add a value or an event listener */\r\n\t\tlet type = typeof value;\r\n\t\tif(type === 'function')\r\n\t\t{\r\n\t\t\t/* this will add the event using the base events\r\n\t\t\tso the event is tracked */\r\n\t\t\tattr = removeEventPrefix(attr);\r\n\t\t\tbase.addListener(attr, obj, value);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tlet attrName = normalizeAttr(attr);\r\n\t\t\tobj[attrName] = value;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a doc fragment.\r\n\t *\r\n\t * @return {object}\r\n\t */\r\n\tcreateDocFragment()\r\n\t{\r\n\t\treturn document.createDocumentFragment();\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a text node.\r\n\t *\r\n\t * @param {string} text\r\n\t * @param {object} container\r\n\t * @return {object}\r\n\t */\r\n\tcreateTextNode(text, container)\r\n\t{\r\n\t\tlet obj = document.createTextNode(text);\r\n\r\n\t\tif(container)\r\n\t\t{\r\n\t\t\tthis.append(container, obj);\r\n\t\t}\r\n\t\treturn obj;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a text node.\r\n\t *\r\n\t * @param {string} text\r\n\t * @param {object} container\r\n\t * @return {object}\r\n\t */\r\n\tcreateCommentNode(text, container)\r\n\t{\r\n\t\tlet obj = document.createComment(text);\r\n\r\n\t\tif(container)\r\n\t\t{\r\n\t\t\tthis.append(container, obj);\r\n\t\t}\r\n\t\treturn obj;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create the options on a select.\r\n\t *\r\n\t * @param {object} selectElem\r\n\t * @param {array} optionArray\r\n\t * @param {string} [defaultValue]\r\n\t */\r\n\tsetupSelectOptions(selectElem, optionArray, defaultValue)\r\n\t{\r\n\t\tif(!selectElem || typeof selectElem !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(!optionArray || !optionArray.length)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* create each option then add it to the select */\r\n\t\tfor(var n = 0, maxLength = optionArray.length; n < maxLength; n++)\r\n\t\t{\r\n\t\t\tvar settings = optionArray[n];\r\n\t\t\tvar option = selectElem.options[n] = new Option(settings.label, settings.value);\r\n\r\n\t\t\t/* we can select an option if a default value\r\n\t\t\thas been sumbitted */\r\n\t\t\tif(defaultValue !== null && option.value == defaultValue)\r\n\t\t\t{\r\n\t\t\t\toption.selected = true;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an elements data.\r\n\t *\r\n\t * @param {object} ele\r\n\t */\r\n\tremoveElementData(ele)\r\n\t{\r\n\t\t/* we want to do a recursive remove child\r\n\t\tremoval */\r\n\t\tlet children = ele.childNodes;\r\n\t\tif(children)\r\n\t\t{\r\n\t\t\tlet length = children.length - 1;\r\n\t\t\tfor(var i = length; i >= 0; i--)\r\n\t\t\t{\r\n\t\t\t\tvar child = children[i];\r\n\t\t\t\tif(child)\r\n\t\t\t\t{\r\n\t\t\t\t\t/* this will remove the child element data\r\n\t\t\t\t\tbefore the parent is removed */\r\n\t\t\t\t\tthis.removeElementData(child);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tdataTracker.remove(ele);\r\n\r\n\t\tlet bound = ele.bindId;\r\n\t\tif(bound)\r\n\t\t{\r\n\t\t\t/* this will check to remove any data bindings\r\n\t\t\tto the element */\r\n\t\t\tdataBinder.unbind(ele);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an element and its data.\r\n\t *\r\n\t * @param {object} obj\r\n\t */\r\n\tremoveElement(obj)\r\n\t{\r\n\t\tlet container;\r\n\r\n\t\tif(!obj || !(container = obj.parentNode))\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/* this will remove all element data and binding\r\n\t\tand remove from the parent container */\r\n\t\tthis.removeElementData(obj);\r\n\t\tcontainer.removeChild(obj);\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an element.\r\n\t *\r\n\t * @param {object} child\r\n\t */\r\n\tremoveChild(child)\r\n\t{\r\n\t\tthis.removeElement(child);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove all elements from the container.\r\n\t *\r\n\t * @param {object} container\r\n\t */\r\n\tremoveAll(container)\r\n\t{\r\n\t\tif(typeof container === 'object')\r\n\t\t{\r\n\t\t\tlet children = container.childNodes;\r\n\t\t\tfor(var child in children)\r\n\t\t\t{\r\n\t\t\t\tif(children.hasOwnProperty(child))\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.removeElementData(children[child]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcontainer.innerHTML = '';\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This change the parent of an element.\r\n\t *\r\n\t * @param {object} child\r\n\t * @param {object} newParent\r\n\t */\r\n\tchangeParent(child, newParent)\r\n\t{\r\n\t\tnewParent.appendChild(child);\r\n\t}\r\n\r\n\t/**\r\n\t * This will append a child element.\r\n\t *\r\n\t * @param {object} parent\r\n\t * @param {object} child\r\n\t */\r\n\tappend(parent, child)\r\n\t{\r\n\t\tswitch(typeof parent)\r\n\t\t{\r\n\t\t\tcase \"object\":\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"undefined\":\r\n\t\t\t\tparent = document.body;\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tparent.appendChild(child);\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepend a child element.\r\n\t *\r\n\t * @param {object} parent\r\n\t * @param {object} child\r\n\t * @param {object} [optionalNode]\r\n\t */\r\n\tprepend(parent, child, optionalNode)\r\n\t{\r\n\t\tswitch(typeof parent)\r\n\t\t{\r\n\t\t\tcase \"object\":\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"undefined\":\r\n\t\t\t\tparent = document.body;\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tvar node = optionalNode || parent.firstChild;\r\n\t\tparent.insertBefore(child, node);\r\n\t}\r\n\r\n\t/**\r\n\t * This will clone an element.\r\n\t *\r\n\t * @param {object} node\r\n\t * @param {boolean} deepCopy\r\n\t * @return {object}\r\n\t */\r\n\tclone(node, deepCopy)\r\n\t{\r\n\t\tif(!node || typeof node !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tdeepCopy = deepCopy || false;\r\n\t\treturn node.cloneNode(deepCopy);\r\n\t}\r\n}", "import {base} from '../../core.js';\r\nimport {dataBinder} from '../data-binder/data-binder.js';\r\n\r\nconst WATCHER_PATTERN = /(\\[\\[(.*?)\\]\\])/g;\r\n\r\n/**\r\n * WatcherHelper\r\n *\r\n * This helper creates watcher callBacks, parses watcher strings\r\n * and sets up watchers.\r\n */\r\nexport const WatcherHelper =\r\n{\r\n\t/**\r\n\t * This will get the property names to be watched.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} string\r\n\t * @return {(array|null)}\r\n\t */\r\n\t_getWatcherProps(string)\r\n\t{\r\n\t\tlet pattern = /\\[\\[(.*?)\\]\\]/g,\r\n\t\tmatches = string.match(pattern);\r\n\t\tif(matches)\r\n\t\t{\r\n\t\t\tpattern = /(\\[\\[|\\]\\])/g;\r\n\t\t\tfor(var i = 0, length = matches.length; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tmatches[i] = matches[i].replace(pattern, '');\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn matches;\r\n\t},\r\n\r\n\t/**\r\n\t * This will update an element attribute.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {string} attr\r\n\t * @param {string} value\r\n\t */\r\n\tupdateAttr(ele, attr, value)\r\n\t{\r\n\t\tif(attr === 'text' || attr === 'textContent')\r\n\t\t{\r\n\t\t\tele.textContent = value;\r\n\t\t}\r\n\t\telse if(attr === 'innerHTML')\r\n\t\t{\r\n\t\t\tele.innerHTML = value;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif(attr.substring(4, 1) === '-')\r\n\t\t\t{\r\n\t\t\t\tbase.setAttr(ele, attr, value);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tele[attr] = value;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * This will get a watcher callBack.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {(string|array)} data\r\n\t * @param {string} string\r\n\t * @param {string} attr\r\n\t * @param {boolean} isArray\r\n\t * @return {function}\r\n\t */\r\n\t_getWatcherCallBack(ele, data, string, attr, isArray)\r\n\t{\r\n\t\treturn () =>\r\n\t\t{\r\n\t\t\tlet count = 0,\r\n\t\t\tvalue = string.replace(WATCHER_PATTERN, function()\r\n\t\t\t{\r\n\t\t\t\tlet watcherData = (isArray)? data[count] : data;\r\n\t\t\t\tcount++;\r\n\r\n\t\t\t\tlet result = watcherData.get(arguments[2]);\r\n\t\t\t\treturn (typeof result !== 'undefined'? result : '');\r\n\t\t\t});\r\n\t\t\tthis.updateAttr(ele, attr, value);\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the parent data.\r\n\t *\r\n\t * @param {object} parent\r\n\t * @returns {object|null}\r\n\t */\r\n\tgetParentData(parent)\r\n\t{\r\n\t\tif(parent.data)\r\n\t\t{\r\n\t\t\treturn parent.data;\r\n\t\t}\r\n\r\n\t\tif(parent.context && parent.context.data)\r\n\t\t{\r\n\t\t\treturn parent.context.data;\r\n\t\t}\r\n\r\n\t\tif(parent.state)\r\n\t\t{\r\n\t\t\treturn parent.state;\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t},\r\n\r\n\t/**\r\n\t * This will get a watcher value.\r\n\t *\r\n\t * @private\r\n\t * @param {(string|object)} settings\r\n\t * @param {object} parent\r\n\t * @return {array}\r\n\t */\r\n\tgetValue(settings, parent)\r\n\t{\r\n\t\tif(typeof settings === 'string')\r\n\t\t{\r\n\t\t\tsettings =\r\n\t\t\t{\r\n\t\t\t\tvalue: settings\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tlet value = settings.value;\r\n\t\tif(Array.isArray(value) === false)\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * This will setup an array watcher based on a string.\r\n\t\t\t */\r\n\t\t\tvalue = [value, this.getParentData(parent)];\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * This will check to add the default data.\r\n\t\t\t */\r\n\t\t\tif(value.length < 2)\r\n\t\t\t{\r\n\t\t\t\tvalue.push(this.getParentData(parent));\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn value;\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the prop values.\r\n\t *\r\n\t * @param {object} data\r\n\t * @param {string} string\r\n\t * @param {bool} isArray\r\n\t * @return {array}\r\n\t */\r\n\tgetPropValues(data, props, isArray)\r\n\t{\r\n\t\tlet values = [];\r\n\r\n\t\tfor(var i = 0, length = props.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar watcherData = (isArray)? data[i] : data;\r\n\t\t\tvar value = watcherData.get(props[i]);\r\n\t\t\tvalue = (typeof value !== 'undefined'? value : '');\r\n\t\t\tvalues.push(value);\r\n\t\t}\r\n\r\n\t\treturn values;\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the watcher callBack.\r\n\t *\r\n\t * @param {object} settings\r\n\t * @param {object} ele\r\n\t * @param {object} data\r\n\t * @param {string} string\r\n\t * @param {bool} isDataArray\r\n\t * @return {function}\r\n\t */\r\n\tgetCallBack(settings, ele, data, string, isDataArray)\r\n\t{\r\n\t\tlet callBack,\r\n\t\toverrideCallBack = settings.callBack;\r\n\t\tif(typeof overrideCallBack === 'function')\r\n\t\t{\r\n\t\t\tlet props = string.match(WATCHER_PATTERN);\r\n\t\t\tlet isMultiProp = (props && props.length > 1);\r\n\t\t\tcallBack = (value, committer) =>\r\n\t\t\t{\r\n\t\t\t\tvalue = (isMultiProp !== true)? value : this.getPropValues(data, props, isDataArray);\r\n\t\t\t\toverrideCallBack(ele, value, committer);\r\n\t\t\t};\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tlet attr = settings.attr || 'textContent';\r\n\t\t\tcallBack = this._getWatcherCallBack(ele, data, string, attr, isDataArray);\r\n\t\t}\r\n\t\treturn callBack;\r\n\t},\r\n\r\n\t/**\r\n\t * This will add a data watcher.\r\n\t *\r\n\t * @private\r\n\t * @param {object} ele\r\n\t * @param {(string|object)} settings\r\n\t * @param {object} parent\r\n\t */\r\n\taddDataWatcher(ele, settings, parent)\r\n\t{\r\n\t\tlet value = this.getValue(settings, parent),\r\n\t\tdata = value[1];\r\n\t\tif(!data)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet string = value[0],\r\n\t\tisDataArray = Array.isArray(data);\r\n\r\n\t\tlet callBack = this.getCallBack(settings, ele, data, string, isDataArray),\r\n\t\tprops = this._getWatcherProps(string);\r\n\t\tfor(var i = 0, length = props.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar watcherData = (isDataArray)? data[i] : data;\r\n\t\t\tthis.addWatcher(ele, watcherData, props[i], callBack);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * This will setup a data watcher.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {(string|object)} settings\r\n\t * @param {object} parent\r\n\t */\r\n\tsetup(ele, settings, parent)\r\n\t{\r\n\t\tif(!settings)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif(Array.isArray(settings))\r\n\t\t{\r\n\t\t\tsettings = {\r\n\t\t\t\tattr: settings[2],\r\n\t\t\t\tvalue: [settings[0], settings[1]]\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tthis.addDataWatcher(ele, settings, parent);\r\n\t},\r\n\r\n\t/**\r\n\t * This will add a watcher.\r\n\t *\r\n\t * @private\r\n\t * @param {object} ele\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @param {function} callBack\r\n\t */\r\n\taddWatcher(ele, data, prop, callBack)\r\n\t{\r\n\t\tdataBinder.watch(ele, data, prop, callBack);\r\n\t}\r\n};", "import {Unit} from './unit.js';\r\nimport {Component} from './component.js';\r\n\r\n/**\r\n * This will store the jot shorthand method alaises.\r\n */\r\nconst JOT_SHORTHAND_METHODS =\r\n{\r\n created: 'onCreated',\r\n state: 'setupStates',\r\n events: 'setupEevents',\r\n before: 'beforeSetup',\r\n render: 'render',\r\n after: 'afterSetup',\r\n destroy: 'beforeDestroy'\r\n};\r\n\r\n/**\r\n * This will get the jot method by value. If the method is an\r\n * object, it will be nested in a function.\r\n *\r\n * @param {object|function} value\r\n * @returns {function}\r\n */\r\nconst getJotShorthandMethod = (value) =>\r\n{\r\n const valueType = (typeof value);\r\n return (valueType === 'function')? value : function()\r\n {\r\n return value;\r\n };\r\n};\r\n\r\n/**\r\n * This will create a jot component object that will be used\r\n * to create the jot component.\r\n *\r\n * @param {object} settings\r\n * @returns {object}\r\n */\r\nconst JotComponent = (settings) =>\r\n{\r\n const component = {};\r\n if(!settings)\r\n {\r\n return component;\r\n }\r\n\r\n for(var prop in settings)\r\n {\r\n if(settings.hasOwnProperty(prop) === false)\r\n {\r\n continue;\r\n }\r\n\r\n let value = settings[prop];\r\n let alias = JOT_SHORTHAND_METHODS[prop];\r\n if(alias)\r\n {\r\n component[alias] = getJotShorthandMethod(value);\r\n continue;\r\n }\r\n\r\n component[prop] = value;\r\n }\r\n\r\n return component;\r\n};\r\n\r\n/**\r\n * This will create a component class.\r\n *\r\n * @param {object} settings\r\n * @returns {class}\r\n */\r\nconst createComponentClass = (settings) =>\r\n{\r\n class Child extends Component\r\n {\r\n\r\n }\r\n\r\n Object.assign(Child.prototype, settings);\r\n return Child;\r\n};\r\n\r\n/**\r\n * This will create a unit class.\r\n *\r\n * @param {object} settings\r\n * @returns {class}\r\n */\r\n const createUnitClass = (settings) =>\r\n {\r\n class Child extends Unit\r\n {\r\n\r\n }\r\n\r\n Object.assign(Child.prototype, settings);\r\n return Child;\r\n };\r\n\r\n/**\r\n * This will create a shorthand component.\r\n *\r\n * @param {object|function} layout\r\n * @returns {function}\r\n */\r\nexport const Jot = function(layout)\r\n{\r\n if(!layout)\r\n {\r\n return null;\r\n }\r\n\r\n let settings;\r\n switch(typeof layout)\r\n {\r\n case 'object':\r\n if(layout.render)\r\n {\r\n settings = JotComponent(layout);\r\n return createComponentClass(settings);\r\n }\r\n\r\n settings = {\r\n render: function()\r\n {\r\n return layout;\r\n }\r\n };\r\n\r\n // this will create a stateless and dataless unit\r\n return createUnitClass(settings);\r\n case 'function':\r\n settings = {\r\n render: layout\r\n };\r\n\r\n // this will create a stateless and dataless unit\r\n return createUnitClass(settings);\r\n }\r\n};", "import {base} from '../../core.js';\r\nimport {LayoutParser} from './layout-parser.js';\r\nimport {dataBinder} from '../data-binder/data-binder.js';\r\nimport {htmlBuilder, normalizeAttr, removeEventPrefix} from '../html-builder/html-builder.js';\r\nimport {WatcherHelper} from './watcher-helper.js';\r\nimport {Jot} from \"../component/jot.js\";\r\n\r\n/**\r\n * This will create a watch element.\r\n *\r\n * @param {object} data\r\n * @param {string} prop\r\n * @returns {function}\r\n */\r\nexport const Watch = function(data, prop)\r\n{\r\n\treturn function(callBack)\r\n\t{\r\n\t\treturn {\r\n\t\t\tonSet: [data, prop, (ele, value) =>\r\n\t\t\t{\r\n\t\t\t\treturn callBack(value);\r\n\t\t\t}]\r\n\t\t};\r\n\t};\r\n};\r\n\r\n/**\r\n * This will track the context from an atom to remove\r\n * it when the element is removed.\r\n */\r\nbase.dataTracker.addType('context', function(data)\r\n{\r\n\tif(!data)\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\tdata.parent.removeContextBranch(data.branch);\r\n});\r\n\r\nconst parser = new LayoutParser();\r\n\r\n/**\r\n * LayoutBuilder\r\n *\r\n * This will build JSON layouts.\r\n *\r\n * @class\r\n * @augments htmlBuilder\r\n */\r\nexport class LayoutBuilder extends htmlBuilder\r\n{\r\n\t/**\r\n\t * This will create a new element.\r\n\t *\r\n\t * @override\r\n\t * @param {string} nodeName The node name.\r\n\t * @param {object} attrObject The node attributes.\r\n\t * @param {object} container The node container.\r\n\t * @param {object} parent\r\n\t * @return {object} The new element.\r\n\t */\r\n\tcreate(nodeName, attrObject, container, parent)\r\n\t{\r\n\t\tlet obj = document.createElement(nodeName);\r\n\t\tthis._addElementAttrs(obj, attrObject, parent);\r\n\t\tthis.append(container, obj);\r\n\t\treturn obj;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the element attributes.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} obj\r\n\t * @param {object} attrObject\r\n\t * @param {object} parent\r\n\t */\r\n\t_addElementAttrs(obj, attrObject, parent)\r\n\t{\r\n\t\t/* we want to check if we have attrributes to add */\r\n\t\tif(!attrObject || typeof attrObject !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we need to add the type if set to stop ie\r\n\t\tfrom removing the value if set after the value is\r\n\t\tadded */\r\n\t\tlet type = attrObject.type;\r\n\t\tif(typeof type !== 'undefined')\r\n\t\t{\r\n\t\t\tbase.setAttr(obj, 'type', type);\r\n\t\t}\r\n\r\n\t\t/* we want to add each attr to the obj */\r\n\t\tfor(var prop in attrObject)\r\n\t\t{\r\n\t\t\t/* we have already added the type so we need to\r\n\t\t\tskip if the prop is type */\r\n\t\t\tif(attrObject.hasOwnProperty(prop) === false || prop === 'type')\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tvar attrPropValue = attrObject[prop];\r\n\r\n\t\t\t/* we want to check to add the attr settings\r\n\t\t\t\tby property name */\r\n\t\t\tif(prop === 'innerHTML')\r\n\t\t\t{\r\n\t\t\t\tobj.innerHTML = attrPropValue;\r\n\t\t\t}\r\n\t\t\telse if(prop.indexOf('-') !== -1)\r\n\t\t\t{\r\n\t\t\t\t// this will handle data and aria attributes\r\n\t\t\t\tbase.setAttr(obj, prop, attrPropValue);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tthis.addAttr(obj, prop, attrPropValue, parent);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an element attribute.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {object} attr\r\n\t * @param {string} value\r\n\t */\r\n\taddAttr(obj, attr, value, parent)\r\n\t{\r\n\t\tif(value === '' || !attr)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to check to add a value or an event listener */\r\n\t\tlet type = typeof value;\r\n\t\tif(type === 'function')\r\n\t\t{\r\n\t\t\t/* this will add the event using the base events\r\n\t\t\tso the event is tracked */\r\n\t\t\tattr = removeEventPrefix(attr);\r\n\t\t\tbase.addListener(attr, obj, function(e)\r\n\t\t\t{\r\n\t\t\t\tvalue.call(this, e, parent);\r\n\t\t\t});\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tlet attrName = normalizeAttr(attr);\r\n\t\t\tobj[attrName] = value;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will render a function/Unit/Component.\r\n\t *\r\n\t * @param {object|function} layout\r\n\t * @param {object} container\r\n\t * @param {object} [parent]\r\n\t * @returns {object} The layout Unit or Component\r\n\t */\r\n\trender(layout, container, parent)\r\n\t{\r\n\t\tif(!layout)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tswitch(typeof layout)\r\n\t\t{\r\n\t\t\tcase 'object':\r\n\t\t\t\tif(layout.isUnit === true)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.createComponent(layout, container, parent);\r\n\t\t\t\t\treturn layout;\r\n\t\t\t\t}\r\n\t\t\tdefault:\r\n\t\t\t\tlet component = Jot(layout);\r\n\t\t\t\tlet jot = new component();\r\n\t\t\t\tthis.createComponent(jot, container, parent);\r\n\t\t\t\treturn jot;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will build a JSON layout.\r\n\t *\r\n\t * @param {object} obj The JSON layout.\r\n\t * @param {object} [container] The parent receiving the layout.\r\n\t * @param {object} [parent] The component adding the layout.\r\n\t * @return {object} The doc Frag element.\r\n\t */\r\n\tbuild(obj, container, parent)\r\n\t{\r\n\t\tlet fragment = this.createDocFragment();\r\n\r\n\t\tif (Array.isArray(obj))\r\n\t\t{\r\n\t\t\tlet item;\r\n\t\t\tfor (var i = 0, length = obj.length; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\titem = obj[i];\r\n\t\t\t\tthis.buildElement(item, fragment, parent);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.buildElement(obj, fragment, parent);\r\n\t\t}\r\n\r\n\t\tif(container && typeof container === 'object')\r\n\t\t{\r\n\t\t\tcontainer.appendChild(fragment);\r\n\t\t}\r\n\t\treturn fragment;\r\n\t}\r\n\r\n\t/**\r\n\t * This will build an element or component.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {object} container\r\n\t * @param {object} [parent] The component adding the layout.\r\n\t */\r\n\tbuildElement(obj, container, parent)\r\n\t{\r\n\t\tif(!obj)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif(obj.component || obj.isUnit === true)\r\n\t\t{\r\n\t\t\tthis.createComponent(obj, container, parent);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.createElement(obj, container, parent);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will append a child element to a parent.\r\n\t *\r\n\t * @override\r\n\t * @param {object} parent\r\n\t * @param {object} child\r\n\t */\r\n\tappend(parent, child)\r\n\t{\r\n\t\tparent.appendChild(child);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create an element.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} obj\r\n\t * @param {object} container\r\n\t * @param {object} [parent] The component adding the layout.\r\n\t */\r\n\tcreateElement(obj, container, parent)\r\n\t{\r\n\t\tlet settings = parser.parseElement(obj),\r\n\t\tele = this.createNode(settings, container, parent);\r\n\r\n\t\tconst propName = obj.cache;\r\n\t\tif(parent && propName)\r\n\t\t{\r\n\t\t\tparent[propName] = ele;\r\n\t\t}\r\n\r\n\t\t/* we want to recursively add the children to\r\n\t\tthe new element */\r\n\t\tlet children = settings.children;\r\n\t\tif (children.length > 0)\r\n\t\t{\r\n\t\t\tlet child;\r\n\t\t\tfor (var i = 0, length = children.length; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tchild = children[i];\r\n\t\t\t\tif(child === null)\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.buildElement(child, ele, parent);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.addElementDirectives(ele, obj, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the element directives.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {object} obj\r\n\t * @param {object} [parent]\r\n\t */\r\n\taddElementDirectives(ele, obj, parent)\r\n\t{\r\n\t\tif(typeof obj.onCreated === 'function')\r\n\t\t{\r\n\t\t\tobj.onCreated(ele, parent);\r\n\t\t}\r\n\r\n\t\t/* this will check to bind the element to\r\n\t\tthe prop of a data */\r\n\t\tlet bind = obj.bind;\r\n\t\tif(bind)\r\n\t\t{\r\n\t\t\tthis.bindElement(ele, bind, parent);\r\n\t\t}\r\n\r\n\t\tif(obj.route)\r\n\t\t{\r\n\t\t\tthis.addRoute(ele, obj.route, parent);\r\n\t\t}\r\n\r\n\t\tif(obj.switch)\r\n\t\t{\r\n\t\t\tthis.addSwitch(ele, obj.switch, parent);\r\n\t\t}\r\n\r\n\t\tif(obj.html)\r\n\t\t{\r\n\t\t\tthis.addHtml(ele, obj.html);\r\n\t\t}\r\n\r\n\t\tif(obj.useContext)\r\n\t\t{\r\n\t\t\tthis.useContext(ele, obj.useContext, parent);\r\n\t\t}\r\n\r\n\t\tif(obj.addContext)\r\n\t\t{\r\n\t\t\tthis.addContext(ele, obj.addContext, parent);\r\n\t\t}\r\n\r\n\t\tif(obj.context)\r\n\t\t{\r\n\t\t\tthis.context(ele, obj.context, parent);\r\n\t\t}\r\n\r\n\t\tif(obj.role)\r\n\t\t{\r\n\t\t\tthis.addRole(ele, obj.role, parent);\r\n\t\t}\r\n\r\n\t\tif(obj.aria)\r\n\t\t{\r\n\t\t\tthis.addAria(ele, obj.aria, parent);\r\n\t\t}\r\n\r\n\t\tif(parent)\r\n\t\t{\r\n\t\t\tlet onState = obj.onState;\r\n\t\t\tif(onState && onState.length)\r\n\t\t\t{\r\n\t\t\t\tthis.onState(ele, onState, parent);\r\n\t\t\t}\r\n\r\n\t\t\tlet onSet = obj.onSet;\r\n\t\t\tif(onSet && onSet.length)\r\n\t\t\t{\r\n\t\t\t\tthis.onSet(ele, onSet, parent);\r\n\t\t\t}\r\n\r\n\t\t\tlet map = obj.map;\r\n\t\t\tif(map && map.length)\r\n\t\t\t{\r\n\t\t\t\tthis.map(ele, map, parent);\r\n\t\t\t}\r\n\r\n\t\t\tlet forBind = obj.for;\r\n\t\t\tif(forBind && forBind.length)\r\n\t\t\t{\r\n\t\t\t\tthis.for(ele, forBind, parent);\r\n\t\t\t}\r\n\r\n\t\t\tlet useParent = obj.useParent;\r\n\t\t\tif(useParent)\r\n\t\t\t{\r\n\t\t\t\tthis.useParent(ele, useParent, parent);\r\n\t\t\t}\r\n\r\n\t\t\tlet useData = obj.useData;\r\n\t\t\tif(useData)\r\n\t\t\t{\r\n\t\t\t\tthis.useData(ele, useData, parent);\r\n\t\t\t}\r\n\r\n\t\t\tlet useState = obj.useState;\r\n\t\t\tif(useState)\r\n\t\t\t{\r\n\t\t\t\tthis.useState(ele, useState, parent);\r\n\t\t\t}\r\n\r\n\t\t\tlet addState = obj.addState;\r\n\t\t\tif(addState)\r\n\t\t\t{\r\n\t\t\t\tthis.addState(ele, addState, parent);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif(obj.watch)\r\n\t\t{\r\n\t\t\tthis.watch(ele, obj.watch, parent);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the data source from the parent component.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} [parent]\r\n\t * @return {(object|boolean)}\r\n\t */\r\n\t_getDataSource(parent)\r\n\t{\r\n\t\tif(!parent)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(parent.data)\r\n\t\t{\r\n\t\t\treturn parent.data;\r\n\t\t}\r\n\r\n\t\tif(parent.context && parent.context.data)\r\n\t\t{\r\n\t\t\treturn parent.context.data;\r\n\t\t}\r\n\r\n\t\tif(parent.state)\r\n\t\t{\r\n\t\t\treturn parent.state;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will bind an element to data.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {(string|array)} bind\r\n\t * @param {*} parent\r\n\t */\r\n\tbindElement(ele, bind, parent)\r\n\t{\r\n\t\tlet data, prop, filter;\r\n\r\n\t\tif(typeof bind === 'string')\r\n\t\t{\r\n\t\t\tdata = this._getDataSource(parent);\r\n\t\t\tif(!data)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tprop = bind;\r\n\t\t}\r\n\t\telse if(Array.isArray(bind))\r\n\t\t{\r\n\t\t\tif((typeof bind[0] !== 'object'))\r\n\t\t\t{\r\n\t\t\t\tlet dataSource = this._getDataSource(parent);\r\n\t\t\t\tif(!dataSource)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tbind.unshift(dataSource);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t[data, prop, filter] = bind;\r\n\t\t}\r\n\r\n\t\tdataBinder.bind(ele, data, prop, filter);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a route.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {(object|array)} route\r\n\t * @param {object} parent\r\n\t */\r\n\taddRoute(ele, route, parent)\r\n\t{\r\n\t\tif(!route)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(base.isArray(route))\r\n\t\t{\r\n\t\t\tfor(var i = 0, length = route.length; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tthis.setupRoute(ele, route[i], parent);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.setupRoute(ele, route, parent);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup a route.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {object} route\r\n\t * @param {object} parent\r\n\t */\r\n\tsetupRoute(ele, route, parent)\r\n\t{\r\n\t\t// this will check to resume route\r\n\t\t// if(this.checkResume(route))\r\n\t\t// {\r\n\t\t// \tthis.resumeRoute(ele, route.component.route);\r\n\t\t// \treturn;\r\n\t\t// }\r\n\r\n\t\troute.container = ele;\r\n\t\troute.parent = parent;\r\n\t\tlet newRoute = base.router.add(route);\r\n\r\n\t\tthis.trackRoute(ele, newRoute);\r\n\t}\r\n\r\n\t/**\r\n\t * This will check to resume route.\r\n\t *\r\n\t * @param {object} route\r\n\t */\r\n\tcheckResume(route)\r\n\t{\r\n\t\treturn (route && route.component && route.component.route);\r\n\t}\r\n\r\n\t/**\r\n\t * This will resume a route.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {object} route\r\n\t */\r\n\tresumeRoute(ele, route)\r\n\t{\r\n\t\tbase.router.resume(route, ele);\r\n\r\n\t\tthis.trackRoute(ele, route);\r\n\t}\r\n\r\n\t/**\r\n\t * This will track a route.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {object} route\r\n\t */\r\n\ttrackRoute(ele, route)\r\n\t{\r\n\t\tbase.dataTracker.add(ele, 'routes',\r\n\t\t{\r\n\t\t\troute\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a switch.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {array} group\r\n\t * @param {object} parent\r\n\t */\r\n\taddSwitch(ele, group, parent)\r\n\t{\r\n\t\tlet route = group[0];\r\n\t\t// this will check to resume switch\r\n\t\t// if(this.checkResume(route))\r\n\t\t// {\r\n\t\t// \tthis.resumeSwitch(ele, group);\r\n\t\t// \treturn;\r\n\t\t// }\r\n\r\n\t\tfor(var i = 0, length = group.length; i < length; i++)\r\n\t\t{\r\n\t\t\troute = group[i];\r\n\t\t\troute.container = ele;\r\n\t\t\troute.parent = parent;\r\n\t\t}\r\n\r\n\t\tlet id = base.router.addSwitch(group);\r\n\t\tthis.trackSwitch(ele, id);\r\n\t}\r\n\r\n\tresumeSwitch(ele, group)\r\n\t{\r\n\t\tlet id = base.router.resumeSwitch(group, ele);\r\n\t\tthis.trackSwitch(ele, id);\r\n\t}\r\n\r\n\t/**\r\n\t * This will track a switch.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {int} id\r\n\t */\r\n\ttrackSwitch(ele, id)\r\n\t{\r\n\t\tbase.dataTracker.add(ele, 'switch',\r\n\t\t{\r\n\t\t\tid\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will add aria attributes.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {array} role\r\n\t * @param {object} parent\r\n\t */\r\n\taddRole(ele, role, parent)\r\n\t{\r\n\t\tif(!role)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif(role)\r\n\t\t{\r\n\t\t\tbase.setAttr(ele, 'role', role);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will add aria attributes.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {array} attributes\r\n\t * @param {object} parent\r\n\t */\r\n\taddAria(ele, attributes, parent)\r\n\t{\r\n\t\tif(!attributes)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet role = attributes.role;\r\n\t\tif(role)\r\n\t\t{\r\n\t\t\tbase.setAttr(ele, 'role', role);\r\n\t\t\tattributes.role = null;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This will setup the onSet callBack.\r\n\t\t *\r\n\t\t * @param {string} attr\r\n\t\t * @return {function}\r\n\t\t */\r\n\t\tconst onSetCallBack = (attr) =>\r\n\t\t{\r\n\t\t\treturn (ele, val) =>\r\n\t\t\t{\r\n\t\t\t\tvar text = (val)? \"true\" : \"false\";\r\n\t\t\t\tbase.setAttr(ele, attr, text);\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\tfor(var prop in attributes)\r\n\t\t{\r\n\t\t\tif(attributes.hasOwnProperty(prop) === false || attributes[prop] === null)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tvar value = attributes[prop];\r\n\t\t\tvar attr = 'aria-' + prop;\r\n\r\n\t\t\t/* this will setup an onSet to change the attr value\r\n\t\t\twhen the data chnages. */\r\n\t\t\tif(Array.isArray(value))\r\n\t\t\t{\r\n\t\t\t\tvalue.push(onSetCallBack(attr));\r\n\t\t\t\tthis.onSet(ele, value, parent);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tbase.setAttr(ele, attr, value);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the parent context.\r\n\t *\r\n\t * @param {object|null} parent\r\n\t * @returns {object|null}\r\n\t */\r\n\tgetParentContext(parent)\r\n\t{\r\n\t\treturn (!parent)? null : parent.getContext();\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the context attributes.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {function} context\r\n\t * @param {object} [parent]\r\n\t */\r\n\tcontext(ele, context, parent)\r\n\t{\r\n\t\tif(typeof context !== 'function')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet parentContext = this.getParentContext(parent);\r\n\t\tlet attributes = context(parentContext);\r\n\t\tif(!attributes)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._addElementAttrs(ele, attributes, parent);\r\n\t\tthis.addElementDirectives(ele, attributes, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will use the parent context.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {function} callBack\r\n\t * @param {object} [parent]\r\n\t * @returns {void}\r\n\t */\r\n\tuseContext(ele, callBack, parent)\r\n\t{\r\n\t\tif(typeof callBack !== 'function')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet parentContext = this.getParentContext(parent);\r\n\t\tcallBack(parentContext);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add context the parent context.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {array} callBack\r\n\t * @param {object} [parent]\r\n\t * @returns {void}\r\n\t */\r\n\taddContext(ele, callBack, parent)\r\n\t{\r\n\t\tif(typeof callBack !== 'function' || !parent)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet parentContext = this.getParentContext(parent);\r\n\t\tlet childContext = callBack(parentContext);\r\n\t\tif(!childContext)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tparent.addContextBranch(childContext[0], childContext[1]);\r\n\t}\r\n\r\n\t/**\r\n\t * This will track the child context on the element.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {string} branchName\r\n\t * @param {object} parent\r\n\t */\r\n\ttrackContext(ele, branchName, parent)\r\n\t{\r\n\t\tbase.dataTracker.add(ele, 'context',\r\n\t\t{\r\n\t\t\tbranch: branchName,\r\n\t\t\tparent: parent\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a watcher.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {(array|object)} watcher\r\n\t * @param {object} [parent]\r\n\t */\r\n\twatch(ele, watcher, parent)\r\n\t{\r\n\t\tif(!watcher)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(Array.isArray(watcher) && typeof watcher[0] !== 'string')\r\n\t\t{\r\n\t\t\tfor(var i = 0, length = watcher.length; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tWatcherHelper.setup(ele, watcher[i], parent);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tWatcherHelper.setup(ele, watcher, parent);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will pass the parent state to the callBack.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {function} callBack\r\n\t * @param {object} parent\r\n\t */\r\n\tuseParent(ele, callBack, parent)\r\n\t{\r\n\t\tif(!callBack || !parent)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tcallBack(parent, ele);\r\n\t}\r\n\r\n\t/**\r\n\t * This will pass the parent state to the callBack.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {function} callBack\r\n\t * @param {object} parent\r\n\t */\r\n\tuseData(ele, callBack, parent)\r\n\t{\r\n\t\tif(!callBack || !parent)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tcallBack(parent.data, ele);\r\n\t}\r\n\r\n\t/**\r\n\t * This will pass the parent state to the callBack.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {function} callBack\r\n\t * @param {object} parent\r\n\t */\r\n\tuseState(ele, callBack, parent)\r\n\t{\r\n\t\tif(!callBack || !parent)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tcallBack(parent.state, ele);\r\n\t}\r\n\r\n\t/**\r\n\t * This will pass the parent state to the callBack.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {function} callBack\r\n\t * @param {object} parent\r\n\t */\r\n\taddState(ele, callBack, parent)\r\n\t{\r\n\t\tif(!callBack || !parent)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(parent.stateHelper)\r\n\t\t{\r\n\t\t\tlet state = parent.state;\r\n\t\t\tlet states = callBack(state);\r\n\t\t\tparent.stateHelper.addStates(states);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will map children to the element.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {array} settings\r\n\t * @param {object} parent\r\n\t */\r\n\tmap(ele, settings, parent)\r\n\t{\r\n\t\tlet items = settings[0];\r\n\t\tif(!items || items.length < 1)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet item = settings[1];\r\n\t\tlet children = [];\r\n\t\tfor(var i = 0, length = items.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar row = items[i];\r\n\t\t\tif(!row)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tvar layout = item(row, i);\r\n\t\t\tif(layout === null)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tchildren.push(layout);\r\n\t\t}\r\n\r\n\t\treturn this.build(children, ele, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will watch a data attr and update the\r\n\t * children to the element when the attr value is updated.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {array} settings\r\n\t * @param {object} parent\r\n\t */\r\n\tfor(ele, settings, parent)\r\n\t{\r\n\t\tlet data, prop, item, scope;\r\n\r\n\t\tif(settings.length < 3)\r\n\t\t{\r\n\t\t\tconst parentData = this.getParentSetData(parent);\r\n\t\t\tif(!parentData)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tdata = parentData;\r\n\t\t\tprop = settings[0];\r\n\t\t\titem = settings[1];\r\n\t\t\tscope = settings[2];\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tdata = settings[0];\r\n\t\t\tprop = settings[1];\r\n\t\t\titem = settings[2];\r\n\t\t\tscope = settings[3];\r\n\t\t}\r\n\r\n\t\tlet scopeData = (scope !== false);\r\n\t\tdataBinder.watch(ele, data, prop, (items) =>\r\n\t\t{\r\n\t\t\tthis.removeAll(ele);\r\n\t\t\tif(!items || items.length < 1)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tlet children = [];\r\n\t\t\tfor(var i = 0, length = items.length; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tvar scoped = (scopeData)? data.scope(prop + '[' + i + ']') : null;\r\n\t\t\t\tvar layout = item(items[i], i, scoped);\r\n\t\t\t\tif(layout === null)\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tchildren.push(layout);\r\n\t\t\t}\r\n\r\n\t\t\treturn this.build(children, ele, parent);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an onState watcher.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {array} onState\r\n\t * @param {object} parent\r\n\t */\r\n\tonState(ele, onState, parent)\r\n\t{\r\n\t\tthis.onUpdate(ele, parent.state, onState, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the parent set data.\r\n\t *\r\n\t * @param {object} parent\r\n\t * @returns {object|null}\r\n\t */\r\n\tgetParentSetData(parent)\r\n\t{\r\n\t\tif(parent.data)\r\n\t\t{\r\n\t\t\treturn parent.data;\r\n\t\t}\r\n\r\n\t\tif(parent.context && parent.context.data)\r\n\t\t{\r\n\t\t\treturn parent.context.data;\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an onSet watcher.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {array} onSet\r\n\t * @param {object} parent\r\n\t */\r\n\tonSet(ele, onSet, parent)\r\n\t{\r\n\t\tconst data = this.getParentSetData(parent);\r\n\t\tthis.onUpdate(ele, data, onSet, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup a data watcher.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @param {(function|object)} callBack\r\n\t * @param {string} parent\r\n\t */\r\n\tonUpdate(ele, data, settings, parent)\r\n\t{\r\n\t\tlet prop,\r\n\t\tcallBack,\r\n\t\tupdate;\r\n\r\n\t\tif(base.isArray(settings[0]))\r\n\t\t{\r\n\t\t\tfor(var i = 0, maxLength = settings.length; i < maxLength; i++)\r\n\t\t\t{\r\n\t\t\t\tvar itemSettings = settings[i];\r\n\t\t\t\tif(!itemSettings)\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.onUpdate(ele, data, itemSettings, parent);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif(settings.length < 3)\r\n\t\t{\r\n\t\t\t[prop, callBack] = settings;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t[data, prop, callBack] = settings;\r\n\t\t}\r\n\r\n\t\tif(!data || !prop)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tswitch(typeof callBack)\r\n\t\t{\r\n\t\t\tcase 'object':\r\n\t\t\t\tupdate = (value) =>\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.addClass(ele, callBack, value);\r\n\t\t\t\t};\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'function':\r\n\t\t\t\tupdate = (value) =>\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.updateElement(ele, callBack, prop, value, parent);\r\n\t\t\t\t};\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tdataBinder.watch(ele, data, prop, update);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup a data watcher.\r\n\t *\r\n\t * @private\r\n\t * @param {object} ele\r\n\t * @param {function} callBack\r\n\t * @param {string} value\r\n\t * @param {string} parent\r\n\t */\r\n\tupdateElement(ele, callBack, prop, value, parent)\r\n\t{\r\n\t\tlet result = callBack(ele, value, parent);\r\n\t\tswitch(typeof result)\r\n\t\t{\r\n\t\t\tcase 'object':\r\n\t\t\t\tif(parent && result && result.isUnit === true && parent.persist === true && parent.state)\r\n\t\t\t\t{\r\n\t\t\t\t\tlet key = prop + ':' + value,\r\n\t\t\t\t\tstate = parent.state,\r\n\t\t\t\t\tpreviousResult = state.get(key);\r\n\t\t\t\t\tif(typeof previousResult !== 'undefined')\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tresult = previousResult;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tstate.set(key, result);\r\n\t\t\t\t}\r\n\t\t\t\tthis.rebuild(ele, result, parent);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'string':\r\n\t\t\t\tthis.addHtml(ele, result);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will add or remove a class from an element.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {object} stateStyles\r\n\t * @param {*} newValue\r\n\t */\r\n\taddClass(ele, stateStyles, newValue)\r\n\t{\r\n\t\tfor(var prop in stateStyles)\r\n\t\t{\r\n\t\t\tif(!stateStyles.hasOwnProperty(prop) || !prop)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tif(stateStyles[prop] === newValue)\r\n\t\t\t{\r\n\t\t\t\tbase.addClass(ele, prop);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tbase.removeClass(ele, prop);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will reset an element innerHTML and rebuild.\r\n\t *\r\n\t * @private\r\n\t * @param {object} ele\r\n\t * @param {object} layout\r\n\t * @param {object} parent\r\n\t */\r\n\trebuild(ele, layout, parent)\r\n\t{\r\n\t\tthis.removeAll(ele);\r\n\t\tthis.build(layout, ele, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a component.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} obj\r\n\t * @param {object} container\r\n\t * @param {object} parent\r\n\t */\r\n\tcreateComponent(obj, container, parent)\r\n\t{\r\n\t\t// this will allow both cached components or native components\r\n\t\tconst component = obj.component || obj;\r\n\t\tcomponent.parent = parent;\r\n\r\n\t\tif(parent && parent.persist === true && component.persist !== false)\r\n\t\t{\r\n\t\t\tcomponent.persist = true;\r\n\t\t}\r\n\r\n\t\tif(component.cacheable && parent)\r\n\t\t{\r\n\t\t\tparent[component.cacheable] = component;\r\n\t\t}\r\n\r\n\t\tcomponent.setup(container);\r\n\r\n\t\tif(obj.component && typeof obj.onCreated === 'function')\r\n\t\t{\r\n\t\t\tobj.onCreated(component);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a node.\r\n\t *\r\n\t * @param {object} settings\r\n\t * @param {object} container\r\n\t * @param {object} parent\r\n\t * @return {object}\r\n\t */\r\n\tcreateNode(settings, container, parent)\r\n\t{\r\n\t\tlet tag = settings.tag;\r\n\t\tif(tag === 'text')\r\n\t\t{\r\n\t\t\tlet attr = settings.attr;\r\n\t\t\tlet text = attr.textContent || attr.text;\r\n\t\t\treturn this.createTextNode(text, container);\r\n\t\t}\r\n\t\telse if(tag === 'comment')\r\n\t\t{\r\n\t\t\tlet attr = settings.attr;\r\n\t\t\tlet text = attr.text;\r\n\t\t\treturn this.createCommentNode(text, container);\r\n\t\t}\r\n\r\n\t\treturn this.create(tag, settings.attr, container, parent);\r\n\t}\r\n}\r\n\r\nexport const builder = new LayoutBuilder();\r\n\r\nbase.augment(\r\n{\r\n\t/**\r\n\t * This will build a JSON layout.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {object} [container]\r\n\t * @param {object} [parent]\r\n\t * @return {object}\r\n\t */\r\n\tbuildLayout(obj, container, parent)\r\n\t{\r\n\t\tbuilder.build(obj, container, parent);\r\n\t}\r\n});", "import {base} from '../../core.js';\r\nimport {builder} from '../layout/layout-builder.js';\r\nimport {dataBinder} from '../data-binder/data-binder.js';\r\n\r\n/* this will register the component system to the\r\ndata tracker to remove components that have been\r\nnested in layouts. */\r\nbase.dataTracker.addType('components', (data) =>\r\n{\r\n\tif(!data)\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\r\n\tlet component = data.component;\r\n\tif(component && component.rendered === true)\r\n\t{\r\n\t\tcomponent.prepareDestroy();\r\n\t}\r\n});\r\n\r\nlet unitNumber = 0;\r\n\r\n/**\r\n * Unit\r\n *\r\n * @class\r\n *\r\n * This will allow units to be extended\r\n * from a single factory.\r\n *\r\n * @example\r\n * var Alert = base.Unit.extend(\r\n *\t{\r\n *\t\tconstructor: function(props)\r\n *\t\t{\r\n *\t\t\t// this will setup the component id\r\n *\t\t\tbase.Component.call(this, props);\r\n *\t\t},\r\n *\r\n *\t\trender: function()\r\n *\t\t{\r\n *\t\t\treturn {\r\n *\r\n *\t\t\t};\r\n *\t\t}\r\n *\t});\r\n */\r\nexport class Unit\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} [props]\r\n\t */\r\n\tconstructor(props)\r\n\t{\r\n\t\t/**\r\n\t\t * @param {bool} isUnit\r\n\t\t */\r\n\t\tthis.isUnit = true;\r\n\r\n\t\tthis.init();\r\n\t\tthis.setupProps(props);\r\n\t\tthis.onCreated();\r\n\r\n\t\tthis.rendered = false;\r\n\t\tthis.container = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the component number and unique\r\n\t * instance id for the component elements.\r\n\t * @protected\r\n\t */\r\n\tinit()\r\n\t{\r\n\t\tthis.id = 'cp-' + (unitNumber++);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the component props.\r\n\t *\r\n\t * @param {object} [props]\r\n\t */\r\n\tsetupProps(props)\r\n\t{\r\n\t\tif(!props || typeof props !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tfor(var prop in props)\r\n\t\t{\r\n\t\t\tif(props.hasOwnProperty(prop))\r\n\t\t\t{\r\n\t\t\t\tthis[prop] = props[prop];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the parent context.\r\n\t *\r\n\t * @returns {object|null}\r\n\t */\r\n\tgetParentContext()\r\n\t{\r\n\t\tif(!this.parent)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn this.parent.getContext();\r\n\t}\r\n\r\n\t/**\r\n\t * This will set up the context.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tsetupContext()\r\n\t{\r\n\t\tlet parentContext = this.getParentContext();\r\n\t\tlet context = this.setContext(parentContext);\r\n\t\tif(context)\r\n\t\t{\r\n\t\t\tthis.context = context;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.context = parentContext;\r\n\t\tthis.setupAddingContext();\r\n\t}\r\n\r\n\t/**\r\n\t * This will set up the adding context.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tsetupAddingContext()\r\n\t{\r\n\t\tlet parentContext = this.context;\r\n\t\tlet context = this.addContext(parentContext);\r\n\t\tif(!context)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet branchName = context[0];\r\n\t\tif(!branchName)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.addingContext = true;\r\n\t\tthis.contextBranchName = branchName;\r\n\t\tthis.addContextBranch(branchName, context[1]);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a branch to the context.\r\n\t *\r\n\t * @param {string} branchName\r\n\t * @param {mixed} value\r\n\t */\r\n\taddContextBranch(branchName, value)\r\n\t{\r\n\t\tthis.context = this.context || {};\r\n\t\tthis.context[branchName] = value;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the component context.\r\n\t *\r\n\t * @param {object|null} context\r\n\t * @returns {object|null}\r\n\t */\r\n\tsetContext(context)\r\n\t{\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add context to the parent context.\r\n\t *\r\n\t * @param {object|null} context\r\n\t * @return {array|null}\r\n\t */\r\n\taddContext(context)\r\n\t{\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the added context from the parent.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tremoveContext()\r\n\t{\r\n\t\tif(!this.addingContext)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.removeContextBranch(this.contextBranchName);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a context branch.\r\n\t *\r\n\t * @param {string} branch\r\n\t * @returns {void}\r\n\t */\r\n\tremoveContextBranch(branch)\r\n\t{\r\n\t\tif(!branch)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tdelete this.context[branch];\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the context.\r\n\t *\r\n\t * @returns {object|null}\r\n\t */\r\n\tgetContext()\r\n\t{\r\n\t\treturn this.context;\r\n\t}\r\n\r\n\t/**\r\n\t * override this to do something when created.\r\n\t */\r\n\tonCreated()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will render the component.\r\n\t *\r\n\t * @return {object}\r\n\t */\r\n\trender()\r\n\t{\r\n\t\treturn {\r\n\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will cache the layout panel and set the main id.\r\n\t * @param {object} layout\r\n\t * @return {object}\r\n\t */\r\n\t_cacheRoot(layout)\r\n\t{\r\n\t\tif(!layout)\r\n\t\t{\r\n\t\t\treturn layout;\r\n\t\t}\r\n\r\n\t\tif(!layout.id)\r\n\t\t{\r\n\t\t\tlayout.id = this.getId();\r\n\t\t}\r\n\r\n\t\tlayout.cache = 'panel';\r\n\t\treturn layout;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create the component layout.\r\n\t * @protected\r\n\t * @return {object}\r\n\t */\r\n\t_createLayout()\r\n\t{\r\n\t\tif(this.persist)\r\n\t\t{\r\n\t\t\treturn this._layout || (this._layout = this.render());\r\n\t\t}\r\n\r\n\t\treturn this.render();\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepare the layout.\r\n\t *\r\n\t * @protected\r\n\t * @return {object}\r\n\t */\r\n\tprepareLayout()\r\n\t{\r\n\t\tlet layout = this._createLayout();\r\n\t\treturn this._cacheRoot(layout);\r\n\t}\r\n\r\n\t/**\r\n\t * This will build the layout.\r\n\t * @protected\r\n\t */\r\n\tbuildLayout()\r\n\t{\r\n\t\tlet layout = this.prepareLayout();\r\n\t\tthis.build(layout, this.container);\r\n\r\n\t\tbase.dataTracker.add(this.panel, 'components',\r\n\t\t{\r\n\t\t\tcomponent: this\r\n\t\t});\r\n\r\n\t\tthis.rendered = true;\r\n\t}\r\n\r\n\t/**\r\n\t * This will build a layout.\r\n\t *\r\n\t * @param {object} layout\r\n\t * @param {object} container\r\n\t * @return {object}\r\n\t */\r\n\tbuild(layout, container)\r\n\t{\r\n\t\treturn builder.build(layout, container, this);\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepend layout to a container.\r\n\t *\r\n\t * @param {object} layout\r\n\t * @param {object} container\r\n\t * @param {object} [optionalNode]\r\n\t */\r\n\tprepend(layout, container, optionalNode)\r\n\t{\r\n\t\tvar frag = this.build(layout, null);\r\n\t\tbuilder.prepend(container, frag, optionalNode);\r\n\t}\r\n\r\n\t/**\r\n\t * This will rebuild a layout.\r\n\t *\r\n\t * @param {object} layout\r\n\t * @param {object} container\r\n\t * @return {object}\r\n\t */\r\n\trebuild(layout, container)\r\n\t{\r\n\t\treturn builder.rebuild(container, layout, this);\r\n\t}\r\n\r\n\t/**\r\n\t * This will render the content on condition of a property.\r\n\t *\r\n\t * @param {mixed} prop\r\n\t * @param {mixed} content\r\n\t * @returns {object}\r\n\t */\r\n\tif(prop, content)\r\n\t{\r\n\t\treturn (!prop)? null : (content || prop);\r\n\t}\r\n\r\n\t/**\r\n\t * This will map an array to children elements.\r\n\t *\r\n\t * @param {array} items\r\n\t * @param {function} callBack\r\n\t * @returns {array}\r\n\t */\r\n\tmap(items, callBack)\r\n\t{\r\n\t\tlet children = [];\r\n\t\tif(!items || items.length < 1)\r\n\t\t{\r\n\t\t\treturn children;\r\n\t\t}\r\n\r\n\t\tfor(var i = 0, length = items.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar item = callBack(items[i], i);\r\n\t\t\tchildren.push(item);\r\n\t\t}\r\n\t\treturn children;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove children from an element.\r\n\t *\r\n\t * @param {object} layout\r\n\t * @param {object} container\r\n\t * @return {object}\r\n\t */\r\n\tremoveAll(ele)\r\n\t{\r\n\t\treturn builder.removeAll(ele);\r\n\t}\r\n\r\n\t/**\r\n\t * This will cache an element when its created by\r\n\t * saving a reference to it as a property on the\r\n\t * component.\r\n\t *\r\n\t * @param {string} propName The name to use as\r\n\t * the reference.\r\n\t * @param {object} layout\r\n\t * @param {function} [callBack]\r\n\t * @return {object}\r\n\t */\r\n\tcache(propName, layout, callBack)\r\n\t{\r\n\t\tif(!layout || typeof layout !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(layout.isUnit === true)\r\n\t\t{\r\n\t\t\tlayout =\r\n\t\t\t{\r\n\t\t\t\tcomponent: layout\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tlayout.onCreated = (element) =>\r\n\t\t{\r\n\t\t\tthis[propName] = element;\r\n\r\n\t\t\tif(typeof callBack === 'function')\r\n\t\t\t{\r\n\t\t\t\tcallBack(element);\r\n\t\t\t}\r\n\t\t};\r\n\t\treturn layout;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get an id of the component or the full\r\n\t * id that has the component id prepended to the\r\n\t * requested id.\r\n\t *\r\n\t * @param {string} [id]\r\n\t * @return {string}\r\n\t */\r\n\tgetId(id)\r\n\t{\r\n\t\tlet mainId = this.id;\r\n\t\tif(typeof id === 'string')\r\n\t\t{\r\n\t\t\tmainId += '-' + id;\r\n\t\t}\r\n\t\treturn mainId;\r\n\t}\r\n\r\n\t/**\r\n\t * This will initialize the component.\r\n\t * @protected\r\n\t */\r\n\tinitialize()\r\n\t{\r\n\t\tthis.setupContext();\r\n\t\tthis.beforeSetup();\r\n\t\tthis.buildLayout();\r\n\t\tthis.afterSetup();\r\n\t}\r\n\r\n\t/**\r\n\t * override this to do something before setup.\r\n\t */\r\n\tbeforeSetup()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * override this to do something after setup.\r\n\t */\r\n\tafterSetup()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup and render the component.\r\n\t * @param {object} container\r\n\t */\r\n\tsetup(container)\r\n\t{\r\n\t\tthis.container = container;\r\n\t\tthis.initialize();\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the component.\r\n\t * @protected\r\n\t */\r\n\tremove()\r\n\t{\r\n\t\tthis.prepareDestroy();\r\n\t\tthis.removeContext();\r\n\r\n\t\tlet panel = this.panel || this.id;\r\n\t\tbuilder.removeElement(panel);\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepare the component to be destroyed.\r\n\t */\r\n\tprepareDestroy()\r\n\t{\r\n\t\tthis.rendered = false;\r\n\t\tthis.beforeDestroy();\r\n\t}\r\n\r\n\t/**\r\n\t * Override this to do something before destroy.\r\n\t */\r\n\tbeforeDestroy()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will destroy the component.\r\n\t */\r\n\tdestroy()\r\n\t{\r\n\t\tthis.remove();\r\n\t}\r\n\r\n\t/**\r\n\t * This will bind and element to data.\r\n\t *\r\n\t * @param {object} element\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @param {function} filter\r\n\t */\r\n\tbindElement(element, data, prop, filter)\r\n\t{\r\n\t\tif(element)\r\n\t\t{\r\n\t\t\tdataBinder.bind(element, data, prop, filter);\r\n\t\t}\r\n\t}\r\n}", "import {base} from '../../core.js';\r\n\r\n/**\r\n * EventHelper\r\n *\r\n * This will create an event object to make\r\n * adding and removing events easier.\r\n * @class\r\n */\r\nexport class EventHelper\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\tthis.events = [];\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an array of events.\r\n\t *\r\n\t * @param {array} events\r\n\t */\r\n\taddEvents(events)\r\n\t{\r\n\t\tlet length = events.length;\r\n\t\tif(length < 1)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet event;\r\n\t\tfor(var i = 0; i < length; i++)\r\n\t\t{\r\n\t\t\tevent = events[i];\r\n\t\t\tthis.on(...event);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an event.\r\n\t *\r\n\t * @param {string} event\r\n\t * @param {object} obj\r\n\t * @param {function} callBack\r\n\t * @param {boolean} capture\r\n\t */\r\n\ton(event, obj, callBack, capture)\r\n\t{\r\n\t\tbase.on(event, obj, callBack, capture);\r\n\r\n\t\tthis.events.push({\r\n\t\t\tevent,\r\n\t\t\tobj,\r\n\t\t\tcallBack,\r\n\t\t\tcapture\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an event.\r\n\t *\r\n\t * @param {string} event\r\n\t * @param {object} obj\r\n\t * @param {function} callBack\r\n\t * @param {boolean} capture\r\n\t */\r\n\toff(event, obj, callBack, capture)\r\n\t{\r\n\t\tbase.off(event, obj, callBack, capture);\r\n\r\n\t\tlet option,\r\n\t\tevents = this.events;\r\n\t\tfor(var i = 0, length = events.length; i < length; i++)\r\n\t\t{\r\n\t\t\toption = events[i];\r\n\t\t\tif(option.event === event && option.obj === obj)\r\n\t\t\t{\r\n\t\t\t\tevents.splice(i, 1);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will set all events.\r\n\t */\r\n\tset()\r\n\t{\r\n\t\tlet event,\r\n\t\tevents = this.events;\r\n\t\tfor(var i = 0, length = events.length; i < length; i++)\r\n\t\t{\r\n\t\t\tevent = events[i];\r\n\t\t\tbase.on(event.event, event.obj, event.callBack, event.capture);\r\n\t\t}\r\n\t}\r\n\r\n\tunset()\r\n\t{\r\n\t\tlet event,\r\n\t\tevents = this.events;\r\n\t\tfor(var i = 0, length = events.length; i < length; i++)\r\n\t\t{\r\n\t\t\tevent = events[i];\r\n\t\t\tbase.off(event.event, event.obj, event.callBack, event.capture);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will reset the events.\r\n\t */\r\n\treset()\r\n\t{\r\n\t\tthis.unset();\r\n\t\tthis.events = [];\r\n\t}\r\n}", "import {state} from '../state/state.js';\r\n\r\n/**\r\n * StateHelper\r\n *\r\n * This is a helper to manage component states.\r\n */\r\nexport class StateHelper\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} state\r\n\t * @param {object} states\r\n\t */\r\n\tconstructor(state, states)\r\n\t{\r\n\t\tthis.remoteStates = [];\r\n\r\n\t\tlet actions = this.convertStates(states);\r\n\t\tthis.addStatesToTarget(state, actions);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add states to a state.\r\n\t *\r\n\t * @param {object} state\r\n\t * @param {object} states\r\n\t */\r\n\taddStates(state, states)\r\n\t{\r\n\t\tlet actions = this.convertStates(states);\r\n\t\tthis.addStatesToTarget(state, actions);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a state object.\r\n\t *\r\n\t * @param {string} action\r\n\t * @param {*} state\r\n\t * @param {function} callBack\r\n\t * @param {string} [targetId]\r\n\t * @return {object}\r\n\t */\r\n\tcreateState(action, state, callBack, targetId)\r\n\t{\r\n\t\treturn {\r\n\t\t\taction,\r\n\t\t\tstate,\r\n\t\t\tcallBack,\r\n\t\t\ttargetId,\r\n\t\t\ttoken: null\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will convert an action object to a state array.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} action\r\n\t * @return {array}\r\n\t */\r\n\tconvertStates(action)\r\n\t{\r\n\t\tlet actions = [];\r\n\t\tfor(var prop in action)\r\n\t\t{\r\n\t\t\tif(action.hasOwnProperty(prop) === false)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\telse if(prop === 'remotes')\r\n\t\t\t{\r\n\t\t\t\tthis.setupRemoteStates(action[prop], actions);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tvar targetId = null,\r\n\t\t\tcallBack = null,\r\n\t\t\tstate = action[prop];\r\n\t\t\tif(state && typeof state === 'object')\r\n\t\t\t{\r\n\t\t\t\tcallBack = state.callBack;\r\n\t\t\t\ttargetId = state.id || state.targetId;\r\n\t\t\t\tstate = state.state;\r\n\t\t\t}\r\n\r\n\t\t\tactions.push(this.createState(\r\n\t\t\t\tprop,\r\n\t\t\t\tstate,\r\n\t\t\t\tcallBack,\r\n\t\t\t\ttargetId\r\n\t\t\t));\r\n\t\t}\r\n\t\treturn actions;\r\n\t}\r\n\r\n\tsetupRemoteStates(remotes, actions)\r\n\t{\r\n\t\tlet remote;\r\n\t\tfor(var i = 0, length = remotes.length; i < length; i++)\r\n\t\t{\r\n\t\t\tremote = remotes[i];\r\n\t\t\tif(!remote)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tfor(var prop in remote)\r\n\t\t\t{\r\n\t\t\t\tif(remote.hasOwnProperty(prop) === false || prop === 'id')\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar callBack = null,\r\n\t\t\t\tvalue = remote[prop],\r\n\t\t\t\tstate = (value !== null)? value : undefined;\r\n\t\t\t\tif(state && typeof state === 'object')\r\n\t\t\t\t{\r\n\t\t\t\t\tcallBack = state.callBack;\r\n\t\t\t\t\tstate = state.state;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tactions.push(this.createState(\r\n\t\t\t\t\tprop,\r\n\t\t\t\t\tstate,\r\n\t\t\t\t\tcallBack,\r\n\t\t\t\t\tremote.id\r\n\t\t\t\t));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove remote states.\r\n\t */\r\n\tremoveRemoteStates()\r\n\t{\r\n\t\tlet remoteStates = this.remoteStates;\r\n\t\tif(remoteStates)\r\n\t\t{\r\n\t\t\tthis.removeActions(remoteStates);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the actions.\r\n\t *\r\n\t * @param {array} actions\r\n\t */\r\n\tremoveActions(actions)\r\n\t{\r\n\t\tif(actions.length < 1)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor(var i = 0, length = actions.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar action = actions[i];\r\n\t\t\tstate.remove(action.targetId, action.action, action.token);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will restore a state.\r\n\t *\r\n\t * @param {object} state\r\n\t */\r\n\trestore(state)\r\n\t{\r\n\t\tstate.restore();\r\n\r\n\t\tlet remotes = this.remoteStates;\r\n\t\tif(!remotes)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor(var i = 0, length = remotes.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar action = remotes[i];\r\n\t\t\taction.token = this.bindRemoteState(state, action.action, action.targetId);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup a two way bind to a remote state.\r\n\t *\r\n\t * @param {object} target\r\n\t * @param {string} actionEvent\r\n\t * @param {string} remoteTargetId\r\n\t * @return {string}\r\n\t */\r\n\tbindRemoteState(target, actionEvent, remoteTargetId)\r\n\t{\r\n\t\tconst remoteTarget = state.getTarget(remoteTargetId);\r\n\r\n\t\treturn target.link(remoteTarget, actionEvent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the states to the target.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} state\r\n\t * @param {array} actions\r\n\t */\r\n\taddStatesToTarget(state, actions)\r\n\t{\r\n\t\tlet remotes = this.remoteStates;\r\n\r\n\t\tfor(var i = 0, length = actions.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar action = actions[i],\r\n\t\t\ttoken = this.addAction(state, action);\r\n\r\n\t\t\tif(action.targetId)\r\n\t\t\t{\r\n\t\t\t\taction.token = token;\r\n\t\t\t\tremotes.push(action);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif(remotes.length < 1)\r\n\t\t{\r\n\t\t\tthis.remoteStates = null;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an action.\r\n\t *\r\n\t * @param {object} target\r\n\t * @param {object} action\r\n\t */\r\n\taddAction(target, action)\r\n\t{\r\n\t\tlet token,\r\n\t\tactionEvent = action.action;\r\n\r\n\t\t/* this will check to select the remote target if set */\r\n\t\tlet targetId = action.targetId;\r\n\t\tif(targetId)\r\n\t\t{\r\n\t\t\ttoken = this.bindRemoteState(target, actionEvent, targetId);\r\n\t\t}\r\n\r\n\t\tif(typeof action.state !== 'undefined')\r\n\t\t{\r\n\t\t\ttarget.addAction(actionEvent, action.state);\r\n\t\t}\r\n\r\n\t\tlet callBack = action.callBack;\r\n\t\tif(typeof callBack === 'function')\r\n\t\t{\r\n\t\t\ttarget.on(actionEvent, callBack);\r\n\t\t}\r\n\r\n\t\treturn token;\r\n\t}\r\n}", "import {base} from '../../core.js';\r\nimport {Unit} from './unit.js';\r\nimport {state} from '../state/state.js';\r\nimport {EventHelper} from './event-helper.js';\r\nimport {StateHelper} from './state-helper.js';\r\n\r\nexport {Unit} from './unit.js';\r\nexport {Jot} from './jot.js';\r\nexport {Watch} from '../layout/layout-builder.js';\r\n\r\n/**\r\n * Component\r\n *\r\n * @class\r\n * @augments Unit\r\n *\r\n * This will allow components to be extended\r\n * from a single factory.\r\n *\r\n * @example\r\n * class QuickFlashPanel extends base.Component\r\n *\t{\r\n *\t\tconstructor(props)\r\n *\t\t{\r\n *\t\t\t// this will setup the component id\r\n *\t\t\tsuper(props);\r\n *\t\t},\r\n *\r\n *\t\trender()\r\n *\t\t{\r\n *\t\t\treturn {\r\n *\r\n *\t\t\t};\r\n *\t\t}\r\n *\t}\r\n */\r\nexport class Component extends Unit\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} [props]\r\n\t */\r\n\tconstructor(props)\r\n\t{\r\n\t\tsuper(props);\r\n\r\n\t\t/**\r\n\t\t * @param {bool} isComponent\r\n\t\t */\r\n\t\tthis.isComponent = true;\r\n\r\n\t\t/* this will allow the component to override the\r\n\t\tstate target id to add a custom id */\r\n\t\t/**\r\n\t\t * @member {string} [stateTargetId] // optional override of state id\r\n\t\t */\r\n\t\tthis.stateTargetId = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will initialize the component.\r\n\t * @protected\r\n\t */\r\n\tinitialize()\r\n\t{\r\n\t\tthis.setupContext();\r\n\t\tthis.beforeSetup();\r\n\t\tthis.addStates();\r\n\t\tthis.buildLayout();\r\n\t\tthis.addEvents();\r\n\t\tthis.afterSetup();\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the state target.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} [id]\r\n\t */\r\n\tsetupStateTarget(id)\r\n\t{\r\n\t\tlet targetId = id || this.stateTargetId || this.id;\r\n\t\tthis.state = state.getTarget(targetId);\r\n\t}\r\n\r\n\t/**\r\n\t * Override this to setup the component states.\r\n\t * @return {object}\r\n\t */\r\n\tsetupStates()\r\n\t{\r\n\t\t/*\r\n\t\treturn {\r\n\t\t\taction: 'state'\r\n\t\t};\r\n\r\n\t\tor\r\n\r\n\t\treturn {\r\n\t\t\taction:\r\n\t\t\t{\r\n\t\t\t\tstate: 'state',\r\n\t\t\t\tcallBack(state, prevState)\r\n\t\t\t\t{\r\n\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};*/\r\n\r\n\t\treturn {\r\n\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the states.\r\n\t * @protected\r\n\t */\r\n\taddStates()\r\n\t{\r\n\t\t/* this will check to restore previous a previous state if the\r\n\t\tcomponent has been preserved. */\r\n\t\tlet state = this.state;\r\n\t\tif(state)\r\n\t\t{\r\n\t\t\tthis.stateHelper.restore(state);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/* this will only setupa state manager if\r\n\t\twe have states */\r\n\t\tlet states = this.setupStates();\r\n\t\tif(base.isEmpty(states))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.setupStateTarget();\r\n\t\tthis.stateHelper = new StateHelper(this.state, states);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the states.\r\n\t * @protected\r\n\t */\r\n\tremoveStates()\r\n\t{\r\n\t\tlet state = this.state;\r\n\t\tif(!state)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tthis.stateHelper.removeRemoteStates();\r\n\t\tstate.remove();\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the event helper.\r\n\t *\r\n\t * @protected\r\n\t */\r\n\tsetupEventHelper()\r\n\t{\r\n\t\tif(!this.events)\r\n\t\t{\r\n\t\t\tthis.events = new EventHelper();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the events.\r\n\t *\r\n\t * @protected\r\n\t * @return {array}\r\n\t */\r\n\tsetupEvents()\r\n\t{\r\n\t\treturn [\r\n\t\t\t//['action', element, function(e){}, false]\r\n\t\t];\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the events.\r\n\t *\r\n\t * @protected\r\n\t */\r\n\taddEvents()\r\n\t{\r\n\t\tlet events = this.setupEvents();\r\n\t\tif(events.length < 1)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tthis.setupEventHelper();\r\n\t\tthis.events.addEvents(events);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the events.\r\n\t * @protected\r\n\t */\r\n\tremoveEvents()\r\n\t{\r\n\t\tlet events = this.events;\r\n\t\tif(events)\r\n\t\t{\r\n\t\t\tevents.reset();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepare the component to be destroyed.\r\n\t */\r\n\tprepareDestroy()\r\n\t{\r\n\t\tthis.rendered = false;\r\n\t\tthis.beforeDestroy();\r\n\t\tthis.removeEvents();\r\n\t\tthis.removeStates();\r\n\t\tthis.removeContext();\r\n\r\n\t\tif(this.data && this.persist === false)\r\n\t\t{\r\n\t\t\tthis.data.unlink();\r\n\t\t}\r\n\t}\r\n}", "import {router} from './router.js';\r\nimport {Component} from '../component/component.js';\r\n\r\n/**\r\n * NavLink\r\n *\r\n * This will create a nav link that will add an active\r\n * class when the browser route path matches the link\r\n * href.\r\n *\r\n * @class\r\n */\r\nexport class NavLink extends Component\r\n{\r\n /**\r\n * This will configure the link active class.\r\n *\r\n * @protected\r\n */\r\n beforeSetup()\r\n {\r\n this.selectedClass = this.activeClass || 'active';\r\n }\r\n\r\n /**\r\n * This will render the component.\r\n *\r\n * @return {object}\r\n */\r\n render()\r\n {\r\n let href = this.href,\r\n text = this.text,\r\n watchers = this.setupWatchers(href, text);\r\n\r\n return {\r\n tag: 'a',\r\n className: this.className || null,\r\n onState: ['selected', {\r\n [this.selectedClass]: true\r\n }],\r\n href: this.getString(href),\r\n text: this.getString(text),\r\n children: this.children,\r\n watch: watchers\r\n };\r\n }\r\n\r\n /**\r\n * This will get string.\r\n *\r\n * @param {string} string\r\n * @return {(string|null)}\r\n */\r\n getString(string)\r\n {\r\n let type = typeof string;\r\n return (type !== 'object' && type !== 'undefined')? string : null;\r\n }\r\n\r\n /**\r\n * This will setup the watchers.\r\n *\r\n * @protected\r\n * @param {string} href\r\n * @param {string} text\r\n * @return {array}\r\n */\r\n setupWatchers(href, text)\r\n {\r\n let exact = (this.exact !== false),\r\n data = router.data;\r\n\r\n let watchers = [];\r\n\r\n if(href && typeof href === 'object')\r\n {\r\n watchers.push(\r\n {\r\n attr: 'href',\r\n value: href\r\n });\r\n }\r\n\r\n if(text && typeof text === 'object')\r\n {\r\n watchers.push(\r\n {\r\n attr: 'text',\r\n value: text\r\n });\r\n }\r\n\r\n watchers.push({\r\n value: ['[[path]]', data],\r\n callBack: (ele, value) =>\r\n {\r\n let path = ele.pathname + ele.hash;\r\n\t\t\t\tlet selected = exact? (value === path) : (new RegExp('^' + ele.pathname + '($|#|\\/|\\\\.).*').test(value));\r\n this.update(ele, selected);\r\n }\r\n });\r\n\r\n return watchers;\r\n }\r\n\r\n setupStates()\r\n {\r\n return {\r\n selected: false\r\n };\r\n }\r\n\r\n /**\r\n * This will update the class on the element.\r\n *\r\n * @param {object} ele\r\n * @param {bool} selected\r\n */\r\n update(ele, selected)\r\n {\r\n this.state.set('selected', selected);\r\n }\r\n}", "/**\r\n * Utils\r\n *\r\n * These are some helper functions for the router.\r\n */\r\nexport const Utils =\r\n{\r\n\t/**\r\n\t * This will remove the begining and ending slashes from a url.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @return {string}\r\n\t */\r\n\tremoveSlashes(uri)\r\n\t{\r\n\t\tif(typeof uri === 'string')\r\n\t\t{\r\n\t\t\tif(uri.substring(0, 1) === '/')\r\n\t\t\t{\r\n\t\t\t\turi = uri.substring(1);\r\n\t\t\t}\r\n\r\n\t\t\tif(uri.substring(-1) === '/')\r\n\t\t\t{\r\n\t\t\t\turi = uri.substring(0, uri.length - 1);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn uri;\r\n\t}\r\n};", "import { builder } from \"../layout/layout-builder.js\";\r\n\r\n/**\r\n * ComponentHelper\r\n *\r\n * This will create a helper to create and destroy components\r\n * that are added to a route.\r\n * @class\r\n */\r\nexport class ComponentHelper\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} route\r\n\t * @param {object} settings\r\n\t */\r\n\tconstructor(route, settings)\r\n\t{\r\n\t\tthis.route = route;\r\n\r\n\t\tthis.template = settings.component;\r\n\t\tthis.component = null;\r\n\t\tthis.hasTemplate = false;\r\n\r\n\t\tthis.setup = false;\r\n\t\tthis.container = settings.container;\r\n\t\tthis.persist = settings.persist;\r\n\t\tthis.parent = settings.parent;\r\n\r\n\t\tthis.setupTemplate();\r\n\t}\r\n\r\n\t/**\r\n\t * This will create the component.\r\n\t *\r\n\t * @param {object} params\r\n\t */\r\n\tfocus(params)\r\n\t{\r\n\t\tif(this.setup === false)\r\n\t\t{\r\n\t\t\tthis.create();\r\n\t\t}\r\n\r\n\t\tthis.update(params);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the template.\r\n\t * @protected\r\n\t */\r\n\tsetupTemplate()\r\n\t{\r\n\t\tlet template = this.template;\r\n\t\tif(typeof template === 'string')\r\n\t\t{\r\n\t\t\ttemplate = this.template = window[template];\r\n\t\t\tif(!template)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet type = typeof template;\r\n\t\tif(type === 'function')\r\n\t\t{\r\n\t\t\tthis.component = new this.template({\r\n\t\t\t\troute: this.route,\r\n\t\t\t\tpersist: this.persist,\r\n\t\t\t\tparent: this.parent\r\n\t\t\t});\r\n\t\t}\r\n\t\telse if(type === 'object')\r\n\t\t{\r\n\t\t\tif(!this.template.isUnit)\r\n\t\t\t{\r\n\t\t\t\tthis.template = Jot(this.template);\r\n\t\t\t}\r\n\r\n\t\t\tlet comp = this.component = this.template;\r\n\t\t\tlet persist = (comp.persist !== false);\r\n\r\n\t\t\tcomp.route = this.route;\r\n\t\t\tcomp.persist = persist;\r\n\t\t\tcomp.parent = this.parent;\r\n\t\t\tthis.persist = persist;\r\n\t\t}\r\n\r\n\t\tthis.hasTemplate = true;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create the route component.\r\n\t * @protected\r\n\t */\r\n\tcreate()\r\n\t{\r\n\t\tif(!this.hasTemplate)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tthis.setup = true;\r\n\r\n\t\tlet comp = this.component;\r\n\t\tif(!this.persist || !comp)\r\n\t\t{\r\n\t\t\tcomp = this.component = this.template;\r\n\t\t}\r\n\r\n\t\tbuilder.render(comp, this.container, this.parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the component.\r\n\t */\r\n\tremove()\r\n\t{\r\n\t\tif(this.setup !== true)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tthis.setup = false;\r\n\r\n\t\tlet component = this.component;\r\n\t\tif(!component)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(typeof component.destroy === 'function')\r\n\t\t{\r\n\t\t\tcomponent.destroy();\r\n\t\t}\r\n\r\n\t\t// this will remove the reference to the component if persit is false\r\n\t\tif(this.persist === false)\r\n\t\t{\r\n\t\t\tthis.component = null;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will call the component update method and pass the params.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} params\r\n\t */\r\n\tupdate(params)\r\n\t{\r\n\t\tlet component = this.component;\r\n\t\tif(!component)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(typeof component.update === 'function')\r\n\t\t{\r\n\t\t\tcomponent.update(params);\r\n\t\t}\r\n\t}\r\n}", "import {builder} from '../layout/layout-builder.js';\r\nimport {Jot} from \"../component/jot.js\";\r\n\r\n/**\r\n * This will track previously loaded scripts and styles.\r\n */\r\nconst loaded = [];\r\n\r\n/**\r\n * This will check if a script or style has been loaded.\r\n *\r\n * @param {string} src\r\n * @return {bool}\r\n */\r\nconst isLoaded = (src) => loaded.indexOf(src) !== -1;\r\n\r\n/**\r\n * This will create a script atom.\r\n *\r\n * @param {object} props\r\n * @return {object}\r\n */\r\nconst Script = (props) => ({\r\n tag: 'script',\r\n src: props.src,\r\n async: false,\r\n load(e)\r\n {\r\n loaded.push(props.src);\r\n\r\n const callBack = props.load;\r\n if(callBack)\r\n {\r\n callBack();\r\n }\r\n }\r\n});\r\n\r\n/**\r\n * This will create a style atom.\r\n *\r\n * @param {object} props\r\n * @return {object}\r\n */\r\nconst Style = (props) => ({\r\n tag: 'link',\r\n rel: 'stylesheet',\r\n type: 'text/css',\r\n href: props.src,\r\n load(e)\r\n {\r\n loaded.push(props.src);\r\n\r\n const callBack = props.load;\r\n if(callBack)\r\n {\r\n callBack();\r\n }\r\n }\r\n});\r\n\r\n/**\r\n * Group\r\n *\r\n * This will setup a depends group to load all\r\n * dependencies before loaded the script.\r\n */\r\nclass Group\r\n{\r\n constructor(callBack)\r\n {\r\n this.percent = 0;\r\n this.loaded = 0;\r\n this.total = 0;\r\n this.callBack = callBack || null;\r\n }\r\n\r\n /**\r\n * This will add the resource to the document.\r\n *\r\n * @param {string} src\r\n */\r\n add(src)\r\n {\r\n this.total++;\r\n let atom;\r\n\r\n const load = this.update.bind(this);\r\n if(src.indexOf('.css') !== -1)\r\n {\r\n atom = Style({\r\n load,\r\n src\r\n });\r\n }\r\n else\r\n {\r\n atom = Script({\r\n load,\r\n src\r\n });\r\n }\r\n\r\n builder.build(atom, document.head);\r\n }\r\n\r\n /**\r\n * This will add the dependencies to the document.\r\n *\r\n * @param {array} files\r\n */\r\n addFiles(files)\r\n {\r\n if(!files)\r\n {\r\n return;\r\n }\r\n\r\n for(var i = 0, length = files.length; i < length; i++)\r\n {\r\n var src = files[i];\r\n if(!isLoaded(src))\r\n {\r\n this.add(src);\r\n }\r\n }\r\n }\r\n\r\n update()\r\n {\r\n const percent = this.updateProgress();\r\n if(percent >= 100)\r\n {\r\n var callBack = this.callBack;\r\n if(callBack)\r\n {\r\n callBack();\r\n }\r\n }\r\n }\r\n\r\n updateProgress()\r\n {\r\n ++this.loaded;\r\n return (this.percent = Math.floor(this.loaded / this.total * 100));\r\n }\r\n}\r\n\r\n/**\r\n * This will load the module.\r\n *\r\n * @param {string} src\r\n * @param {function} callBack\r\n * @return {object}\r\n */\r\nconst loadModule = (src, callBack) =>\r\n{\r\n import(src).then(module =>\r\n {\r\n if(callBack)\r\n {\r\n callBack(module);\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * This will check if an object is a contructor.\r\n *\r\n * @param {object|function} object\r\n * @returns {bool}\r\n */\r\nconst isConstructor = (object) =>\r\n{\r\n if(!object)\r\n {\r\n return false;\r\n }\r\n\r\n return (typeof object?.prototype?.constructor === 'function');\r\n};\r\n\r\n/**\r\n * This will render the module.\r\n *\r\n * @param {object} layout\r\n * @param {object} ele\r\n * @param {object} parent\r\n * @param {function} callBack\r\n * @return {object}\r\n */\r\nconst render = (layout, ele, parent) =>\r\n{\r\n const frag = builder.build(layout, null, parent);\r\n const firstChild = frag.firstChild;\r\n ele.after(frag);\r\n return firstChild;\r\n};\r\n\r\n/**\r\n * This will create a comment.\r\n *\r\n * @param {object} props\r\n * @returns {object}\r\n */\r\nconst Comment = (props) => ({\r\n tag: 'comment',\r\n text: 'import placeholder',\r\n onCreated: props.onCreated\r\n});\r\n\r\n/**\r\n * This will create an import wrapper component that\r\n * will wrap the comment atom to pass route to the\r\n * imported layout.\r\n *\r\n * @param {object} props\r\n * @returns {object}\r\n */\r\nconst ImportWrapper = Jot(\r\n{\r\n render()\r\n {\r\n return Comment(\r\n {\r\n onCreated: (ele) =>\r\n {\r\n const src = this.src;\r\n if(!src)\r\n {\r\n return;\r\n }\r\n\r\n /**\r\n * This will set up a resource group to load the\r\n * depends before the module.\r\n */\r\n if(this.depends)\r\n {\r\n const group = new Group(() =>\r\n {\r\n this.loadAndRender(ele);\r\n });\r\n\r\n group.addFiles(this.depends);\r\n return;\r\n }\r\n\r\n this.loadAndRender(ele);\r\n }\r\n });\r\n },\r\n\r\n /**\r\n * This will get the layout.\r\n *\r\n * @param {object} module\r\n * @returns {object|null}\r\n */\r\n getLayout(module)\r\n {\r\n let layout = module.default;\r\n if(!layout)\r\n {\r\n return null;\r\n }\r\n\r\n /**\r\n * This will check if the import is useing a custom\r\n * callback to set up the module.\r\n */\r\n const callBack = this.callBack;\r\n if(callBack)\r\n {\r\n layout = callBack(layout);\r\n }\r\n else\r\n {\r\n if(isConstructor(layout))\r\n {\r\n /**\r\n * This will set up the layout as a component and pass\r\n * the import props like persist and route.\r\n */\r\n layout = new layout();\r\n layout.route = this.route;\r\n\r\n if(this.persist)\r\n {\r\n layout.persist = true;\r\n }\r\n }\r\n else\r\n {\r\n /**\r\n * This will set up the layout as a n atom.\r\n */\r\n layout = layout();\r\n }\r\n }\r\n\r\n return (this.layout = layout);\r\n },\r\n\r\n /**\r\n * This will load the module and render the layout.\r\n *\r\n * @param {object} ele\r\n */\r\n loadAndRender(ele)\r\n {\r\n loadModule(this.src, (module) =>\r\n {\r\n this.loaded = true;\r\n const layout = this.layout || this.getLayout(module);\r\n this.layoutRoot = render(layout, ele, this.parent);\r\n });\r\n },\r\n\r\n /**\r\n * This will check if the layout should be updated.\r\n *\r\n * @param {object} layout\r\n * @returns {bool}\r\n */\r\n shouldUpdate(layout)\r\n {\r\n if(this.updateLayout === true)\r\n {\r\n return true;\r\n }\r\n\r\n return (this.updateLayout = (layout && layout.isUnit && typeof layout.update === 'function'));\r\n },\r\n\r\n /**\r\n * This will update the module layout.\r\n *\r\n * @param {object} params\r\n */\r\n updateModuleLayout(params)\r\n {\r\n const layout = this.layout;\r\n if(this.shouldUpdate(layout))\r\n {\r\n layout.update(params);\r\n }\r\n },\r\n\r\n /**\r\n * This will call if the import is added to a route. This will pass\r\n * the update params to the imported layout.\r\n *\r\n * @param {object} params\r\n */\r\n update(params)\r\n {\r\n if(this.loaded === true)\r\n {\r\n this.updateModuleLayout(params);\r\n }\r\n },\r\n\r\n /**\r\n * This will remove the imported layout when the\r\n * comment is being removed.\r\n *\r\n * @returns {void}\r\n */\r\n beforeDestroy()\r\n {\r\n if(!this.layoutRoot)\r\n {\r\n return;\r\n }\r\n\r\n builder.removeElement(this.layoutRoot);\r\n }\r\n});\r\n\r\n/**\r\n * This will import a module.\r\n *\r\n * @param {object} props\r\n * @returns {object}\r\n */\r\nexport const Import = (props) =>\r\n{\r\n return new ImportWrapper(props);\r\n};", "import {ComponentHelper} from './component-helper.js';\r\nimport {SimpleData} from '../data/data.js';\r\nimport {Import} from '../import/import.js';\r\n\r\n/**\r\n * This will setup a route uri pattern.\r\n *\r\n * @param {string} uri\r\n * @return {string}\r\n */\r\nconst routePattern = (uri) =>\r\n{\r\n\tlet uriQuery = \"\";\r\n\tif(uri)\r\n\t{\r\n\t\tlet filter = /\\//g;\r\n\t\turiQuery = uri.replace(filter, \"\\/\");\r\n\r\n\t\t/* this will setup for optional slashes before the optional params */\r\n\t\tlet optionalSlash = /(\\/):[^\\/(]*?\\?/g;\r\n\t\turiQuery = uriQuery.replace(optionalSlash, (str) =>\r\n\t\t{\r\n\t\t\tlet pattern = /\\//g;\r\n\t\t\treturn str.replace(pattern, '(?:$|\\/)');\r\n\t\t});\r\n\r\n\t\t/* this will setup for optional params and params\r\n\t\tand stop at the last slash or query start */\r\n\t\tlet param = /(:[^\\/?&($]+)/g;\r\n\t\tlet optionalParams = /(\\?\\/+\\*?)/g;\r\n\t\turiQuery = uriQuery.replace(optionalParams, '?\\/*');\r\n\t\turiQuery = uriQuery.replace(param, (str) =>\r\n\t\t{\r\n\t\t\treturn (str.indexOf('.') < 0)? '([^\\/|?]+)' : '([^\\/|?]+.*)';\r\n\t\t});\r\n\r\n\t\t/* we want to setup the wild card and param\r\n\t\tchecks to be modified to the route uri string */\r\n\t\tlet allowAll = /(\\*)/g;\r\n\t\turiQuery = uriQuery.replace(allowAll, '.*');\r\n\t}\r\n\r\n\t/* we want to set and string end if the wild card is not set */\r\n\turiQuery += (uri[uri.length - 1] === '*')? '' : '$';\r\n\treturn uriQuery;\r\n};\r\n\r\n/**\r\n * This will get the default route params.\r\n *\r\n * @param {array} params\r\n * @return {(object|null)}\r\n */\r\nconst getParamDefaults = (params) =>\r\n{\r\n\tif(params.length)\r\n\t{\r\n\t\tlet defaults = {};\r\n\t\tfor(var i = 0, length = params.length; i < length; i++)\r\n\t\t{\r\n\t\t\tdefaults[params[i]] = null;\r\n\t\t}\r\n\t\treturn defaults;\r\n\t}\r\n\treturn null;\r\n};\r\n\r\n/**\r\n * This will get the param keys from the uri.\r\n *\r\n * @param {string} uri\r\n * @return {array}\r\n */\r\nconst paramPattern = (uri) =>\r\n{\r\n\tlet params = [];\r\n\tif(!uri)\r\n\t{\r\n\t\treturn params;\r\n\t}\r\n\r\n\tlet filter = /[\\*?]/g;\r\n\turi = uri.replace(filter, '');\r\n\r\n\tlet pattern = /:(.[^.\\/?&($]+)\\?*/g,\r\n\tmatches = uri.match(pattern);\r\n\tif(matches === null)\r\n\t{\r\n\t\treturn params;\r\n\t}\r\n\r\n\tfor(var i = 0, maxLength = matches.length; i < maxLength; i++)\r\n\t{\r\n\t\tvar param = matches[i];\r\n\t\tif(param)\r\n\t\t{\r\n\t\t\tparam = param.replace(':', '');\r\n\t\t\tparams.push(param);\r\n\t\t}\r\n\t}\r\n\treturn params;\r\n};\r\n\r\nlet routeCount = 0;\r\n\r\n/**\r\n * Route\r\n *\r\n * This will create a route.\r\n * @class\r\n * @augments SimpleData\r\n */\r\nexport class Route extends SimpleData\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} settings\r\n\t */\r\n\tconstructor(settings)\r\n\t{\r\n\t\tlet uri = settings.baseUri;\r\n\r\n\t\tconst paramKeys = paramPattern(uri);\r\n\t\tlet params = getParamDefaults(paramKeys);\r\n\t\tsuper(params);\r\n\r\n\t\tthis.uri = uri;\r\n\t\tthis.paramKeys = paramKeys;\r\n\r\n\t\tthis.setupRoute(settings);\r\n\t\tthis.set('active', false);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the route settings.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} settings\r\n\t */\r\n\tsetupRoute(settings)\r\n\t{\r\n\t\tthis.id = settings.id || 'bs-rte-' + routeCount++;\r\n\r\n\t\tthis.path = null;\r\n\t\tthis.referralPath = null;\r\n\r\n\t\t/* route reg ex */\r\n\t\tlet uriMatch = routePattern(this.uri);\r\n\t\tthis.uriQuery = new RegExp('^' + uriMatch);\r\n\r\n\t\t/* params */\r\n\t\tthis.params = null;\r\n\r\n\t\t/* this will setup the template and route component\r\n\t\tif one has been set */\r\n\t\tthis.setupComponentHelper(settings);\r\n\r\n\t\tthis.callBack = settings.callBack;\r\n\t\tthis.title = settings.title;\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the route title.\r\n\t *\r\n\t * @param {string|function} title\r\n\t */\r\n\tsetTitle(title)\r\n\t{\r\n\t\tbase.router.updateTitle({\r\n\t\t\ttitle: title,\r\n\t\t\tstage: this.stage\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will deactivate the route.\r\n\t */\r\n\tdeactivate()\r\n\t{\r\n\t\tthis.set('active', false);\r\n\r\n\t\tlet controller = this.controller;\r\n\t\tif(controller)\r\n\t\t{\r\n\t\t\tcontroller.remove();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the route layout.\r\n\t *\r\n\t * @param {object} settings\r\n\t * @returns {object|null}\r\n\t */\r\n\tgetLayout(settings)\r\n\t{\r\n\t\tif(settings.component)\r\n\t\t{\r\n\t\t\treturn settings.component;\r\n\t\t}\r\n\r\n\t\tlet imported = settings.import;\r\n\t\tif(!imported)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tif(typeof imported === 'string')\r\n\t\t{\r\n\t\t\timported = {\r\n\t\t\t\tsrc: imported\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn Import(imported);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the route layout.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} settings\r\n\t */\r\n\tsetupComponentHelper(settings)\r\n\t{\r\n\t\tconst component = this.getLayout(settings);\r\n\t\tif(component)\r\n\t\t{\r\n\t\t\tlet {container, persist = false, parent} = settings;\r\n\r\n\t\t\tconst helperSettings =\r\n\t\t\t{\r\n\t\t\t\tcomponent,\r\n\t\t\t\tcontainer,\r\n\t\t\t\tpersist,\r\n\t\t\t\tparent\r\n\t\t\t};\r\n\t\t\tthis.controller = new ComponentHelper(this, helperSettings);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will resume the route.\r\n\t *\r\n\t * @param {object} container\r\n\t */\r\n\tresume(container)\r\n\t{\r\n\t\tlet controller = this.controller;\r\n\t\tif(controller)\r\n\t\t{\r\n\t\t\tcontroller.container = container;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the route path.\r\n\t *\r\n\t * @param {string} path\r\n\t * @param {string} referralPath\r\n\t */\r\n\tsetPath(path, referralPath)\r\n\t{\r\n\t\tthis.path = path;\r\n\t\tthis.referralPath = referralPath;\r\n\t}\r\n\r\n\t/**\r\n\t * This will select the route.\r\n\t */\r\n\tselect()\r\n\t{\r\n\t\tthis.set('active', true);\r\n\r\n\t\tlet params = this.stage,\r\n\t\tcallBack = this.callBack;\r\n\t\tif(typeof callBack === 'function')\r\n\t\t{\r\n\t\t\tcallBack(params);\r\n\t\t}\r\n\r\n\t\tlet controller = this.controller;\r\n\t\tif(controller)\r\n\t\t{\r\n\t\t\tcontroller.focus(params);\r\n\t\t}\r\n\r\n\t\tlet path = this.path;\r\n\t\tif(!path)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet hash = path.split('#')[1];\r\n\t\tif(!hash)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.scrollToId(hash);\r\n\t}\r\n\r\n\t/**\r\n\t * This will scroll to the element by id.\r\n\t *\r\n\t * @param {string} hash\r\n\t * @returns void\r\n\t */\r\n\tscrollToId(hash)\r\n\t{\r\n\t\tif(!hash)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet ele = document.getElementById(hash);\r\n\t\tif(!ele)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tele.scrollIntoView(true);\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if a route matches the path.\r\n\t *\r\n\t * @param {string} path\r\n\t * @return {(object|boolean)}\r\n\t */\r\n\tmatch(path)\r\n\t{\r\n\t\tlet matched = false;\r\n\r\n\t\t/* we want to check to use the supplied uri or get the\r\n\t\tcurrent uri if not setup */\r\n\t\tlet result = path.match(this.uriQuery);\r\n\t\tif(result === null)\r\n\t\t{\r\n\t\t\tthis.resetParams();\r\n\t\t\treturn matched;\r\n\t\t}\r\n\r\n\t\tif(result && typeof result === 'object')\r\n\t\t{\r\n\t\t\t/* this will remove the first match from the\r\n\t\t\tthe params */\r\n\t\t\tresult.shift();\r\n\t\t\tmatched = result;\r\n\t\t\t/* this will get the uri params of the route\r\n\t\t\tand if set will save them to the route */\r\n\t\t\tthis.setParams(result);\r\n\t\t}\r\n\r\n\t\treturn matched;\r\n\t}\r\n\r\n\t/**\r\n\t * This will reset the params.\r\n\t */\r\n\tresetParams()\r\n\t{\r\n\t\tthis.stage = {};\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the params.\r\n\t *\r\n\t * @param {object} values\r\n\t */\r\n\tsetParams(values)\r\n\t{\r\n\t\tif(values && typeof values === 'object')\r\n\t\t{\r\n\t\t\tlet keys = this.paramKeys;\r\n\t\t\tif(keys)\r\n\t\t\t{\r\n\t\t\t\tlet params = {};\r\n\t\t\t\tfor(var i = 0, maxL = keys.length; i < maxL; i++)\r\n\t\t\t\t{\r\n\t\t\t\t\tvar key = keys[i];\r\n\t\t\t\t\tif(typeof key !== 'undefined')\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tparams[key] = values[i];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tthis.set(params);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the params.\r\n\t *\r\n\t * @return {object}\r\n\t */\r\n\tgetParams()\r\n\t{\r\n\t\treturn this.stage;\r\n\t}\r\n}", "import {base} from '../../core.js';\r\n\r\n/**\r\n * History\r\n *\r\n * This will setup the history controller.\r\n * @class\r\n */\r\nexport class HistoryController\r\n{\r\n /**\r\n * This will check if browser based navigation is supported\r\n *\r\n * @returns boolean\r\n */\r\n static browserIsSupported()\r\n {\r\n return ('history' in window && 'pushState' in window.history);\r\n }\r\n\r\n /**\r\n * This will create a History Object based on navigation support\r\n *\r\n * @param {Router} router\r\n * @returns History\r\n */\r\n static setup(router)\r\n {\r\n if(HistoryController.browserIsSupported())\r\n {\r\n return new BrowserHistory(router).setup();\r\n }\r\n return new HashHistory(router).setup();\r\n }\r\n}\r\n\r\nlet routerNumber = 0;\r\n\r\n/**\r\n * History\r\n *\r\n * This will setup the history controller.\r\n * @class\r\n */\r\nclass History\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} router\r\n\t */\r\n\tconstructor(router)\r\n\t{\r\n\t\tthis.router = router;\r\n\t\tthis.locationId = 'base-app-router-' + routerNumber++;\r\n\t\tthis.callBack = this.check.bind(this);\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if the history api is supported\r\n\t * and add events.\r\n\t *\r\n\t * @return {object} a reference to the object.\r\n\t */\r\n\tsetup()\r\n\t{\r\n\t\tthis.addEvent();\r\n\t\treturn this;\r\n\t}\r\n}\r\n\r\nclass BrowserHistory extends History\r\n{\r\n\t/**\r\n\t * This will add the events.\r\n\t *\r\n\t * @return {object} a reference to the object.\r\n\t */\r\n\taddEvent()\r\n\t{\r\n\t\tbase.on('popstate', window, this.callBack);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the events.\r\n\t *\r\n\t * @return {object} a reference to the object.\r\n\t */\r\n\tremoveEvent()\r\n\t{\r\n\t\tbase.off('popstate', window, this.callBack);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check to activate the router.\r\n\t *\r\n\t * @param {object} evt\r\n\t */\r\n\tcheck(evt)\r\n\t{\r\n\t\t/* we want to check if the event has a state and if the\r\n\t\tstate location is from the background */\r\n\t\tlet state = evt.state;\r\n\t\tif(!state || state.location !== this.locationId)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tevt.preventDefault();\r\n\t\tevt.stopPropagation();\r\n\r\n\t\tthis.router.checkActiveRoutes(state.uri);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a state object.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @param {*} data\r\n\t * @return {object}\r\n\t */\r\n\tcreateState(uri, data)\r\n\t{\r\n\t\tlet stateObj = {\r\n\t\t\tlocation: this.locationId,\r\n\t\t\turi: uri\r\n\t\t};\r\n\r\n\t\tif(data && typeof data === 'object')\r\n\t\t{\r\n\t\t\tstateObj = Object.assign(stateObj, data);\r\n\t\t}\r\n\r\n\t\treturn stateObj;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a state to the history.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @param {object} data\r\n\t * @param {boolean} replace\r\n\t * @return {object} a reference to the object.\r\n\t */\r\n\taddState(uri, data, replace)\r\n\t{\r\n\t\tlet history = window.history,\r\n\t\tlastState = history.state;\r\n\r\n\t\tif(lastState && lastState.uri === uri)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tlet stateObj = this.createState(uri, data);\r\n\r\n\t\t/* this will check to push state or\r\n\t\treplace state */\r\n\t\treplace = (replace === true);\r\n\t\tlet method = (replace === false)? 'pushState' : 'replaceState';\r\n\t\thistory[method](stateObj, null, uri);\r\n\r\n\t\treturn this;\r\n\t}\r\n}\r\n\r\nclass HashHistory extends History\r\n{\r\n\t/**\r\n\t * This will add the events.\r\n\t *\r\n\t * @return {object} a reference to the object.\r\n\t */\r\n\taddEvent()\r\n\t{\r\n\t\tbase.on('hashchange', window, this.callBack);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the events.\r\n\t *\r\n\t * @return {object} a reference to the object.\r\n\t */\r\n\tremoveEvent()\r\n\t{\r\n\t\tbase.off('hashchange', window, this.callBack);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check to activate the router.\r\n\t *\r\n\t * @param {object} evt\r\n\t */\r\n\tcheck(evt)\r\n\t{\r\n\t\tthis.router.checkActiveRoutes(evt.newURL);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a state to the history.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @param {object} data\r\n\t * @param {boolean} replace\r\n\t * @return {object} a reference to the object.\r\n\t */\r\n\taddState(uri, data, replace)\r\n\t{\r\n\t\twindow.location.hash = uri;\r\n\r\n\t\treturn this;\r\n\t}\r\n}", "import {base} from '../../core.js';\r\nimport {Data} from '../data/data.js';\r\nexport {NavLink} from './nav-link.js';\r\nimport {Utils} from './utils.js';\r\nimport {Route} from './route.js';\r\nimport {HistoryController} from './history-controller.js';\r\n\r\n/* this will register the route system to the\r\ndata tracker to remove routes that have been\r\nnested in layouts. */\r\nbase.dataTracker.addType('routes', (data) =>\r\n{\r\n\tif(!data)\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\tconst route = data.route;\r\n\tif(route)\r\n\t{\r\n\t\trouter.removeRoute(route);\r\n\t}\r\n});\r\n\r\nbase.dataTracker.addType('switch', (data) =>\r\n{\r\n\tif(!data)\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\tlet id = data.id;\r\n\trouter.removeSwitch(id);\r\n});\r\n\r\n/**\r\n * Router\r\n *\r\n * This will create a browser router.\r\n * @class\r\n */\r\nexport class Router\r\n{\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {string} version\r\n\t\t */\r\n\t\tthis.version = '1.0.2';\r\n\r\n\t\t/* this is the root of the uri for the routing object\r\n\t\tand the base title */\r\n\t\tthis.baseURI = '/';\r\n\t\tthis.title = '';\r\n\r\n\t\tthis.lastPath = null;\r\n\t\tthis.path = null;\r\n\r\n\t\t/* this will be used to access our history object */\r\n\t\tthis.history = null;\r\n\t\tthis.callBackLink = null;\r\n\t\tthis.location = window.location;\r\n\r\n\t\t/* this will store each route added to the\r\n\t\trouter. */\r\n\t\tthis.routes = [];\r\n\t\tthis.switches = {};\r\n\t\tthis.switchCount = 0;\r\n\r\n\t\t/**\r\n\t\t * @member {object} data\r\n\t\t */\r\n\t\tthis.data = new Data(\r\n\t\t{\r\n\t\t\tpath: ''\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup our history object.\r\n\t */\r\n\tsetupHistory()\r\n\t{\r\n\t\tthis.history = HistoryController.setup(this);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a new route.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} settings\r\n\t * @return {object}\r\n\t */\r\n\tcreateRoute(settings)\r\n\t{\r\n\t\tlet uri = settings.uri || '*';\r\n\t\tsettings.baseUri = this.createURI(uri);\r\n\r\n\t\tlet route = new Route(settings);\r\n\t\treturn route;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a new route to the router.\r\n\t *\r\n\t * @param {object} settings\r\n\t * @return {object}\r\n\t */\r\n\tadd(settings)\r\n\t{\r\n\t\tif(typeof settings !== 'object')\r\n\t\t{\r\n\t\t\tlet args = arguments;\r\n\t\t\tsettings =\r\n\t\t\t{\r\n\t\t\t\turi: args[0],\r\n\t\t\t\tcomponent: args[1],\r\n\t\t\t\tcallBack: args[2],\r\n\t\t\t\ttitle: args[3],\r\n\t\t\t\tid: args[4],\r\n\t\t\t\tcontainer: args[5]\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tconst route = this.createRoute(settings);\r\n\t\tthis.addRoute(route);\r\n\t\treturn route;\r\n\t}\r\n\r\n\taddRoute(route)\r\n\t{\r\n\t\tthis.routes.push(route);\r\n\t\tthis.checkRoute(route, this.getPath());\r\n\t}\r\n\r\n\t/**\r\n\t * This will resume a route.\r\n\t *\r\n\t * @param {object} route\r\n\t * @param {object} container\r\n\t */\r\n\tresume(route, container)\r\n\t{\r\n\t\troute.resume(container);\r\n\t\tthis.addRoute(route);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the base path.\r\n\t *\r\n\t * @protected\r\n\t * @return {string}\r\n\t */\r\n\tgetBasePath()\r\n\t{\r\n\t\tif(!this.basePath)\r\n\t\t{\r\n\t\t\tlet pathURI = this.baseURI || '';\r\n\t\t\tif((pathURI[pathURI.length - 1] !== '/'))\r\n\t\t\t{\r\n\t\t\t\tpathURI += '/';\r\n\t\t\t}\r\n\t\t\tthis.basePath = pathURI;\r\n\t\t}\r\n\t\treturn this.basePath;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a uri.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} uri\r\n\t * @return {string}\r\n\t */\r\n\tcreateURI(uri)\r\n\t{\r\n\t\tlet baseUri = this.getBasePath();\r\n\t\treturn (baseUri + Utils.removeSlashes(uri));\r\n\t}\r\n\r\n\t/**\r\n\t * This will get a route by uri.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @return {(object|boolean)}\r\n\t */\r\n\tgetRoute(uri)\r\n\t{\r\n\t\tlet routes = this.routes,\r\n\t\tlength = routes.length;\r\n\t\tif(length > 0)\r\n\t\t{\r\n\t\t\tfor(var i = 0; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tvar route = routes[i];\r\n\t\t\t\tif(route.uri === uri)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn route;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get a route by id.\r\n\t *\r\n\t * @param {string} id\r\n\t * @return {(object|boolean)}\r\n\t */\r\n\tgetRouteById(id)\r\n\t{\r\n\t\tlet routes = this.routes,\r\n\t\tlength = routes.length;\r\n\t\tif(length > 0)\r\n\t\t{\r\n\t\t\tfor(var i = 0; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tvar route = routes[i];\r\n\t\t\t\tif(route.id === id)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn route;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a route.\r\n\t *\r\n\t * @param {object} route\r\n\t */\r\n\tremoveRoute(route)\r\n\t{\r\n\t\tlet routes = this.routes,\r\n\t\tindex = routes.indexOf(route);\r\n\t\tif(index > -1)\r\n\t\t{\r\n\t\t\troutes.splice(index, 1);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a switch.\r\n\t *\r\n\t * @param {array} group\r\n\t * @return {string} the switch id.\r\n\t */\r\n\taddSwitch(group)\r\n\t{\r\n\t\tlet id = this.switchCount++;\r\n\t\tlet switchArray = this.getSwitchGroup(id);\r\n\r\n\t\tfor(var i = 0, length = group.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar route = this.createRoute(group[i]);\r\n\t\t\tswitchArray.push(route);\r\n\t\t}\r\n\r\n\t\tthis.checkGroup(switchArray, this.getPath());\r\n\t\treturn id;\r\n\t}\r\n\r\n\t/**\r\n\t * This will resume a switch.\r\n\t *\r\n\t * @param {object} group\r\n\t * @param {object} container\r\n\t * @return {int} the switch id.\r\n\t */\r\n\tresumeSwitch(group, container)\r\n\t{\r\n\t\tlet id = this.switchCount++;\r\n\t\tlet switchArray = this.getSwitchGroup(id);\r\n\r\n\t\tfor(var i = 0, length = group.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar route = group[i].component.route;\r\n\t\t\troute.resume(container);\r\n\t\t\tswitchArray.push(route);\r\n\t\t}\r\n\r\n\t\tthis.checkGroup(switchArray, this.getPath());\r\n\t\treturn id;\r\n\t}\r\n\r\n\tgetSwitchGroup(id)\r\n\t{\r\n\t\treturn (this.switches[id] = []);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a switch by id.\r\n\t *\r\n\t * @param {string} id\r\n\t */\r\n\tremoveSwitch(id)\r\n\t{\r\n\t\tlet switches = this.switches;\r\n\t\tif(switches[id])\r\n\t\t{\r\n\t\t\tdelete switches[id];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a route by uri.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @return {object} a reference to the router object.\r\n\t */\r\n\tremove(uri)\r\n\t{\r\n\t\turi = this.createURI(uri);\r\n\r\n\t\tlet route = this.getRoute(uri);\r\n\t\tif(route !== false)\r\n\t\t{\r\n\t\t\tthis.removeRoute(route);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the router.\r\n\t *\r\n\t * @param {string} [baseURI]\r\n\t * @param {string} [title]\r\n\t * @return {object} a reference to the router object.\r\n\t */\r\n\tsetup(baseURI, title)\r\n\t{\r\n\t\tthis.baseURI = baseURI || '/';\r\n\t\tthis.updateBaseTag(this.baseURI);\r\n\t\tthis.title = (typeof title !== 'undefined')? title : '';\r\n\r\n\t\tthis.setupHistory();\r\n\r\n\t\tthis.data.set('path', this.getPath());\r\n\r\n\t\tthis.callBackLink = this.checkLink.bind(this);\r\n\t\tbase.on('click', document, this.callBackLink);\r\n\r\n\t\t/* this will route to the first url entered\r\n\t\twhen the router loads. this will fix the issue\r\n\t\tthat stopped the first endpoint from being\r\n\t\tadded to the history */\r\n\t\tlet endPoint = this.getEndPoint();\r\n\t\tthis.navigate(endPoint, null, true);\r\n\t\treturn this;\r\n\t}\r\n\r\n\tupdateBaseTag(url)\r\n\t{\r\n\t\t/* this will modify the base tag to ref from\r\n\t\tthe base url for all xhr */\r\n\t\tlet ele = document.getElementsByTagName('base');\r\n\t\tif(ele.length)\r\n\t\t{\r\n\t\t\tele[0].href = url;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the parent element link.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @return {(object|boolean)}\r\n\t */\r\n\tgetParentLink(ele)\r\n\t{\r\n\t\tlet target = ele.parentNode;\r\n\t\twhile(target !== null)\r\n\t\t{\r\n\t\t\tif(target.nodeName.toLowerCase() === 'a')\r\n\t\t\t{\r\n\t\t\t\treturn target;\r\n\t\t\t}\r\n\r\n\t\t\ttarget = target.parentNode;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if a link was routed.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} evt\r\n\t */\r\n\tcheckLink(evt)\r\n\t{\r\n\t\tif(evt.ctrlKey === true)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tlet target = evt.target || evt.srcElement;\r\n\t\tif(target.nodeName.toLowerCase() !== 'a')\r\n\t\t{\r\n\t\t\t/* this will check to get the parent to check\r\n\t\t\tif the child is contained in a link */\r\n\t\t\ttarget = this.getParentLink(target);\r\n\t\t\tif(target === false)\r\n\t\t\t{\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif(target.target === '_blank' || base.data(target, 'cancel-route'))\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tlet href = target.getAttribute('href');\r\n\t\tif(typeof href !== 'undefined')\r\n\t\t{\r\n\t\t\tlet baseUri = this.baseURI,\r\n\t\t\tpath = (baseUri !== '/')? href.replace(baseUri, '') : href;\r\n\t\t\tthis.navigate(path);\r\n\r\n\t\t\tevt.preventDefault();\r\n\t\t\tevt.stopPropagation();\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will reset the router.\r\n\t *\r\n\t * @return {object} a reference to the router object.\r\n\t */\r\n\treset()\r\n\t{\r\n\t\tthis.routes = [];\r\n\t\tthis.switches = [];\r\n\t\tthis.switchCount = 0;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check the active routes.\r\n\t *\r\n\t * @return {object} a reference to the router object.\r\n\t */\r\n\tactivate()\r\n\t{\r\n\t\tthis.checkActiveRoutes();\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will navigate the router.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @param {object} [data]\r\n\t * @param {boolean} [replace]\r\n\t * @return {object} a reference to the router object.\r\n\t */\r\n\tnavigate(uri, data, replace)\r\n\t{\r\n\t\turi = this.createURI(uri);\r\n\t\tthis.history.addState(uri, data, replace);\r\n\t\tthis.activate();\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the data path.\r\n\t * @protected\r\n\t */\r\n\tupdatePath()\r\n\t{\r\n\t\tlet path = this.getPath();\r\n\t\tthis.data.set('path', path);\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the title.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} route\r\n\t */\r\n\tupdateTitle(route)\r\n\t{\r\n\t\tif(!route || !route.title)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tlet getTitle = (title) =>\r\n\t\t{\r\n\t\t\t/* this will uppercase each word in a string\r\n\t\t\t@param (string) str = the string to uppercase\r\n\t\t\t@return (string) the uppercase string */\r\n\t\t\tlet toTitleCase = (str) =>\r\n\t\t\t{\r\n\t\t\t\tlet pattern = /\\w\\S*/;\r\n\t\t\t\treturn str.replace(pattern, (txt) =>\r\n\t\t\t\t{\r\n\t\t\t\t\treturn txt.charAt(0).toUpperCase() + txt.substring(1).toLowerCase();\r\n\t\t\t\t});\r\n\t\t\t};\r\n\r\n\r\n\t\t\t/* this will replace the params in the title\r\n\t\t\t@param (string) str = the route title\r\n\t\t\t@return (string) the title string */\r\n\t\t\tlet replaceParams = (str) =>\r\n\t\t\t{\r\n\t\t\t\tif(str.indexOf(':') > -1)\r\n\t\t\t\t{\r\n\t\t\t\t\tlet params = route.stage;\r\n\t\t\t\t\tfor(var prop in params)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif(params.hasOwnProperty(prop))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tvar param = params[prop],\r\n\t\t\t\t\t\t\tpattern = new RegExp(':' + prop, 'gi');\r\n\t\t\t\t\t\t\tstr = str.replace(pattern, param);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn str;\r\n\t\t\t};\r\n\r\n\t\t\tif(title)\r\n\t\t\t{\r\n\t\t\t\tif(typeof title === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\ttitle = title(route.stage);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/* we want to replace any params in the title\r\n\t\t\t\tand uppercase the title */\r\n\t\t\t\ttitle = replaceParams(title);\r\n\t\t\t\ttitle = toTitleCase(title);\r\n\r\n\t\t\t\t/* we want to check to add the base title to the\r\n\t\t\t\tto the end of the title */\r\n\t\t\t\tif(this.title !== '')\r\n\t\t\t\t{\r\n\t\t\t\t\ttitle += \" - \" + this.title;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn title;\r\n\t\t};\r\n\r\n\t\tlet title = route.title;\r\n\t\tdocument.title = getTitle(title);\r\n\t}\r\n\r\n\t/**\r\n\t * This will check the routes to match the path.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} [path]\r\n\t */\r\n\tcheckActiveRoutes(path)\r\n\t{\r\n\t\tthis.lastPath = path;\r\n\r\n\t\tpath = path || this.getPath();\r\n\t\tthis.path = path;\r\n\r\n\t\tlet routes = this.routes,\r\n\t\tlength = routes.length;\r\n\r\n\t\tlet route;\r\n\t\tfor(var i = 0; i < length; i++)\r\n\t\t{\r\n\t\t\troute = routes[i];\r\n\t\t\tif(typeof route === 'undefined')\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tthis.checkRoute(route, path);\r\n\t\t}\r\n\r\n\t\tthis.checkSwitches(path);\r\n\t\tthis.updatePath();\r\n\t}\r\n\r\n\t/**\r\n\t * This will check the switches to match the path.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} [path]\r\n\t */\r\n\tcheckSwitches(path)\r\n\t{\r\n\t\tlet switches = this.switches;\r\n\t\tfor(var id in switches)\r\n\t\t{\r\n\t\t\tif(switches.hasOwnProperty(id) === false)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tvar group = switches[id];\r\n\t\t\tthis.checkGroup(group, path);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will check a group to match a path.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} group\r\n\t * @param {string} path\r\n\t */\r\n\tcheckGroup(group, path)\r\n\t{\r\n\t\tlet check = false,\r\n\t\troute, firstRoute, lastSelected, selected, hasController = false;\r\n\r\n\t\tfor(var i = 0, length = group.length; i < length; i++)\r\n\t\t{\r\n\t\t\troute = group[i];\r\n\t\t\tif(typeof route === 'undefined')\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t/* we want to save the first route in the switch\r\n\t\t\tso it can be selected if no route is active */\r\n\t\t\tif(i === 0)\r\n\t\t\t{\r\n\t\t\t\tfirstRoute = route;\r\n\t\t\t}\r\n\r\n\t\t\tif(!lastSelected && route.get('active'))\r\n\t\t\t{\r\n\t\t\t\tlastSelected = route;\r\n\t\t\t}\r\n\r\n\t\t\tif(check !== false)\r\n\t\t\t{\r\n\t\t\t\tif(hasController)\r\n\t\t\t\t{\r\n\t\t\t\t\troute.deactivate();\r\n\t\t\t\t}\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t/* we will break the loop on the first match */\r\n\t\t\tcheck = route.match(path);\r\n\t\t\tif(check !== false)\r\n\t\t\t{\r\n\t\t\t\tselected = route;\r\n\r\n\t\t\t\tif(route.controller)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.select(route);\r\n\t\t\t\t\thasController = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif(selected === undefined)\r\n\t\t{\r\n\t\t\tthis.select(firstRoute);\r\n\r\n\t\t\tif(lastSelected && firstRoute !== lastSelected)\r\n\t\t\t{\r\n\t\t\t\tlastSelected.deactivate();\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif(lastSelected)\r\n\t\t\t{\r\n\t\t\t\tif(hasController && selected !== lastSelected)\r\n\t\t\t\t{\r\n\t\t\t\t\tlastSelected.deactivate();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if(firstRoute && hasController === false)\r\n\t\t\t{\r\n\t\t\t\tthis.select(firstRoute);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if a route matches the path.\r\n\t *\r\n\t * @param {object} route\r\n\t * @param {string} path\r\n\t * @return {boolean}\r\n\t */\r\n\tcheckRoute(route, path)\r\n\t{\r\n\t\tlet check = this.check(route, path);\r\n\t\tif(check !== false)\r\n\t\t{\r\n\t\t\tthis.select(route);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\troute.deactivate();\r\n\t\t}\r\n\t\treturn check;\r\n\t}\r\n\r\n\t/**\r\n\t * This will select a route if the route matches the path.\r\n\t *\r\n\t * @param {object} route\r\n\t * @param {string} [path]\r\n\t */\r\n\tcheck(route, path)\r\n\t{\r\n\t\t/* we want to check if the route has been\r\n\t\tdeleted from the routes */\r\n\t\tif(!route)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to check to use the supplied uri or get the\r\n\t\tcurrent uri if not setup */\r\n\t\tpath = path || this.getPath();\r\n\r\n\t\t/* we want to check if the route uri matches the path uri */\r\n\t\treturn (route.match(path) !== false);\r\n\t}\r\n\r\n\t/**\r\n\t * This will select the route.\r\n\t *\r\n\t * @param {object} route\r\n\t */\r\n\tselect(route)\r\n\t{\r\n\t\tif(!route)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\troute.setPath(this.path, this.lastPath);\r\n\t\troute.select();\r\n\t\tthis.updateTitle(route);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the endpoint.\r\n\t *\r\n\t * @return {string}\r\n\t */\r\n\tgetEndPoint()\r\n\t{\r\n\t\tlet path = this.getPath();\r\n\t\treturn (path.replace(this.baseURI, '') || '/');\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the router events.\r\n\t */\r\n\tdestroy()\r\n\t{\r\n\t\tbase.off('click', document, this.callBackLink);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the location pathname.\r\n\t *\r\n\t * @return {string}\r\n\t */\r\n\tgetPath()\r\n\t{\r\n\t\t/* we want to get the window location path */\r\n\t\tlet location = this.location,\r\n\t\tpath = this.path = location.pathname;\r\n\r\n\t\tif(this.history.type === 'hash')\r\n\t\t{\r\n\t\t\treturn location.hash.replace('#', '');\r\n\t\t}\r\n\r\n\t\treturn path + location.search + location.hash;\r\n\t}\r\n}\r\n\r\nexport const router = new Router();", "import {Objects} from \"../../shared/objects.js\";\r\n\r\n/**\r\n * Atom\r\n *\r\n * This will create an interface for atoms to\r\n * extend from a parent atom.\r\n * @class\r\n */\r\nexport const Atom = function()\r\n{\r\n\r\n};\r\n\r\n/**\r\n * This will extend the atom to a child atom.\r\n * @static\r\n * @param {(object|function)}\r\n * @return {function} The child atom constructor.\r\n */\r\nAtom.extend = function extend(childLayout)\r\n{\r\n\tlet parent = this;\r\n\r\n\t/*\r\n\tthis will setup a layout function to call to standardize\r\n\tthe interface for non function atoms.\r\n\t*/\r\n\tif(typeof childLayout === 'object')\r\n\t{\r\n\t\tlet layoutObject = childLayout;\r\n\t\tchildLayout = (props) =>\r\n\t\t{\r\n\t\t\treturn Objects.cloneObject(layoutObject);\r\n\t\t};\r\n\t}\r\n\r\n\tconst child = (props = {}) =>\r\n\t{\r\n\t\tprops = props || {};\r\n\t\tlet layout = childLayout(props),\r\n\r\n\t\t// we want to check to merge the layout with the parent layout\r\n\t\tparentLayout = parent(props);\r\n\t\tif(typeof parentLayout === 'object')\r\n\t\t{\r\n\t\t\tlayout = Objects.extendObject(parentLayout, layout);\r\n\t\t}\r\n\t\treturn layout;\r\n\t};\r\n\r\n\tchild.extend = extend;\r\n\treturn child;\r\n};", "import {base} from './core.js';\r\nimport {ajax} from './modules/ajax/ajax.js';\r\nimport {dataBinder} from './modules/data-binder/data-binder.js';\r\nimport {Data, SimpleData, Model} from './modules/data/data.js';\r\nimport {state} from './modules/state/state.js';\r\nimport {router, NavLink} from './modules/router/router.js';\r\nimport {builder} from './modules/layout/layout-builder.js';\r\nimport {Unit, Component, Jot, Watch} from './modules/component/component.js';\r\nimport {Atom} from './modules/atom/atom.js';\r\n\r\nbase.augment(\r\n{\r\n ajax,\r\n dataBinder,\r\n Data,\r\n SimpleData,\r\n Model,\r\n state,\r\n builder,\r\n router,\r\n Component\r\n});\r\n\r\nexport {\r\n base,\r\n ajax,\r\n dataBinder,\r\n Data,\r\n SimpleData,\r\n Model,\r\n state,\r\n builder,\r\n router,\r\n Unit,\r\n Component,\r\n Jot,\r\n Watch,\r\n NavLink,\r\n Atom\r\n};\r\n\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["Objects", "object", "sourceObj", "targetObj", "property", "obj", "sourceClass", "targetClass", "source", "target", "prop", "TrackerTypes", "type", "callBack", "Tracker", "addingType", "data", "removingType", "types", "i", "length", "prop", "DataTracker", "obj", "id", "tracker", "trackers", "key", "global", "Base", "DataTracker", "methods", "prototype", "property", "list", "obj", "methodName", "overrideMethod", "args", "errors", "err", "str", "decode", "objURL", "regExp", "a", "b", "c", "d", "key", "id", "name", "selector", "single", "elements", "html", "value", "css", "currentValue", "currentStyle", "inheritedStyle", "prop", "base", "queryString", "previous", "match", "delimiter", "left", "top", "w", "doc", "de", "width", "height", "body", "defaultText", "depth", "position", "count", "tmpClassName", "adding", "i", "maxLength", "data", "type", "array", "element", "fromIndex", "method", "argArray", "addArgs", "removeNewLines", "escapeChars", "newLine", "tab", "sanitize", "text", "pattern", "prepareUrl", "before", "after", "parser", "Objects", "countProperty", "matchProperties", "obj1", "obj2", "matched", "value1", "value2", "compareObjects", "option1Count", "option2Count", "option1", "option2", "option1Type", "dataTracker", "base", "events", "obj", "event", "fn", "capture", "swapped", "originalFn", "data", "result", "listener", "eventObj", "swappable", "i", "maxLength", "type", "evt", "length", "eventType", "settings", "params", "e", "options", "eventTypes", "value", "prop", "getMouseWheelType", "callBackFn", "cancelDefault", "mouseWheelResults", "delta", "XhrDefaultSettings", "base", "params", "callBack", "settingsObj", "ajax", "args", "XhrRequest", "xhr", "method", "url", "async", "items", "settings", "i", "length", "object", "prop", "addingParams", "paramsType", "addingType", "key", "fixedParams", "maxLength", "arg", "headers", "header", "e", "overrideType", "removeEvents", "events", "response", "responseType", "lastToken", "DataPubSub", "msg", "callBacks", "callBack", "token", "list", "length", "i", "item", "args", "pubSub", "Source", "token", "OneWaySource", "Source", "data", "msg", "callBack", "Connection", "OneWayConnection", "Connection", "data", "OneWaySource", "TwoWaySource", "Source", "msg", "callBack", "pubSub", "DataSource", "TwoWaySource", "data", "prop", "value", "committer", "SetAttr", "element", "attr", "value", "base", "UpdateRadioAttr", "UpdateCheckboxAttr", "UpdateAttr", "GetAttr", "GetAttribute", "ElementSource", "TwoWaySource", "filter", "type", "customAttr", "tagName", "pattern", "committer", "TwoWayConnection", "Connection", "element", "attr", "filter", "ElementSource", "data", "prop", "DataSource", "source", "ConnectionTracker", "id", "attr", "connection", "connections", "base", "prop", "DataBinder", "ConnectionTracker", "element", "data", "prop", "filter", "bindProp", "bindAttr", "parts", "connection", "connectionElement", "value", "customAttr", "id", "TwoWayConnection", "dataId", "msg", "attr", "callBack", "OneWayConnection", "committer", "pubSub", "evt", "target", "base", "dataBinder", "cloneObject", "obj", "setupAttrSettings", "settings", "attributes", "prop", "setting", "BasicData", "settings", "DataPubSub", "attributes", "setupAttrSettings", "constructor", "attrName", "callBack", "message", "token", "attr", "val", "committer", "prevValue", "args", "items", "stopMerge", "item", "obj", "key", "value", "defaultValue", "data", "alias", "tokens", "prop", "childAttr", "propValue", "remoteToken", "links", "i", "length", "removeFromLinks", "DataUtils", "str", "pattern", "Data", "BasicData", "obj", "attr", "val", "DataUtils", "prop", "props", "length", "end", "i", "committer", "stopMerge", "data", "value", "constructor", "index", "currentValue", "path", "publish", "nextProp", "nextAttr", "pathString", "subPath", "dataBinder", "message", "cloneObject", "propValue", "SimpleData", "BasicData", "attr", "val", "committer", "prevValue", "message", "dataBinder", "ModelService", "model", "result", "callBack", "params", "defaults", "object", "prop", "addingParams", "base", "key", "instanceParams", "id", "response", "item", "start", "count", "filter", "url", "baseUrl", "method", "requestCallBack", "settings", "xhr", "ajax", "data", "child", "parent", "service", "setupDefaultAttr", "settings", "attributes", "defaults", "prop", "attr", "getXhr", "settingsXhr", "xhr", "modelTypeNumber", "Model", "Data", "parent", "service", "defaultAttributes", "model", "instanceSettings", "instanceAttr", "setupAttrSettings", "ModelService", "StateTarget", "SimpleData", "id", "state", "action", "token", "actions", "StateController", "id", "target", "targets", "StateTarget", "targetId", "action", "state", "token", "callBack", "LayoutParser", "obj", "type", "node", "attr", "children", "tag", "reserved", "key", "value", "dataTracker", "base", "NORMALIZED_NAMES", "normalizeAttr", "prop", "removeEventPrefix", "htmlBuilder", "nodeName", "attrObject", "container", "prepend", "obj", "type", "attrPropValue", "content", "attr", "value", "attrName", "text", "selectElem", "optionArray", "defaultValue", "n", "maxLength", "settings", "option", "ele", "children", "length", "i", "child", "dataBinder", "newParent", "parent", "optionalNode", "node", "deepCopy", "WATCHER_PATTERN", "WatcherHelper", "string", "pattern", "matches", "i", "length", "ele", "attr", "value", "base", "data", "isArray", "count", "watcherData", "result", "parent", "settings", "props", "values", "isDataArray", "callBack", "overrideCallBack", "isMultiProp", "committer", "prop", "dataBinder", "JOT_SHORTHAND_METHODS", "getJotShorthandMethod", "value", "JotComponent", "settings", "component", "prop", "alias", "createComponentClass", "Child", "Component", "createUnitClass", "Unit", "Jot", "layout", "Watch", "data", "prop", "callBack", "ele", "value", "base", "parser", "LayoutParser", "LayoutBuilder", "htmlBuilder", "nodeName", "attrObject", "container", "parent", "obj", "type", "attrPropValue", "attr", "removeEventPrefix", "e", "attrName", "normalizeAttr", "layout", "component", "Jot", "jot", "fragment", "item", "i", "length", "child", "settings", "propName", "children", "bind", "onState", "onSet", "map", "forBind", "useParent", "useData", "useState", "addState", "filter", "dataSource", "dataBinder", "route", "newRoute", "group", "id", "role", "attributes", "onSetCallBack", "val", "text", "context", "parentContext", "childContext", "branchName", "watcher", "WatcherHelper", "state", "states", "items", "row", "scope", "parentData", "scopeData", "scoped", "update", "maxLength", "itemSettings", "result", "key", "previousResult", "stateStyles", "newValue", "tag", "builder", "base", "data", "component", "unitNumber", "Unit", "props", "prop", "parentContext", "context", "branchName", "value", "branch", "layout", "container", "builder", "optionalNode", "frag", "content", "items", "callBack", "children", "i", "length", "item", "ele", "propName", "element", "id", "mainId", "panel", "filter", "dataBinder", "EventHelper", "events", "length", "event", "i", "obj", "callBack", "capture", "base", "option", "StateHelper", "state", "states", "actions", "action", "callBack", "targetId", "prop", "remotes", "remote", "i", "length", "value", "remoteStates", "target", "actionEvent", "remoteTargetId", "remoteTarget", "token", "Component", "Unit", "props", "id", "targetId", "state", "states", "base", "StateHelper", "EventHelper", "events", "NavLink", "Component", "href", "text", "watchers", "string", "type", "exact", "data", "router", "ele", "value", "path", "selected", "Utils", "uri", "ComponentHelper", "route", "settings", "params", "template", "type", "comp", "persist", "builder", "component", "loaded", "isLoaded", "src", "Script", "props", "e", "callBack", "Style", "Group", "atom", "load", "builder", "files", "i", "length", "loadModule", "module", "isConstructor", "object", "render", "layout", "ele", "parent", "frag", "firstChild", "Comment", "ImportWrapper", "Jot", "params", "Import", "routePattern", "uri", "uriQuery", "filter", "optionalSlash", "str", "pattern", "param", "optionalParams", "allowAll", "getParamDefaults", "params", "defaults", "i", "length", "paramPattern", "matches", "maxLength", "routeCount", "Route", "SimpleData", "settings", "paramKeys", "uriMatch", "title", "controller", "imported", "Import", "component", "container", "persist", "parent", "helperSettings", "ComponentHelper", "path", "referralPath", "callBack", "hash", "ele", "matched", "result", "values", "keys", "maxL", "key", "HistoryController", "router", "BrowserHistory", "HashHistory", "routerNumber", "History", "base", "evt", "state", "uri", "data", "stateObj", "replace", "history", "lastState", "base", "data", "route", "router", "id", "Router", "Data", "HistoryController", "settings", "uri", "Route", "args", "container", "pathURI", "Utils", "routes", "length", "i", "index", "group", "switchArray", "switches", "baseURI", "title", "endPoint", "url", "ele", "target", "evt", "href", "baseUri", "path", "replace", "getTitle", "toTitleCase", "str", "pattern", "txt", "replaceParams", "params", "prop", "param", "check", "firstRoute", "lastSelected", "selected", "hasController", "location", "Atom", "extend", "childLayout", "parent", "layoutObject", "props", "Objects", "child", "layout", "parentLayout", "base", "ajax", "dataBinder", "Data", "SimpleData", "Model", "state", "builder", "router", "Component"]
|
|
7
7
|
}
|