export declare const NSUtilCode = "var nsModuleExport = (function()\r\n{\r\n\tvar nsModuleExport = function(root,name,prototype)\r\n\t{\r\n\t\tif(typeof exports === 'object' && typeof module === 'object')\r\n\t\t{\r\n\t\t\tmodule.exports[name] = prototype;\r\n\t\t}\r\n\t\telse if (typeof define === \"function\" && define.amd)\r\n\t\t{\r\n\t\t\tdefine(name,[], function () {return prototype;});\r\n\t\t}\r\n\t\telse if(typeof exports === 'object')\r\n\t\t{\r\n\t\t\texports[name] = prototype;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\troot[name] = prototype;\r\n\t\t}\r\n\t};\r\n\treturn nsModuleExport;\r\n})();\r\n(function(root,name,prototype)\r\n{\r\n\tif(typeof exports === 'object' && typeof module === 'object')\r\n\t{\r\n\t\tmodule.exports[name] = prototype;\r\n\t}\r\n\telse if (typeof define === \"function\" && define.amd)\r\n\t{\r\n\t\tdefine(name,[], function () {return prototype;});\r\n\t}\r\n\telse if(typeof exports === 'object')\r\n\t{\r\n\t\texports[name] = prototype;\r\n\t}\r\n\telse\r\n\t{\r\n\t\troot[name] = prototype;\r\n\t}\r\n})(this,\"nsModuleExport\",nsModuleExport);\r\nvar NSUtil = (function()\r\n{\r\n\tfunction NSUtil()\r\n\t{\r\n\t\tthis.__sheetId = \"nsStyle\";\r\n\t\tthis.KEYCODE = {BACKSPACE:8, TAB:9, ENTER:13, SHIFT:16, CTRL:17, ALT:18, ESC:27,SPACE:32,PAGEUP:33,PAGEDOWN:34,LEFT:37,UP:38,RIGHT:39,DOWN:40,INSERT:45,DELETE:46};\r\n\t\tthis.ANIMATIONDELAY = 10;\r\n\t\t//for nsMenu and nsPinTip\r\n\t\tthis.POS_TOP = \"top\";\r\n\t\tthis.POS_BOTTOM = \"bottom\";\r\n\t\tthis.POS_LEFT = \"left\";\r\n\t\tthis.POS_RIGHT = \"right\";\r\n\t\tthis.POS_TOPLEFT = \"top-left\";\r\n\t\tthis.POS_TOPRIGHT = \"top-right\";\r\n\t\tthis.POS_BOTTOMLEFT = \"bottom-left\";\r\n\t\tthis.POS_BOTTOMRIGHT = \"bottom-right\";\r\n\t};\r\n\t\r\n\tNSUtil.prototype.getDomVariables = function()\r\n\t{\r\n\t\tvar retValue = {doc: null,win: null};\r\n\t\tif(typeof document === 'undefined')\r\n\t\t{\r\n\t\t\tretValue.doc = {\r\n\t\t\t\t\tbody: {},\r\n\t\t\t\t    addEventListener: function addEventListener() {},\r\n\t\t\t\t    removeEventListener: function removeEventListener() {},\r\n\t\t\t\t    activeElement: {\r\n\t\t\t\t      blur: function blur() {},\r\n\t\t\t\t      nodeName: '',\r\n\t\t\t\t    },\r\n\t\t\t\t    querySelector: function querySelector() {\r\n\t\t\t\t      return null;\r\n\t\t\t\t    },\r\n\t\t\t\t    querySelectorAll: function querySelectorAll() {\r\n\t\t\t\t      return [];\r\n\t\t\t\t    },\r\n\t\t\t\t    getElementById: function getElementById() {\r\n\t\t\t\t      return null;\r\n\t\t\t\t    },\r\n\t\t\t\t    createEvent: function createEvent() {\r\n\t\t\t\t      return {\r\n\t\t\t\t        initEvent: function initEvent() {},\r\n\t\t\t\t      };\r\n\t\t\t\t    },\r\n\t\t\t\t    createElement: function createElement() {\r\n\t\t\t\t      return {\r\n\t\t\t\t        children: [],\r\n\t\t\t\t        childNodes: [],\r\n\t\t\t\t        style: {},\r\n\t\t\t\t        setAttribute: function setAttribute() {},\r\n\t\t\t\t        getElementsByTagName: function getElementsByTagName() {\r\n\t\t\t\t          return [];\r\n\t\t\t\t        },\r\n\t\t\t\t      };\r\n\t\t\t\t    },\r\n\t\t\t\t    location: { hash: '' },\r\n\t\t\t};\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tretValue.doc = document;\r\n\t\t}\r\n\t\tif(typeof window === 'undefined')\r\n\t\t{\r\n\t\t\tretValue.win = \r\n\t\t\t{\r\n\t\t\t\t\tdocument: retValue.doc,\r\n\t\t\t\t    navigator: {\r\n\t\t\t\t      userAgent: '',\r\n\t\t\t\t    },\r\n\t\t\t\t    location: {},\r\n\t\t\t\t    history: {},\r\n\t\t\t\t    CustomEvent: function CustomEvent() {\r\n\t\t\t\t      return this;\r\n\t\t\t\t    },\r\n\t\t\t\t    addEventListener: function addEventListener() {},\r\n\t\t\t\t    removeEventListener: function removeEventListener() {},\r\n\t\t\t\t    getComputedStyle: function getComputedStyle() {\r\n\t\t\t\t      return {\r\n\t\t\t\t        getPropertyValue: function getPropertyValue() {\r\n\t\t\t\t          return '';\r\n\t\t\t\t        },\r\n\t\t\t\t      };\r\n\t\t\t\t    },\r\n\t\t\t\t    Image: function Image() {},\r\n\t\t\t\t    Date: function Date() {},\r\n\t\t\t\t    screen: {},\r\n\t\t\t\t    setTimeout: function setTimeout() {},\r\n\t\t\t\t    clearTimeout: function clearTimeout() {},\r\n\t\t\t};\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tretValue.win = window;\r\n\t\t}\r\n\t\treturn retValue;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.getSupportedEvents = function ()\r\n\t{\r\n\t\tvar obj = this.getDomVariables();\r\n\t\tvar win = obj.win;\r\n\t\tvar doc = obj.doc;\r\n\t\tvar retValue = {};\r\n\t\tretValue.touch = (win.Modernizr && win.Modernizr.touch === true) || (!!((win.navigator.maxTouchPoints > 0) || ('ontouchstart' in win) || (win.DocumentTouch && doc instanceof win.DocumentTouch)));\r\n\t\tretValue.pointerEvents = !!win.PointerEvent && ('maxTouchPoints' in win.navigator) && win.navigator.maxTouchPoints > 0;\r\n\t\tretValue.passiveListener = (function checkPassiveListener() {\r\n\t\t        var supportsPassive = false;\r\n\t\t        try {\r\n\t\t          var opts = Object.defineProperty({}, 'passive', {\r\n\t\t            // eslint-disable-next-line\r\n\t\t            get: function get() {\r\n\t\t              supportsPassive = true;\r\n\t\t            },\r\n\t\t          });\r\n\t\t          win.addEventListener('testPassiveListener', null, opts);\r\n\t\t        } catch (e) {\r\n\t\t          // No support\r\n\t\t        }\r\n\t\t        return supportsPassive;\r\n\t      }());\r\n\t\tretValue.gestures = 'ongesturestart' in win;\r\n\t\t\r\n\t\treturn retValue;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.isMobile = function(win)\r\n\t{\r\n\t\tvar win = this.getWin(win);\r\n\t\tvar userAgent = (win.navigator && win.navigator.userAgent) ? win.navigator.userAgent : null;\r\n\t\tvar objOS = {android:{pattern:\"Android\",flags:\"i\"} ,blackberry:{pattern:\"BlackBerry\",flags:\"i\"} ,ios:{pattern:\"iPhone|iPad|iPod\",flags:\"i\"} ,opera:{pattern:\"Opera Mini\",flags:\"i\"} ,windows:{pattern:\"IEMobile\",flags:\"i\"}};\r\n\t\tvar objRet = {};\r\n\t\tif(userAgent)\r\n\t\t{\r\n\t\t\tvar any = false;\r\n\t\t\tvar item = null;\r\n\t\t\tfor(var os in objOS)\r\n\t\t\t{\r\n\t\t\t\titem = objOS[os];\r\n\t\t\t\tobjRet[os] = userAgent.match(new RegExp(item.pattern,item.flags));\r\n\t\t\t\tif(objRet[os])\r\n\t\t\t\t{\r\n\t\t\t\t\tany = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tobjRet[\"any\"] = any;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tfor(var os in objOS)\r\n\t\t\t{\r\n\t\t\t\tobjRet[os] = false;\r\n\t\t\t}\r\n\t\t\tobjRet[\"any\"] = false;\r\n\t\t}\r\n\t\treturn objRet;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.getElement = function (element,doc)\r\n\t{\r\n\t\tif(element)\r\n\t\t{\r\n\t\t\tif(this.isObject(element))\r\n\t\t\t{\r\n\t\t\t\treturn element;\r\n\t\t\t}\r\n\t\t\telse if(element.length > 0)\r\n\t\t\t{\r\n\t\t\t\tdoc = this.getDoc(doc);\r\n\t\t\t\treturn doc.getElementById(element);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn null;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.getElementFromHtml = function (html)\r\n\t{\r\n\t\tif(html)\r\n\t\t{\r\n\t\t\tvar div = this.createDiv();\r\n\t\t\tdiv.innerHTML = html.toString();\r\n\t\t\tvar child = (div.firstChild !== div.lastChild || !div.firstChild) ? div : div.firstChild;\r\n\t\t\treturn child;\r\n\t\t}\r\n\t\treturn null;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.getReferenceFromHtml = function(html)\r\n\t{\r\n\t\tvar comp = this.getElementFromHtml(html);\r\n\t\tif(comp)\r\n\t\t{\r\n\t\t\tvar arrElement = comp.querySelectorAll(\"[ns-ref],[data-ns-ref]\");\r\n\t\t\tvar objRefs = {};\r\n\t\t\tvar ref = comp.getAttribute(\"ns-ref\") || comp.getAttribute(\"data-ns-ref\");\r\n\t\t\tif(ref)\r\n\t\t\t{\r\n\t\t\t\tobjRefs[ref] = comp;\r\n\t\t\t}\r\n\t\t\tif(arrElement && arrElement.length)\r\n\t\t\t{\r\n\t\t\t\tfor(var count = 0;count < arrElement.length;count++)\r\n\t\t\t\t{\r\n\t\t\t\t\tvar element = arrElement[count];\r\n\t\t\t\t\tref = element.getAttribute(\"ns-ref\") || element.getAttribute(\"data-ns-ref\");\r\n\t\t\t\t\tobjRefs[ref] = element;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn {element : comp,refs: objRefs};\r\n\t\t}\r\n\t\treturn null;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.getWebComponentElement = function (element)\r\n\t{\r\n\t\tif(element && element[\"__impl4cf1e782hg__\"])\r\n\t\t{\r\n\t\t\treturn element[\"__impl4cf1e782hg__\"];\r\n\t\t}\r\n\t\treturn element;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.hasAttribute = function (element,attributeName)\r\n\t{\r\n\t\tif(element && attributeName && element[\"hasAttribute\"])\r\n\t\t{\r\n\t\t\treturn (element.hasAttribute(attributeName) || element.hasAttribute(\"data-\" + attributeName)); \r\n\t\t}\r\n\t\treturn false;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.getAttribute = function (element,attributeName)\r\n\t{\r\n\t\tif(element && attributeName && element[\"hasAttribute\"])\r\n\t\t{\r\n\t\t\treturn (element.hasAttribute(attributeName) ? element.getAttribute(attributeName) : element.getAttribute(\"data-\" + attributeName)); \r\n\t\t}\r\n\t\treturn null;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.removeAttribute = function (element,attributeName)\r\n\t{\r\n\t\tif(element && attributeName && element[\"hasAttribute\"])\r\n\t\t{\r\n\t\t\treturn (element.hasAttribute(attributeName) ? element.removeAttribute(attributeName) : element.removeAttribute(\"data-\" + attributeName)); \r\n\t\t}\r\n\t\treturn null;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.createDiv = function (id,styleName,doc)\r\n\t{\r\n\t    var div = this.createElement(\"div\",id,styleName,doc);\r\n\t    return div;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.createElement = function(type,id,styleName,doc)\r\n\t{\r\n\t\tdoc = this.getDoc(doc);\r\n\t    var element = doc.createElement(type);\r\n\t    if(id)\r\n\t    {\r\n\t    \telement.setAttribute(\"id\",id);\r\n\t    }\r\n\t    if(styleName)\r\n\t    {\r\n\t    \telement.className = styleName;   \r\n\t    }\r\n\t    return element;\r\n\t};\r\n\t\r\n\t//from JQuery\r\n\tNSUtil.prototype.isElementVisible = function(element)\r\n\t{\r\n\t\treturn !!(element.offsetWidth || element.offsetHeight || element.getClientRects().length); \r\n\t};\r\n\t\r\n\tNSUtil.prototype.setDivVisibility = function (id,isVisible,doc)\r\n\t{\r\n\t\tdoc = this.getDoc(doc);\r\n\t    var div = doc.getElementById(id);\r\n\t    if(div)\r\n\t    {\r\n\t        if(isVisible)\r\n\t        {\r\n\t            div.style.display = \"block\";\r\n\t        }\r\n\t        else\r\n\t        {\r\n\t            div.style.display = \"none\";\r\n\t        }\r\n\t    }\r\n\t};\r\n\t\r\n\tNSUtil.prototype.removeDiv = function (id,doc)\r\n\t{\r\n\t\tdoc = this.getDoc(doc);\r\n\t    var div = doc.getElementById(id);\r\n\t    if (div)\r\n\t    {\r\n\t        var parent = div.parentNode;\r\n\t        if(parent)\r\n\t        {\r\n\t            parent.removeChild(div);\r\n\t        }\r\n\t    }\r\n\t};\r\n\t\r\n\t/*Utility Methods */\r\n\tNSUtil.prototype.getKeys = function (object) \r\n\t{\r\n\t    var keys = [];\r\n\t    for (var property in object)\r\n\t    {\r\n\t    \tkeys.push(property);\r\n\t    }\r\n\t    return keys;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.getValues = function (object)\r\n\t{\r\n\t\tvar values = [];\r\n\t\tfor (var property in object)\r\n\t\t{\r\n\t\t\tvalues.push(object[property]);\r\n\t\t}\r\n\t\treturn values;\r\n\t};\r\n\t\r\n\t//from https://stackoverflow.com/questions/201183/how-to-determine-equality-for-two-javascript-objects/16788517#16788517\r\n\t//used in frameworks wrapper\r\n\tNSUtil.prototype.isObjectEqual = function(origValue, newValue) \r\n\t{\r\n\t\tif (origValue === null || origValue === undefined || newValue === null || newValue === undefined) \r\n\t\t{ \r\n\t\t\treturn origValue === newValue; \r\n\t\t}\r\n\t\t// after this just checking type of one would be enough\r\n\t\tif (origValue.constructor !== newValue.constructor) \r\n\t\t{ \r\n\t\t\treturn false; \r\n\t\t}\r\n\t\t// if they are functions, they should exactly refer to same one (because of closures)\r\n\t\tif (origValue instanceof Function) \r\n\t\t{ \r\n\t\t\treturn origValue === newValue; \r\n\t\t}\r\n\t\t// if they are regexps, they should exactly refer to same one (it is hard to better equality check on current ES)\r\n\t\tif (origValue instanceof RegExp) \r\n\t\t{ \r\n\t\t\treturn origValue === newValue; \r\n\t\t}\r\n\t\tif (origValue === newValue || origValue.valueOf() === newValue.valueOf()) \r\n\t\t{ \r\n\t\t\treturn true; \r\n\t\t}\r\n\t\tif (Array.isArray(origValue) && origValue.length !== newValue.length) \r\n\t\t{ \r\n\t\t\treturn false; \r\n\t\t}\r\n\t\t// if they are dates, they must had equal valueOf\r\n\t\tif (origValue instanceof Date) \r\n\t\t{ \r\n\t\t\treturn false; \r\n\t\t}\r\n\t\t// if they are strictly equal, they both need to be object at least\r\n\t\tif (!(origValue instanceof Object)) \r\n\t\t{ \r\n\t\t\treturn false; \r\n\t\t}\r\n\t\tif (!(newValue instanceof Object)) \r\n\t\t{ \r\n\t\t\treturn false; \r\n\t\t}\r\n\t\t// recursive object equality check\r\n\t\tvar arrKeys = Object.keys(origValue);\r\n\t\tvar arrNewKeys = Object.keys(newValue);\r\n\t\tfor(count = 0,len = arrNewKeys,length;count < len;count++)\r\n\t\t{\r\n\t\t\tif(arrKeys.indexOf(count) !== -1)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tfor(innerCount = 0,len = arrKeys,length;innerCount < len;innerCount++)\r\n\t\t\t{\r\n\t\t\t\treturn this.isObjectEqual(origValue[innerCount], newValue[innerCount]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.getValueByKeys = function(item,keyParam)\r\n\t{\r\n\t\tvar objReturn = {};\r\n\t\tif(item)\r\n\t\t{\r\n\t\t\t(function flatObject(item, index)\r\n\t\t\t {\r\n\t\t\t\tvar toString = Object.prototype.toString;\r\n\t\t\t\tvar suffix = toString.call(item) == \"[object Array]\" ? \"]\" : \"\";\r\n\t\t\t\tfor(var key in item)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(!item.hasOwnProperty(key))continue;\r\n\t\t\t\t\tobjReturn[index+key+suffix] = item[key];\r\n\t\t\t\t\tif( toString.call(item[key]) == \"[object Array]\" )flatObject(item[key],index+key+suffix+\"[\");\r\n\t\t\t\t\tif( toString.call(item[key]) == \"[object Object]\" )flatObject(item[key],index+key+suffix+\".\");   \r\n\t\t\t\t}\r\n\t\t\t })(item,\"\");\r\n\t\t}\r\n\t\treturn objReturn[keyParam];\r\n\t};\r\n\t\r\n\t//arrIgnoreDeepCopy in case there is a circular reference in Hierarchical structure like in NSNavigation\r\n\tNSUtil.prototype.cloneObject = function(objSource,deepCopy,arrIgnoreKeys,arrIgnoreDeepCopy) \r\n\t{\r\n\t\tif(!arrIgnoreKeys)\r\n\t\t{\r\n\t\t\tarrIgnoreKeys = [];\r\n\t\t}\r\n\t\tif(!arrIgnoreDeepCopy)\r\n\t\t{\r\n\t\t\tarrIgnoreDeepCopy = [];\r\n\t\t}\r\n\t\tif(!objSource || typeof objSource != \"object\" || Object.prototype.toString.call(objSource) === \"[object Function]\")\r\n\t\t{\r\n\t\t\t// null, undefined, any non-object, or function\r\n\t\t\treturn objSource;\t// anything\r\n\t\t}\r\n\t\tif(objSource.nodeType && \"cloneNode\" in objSource)\r\n\t\t{\r\n\t\t\t// DOM Node\r\n\t\t\treturn objSource.cloneNode(true); // Node\r\n\t\t}\r\n\t\tif(objSource instanceof Date)\r\n\t\t{\r\n\t\t\t// Date\r\n\t\t\treturn new Date(objSource.getTime());\t// Date\r\n\t\t}\r\n\t\tif(objSource instanceof RegExp)\r\n\t\t{\r\n\t\t\t// RegExp\r\n\t\t\treturn new RegExp(objSource);   // RegExp\r\n\t\t}\r\n\t\tif(objSource instanceof Array)\r\n\t\t{\r\n\t\t\tvar arrClone = [];\r\n\t\t\tvar length = objSource.length;\r\n\t\t    for (var count = 0; count < length; count++) \r\n\t\t    {\r\n\t\t        var item = objSource[count];\r\n\t\t        var obj = this.cloneObject(item,deepCopy,arrIgnoreKeys,arrIgnoreDeepCopy);\r\n\t\t        arrClone.push(obj);\r\n\t\t    }\r\n\t\t    return arrClone;\r\n\t\t}\r\n\t\t// we don't clone functions for performance reasons\r\n\t\t//\t\t}else if(d.isFunction(objSource)){\r\n\t\t//\t\t\t// function\r\n\t\t//\t\t\tr = function(){ return objSource.apply(this, arguments); };\r\n\t\t// generic objects\r\n\t\tvar objClone = {};\r\n\t\tvar clonedItem = null;\r\n\t\tfor (var key in objSource) \r\n\t\t{\r\n\t\t\tvar isClone = true;\r\n\t\t\tfor (var count = 0; count < arrIgnoreKeys.length; count++) \r\n\t\t    {\r\n\t\t\t\tif(arrIgnoreKeys[count] == key)\r\n\t\t\t\t{\r\n\t\t\t\t\tisClone = false;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t    }\r\n\t\t\tif(isClone)\r\n\t\t\t{\r\n\t\t\t\tif(deepCopy)\r\n\t\t\t\t{\r\n\t\t\t\t\tvar isIgnoreDeepCopy = false;\r\n\t\t\t\t\tfor (var ignoreDeepCount = 0; ignoreDeepCount < arrIgnoreDeepCopy.length; ignoreDeepCount++) \r\n\t\t\t\t    {\r\n\t\t\t\t\t\tif(arrIgnoreDeepCopy[ignoreDeepCount] == key)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tisIgnoreDeepCopy = true;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t    }\r\n\t\t\t\t\tclonedItem = isIgnoreDeepCopy ? objSource[key] : this.cloneObject(objSource[key],deepCopy,arrIgnoreKeys,arrIgnoreDeepCopy);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tclonedItem = objSource[key];\r\n\t\t\t\t}\r\n\t\t\t\tobjClone[key] = clonedItem;\r\n\t\t\t}\r\n\t    }\r\n\t\treturn objClone;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.copyElement = function(sourceElement,destinationElement)\r\n\t{\r\n\t\tif(sourceElement)\r\n\t\t{\r\n\t\t\tif(destinationElement)\r\n\t\t\t{\r\n\t\t\t\tdestinationElement.innerHTML = sourceElement.innerHTML;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tdestinationElement = sourceElement.cloneNode(true);\r\n\t\t\t}\r\n\t\t\tfor (var count = 0; count < sourceElement.attributes.length; count++) \r\n\t\t\t{\r\n\t\t\t\tvar attr = sourceElement.attributes.item(count);\r\n\t\t\t\tdestinationElement.setAttribute(attr.nodeName, attr.nodeValue);\r\n\t\t\t}\r\n\t\t\t//destinationElement.style.cssText = sourceElement.style.cssText;\r\n\t\t}\r\n\t\treturn destinationElement;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.swapArrayItems = function(arrInput,indFirst,indSecond) \r\n\t{\r\n\t\tif(arrInput && arrInput.length > indFirst && arrInput.length > indSecond)\r\n\t\t{\r\n\t\t\tvar objTemp = arrInput[indFirst];\r\n\t\t\tarrInput[indFirst] = arrInput[indSecond];\r\n\t\t\tarrInput[indSecond] = objTemp;\r\n\t\t\t\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.moveArrayItem = function(arrInput,sourceIndex,destinationIndex) \r\n\t{\r\n\t\tif(arrInput && arrInput.length > destinationIndex && arrInput.length > sourceIndex && destinationIndex > -1 && sourceIndex > -1)\r\n\t\t{\r\n\t\t\t// Remove the element from the array\r\n\t\t\tvar removedElement = arrInput.splice(sourceIndex, 1)[0];\r\n\t\t\t// At destinationIndex, remove 0 elements, insert the removedElement\r\n\t\t\tarrInput.splice(destinationIndex, 0,removedElement);\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.isObject = function (refObject)\r\n\t{\r\n\t\tif (typeof refObject === 'object' && refObject !== null) \r\n\t\t{\r\n\t\t    return true;\r\n\t\t} \r\n\t\treturn false;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.isTextNode = function (element)\r\n\t{\r\n\t\ttry\r\n\t\t{\r\n\t\t\treturn (element && \"nodeType\" in element && element.nodeType === Node.TEXT_NODE);\r\n\t\t}\r\n\t    catch(err)\r\n\t    {\r\n\t    \treturn false;\r\n\t    }\r\n\t};\r\n\t\r\n\tNSUtil.prototype.isElement = function (element)\r\n\t{\r\n\t\ttry\r\n\t\t{\r\n\t\t\treturn (element && \"nodeType\" in element && element.nodeType === Node.ELEMENT_NODE);\r\n\t\t}\r\n\t    catch(err)\r\n\t    {\r\n\t    \treturn false;\r\n\t    }\r\n\t};\r\n\t\r\n\tNSUtil.prototype.isElementOfType = function (element,tagName)\r\n\t{\r\n\t\tif(element && tagName)\r\n\t    {\r\n\t        if(element.tagName && element.tagName.toLowerCase() === tagName.toLowerCase())\r\n\t        {\r\n\t        \treturn true;\r\n\t        }\r\n\t    }\r\n\t\treturn false;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.isArray = function (refArr) \r\n\t{\r\n\t    return refArr != null && typeof refArr == \"object\" &&\r\n\t      \"splice\" in refArr && \"join\" in refArr;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.isVariable = function (variableName,context) \r\n\t{\r\n\t\tcontext = this.getWin(context);\r\n\t\treturn !this.isUndefined(context[variableName]); \r\n\t};\r\n\t\r\n\t//after\r\n\tNSUtil.prototype.insertAfterElement = function(referenceElement,insertElement) \r\n\t{\r\n\t\tif(referenceElement && insertElement)\r\n\t\t{\r\n\t\t\tvar parentElement = this.getWebComponentElement(referenceElement.parentNode);\r\n\t\t\tif(parentElement)\r\n\t\t\t{\r\n\t\t\t\treferenceElement = this.getWebComponentElement(referenceElement);\r\n\t\t\t\tinsertElement = this.getWebComponentElement(insertElement);\r\n\t\t\t\tif (parentElement.lastChild === referenceElement) \r\n\t\t\t\t{\r\n\t\t\t\t\tparentElement.appendChild(insertElement);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tparentElement.insertBefore(insertElement,referenceElement.nextSibling);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\t\r\n\tNSUtil.prototype.insertElementAtIndex = function(parent,element,index)\r\n\t{\r\n\t\tif (!index)\r\n\t\t{\r\n\t\t\tindex = 0;\r\n\t\t}\r\n\t\tif (index >= parent.children.length) \r\n\t\t{\r\n\t\t\tparent.appendChild(element);\r\n\t\t}\r\n\t\telse \r\n\t\t{\r\n\t\t\tparent.insertBefore(element,parent.children[index]);\r\n\t\t}\r\n\t};\r\n\t\r\n\tNSUtil.prototype.swapElements = function(element1,element2)\r\n\t{\r\n\t\tif(element1 && element2)\r\n\t\t{\r\n\t\t\tvar parent2 = element2.parentNode;\r\n\t\t    var next2 = element2.nextSibling;\r\n\t\t    // special case for element1 is the next sibling of element2\r\n\t\t    if (next2 === element1) \r\n\t\t    {\r\n\t\t        // just put element1 before element2\r\n\t\t        parent2.insertBefore(element1, element2);\r\n\t\t    } \r\n\t\t    else \r\n\t\t    {\r\n\t\t        // insert element2 right before element1\r\n\t\t        element1.parentNode.insertBefore(element2, element1);\r\n\t\t        // now insert element1 where element2 was\r\n\t\t        if (next2) \r\n\t\t        {\r\n\t\t            // if there was an element after element2, then insert element1 right before that\r\n\t\t            parent2.insertBefore(element1, next2);\r\n\t\t        } \r\n\t\t        else \r\n\t\t        {\r\n\t\t            // otherwise, just append as last child\r\n\t\t            parent2.appendChild(element1);\r\n\t\t        }\r\n\t\t    }\r\n\t\t}\r\n\t};\r\n\t\r\n\t//replace\r\n\tNSUtil.prototype.replaceElement = function(element,newElement,copyAttributes,moveContent,doc)\r\n\t{\r\n\t\tif(element)\r\n\t\t{\r\n\t\t\tmoveContent = this.isUndefinedOrNull(moveContent) ? true : Boolean.parse(moveContent);\r\n\t\t\tnewElement = this.isString(newElement) ? this.createElement(newElement,null,null,doc) : newElement;\r\n\t\t\tif(moveContent) \r\n\t\t\t{\r\n\t\t\t\twhile(element.firstChild) \r\n\t\t\t\t{\r\n\t\t\t\t\tnewElement.appendChild(element.firstChild);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(copyAttributes && element.hasAttributes()) \r\n\t\t\t{\r\n\t\t\t\tvar attrs = element.attributes;\r\n\t\t\t    for(var count = attrs.length - 1;count >= 0;count--) \r\n\t\t\t    {\r\n\t\t\t    \tnewElement.setAttribute(attrs[count].name, attrs[count].value);\r\n\t\t\t    }\r\n\t\t\t}\r\n\t\t\tif(element.parentNode) \r\n\t\t\t{\r\n\t\t\t\telement.parentNode.replaceChild(newElement,element);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn newElement;\r\n\t};\r\n\t\r\n\t//unwrap\r\n\tNSUtil.prototype.insertElementParentsParent = function(element)\r\n\t{\r\n\t\tif(element && element.parentNode)\r\n\t\t{\r\n\t\t\tvar parent = element.parentNode;\r\n\t\t\twhile (element.firstChild) \r\n            {\r\n                parent.insertBefore(element.firstChild,element);\r\n            }\r\n\t\t\tif(element.parentNode)\r\n\t\t\t{\r\n\t\t\t\telement.parentNode.removeChild(element);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\t\r\n\tNSUtil.prototype.getFunction = function (functionInstance,context)\r\n\t{\r\n\t\tif(functionInstance)\r\n\t\t{\r\n\t\t\tcontext = this.getWin(context);\r\n\t\t\tif (typeof functionInstance === \"string\" || functionInstance instanceof String)\r\n\t\t\t{\r\n\t\t\t\tif(this.isFunction(functionInstance))\r\n\t\t\t\t{\r\n\t\t\t\t\tfunctionInstance = context[functionInstance];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn functionInstance;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.callFunction = function (functionName,context) \r\n\t{\r\n\t\tvar returnValue = null;\r\n\t\tcontext = this.getWin(context);\r\n\t\tif (typeof context[functionName] === \"function\") \r\n\t\t{\r\n\t\t\treturnValue = context[functionName]();\r\n\t\t}\r\n\t\treturn returnValue;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.callFunctionFromString = function (functionString,replaceParameterFunction,context)\r\n\t{\r\n\t\tvar returnValue = null;\r\n\t\tif(functionString)\r\n\t\t{\r\n\t\t\tcontext = this.getWin(context);\r\n\t\t\tvar functionName = null;\r\n\t\t\tvar arrParameter = null;\r\n\t\t\tif(functionString.indexOf(\"(\") > -1)\r\n\t\t\t{\r\n\t\t\t\tvar param = functionString.split(\"(\");\r\n\t\t\t\tif(param && param.length > 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tfunctionName = param[0];\r\n\t\t\t\t\tvar parameter = param[1];\r\n\t\t\t\t\tif(parameter && parameter.charAt(parameter.length - 1) === \")\")\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tparameter = parameter.substring(0,parameter.length - 1);\r\n\t\t\t\t\t\tvar arrParam = parameter.split(\",\");\r\n\t\t\t\t\t\tif(arrParam && arrParam.length > 0)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tarrParameter = arrParam;\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}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tfunctionName = functionString;\r\n\t\t\t}\r\n\t\t\tif(this.isFunction(functionName))\r\n\t\t\t{\r\n\t\t\t\tif(!arrParameter || arrParameter.length === 0)\r\n\t\t\t\t{\r\n\t\t\t\t\treturnValue = this.callFunction(functionName);\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(replaceParameterFunction)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfor(var count = 0;count < arrParameter.length;count++)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t var newValue = replaceParameterFunction(arrParameter[count]);\r\n\t\t\t\t\t\t\t if(!this.isUndefined(newValue))\r\n\t\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\t arrParameter[count] = newValue;\r\n\t\t\t\t\t\t\t }\r\n\t\t\t\t\t\t}\t\r\n\t\t\t\t\t}\r\n\t\t\t\t\tswitch (arrParameter.length) \r\n\t\t\t\t\t{\r\n\t\t\t\t\t    case 1:\r\n\t\t\t\t\t    \treturnValue = context[functionName](arrParameter[0]);\r\n\t\t\t\t\t        break;\r\n\t\t\t\t\t    case 2:\r\n\t\t\t\t\t    \treturnValue = context[functionName](arrParameter[0],arrParameter[1]);\r\n\t\t\t\t\t        break;\r\n\t\t\t\t\t    case 3:\r\n\t\t\t\t\t    \treturnValue = context[functionName](arrParameter[0],arrParameter[1],arrParameter[2]);\r\n\t\t\t\t\t        break;\r\n\t\t\t\t\t    case 4:\r\n\t\t\t\t\t    \treturnValue = context[functionName](arrParameter[0],arrParameter[1],arrParameter[2],arrParameter[3]);\r\n\t\t\t\t\t        break;\r\n\t\t\t\t\t    case 5:\r\n\t\t\t\t\t    \treturnValue = context[functionName](arrParameter[0],arrParameter[1],arrParameter[2],arrParameter[3],arrParameter[4]);\r\n\t\t\t\t\t        break;\r\n\t\t\t\t\t    case 6:\r\n\t\t\t\t\t    \treturnValue = context[functionName](arrParameter[0],arrParameter[1],arrParameter[2],arrParameter[3],arrParameter[4],arrParameter[5]);\r\n\t\t\t\t\t        break;\r\n\t\t\t\t\t    case 7:\r\n\t\t\t\t\t    \treturnValue = context[functionName](arrParameter[0],arrParameter[1],arrParameter[2],arrParameter[3],arrParameter[4],arrParameter[5],arrParameter[6]);\r\n\t\t\t\t\t        break;\r\n\t\t\t\t\t    case 8:\r\n\t\t\t\t\t    \treturnValue = context[functionName](arrParameter[0],arrParameter[1],arrParameter[2],arrParameter[3],arrParameter[4],arrParameter[5],arrParameter[6],arrParameter[7]);\r\n\t\t\t\t\t        break;\r\n\t\t\t\t\t    case 9:\r\n\t\t\t\t\t    \treturnValue = context[functionName](arrParameter[0],arrParameter[1],arrParameter[2],arrParameter[3],arrParameter[4],arrParameter[5],arrParameter[6],arrParameter[7],arrParameter[8]);\r\n\t\t\t\t\t        break;\r\n\t\t\t\t\t    case 10:\r\n\t\t\t\t\t    \treturnValue = context[functionName](arrParameter[0],arrParameter[1],arrParameter[2],arrParameter[3],arrParameter[4],arrParameter[5],arrParameter[6],arrParameter[7],arrParameter[8],arrParameter[9]);\r\n\t\t\t\t\t        break;\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\treturn returnValue;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.callFunctionOfObject = function (obj,functionName,...args) \r\n\t{\r\n\t\tvar returnValue = null;\r\n\t\tif(obj) \r\n\t\t{\r\n\t\t\tif (typeof obj[functionName] === \"function\") \r\n\t\t\t{\r\n\t\t\t\treturnValue = obj[functionName](args);\r\n\t\t\t}\r\n\t\t\telse \r\n\t\t\t{\r\n\t        \tconsole.log(functionName + \" does not exist or is not a function.\");\r\n\t    \t}\r\n\t\t}\r\n\t\treturn returnValue;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.isElementInDOM = function(node,doc) \r\n\t{\r\n\t\tdoc = this.getDoc(doc);\r\n\t\treturn (node === doc.body) ? false : doc.body.contains(node);\r\n\t};\r\n\t\r\n\tNSUtil.prototype.isElementInParent = function(node,parent) \r\n\t{\r\n\t\tif(node && parent)\r\n\t\t{\r\n\t\t\twhile (node.parentNode) \r\n\t\t\t{\r\n\t            if (node.parentNode === parent) \r\n\t            {\r\n\t                return true;\r\n\t            }\r\n\t            node = node.parentNode;\r\n\t        }\r\n\t\t}\r\n        return false;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.isElementInOrParent = function(node,parent,onlyContains) \r\n\t{\r\n\t\tif(node && parent)\r\n\t\t{\r\n\t\t\tonlyContains = Boolean.parse(onlyContains);\r\n\t\t\treturn ((node === parent && !onlyContains) || this.isElementInParent(node,parent));\r\n\t\t}\r\n        return false;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.isElementInView = function(element,parent,doc) \r\n\t{\r\n\t\tdoc = this.getDoc(doc);\r\n\t\tvar rect = element.getBoundingClientRect();\r\n\t\tvar elem = element;\r\n\t    var top = rect.top;\r\n\t    var height = rect.height;\r\n\t    do \r\n\t    {\r\n\t        if (elem && elem.parentNode) \r\n\t        {\r\n\t            elem = elem.parentNode;\r\n\t            rect = elem.getBoundingClientRect();\r\n\t            if (!(top <= rect.bottom)) \r\n\t            {\r\n\t                return false;\r\n\t            }\r\n\t            if (top + height <= rect.top) \r\n\t            {\r\n\t                return false;\r\n\t            }\r\n\t        }\r\n\t    } \r\n\t    while (elem && elem !== parent && elem.parentNode);\r\n\t    var retValue = (top <= ((doc.documentElement && doc.documentElement.clientHeight) || 0));\r\n\t    return retValue;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.scrollIntoView = function(element,parent,doc) \r\n\t{\r\n\t\tif(!this.isElementInView(element,parent,doc))\r\n\t\t{\r\n\t\t\tif (parent.clientHeight !== parent.scrollHeight) \r\n\t\t\t{\r\n\t\t\t\tparent.scrollTop = element.offsetTop;\r\n\t        }\r\n\t        if (!this.isElementInView(element, parent, doc)) \r\n\t        {\r\n\t        \telement.scrollIntoView();\r\n\t        }\r\n\t\t}\r\n\t};\r\n\t\r\n\tNSUtil.prototype.isElementVisible = function(element,win) \r\n\t{\r\n\t\t if(element)\r\n\t\t {\r\n\t\t\t if(!element.offsetParent)\r\n\t\t\t {\r\n\t\t\t\t return false;\r\n\t\t\t }\r\n\t\t\t win = this.getWin(win);\r\n\t\t\t var style = win.getComputedStyle(element);\r\n\t\t\t if(style.display === \"none\" || style.visibility  === \"hidden\")\r\n\t\t\t {\r\n\t\t\t\t return false;\r\n\t\t\t }\r\n\t\t }\r\n\t\t return true;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.isFunction = function(refFunction,context) \r\n\t{\r\n\t\tcontext = this.getWin(context);\r\n\t    if(refFunction && ((typeof refFunction == \"function\") || (typeof context[refFunction] === \"function\")))\r\n\t    {\r\n\t    \treturn true;\r\n\t    }\r\n\t    return false;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.isString = function(object) \r\n\t{\r\n\t    return typeof object == \"string\";\r\n\t};\r\n\t\r\n\tNSUtil.prototype.isNumber = function(object) \r\n\t{\r\n\t\ttry\r\n\t\t{\r\n\t\t\tif(typeof object == \"number\")\r\n\t\t    {\r\n\t\t    \treturn true;\r\n\t\t    }\r\n\t\t    var regex = /^([+\\-])?[0-9]+(\\.?)([0-9]+)?(e[0-9]+)?$/;\r\n\t\t    if (!object.match(regex)) \r\n\t\t    {\r\n\t            return false;\r\n\t        }\r\n\t        value = parseFloat(object);\r\n\t        return !isNaN(value) && isFinite(value);\r\n\t\t}\r\n\t    catch(error)\r\n\t    {\r\n\t    \t\r\n\t    }\r\n\t    return false;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.isBoolean = function(object) \r\n\t{\r\n\t    return typeof object == \"boolean\";\r\n\t};\r\n\t  \r\n\tNSUtil.prototype.isUndefined = function(object) \r\n\t{\r\n\t    return typeof object == \"undefined\";\r\n\t};\r\n\t\r\n\tNSUtil.prototype.isUndefinedOrNull = function(object) \r\n\t{\r\n\t    return (this.isUndefined(object) || object === null);\r\n\t};\r\n\t\r\n\tNSUtil.prototype.isStringValid = function(objString) \r\n\t{\r\n\t    if(!objString || objString === \"\")\r\n\t    {\r\n\t    \treturn false;\r\n\t    }\r\n\t    return true;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.toCamelCase = function(objString,isFirstLetterCapital) \r\n\t{\r\n\t\tif(this.isString(objString))\r\n\t\t{\r\n\t\t\treturn ((isFirstLetterCapital ? \"-\" : \"\") + objString).replace(/-+([^-])/g, function(str, char) \r\n\t\t\t\t\t{\r\n\t\t\t    \t\treturn char.toUpperCase();\r\n\t\t\t\t\t});\r\n\t\t}\r\n\t\treturn objString;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.fromCamelCase = function(objString) \r\n\t{\r\n\t\tif(this.isString(objString))\r\n\t\t{\r\n\t\t\treturn objString.replace(/([A-Z]+)/g, function(match,letter) \r\n\t\t\t{\r\n\t\t        return '-' + letter.toLowerCase();\r\n\t\t    });\r\n\t\t}\r\n\t\treturn objString;\r\n\t};\r\n\t\r\n\t//\"thisIsATest\" --> \"this-is-a-test\"\r\n\tNSUtil.prototype.toKebabCase = function(objString) \r\n\t{\r\n\t\tif(this.isString(objString))\r\n\t\t{\r\n\t\t\tobjString.replace(/([A-Z])([A-Z])([a-z])/g, '$1-$2$3')\r\n\t\t\t\t\t .replace(/([a-z])([A-Z])/g, '$1-$2')\r\n\t\t\t\t\t .replace(/[\\s_]+/g, '-')\r\n\t\t\t\t\t .toLowerCase();\r\n\t\t}\r\n\t\treturn objString;\r\n\t};\r\n\t\r\n\t\r\n\t\r\n\t/*\r\n\t * 1001 - function validation failure\r\n\t * 1002 - function return Parameter is not valid\r\n\t */\r\n\tNSUtil.prototype.throwException = function (exceptionCode,exceptionName,exceptionDetails)\r\n\t{\r\n\t\tfunction nsException() \r\n\t\t{\r\n\t\t\t   this.code = exceptionCode;\r\n\t\t\t   this.name = exceptionName;\r\n\t\t\t   this.details = exceptionDetails;\r\n\t\t\t   this.toString = function() \r\n\t\t\t   {\r\n\t\t\t      return \"Exception Occured with Code::\" +  this.code + \" and Details \" +  this.name + \"::\" + this.details;\r\n\t\t\t   };\r\n\t\t}\r\n\t    //alert(\"Error Occured with details code: \" + exceptionCode + \",name: \" + exceptionName + \",details: \" + exceptionDetails);\r\n\t    throw new nsException();\r\n\t};\r\n\t\r\n\t//other values of navigator.appName is \"Netscape\",\"Opera\"\r\n\t//From IE 11 navigator.appName returns \"Netscape\" instead of \"Microsoft Internet Explorer\"\r\n\t//and From IE 11 it follows standard API.\r\n\tNSUtil.prototype.isBrowserIE = function ()\r\n\t{\r\n\t    if(navigator && ((navigator.appName && navigator.appName == \"Microsoft Internet Explorer\") || (navigator.userAgent && navigator.userAgent.match(/Trident/))))\r\n\t    {\r\n\t        return true;\r\n\t    }\r\n\t    return false;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.getBrowser = function(win)\r\n\t{\r\n\t\twin = this.getWin(win);\r\n\t\tvar objBrowser = {code:null,name:null,version:null,appName:null,appCodeName:null,platform:null,\r\n\t\t\t\t\t\t  isChrome:false,isFirefox:false,isOpera:false,isIE:false,isMSIE:false,isSafari:false};\r\n\t\tvar userAgent = win.navigator.userAgent;\r\n\t\tif(userAgent.indexOf(\"Chrome\") != -1) \r\n\t\t{\r\n\t\t\tobjBrowser.code = \"chrome\";\r\n\t\t\tobjBrowser.name = \"Google Chrome\";\r\n\t\t\tobjBrowser.isChrome = true;\r\n\t\t} \r\n\t\telse if(userAgent.indexOf(\"Firefox\") != -1) \r\n\t\t{\r\n\t\t\tobjBrowser.code = \"firefox\";\r\n\t\t\tobjBrowser.name = \"Mozilla Firefox\";\r\n\t\t\tobjBrowser.isFirefox = true;\r\n\t\t} \r\n\t\telse if(userAgent.indexOf(\"Opera\")!=-1) \r\n\t\t{\r\n\t\t\tobjBrowser.code = \"opera\";\r\n\t\t\tobjBrowser.name = \"Opera\";\r\n\t\t\tobjBrowser.isOpera = true;\r\n\t\t}\r\n\t\t//for IE version 6 to 11\r\n\t\telse if(userAgent.indexOf('MSIE')!=-1 || navigator.userAgent.indexOf('Trident') > -1)\r\n\t\t{\r\n\t\t\tobjBrowser.code = \"ie\";\r\n\t\t\tobjBrowser.name = \"Internet Explorer\";\r\n\t\t\tobjBrowser.isIE = true;\r\n\t\t\tobjBrowser.isMSIE = true;\r\n\t\t}\r\n\t\t//for IE 12\r\n\t\telse if(/x64|x32/ig.test(userAgent))\r\n\t\t{\r\n\t\t\tobjBrowser.code = \"ie\";\r\n\t\t\tobjBrowser.name = \"Internet Explorer 12\";\r\n\t\t\tobjBrowser.isIE = true;\r\n\t\t\tobjBrowser.isMSIE = false;\r\n\t\t}\r\n\t\telse if (userAgent.indexOf(\"Safari\")!=-1) \r\n\t\t{\r\n\t\t\tobjBrowser.code = \"safari\";\r\n\t\t\tobjBrowser.name = \"Safari\";\r\n\t\t\tobjBrowser.isSafari = true;\r\n\t\t} \r\n\t\telse \r\n\t\t{\r\n\t\t\tobjBrowser.code = \"-1\";\r\n\t\t\tobjBrowser.name = \"Unknown Browser\";\r\n\t\t}\r\n\t\tobjBrowser.version = navigator.appVersion;\r\n\t\tobjBrowser.appName = navigator.appName;\r\n\t\tobjBrowser.appCodeName = navigator.appCodeName;\r\n\t\tobjBrowser.platform = navigator.platform;\r\n\t\t\r\n\t\treturn objBrowser;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.findParentBySelector = function (element,parentSelector,doc)\r\n\t{\r\n\t    if(element && parentSelector)\r\n\t    {\r\n\t    \tvar matchesFn = null;\r\n\t    \tvar parent = null;\r\n\t    \tdoc = this.getDoc(doc);\r\n\t    \t['matches','webkitMatchesSelector','mozMatchesSelector','msMatchesSelector','oMatchesSelector'].some(function(callback) \r\n\t    \t{\r\n\t            if (typeof doc.body[callback] == 'function') \r\n\t            {\r\n\t                matchesFn = callback;\r\n\t                return true;\r\n\t            }\r\n\t            return false;\r\n\t        });\r\n\t\r\n\t        // traverse parents\r\n\t        while (element) \r\n\t        {\r\n\t            parent = element.parentElement;\r\n\t            if (parent && parent[matchesFn](parentSelector)) \r\n\t            {\r\n\t                return parent;\r\n\t            }\r\n\t            element = parent;\r\n\t        }\r\n\t    }\r\n\t    return null;\r\n\t};\r\n\t\r\n\t//navigates to the DOM Heirarchy to find the nearest parent of the specified HTML tag \r\n\tNSUtil.prototype.findParent = function (element,param,querySelector,till)\r\n\t{\r\n\t\tvar retElement = null;\r\n\t    if(element)\r\n\t    {\r\n\t    \tvar obj = this.getDomVariables();\r\n\t    \ttill = till ? till : obj.doc.body;\r\n\t    \tif(param)\r\n\t    \t{\r\n\t    \t\tif(this.isString(param))\r\n\t    \t\t{\r\n\t    \t\t\twhile(element) \r\n\t\t    \t\t{\r\n\t\t    \t\t\tif(element.tagName && element.tagName.toLowerCase() == param.toLowerCase()) \r\n\t\t    \t\t\t{\r\n\t\t    \t\t\t\tretElement = element;\r\n\t\t    \t\t\t    break;\r\n\t\t    \t\t\t}\r\n\t\t    \t\t\telement = element.parentElement;\r\n\t\t    \t\t}\r\n\t    \t\t}\r\n\t    \t\telse if(this.isFunction(param))\r\n\t    \t\t{\r\n\t    \t\t\tvar start = element;\r\n\t    \t\t\tdo\r\n\t\t    \t\t{\r\n\t    \t            if (param(start)) \r\n\t    \t            {\r\n\t    \t                return start;\r\n\t    \t            }\r\n\t    \t            if (start == till || !start.parentNode) \r\n\t    \t            {\r\n\t    \t                break;\r\n\t    \t            }\r\n\t    \t            start = start.parentNode;\r\n\t    \t        } \r\n\t    \t\t\twhile (start && start !== till);\r\n\t    \t\t}\r\n\t    \t}\r\n\t    \telse if(querySelector)\r\n\t    \t{\r\n\t    \t\twhile(element) \r\n\t    \t\t{\r\n\t    \t\t\tif(element.matches(querySelector)) \r\n\t    \t\t\t{\r\n\t    \t\t\t\tretElement = element;\r\n\t    \t\t\t    break;\r\n\t    \t\t\t}\r\n\t    \t\t\telement = element.parentElement;\r\n\t    \t\t}\r\n\t    \t}\r\n\t    }\r\n\t    return retElement;\r\n\t};\r\n\t\r\n\t//up\r\n\tNSUtil.prototype.findParentByCallback = function(element,callback,root)\r\n\t{\r\n\t\tif (!element || !this.isElementInOrParent(element,root)) \r\n\t\t{\r\n            return null;\r\n        }\r\n\t\tvar start = element;\r\n        do \r\n        {\r\n            if (callback && callback(start)) \r\n            {\r\n                return start;\r\n            }\r\n            if (start === root || !start.parentNode) \r\n            {\r\n                break;\r\n            }\r\n            start = start.parentNode;\r\n        } \r\n        while(start && start !== root);\r\n        return null;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.findChild = function (element,childTag)\r\n\t{\r\n\t    if(element && childTag && element.getElementsByTagName(childTag).length > 0)\r\n\t    {\r\n\t        return element.getElementsByTagName(childTag)[0];\r\n\t    }  \r\n\t    return null;\r\n\t};\r\n\t\t\r\n\t//prev\r\n\tNSUtil.prototype.findPrevNode = function(node,callback,root,withChild) \r\n\t{\r\n\t\twithChild = this.isUndefinedOrNull(withChild) ? true : Boolean.parse(withChild);\r\n        return this.findNode(node,callback,root,false,\"previousSibling\",withChild ? \"lastChild\" : null);\r\n    };\r\n    \r\n    //next\r\n    NSUtil.prototype.findNextNode = function(node,callback,root,withChild) \r\n    {\r\n    \twithChild = this.isUndefinedOrNull(withChild) ? true : Boolean.parse(withChild);\r\n        return this.findNode(node,callback,root,null,null,withChild ? \"firstChild\" : \"\");\r\n    };\r\n\t\r\n\t//find\r\n\tNSUtil.prototype.findNode = function(node,callback,root,recursive,siblingProperty,childProperty) \r\n\t{\r\n\t\trecursive = Boolean.parse(recursive);\r\n\t\tsiblingProperty = this.isUndefinedOrNull(siblingProperty) ? \"nextSibling\" : siblingProperty;\r\n\t\tchildProperty = this.isUndefinedOrNull(childProperty) ? \"firstChild\" : childProperty;\r\n        if (recursive && callback(node)) \r\n        {\r\n            return node;\r\n        }\r\n        var start = node;\r\n        var next = null;\r\n        do \r\n        {\r\n            next = start[siblingProperty];\r\n            if (callback(next)) \r\n            {\r\n                return next ? next : null;\r\n            }\r\n            if (childProperty && next && next[childProperty]) \r\n            {\r\n                var nextOne = this.findNode(next[childProperty],callback,next,true,siblingProperty,childProperty);\r\n                if (nextOne) \r\n                {\r\n                    return nextOne;\r\n                }\r\n            }\r\n            if(!next) \r\n            {\r\n                next = start.parentNode;\r\n            }\r\n            start = next;\r\n        } \r\n        while (start && start !== root);\r\n        return null;\r\n    };\r\n    \r\n   //findWithCurrent\r\n\tNSUtil.prototype.findNodeWithCurrent = function(node,callback,root,siblingProperty,childProperty) \r\n\t{\r\n\t\tsiblingProperty = this.isUndefinedOrNull(siblingProperty) ? \"nextSibling\" : siblingProperty;\r\n\t\tchildProperty = this.isUndefinedOrNull(childProperty) ? \"firstChild\" : childProperty;\r\n        var next = node;\r\n        do \r\n        {\r\n        \tif (callback(next)) \r\n            {\r\n                return next || null;\r\n            }\r\n            if (childProperty && next && next[childProperty]) \r\n            {\r\n                var nextOne = this.findNodeWithCurrent(next[childProperty],callback,next,siblingProperty,childProperty);\r\n                if (nextOne) \r\n                {\r\n                    return nextOne;\r\n                }\r\n            }\r\n            while (next && !next[siblingProperty] && next != root) \r\n            {\r\n\t\t\t\tnext = next.parentNode;\r\n\t\t\t}\r\n\t\t\tif (next && next[siblingProperty] && next != root) \r\n\t\t\t{\r\n\t\t\t\tnext = next[siblingProperty];\r\n\t\t\t}\r\n        } \r\n        while (next && next != root);\r\n        return null;\r\n    };\r\n    \r\n    //each\r\n    //It goes through all the children of the node calling a callback function\r\n    NSUtil.prototype.loopAllChildren = function (element,callback) \r\n    {\r\n        var node = element.firstChild;\r\n        if (node) \r\n        {\r\n            while (node) \r\n            {\r\n                var next = this.findNextNode(node,Boolean,element);\r\n                var value = callback(node);\r\n                if(value == false) \r\n                {\r\n                    return false;\r\n                }\r\n                // in case node is removed inside callback\r\n                if(node.parentNode) \r\n                {\r\n                \tvalue = this.loopAllChildren(node,callback);\r\n                    if(!value)\r\n                    {\r\n                    \treturn false;\r\n                    }\r\n                }\r\n                node = next;\r\n            }\r\n        }\r\n        return true;\r\n    };\r\n        \r\n\tNSUtil.prototype.getZIndex = function (element,doc) \r\n\t{\r\n\t\tdoc = this.getDoc(doc);\r\n\t    var zIndex = doc.defaultView.getComputedStyle(element).getPropertyValue(\"z-index\");\r\n\t    if(element.tagName !== \"BODY\" && element.tagName !== \"HTML\" && isNaN(zIndex)) \r\n\t    {\r\n\t    \treturn this.getZIndex(element.parentNode);\r\n\t    }\r\n\t    else \r\n\t    {\r\n\t    \treturn zIndex; \r\n\t    }\r\n\t};\r\n\t\r\n\tNSUtil.prototype.getStyleValue = function(element,styleProperty,getOrignalValue,getOnlyNumber,win)\r\n\t{\r\n\t\twin = this.getWin(win);\r\n\t\tvar propertyValue = null;\r\n\t\tif(element && styleProperty && this.isElement(element))\r\n\t\t{\r\n\t\t\telement = this.getElement(element);\r\n\t\t\tgetOrignalValue = this.isUndefined(getOrignalValue) ? true : getOrignalValue;\r\n\t\t\tvar getValue = function(styleProp)\r\n\t\t\t{\r\n\t\t\t\tvar retValue = null;\r\n\t\t\t\tif(element.style && element.style[styleProp])\r\n\t\t\t    {\r\n\t\t\t\t\tretValue = element.style[styleProp];\r\n\t\t\t    }\r\n\t\t\t\telse if(win.getComputedStyle)\r\n\t\t\t\t{\r\n\t\t\t\t\tretValue = win.getComputedStyle(element, null).getPropertyValue(styleProp);\r\n\t\t\t\t}\r\n\t\t\t\treturn retValue;\r\n\t\t\t};\r\n\t\t\tif(styleProperty === \"display\")\r\n\t\t\t{\r\n\t\t\t\tpropertyValue = getValue(styleProperty);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tvar displayValue = null;\r\n\t\t\t\tvar setStyleValue = false;\r\n\t\t\t\tif(getOrignalValue)\r\n\t\t\t\t{\r\n\t\t\t\t\tdisplayValue = getValue(\"display\");\r\n\t\t\t\t\tif(element.style.display)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tsetStyleValue = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telement.style.display = \"none\";\r\n\t\t\t\t}\r\n\t\t\t\tpropertyValue = getValue(styleProperty);\r\n\t\t\t\tif(getOrignalValue)\r\n\t\t\t\t{\r\n\t\t\t\t\telement.style.display = (displayValue && setStyleValue) ? displayValue: \"\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(getOnlyNumber && !this.isUndefinedOrNull(propertyValue))\r\n\t\t\t{\r\n\t\t\t\tvar numberFieldsReg = /^left|top|bottom|right|width|min|max|height|margin|padding|font-size/i;\r\n\t\t\t\tif (numberFieldsReg.test(styleProperty) && /^[\\-+]?[0-9.]+px$/.test(propertyValue.toString())) \r\n\t\t\t\t{\r\n\t\t\t\t\tpropertyValue = parseInt(propertyValue.toString(), 10);\r\n\t\t\t\t\tpropertyValue = this.isNumber(propertyValue) ? +propertyValue : propertyValue;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t }\r\n\t\t return propertyValue;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.getControlValue = function(control)\r\n\t{\r\n\t\tif(control)\r\n\t\t{\r\n\t\t\t if(control.tagName == \"INPUT\") \r\n\t\t\t {\r\n\t            if(control.type == \"text\") \r\n\t            {\r\n\t            \treturn control.value;\r\n\t            }\r\n\t            if(control.type == \"checkbox\") \r\n\t            {\r\n\t            \treturn control.checked;\r\n\t            }\r\n\t            if(control.type == \"radio\") \r\n\t            {\r\n\t            \treturn control.checked;\r\n\t            }\r\n\t         }  \r\n\t         if(control.tagName == \"SELECT\") \r\n\t         {\r\n\t        \t return control.value;\r\n\t         }\r\n\t         if(control.tagName == \"TEXTAREA\") \r\n\t         {\r\n\t        \t return control.value;\r\n\t         }\r\n\t\t}\r\n\t\treturn null;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.setControlValue = function(control,value)\r\n\t{\r\n\t\tvar retValue = null;\r\n\t\tif(control)\r\n\t\t{\r\n\t\t\t if(control.tagName == \"INPUT\") \r\n\t\t\t {\r\n\t            if(control.type == \"text\") \r\n\t            {\r\n\t            \tretValue = value;\r\n\t            \tcontrol.value = value;\r\n\t            }\r\n\t            if(control.type == \"checkbox\") \r\n\t            {\r\n\t            \tretValue = Boolean.parse(value);\r\n\t            \tcontrol.checked = retValue;\r\n\t            }\r\n\t            if(control.type == \"radio\") \r\n\t            {\r\n\t            \tretValue = Boolean.parse(value);\r\n\t            \tcontrol.checked = retValue;\r\n\t            }\r\n\t         }  \r\n\t         if(control.tagName == \"SELECT\") \r\n\t         {\r\n\t        \t retValue = value;\r\n\t        \t control.value = value;\r\n\t         }\r\n\t\t}\r\n\t\treturn retValue;\r\n\t};\r\n\t\r\n\t//returns the top y coordinate of the given div used while listening to scrolling events(vertical scrolling)\r\n\tNSUtil.prototype.scrollTop = function (div)\r\n\t{\r\n\t\t if(div)\r\n\t\t {\r\n\t\t    return (div.scrollHeight - div.clientHeight);\r\n\t\t }\r\n\t\t return -1;\r\n\t};\r\n\t\r\n\t//returns the top x coordinate of the given div used while listening to scrolling events(horizontal scrolling)\r\n\tNSUtil.prototype.scrollLeft = function (div)\r\n\t{\r\n\t\t if(div)\r\n\t\t {\r\n\t\t\t return (div.scrollWidth - div.clientWidth);\r\n\t\t }\r\n\t\t return -1;\r\n\t};\r\n\t\r\n\t//adds Style class to an element's styles list \r\n\tNSUtil.prototype.addStyleClass = function (element,styleClass)\r\n\t{\r\n\t    if(element && styleClass && styleClass.length > 0)\r\n\t    {\r\n\t    \tvar arrStyleClass = styleClass.split(\" \");\r\n\t        if(element.classList)\r\n\t        {\r\n\t        \tfor(var count = 0;count < arrStyleClass.length;count++)\r\n\t        \t{\r\n\t        \t\tif(!this.hasStyleClass(element,arrStyleClass[count]))\r\n\t                {\r\n\t                \telement.classList.add(arrStyleClass[count]);\r\n\t                }\r\n\t        \t}\r\n\t        }\r\n\t        else\r\n\t        {\r\n\t        \tfor(var count = 0;count < arrStyleClass.length;count++)\r\n\t        \t{\r\n\t\t            if(!this.hasStyleClass(element,arrStyleClass[count]))\r\n\t\t            {\r\n\t\t            \tif(element.className instanceof SVGAnimatedString)\r\n\t\t    \t\t\t{\r\n\t\t            \t\tif(element.getAttribute(\"class\"))\r\n\t\t            \t\t{\r\n\t\t            \t\t\telement.setAttribute(\"class\", element.getAttribute(\"class\") + \" \" + arrStyleClass[count]);\r\n\t\t            \t\t}\r\n\t\t            \t\telse\r\n\t\t            \t\t{\r\n\t\t            \t\t\telement.setAttribute(\"class\",arrStyleClass[count]);\r\n\t\t            \t\t}\r\n\t\t    \t\t\t}\r\n\t\t            \telse\r\n\t\t            \t{\r\n\t\t            \t\telement.className += \" \" + arrStyleClass[count];\r\n\t\t            \t}\r\n\t\t            }\r\n\t        \t}\r\n\t        }\r\n\t    }\r\n\t};\r\n\t\r\n\t//returns true if a Style class is present in element's styles list\r\n\tNSUtil.prototype.hasStyleClass = function (element,styleClass)\r\n\t{\r\n\t    if(element && styleClass && styleClass.length > 0)\r\n\t    {\r\n\t    \ttry\r\n\t    \t{\r\n\t    \t\tif(!element.classList)\r\n\t            {\r\n\t    \t\t\tif(element.className instanceof SVGAnimatedString)\r\n\t    \t\t\t{\r\n\t    \t\t\t\treturn new RegExp('(\\\\s|^)' + styleClass + '(\\\\s|$)').test(element.getAttribute('class'));\r\n\t    \t\t\t}\r\n\t    \t\t\telse\r\n\t    \t\t\t{\r\n\t    \t\t\t\treturn (element.className.indexOf(\" \" + styleClass) > -1);\r\n\t    \t\t\t}\r\n\t            }\r\n\t            else if(element.classList.contains)\r\n\t            {\r\n\t            \treturn element.classList.contains(styleClass);\r\n\t            }\r\n\t    \t}\r\n\t    \tcatch(error)\r\n\t    \t{\r\n\t    \t\t\r\n\t    \t}\r\n\t        \r\n\t    }\r\n\t    return false;\r\n\t};\r\n\t\r\n\t//removes Style class from an element's styles list\r\n\tNSUtil.prototype.removeStyleClass = function(element,styleClass)\r\n\t{\r\n\t    if(element && styleClass && styleClass.length > 0)\r\n\t    {\r\n\t    \tvar arrStyleClass = styleClass.split(\" \");\r\n\t    \tif(element.classList)\r\n\t        {\r\n\t\t    \tfor(var count = 0;count < arrStyleClass.length;count++)\r\n\t\t    \t{\r\n\t\t        \telement.classList.remove(arrStyleClass[count]);\r\n\t\t        }\r\n\t    \t}\r\n\t        else if(element.className)\r\n\t        {\r\n\t        \tfor(var count = 0;count < arrStyleClass.length;count++)\r\n\t        \t{\r\n\t\t        \tif(element.className instanceof SVGAnimatedString)\r\n\t\t\t\t\t{\r\n\t\t        \t\tvar removedClass = element.getAttribute('class').replace(new RegExp('(\\\\s|^)' + arrStyleClass[count] + '(\\\\s|$)', 'g'), '$2');\r\n\t\t        \t\tif (this.hasStyleClass(arrStyleClass[count])) \r\n\t\t        \t\t{\r\n\t\t        \t\t   this.setAttribute('class', removedClass);\r\n\t\t        \t\t}\r\n\t\t\t\t\t}\r\n\t\t        \telse\r\n\t\t        \t{\r\n\t\t        \t\telement.className = element.className.replace(arrStyleClass[count],\"\");\r\n\t\t        \t}\r\n\t        \t}\r\n\t        }\r\n\t    }\r\n\t};\r\n\t\r\n\tNSUtil.prototype.toggleStyleClass = function(element,styleClass)\r\n\t{\r\n\t    if(element && styleClass && styleClass.length > 0)\r\n\t    {\r\n\t   \t \tthis.hasStyleClass(element,styleClass) ? this.removeStyleClass(element,styleClass) : this.addStyleClass(element,styleClass); \r\n\t    }\r\n\t};\r\n\t\r\n\t//change Style class from an element's styles list\r\n\tNSUtil.prototype.changeStyleClass = function (element,oldStyleClass,newStyleClass)\r\n\t{\r\n\t    if(element && oldStyleClass && oldStyleClass.length > 0 && newStyleClass && newStyleClass.length > 0)\r\n\t    {\r\n\t        if(element.classList)\r\n\t        {\r\n\t        \telement.classList.remove(oldStyleClass);\r\n\t            if(!element.classList.contains(newStyleClass))\r\n\t            {\r\n\t                element.classList.add(newStyleClass);\r\n\t            }\r\n\t        }\r\n\t        else\r\n\t        {\r\n\t        \tif(element.className instanceof SVGAnimatedString)\r\n\t\t\t\t{\r\n\t        \t\tthis.removeStyleClass(element,oldStyleClass);\r\n\t        \t\tthis.addStyleClass(element,newStyleClass);\r\n\t\t\t\t}\r\n\t        \telse if(element.className)\r\n\t        \t{\r\n\t        \t\telement.className = element.className.replace(oldStyleClass,newStyleClass);\r\n\t        \t}\r\n\t        }\r\n\t    }\r\n\t};\r\n\t\r\n\tNSUtil.prototype.css = function (element,key,value)\r\n\t{\r\n\t\tvar self = this;\r\n\t\tvar setStyle = function(prop)\r\n\t\t{\r\n\t\t\tvar regexNumberProp = /^left|top|bottom|right|width|min|max|height|margin|padding|fontSize/i;\r\n\t\t\tvar tempValue = styles[prop];\r\n\t\t\tif(tempValue !== undefined && tempValue !== null && regexNumberProp.test(prop) && self.isNumber(tempValue))\r\n\t\t\t{\r\n\t\t\t\ttempValue = tempValue + \"px\";\r\n\t\t\t}\r\n\t\t\telement.style[prop] = tempValue;\r\n\t\t};\r\n\t\tvar styles;\r\n\t    if (this.isUndefined(value)) \r\n\t    {\r\n\t        if (this.isString(key)) \r\n\t        {\r\n\t            return element.style[key];\r\n\t        }\r\n\t        styles = key;\r\n\t    } \r\n\t    else \r\n\t    {\r\n\t        styles = {};\r\n\t        styles[key] = value;\r\n\t    }\r\n\t    for(var style in styles)\r\n\t    {\r\n\t    \tsetStyle(style);\r\n\t    }\r\n\t};\r\n\t\r\n\tNSUtil.prototype.addEvent = function(arrElement,eventType,listener,option)\r\n\t{\r\n\t\tif(arrElement)\r\n\t\t{\r\n\t\t\tif(!Array.isArray(arrElement))\r\n\t\t\t{\r\n\t\t\t\tarrElement = [arrElement];\r\n\t\t\t}\r\n\t\t\tarrEventType = eventType.split(\" \");\r\n\t\t\tvar type = null;\r\n\t\t\tvar element = null;\r\n\t\t\tfor(var count = 0;count < arrEventType.length;count++)\r\n\t\t\t{\r\n\t\t\t\ttype = arrEventType[count];\r\n\t\t\t\tif(type)\r\n\t\t\t\t{\r\n\t\t\t\t\tfor(var eleCount = 0;eleCount < arrElement.length;eleCount++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\telement = arrElement[eleCount];\r\n\t\t\t\t\t\tif(element)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif(!element.__nsEventListeners) \r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t    element.__nsEventListeners = {};\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif(!element.__nsEventListeners[type]) \r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t    element.__nsEventListeners[type] = [];\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t(element.addEventListener) ? element.addEventListener(type,listener,option) : element.attachEvent(\"on\" + type, listener);;\r\n\t\t\t\t\t\t\telement.__nsEventListeners[type].push({listener: listener,option: option});\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}\r\n\t\t}\r\n\t};\r\n\t\r\n\tNSUtil.prototype.removeEvent = function(arrElement,eventType,listener,option)\r\n\t{\r\n\t\tif(arrElement)\r\n\t\t{\r\n\t\t\tfunction removeEvent(paramElement,paramType,paramListener,paramOption)\r\n\t\t\t{\r\n\t\t\t\t(paramElement.removeEventListener) ? paramElement.removeEventListener(paramType,paramListener,paramOption) : paramElement.detachEvent(\"on\" + paramType, paramListener);\r\n\t\t\t};\r\n\t\t\tif(!Array.isArray(arrElement))\r\n\t\t\t{\r\n\t\t\t\tarrElement = [arrElement];\r\n\t\t\t}\r\n\t\t\tarrEventType = eventType.split(\" \");\r\n\t\t\tvar type = null;\r\n\t\t\tvar element = null;\r\n\t\t\tvar item = null;\r\n\t\t\tfor(var count = 0;count < arrEventType.length;count++)\r\n\t\t\t{\r\n\t\t\t\ttype = arrEventType[count];\r\n\t\t\t\tif(type)\r\n\t\t\t\t{\r\n\t\t\t\t\tfor(var eleCount = 0;eleCount < arrElement.length;eleCount++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\telement = arrElement[eleCount];\r\n\t\t\t\t\t\tif(element)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif(listener == \"all\")\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tfor(var lstCount = 0;lstCount < element.__nsEventListeners[type].length;lstCount++)\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\titem = element.__nsEventListeners[type][lstCount];\r\n\t\t\t\t\t\t\t\t\tremoveEvent(element,type,item.listener,item.option);\r\n\t\t\t\t\t\t\t\t\telement.__nsEventListeners[type].splice(lstCount,1);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tremoveEvent(element,type,listener,option);\r\n\t\t\t\t\t\t\t\tif(element.__nsEventListeners && element.__nsEventListeners[type] && element.__nsEventListeners[type].length)\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tfor(var lstCount = 0;lstCount < element.__nsEventListeners[type].length;lstCount++)\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\titem = element.__nsEventListeners[type][lstCount];\r\n\t\t\t\t\t\t\t\t\t\tif(item.listener == listener)\r\n\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\telement.__nsEventListeners[type].splice(lstCount,1);\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\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}\r\n\t\t}\r\n\t};\r\n\t\r\n\tNSUtil.prototype.dispatchEvent = function(element,eventType,data,param,bubbles,cancelable,doc)\r\n\t{\r\n\t\t var cancelled = false;\r\n\t\t var event = null;\r\n\t\t doc = this.getDoc(doc);\r\n\t\t if(this.isUndefined(bubbles) || bubbles === null)\r\n\t\t {\r\n\t\t\t bubbles = true;\r\n\t\t }\r\n\t\t if(this.isUndefined(cancelable) || cancelable === null)\r\n\t\t {\r\n\t\t\t cancelable = false;\r\n\t\t }\r\n\t\t if (doc.createEvent) \r\n\t\t {\r\n\t\t    event = doc.createEvent(\"HTMLEvents\",{ \"detail\": data});\r\n\t\t    event.initEvent(eventType, bubbles, cancelable);\r\n\t\t    try\r\n\t\t\t{\r\n\t\t\t\tvar tempEvent = doc.createEvent(\"HTMLEvents\");\r\n\t\t\t\ttempEvent.initEvent(\"nsPing\", false, false);\r\n\t\t\t\telement.dispatchEvent(tempEvent);\r\n\t\t\t}\r\n\t\t\tcatch(error)\r\n\t\t\t{\r\n\t\t\t\tevent = event[\"__impl4cf1e782hg__\"];\r\n\t\t\t}\r\n\t\t } \r\n\t\t else \r\n\t\t {\r\n\t\t    event = doc.createEventObject();\r\n\t\t    event.eventType = eventType;\r\n\t\t    event.cancelBubble = !bubbles;\r\n\t\t    event.cancelable = cancelable;\r\n\t\t    try\r\n\t\t\t{\r\n\t\t    \tvar tempEvent = doc.createEventObject();\r\n\t\t    \ttempEvent.eventType = \"nsPing\";\r\n\t\t    \ttempEvent.cancelBubble = true;\r\n\t\t    \ttempEvent.cancelable = false;\r\n\t\t    \telement.fireEvent(\"on\" + tempEvent.eventType, tempEvent);\r\n\t\t\t}\r\n\t\t\tcatch(error)\r\n\t\t\t{\r\n\t\t\t\tevent = event[\"__impl4cf1e782hg__\"];\r\n\t\t\t}\r\n\t\t }\r\n\t\t event.eventName = eventType;\r\n\t\t event.detail = data;\r\n\t\t if(param)\r\n\t\t {\r\n\t\t\t for (var key in param) \r\n\t\t\t {\r\n\t\t\t\t if(param.hasOwnProperty(key)) \r\n\t\t\t\t {\r\n\t\t\t\t\t event[key] = param[key];\r\n\t\t\t\t } \r\n\t\t\t }   \r\n\t\t }\r\n\t\t if(doc.createEvent) \r\n\t\t {\r\n\t\t\tcancelled = !element.dispatchEvent(event);\r\n\t\t } \r\n\t\t else \r\n\t\t {\r\n\t\t\tcancelled = element.fireEvent(\"on\" + event.eventType, event);\r\n\t\t }\r\n\t\t return cancelled;\r\n\t};\r\n\t\r\n\t//equivalent to jquery trigger\r\n\tNSUtil.prototype.triggerEvent = function(element,eventType,doc)\r\n\t{\r\n\t\tdoc = this.getDoc(doc);\r\n\t\t// modern browsers, IE9+\r\n\t\tif (\"createEvent\" in doc) \r\n\t\t{\r\n\t        var event = doc.createEvent(\"HTMLEvents\");\r\n\t        event.initEvent(eventType, false, true);\r\n\t        element.dispatchEvent(event);\r\n\t    } \r\n\t\telse \r\n\t\t{\r\n\t        // IE 8\r\n\t        var event = doc.createEventObject();\r\n\t        event.eventType = eventType;\r\n\t        element.fireEvent(\"on\" + event.eventType,event);\r\n\t    }\r\n\t};\r\n\t\r\n\t//https://stackoverflow.com/questions/11974262/how-to-clone-or-re-dispatch-dom-events\r\n\tNSUtil.prototype.redispatchEvent = function(element,originalEvent,doc)\r\n\t{\r\n\t\tvar eventCopy = null;\r\n\t\tif (typeof Event === \"function\") \r\n\t\t{\r\n\t\t    eventCopy = new originalEvent.constructor(originalEvent.type, originalEvent);\r\n\t\t} \r\n\t\telse \r\n\t\t{\r\n\t\t    // Internet Explorer\r\n\t\t\tdoc = this.getDoc(doc);\r\n\t\t\tvar arrEvents = [\"MouseEvent\",\"DragEvent\",\"WheelEvent\",\"PointerEvent\",\"TouchEvent\",\"TextEvent\",\"CompositionEvent\",\"KeyboardEvent\",\"InputEvent\",\"UIEvent\",\"FocusEvent\",\"Event\"];\r\n\t\t\tvar strFunc = originalEvent.constructor.toString();\r\n\t\t\tvar eventType = null;\r\n\t\t\tfor(var count = 0;count < arrEvents.length;count++)\r\n\t\t\t{\r\n\t\t\t\tif(strFunc.indexOf(arrEvents[count]) > -1)\r\n\t\t\t\t{\r\n\t\t\t\t\teventType = arrEvents[count];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t    if(eventType)\r\n\t\t\t{\r\n\t\t\t\teventCopy = doc.createEvent(eventType);\r\n\t\t\t\tif (originalEvent.getModifierState)\r\n\t\t\t\t  var modifiersList = allModifiers.filter(\r\n\t\t\t\t\toriginalEvent.getModifierState,\r\n\t\t\t\t\toriginalEvent\r\n\t\t\t\t  ).join(\" \");\r\n\t\t\t\t\r\n\t\t\t\tif (eventType === \"MouseEvent\") \r\n\t\t\t\t{\r\n\t\t\t\t\teventCopy.initMouseEvent(originalEvent.type, originalEvent.bubbles, originalEvent.cancelable,\r\n\t\t\t\t\t\t\t  originalEvent.view, originalEvent.detail, originalEvent.screenX, originalEvent.screenY,\r\n\t\t\t\t\t\t\t  originalEvent.clientX, originalEvent.clientY, originalEvent.ctrlKey,\r\n\t\t\t\t\t\t\t  originalEvent.altKey, originalEvent.shiftKey, originalEvent.metaKey,\r\n\t\t\t\t\t\t\t  originalEvent.button, originalEvent.relatedTarget\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\telse if (eventType === \"DragEvent\")\r\n\t\t\t\t{ \r\n\t\t\t\t\teventCopy.initDragEvent(\r\n\t\t\t\t\t  originalEvent.type, originalEvent.bubbles, originalEvent.cancelable,\r\n\t\t\t\t\t  originalEvent.view, originalEvent.detail, originalEvent.screenX, originalEvent.screenY,\r\n\t\t\t\t\t  originalEvent.clientX, originalEvent.clientY, originalEvent.ctrlKey,\r\n\t\t\t\t\t  originalEvent.altKey, originalEvent.shiftKey, originalEvent.metaKey,\r\n\t\t\t\t\t  originalEvent.button, originalEvent.relatedTarget, originalEvent.dataTransfer\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\telse if (eventType === \"WheelEvent\") eventCopy.initWheelEvent(\r\n\t\t\t\t  originalEvent.detail, originalEvent.screenX, originalEvent.screenY,\r\n\t\t\t\t  originalEvent.clientX, originalEvent.clientY, originalEvent.button,\r\n\t\t\t\t  originalEvent.relatedTarget, modifiersList,\r\n\t\t\t\t  originalEvent.deltaX, originalEvent.deltaY, originalEvent.deltaZ, originalEvent.deltaMode\r\n\t\t\t\t);\r\n\t\t\t\telse if (eventType === \"PointerEvent\") eventCopy.initPointerEvent(\r\n\t\t\t\t  originalEvent.type, originalEvent.bubbles, originalEvent.cancelable,\r\n\t\t\t\t  originalEvent.view, originalEvent.detail, originalEvent.screenX, originalEvent.screenY,\r\n\t\t\t\t  originalEvent.clientX, originalEvent.clientY, originalEvent.ctrlKey,\r\n\t\t\t\t  originalEvent.altKey, originalEvent.shiftKey, originalEvent.metaKey,\r\n\t\t\t\t  originalEvent.button, originalEvent.relatedTarget,\r\n\t\t\t\t  originalEvent.offsetX, originalEvent.offsetY, originalEvent.width, originalEvent.height,\r\n\t\t\t\t  originalEvent.pressure, originalEvent.rotation,\r\n\t\t\t\t  originalEvent.tiltX, originalEvent.tiltY,\r\n\t\t\t\t  originalEvent.pointerId, originalEvent.pointerType,\r\n\t\t\t\t  originalEvent.timeStamp, originalEvent.isPrimary\r\n\t\t\t\t);\r\n\t\t\t\telse if (eventType === \"TouchEvent\") eventCopy.initTouchEvent(\r\n\t\t\t\t  originalEvent.type, originalEvent.bubbles, originalEvent.cancelable,\r\n\t\t\t\t  originalEvent.view, originalEvent.detail, originalEvent.screenX, originalEvent.screenY,\r\n\t\t\t\t  originalEvent.clientX, originalEvent.clientY, originalEvent.ctrlKey,\r\n\t\t\t\t  originalEvent.altKey, originalEvent.shiftKey, originalEvent.metaKey,\r\n\t\t\t\t  originalEvent.touches, originalEvent.targetTouches, originalEvent.changedTouches,\r\n\t\t\t\t  originalEvent.scale, originalEvent.rotation\r\n\t\t\t\t);\r\n\t\t\t\telse if (eventType === \"TextEvent\") eventCopy.initTextEvent(\r\n\t\t\t\t  originalEvent.type, originalEvent.bubbles, originalEvent.cancelable,\r\n\t\t\t\t  originalEvent.view,\r\n\t\t\t\t  originalEvent.data, originalEvent.inputMethod, originalEvent.locale\r\n\t\t\t\t);\r\n\t\t\t\telse if (eventType === \"CompositionEvent\") eventCopy.initTextEvent(\r\n\t\t\t\t  originalEvent.type, originalEvent.bubbles, originalEvent.cancelable,\r\n\t\t\t\t  originalEvent.view,\r\n\t\t\t\t  originalEvent.data, originalEvent.inputMethod, originalEvent.locale\r\n\t\t\t\t);\r\n\t\t\t\telse if (eventType === \"KeyboardEvent\") eventCopy.initKeyboardEvent(\r\n\t\t\t\t  originalEvent.type, originalEvent.bubbles, originalEvent.cancelable,\r\n\t\t\t\t  originalEvent.view, originalEvent.char, originalEvent.key,\r\n\t\t\t\t  originalEvent.location, modifiersList, originalEvent.repeat\r\n\t\t\t\t);\r\n\t\t\t\telse if (eventType === \"InputEvent\" || eventType === \"UIEvent\")\r\n\t\t\t\t  eventCopy.initUIEvent(\r\n\t\t\t\t\toriginalEvent.type, originalEvent.bubbles, originalEvent.cancelable,\r\n\t\t\t\t\toriginalEvent.view, originalEvent.detail\r\n\t\t\t\t  );\r\n\t\t\t\telse if (eventType === \"FocusEvent\") eventCopy.initFocusEvent(\r\n\t\t\t\t\toriginalEvent.type, originalEvent.bubbles, originalEvent.cancelable,\r\n\t\t\t\t\toriginalEvent.view, originalEvent.detail, originalEvent.relatedTarget\r\n\t\t\t\t);\r\n\t\t\t\telse if(eventType === \"Event\")\r\n\t\t\t\t{\r\n\t\t\t\t\teventCopy.initEvent(originalEvent.type, originalEvent.bubbles, originalEvent.cancelable);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telement.dispatchEvent(eventCopy);\r\n\t};\r\n\t\r\n\tNSUtil.prototype.getDoc = function(doc)\r\n\t{\r\n\t\tdoc = doc || document;\r\n\t\treturn doc;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.getWin = function(win)\r\n\t{\r\n\t\twin = win || window;\r\n\t\treturn win;\r\n\t};\r\n\t\r\n\t//returns event for all kind of browser\r\n\tNSUtil.prototype.getEvent = function (event,win)\r\n\t{\r\n\t\twin = this.getWin(win);\r\n\t\tif (this.isUndefinedOrNull(event))\r\n\t\t{\r\n\t\t\tevent = win.event;\r\n\t\t}\r\n\t\tif(event)\r\n\t\t{\r\n\t\t\tvar touchEvent = null;\r\n\t\t\tif (event.targetTouches && event.targetTouches.length > 0) \r\n\t\t\t{\r\n\t\t\t\ttouchEvent = event.targetTouches[0];\r\n\t\t    } \r\n\t\t\telse if (event.originalEvent && event.originalEvent.targetTouches && event.originalEvent.targetTouches.length > 0) \r\n\t\t\t{\r\n\t\t\t\ttouchEvent = event.originalEvent.targetTouches[0];\r\n\t\t    }\r\n\t\t\telse if(event[\"type\"] && event.type.match(/^touch/) && event.changedTouches && event.changedTouches.length)\r\n\t\t\t{\r\n\t\t\t\ttouchEvent = event.changedTouches[0];\r\n\t\t\t}\r\n\t\t\tif(event instanceof Event)\r\n\t\t\t{\r\n\t\t\t\tif(touchEvent)\r\n\t\t\t\t{\r\n\t\t\t\t\tvar arrProp = ['clientX', 'clientY', 'pageX', 'pageY'];\r\n\t\t\t\t\tfor(var count = 0;count < arrProp.length;count++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tvar prop = arrProp[count];\r\n\t\t\t\t\t\tevent[prop] = touchEvent[prop];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (!event.touchEvent) \r\n\t\t\t\t\t{\r\n\t\t\t            event.touchEvent = touchEvent;\r\n\t\t\t        }\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn event;\r\n\t};\r\n\t\r\n\t//returns target for all kind of browser\r\n\tNSUtil.prototype.getTarget = function (event,doc)\r\n\t{\r\n\t\tevent = this.getEvent(event);\r\n\t\tdoc = this.getDoc(doc);\r\n\t\tvar target = event.target ? event.target : event.srcElement;\r\n\t\tif(target && target instanceof SVGElement && event.currentTarget != doc)\r\n\t\t{\r\n\t\t\ttarget = event.currentTarget;\r\n\t\t}\r\n\t\treturn target;\r\n\t};\r\n\t\r\n\t//preventDefault for all kind of browser\r\n\tNSUtil.prototype.preventDefault = function(event)\r\n\t{\r\n\t\tevent = this.getEvent(event);\r\n\t\tif(event.preventDefault) \r\n\t\t{\r\n\t\t   event.preventDefault();\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t   event.returnValue = false;\r\n\t\t}\r\n\t};\r\n\t\r\n\tNSUtil.prototype.preventDefaultForScrollKeys = function(event)\r\n\t{\r\n\t\t// left: 37, up: 38, right: 39, down: 40,\r\n\t\tvar objKeys = {37: 1, 38: 1, 39: 1, 40: 1};\r\n\t\tevent = this.getEvent(event);\r\n\t\tif (objKeys[event.keyCode]) \r\n\t\t{\r\n\t        this.util.preventDefault(event);\r\n\t        return false;\r\n\t    }\r\n\t};\r\n\t\r\n\t//reference: http://www.broofa.com/Tools/Math.uuid.js\r\n\tNSUtil.prototype.getUniqueId = function () \r\n\t{\r\n\t    var chars = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\".split(\"\");\r\n\t    var uuid = new Array(36);\r\n\t    var rnd=0;\r\n\t    var r;\r\n\t    \r\n\t    for (var count = 0; count < 36; count++) \r\n\t    {\r\n\t      if (count==14) \r\n\t      {\r\n\t        uuid[count] = '4';\r\n\t      } \r\n\t      else \r\n\t      {\r\n\t        if (rnd <= 0x02) \r\n\t        {\r\n\t        \trnd = 0x2000000 + (Math.random()*0x1000000) | 0;\r\n\t        }\r\n\t        r = rnd & 0xf;\r\n\t        rnd = rnd >> 4;\r\n\t        uuid[count] = chars[(count == 19) ? (r & 0x3) | 0x8 : r];\r\n\t      }\r\n\t    }\r\n\t    return uuid.join('');\r\n\t };\r\n\t \r\n\t NSUtil.prototype.addCSSClassInDOM = function(arrClassName,arrCSSText,checkExisting,doc)\r\n\t {\r\n\t\t doc = this.getDoc(doc);\r\n\t\t if(doc.styleSheets && arrClassName && arrCSSText && arrCSSText.length === arrCSSText.length)\r\n\t\t {\r\n\t\t\t checkExisting = this.isUndefined(checkExisting) ? true : checkExisting;\r\n\t\t\t var arrStyleSheet = doc.styleSheets;\r\n\t\t\t//var styleSheet = null;\r\n\t\t\t//var media = null; \r\n\t\t\t//var styleSheetLength = arrStyleSheet.length;\r\n\t\t\t/* 1. search for media == \"screen\" */\r\n\t\t\t/*while(styleSheetLength > -1)\r\n\t\t\t{ \r\n\t\t\t\t--styleSheetLength;\r\n\t\t\t\t// dont take into account the disabled stylesheets \r\n\t\t\t\tif(arrStyleSheet[styleSheetLength].disabled) \r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue; \r\n\t\t\t\t}\r\n\t\t\t\tmedia = arrStyleSheet[styleSheetLength].media;\r\n\t\t\t\tif(typeof media == \"object\")\r\n\t\t\t\t{\r\n\t\t\t\t\tmedia = media.mediaText;\r\n\t\t\t\t}\r\n\t\t\t\tif(media == \"\" || media=='all' || media.indexOf(\"screen\") != -1)\r\n\t\t\t\t{\r\n\t\t\t\t\tstyleSheet = arrStyleSheet[styleSheetLength];\r\n\t\t\t\t\tstyleSheetLength = -1;   // indication that media==\"screen\" was found (if not, then styleSheetLength==0)\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}*/\r\n\t\t\tvar styleSheet = null;\r\n\t\t\tvar styleSheetElement = doc.getElementById(this.__sheetId);\r\n\t\t\t/* if not found, create one */\r\n\t\t\t//if(styleSheetLength != -1)\r\n\t\t\tif(styleSheetElement)\r\n\t\t\t{\r\n\t\t\t\tstyleSheet = styleSheetElement.sheet;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tvar head = doc.head || doc.getElementsByTagName('head')[0];\r\n\t\t\t\tstyleSheetElement = doc.createElement(\"style\");\r\n\t\t\t\tstyleSheetElement.setAttribute(\"id\",this.__sheetId);\r\n\t\t\t\tstyleSheetElement.setAttribute(\"type\",\"text/css\");\r\n\t\t\t\thead.appendChild(styleSheetElement);\r\n\t\t\t\tstyleSheet = doc.styleSheets[arrStyleSheet.length - 1]; /* take the new stylesheet to add the className and the style */\r\n\t\t\t}\r\n\t\t\tvar existingCSSClassList = null;\r\n\t\t\tvar classLength = arrCSSText.length; \r\n\t\t\tvar className = null;\r\n\t\t\tvar cssText = null;\r\n\t\t\t/* 3. add the className and style */\r\n\t\t\tswitch (typeof styleSheet.media) \r\n\t\t\t{\r\n\t\t\t\tcase \"string\":\r\n\t\t\t\t\texistingCSSClassList = styleSheet.rules;\r\n\t\t\t\t\tfor(var count = 0;count < classLength;count++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tclassName = arrClassName[count];\r\n\t\t\t\t\t\tcssText = arrCSSText[count];\r\n\t\t\t\t\t\tif(!checkExisting || !this.modifyExistingClass(existingCSSClassList, className, cssText))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tstyleSheet.addRule(className, cssText);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"object\":\r\n\t\t\t\t\texistingCSSClassList = styleSheet.cssRules;\r\n\t\t\t\t\tfor(var count = 0;count < classLength;count++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tclassName = arrClassName[count];\r\n\t\t\t\t\t\tcssText = arrCSSText[count];\r\n\t\t\t\t\t\tif(!checkExisting || !this.modifyExistingClass(existingCSSClassList, className, cssText))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tstyleSheet.insertRule(className + \"{\" + cssText + \"}\", styleSheet.cssRules.length);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t }\r\n\t };\r\n\t NSUtil.prototype.removeCSSClassInDOM = function(arrClassName,doc)\r\n\t {\r\n\t\t doc = this.getDoc(doc);\r\n\t\t if(doc.styleSheets && arrClassName)\r\n\t\t {\r\n\t\t\tvar styleSheet = null;\r\n\t\t\tvar styleSheetElement = doc.getElementById(this.__sheetId);\r\n\t\t\tif(styleSheetElement)\r\n\t\t\t{\r\n\t\t\t\tstyleSheet = styleSheetElement.sheet;\r\n\t\t\t}\r\n\t\t\tvar existingCSSClassList = null;\r\n\t\t\tvar classLength = arrClassName.length; \r\n\t\t\tvar className = null;\r\n\t\t\tif(styleSheet && styleSheet.media)\r\n\t\t\t{\r\n\t\t\t\t/* 3. add the className and style */\r\n\t\t\t\tswitch (typeof styleSheet.media) \r\n\t\t\t\t{\r\n\t\t\t\t\tcase \"string\":\r\n\t\t\t\t\t\texistingCSSClassList = styleSheet.rules;\r\n\t\t\t\t\t\tfor(var count = 0;count < classLength;count++)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tclassName = arrClassName[count];\r\n\t\t\t\t\t\t\tif(this.removeExistingClass(styleSheet,existingCSSClassList, className))\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"object\":\r\n\t\t\t\t\t\texistingCSSClassList = styleSheet.cssRules;\r\n\t\t\t\t\t\tfor(var count = 0;count < classLength;count++)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tclassName = arrClassName[count];\r\n\t\t\t\t\t\t\tif(this.removeExistingClass(styleSheet,existingCSSClassList, className))\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\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 };\r\n\t /*\r\n\t  * If Class exists then modifies the content with new one and return true\r\n\t  * If Class does not exist it returns false\r\n\t  */\r\n\t NSUtil.prototype.modifyExistingClass = function(existingCSSClassList,className,cssText)\r\n\t {\r\n\t\t if(existingCSSClassList && existingCSSClassList.length > 0)\r\n\t\t {\r\n\t\t\t var length = existingCSSClassList.length;\r\n\t\t\t var cssClass = null;\r\n\t\t\t for(var count = 0; count < length; count++) \r\n\t\t\t {\r\n\t\t\t\tcssClass = existingCSSClassList[count];\r\n\t\t\t\tif(cssClass.selectorText && cssClass.selectorText.toLowerCase() == className.toLowerCase()) \r\n\t\t\t\t{\r\n\t\t\t\t\tcssClass.style.cssText = cssText;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t }\r\n\t\t }\r\n\t\t return false;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.removeExistingClass = function(styleSheet,existingCSSClassList,className)\r\n\t{\r\n\t\t if(styleSheet && existingCSSClassList && existingCSSClassList.length > 0)\r\n\t\t {\r\n\t\t\t var length = existingCSSClassList.length;\r\n\t\t\t var cssClass = null;\r\n\t\t\t for(var count = 0; count < length; count++) \r\n\t\t\t {\r\n\t\t\t\tcssClass = existingCSSClassList[count];\r\n\t\t\t\tif(cssClass.selectorText && cssClass.selectorText.toLowerCase() == className.toLowerCase()) \r\n\t\t\t\t{\r\n\t\t\t\t\tvar isRemoved = false;\r\n\t\t\t\t\tif(\"deleteRule\" in styleSheet) \r\n\t\t\t\t\t{ \r\n\t\t\t\t\t\tstyleSheet.deleteRule(count); \r\n\t\t\t\t\t\tisRemoved = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t    else if(\"removeRule\" in styleSheet) \r\n\t\t\t\t    { \r\n\t\t\t\t    \tstyleSheet.removeRule(count); \r\n\t\t\t\t    \tisRemoved = true;\r\n\t\t\t\t    }\r\n\t\t\t\t\tif(isRemoved)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\treturn true;\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\t return false;\r\n\t};\r\n\t \r\n\t NSUtil.prototype.addPseudoStyleFromExistingStyle = function(control,className,property,cssClassName,checkClassCallBack)\r\n\t {\r\n\t \tvar styleProperties = this.getCSSClass(cssClassName);\r\n\t \tif(checkClassCallBack)\r\n\t \t{\r\n\t \t\tstyleProperties = checkClassCallBack(styleProperties);\r\n\t \t}\r\n\t \tvar _head = doc.head || doc.getElementsByTagName('head')[0];\r\n\t \tvar _sheet = doc.getElementById(this.__sheetId) || doc.createElement('style');\r\n\t \t_sheet.id = this.__sheetId;\r\n\t \tcontrol.className +=  \" \" + className; \r\n\t \t_sheet.innerHTML += \"\\n.\" + className + \":\" + property + \"{\" +styleProperties + \"}\";\r\n\t \t_head.appendChild(_sheet);\r\n\t };\r\n\t\r\n\t NSUtil.prototype.getCSSClass = function(cssClassName,doc)\r\n\t {\r\n\t\tdoc = this.getDoc(doc);\r\n\t    if(!doc.styleSheets) \r\n\t \t{\r\n\t \t\treturn \"\";\r\n\t \t}\r\n\t \tvar regEx = null;\r\n\t \tvar styleSheets = doc.styleSheets;\r\n\t \tvar counter = styleSheets.length;\r\n\t \tvar result = [];\r\n\t    if(typeof cssClassName == \"string\") \r\n\t \t{\r\n\t \t\tregEx = RegExp('\\\\b' + cssClassName + '\\\\b','i');\r\n\t \t}\r\n\t    while(counter)\r\n\t \t{\r\n\t     \tvar currentSheet = styleSheets[--counter];\r\n\t     \tvar cssRules = (currentSheet.rules) ? currentSheet.rules: currentSheet.cssRules;\r\n\t \t\tvar cssRulesLength = cssRules.length;\r\n\t     \tfor(var count = 0 ; count < cssRulesLength; count++)\r\n\t \t\t{\r\n\t     \t\tvar tempClassDetails = cssRules[count].selectorText ? [cssRules[count].selectorText, cssRules[count].style.cssText]: [cssRules[count]+''];\r\n\t     \t\tif(regEx.test(tempClassDetails[0])) \r\n\t \t\t\t{\r\n\t \t\t\t\tresult[result.length]= tempClassDetails;\r\n\t \t\t\t}\r\n\t     \t}\r\n\t     }\r\n\t \tif(result && result.length === 1 && result[0] && result[0].length > 1)\r\n\t \t{\r\n\t \t\treturn result[0][1];\r\n\t \t}\r\n\t     return result.join('\\n\\n');\r\n\t };\r\n\t \r\n\t NSUtil.prototype.addStylesToHead = function(styleTagId, arrStyle) {\r\n\t\t if(arrStyle && arrStyle.length) {\r\n\t\t\t var style = document.createElement(\"style\");\r\n\t\t\t if(styleTagId) {\r\n\t\t\t\t style.setAttribute(\"id\",styleTagId);\r\n\t\t\t }\r\n\t\t\t style.textContent = arrStyle.join(\"\\n\");\r\n\t\t\t document.head.appendChild(style);\r\n\t\t\t return style;\r\n\t\t }\r\n\t\t return null;\r\n\t};\r\n\t \r\n\t NSUtil.prototype.convertCSSPropToJS = function(cssClassProp)\r\n\t {\r\n\t\t if(cssClassProp)\r\n\t\t {\r\n\t\t\t var arrIndex = this.indexesOf(cssClassProp,\"-\");\r\n\t\t\t if(arrIndex && arrIndex.length > 0)\r\n\t\t\t {\r\n\t\t\t\t for(var count = 0;count < arrIndex.length; count++)\r\n\t\t\t\t {\r\n\t\t\t\t\t var index = arrIndex[count] + 1;\r\n\t\t\t\t\t cssClassProp = cssClassProp.substring(0,index) + cssClassProp[index].toUpperCase() + cssClassProp.slice(index + 1);\r\n\t\t\t\t }\r\n\t\t\t\t cssClassProp = cssClassProp.replaceAll(\"-\",\"\");\r\n\t\t\t }\r\n\t\t }\r\n\t\t return cssClassProp;\r\n\t };\r\n\t \r\n\t//CSS Property \"transition\",\"-o-transition\",\"-ms-transition\",\"-moz-transition\",\"webkit-transition\"\r\n\t //Javascript Equivalent \"transition\",\"OTransition\",\"msTransition\",\"MozTransition\",\"WebkitTransition\"\r\n\t NSUtil.prototype.getSupportedCSSPropertyName = function(arrPropertyNames,doc)\r\n\t {\r\n\t\t if(arrPropertyNames && arrPropertyNames.length > 0)\r\n\t\t {\r\n\t\t\t doc = this.getDoc(doc);\r\n\t\t\t var root = doc.documentElement;\r\n\t\t\t for (var count=0; count < arrPropertyNames.length; count++)\r\n\t\t \t {\r\n\t\t\t \t //if property exists on element (value will be string, empty string if not set)\r\n\t\t\t\t if(arrPropertyNames[count] in root.style)\r\n\t\t \t\t { \r\n\t\t\t\t\t return arrPropertyNames[count];\r\n\t\t \t\t }\r\n\t\t \t }\r\n\t\t }\r\n\t\t return null;\r\n\t };\r\n\t \r\n\t NSUtil.prototype.throwNSError = function(componentName,message)\r\n\t {\r\n\t \tthrow new Error(\"Error in \" + componentName + \" with details::\" + message);\r\n\t };\r\n\t \r\n\t NSUtil.prototype.warning = function(componentName,message)\r\n\t {\r\n\t \tconsole.warn(\"Warning in \" + componentName + \" with details::\" + message);\r\n\t };\r\n\r\n\t NSUtil.prototype.info = function(componentName,message)\r\n\t {\r\n\t \tconsole.info(\"Info in \" + componentName + \" with details::\" + message);\r\n\t };\r\n\r\n\t NSUtil.prototype.debug = function(componentName,message)\r\n\t {\r\n\t \tconsole.debug(\"Debugging Message in \" + componentName + \" with details::\" + message);\r\n\t };\r\n\t \r\n\t //gets the offset of the element \r\n\t //equivalent offset() of jquery\r\n\t NSUtil.prototype.getOffSet = function(element, offset) \r\n\t {\r\n\t\t if(!offset)\r\n\t\t {\r\n\t\t\t offset = {left : 0, top : 0};\r\n\t\t }\r\n\t\t if(element)\r\n\t     {\r\n\t\t\toffset.left += (element.offsetLeft - element.scrollLeft + element.clientLeft);\r\n\t\t\toffset.top += (element.offsetTop - element.scrollTop + element.clientTop);\r\n\t\t    offset = this.getOffSet(element.offsetParent, offset);\r\n\t     }\r\n\t\t return offset;\r\n\t };\r\n\t \r\n\t NSUtil.prototype.setOffSet = function(element, offset) \r\n\t {\r\n\t\t if(element && offset)\r\n\t     {\r\n\t\t\tvar calculatePosition = false;\r\n\t\t\tvar position = this.getStyleValue(element,\"position\",true);\r\n\t\t\tif (position === \"static\") \r\n\t\t\t{\r\n\t\t\t\telement.style.position = \"relative\";\r\n\t\t\t}\r\n\t\t\tvar currentOffset = this.getOffSet(element);\r\n\t\t\tvar curCSSTop = element.style.top;\r\n\t\t\tvar curCSSLeft =  element.style.left;\r\n\t\t\tvar curTop,curLeft;\r\n\t\t\tcalculatePosition = (position === \"absolute\" || position === \"fixed\" ) && (curCSSTop + curCSSLeft).indexOf( \"auto\" ) > -1;\r\n\t\t\tif (calculatePosition) \r\n\t\t\t{\r\n\t\t\t\tvar curPosition = this.getPosition(element);\r\n\t\t\t\tcurTop = curPosition.top;\r\n\t\t\t\tcurLeft = curPosition.left;\r\n\t\t\t} \r\n\t\t\telse \r\n\t\t\t{\r\n\t\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\r\n\t\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\r\n\t\t\t}\r\n\t\t\tif (offset.top != null) \r\n\t\t\t{\r\n\t\t\t\telement.style.top = ((offset.top - currentOffset.top) + curTop) + \"px\";\r\n\t\t\t}\r\n\t\t\tif (offset.left != null) \r\n\t\t\t{\r\n\t\t\t\telement.style.left = ((offset.left - currentOffset.left ) + curLeft) + \"px\";\r\n\t\t\t}\r\n\t     }\r\n\t\t return offset;\r\n\t };\r\n\t \r\n\t//equivalent position() of jquery\r\n\t NSUtil.prototype.getPosition = function(element,isElementScrollable,doc) \r\n\t {\r\n\t\t if(isElementScrollable)\r\n\t\t {\r\n\t\t\t doc = this.getDoc(doc);\r\n\t\t\t var self = this;\r\n\t\t\t var offsetParent = function(node) \r\n\t\t\t {\r\n\t\t\t\tvar offsetParent = node.offsetParent || doc.documentElement;\r\n\t\t\t\twhile (offsetParent && offsetParent.tagName != \"html\" && self.getStyleValue(offsetParent,\"position\",false) === \"static\") \r\n\t\t\t\t{\r\n\t\t\t\t\toffsetParent = offsetParent.offsetParent;\r\n\t\t\t\t}\r\n\t\t\t\treturn offsetParent || doc.documentElement;\r\n\t\t\t };\r\n\t\t\t var offsetParent,offset,parentOffset = { top: 0, left: 0 };\r\n\t\t\t // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent\r\n\t\t\t if (this.getStyleValue(element,\"position\",false) === \"fixed\" ) \r\n\t\t\t {\r\n\t\t\t\t// we assume that getBoundingClientRect is available when computed position is fixed\r\n\t\t\t\toffset = element.getBoundingClientRect();\r\n\t\t\t } \r\n\t\t\t else \r\n\t\t\t {\r\n\t\t\t\toffsetParent = offsetParent(element);\r\n\t\t\t\t// Get correct offsets\r\n\t\t\t\toffset = element.getBoundingClientRect();\r\n\t\t\t\tif(offsetParent.tagName != \"html\") \r\n\t\t\t\t{\r\n\t\t\t\t\tparentOffset = offsetParent.getBoundingClientRect();\r\n\t\t\t\t}\r\n\t\r\n\t\t\t\t// Add offsetParent borders\r\n\t\t\t\tparentOffset.top  += this.getDimensionAsNumber(this.getStyleValue(offsetParent,\"borderTopWidth\",false));\r\n\t\t\t\tparentOffset.left += this.getDimensionAsNumber(this.getStyleValue(offsetParent,\"borderLeftWidth\",false));\r\n\t\t\t }\r\n\t\t\t // Subtract parent offsets and element margins\r\n\t\t\t // note: when an element has margin: auto the offsetLeft and marginLeft\r\n\t\t\t // are the same in Safari causing offset.left to incorrectly be 0\r\n\t\t\t return {\r\n\t\t\t\ttop:  offset.top  - parentOffset.top - this.getDimensionAsNumber(this.getStyleValue((element,\"marginTop\",false))),\r\n\t\t\t\tleft: offset.left - parentOffset.left - this.getDimensionAsNumber(this.getStyleValue((element,\"marginLeft\",false)))\r\n\t\t\t };\r\n\t\t }\r\n\t\t else\r\n\t\t {\r\n\t\t\t var offset = {left : 0, top : 0};\r\n\t\t\t if(element)\r\n\t\t     {\r\n\t\t\t\t offset = {left : element.offsetLeft, top : element.offsetTop};\r\n\t\t     }\r\n\t\t\t return offset;\r\n\t\t }\r\n\t };\r\n\t \r\n\t NSUtil.prototype.getOffSetForElementRectangle = function(rectElement,doc,win) \r\n\t {\r\n\t\t  doc = this.getDoc(doc);\r\n\t\t  win = this.getWin(win);\r\n\t\t  var body = doc.body || doc.getElementsByTagName('body')[0];\r\n\t\t  var docElement = doc.documentElement || body.parentNode;\r\n\t\t  var clientTop  = docElement.clientTop  || body.clientTop  || 0;\r\n\t\t  var clientLeft = docElement.clientLeft || body.clientLeft || 0;\r\n\t\t  var scrollTop  = win.pageYOffset || docElement.scrollTop;\r\n\t\t  var scrollLeft = win.pageXOffset || docElement.scrollLeft;\r\n\t\t  \r\n\t\t  var top = rectElement.top  + scrollTop  - clientTop;\r\n\t\t  var left = rectElement.left + scrollLeft - clientLeft;\r\n\t\r\n\t\t  return {top:top,left:left};\r\n\t };\r\n\t \r\n\t NSUtil.prototype.getOffSetByRect = function(element,doc) \r\n\t {\r\n\t\t doc = this.getDoc(doc);\r\n\t\t var rect = element.getBoundingClientRect();\r\n\t\t var top = rect.top + doc.body.scrollTop;\r\n\t\t var left = rect.left + doc.body.scrollLeft;\r\n\t\t return {top:top,left:left};\r\n\t };\r\n\t \r\n\t NSUtil.prototype.getDPI = function(doc)\r\n\t {\r\n\t\tdoc = this.getDoc(doc);\r\n\t \tvar dpi = {width:0,height:0};\r\n\t\tvar divDPI = this.createDiv(null,\"nsGetDPI\");\r\n\t    doc.body.appendChild(divDPI);\r\n\t    dpi.width = divDPI.offsetWidth;\r\n\t    dpi.height = divDPI.offsetHeight;\r\n\t    doc.body.removeChild(divDPI);\r\n\t \t\r\n\t \treturn dpi;\r\n\t };\r\n\t \r\n\t//gives dimension for the visible part i.e. body or viewport\r\n\t NSUtil.prototype.getBodyDimension = function(doc,win) \r\n\t {\r\n\t\t doc = this.getDoc(doc);\r\n\t\t win = this.getWin(win);\r\n\t\t var objReturn = {};\r\n\t\t objReturn.width = win.innerWidth || doc.documentElement.clientWidth || doc.body.offsetWidth;\r\n\t\t objReturn.height = win.innerHeight || doc.documentElement.clientHeight || doc.body.offsetHeight;\r\n\t\t return objReturn;\r\n\t };\r\n\t \r\n\t//gives dimension for the whole document i.e. with scroll bars\r\n\t NSUtil.prototype.getDocumentDimension = function(doc) \r\n\t {\r\n\t\t var objReturn = {};\r\n\t\t doc = this.getDoc(doc);\r\n\t\t objReturn.width = Math.max(\r\n\t\t\t\t \tdoc.body.scrollWidth, doc.documentElement.scrollWidth,\r\n\t\t\t\t \tdoc.body.offsetWidth, doc.documentElement.offsetWidth,\r\n\t\t\t\t \tdoc.body.clientWidth, doc.documentElement.clientWidth\r\n\t\t\t    );\r\n\t\t objReturn.height = Math.max(\r\n\t\t\t\t \tdoc.body.scrollHeight, doc.documentElement.scrollHeight,\r\n\t\t\t\t \tdoc.body.offsetHeight, doc.documentElement.offsetHeight,\r\n\t\t\t\t \tdoc.body.clientHeight, doc.documentElement.clientHeight\r\n\t\t\t    );\r\n\t\t return objReturn;\r\n\t };\r\n\t \r\n\t //equivalent to jquery outerHeight\r\n\t NSUtil.prototype.getOuterHeight = function(element,win)\r\n\t {\r\n\t\t var height = -1;\r\n\t\t if(element)\r\n\t\t {\r\n\t\t\t win = this.getWin(win);\r\n\t\t\t height = element.offsetHeight;\r\n\t\t\t var style = win.getComputedStyle(element);\r\n\t\t\t height += parseInt(style.marginTop) + parseInt(style.marginBottom);\r\n\t\t }\r\n\t\t return height;\r\n\t };\r\n\t //equivalent to jquery outerWidth\r\n\t NSUtil.prototype.getOuterWidth = function(element,win)\r\n\t {\r\n\t\t var width = -1;\r\n\t\t if(element)\r\n\t\t {\r\n\t\t\t win = this.getWin(win);\r\n\t\t\t width = element.offsetWidth;\r\n\t\t\t var style = win.getComputedStyle(element);\r\n\t\t\t width += parseInt(style.marginLeft) + parseInt(style.marginRight);\r\n\t\t }\r\n\t\t return width;\r\n\t };\r\n\t \r\n\t NSUtil.prototype.getInnerWidth = function(element, win) \r\n\t {\r\n\t\t win = this.getWin(win);\r\n\t\t var computedStyle = win.getComputedStyle(element);\r\n\t\t var elementWidth = element.clientWidth;\r\n\t\t elementWidth -= parseFloat(computedStyle.paddingLeft || \"0\") + parseFloat(computedStyle.paddingRight || \"0\");\r\n\t\t return elementWidth;\r\n\t };\r\n\t \r\n\t //returns measured width of text\r\n\t NSUtil.prototype.getWidthOfText = function(text,fontSize,fontName,doc)\r\n\t {\t\r\n\t\tdoc = this.getDoc(doc);\r\n\t \tvar canvas = doc.createElement(\"canvas\");\r\n\t \tvar context = canvas.getContext(\"2d\");\r\n\t \tvar fontArgs = context.font.split(\" \");\r\n\t \tif(fontSize)\r\n\t \t{\r\n\t \t\tfontArgs[0] = fontSize;\r\n\t \t}\r\n\t \tif(fontName)\r\n\t \t{\r\n\t \t\tfontArgs[1] = fontName;\r\n\t \t}\r\n\t \tcontext.font = fontArgs[0] + \" \" + fontArgs[1];        \r\n\t \tvar width = context.measureText(text).width;\r\n\t \treturn width;\r\n\t };\r\n\t \r\n\t NSUtil.prototype.getMaxZIndex = function (element,doc) \r\n\t {\r\n\t\t doc = this.getDoc(doc);\r\n\t     var currentzIndex = -1;\r\n\t     var maxZIndex = 0;\r\n\t     var checkZIndex = function(currElement)\r\n\t     {\r\n\t     \tcurrentzIndex = doc.defaultView.getComputedStyle(currElement,null).getPropertyValue(\"z-index\");\r\n\t     \tcurrentzIndex = parseInt(currentzIndex, 10);\r\n\t     \tmaxZIndex = (currentzIndex) ? Math.max(maxZIndex, currentzIndex) : maxZIndex;\r\n\t     };\r\n\t     if(element)\r\n\t     {\r\n\t     \tvar currentElement = element;\r\n\t         while(currentElement)\r\n\t         {\r\n\t         \tcheckZIndex(currentElement);\r\n\t             currentElement = currentElement.offsetParent;\r\n\t         }\r\n\t     }\r\n\t     else\r\n\t     {\r\n\t     \tvar arrElements = doc.getElementsByTagName(\"*\");\r\n\t         var length = arrElements.length;\r\n\t         for (var count = 0; count < length; count++) \r\n\t         {\r\n\t         \tcheckZIndex(arrElements[count]);\r\n\t         }\r\n\t     }\r\n\t     return maxZIndex;\r\n\t };\r\n\t\r\n\t \r\n\t//function for scrollbar click detection\r\n\t //pass event.clientX for mouse events\r\n\t NSUtil.prototype.clickedOnScrollbar = function(element,mouseX)\r\n\t {\r\n\t\t if(element)\r\n\t\t {\r\n\t\t\t return (this.getOuterWidth(element) <= mouseX);\r\n\t\t }\r\n\t\t return false;\r\n\t };\r\n\t \r\n\t //concept from https://tylercipriani.com/2014/07/12/crossbrowser-javascript-scrollbar-detection.html\r\n\t NSUtil.prototype.hasScrollbar = function(element,axis,doc,win)\r\n\t {\r\n\t\t doc = this.getDoc(doc);\r\n\t\t win = this.getWin(win);\r\n\t\t if(!element)\r\n\t\t {\r\n\t\t\t element = doc.documentElement || doc.body;\r\n\t\t }\r\n\t     var overflowStyle = null;\r\n\t     var overflowYStyle = null;\r\n\t \r\n\t\t if (typeof element.currentStyle !== 'undefined') \r\n\t\t {\r\n\t\t     overflowStyle = element.currentStyle.overflow;\r\n\t\t     overflowYStyle = element.currentStyle.overflowY;\r\n\t\t }\r\n\t\t overflowStyle = overflowStyle || win.getComputedStyle(element, \"\").overflow;\r\n\t\t overflowYStyle = overflowYStyle || win.getComputedStyle(element, \"\").overflowY;\r\n\t\t\r\n\t\t if (axis === 'x') \r\n\t\t {\r\n\t\t     var contentOverflows = element.scrollWidth > element.clientWidth,\r\n\t\t         overflowShown = /^(visible|auto)$/.test(overflowStyle), \r\n\t\t         alwaysShowScroll = overflowStyle === 'scroll';\r\n\t\t     return (contentOverflows && overflowShown) || (alwaysShowScroll);\r\n\t\t }\r\n\t\t else if (axis === 'y') \r\n\t\t {\r\n\t\t     var contentOverflows = element.scrollHeight > element.clientHeight,\r\n\t\t         overflowShown = /^(visible|auto)$/.test(overflowYStyle), \r\n\t\t         alwaysShowScroll = overflowYStyle === 'scroll';\r\n\t\t     return (contentOverflows && overflowShown) || (alwaysShowScroll);\r\n\t\t }\r\n\t\t else \r\n\t\t {\r\n\t\t     var contentOverflows = element.scrollWidth > element.clientWidth || element.scrollHeight > element.clientHeight,\r\n\t\t         overflowShown    = /^(visible|auto)$/.test(overflowStyle) || /^(visible|auto)$/.test(overflowYStyle),\r\n\t\t         alwaysShowScroll = overflowStyle === 'scroll' || overflowYStyle === 'scroll';\r\n\t\t     \r\n\t\t     return (contentOverflows && overflowShown) || (alwaysShowScroll);\r\n\t\t }\r\n\t };\r\n\t \r\n\t NSUtil.prototype.isChildInParent = function(parent,child)\r\n\t {\r\n\t\t if(parent && child)\r\n\t\t {\r\n\t\t\t var contains = (parent === child || (parent.compareDocumentPosition(child) & Node.DOCUMENT_POSITION_CONTAINED_BY));\r\n\t\t\t return (contains > 0);\r\n\t\t }\r\n\t\t return false;\r\n\t };\r\n\t \r\n\t //gives position where event has occured(like mouseClick) \r\n\t NSUtil.prototype.getEventPosition = function(event,parentWithScroll,doc) \r\n\t {\r\n\t\t  event = this.getEvent(event);\r\n\t\t  doc = this.getDoc(doc);\r\n\t\t  var left = 0;\r\n\t\t  var top = 0;\r\n\t\t  if (event.pageX || event.pageY) \r\n\t\t  { \r\n\t\t\t  left = event.pageX;\r\n\t\t\t  top = event.pageY;\r\n\t\t  }\r\n\t\t  else \r\n\t\t  { \r\n\t\t\t  left = event.clientX + doc.body.scrollLeft + doc.documentElement.scrollLeft; \r\n\t\t\t  top = event.clientY + doc.body.scrollTop + doc.documentElement.scrollTop; \r\n\t\t  }\r\n\t\t  if(parentWithScroll)\r\n\t\t  {\r\n\t\t\t  left += parentWithScroll.scrollLeft;\r\n\t\t\t  top += parentWithScroll.scrollTop;\r\n\t\t  }\r\n\t\t  return {left: left, top: top};\r\n\t };\r\n\t \r\n\t NSUtil.prototype.getMouseOffset = function(event,element)\r\n\t {\r\n\t\t event = this.getEvent(event);\r\n\t     var elementPosition = this.getCumulativeOffset(element);\r\n\t     var mousePosition = this.getEventPosition(event);\r\n\t     return {x:(mousePosition.left - elementPosition.x), y:(mousePosition.top - elementPosition.y)};\r\n\t };\r\n\t \r\n\t NSUtil.prototype.getMaxScrollPosition = function(element) \r\n\t {\r\n\t\t var offset = {left : 0, top : 0};\r\n\t\t if(element)\r\n\t     {\r\n\t\t\t var maxX = element.scrollWidth - element.clientWidth;\r\n\t         var maxY = element.scrollHeight - element.clientHeight;\r\n\t\t\t offset = {left : maxX, top : maxY};\r\n\t     }\r\n\t\t return offset;\r\n\t };\r\n\t \r\n\t \r\n\t NSUtil.prototype.addTemplateInContainer = function(container,templateID) \r\n\t {\r\n\t\t if(container && templateID)\r\n\t\t {\r\n\t\t\t var templateClone = this.getTemplate(templateID);\r\n\t\t\t if(templateClone)\r\n\t\t\t {\r\n\t\t\t\t container.appendChild(templateClone);\r\n\t\t\t }\r\n\t\t }\r\n\t };\r\n\t \r\n\t NSUtil.prototype.getTemplate = function(templateID,doc) \r\n\t {\r\n\t\t var templateClone = null;\r\n\t\t if(templateID)\r\n\t\t {\r\n\t\t\t doc = this.getDoc(doc);\r\n\t\t\t if(typeof templateID === \"string\")\r\n\t\t\t {\r\n\t\t\t\t var template = doc.getElementById(templateID);\r\n\t\t\t\t if(template)\r\n\t\t\t\t {\r\n\t\t\t\t\t if(this.supportsTemplate())\r\n\t\t\t\t\t {\r\n\t\t\t\t\t\t templateClone = template.content.children[0]; //doc.importNode(template.content, true); \r\n\t\t\t\t\t }\r\n\t\t\t\t\t else\r\n\t\t\t\t\t {\r\n\t\t\t\t\t\t templateClone = template.cloneNode(true);\r\n\t\t\t\t\t\t template.style.display = \"none\";\r\n\t\t\t\t\t }\r\n\t\t\t\t }\r\n\t\t\t }\r\n\t\t\t else\r\n\t\t\t {\r\n\t\t\t\t templateClone = templateID.cloneNode(true);\r\n\t\t\t }\r\n\t\t }\r\n\t\t return templateClone;\r\n\t };\r\n\t \r\n\t NSUtil.prototype.supportsTemplate = function(doc) \r\n\t {\r\n\t\t doc = this.getDoc(doc);\r\n\t\t return (\"content\" in doc.createElement('template'));\r\n\t };\r\n\t \r\n\t NSUtil.prototype.getTemplateFromURL = function(url,callback,errorCallback,win) \r\n\t {\r\n\t\t if(url)\r\n\t\t {\r\n\t\t\twin = this.getWin(win);\r\n\t\t\tvar xmlhttp;\r\n\t\t\tif (win.XMLHttpRequest)\r\n\t\t\t{// code for IE7+, Firefox, Chrome, Opera, Safari\r\n\t\t\t\txmlhttp = new XMLHttpRequest();\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{// code for IE6, IE5\r\n\t\t\t\txmlhttp = new ActiveXObject(\"Microsoft.XMLHTTP\");\r\n\t\t\t}\r\n\t\t\txmlhttp.onreadystatechange=function()\r\n\t\t\t{\r\n\t\t\t  if(xmlhttp.readyState === 4)\r\n\t\t\t  {\r\n\t\t\t\t  if (xmlhttp.status === 200) \r\n\t\t\t\t  {  \r\n\t\t\t\t\t  if(callback)\r\n\t\t\t\t\t  {\r\n\t\t\t\t\t\t  callback(xmlhttp.responseText);\r\n\t\t\t\t\t  }\r\n\t\t\t      } \r\n\t\t\t\t  else \r\n\t\t\t\t  {\r\n\t\t\t\t\t  console.debug(\"Error loading Template from URL:: \" + url);\r\n\t\t\t\t\t  if(errorCallback)\r\n\t\t\t\t\t  {\r\n\t\t\t\t\t\t errorCallback(xmlhttp.statusText);\r\n\t\t\t\t\t  }\r\n\t\t\t      }  \r\n\t\t\t  }\r\n\t\t\t};\r\n\t\t\txmlhttp.open(\"GET\",url,true);\r\n\t\t\txmlhttp.send();\r\n\t\t }\r\n\t };\r\n\t \r\n\t NSUtil.prototype.supportsImports = function(doc) \r\n\t {\r\n\t\t doc = this.getDoc(doc);\r\n\t\t return (\"import\" in doc.createElement('link'));\r\n\t };\r\n\t \r\n\t NSUtil.prototype.removeAllChildren = function(element) \r\n\t {\r\n\t\tif(element)\r\n\t\t{\r\n\t\t\tvar node = element;\r\n\t\t    while (element.hasChildNodes()) \r\n\t\t    {              \r\n\t\r\n\t\t        if (node.hasChildNodes()) \r\n\t\t        {                \r\n\t\t            node = node.lastChild;                 \r\n\t\t        }\r\n\t\t        else \r\n\t\t        {                                     \r\n\t\t            node = node.parentNode;                \r\n\t\t            node.removeChild(node.lastChild);      \r\n\t\t        }\r\n\t\t    }\r\n\t\t}\r\n\t };\r\n\t \r\n\t NSUtil.prototype.getScrollBarWidth = function(element,doc)\r\n\t {\r\n\t\tdoc = this.getDoc(doc);\r\n\t \tvar scrollBarWidth = 0;\r\n\t \tif(element)\r\n\t \t{\r\n\t \t\tscrollBarWidth = element.offsetWidth - element.clientWidth;\r\n\t \t}\r\n\t \telse\r\n\t \t{\r\n\t \t\tvar divScroll = this.createDiv(null,\"nsGetScrollBar\");\r\n\t \t\tvar divScrollChild = this.createDiv(null);\r\n\t \t\tdivScroll.appendChild(divScrollChild);\r\n\t        doc.body.appendChild(divScroll);\r\n\t        var oldWidth = divScrollChild.getBoundingClientRect().width;\r\n\t        divScrollChild.style.height = \"99px\";\r\n\t        var newWidth = divScrollChild.getBoundingClientRect().width;\r\n\t        scrollBarWidth = oldWidth - newWidth;\r\n\t        doc.body.removeChild(divScroll);\r\n\t \t}\r\n\t \treturn scrollBarWidth;\r\n\t };\r\n\t \r\n\t NSUtil.prototype.getKeyUnicode = function(event) \r\n\t {\r\n\t\t event = this.getEvent(event);\r\n\t     var unicode=event.keyCode ? event.keyCode : event.charCode;\r\n\t     return unicode;\r\n\t };\r\n\t \r\n\t NSUtil.prototype.getNumber = function(objNumber) \r\n\t {\r\n\t\t objNumber = Number(objNumber);\r\n\t\t if(isNaN(objNumber))\r\n\t\t {\r\n\t\t\t objNumber = 0;\r\n\t\t }\r\n\t\t return objNumber;\r\n\t };\r\n\t\r\n\t NSUtil.prototype.getDimensionAsNumber = function(element,dimension)\r\n\t {\r\n\t \tvar retValue = 0;\r\n\t \tvar dimensionUnit = this.getDimensionUnit(dimension);\r\n\t\tif(dimensionUnit === 1 && element && element.parentNode)\r\n\t\t{\r\n\t\t\tdimension = dimension.substring(0,dimension.length - 1);\r\n\t\t\tretValue = (dimension / 100) * element.parentNode.offsetHeight;\r\n\t\t}\r\n\t\telse if(dimensionUnit === 2)\r\n\t\t{\r\n\t\t\tretValue = dimension.substring(0,dimension.length - 2);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tretValue = dimension;\r\n\t\t}\r\n\t \tif(retValue === \"\" || isNaN(retValue))\r\n\t \t{\r\n\t \t\tretValue = 0;\r\n\t \t}\r\n\t \treturn parseInt(retValue);\r\n\t };\r\n\t \r\n\t /*returns 0 if dimension has no unit\r\n\t  returns 1 if dimension is in %\r\n\t  returns 2 if dimension is in px \r\n\t  returns -1 if dimension is not valid */ \r\n\t NSUtil.prototype.getDimensionUnit = function(dimensionValue)\r\n\t {\r\n\t \tvar retValue = -1;\r\n\t \tif(!this.isUndefined(dimensionValue) && dimensionValue != null )\r\n\t \t{\r\n\t \t\tretValue = 0;\r\n\t \t\tif(dimensionValue.toString().substring(dimensionValue.toString().length - 1) == \"%\")\r\n\t \t\t{\r\n\t \t\t\tretValue = 1;\r\n\t \t\t}\r\n\t \t\telse if(dimensionValue.toString().substring(dimensionValue.toString().length - 2) == \"px\")\r\n\t \t\t{\r\n\t \t\t\tretValue = 2;\r\n\t \t\t}\r\n\t \t}\r\n\t \treturn retValue;\r\n\t };\r\n\t \r\n\t NSUtil.prototype.getCumulativeOffset = function(element,tillElement)\r\n\t {\r\n\t     var x = 0;\r\n\t     var y = 0;\r\n\t     var prevElement = null;\r\n\t     var currentElement = (element.offsetHeight > 0) ? element : element.firstChild;\r\n\t     while(currentElement && (!tillElement || (tillElement != prevElement)))\r\n\t     {\r\n\t         x += currentElement.offsetLeft;\r\n\t         y += currentElement.offsetTop;\r\n\t         prevElement = currentElement;\r\n\t         currentElement = currentElement.offsetParent;\r\n\t     }\r\n\t     return { x: x, y: y };\r\n\t };\r\n\t \r\n\t NSUtil.prototype.round = function(num, decimalPlaces) \r\n\t {\r\n\t     return Math.round(num * Math.pow(10, decimalPlaces)) / Math.pow(10, decimalPlaces);\r\n\t };\r\n\t  \r\n\t NSUtil.prototype.makeElementUnselectable = function(element,makeChildrenUnselectable)\r\n\t {\r\n\t\t if(element)\r\n\t\t {\r\n\t\t\t if (element.nodeType == 1) \r\n\t\t     {\r\n\t\t\t\t element.setAttribute(\"unselectable\", \"on\");\r\n\t\t     }\r\n\t\t\t if(makeChildrenUnselectable)\r\n\t\t\t {\r\n\t\t\t\t var childElement = element.firstChild;\r\n\t\t\t     while (childElement) \r\n\t\t\t     {\r\n\t\t\t    \t this.makeElementUnselectable(childElement,makeChildrenUnselectable);\r\n\t\t\t         childElement = childElement.nextSibling;\r\n\t\t\t     }\r\n\t\t\t }\r\n\t\t }\r\n\t };\r\n\t \r\n\t NSUtil.prototype.makeBodyUnselectable = function(doc)\r\n\t {\r\n\t\t doc = this.getDoc(doc);\r\n\t\t this.addStyleClass(doc.body,\"nsUnselectable\");\r\n\t };\r\n\t \r\n\t NSUtil.prototype.makeBodySelectable = function(doc)\r\n\t {\r\n\t\t doc = this.getDoc(doc);\r\n\t\t this.removeStyleClass(doc.body,\"nsUnselectable\");\r\n\t };\r\n\t \r\n\t\r\n\tNSUtil.prototype.startsWith = function(sourceString,searchString,caseSensitive) \r\n\t{\r\n\t\tif(!sourceString || !searchString)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(caseSensitive)\r\n\t\t{\r\n\t\t\treturn sourceString.length >= searchString.length && sourceString.substring(0, searchString.length) === searchString;\r\n\t\t}\r\n\t\treturn sourceString.length >= searchString.length && sourceString.substring(0, searchString.length).toLowerCase() === searchString.toLowerCase();\r\n\t};\r\n\t\r\n\tNSUtil.prototype.endsWith = function(sourceString,searchString,caseSensitive) \r\n\t{\r\n\t\tif(!sourceString || !searchString)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(caseSensitive)\r\n\t\t{\r\n\t\t\treturn sourceString.length >= searchString.length && sourceString.substring(sourceString.length - searchString.length,sourceString.length) === searchString;\r\n\t\t}\r\n\t\treturn sourceString.length >= searchString.length && sourceString.substring(sourceString.length - searchString.length,sourceString.length).toLowerCase() === searchString.toLowerCase();\r\n\t};\r\n\t\r\n\tNSUtil.prototype.contains = function(sourceString,searchString,startIndex,caseSensitive) \r\n\t{\r\n\t\tif(!sourceString || !searchString)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(isNaN(startIndex))\r\n\t\t{\r\n\t\t\tstartIndex = 0;\r\n\t\t}\r\n\t\tif(caseSensitive)\r\n\t\t{\r\n\t\t\treturn sourceString.length >= searchString.length && ''.indexOf.call(sourceString, searchString, startIndex) !== -1;\r\n\t\t}\r\n\t\treturn sourceString.length >= searchString.length && ''.indexOf.call(sourceString.toLowerCase(), searchString.toLowerCase(), startIndex) !== -1;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.indexesOf = function(sourceString,charToFind) \r\n\t{\r\n\t\tvar match = \"\";\r\n\t    var arrIndexes = [] ;\r\n\t\tif(sourceString && charToFind)\r\n\t\t{\r\n\t\t\tvar regex = new RegExp(charToFind,\"g\");\r\n\t\t\twhile (match = regex.exec(sourceString)) \r\n\t\t\t{\r\n\t\t\t\tarrIndexes.push(match.index);\r\n\t\t    }\r\n\t\t}\r\n\t\treturn arrIndexes;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.checkRegexValue = function(strRegex,value) \r\n\t{\r\n\t\ttry\r\n\t\t{\r\n\t\t\tvar regex = new RegExp(strRegex,\"g\");\r\n\t\t    return regex.test(value);\r\n\t\t}\r\n\t    catch(error)\r\n\t    {\r\n\t    \tconsole.log(\"Invalid Regex with details::\" + error.message);\r\n\t    }\r\n\t    return false;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.isValueNull = function(value) \r\n\t{\r\n\t\tif(value === null || this.isUndefined(value))\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tvar nullValues = [\"null\"];\r\n\t\tvar len = nullValues.length;\r\n\t\tfor (var count = 0;count < len; count++)\r\n\t\t{\r\n\t\t    if (value === nullValues[count]) \r\n\t\t    {\r\n\t\t    \treturn true;\r\n\t\t    }\r\n\t\t}\r\n\t\treturn false;\r\n\t};\r\n\t\r\n\t//call when you want to wait for all the changes to complete\r\n\tNSUtil.prototype.debounce = function(callback,timeout) \r\n\t{\r\n\t\tvar timerID; \r\n\t    var debounceHandler = function() \r\n\t    {\r\n\t    \t//shallow copy\r\n\t    \tvar args = [];\r\n            for (var count = 0;count < arguments.length; count++) \r\n            {\r\n                args[count] = arguments[count];\r\n            }\r\n\t        if (!timeout) \r\n\t        {\r\n\t        \tcallback.apply(null,args);\r\n            }\r\n\t        else\r\n\t        {\r\n\t        \tclearTimeout(timerID);\r\n\t\t        timerID = setTimeout(function(){callback.apply(null, args)}, timeout);\r\n\t        }\r\n\t    };\r\n\t    return debounceHandler;\r\n\t};\r\n\t\r\n\t//call when you want a function after certain interval\r\n\tNSUtil.prototype.throttle  = function(callback,timeout) \r\n\t{\r\n\t\tvar throttleTimeout = null;\r\n\t\tvar storedEvent = null;\r\n\t\tvar throttleHandler = function(event)\r\n\t\t{\r\n\t\t\tstoredEvent = event;\r\n\t\t\tvar shouldHandleEvent = !throttleTimeout;\r\n\t\t    if(shouldHandleEvent) \r\n\t\t    {\r\n\t\t    \tvar func = function()\r\n\t\t    \t{\r\n\t\t    \t\tthrottleTimeout = null;\r\n\t\t    \t\tif(storedEvent) \r\n\t\t    \t\t{\r\n\t\t    \t\t\tthrottleHandler(storedEvent);\r\n\t\t    \t\t}\r\n\t\t    \t};\r\n\t\t    \tcallback(storedEvent);\r\n\t\t    \tstoredEvent = null;\r\n\t\t    \tthrottleTimeout = setTimeout(func,timeout);\r\n\t\t    }\r\n\t\t};\r\n\t\treturn throttleHandler;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.highlightText = function(container,searchText,styleClass,doc) \r\n\t{\r\n\t\tdoc = this.getDoc(doc);\r\n\t\tfunction innerHighlight(node,text,styleClass) \r\n\t\t{\r\n\t\t\t  var skip = 0;\r\n\t\t\t  if (node.nodeType == 3) \r\n\t\t\t  {\r\n\t\t\t\t   var position = node.data.toUpperCase().indexOf(text);\r\n\t\t\t\t   position -= (node.data.substr(0, position).toUpperCase().length - node.data.substr(0, position).length);\r\n\t\t\t\t   if (position >= 0) \r\n\t\t\t\t   {\r\n\t\t\t\t\t\tvar spannode = doc.createElement(\"span\");\r\n\t\t\t\t\t\tspannode.className = styleClass;\r\n\t\t\t\t\t\tvar middlebit = node.splitText(position);\r\n\t\t\t\t\t\tvar endbit = middlebit.splitText(text.length);\r\n\t\t\t\t\t\tvar middleclone = middlebit.cloneNode(true);\r\n\t\t\t\t\t\tspannode.appendChild(middleclone);\r\n\t\t\t\t\t\tmiddlebit.parentNode.replaceChild(spannode, middlebit);\r\n\t\t\t\t\t\tskip = 1;\r\n\t\t\t\t   }\r\n\t\t\t  }\r\n\t\t\t  else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) \r\n\t\t\t  {\r\n\t\t\t\t   for (var count = 0; count < node.childNodes.length; ++count) \r\n\t\t\t\t   {\r\n\t\t\t\t\t\tcount += innerHighlight(node.childNodes[count], text,styleClass);\r\n\t\t\t\t   }\r\n\t\t\t  }\r\n\t\t\t  return skip;\r\n\t\t}\r\n\t\tif(container && searchText)\r\n\t\t{\r\n\t\t\tif(!styleClass)\r\n\t\t\t{\r\n\t\t\t\tstyleClass = \"nsTextHighlight\";\r\n\t\t\t}\r\n\t\t\tvar util = new NSUtil();\r\n\t\t\tif(util.isArray(searchText))\r\n\t\t\t{\r\n\t\t\t\t for (var count = 0; count < searchText.length; count++) \r\n\t\t\t\t {\r\n\t\t\t\t\t innerHighlight(container,searchText[count].toUpperCase(),styleClass);\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\tinnerHighlight(container,searchText.toUpperCase(),styleClass);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t}\r\n\t};\r\n\t\r\n\tNSUtil.prototype.unHighlightText = function(container,styleClass) \r\n\t{\r\n\t\tif(container)\r\n\t\t{\r\n\t\t\tif(!styleClass)\r\n\t\t\t{\r\n\t\t\t\tstyleClass = \"nsTextHighlight\";\r\n\t\t\t}\r\n\t\t\tvar arrHighlight = container.querySelectorAll(\"span.\" + styleClass); \r\n\t\t\tif(arrHighlight && arrHighlight.length > 0)\r\n\t\t\t{\r\n\t\t\t\tvar elementHighlight = null;\r\n\t\t\t\tvar length = arrHighlight.length;\r\n\t\t\t\tfor(var count = 0;count < length;count++)\r\n\t\t\t\t{\r\n\t\t\t\t\telementHighlight = arrHighlight[count];\r\n\t\t\t\t\tif(elementHighlight)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\telementHighlight.parentNode.replaceChild(elementHighlight.firstChild, elementHighlight);\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\t\r\n\t var falseExpression = /^(?:f(?:alse)?|no?|0+)$/i;\r\n\t Boolean.parse = function(value) \r\n\t { \r\n\t    return !falseExpression.test(value) && !!value;\r\n\t };\r\n\t\r\n\t//Defining the indexOf function (before you call it!) if it doesn't exist taken from MDN (for Internet Explorer 8 and below)\r\n\tif (!Array.prototype.indexOf)\r\n\t{\r\n\t   Array.prototype.indexOf = function (searchElement /*, fromIndex */ )\r\n\t   {\r\n\t     'use strict';\r\n\t     if (this == null)\r\n\t     {\r\n\t       throw new TypeError();\r\n\t     }\r\n\t     var n, k, t = Object(this),\r\n\t         len = t.length >>> 0;\r\n\t     if (len === 0)\r\n\t     {\r\n\t       return -1;\r\n\t     }\r\n\t     n = 0;\r\n\t     if (arguments.length > 1) \r\n\t     {\r\n\t       n = Number(arguments[1]);\r\n\t       if (n != n)\r\n\t       { // shortcut for verifying if it's NaN\r\n\t         n = 0;\r\n\t       }\r\n\t       else if (n != 0 && n != Infinity && n != -Infinity)\r\n\t       {\r\n\t         n = (n > 0 || -1) * Math.floor(Math.abs(n));\r\n\t       }\r\n\t     }\r\n\t     if (n >= len)\r\n\t     {\r\n\t       return -1;\r\n\t     }\r\n\t     for (k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); k < len; k++)\r\n\t     {\r\n\t       if (k in t && t[k] === searchElement)\r\n\t       {\r\n\t         return k;\r\n\t       }\r\n\t     }\r\n\t     return -1;\r\n\t   };\r\n\t}\r\n\t\r\n\t//JavaScript Array filter\r\n\tif (!Array.prototype.filter) \r\n\t{\r\n\t    Array.prototype.filter = function(fun /*, thisp*/) \r\n\t    {\r\n\t        var len = this.length >>> 0;\r\n\t        if (typeof fun != \"function\") \r\n\t        {\r\n\t            throw new TypeError();\r\n\t        }\r\n\t        var res = [];\r\n\t        var thisp = arguments[1];\r\n\t        for (var count = 0; count < len; count++) \r\n\t        {\r\n\t            if (count in this) \r\n\t            {\r\n\t                var val = this[count]; // in case fun mutates this\r\n\t                if (fun.call(thisp, val, count, this)) \r\n\t                {\r\n\t                    res.push(val);\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t\r\n\t        return res;\r\n\t    };\r\n\t}\r\n\t\r\n\tif (!String.prototype.replaceAll) \r\n\t{\r\n\t\tString.prototype.replaceAll = function(character,replaceChar)\r\n\t\t{\r\n\t\t    var word = this.valueOf();\r\n\t\t    while(word.indexOf(character) != -1)\r\n\t\t    {\r\n\t\t    \tword = word.replace(character,replaceChar);\r\n\t\t    }\r\n\t\t    return word;\r\n\t\t};\r\n\t}\r\n\t\r\n\tif (!HTMLTableRowElement.prototype.update) \r\n\t{\r\n\t\tHTMLTableRowElement.prototype.update = function()\r\n\t\t{\r\n\t\t\tvar util = new NSUtil();\r\n\t\t\tvar grid = util.findParent(this,\"ns-grid\");\r\n\t\t\tif(grid)\r\n\t\t\t{\r\n\t\t\t\tgrid.updateRow(parseInt(this.getAttribute(\"index\")));\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\t\r\n\t//From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys\r\n\tif (!Object.keys) \r\n\t{\r\n\t  Object.keys = (function() {\r\n\t    'use strict';\r\n\t    var hasOwnProperty = Object.prototype.hasOwnProperty,\r\n\t        hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),\r\n\t        dontEnums = [\r\n\t          'toString',\r\n\t          'toLocaleString',\r\n\t          'valueOf',\r\n\t          'hasOwnProperty',\r\n\t          'isPrototypeOf',\r\n\t          'propertyIsEnumerable',\r\n\t          'constructor'\r\n\t        ],\r\n\t        dontEnumsLength = dontEnums.length;\r\n\t\r\n\t    return function(obj) {\r\n\t      if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\r\n\t        throw new TypeError('Object.keys called on non-object');\r\n\t      }\r\n\t\r\n\t      var result = [];\r\n\t\r\n\t      for (var prop in obj) {\r\n\t        if (hasOwnProperty.call(obj, prop)) {\r\n\t          result.push(prop);\r\n\t        }\r\n\t      }\r\n\t\r\n\t      if (hasDontEnumBug) {\r\n\t        for (var i = 0; i < dontEnumsLength; i++) {\r\n\t          if (hasOwnProperty.call(obj, dontEnums[i])) {\r\n\t            result.push(dontEnums[i]);\r\n\t          }\r\n\t        }\r\n\t      }\r\n\t      return result;\r\n\t    };\r\n\t  }());\r\n\t}\r\n\t\r\n\t//https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find\r\n\tif (!Array.prototype.find) \r\n\t{\r\n\t\t  Array.prototype.find = function(predicate) \r\n\t\t  {\r\n\t\t    if (this === null) {\r\n\t\t      throw new TypeError('Array.prototype.find called on null or undefined');\r\n\t\t    }\r\n\t\t    if (typeof predicate !== 'function') {\r\n\t\t      throw new TypeError('predicate must be a function');\r\n\t\t    }\r\n\t\t    var list = Object(this);\r\n\t\t    var length = list.length >>> 0;\r\n\t\t    var thisArg = arguments[1];\r\n\t\t    var value;\r\n\t\t\r\n\t\t    for (var i = 0; i < length; i++) {\r\n\t\t      value = list[i];\r\n\t\t      if (predicate.call(thisArg, value, i, list)) {\r\n\t\t        return value;\r\n\t\t      }\r\n\t\t    }\r\n\t\t    return undefined;\r\n\t\t  };\r\n\t}\r\n\t\r\n\t//https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex\r\n\tif (!Array.prototype.findIndex) \r\n\t{\r\n\t\t  Array.prototype.findIndex = function(predicate) {\r\n\t\t    if (this === null) {\r\n\t\t      throw new TypeError('Array.prototype.findIndex called on null or undefined');\r\n\t\t    }\r\n\t\t    if (typeof predicate !== 'function') {\r\n\t\t      throw new TypeError('predicate must be a function');\r\n\t\t    }\r\n\t\t    var list = Object(this);\r\n\t\t    var length = list.length >>> 0;\r\n\t\t    var thisArg = arguments[1];\r\n\t\t    var value;\r\n\t\r\n\t\t    for (var i = 0; i < length; i++) {\r\n\t\t      value = list[i];\r\n\t\t      if (predicate.call(thisArg, value, i, list)) {\r\n\t\t        return i;\r\n\t\t      }\r\n\t\t    }\r\n\t\t    return -1;\r\n\t\t  };\r\n\t}\r\n\t\r\n\tif (!Array.from) \r\n\t{\r\n\t    Array.from = function (object) \r\n\t    {\r\n\t        return [].slice.call(object);\r\n\t    };\r\n\t}\r\n\t\r\n\tif (!String.prototype.format) \r\n\t{\r\n\t\tString.prototype.format = function()\r\n\t\t{\r\n\t\t   var content = this;\r\n\t\t   for (var i=0; i < arguments.length; i++)\r\n\t\t   {\r\n\t\t        var replacement = '{' + (i + 1) + '}';\r\n\t\t        content = content.replace(replacement, arguments[i]);  \r\n\t\t   }\r\n\t\t   return content;\r\n\t\t};\r\n\t};\r\n\t\r\n\t\r\n\tNSUtil.prototype.defaultRenderer = function(doc)\r\n\t{\r\n\t\tthis.util = new NSUtil();\r\n\t\tdoc = this.util.getDoc(doc);\r\n\t\tthis.divItemRenderer = null;\r\n\t\t\r\n\t\tthis.getRenderer = function()\r\n\t\t{\r\n\t\t\tif(!this.divItemRenderer)\r\n\t\t\t{\r\n\t\t\t\tthis.__createComponents();\r\n\t\t\t}\r\n\t\t\treturn this.divItemRenderer;\r\n\t\t};\r\n\t\t\r\n\t\tthis.setData = function(renderer,item,labelField)\r\n\t\t{\r\n\t\t\tif(renderer)\r\n\t\t\t{\r\n\t\t\t\tif(item && item[labelField])\r\n\t\t\t\t{\r\n\t\t\t\t\trenderer.rendererBody.rendererLabel.innerHTML = item[labelField];\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.clearData(renderer);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t};\r\n\t\t\r\n\t\tthis.clearData = function(renderer)\r\n\t\t{\r\n\t\t\tif(renderer)\r\n\t\t\t{\r\n\t\t\t\trenderer.rendererBody.rendererLabel.innerHTML = \"\";\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\tthis.__createComponents = function()\r\n\t\t{\r\n\t\t\tthis.divItemRenderer = this.util.createDiv(null,\"nsListRenderer\"); \r\n\t\t\t//this.divItemRenderer.style.height = 20 + \"px\";\r\n\t\t\tthis.divItemRenderer.style.padding = 1 + \"px\";\r\n\t\t\tthis.divItemRenderer.setAttribute(\"accessor-name\",\"rendererBody\"); \r\n\t\t\tvar lblItemRenderer = doc.createElement(\"LABEL\");\r\n\t\t\tlblItemRenderer.setAttribute(\"accessor-name\",\"rendererLabel\");\r\n\t\t\tthis.divItemRenderer.appendChild(lblItemRenderer);\r\n\t\t};\r\n\t};\r\n\t\r\n\tNSUtil.prototype.fadeIn = function(element,displayType,callback,win)\r\n\t{\r\n\t\tif(element)\r\n\t\t{\r\n\t\t\twin = this.getWin(win);\r\n\t\t\tvar util = this;\r\n\t\t\telement.style.opacity = 0;\r\n\t\t\telement.style.display = displayType || \"block\";\r\n\t\t\t(function fade() \r\n\t\t\t {\r\n\t\t\t    var value = parseFloat(element.style.opacity);\r\n\t\t\t    if (!((value += .1) > 1)) \r\n\t\t\t    {\r\n\t\t\t    \telement.style.opacity = value;\r\n\t\t\t    \tutil.getRequestAnimationFrame.bind(win)(fade.bind(util));\r\n\t\t\t    }\r\n\t\t\t    else\r\n\t\t\t    {\r\n\t\t\t    \tif(callback)\r\n\t\t\t      \t{\r\n\t\t\t    \t\tcallback(element);\r\n\t\t\t      \t}\r\n\t\t\t    }\r\n\t\t\t })();\r\n\t\t}\r\n\t};\r\n\t\r\n\tNSUtil.prototype.fadeOut = function(element,callback,win)\r\n\t{\r\n\t\tif(element)\r\n\t\t{\r\n\t\t\tvar util = this;\r\n\t\t\twin = this.getWin(win);\r\n\t\t\telement.style.opacity = 1;\r\n\t\t\t(function fade() \r\n\t\t\t{\r\n\t\t\t    if((element.style.opacity -= .1) < 0) \r\n\t\t\t    {\r\n\t\t\t      element.style.display = \"none\";\r\n\t\t\t      if(callback)\r\n\t\t\t      {\r\n\t\t\t    \t  callback(element);\r\n\t\t\t      }\r\n\t\t\t    } \r\n\t\t\t    else \r\n\t\t\t    {\r\n\t\t\t    \tutil.getRequestAnimationFrame.bind(win)(fade.bind(util));\r\n\t\t\t    }\r\n\t\t\t})();\r\n\t\t}\r\n\t};\r\n\t\r\n\tNSUtil.prototype.addAnimatedLineOnHover = function(element,config)\r\n\t{\r\n\t\tif(element)\r\n\t\t{\r\n\t\t\tif(!config)\r\n\t\t\t{\r\n\t\t\t\tconfig = {};\r\n\t\t\t}\r\n\t\t\tvar setting = {\r\n\t\t\t\t\tlineWidth : (config.lineWidth) ? config.lineWidth : element.offsetWidth,\r\n\t\t\t\t\tlineHeight : (config.lineHeight) ? config.lineHeight : 5,\r\n\t\t\t\t\tlineColor : (config.lineColor) ? config.lineColor : \"black\",\r\n\t\t\t\t\toffsetX : (config.offsetX) ? config.offsetX : 0,\r\n\t\t\t\t\toffsetY : (config.offsetY) ? config.offsetY : 0,\r\n\t\t\t};\r\n\t\t\tvar offset = this.getCumulativeOffset(element);\r\n\t\t\tvar id = element.getAttribute(\"id\");\r\n\t\t\tif(!id)\r\n\t\t\t{\r\n\t\t\t\tid = this.getUniqueId();\r\n\t\t\t}\r\n\t\t\tvar styleName = \"ns\" + id + \"line\";\r\n\t\t\tthis.addCSSClassInDOM([\".\" + styleName + \":after\"],[\"content: '';position: absolute;height: \" + setting.lineHeight + \"px;width: 0%;left: \" + (offset.x + setting.offsetX) + \"px;\" +\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"top: \" + (offset.y + element.offsetHeight + setting.offsetY) + \"px;\" +\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"background-color: \" + setting.lineColor + \";-webkit-transition: width 200ms ease-in;transition: width 200ms ease-in;\"]);\r\n\t\t\tthis.addCSSClassInDOM([\".\" + styleName + \":hover:after\"],[\"width:\" + setting.lineWidth + \"px;\"]);\r\n\t\t\tthis.addStyleClass(element,styleName);\r\n\t\t}\r\n\t};\r\n\t\r\n\tNSUtil.prototype.getTextBetweenSymbol = function(strText,startSymbol,endSymbol)\r\n\t{\r\n\t\tvar arrReturn = null;\r\n\t\tif(strText)\r\n\t\t{\r\n\t\t\tif(!startSymbol)\r\n\t\t\t{\r\n\t\t\t\tstartSymbol = \"{{\";\r\n\t\t\t}\r\n\t\t\tif(!endSymbol)\r\n\t\t\t{\r\n\t\t\t\tendSymbol = \"}}\";\r\n\t\t\t}\r\n\t\t\tvar regexString = \"\\\\\" + startSymbol + \"([^\" + endSymbol + \"]+)\\\\\" + endSymbol;\r\n\t\t\tvar regex = new RegExp(regexString,\"g\");\r\n\t\t\tvar arrMatches = strText.match(regex);\r\n\t\t\tif(arrMatches && arrMatches.length > 0)\r\n\t\t\t{\r\n\t\t\t\tarrReturn = [];\r\n\t\t\t\tvar length = arrMatches.length;\r\n\t\t\t\tvar subStrLength = startSymbol.length;\r\n\t\t\t\tfor (var count = 0; count < length; count++) \r\n\t\t\t\t{\r\n\t\t\t\t    var match = arrMatches[count];\r\n\t\t\t\t    arrReturn.push(match.substring(subStrLength,match.length - subStrLength));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn arrReturn;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.isBinary = function(str) \r\n\t{\r\n\t\tvar isBuffer = (typeof Buffer == 'undefined')? false : Buffer.isBuffer(str);\r\n\t\tfor (var count = 0;count < 24;count++) \r\n\t\t{\r\n\t\t\tvar charCode = isBuffer ? str[count] : str.charCodeAt(count);\r\n\t\t\tif (charCode === 65533 || charCode <= 8) \r\n\t\t\t{\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.resolveFunctionOrPromise = function(obj,callback)\r\n\t{\r\n\t\tif(obj)\r\n\t\t{\r\n\t\t\t//if(Object.prototype.toString.call(obj) === \"[object Promise]\")\r\n\t\t\tif (obj instanceof Promise && typeof obj.then === 'function')\r\n\t\t\t{\r\n\t\t\t\tobj.then(function(objRef){\r\n\t\t\t\t\tcallback.apply(null,[objRef]);\r\n                });\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tcallback.apply(null,[obj]);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tcallback();\r\n\t\t}\r\n\t};\r\n\t\r\n\t//from https://github.com/sindresorhus/is-svg/blob/master/index.js\r\n\tNSUtil.prototype.isSVGString = function(str) \r\n\t{\r\n\t\tif(str)\r\n\t\t{\r\n\t\t\tvar cleanEntities = function(svg)\r\n\t\t\t{\r\n\t\t\t\tvar entityRegex = /\\s*<!Entity\\s+\\S*\\s*(?:\"|')[^\"]+(?:\"|')\\s*>/img;\r\n\t\t\t\treturn svg.replace(entityRegex, '');\r\n\t\t\t};\r\n\t\t\tvar commentRegex = /<!--([\\s\\S]*?)-->/g;\r\n\t\t\tvar regex = /^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<!doctype svg[^>]*\\s*(?:\\[?(?:\\s*<![^>]*>\\s*)*\\]?)*[^>]*>\\s*)?(?:<svg[^>]*>[^]*<\\/svg>|<svg[^/>]*\\/\\s*>)\\s*$/i;\r\n\t\t\tvar isSvg = Boolean(str) && !this.isBinary(str) && regex.test(cleanEntities(str.toString()).replace(commentRegex,\"\"));\r\n\t\t\treturn isSvg;\r\n\t\t}\r\n\t\treturn false;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.isBase64String = function(str) \r\n\t{\r\n\t\tif(str)\r\n\t\t{\r\n\t\t\tvar regex = /^\\s*data:([a-z]+\\/[a-z]+(;[a-z\\-]+\\=[a-z\\-]+)?)?(;base64)?,[a-z0-9\\!\\$\\&\\'\\,\\(\\)\\*\\+\\,\\;\\=\\-\\.\\_\\~\\:\\@\\/\\?\\%\\s]*\\s*$/i;\r\n\t\t\treturn !!str.match(regex);\r\n\t\t}\r\n\t\treturn false;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.convertSvgToBase64 = function(svgText,callback,doc) \r\n\t{\r\n\t   if(svgText)\r\n\t   {\r\n\t\t   doc = this.getDoc(doc);\r\n\t\t   var svg = null;\r\n\t\t   if(svgText instanceof SVGElement) \r\n\t\t   {\r\n\t\t\t   svg = svgText;\r\n\t\t   }\r\n\t\t   else\r\n\t\t   {\r\n\t\t\t   var span = doc.createElement(\"span\");\r\n\t\t\t   span.innerHTML = svgText;\r\n\t\t\t   doc.body.appendChild(span);\r\n\t\t\t   svg = span.children[0];\r\n\t\t\t   doc.body.removeChild(span);\r\n\t\t   }\r\n\t\t   var canvas = doc.createElement(\"canvas\");\r\n\t\t   canvas.width = svg.getBoundingClientRect().width;\r\n\t       canvas.height = svg.getBoundingClientRect().height;\r\n\t       doc.body.appendChild(canvas);\r\n\t       var svgXml = (new XMLSerializer()).serializeToString(svg);\r\n\t       var ctx = canvas.getContext('2d');\r\n\t       var img = new Image();\r\n\t       img.onload = function() \r\n\t       {\r\n\t            ctx.drawImage(img, 0, 0);\r\n\t       };\r\n\t       img.src = 'data:image/svg+xml;base64,' + btoa(svgXml);\r\n\t       var base64 = img.src;\r\n\t       //to handle the callback inside onload of img\r\n\t       if(callback)\r\n\t       {\r\n\t    \t   callback(base64);\r\n\t       }\r\n\t       doc.body.removeChild(canvas);\r\n\t\t   return base64;\r\n\t   }\r\n\t   return null;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.convertImageToBase64 = function(src,forceCloneImg,crossOrigin,doc) \r\n\t{\r\n\t\tif(src)\r\n\t\t{\r\n\t\t   doc = this.getDoc(doc);\r\n\t\t   var img = null;\r\n\t\t   var origImg = null;\r\n\t\t   var isAdded = false;\r\n\t\t   var dataURL = null;\r\n\t\t   if(this.isElement(src) && this.isElementOfType(src,\"img\") && !forceCloneImg) \r\n\t\t   {\r\n\t\t\t   img = src;\r\n\t\t   }\r\n\t\t   else\r\n\t\t   {\r\n\t\t\t   if(this.isElement(src) && this.isElementOfType(src,\"img\") && forceCloneImg) \r\n\t\t\t   {\r\n\t\t\t\t   origImg = src;\r\n\t\t\t\t   crossOrigin = (this.isUndefinedOrNull(crossOrigin) && origImg.hasAttribute(\"crossOrigin\")) ? origImg.getAttribute(\"crossOrigin\") : null;\r\n\t\t\t\t   src = origImg.getAttribute(\"src\");\r\n\t\t\t   }\r\n\t\t\t   img = doc.createElement(\"img\");\r\n\t\t\t   this.css(img,{position: \"absolute\",left: \"-9999px\",top: \"-9999px\"});\r\n\t\t\t   img.setAttribute(\"src\", src);\r\n\t\t\t   if(crossOrigin)\r\n\t\t\t   {\r\n\t\t\t\t   img.setAttribute(\"crossOrigin\",crossOrigin);\r\n\t\t\t   }\r\n\t\t\t   doc.body.appendChild(img);\r\n\t\t\t   isAdded = true;\r\n\t\t   }\r\n\t\t   var self = this;\r\n\t\t   var objPromise = new Promise(function(resolve,reject)\r\n\t\t   {\r\n\t\t\t   var callCallback = function()\r\n\t\t\t   {\r\n\t\t\t\t   var canvas = doc.createElement(\"canvas\");\r\n\t\t\t\t   canvas.width = (origImg && origImg.width) ? origImg.width : img.width;\r\n\t\t\t       canvas.height = (origImg && origImg.height) ? origImg.height :img.height;\r\n\t\t\t       doc.body.appendChild(canvas);\r\n\t\t\t       var ctx = canvas.getContext('2d');\r\n\t\t\t       ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\t\t\t       ctx.drawImage(img, 0, 0);\r\n\t\t\t       var hasError = false;\r\n\t\t\t       var errorDetails = null;\r\n\t\t\t       //mainly for Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.\r\n\t\t\t       try\r\n\t\t\t       {\r\n\t\t\t    \t   dataURL = canvas.toDataURL();\r\n\t\t\t       }\r\n\t\t\t       catch(error)\r\n\t\t\t       {\r\n\t\t\t    \t   hasError = true;\r\n\t\t\t    \t   errorDetails = error;\r\n\t\t\t       }\r\n\t\t\t\t   doc.body.removeChild(canvas);\r\n\t\t\t\t   if(dataURL != \"data:,\" || hasError)\r\n\t\t\t\t   {\r\n\t\t\t\t       if(isAdded)\r\n\t\t\t\t       {\r\n\t\t\t\t    \t   if(img && img.parentNode)\r\n\t\t\t\t\t       {\r\n\t\t\t\t    \t\t   img.parentNode.removeChild(img);\r\n\t\t\t\t\t       }\r\n\t\t\t\t       }\r\n\t\t\t\t       resolve({base64:dataURL,param:src,hasError: hasError,errorDetails: errorDetails});\r\n\t\t\t\t   }\r\n\t\t\t   };\r\n\t\t\t   img.onload = function() \r\n\t\t       {\r\n\t\t\t\t   callCallback();\r\n\t\t       };\r\n\t\t       callCallback();\r\n\t\t   });\r\n\t\t   return objPromise;\r\n\t\t}\r\n\t\treturn null;\t\r\n\t};\r\n\t\r\n\t//Converts rgba text representation of color in hex\r\n\tNSUtil.prototype.colorToHex = function (color)\r\n\t{\r\n\t\tif (color === 'rgba(0, 0, 0, 0)' || color == '') \r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tif (!color) \r\n\t\t{\r\n\t\t\treturn '#000000';\r\n\t\t}\r\n\t\tif (color.substr(0, 1) === '#') \r\n\t\t{\r\n\t\t\treturn color;\r\n\t\t}\r\n\t\tvar digits = /([\\s\\n\\t\\r]*?)rgb\\((\\d+), (\\d+), (\\d+)\\)/.exec(color) || /([\\s\\n\\t\\r]*?)rgba\\((\\d+), (\\d+), (\\d+), ([\\d.]+)\\)/.exec(color);\r\n\t\tif (!digits) \r\n\t\t{\r\n\t\t\treturn '#000000';\r\n\t\t}\r\n\t\tvar red = parseInt(digits[2],10);\r\n\t\tvar green = parseInt(digits[3],10);\r\n\t\tvar blue = parseInt(digits[4],10);\r\n\t\tvar rgb = blue | (green << 8) | (red << 16);\r\n\t\tvar hex = rgb.toString(16).toUpperCase();\r\n\t\twhile (hex.length < 6) \r\n\t\t{\r\n\t\t\thex = '0' + hex;\r\n\t\t}\r\n\t\treturn digits[1] + '#' + hex;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.groupCollection = function(dataSource,setting)\r\n\t{\r\n\t\tthis.__dataSource = dataSource;\r\n\t\tthis.__util = new NSUtil();\r\n\t\tthis.__childField = null;\r\n\t\tthis.__parentLevelIndicatorField = null;\r\n\t\tthis.__isSingleLevel = true;\r\n\t\tthis.__groupField = null;\r\n\t\tthis.__childrenCountField = null;\r\n\t\tif(setting)\r\n\t\t{\r\n\t\t\tthis.__childField = setting[\"childField\"];\r\n\t\t\tthis.__parentLevelIndicatorField = setting[\"parentLevelIndicatorField\"];\r\n\t\t\tthis.__isSingleLevel = setting[\"isSingleLevel\"];\r\n\t\t\tthis.__groupField = setting[\"groupField\"];\r\n\t\t\tthis.__childrenCountField = setting[\"childrenCountField\"];\r\n\t\t}\r\n\t\tif(!this.__childField)\r\n\t\t{\r\n\t\t\tthis.__childField = \"children\";\r\n\t\t}\r\n\t\tif(!this.__parentLevelIndicatorField)\r\n\t\t{\r\n\t\t\tthis.__parentLevelIndicatorField = \"ns-IsParent\";\r\n\t\t}\r\n\t\tif(this.__util.isUndefined(this.__isSingleLevel))\r\n\t\t{\r\n\t\t\tthis.__isSingleLevel = true;\r\n\t\t}\r\n\t\tif(!this.__groupField)\r\n\t\t{\r\n\t\t\tthis.__groupField = \"nsGroup\";\r\n\t\t}\r\n\t\tif(!this.__childrenCountField)\r\n\t\t{\r\n\t\t\tthis.__childrenCountField = \"nsChildrenCountField\";\r\n\t\t}\r\n\t\tthis.groupBy = function(arrGroupField)\r\n\t\t{\r\n\t\t\tvar arrResult = this.__dataSource;\r\n\t  \t    if(arrGroupField && arrGroupField.length > 0)\r\n\t  \t    {\r\n\t  \t    \tif(this.__isSingleLevel)\r\n\t  \t    \t{\r\n\t  \t    \t\tarrResult = this.__groupByFieldOnSingleLevel(this.__dataSource,arrGroupField);\r\n\t  \t    \t}\r\n\t  \t    \telse\r\n\t  \t    \t{\r\n\t  \t    \t\tarrResult = this.__groupByFieldOnMultiLevel(this.__dataSource,arrGroupField);\r\n\t  \t    \t}\r\n\t  \t    \t\r\n\t  \t    }\r\n\t  \t    return arrResult;\r\n\t\t};\r\n\t\t\r\n\t\tthis.__groupByFieldOnSingleLevel = function(list,arrGroupField)\r\n\t\t{\r\n\t\t\tvar groups = {};\r\n\t\t\tif(list)\r\n\t\t\t{\r\n\t\t\t\tfor (var count = 0; count < list.length; count++) \r\n\t\t  \t    {\r\n\t\t  \t    \tvar item = list[count];\r\n\t\t  \t    \tvar arrItems = this.__getGroupItemValues(item,arrGroupField);\r\n\t\t  \t        var group = JSON.stringify(arrItems);\r\n\t\t  \t        if (group in groups) \r\n\t\t  \t        {\r\n\t\t  \t            groups[group][this.__childField].push(item); \r\n\t\t  \t        } \r\n\t\t  \t        else \r\n\t\t  \t        {\r\n\t\t  \t        \tvar objEmpty = this.__createEmptyItem(list[count]);\r\n\t\t  \t        \tobjEmpty[this.__parentLevelIndicatorField] = true;\r\n\t\t  \t        \tfor(var fieldCount = 0;fieldCount < arrGroupField.length;fieldCount++)\r\n\t\t  \t    \t\t{\r\n\t\t  \t        \t\tvar fieldName = arrGroupField[fieldCount];\r\n\t\t  \t        \t\tobjEmpty[fieldName] = item[fieldName];\r\n\t\t  \t    \t\t}\r\n\t\t  \t        \tobjEmpty[this.__childField] = [];\r\n\t\t  \t        \tobjEmpty[this.__childField].push(item); \r\n\t\t  \t            groups[group] = objEmpty;\r\n\t\t  \t        }\r\n\t\t  \t    }\r\n\t\t\t}\r\n\t  \t    return this.__arrayFromObject(groups);\r\n\t\t};\r\n\t\t\r\n\t\tthis.__getGroupItemValues = function(item,arrGroupField)\r\n\t\t{\r\n\t\t\tvar arrResult = [];\r\n\t\t\tif(item && arrGroupField && arrGroupField.length > 0)\r\n\t    \t{\r\n\t    \t\tfor(var count = 0;count < arrGroupField.length;count++)\r\n\t    \t\t{\r\n\t    \t\t\tvar fieldValue = item[arrGroupField[count]];\r\n\t    \t\t\tif(!this.__util.isUndefined(fieldValue) && fieldValue != null)\r\n\t    \t\t\t{\r\n\t    \t\t\t\tarrResult.push(fieldValue);\r\n\t    \t\t\t}\r\n\t    \t\t}\r\n\t    \t}\r\n\t\t\treturn arrResult;\r\n\t\t};\r\n\t\t\r\n\t\tthis.__groupByFieldOnMultiLevel = function(list,arrGroupField)\r\n\t\t{\r\n\t\t\tvar arrSource = list;\r\n\t\t\tfor(var fieldCount = 0;fieldCount < arrGroupField.length;fieldCount++)\r\n\t  \t\t{\r\n\t      \t\tvar fieldName = arrGroupField[fieldCount];\r\n\t      \t\tarrSource = this.__groupByField(arrSource,fieldName);\r\n\t  \t\t}\r\n\t\t\treturn arrSource;\r\n\t\t};\r\n\t\t\r\n\t\tthis.__groupByField = function(source,field)\r\n\t\t{\r\n\t\t\tvar arrReturn = [];\r\n\t\t\tif(source && field)\r\n\t\t\t{\r\n\t\t\t\tvar groups = {};\r\n\t\t\t\tfor (var count = 0; count < source.length; count++) \r\n\t\t  \t    {\r\n\t\t\t\t\tvar item = source[count];\r\n\t\t\t\t\tif(item.hasOwnProperty(this.__childField) && item[this.__childField].length > 0)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tvar arrChildren = this.__groupByField(item[this.__childField],field);\r\n\t\t\t\t\t\tif(arrChildren && arrChildren.length > 0)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\titem[this.__childField] = arrChildren;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tarrReturn.push(item);\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\tvar group = item[field];\r\n\t\t\t\t\t\tif (group in groups) \r\n\t\t\t  \t        {\r\n\t\t\t  \t            groups[group][this.__childField].push(item); \r\n\t\t\t  \t            groups[group][this.__childrenCountField] += 1;\r\n\t\t\t  \t        } \r\n\t\t\t  \t        else \r\n\t\t\t  \t        {\r\n\t\t\t  \t        \tvar objEmpty = this.__createEmptyItem(item);\r\n\t\t\t  \t        \tobjEmpty[this.__parentLevelIndicatorField] = true;\r\n\t\t\t  \t        \tobjEmpty[field] = item[field];\r\n\t\t\t  \t        \tobjEmpty[this.__groupField] = item[field];\r\n\t\t\t  \t        \tobjEmpty[this.__childField] = [];\r\n\t\t\t  \t        \tobjEmpty[this.__childField].push(item);\r\n\t\t\t  \t        \tobjEmpty[this.__childrenCountField] = 1;\r\n\t\t\t  \t            groups[group] = objEmpty;\r\n\t\t\t  \t        }\r\n\t\t\t\t\t}\r\n\t\t  \t    }\r\n\t\t\t\tif(groups)\r\n\t\t\t\t{\r\n\t\t\t\t\tvar arrChild = this.__arrayFromObject(groups);\r\n\t\t\t\t\tif(arrChild && arrChild.length > 0)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfor (var childCount = 0; childCount < arrChild.length; childCount++) \r\n\t\t\t\t  \t    {\r\n\t\t\t\t\t\t\tarrReturn.push(arrChild[childCount]);\r\n\t\t\t\t  \t    }\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn arrReturn;\r\n\t\t};\r\n\t\t\r\n\t\tthis.__arrayFromObject = function(objArr)\r\n\t\t{\r\n\t\t\tvar arr = [];\r\n\t\t\tif(objArr)\r\n\t\t\t{\r\n\t\t\t\tfor (var count in objArr) \r\n\t\t  \t    {\r\n\t\t  \t        arr.push(objArr[count]);\r\n\t\t  \t    }\r\n\t\t\t}\r\n\t  \t    return arr;\r\n\t\t};\r\n\t\t\r\n\t\tthis.__createEmptyItem = function(objSource)\r\n\t  \t{\r\n\t  \t\tvar objCopy = {};\r\n\t  \t\tif (objSource instanceof Object) \r\n\t  \t\t{\r\n\t  \t        for (var attr in objSource) \r\n\t  \t        {\r\n\t  \t            if (objSource.hasOwnProperty(attr))\r\n\t  \t            {\r\n\t  \t            \tobjCopy[attr] = null;\r\n\t  \t            }\r\n\t  \t        }\r\n\t  \t    }\r\n\t  \t\treturn objCopy;\r\n\t  \t};\r\n\t};\r\n\t\r\n\t/** Explaination http://javascript.info/tutorial/animation of animation .. not the code **/\r\n\tNSUtil.prototype.animation = function(element,arrOptions,win)\r\n\t{\r\n\t\tthis.__element = element;\r\n\t\tthis.__arrOptions = arrOptions;\r\n\t\tthis.__util = new NSUtil();\r\n\t\tthis.win = this.__util.getWin(win);\r\n\t\t\r\n\t\tthis.__duration = 0;\r\n\t\tthis.__currentOption = null;\r\n\t\tthis.__currentStart = 0;\r\n\t\tthis.__currentEnd = 0;\r\n\t\t\r\n\t\tthis.animate = function()\r\n\t\t{\r\n\t\t\tif(this.__element)\r\n\t\t\t{\r\n\t\t\t\tthis.__run();\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tthis.__util.warning(\"NSAnimation\",\"The element is not valid\");\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\tthis.__run = function() \r\n\t\t{\r\n\t\t    var current = new Date();\r\n\t\t    var remaining = this.__currentEnd - current;\r\n\t\t    if(remaining < this.__util.ANIMATIONDELAY) \r\n\t\t    {\r\n\t\t\t      if(this.__currentOption) \r\n\t\t\t      {\r\n\t\t\t    \t  this.__step(1);  //1 = progress is at 100%\r\n\t\t\t    \t  if(this.__currentOption.animationCompleteHandler)\r\n\t\t\t    \t  {\r\n\t\t\t    \t\t  this.__currentOption.animationCompleteHandler(this.__currentOption);\r\n\t\t\t    \t  }\r\n\t\t\t      }\r\n\t\t\t      this.__currentOption = this.__arrOptions.shift();  //get the next item\r\n\t\t\t      if(this.__currentOption) \r\n\t\t\t      {\r\n\t\t\t    \t  if(this.__currentOption[\"style\"])\r\n\t\t\t    \t  {\r\n\t\t\t    \t\t  this.__currentStart = this.__util.getDimensionAsNumber(this.__element,this.__element.style[this.__currentOption.style]);\r\n\t\t\t    \t  }\r\n\t\t\t    \t  else\r\n\t\t\t    \t  {\r\n\t\t\t    \t\t  this.__currentStart = this.__element[this.__currentOption.property];\r\n\t\t\t    \t  }\r\n\t\t\t    \t  this.__duration = this.__currentOption.time;\r\n\t\t\t    \t  this.__currentEnd = new Date(current.getTime() + this.__duration);\r\n\t\t\t    \t  this.__step(0);  //0 = progress is at 0%\r\n\t\t\t      }\r\n\t\t\t      else \r\n\t\t\t      {\r\n\t\t\t    \t  return;\r\n\t\t\t      }\r\n\t\t    }\r\n\t\t    else \r\n\t\t    {\r\n\t\t\t      var progress = remaining / this.__duration;\r\n\t\t\t      var delta = this.__delta(progress);\r\n\t\t\t      this.__step(delta);\r\n\t\t    }\r\n\t\t    this.__util.getRequestAnimationFrame.bind(this.win)(this.__run.bind(this));\r\n\t\t};\r\n\t\t\r\n\t\tthis.__delta = function(progress)\r\n\t\t{\r\n\t\t\treturn (1 - Math.pow(progress, 3));  //easing formula\r\n\t\t};\r\n\t\t\r\n\t\tthis.__step = function(progress) \r\n\t\t{\r\n\t\t\tvar newValue = progress * (this.__currentOption.target - this.__currentStart) + this.__currentStart;\r\n\t\t\tif(this.__currentOption[\"style\"])\r\n\t  \t  \t{\r\n\t\t\t\tthis.__element.style[this.__currentOption.style] = newValue + \"px\";\r\n\t\t\t\t//this.__element.style[this.__currentOption.style] = (progress * this.__currentOption.target) + \"px\";\r\n\t  \t  \t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tthis.__element[this.__currentOption.property] = newValue;\r\n\t\t\t}\r\n\t\t};\r\n\t};\r\n\t\r\n\tNSUtil.prototype.getSearchTextBox = function(textInput)\r\n\t{\r\n\t\tvar divWrapper = null;\r\n\t\tif(textInput)\r\n\t\t{\r\n\t\t\tvar id = textInput.getAttribute(\"id\");\r\n\t\t\tvar parent = textInput.parentNode;\r\n\t\t\tdivWrapper = this.createDiv(id + \"searchWrapper\",\"nsSearchTextBoxWrapper\");\r\n\t\t\tthis.addStyleClass(textInput,\"nsSearchInput\");\r\n\t\t\tvar divSearchWrapper = this.createDiv(id + \"searchIconWrapper\",\"nsSearchIconWrapper\");\r\n\t\t\tvar divSearchParent = this.createDiv(id + \"searchIconParent\",\"nsSearchIconParent\");\r\n\t\t\tvar objSVG = new NSSvg();\r\n\t\t\tvar searchID = new NSSvgShapes().__SEARCH_ICON_ID;\r\n\t\t\tvar svg = objSVG.addSVG(divSearchParent,id + \"searchsvg\",\"nsSearchIcon\",null,null,null,null,null,null,false);\r\n\t\t\tobjSVG.addUse(svg,id + \"use\",null,\"#\" + searchID);\r\n\t\t\tdivSearchWrapper.appendChild(divSearchParent);\r\n\t\t\tdivWrapper.appendChild(divSearchWrapper);\r\n\t\t\tif(parent)\r\n\t\t\t{\r\n\t\t\t\tparent.replaceChild(divWrapper,textInput);\r\n\t\t\t}\r\n\t\t\tdivWrapper.appendChild(textInput);\r\n\t\t}\r\n\t\treturn divWrapper;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.transition = function(element,transitionEndCallback)\r\n\t{\r\n\t\tthis.__element = element;\r\n\t\tthis.__transitionEndCallback = transitionEndCallback;\r\n\t\tthis.__transitions = {\r\n\t      'transition':'transitionend',\r\n\t      'OTransition':'oTransitionEnd',\r\n\t      'MozTransition':'transitionend',\r\n\t      'WebkitTransition':'webkitTransitionEnd'\r\n\t    };\r\n\t\tthis.__util = new NSUtil();\r\n\t\tthis.getTransitionEvent = function()\r\n\t\t{\r\n\t\t\tif(this.__element)\r\n\t\t\t{\r\n\t\t\t\tfor(var trans in this.__transitions)\r\n\t\t\t\t{\r\n\t\t\t        if(this.__element.style[trans] !== undefined)\r\n\t\t\t        {\r\n\t\t\t            return this.__transitions[trans];\r\n\t\t\t        }\r\n\t\t\t    }\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t};\r\n\t\tthis.callEndCallBack = function()\r\n\t\t{\r\n\t\t\tvar transitionEvent = this.getTransitionEvent();\r\n\t\t\tif(transitionEvent && this.__transitionEndCallback)\r\n\t\t\t{\r\n\t\t\t\tthis.__util.addEvent(this.__element,transitionEvent,this.__transitionEndCallback);\r\n\t\t\t}\r\n\t\t};\r\n\t\tthis.callEndCallBack();\r\n\t};\r\n\t\r\n\tNSUtil.prototype.getRequestAnimationFrame = (function()\r\n\t{\r\n\t\t  return  window.requestAnimationFrame       ||\r\n\t\t          window.webkitRequestAnimationFrame ||\r\n\t\t          window.mozRequestAnimationFrame    ||\r\n\t\t          window.oRequestAnimationFrame      ||\r\n\t\t          function(callback)\r\n\t\t          {\r\n\t\t              window.setTimeout(callback,1000 / 60);\r\n\t\t          };\r\n\t})();\r\n\t\r\n\tNSUtil.prototype.getCancelAnimationFrame = (function() \r\n\t{\r\n\t    return window.cancelAnimationFrame           \t||\r\n\t\t       window.webkitCancelRequestAnimationFrame ||\r\n\t\t       window.mozCancelRequestAnimationFrame    ||\r\n\t\t       window.oCancelRequestAnimationFrame      ||\r\n\t\t       window.msCancelRequestAnimationFrame     ||\r\n\t\t       clearTimeout;\r\n\t})();\r\n\t\r\n\tNSUtil.prototype.fitStringToElement = function(element,doc)\r\n\t{\r\n\t\tif(element)\r\n\t\t{\r\n\t\t\tdoc = this.getDoc(doc);\r\n\t\t\tvar str = element.innerHTML;\r\n\t\t\tvar width = element.getBoundingClientRect().width;\r\n\t\t\tfunction escTag(string)\r\n\t\t\t{ \r\n\t\t\t\treturn string.replace(\"<\",\"&lt;\").replace(\">\",\"&gt;\");\r\n\t\t\t}\r\n\t\t\t//Create a span element that will be used to get the width\r\n\t\t\tvar span = doc.createElement(\"span\");\r\n\t\t\t//Allow a classname to be set to get the right font-size.\r\n\t\t\tif (element.className) \r\n\t\t\t{\r\n\t\t\t\tspan.className = element.className;\r\n\t\t\t}\r\n\t\t\tspan.style.display = 'inline';\r\n\t\t\tspan.style.visibility = 'hidden';\r\n\t\t\tspan.style.padding = '0px';\r\n\t\t\tdoc.body.appendChild(span);\r\n\t\r\n\t\t\tvar result = escTag(str); // default to the whole string\r\n\t\t\tspan.innerHTML = result;\r\n\t\t\t// Check if the string will fit in the allowed width. NOTE: if the width\r\n\t\t\t// can't be determined (offsetWidth==0) the whole string will be returned.\r\n\t\t\tif (span.offsetWidth > width) \r\n\t\t\t{\r\n\t\t\t\tvar posStart = 0, posMid, posEnd = str.length, posLength;\r\n\t\t\t\t// Calculate (posEnd - posStart) integer division by 2 and\r\n\t\t\t\t// assign it to posLength. Repeat until posLength is zero.\r\n\t\t\t\twhile (posLength = (posEnd - posStart) >> 1) \r\n\t\t\t\t{\r\n\t\t\t\t  posMid = posStart + posLength;\r\n\t\t\t\t  //Get the string from the beginning up to posMid;\r\n\t\t\t\t  span.innerHTML = escTag(str.substring(0,posMid)) + '&hellip;';\r\n\t\r\n\t\t\t\t  // Check if the current width is too wide (set new end)\r\n\t\t\t\t  // or too narrow (set new start)\r\n\t\t\t\t  if(span.offsetWidth > width) \r\n\t\t\t\t  {\r\n\t\t\t\t\tposEnd = posMid; \r\n\t\t\t\t  }\r\n\t\t\t\t  else \r\n\t\t\t\t  {\r\n\t\t\t\t\tposStart=posMid;\r\n\t\t\t\t  }\r\n\t\t\t\t}\r\n\t\r\n\t\t\t\tresult = '<abbr title=\"' + str.replace(\"\\\"\",\"&quot;\") + '\">' + escTag(str.substring(0,posStart)) +'&hellip;<\\/abbr>';\r\n\t\t\t}\r\n\t\t\tdoc.body.removeChild(span);\r\n\t\t\treturn result;\r\n\t\t}\r\n\t\treturn null;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.slideUp = function(element,duration,callback,heightSubstracter)\r\n\t{\r\n\t\tif(element)\r\n\t\t{\r\n\t\t\tduration = duration || 20;\r\n\t\t\theightSubstracter = heightSubstracter || 10;\r\n\t\t\tvar rect = element.getBoundingClientRect();\r\n\t\t\tvar height = rect.height;\r\n\t\t\tvar counter = height;\r\n\t\t\tvar subtractor = height / heightSubstracter;\r\n\t\t\t//element.style.overflow = \"hidden\";\r\n\t\t\tvar interval = setInterval(function () {\r\n\t\t\t\t counter -= subtractor;\r\n\t\t\t\t if(counter > 0) \r\n\t\t\t\t {\r\n\t\t\t\t\t element.style.height = counter + \"px\";\r\n\t\t\t\t }\r\n\t\t\t\t else\r\n\t\t\t\t {\r\n\t\t\t\t\t element.style.height = null;\r\n\t\t\t    \t clearInterval(interval);\r\n\t\t\t    \t if(callback)\r\n\t\t\t    \t {\r\n\t\t\t    \t\t  callback(element);\r\n\t\t\t    \t }\r\n\t\t\t\t }\r\n\t\t\t},duration);\r\n\t\t}\r\n\t};\r\n\t\r\n\tNSUtil.prototype.slideDown = function(element,duration,callback,heightAdder)\r\n\t{\r\n\t\tif(element)\r\n\t\t{\r\n\t\t\tduration = duration || 20;\r\n\t\t\theightAdder = heightAdder || 10;\r\n\t\t\tvar counter = 0;\r\n\t\t\tvar height = this.getHiddenElementHeight(element);\r\n\t\t\tvar adder = height / heightAdder;\r\n\t\t\telement.style.height = \"0px\";    \r\n\t\t\telement.style.display = \"\";\r\n\t\t\tvar interval = setInterval(function () {            \r\n\t\t      counter += adder;\r\n\t\t      if(counter < height) \r\n\t\t      {\r\n\t\t    \t  element.style.height = counter + \"px\";\r\n\t\t      } \r\n\t\t      else \r\n\t\t      {\r\n\t\t    \t  element.style.height = null;\r\n\t\t    \t  clearInterval(interval);\r\n\t\t    \t  if(callback)\r\n\t\t    \t  {\r\n\t\t    \t\t  callback(element);\r\n\t\t    \t  }\r\n\t\t      }\r\n\t\t    }, duration); \r\n\t\t}\r\n\t};\r\n\t\r\n\tNSUtil.prototype.slideDownTransition = function(element,duration,callback) {\r\n\t\tif(element)\r\n\t\t{\r\n\t\t\tif(this.isUndefinedOrNull(duration)) {\r\n\t\t\t\tduration = 500;\r\n\t\t\t}\r\n\t\t\tvar display = element.style.display;\r\n\t\t\telement.style.display = 'block';\r\n\t\t\tvar origHeight = element.style.height;\r\n\t\t\tvar height = element.offsetHeight;\r\n\t\t\tvar overflow = element.style.overflow;\r\n\t\t\tvar transition = element.style.transition;\r\n\t\t    element.style.height = '0px';\r\n\t\t    element.style.overflow = 'hidden';\r\n\t\t    element.style.transition = \"height \" + (duration / 1000) + \"s ease-in-out\";\r\n\t\t\tfunction handleTransitionEnd(event) {\r\n\t\t\t\tif (event.target === element || event.currentTarget === element) {\r\n\t\t\t\t\telement.removeEventListener('transitionend', handleTransitionEnd);\r\n\t\t\t\t\t//element.style.display = display;\r\n\t\t\t\t\telement.style.height = origHeight;\r\n\t\t\t\t\telement.style.overflow = overflow;\r\n\t\t\t\t\telement.style.transition = transition;\r\n\t\t\t\t\tcallback && callback(element);\r\n\t\t\t    }\r\n\t\t\t}\r\n\t\t        \r\n\t\t\telement.addEventListener('transitionend', handleTransitionEnd);\r\n\t\t\tsetTimeout(function() {\r\n\t\t         element.style.height = height + \"px\";\r\n\t\t    }, 0);\r\n\t\t}\r\n\t}\r\n\t\r\n\tNSUtil.prototype.slideUpTransition = function(element, duration, callback) {\r\n\t    if(element)\r\n\t\t{\r\n\t    \tif(this.isUndefinedOrNull(duration)) {\r\n\t\t\t\tduration = 500;\r\n\t\t\t}\r\n\t\t\tvar display = element.style.display;\r\n\t\t\tvar height = element.style.height;\r\n\t\t\tvar overflow = element.style.overflow;\r\n\t\t\tvar transition = element.style.transition;\r\n\t\t\t\r\n\t\t\telement.style.height = element.offsetHeight + 'px';\r\n\t\t\telement.style.transition = \"height \" + (duration / 1000) + \"s ease-in-out\";\r\n\t\t\t\r\n\t\t\tsetTimeout(function() {\r\n\t\t\t\telement.style.height = '0px';\r\n\t\t\t\telement.style.overflow = 'hidden';\r\n\t\t\t}, 0);\r\n\r\n\t\t\tfunction handleTransitionEnd(event) {\r\n\t\t\t\tif (event.target === element || event.currentTarget === element) {\r\n\t\t\t\t\telement.removeEventListener('transitionend', handleTransitionEnd);\r\n\t\t\t\t\telement.style.display = 'none';\r\n\t\t\t\t\telement.style.height = height;\r\n\t\t\t\t\telement.style.overflow = overflow;\r\n\t\t\t\t\telement.style.transition = transition;\r\n\t\t\t\t\t\r\n\t\t\t\t\tcallback && callback(element);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\telement.addEventListener('transitionend', handleTransitionEnd);\r\n\t\t}\r\n\t}\r\n\t\r\n\t//will work only if element parent is not hidden\r\n\tNSUtil.prototype.getHiddenElementHeight = function(element,win)\r\n\t{\r\n\t\tif(element)\r\n\t\t{\r\n\t\t\twin = this.getWin(win);\r\n\t\t\tvar style = win.getComputedStyle(element);\r\n\t\t\tvar maxHeight = style.maxHeight.replace('px', '').replace('%', '');\r\n\t\t\tif(style.display !== 'none' && maxHeight !== '0') \r\n\t\t\t{\r\n\t\t\t\tvar rect = element.getBoundingClientRect();\r\n\t\t\t\treturn rect.height;\r\n\t\t\t}\r\n\t\t\tvar id = \"nsTemp-\"+ Math.floor(Math.random() * 99999);\r\n\t\t\tvar clonedElement = element.cloneNode(true);\r\n\t\t\tclonedElement.setAttribute(\"id\",id);\r\n\t\t\tclonedElement.style.position = \"absolute\";\r\n\t\t\tclonedElement.style.height = \"auto\";\r\n\t\t\tclonedElement.style.width = \"1000px\";\r\n\t\t\tclonedElement.style.left = \"-10000em\";\r\n\t\t\tclonedElement.style.display = \"\";\r\n\t\t\telement.parentElement.appendChild(clonedElement);\r\n\t\t\tvar rect = clonedElement.getBoundingClientRect();\r\n\t\t\tvar height = rect.height;\r\n\t\t\tclonedElement.parentElement.removeChild(clonedElement);\r\n\t\t}\r\n\t\treturn 0;\r\n\t};\r\n\t\r\n\tNSUtil.prototype.addRemoteFileToElement = function(element,filePath,win)\r\n\t{\r\n\t\tif(element && filePath)\r\n\t\t{\r\n\t\t\twin = this.getWin(win);\r\n\t\t\tvar xmlhttp;\r\n\t\t\tif (win.XMLHttpRequest)\r\n\t\t\t{// code for IE7+, Firefox, Chrome, Opera, Safari\r\n\t\t\t\txmlhttp=new XMLHttpRequest();\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{// code for IE6, IE5\r\n\t\t\t\txmlhttp=new ActiveXObject(\"Microsoft.XMLHTTP\");\r\n\t\t\t}\r\n\t\t\txmlhttp.onreadystatechange=function()\r\n\t\t\t{\r\n\t\t\t  if(xmlhttp.readyState == 4 && xmlhttp.status == 200)\r\n\t\t\t  {\r\n\t\t\t\t  element.innerHTML = xmlhttp.responseText;\r\n\t\t\t  }\r\n\t\t\t};\r\n\t\t\txmlhttp.open(\"GET\",filePath,true);\r\n\t\t\txmlhttp.send();\r\n\t\t}\r\n\t};\r\n\t\r\n\tNSUtil.prototype.stringifyOnce = function(obj, replacer, indent)\r\n\t{\r\n\t\tvar printedObjects = [];\r\n\t    var printedObjectKeys = [];\r\n\t    function printOnceReplacer(key, value)\r\n\t    {\r\n\t        var printedObjIndex = false;\r\n\t        printedObjects.forEach(function(obj, index)\r\n\t        {\r\n\t            if(obj===value)\r\n\t            {\r\n\t                printedObjIndex = index;\r\n\t            }\r\n\t        });\r\n\t        if(value && printedObjIndex && typeof(value)==\"object\")\r\n\t        {\r\n\t        \tvar name = (value.constructor && value.constructor.name) ? value.constructor.name : printedObjectKeys[printedObjIndex];\r\n\t            return \"(see \" + name.toLowerCase() + \" with key \" + printedObjectKeys[printedObjIndex] + \")\";\r\n\t        }\r\n\t        else\r\n\t        {\r\n\t            var qualifiedKey = key || \"(empty key)\";\r\n\t            printedObjects.push(value);\r\n\t            printedObjectKeys.push(qualifiedKey);\r\n\t            if(replacer)\r\n\t            {\r\n\t                return replacer(key, value);\r\n\t            }\r\n\t            else\r\n\t            {\r\n\t                return value;\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    return JSON.stringify(obj, printOnceReplacer, indent);\r\n\t};\r\n\t\r\n\tNSUtil.prototype.caretPosition = function(element,position,doc)\r\n\t{\r\n\t\tif(!element)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tdoc = this.getDoc(doc);\r\n\t\tvar start = 0, end = 0;\r\n\t\tif (typeof element.selectionStart == \"number\" && typeof element.selectionEnd == \"number\") \r\n\t\t{\r\n\t\t\tif(!this.isUndefinedOrNull(position))\r\n\t\t\t{\r\n\t\t\t\telement.focus();\r\n\t\t\t\telement.setSelectionRange(position,position);\r\n\t\t\t}\r\n\t        start = element.selectionStart;\r\n\t        end = element.selectionEnd;\r\n\t    }\r\n\t\telse if(element.createTextRange)\r\n\t\t{\r\n\t\t\tvar range = null;\r\n\t\t\tif(!this.isUndefinedOrNull(position))\r\n\t\t\t{\r\n\t\t\t\trange = elem.createTextRange();\r\n\t            range.move('character',position);\r\n\t            range.select();\r\n\t\t\t}\r\n\t\t\trange = doc.selection.createRange();\r\n\t\t\tif (range && range.parentElement() == element) \r\n\t\t\t{\r\n\t\t\t\tvar len = element.value.length;\r\n\t\t\t\tvar normalizedValue = element.value.replace(/\\r\\n/g, \"\\n\");\r\n\t\t\t\tvar textInputRange = element.createTextRange();\r\n\t            textInputRange.moveToBookmark(range.getBookmark());\r\n\t            var endRange = element.createTextRange();\r\n\t            endRange.collapse(false);\r\n\t            if (textInputRange.compareEndPoints(\"StartToEnd\", endRange) > -1) \r\n\t            {\r\n\t                start = end = len;\r\n\t            } \r\n\t            else \r\n\t            {\r\n\t                start = -textInputRange.moveStart(\"character\", -len);\r\n\t                start += normalizedValue.slice(0, start).split(\"\\n\").length - 1;\r\n\r\n\t                if (textInputRange.compareEndPoints(\"EndToEnd\", endRange) > -1) \r\n\t                {\r\n\t                    end = len;\r\n\t                } \r\n\t                else \r\n\t                {\r\n\t                    end = -textInputRange.moveEnd(\"character\", -len);\r\n\t                    end += normalizedValue.slice(0, end).split(\"\\n\").length - 1;\r\n\t                }\r\n\t            }\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif(!this.isUndefinedOrNull(position))\r\n\t\t\t{\r\n\t\t\t\telement.focus();\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn {start: start,end: end};\r\n\t};\r\n\t\r\n\tNSUtil.prototype.copyObjectWithNullValues = function(item) {\r\n\t\tif(item) {\r\n\t\t\tconst retItem = {};\r\n\t\t\tfor (var key of Object.keys(item)) {\r\n\t\t\t\tretItem[key] = null;\r\n\t\t\t}\r\n\t\t\treturn retItem;\r\n\t\t}\r\n\t\treturn item;\r\n\t}\r\n\t\r\n\tNSUtil.prototype.loader = function(parentContainer,isOverlayRequired,doc,win)\r\n\t{\r\n\t\tthis.parentContainer = parentContainer;\r\n\t\tthis.isOverlayRequired = isOverlayRequired;\r\n\t\tthis.util = new NSUtil();\r\n\t\tthis.doc = this.util.getDoc(doc);\r\n\t\tthis.win = this.util.getWin(win);\r\n\t\tthis.divOverlay = null;\r\n\t\tthis.divLoaderContainerParent = null;\r\n\t\tthis.canvasLoader = null;\r\n\t\tthis.loaderContext= null;\r\n\t\tthis.idPrefix = null;\r\n\t\tthis.loaderLines = 16;\r\n\t\tthis.canvasWidth = 100;\r\n\t\tthis.canvasHeight = 100;\r\n\t\tthis.animationStart = null;\r\n\t\tthis.orignalParentPosition = null;\r\n\t\tthis.documentResizeRef = null;\r\n\t\tthis.timeout = null;\r\n\t\tthis.isVisible = false;\r\n\t\t\r\n\t\tthis.createComponents = function()\r\n\t\t{\r\n\t\t\tif(!this.documentResizeRef)\r\n\t\t\t{\r\n\t\t\t\tthis.documentResizeRef = this.documentResizeListener.bind(this);\r\n\t\t\t\tthis.util.addEvent(this.win,\"resize\",this.documentResizeRef);\r\n\t\t\t}\r\n\t\t\tthis.idPrefix = this.parentContainer.id ? this.parentContainer.id : this.util.getUniqueId();\r\n\t\t\tif(this.util.isUndefined(this.isOverlayRequired))\r\n\t\t\t{\r\n\t\t\t\tthis.isOverlayRequired = true;\r\n\t\t\t}\r\n\t\t\tif(this.isOverlayRequired)\r\n\t\t\t{\r\n\t\t\t\tthis.orignalParentPosition = this.parentContainer.style.position;\r\n\t\t\t\tthis.parentContainer.style.position = \"relative\";\r\n\t\t\t\tthis.divOverlay = this.util.createDiv(\"divOverlay\",\"nsLoaderOverlay\");\r\n\t\t\t\tthis.divOverlay.style.height = this.parentContainer.offsetHeight + \"px\";\r\n\t\t\t\tthis.divOverlay.style.width = this.parentContainer.offsetWidth + \"px\";\r\n\t\t\t\tthis.parentContainer.appendChild(this.divOverlay);\r\n\t\t\t}\r\n\t\t\tthis.divLoaderContainerParent = this.util.createDiv(this.idPrefix + \"divLoaderContainerParent\",\"nsLoaderContainerParent\"); \r\n\t\t\tthis.parentContainer.appendChild(this.divLoaderContainerParent);\r\n\t\t\tvar divLoaderContainer = this.util.createDiv(this.idPrefix + \"divLoaderContainer\",\"nsLoaderContainer\"); \r\n\t\t\tthis.divLoaderContainerParent.appendChild(divLoaderContainer);\r\n\t\t\tthis.canvasLoader = this.doc.createElement(\"canvas\");\r\n\t\t\tthis.canvasLoader.id = this.idPrefix + \"canvas\";\r\n\t\t\tthis.canvasLoader.width = this.canvasWidth;\r\n\t\t\tthis.canvasLoader.height = this.canvasHeight;\r\n\t\t\tthis.canvasLoader.style.background = \"#FFFFFF\";\r\n\t\t\tthis.canvasLoader.style.position = \"absolute\";\r\n\t\t\tdivLoaderContainer.appendChild(this.canvasLoader);\r\n\t\t\tthis.loaderContext= this.canvasLoader.getContext(\"2d\");\r\n\t\t\t\r\n\t\t\tvar divLoadingLabel = this.util.createDiv(this.idPrefix + \"divLoadingLabel\",\"nsLoaderText\"); \r\n\t\t\tdivLoadingLabel.appendChild(this.doc.createTextNode(\"Loading\"));\r\n\t\t\tdivLoaderContainer.appendChild(divLoadingLabel);\r\n\t\t\t\r\n\t\t\tthis.centerElement(this.divLoaderContainerParent);\r\n\t\t\tvar canvasLeft = (((divLoaderContainer.offsetWidth - this.canvasWidth) / 2) - 5);\r\n\t\t\tvar canvasTop = Math.max((((divLoaderContainer.offsetHeight - this.canvasHeight) / 2)),0);\r\n\t\t\tthis.canvasLoader.style.left = canvasLeft + \"px\";\r\n\t\t\tthis.canvasLoader.style.top = canvasTop + \"px\";\r\n\t\t\tthis.centerElement(divLoadingLabel);\r\n\t\t\tdivLoadingLabel.style.top = (canvasTop + this.canvasHeight) + \"px\";\r\n\t\t\tthis.animationStart = new Date();\r\n\t\t\tthis.win.setInterval(this.draw.bind(this), 1000 / 30);\r\n\t\t};\r\n\t\t\r\n\t\tthis.centerElement = function(component)\r\n\t\t{\r\n\t\t\tif(component)\r\n\t\t\t{\r\n\t\t\t\tvar parent = component.parentNode;\r\n\t\t\t\tcomponent.style.left = ((parent.offsetWidth - component.offsetWidth) / 2) + \"px\";\r\n\t\t\t\tcomponent.style.top = ((parent.offsetHeight - component.offsetHeight) / 2) + \"px\";\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\tthis.draw = function() \r\n\t\t{\r\n\t\t    var rotation = parseInt(((new Date() - this.animationStart) / 1000) * this.loaderLines) / this.loaderLines;\r\n\t\t    this.loaderContext.save();\r\n\t\t    this.loaderContext.clearRect(0, 0, this.canvasWidth, this.canvasHeight);\r\n\t\t    this.loaderContext.translate(this.canvasWidth / 2, this.canvasHeight / 2);\r\n\t\t    this.loaderContext.rotate(Math.PI * 2 * rotation);\r\n\t\t    for (var count = 0; count < this.loaderLines; count++) {\r\n\t\t \r\n\t\t    \tthis.loaderContext.beginPath();\r\n\t\t    \tthis.loaderContext.rotate(Math.PI * 2 / this.loaderLines);\r\n\t\t    \tthis.loaderContext.moveTo(this.canvasWidth / 10, 0);\r\n\t\t    \tthis.loaderContext.lineTo(this.canvasWidth / 4, 0);\r\n\t\t    \tthis.loaderContext.lineWidth = this.canvasWidth / 30;\r\n\t\t    \tthis.loaderContext.strokeStyle = \"rgba(0,0,0,\" + count / this.loaderLines + \")\";\r\n\t\t    \tthis.loaderContext.stroke();\r\n\t\t    }\r\n\t\t    this.loaderContext.restore();\r\n\t\t};\r\n\t\t\r\n\t\tthis.documentResizeListener = function(event)\r\n\t\t{\r\n\t\t\tclearTimeout(this.timeout);\r\n\t\t\tvar self = this;\r\n\t\t\tthis.timeout = setTimeout(function () {\r\n\t\t\t\t\tself.resizeHandler.bind(self)();\r\n\t\t\t    }, 500);\r\n\t\t\t\r\n\t\t};\r\n\t\t\r\n\t\tthis.resizeHandler = function()\r\n\t\t{\r\n\t\t\tif(this.isVisible)\r\n\t\t\t{\r\n\t\t\t\tthis.hide();\r\n\t\t\t\tthis.show();\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\tthis.show = function()\r\n\t\t{\r\n\t\t\tif(!this.divLoaderContainerParent)\r\n\t\t\t{\r\n\t\t\t\tthis.createComponents();\r\n\t\t\t}\r\n\t\t\tthis.divLoaderContainerParent.style.display = \"inline-block\";\r\n\t\t\tif(this.isOverlayRequired)\r\n\t\t\t{\r\n\t\t\t\tthis.divOverlay.style.display = \"inline-block\";\r\n\t\t\t\tthis.parentContainer.style.position = \"relative\";\r\n\t\t\t}\r\n\t\t\tthis.isVisible = true;\r\n\t\t};\r\n\t\t\r\n\t\tthis.hide = function()\r\n\t\t{\r\n\t\t\tif(this.divLoaderContainerParent)\r\n\t\t\t{\r\n\t\t\t\tthis.divLoaderContainerParent.parentNode.removeChild(this.divLoaderContainerParent);\r\n\t\t\t\tthis.divLoaderContainerParent = null;\r\n\t\t\t\t//this.divLoaderContainerParent.style.display = \"none\";\r\n\t\t\t}\r\n\t\t\tif(this.divOverlay)\r\n\t\t\t{\r\n\t\t\t\t//this.divOverlay.style.display = \"none\";\r\n\t\t\t\tthis.divOverlay.parentNode.removeChild(this.divOverlay);\r\n\t\t\t\tthis.divOverlay = null;\r\n\t\t\t\tthis.parentContainer.style.position = this.orignalParentPosition;\r\n\t\t\t}\r\n\t\t\tif(this.documentResizeRef)\r\n\t\t\t{\r\n\t\t\t\tthis.util.removeEvent(this.win,\"resize\",this.documentResizeRef);\r\n\t\t\t\tthis.documentResizeRef = null;\r\n\t\t\t}\r\n\t\t\tthis.isVisible = false;\r\n\t\t};\r\n\t};\r\n\t\r\n\tNSUtil.prototype.nsDragResizeElements = function(setting,doc,win)\r\n\t{\r\n\t\tthis.DRAG_STARTING = \"dragStaring\";\r\n\t\tthis.DRAGGING = \"dragging\";\r\n\t\tthis.DRAG_END = \"dragEnd\";\r\n\t\tthis.RESIZE_STARTING = \"resizeStaring\";\r\n\t\tthis.RESIZING = \"resizing\";\r\n\t\tthis.RESIZE_END = \"resizeEnd\";\r\n\t\t\r\n\t\tthis.__ELEMENT_OFFSET = 4;\r\n\t\t\r\n\t\tthis.__setting = setting;\r\n\t\t\r\n\t\t//Drag Variables\r\n\t\tthis.__dragSetting = {x:0,y:0,isDragging:false};\r\n\t\t\r\n\t\t//Resize Variables\r\n\t\tthis.__resizeSetting = {isResizing:false};\r\n\t\tthis.__resizeDirection = {top:false,right:false,bottom:false,left:false};\r\n\t\tthis.__dragEdge = {right:null,bottm:null};\r\n\t\tthis.__elementRect = null;\r\n\t\tthis.__lastElementDimension = null;\r\n\t\tthis.__posX = null;\r\n\t\tthis.__posY = null;\r\n\t\tthis.__tempEvent = null;\r\n\t\r\n\t\t//Common Variables\r\n\t\tthis.__divHidden = null;\r\n\t\tthis.__rePaint = false;\r\n\t\tthis.__isStopMoveOnClick = false;\r\n\t\tthis.__disableDrag = false;\r\n\t\tthis.__disableResize = false;\r\n\t\t\r\n\t\tthis.util = new NSUtil();\r\n\t\tthis.doc = this.util.getDoc(doc);\r\n\t\tthis.win = this.util.getWin(win);\r\n\t\t\r\n\t\tthis.__documentMouseMoveRef = null;\r\n\t\tthis.__documentMouseUpRef = null;\r\n\t\tthis.__documentTouchMoveRef = null;\r\n\t\tthis.__documentTouchEndRef = null;\r\n\t\tthis.__containerClickRef = null;\r\n\t\tthis.__elementMouseDownRef = null;\r\n\t\tthis.__elementTouchStartRef = null;\r\n\t\t\r\n\t\tthis.__initialize = function() \r\n\t\t{\r\n\t\t\tthis.__config = {\r\n\t\t\t\t\telement: this.__setting[\"element\"] || null,\r\n\t\t\t\t\tenableDrag: Boolean.parse(this.__setting[\"enableDrag\"]),\r\n\t\t\t\t\tenableResize: Boolean.parse(this.__setting[\"enableResize\"]),\r\n\t\t\t\t\tenableMoveOnClick: Boolean.parse(this.__setting[\"enableMoveOnClick\"]),\r\n\t\t\t\t\tminWidth: this.util.getDimensionAsNumber(this.__setting[\"element\"],this.__setting[\"minWidth\"]),\r\n\t\t\t\t\tminHeight: this.util.getDimensionAsNumber(this.__setting[\"element\"],this.__setting[\"minHeight\"]),\r\n\t\t\t\t\tcreateGhostElementCallback: this.__setting[\"createGhostElementCallback\"] || this.__createHiddenDiv.bind(this),\r\n\t\t\t\t\tenableDragContainment:Boolean.parse(this.__setting[\"enableDragContainment\"]),\r\n\t\t\t\t\tcontainer: this.__setting[\"container\"] || this.doc.documentElement,\r\n\t\t\t\t\texcludeElement: this.__setting[\"excludeElement\"] || []\r\n\t\t\t};\r\n\t\t\tif(this.__config.element)\r\n\t\t\t{\r\n\t\t\t\tif(this.__config.enableDrag)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.__divHidden = this.__config.createGhostElementCallback(this.__config.element);\r\n\t\t\t\t\tthis.util.addStyleClass(this.__divHidden,\"nsDragGhost\");\r\n\t\t\t\t\tthis.__initializeHiddenDiv();\r\n\t\t\t\t}\r\n\t\t\t\tthis.__addEvent();\r\n\t\t\t\tif(this.__config.enableDrag)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.__initializeDrag();\r\n\t\t\t\t}\r\n\t\t\t\tif(this.__config.enableResize)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.__initializeResize();\r\n\t\t\t\t}\r\n\t\t\t\tif(this.__config.enableMoveOnClick)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.__initializeMoveOnClick();\r\n\t\t\t\t}\r\n\t\t\t\tthis.__animateAction();\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\tthis.stopMoveOnClick = function()\r\n\t\t{\r\n\t\t\tthis.__isStopMoveOnClick = true;\r\n\t\t};\r\n\t\t\r\n\t\tthis.disableDrag = function(value)\r\n\t\t{\r\n\t\t\tthis.__disableDrag = Boolean.parse(value);\r\n\t\t};\r\n\t\t\r\n\t\tthis.disableResize = function(value)\r\n\t\t{\r\n\t\t\tthis.__disableResize = Boolean.parse(value);\r\n\t\t};\r\n\t\t\r\n\t\tthis.destroy = function()\r\n\t\t{\r\n\t\t\tif(this.__elementMouseDownRef)\r\n\t\t\t{\r\n\t\t\t\tthis.util.removeEvent(this.__config.element,\"mousedown\",this.__elementMouseDownRef);\r\n\t\t\t\tthis.__elementMouseDownRef = null;\r\n\t\t\t}\r\n\t\t\tif(this.__elementTouchStartRef)\r\n\t\t\t{\r\n\t\t\t\tthis.util.removeEvent(this.__config.element,\"touchstart\",this.__elementTouchStartRef);\r\n\t\t\t\tthis.__elementTouchStartRef = null;\r\n\t\t\t}\r\n\t\t\tif(this.__documentMouseMoveRef)\r\n\t\t\t{\r\n\t\t\t\tthis.util.removeEvent(this.__config.container,\"mousemove\",this.__documentMouseMoveRef);\r\n\t\t\t\tthis.__documentMouseMoveRef = null;\r\n\t\t\t}\r\n\t\t\tif(this.__documentMouseUpRef)\r\n\t\t\t{\r\n\t\t\t\tthis.util.removeEvent(this.__config.container,\"mouseup\",this.__documentMouseUpRef);\r\n\t\t\t\tthis.__documentMouseUpRef = null;\r\n\t\t\t}\r\n\t\t\tif(this.__documentTouchMoveRef)\r\n\t\t\t{\r\n\t\t\t\tthis.util.removeEvent(this.__config.container,\"touchmove\",this.__documentTouchMoveRef);\r\n\t\t\t\tthis.__documentTouchMoveRef = null;\r\n\t\t\t}\r\n\t\t\tif(this.__documentTouchEndRef)\r\n\t\t\t{\r\n\t\t\t\tthis.util.removeEvent(this.__config.container,\"touchend\",this.__documentTouchEndRef);\r\n\t\t\t\tthis.__documentTouchEndRef = null;\r\n\t\t\t}\r\n\t\t\tif(this.__containerClickRef)\r\n\t\t\t{\r\n\t\t\t\tthis.util.removeEvent(this.__config.container,\"click\",this.__containerClickRef);\r\n\t\t\t\tthis.__containerClickRef = null;\r\n\t\t\t}\r\n\t\t\tif(this.__divHidden)\r\n\t\t\t{\r\n\t\t\t\tthis.__divHidden.parentNode.removeChild(this.__divHidden);\r\n\t\t\t\tthis.__divHidden = null;\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\tthis.__addEvent = function()\r\n\t\t{\r\n\t\t\tif(!this.__elementMouseDownRef)\r\n\t\t\t{\r\n\t\t\t\tthis.__elementMouseDownRef = this.__elementMouseDownHandler.bind(this);\r\n\t\t\t\tthis.util.addEvent(this.__config.element,\"mousedown\",this.__elementMouseDownRef);\r\n\t\t\t}\r\n\t\t\tif(!this.__elementTouchStartRef)\r\n\t\t\t{\r\n\t\t\t\tthis.__elementTouchStartRef = this.__elementTouchStartHandler.bind(this);\r\n\t\t\t\tthis.util.addEvent(this.__config.element,\"touchstart\",this.__elementTouchStartRef);\r\n\t\t\t}\r\n\t\t\tif(!this.__documentMouseMoveRef)\r\n\t\t\t{\r\n\t\t\t\tthis.__documentMouseMoveRef = this.__documentMouseMoveHandler.bind(this);\r\n\t\t\t\tthis.util.addEvent(this.__config.container,\"mousemove\",this.__documentMouseMoveRef);\r\n\t\t\t}\r\n\t\t\tif(!this.__documentMouseUpRef)\r\n\t\t\t{\r\n\t\t\t\tthis.__documentMouseUpRef = this.__documentMouseUpHandler.bind(this);\r\n\t\t\t\tthis.util.addEvent(this.__config.container,\"mouseup\",this.__documentMouseUpRef);\r\n\t\t\t}\r\n\t\t\tif(!this.__documentTouchMoveRef)\r\n\t\t\t{\r\n\t\t\t\tthis.__documentTouchMoveRef = this.__documentTouchMoveHandler.bind(this);\r\n\t\t\t\tthis.util.addEvent(this.__config.container,\"touchmove\",this.__documentTouchMoveRef);\r\n\t\t\t}\r\n\t\t\tif(!this.__documentTouchEndRef)\r\n\t\t\t{\r\n\t\t\t\tthis.__documentTouchEndRef = this.__documentTouchEndHandler.bind(this);\r\n\t\t\t\tthis.util.addEvent(this.__config.container,\"touchend\",this.__documentTouchEndRef);\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\tthis.__elementMouseDownHandler = function(event)\r\n\t\t{\r\n\t\t\tevent = this.util.getEvent(event);\r\n\t\t\tthis.__downActionHandler(event);\r\n\t\t\t//this.util.preventDefault(event); \r\n\t\t\tevent.stopImmediatePropagation();\r\n\t\t};\r\n\t\t\r\n\t\tthis.__elementTouchStartHandler = function(event)\r\n\t\t{\r\n\t\t\t event = this.util.getEvent(event);\r\n\t\t\t this.__downActionHandler(event.touches[0]);\r\n\t\t\t //this.util.preventDefault(event);\r\n\t\t\t event.stopImmediatePropagation();\r\n\t\t};\r\n\t\t\r\n\t\tthis.__documentMouseMoveHandler = function(event)\r\n\t\t{\r\n\t\t\tevent = this.util.getEvent(event);\r\n\t\t\tthis.__moveActionHandler(event);\r\n\t\t\t//this.util.preventDefault(event); \r\n\t\t\t//event.stopImmediatePropagation();\r\n\t\t};\r\n\t\t\r\n\t\tthis.__documentMouseUpHandler = function(event)\r\n\t\t{\r\n\t\t\tevent = this.util.getEvent(event);\r\n\t\t\tthis.__upActionHandler(event);\r\n\t\t\t//this.util.preventDefault(event); \r\n\t\t\t//event.stopPropagation();\r\n\t\t\t//event.stopImmediatePropagation();\r\n\t\t};\r\n\t\t\r\n\t\tthis.__documentTouchMoveHandler = function(event)\r\n\t\t{\r\n\t\t\tevent = this.util.getEvent(event);\r\n\t\t\tthis.__moveActionHandler(event.touches[0]);\r\n\t\t\t//this.util.preventDefault(event); \r\n\t\t\t//event.stopImmediatePropagation();\r\n\t\t};\r\n\t\t\r\n\t\tthis.__documentTouchEndHandler = function(event)\r\n\t\t{\r\n\t\t\tevent = this.util.getEvent(event);\r\n\t\t\tif (event.touches.length === 0) \r\n\t\t\t{\r\n\t\t\t\tthis.__upActionHandler(event.changedTouches[0]);\r\n\t\t\t}\r\n\t\t\t//this.util.preventDefault(event); \r\n\t\t\t//event.stopImmediatePropagation();\r\n\t\t};\r\n\t\t\r\n\t\tthis.__downActionHandler = function(event)\r\n\t\t{\r\n\t\t\tif(this.__isTargetValid(event.target))\r\n\t\t\t{\r\n\t\t\t\tthis.__setResizeVariables(event);\r\n\t\t\t\tvar isResizing = this.__isResizeValid();\r\n\t\t\t\tvar isDragging = !isResizing && this.__isDragValid();\r\n\t\t\t\tif(isResizing && !this.__disableResize)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.__startResize(event);\r\n\t\t\t\t}\r\n\t\t\t\telse if(isDragging && !this.__disableDrag)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.__startDrag(event);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\tthis.__moveActionHandler = function(event)\r\n\t\t{\r\n\t\t\tthis.__setResizeVariables(event);\r\n\t\t\tthis.__tempEvent = event;\r\n\t\t\tthis.__rePaint = true;\r\n\t\t\tif(this.__resizeSetting.isResizing) \r\n\t\t\t{\r\n\t\t\t\tthis.__actionResize(event);\r\n\t\t\t}\r\n\t\t\telse if(this.__dragSetting.isDragging)\r\n\t\t\t{\r\n\t\t\t\tthis.__actionDrag(event);\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\tthis.__upActionHandler = function(event)\r\n\t\t{ \r\n\t\t\tthis.__setResizeVariables(event);\r\n\t\t\tif(this.__resizeSetting.isResizing)\r\n\t\t\t{\r\n\t\t\t\tthis.__endResize(event);\r\n\t\t\t\t//this.stopMoveOnClick();\r\n\t\t\t}\r\n\t\t\telse if(this.__dragSetting.isDragging)\r\n\t\t\t{\r\n\t\t\t\tthis.__endDrag(event);\r\n\t\t\t\tthis.stopMoveOnClick();\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\tthis.__isTargetValid = function(target)\r\n\t\t{\r\n\t\t\tif(target && this.__config.excludeElement && this.__config.excludeElement.length > 0)\r\n\t\t\t{\r\n\t\t\t\tfor(var count = 0;count < this.__config.excludeElement.length;count++)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(this.__config.excludeElement[count] ==  target)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t};\r\n\t\t/*********************************Resize Methods Starts*********************************/\r\n\t\tthis.__initializeResize = function()\r\n\t\t{\r\n\t\t};\r\n\t\t\r\n\t\tthis.__resizeElement = function()\r\n\t\t{\r\n\t\t};\r\n\t\t\r\n\t\tthis.__startResize = function(event)\r\n\t\t{\r\n\t\t\tthis.util.dispatchEvent(this.__config.element,this.RESIZE_STARTING,null,null);\r\n\t\t\tthis.__resizeSetting = {\r\n\t\t\t\t    posX: this.__posX,\r\n\t\t\t\t    posY: this.__posY,\r\n\t\t\t\t    clientX: event.clientX,\r\n\t\t\t\t    clientY: event.clientY,\r\n\t\t\t\t    elementWidth: this.__elementRect.width,\r\n\t\t\t\t    elementHeight: this.__elementRect.height,\r\n\t\t\t\t    isResizing: true,\r\n\t\t\t\t    isResizeTop: this.__resizeDirection.top,\r\n\t\t\t\t    isResizeLeft: this.__resizeDirection.left,\r\n\t\t\t\t    isResizeRight: this.__resizeDirection.right,\r\n\t\t\t\t    isResizeBottom: this.__resizeDirection.bottom\r\n\t\t\t };\r\n\t\t};\r\n\t\t\r\n\t\tthis.__actionResize = function(event)\r\n\t\t{\r\n\t\t\tif(this.__resizeSetting.isResizeRight) \r\n\t\t    {\r\n\t\t    \tthis.__config.element.style.width = Math.max(this.__posX, this.__config.minWidth) + \"px\";\r\n\t\t    }\r\n\t\t    if(this.__resizeSetting.isResizeBottom) \r\n\t\t    {\r\n\t\t    \tthis.__config.element.style.height = Math.max(this.__posY, this.__config.minHeight) + \"px\";\r\n\t\t    }\r\n\t\t    if(this.__resizeSetting.isResizeLeft) \r\n\t\t    {\r\n\t\t\t     var currentWidth = Math.max(this.__resizeSetting.clientX - this.__tempEvent.clientX  + this.__resizeSetting.elementWidth, this.__config.minWidth);\r\n\t\t\t     if (currentWidth > this.__config.minWidth) \r\n\t\t\t     {\r\n\t\t\t    \t this.__config.element.style.width = currentWidth + \"px\";\r\n\t\t\t    \t this.__config.element.style.left = this.__tempEvent.clientX + \"px\";\t\r\n\t\t\t     }\r\n\t\t    }\r\n\t\t    if (this.__resizeSetting.isResizeTop) \r\n\t\t    {\r\n\t\t    \tvar currentHeight = Math.max(this.__resizeSetting.clientY - this.__tempEvent.clientY  + this.__resizeSetting.elementHeight, this.__config.minHeight);\r\n\t\t\t    if(currentHeight > this.__config.minHeight) \r\n\t\t\t    {\r\n\t\t\t    \tthis.__config.element.style.height = currentHeight + \"px\";\r\n\t\t\t    \tthis.__config.element.style.top = this.__tempEvent.clientY + \"px\";\t\r\n\t\t\t    }\r\n\t\t    }\r\n\t\t    this.__updateHiddenDivDimension();\r\n\t\t    var elementRect = this.__config.element.getBoundingClientRect();\r\n\t\t    this.util.dispatchEvent(this.__config.element,this.RESIZING,elementRect,{dimension:elementRect});\r\n\t\t};\r\n\t\t\r\n\t\tthis.__endResize = function(event)\r\n\t\t{\r\n\t\t\tthis.__resizeSetting = {isResizing:false};\r\n\t\t\tthis.util.dispatchEvent(this.__config.element,this.RESIZE_END,null,null);\r\n\t\t};\r\n\t\t\r\n\t\tthis.__setResizeVariables = function(event)\r\n\t\t{\r\n\t\t\t  this.__elementRect = this.__config.element.getBoundingClientRect();\r\n\t\t\t  this.__posX = event.clientX - this.__elementRect.left;\r\n\t\t\t  this.__posY = event.clientY - this.__elementRect.top;\r\n\t\r\n\t\t\t  this.__resizeDirection.top = this.__posY < this.__ELEMENT_OFFSET;\r\n\t\t\t  this.__resizeDirection.left = this.__posX < this.__ELEMENT_OFFSET;\r\n\t\t\t  this.__resizeDirection.right = this.__posX >= this.__elementRect.width - this.__ELEMENT_OFFSET;\r\n\t\t\t  this.__resizeDirection.bottom = this.__posY >= this.__elementRect.height - this.__ELEMENT_OFFSET;\r\n\t\t\t  \r\n\t\t\t  this.__dragEdge.right = this.win.innerWidth - this.__ELEMENT_OFFSET;\r\n\t\t\t  this.__dragEdge.bottom = this.win.innerHeight - this.__ELEMENT_OFFSET;\r\n\t\t};\r\n\t\t\r\n\t\tthis.__isResizeValid = function()\r\n\t\t{\r\n\t\t\tif(this.__config.enableResize)\r\n\t\t\t{\r\n\t\t\t\tvar retValue =  this.__resizeDirection.right || this.__resizeDirection.bottom || this.__resizeDirection.top || this.__resizeDirection.left;\r\n\t\t\t\treturn retValue;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t};\r\n\t\t\t\r\n\t\t/*********************************Resize Methods Ends*********************************/\r\n\t\t\t\r\n\t\t/*********************************Drag Methods Starts*********************************/\r\n\t\tthis.__initializeDrag = function()\r\n\t\t{\r\n\t\t\tvar container = this.__config.container;\r\n\t\t\tvar isContainerBody = false;\r\n\t\t\tif(container.tagName === \"BODY\" || container.tagName === \"HTML\")\r\n\t\t\t{\r\n\t\t\t\tisContainerBody = true;\r\n\t\t\t}\r\n\t\t\tvar setPosition = function(element,rectElement)\r\n\t\t\t{\r\n\t\t\t\tvar style = getComputedStyle(element);\r\n\t\t\t\tif(isContainerBody && style.position !== \"absolute\")\r\n\t\t\t\t{\r\n\t\t\t\t\telement.style.position = \"absolute\";\r\n\t\t\t\t}\r\n\t\t\t\telse if (style.position !== \"relative\" && style.position !== \"absolute\" ) \r\n\t\t\t\t{\r\n\t\t\t\t\telement.style.position = \"relative\";\r\n\t\t\t\t}\r\n\t\t\t\tif(rectElement)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(rectElement.width > 0)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\telement.style.width = rectElement.width + \"px\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(rectElement.height > 0)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\telement.style.height = rectElement.height + \"px\";\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tvar element = this.__config.element;\r\n\t\t\tvar rectElement = element.getBoundingClientRect();\r\n\t\t\tsetPosition(element,rectElement);\r\n\t\t\tvar rectHiddenElement = this.__divHidden.getBoundingClientRect();\r\n\t\t\tif(rectHiddenElement.width <= 0 || rectHiddenElement.height <= 0)\r\n\t\t\t{\r\n\t\t\t\trectHiddenElement = rectElement;\r\n\t\t\t}\r\n\t\t\tsetPosition(this.__divHidden,rectHiddenElement);\r\n\t\t};\r\n\t\t\r\n\t\tthis.__dragElement = function()\r\n\t\t{\r\n\t\t};\r\n\t\r\n\t\tthis.__startDrag = function(event)\r\n\t\t{\r\n\t\t\tvar target = this.util.getTarget(event);\r\n\t\t\tvar cancelled = this.util.dispatchEvent(this.__config.element,this.DRAG_STARTING,target,null,true,true);\r\n\t\t\tif(!cancelled)\r\n\t\t\t{\r\n\t\t\t\tthis.__dragSetting.isDragging = true;\r\n\t\t\t\tvar rectElement = this.__config.element.getBoundingClientRect();\r\n\t\t\t\tthis.__dragSetting.posX = event.clientX;\r\n\t\t\t\tthis.__dragSetting.posY = event.clientY;\r\n\t\t\t\tthis.__dragSetting.elementTop = rectElement.top;\r\n\t\t\t\tthis.__dragSetting.elementLeft = rectElement.left;\r\n\t\t\t\tthis.__dragSetting.elementWidth = rectElement.width;\r\n\t\t\t\tthis.__dragSetting.elementHeight = rectElement.height;\r\n\t\t\t\tthis.__dragSetting.diffX = this.__dragSetting.posX - this.__dragSetting.elementLeft;\r\n\t\t\t\tthis.__dragSetting.diffY = this.__dragSetting.posY - this.__dragSetting.elementTop;\r\n\t\t\t\tthis.__dragSetting.containerWidth = 0;\r\n\t\t\t\tthis.__dragSetting.containerHeight = 0;\r\n\t\t\t\tif(this.__config.enableDragContainment)\r\n\t\t\t\t{\r\n\t\t\t\t\tvar containerRect = this.__config.container.getBoundingClientRect();\r\n\t\t\t\t\tthis.__dragSetting.containerWidth = containerRect.width;\r\n\t\t\t\t\tthis.__dragSetting.containerHeight = containerRect.height;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\tthis.__actionDrag = function(event)\r\n\t\t{\r\n\t\t\tthis.__setHiddenDivVisiblity(true);\r\n\t\t\tvar posX = event.clientX;\r\n\t        var posY = event.clientY;\r\n\t        var newX = posX - this.__dragSetting.diffX;\r\n\t        var newY = posY - this.__dragSetting.diffY;\r\n\t        var newPosition = this.__getRestrictedPosition(newX,newY);\r\n\t        this.__divHidden.style.top = newPosition.y + \"px\";\r\n\t\t\tthis.__divHidden.style.left = newPosition.x  + \"px\";\r\n\t\t\tthis.util.dispatchEvent(this.__config.element,this.DRAGGING,newPosition,{position:newPosition});\r\n\t\t};\r\n\t\t\r\n\t\tthis.__endDrag = function(event)\r\n\t\t{\r\n\t\t\tthis.__dragSetting.isDragging = false;\r\n\t\t\tthis.__config.element.style.top = this.__divHidden.style.top;\r\n\t\t\tthis.__config.element.style.left = this.__divHidden.style.left;\r\n\t\t\tthis.__setHiddenDivVisiblity(false);\r\n\t\t\tthis.__dragSetting = {x:0,y:0,isDragging:false};\r\n\t\t\tthis.util.dispatchEvent(this.__config.element,this.DRAG_END,null,null);\r\n\t\t};\r\n\t\t\r\n\t\tthis.__getRestrictedPosition = function(newX,newY)\r\n\t\t{\r\n\t\t\tif(this.__config.enableDragContainment)\r\n\t\t\t{\r\n\t\t\t\t//newX = (newX < 0) ? 0 : newX;\r\n\t\t\t\t//newY = (newY < 0) ? 0 : newY;\r\n\t\t\t\tif((newX + this.__dragSetting.elementWidth) > this.__dragSetting.containerWidth)\r\n\t\t\t\t{\r\n\t\t\t\t\tnewX = this.__dragSetting.containerWidth - this.__dragSetting.elementWidth;\r\n\t\t\t\t}\r\n\t\t\t\tif((newY + this.__dragSetting.elementHeight) > this.__dragSetting.containerHeight)\r\n\t\t\t\t{\r\n\t\t\t\t\tnewY = this.__dragSetting.containerHeight - this.__dragSetting.elementHeight;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn {x:newX,y:newY};\r\n\t\t};\r\n\t\t\r\n\t\tthis.__isDragValid = function()\r\n\t\t{\r\n\t\t\tif(this.__config.enableDrag)\r\n\t\t\t{\r\n\t\t\t\tvar retValue = this.__posX > 0 && this.__posX < this.__elementRect.width && this.__posY > 0 && this.__posY < this.__elementRect.height && this.__posY < 30;\r\n\t\t\t\treturn retValue;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t};\r\n\t\t/*********************************Drag Methods Ends*********************************/\r\n\t\t/*********************************Move On Click Method Starts***********************/\r\n\t\tthis.__initializeMoveOnClick = function()\r\n\t\t{\r\n\t\t\tthis.util.addStyleClass(this.__config.element,\"nsMoveOnClick\");\r\n\t\t\tthis.__containerClickRef = this.__containerClickHandler.bind(this);\r\n\t\t\tthis.util.addEvent(this.__config.container,\"click\",this.__containerClickRef);\r\n\t\t\tthis.util.addEvent(this.__config.element,\"click\",this.__elementClickHandler.bind(this));\r\n\t\t};\r\n\t\t\r\n\t\tthis.__elementClickHandler = function(event)\r\n\t\t{\r\n\t\t\tevent = this.util.getEvent(event);\r\n\t\t\tthis.util.preventDefault(event); \r\n\t\t\tevent.stopPropagation();\r\n\t\t\tevent.stopImmediatePropagation();\r\n\t\t};\r\n\t\t\r\n\t\tthis.__containerClickHandler = function(event)\r\n\t\t{\r\n\t\t\tif(!this.__isStopMoveOnClick)\r\n\t\t\t{\r\n\t\t\t\tevent = this.util.getEvent(event);\r\n\t\t\t\tvar element = this.__config.element;\r\n\t\t\t\tvar parentPosition = this.__getElementPosition(event.currentTarget);\r\n\t\t\t\tvar newX = event.clientX - parentPosition.x - (element.clientWidth / 2);\r\n\t\t\t\tvar newY = event.clientY - parentPosition.y - (element.clientHeight / 2);\r\n\t\t\t\tvar rectElement = this.__config.element.getBoundingClientRect();\r\n\t\t\t\tvar containerRect = this.__config.container.getBoundingClientRect();\r\n\t\t\t\tvar elementWidth = rectElement.width;\r\n\t\t\t\tvar elementHeight = rectElement.height;\r\n\t\t\t\tvar containerWidth = containerRect.width;\r\n\t\t\t\tvar containerHeight = containerRect.height;\r\n\t\t\t\tnewX = (newX < 0) ? 0 : newX;\r\n\t\t\t\tnewY = (newY < 0) ? 0 : newY;\r\n\t\t\t\tif((newX + elementWidth) > containerWidth)\r\n\t\t\t\t{\r\n\t\t\t\t\tnewX = containerWidth - elementWidth;\r\n\t\t\t\t}\r\n\t\t\t\tif((newY + elementHeight) > containerHeight)\r\n\t\t\t\t{\r\n\t\t\t\t\tnewY = containerHeight - elementHeight;\r\n\t\t\t\t}\r\n\t\t\t\telement.style.left = newX + \"px\";\r\n\t\t\t\telement.style.top = newY + \"px\";\r\n\t\t\t\tthis.util.preventDefault(event); \r\n\t\t\t\tevent.stopPropagation();\r\n\t\t\t\tevent.stopImmediatePropagation();\r\n\t\t\t}\r\n\t\t\tthis.__isStopMoveOnClick = false;\r\n\t\t};\r\n\t\t\r\n\t\tthis.__getElementPosition = function(element) \r\n\t\t{\r\n\t\t\tvar position = {x:0,y:0};\r\n\t\t\twhile(element) \r\n\t\t\t{\r\n\t\t\t   if(element.tagName === \"BODY\" || element.tagName === \"HTML\") \r\n\t\t\t   {\r\n\t\t\t      var xScroll = element.scrollLeft || this.doc.documentElement.scrollLeft;\r\n\t\t\t      var yScroll = element.scrollTop || this.doc.documentElement.scrollTop;\r\n\t\t\t      position.x += (element.offsetLeft - xScroll + element.clientLeft);\r\n\t\t\t      position.y += (element.offsetTop - yScroll + element.clientTop);\r\n\t\t\t   } \r\n\t\t\t   else \r\n\t\t\t   {\r\n\t\t\t\t  position.x += (element.offsetLeft - element.scrollLeft + element.clientLeft);\r\n\t\t\t\t  position.y += (element.offsetTop - element.scrollTop + element.clientTop);\r\n\t\t\t   }\r\n\t\t\t   element = element.offsetParent;\r\n\t\t\t}\r\n\t\t\treturn position;\r\n\t\t};\r\n\t\t/*********************************Move On Click Method Ends***************************/\r\n\t\t/*********************************Common Methods Starts*********************************/\r\n\t\tthis.__animateAction = function()\r\n\t\t{\r\n\t\t\tthis.util.getRequestAnimationFrame.bind(this.win)(this.__animateAction.bind(this));\r\n\t\t\tif(this.__rePaint)\r\n\t\t\t{\r\n\t\t\t\tthis.__rePaint = false;\r\n\t\t\t\tif(this.__resizeSetting && this.__resizeSetting.isResizing) \r\n\t\t\t\t{\r\n\t\t\t\t\tthis.__resizeElement();\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif(this.__dragSetting && this.__dragSetting.isDragging) \r\n\t\t\t\t{\r\n\t\t\t\t\tthis.__dragElement();\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tthis.__setElementCursor();\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\tthis.__setElementCursor = function() \r\n\t\t{\r\n\t\t\tif(this.__config.enableResize && this.__resizeDirection.right && this.__resizeDirection.bottom || this.__resizeDirection.left && this.__resizeDirection.top) \r\n\t\t\t{\r\n\t\t\t\t this.__config.element.style.cursor = \"nwse-resize\";\r\n\t\t\t} \r\n\t\t\telse if(this.__config.enableResize && this.__resizeDirection.right && this.__resizeDirection.top || this.__resizeDirection.bottom && this.__resizeDirection.left) \r\n\t\t\t{\r\n\t\t\t\t this.__config.element.style.cursor = \"nesw-resize\";\r\n\t\t\t} \r\n\t\t\telse if(this.__config.enableResize && (this.__resizeDirection.right || this.__resizeDirection.left)) \r\n\t\t\t{\r\n\t\t\t\t this.__config.element.style.cursor = \"ew-resize\";\r\n\t\t\t} \r\n\t\t\telse if(this.__config.enableResize && (this.__resizeDirection.bottom || this.__resizeDirection.top)) \r\n\t\t\t{\r\n\t\t\t\t this.__config.element.style.cursor = \"ns-resize\";\r\n\t\t\t} \r\n\t\t\telse if(this.__isDragValid()) \r\n\t\t\t{\r\n\t\t\t\t this.__config.element.style.cursor = \"move\";\r\n\t\t\t} \r\n\t\t\telse \r\n\t\t\t{\r\n\t\t\t\t this.__config.element.style.cursor = \"default\";\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\tthis.__setHiddenDivVisiblity = function(isVisible) \r\n\t\t{\r\n\t\t\tthis.__divHidden.style.display = (isVisible ? \"\" : \"none\");\r\n\t\t\tthis.__config.element.style.display = (isVisible ? \"none\" : \"\");\r\n\t\t};\r\n\t\t\r\n\t\tthis.__updateHiddenDivDimension = function() \r\n\t\t{\r\n\t\t\tthis.__updateElementDimension(this.__divHidden, this.__elementRect.left,this.__elementRect.top, this.__elementRect.width, this.__elementRect.height);\r\n\t\t};\r\n\t\t\r\n\t\tthis.__updateElementDimension = function(element,posX,posY,width,height) \r\n\t\t{\r\n\t\t\tvar updateDimension = function(property,value)\r\n\t\t\t{\r\n\t\t\t\t(element && value !== -1) ? (element.style[property] = value + \"px\") : null;\r\n\t\t\t};\r\n\t\t\tupdateDimension(\"left\",posX);\r\n\t\t\tupdateDimension(\"top\",posY);\r\n\t\t\tupdateDimension(\"width\",width);\r\n\t\t\tupdateDimension(\"height\",height);\r\n\t\t};\r\n\t\t\r\n\t\tthis.__createHiddenDiv = function(element)\r\n\t\t{\r\n\t\t\tvar divHidden = this.util.createDiv(element.id + \"Hidden\", \"nsGhostElement\");\r\n\t\t\tdivHidden.style.width = this.util.getStyleValue(element,\"width\");\r\n\t\t\tdivHidden.style.height = this.util.getStyleValue(element,\"height\");\r\n\t\t\t\r\n\t\t\treturn divHidden;\r\n\t\t};\r\n\t\t\r\n\t\tthis.__initializeHiddenDiv = function()\r\n\t\t{\r\n\t\t\tif(!this.__divHidden)\r\n\t\t\t{\r\n\t\t\t\tthis.util.throwException(1002,\"Dragging Util\",\"Function should return Ghost Element\");\r\n\t\t\t}\r\n\t\t\tthis.__divHidden.setAttribute(\"id\",this.__config.element.id + \"Hidden\");\r\n\t\t\tvar self = this;\r\n\t\t\tvar setDimension = function(property)\r\n\t\t\t{\r\n\t\t\t\tif(!self.__config.element.style[property])\r\n\t\t\t\t{\r\n\t\t\t\t\tvar propertyValue = self.util.getStyleValue(self.__config.element,property);\r\n\t\t\t\t\tif(propertyValue !== \"auto\")\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tself.__divHidden.style[property] = propertyValue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tsetDimension(\"width\");\r\n\t\t\tsetDimension(\"height\");\r\n\t\t\tthis.__divHidden.style.pointerEvents = \"none\";\r\n\t\t\tvar element = this.__config.element;\r\n\t\t\tvar parentNode = element.parentNode;\r\n\t\t\ttry\r\n\t\t\t{\r\n\t\t\t\tparentNode.appendChild(this.__divHidden);\r\n\t\t\t}\r\n\t\t\tcatch(error)\r\n\t\t\t{\r\n\t\t\t\tthis.__divHidden = this.util.getWebComponentElement(this.__divHidden);\r\n\t\t\t\tparentNode.appendChild(this.__divHidden);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tthis.__setHiddenDivVisiblity(false);\r\n\t\t};\r\n\t\t/*********************************Common Methods Ends*********************************/\r\n\t\tthis.__initialize();\r\n\t};\r\n\t\r\n\t//Idea from http://stackoverflow.com/questions/4770025/how-to-disable-scrolling-temporarily\r\n\tNSUtil.prototype.nsScrollEnableDisable = function(parent,orignalScrollHandler,enablerCallback)\r\n\t{\r\n\t\tthis.__parent = parent;\r\n\t\tthis.__orignalScrollHandler = orignalScrollHandler;\r\n\t\tthis.__enablerCallback = enablerCallback;\r\n\t\t // spacebar: 32, pageup: 33, pagedown: 34, end: 35, home: 36\r\n\t    // left: 37, up: 38, right: 39, down: 40\r\n\t\tthis.__scrollEventKeys = [32, 33, 34, 35, 36, 37, 38, 39, 40];\r\n\t\tthis.__lastScrollPos = [0,0];\r\n\t\t\r\n\t\tthis.util = new NSUtil();\r\n\t\tthis.disabled = false; \r\n\t\t\r\n\t\tthis.__parentMouseWheelRef = null;\r\n\t\tthis.__parentMouseScrollRef = null;\r\n\t\tthis.__parentTouchMoveRef = null;\r\n\t\tthis.__parentScrollRef = null;\r\n\t\tthis.__documentKeyDownRef = null;\r\n\t\t\r\n\t\tthis.disable = function() \r\n\t\t{\r\n\t\t\tthis.__lastScrollPos = [this.__parent.scrollLeft,this.__parent.scrollTop];\r\n\t\t\tthis.disabled = true;\r\n\t\t\tif(this.__orignalScrollHandler)\r\n\t\t\t{\r\n\t\t\t\tthis.util.removeEvent(this.__parent,\"scroll\",this.__orignalScrollHandler);\r\n\t\t\t}\r\n\t\t\tif(!this.__parentMouseWheelRef)\r\n\t\t\t{\r\n\t\t\t\tthis.__parentMouseWheelRef = this.__handleWheel.bind(this);\r\n\t\t\t\tthis.util.addEvent(this.__parent,\"mousewheel\",this.__parentMouseWheelRef);\r\n\t\t\t}\r\n\t\t\tif(!this.__parentMouseScrollRef)\r\n\t\t\t{\r\n\t\t\t\tthis.__parentMouseScrollRef = this.__handleWheel.bind(this);\r\n\t\t\t\tthis.util.addEvent(this.__parent,\"DOMMouseScroll\",this.__parentMouseScrollRef);\r\n\t\t\t}\r\n\t\t\tif(!this.__parentTouchMoveRef)\r\n\t\t\t{\r\n\t\t\t\tthis.__parentTouchMoveRef = this.__handleWheel.bind(this);\r\n\t\t\t\tthis.util.addEvent(this.__parent,\"touchmove\",this.__parentTouchMoveRef);\r\n\t\t\t}\r\n\t\t\tif(!this.__parentScrollRef)\r\n\t\t\t{\r\n\t\t\t\tthis.__parentScrollRef = this.__handleScrollbar.bind(this);\r\n\t\t\t\tthis.util.addEvent(this.__parent,\"scroll\",this.__parentScrollRef);\r\n\t\t\t}\r\n\t\t\tif(!this.__documentKeyDownRef)\r\n\t\t\t{\r\n\t\t\t\tthis.__documentKeyDownRef = this.__handleKeydown.bind(this);\r\n\t\t\t\tthis.util.addEvent(this.doc,\"keydown\",this.__documentKeyDownRef);\r\n\t\t\t}\r\n\t    };\r\n\t    \r\n\t    this.enable = function() \r\n\t\t{\r\n\t    \tthis.disabled = false;\r\n\t    \tif(this.__orignalScrollHandler)\r\n\t\t\t{\r\n\t\t\t\tthis.util.addEvent(this.__parent,\"scroll\",this.__orignalScrollHandler);\r\n\t\t\t}\r\n\t\t\tif(this.__parentMouseWheelRef)\r\n\t\t\t{\r\n\t\t\t\tthis.util.removeEvent(this.__parent,\"mousewheel\",this.__parentMouseWheelRef);\r\n\t\t\t\tthis.__parentMouseWheelRef = null;\r\n\t\t\t}\r\n\t\t\tif(this.__parentMouseScrollRef)\r\n\t\t\t{\r\n\t\t\t\tthis.util.removeEvent(this.__parent,\"DOMMouseScroll\",this.__parentMouseScrollRef);\r\n\t\t\t\tthis.__parentMouseScrollRef = null;\r\n\t\t\t}\r\n\t\t\tif(this.__parentTouchMoveRef)\r\n\t\t\t{\r\n\t\t\t\tthis.util.removeEvent(this.__parent,\"touchmove\",this.__parentTouchMoveRef);\r\n\t\t\t\tthis.__parentTouchMoveRef = null;\r\n\t\t\t}\r\n\t\t\tif(this.__parentScrollRef)\r\n\t\t\t{\r\n\t\t\t\tthis.util.removeEvent(this.__parent,\"scroll\",this.__parentScrollRef);\r\n\t\t\t\tthis.__parentScrollRef = null;\r\n\t\t\t}\r\n\t\t\tif(this.__documentKeyDownRef)\r\n\t\t\t{\r\n\t\t\t\tthis.util.removeEvent(this.doc,\"keydown\",this.__documentKeyDownRef);\r\n\t\t\t\tthis.__documentKeyDownRef = null;\r\n\t\t\t}\r\n\t    };\r\n\t\t\r\n\t\tthis.__handleWheel = function(event) \r\n\t\t{\r\n\t\t\tevent = this.util.getEvent(event);\r\n\t        event.preventDefault();\r\n\t    };\r\n\t\t\r\n\t\tthis.__handleScrollbar = function(event) \r\n\t\t{\r\n\t\t\tevent = this.util.getEvent(event);\r\n\t        this.__parent.scrollLeft = this.__lastScrollPos[0];\r\n\t        this.__parent.scrollTop = this.__lastScrollPos[1];\r\n\t        if(this.__enablerCallback && this.__enablerCallback(event))\r\n\t        {\r\n\t        \tthis.enable();\r\n\t        }\r\n\t    };\r\n\t\t\r\n\t\tthis.__handleKeydown = function(event) \r\n\t\t{\r\n\t\t\tevent = this.util.getEvent(event);\r\n\t        for (var count = 0; count < this.__scrollEventKeys.length; count++) \r\n\t\t\t{\r\n\t            if (event.keyCode === this.__scrollEventKeys[count]) \r\n\t\t\t\t{\r\n\t                event.preventDefault();\r\n\t                return;\r\n\t            }\r\n\t        }\r\n\t    };\r\n\t};\r\n\t\r\n\t//Idea from http://stackoverflow.com/questions/10344498/best-way-to-iterate-over-an-array-without-blocking-the-ui\r\n\tNSUtil.prototype.processArrayAsync = function(array,callBack,maxTimePerChunk,completeHandler,context,win) \r\n\t{\r\n\t\tthis.__array = array;\r\n\t\tthis.__callBack = callBack;\r\n\t\tthis.__maxTimePerChunk = maxTimePerChunk || 50;\r\n\t\tthis.__completeHandler = completeHandler;\r\n\t    this.__index = 0;\r\n\t    \r\n\t    this.util = new NSUtil();\r\n\t    this.win = this.util.getWin(win);\r\n\t    this.__context = context || this.win;\r\n\t    this.__requestId = null;\r\n\t    this.__hasPaused = false;\r\n\t    this.__hasCompleted = false;\r\n\t    \r\n\t    this.start = function(startIndex)\r\n\t    {\r\n\t    \tthis.__index = startIndex || 0;\r\n\t    \tthis.__hasPaused = false;\r\n\t    \tthis.__process();\r\n\t    };\r\n\t    \r\n\t    this.stop = function()\r\n\t    {\r\n\t    \tthis.__hasPaused = true;\r\n\t    \tif(this.__requestId)\r\n\t    \t{\r\n\t    \t\tthis.win.cancelAnimationFrame(this.__requestId);\r\n\t    \t\t//this.util.getCancelAnimationFrame.bind(this.win)(this.__requestId);\r\n\t    \t\tthis.__requestId = null;\r\n\t    \t}\r\n\t    };\r\n\t    \r\n\t    this.resume = function()\r\n\t    {\r\n\t    \tthis.__hasPaused = false;\r\n\t    \tif(!this.__hasCompleted)\r\n\t    \t{\r\n\t    \t\tthis.__process();\r\n\t    \t}\r\n\t    };\r\n\t    \r\n\t    this.__process = function() \r\n\t    {\r\n\t    \tif(!this.__hasPaused)\r\n\t    \t{\r\n\t    \t\tvar startTime = this.__getCurrentTime();\r\n\t            while(this.__index < this.__array.length && (this.__getCurrentTime() - startTime) <= this.__maxTimePerChunk) \r\n\t            {\r\n\t            \tthis.__callBack.bind(this.__context)(this.__array[this.__index], this.__index, this.__array);\r\n\t                ++this.__index;\r\n\t            }\r\n\t            if(this.__index < this.__array.length) \r\n\t            {\r\n\t                // set Timeout for async iteration\r\n\t            \tthis.__requestId = this.util.getRequestAnimationFrame.bind(this.win)(this.__process.bind(this));\r\n\t            }\r\n\t            else if(this.__completeHandler)\r\n\t            {\r\n\t            \tthis.__completeHandler.bind(this.__context)();\r\n\t            \tthis.__hasCompleted = true;\r\n\t            }\r\n\t    \t}\r\n\t    };\r\n\t    \r\n\t    this.__getCurrentTime = function()\r\n\t    {\r\n\t        return new Date().getTime();\r\n\t    };\r\n\t};\r\n\t\r\n\tNSUtil.prototype.image = function(doc)\r\n\t{\r\n\t\tthis.util = new NSUtil();\r\n\t\tthis.doc = this.util.getDoc(doc);\r\n\t\tthis.getMoveIcon = function(toolTip)\r\n\t\t{\r\n\t\t\treturn this.__createImage('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAoZJREFUeNpsU81rE0EUf7uzu2lNVJL6Eb0IBWusepqcKm3wEFkvxqDgQbwUtYeeg5cccwj4F7QKChEPipRcdMGDiaAoJAexLYViwYsfbU1JYkx3Zz98b8220Wbg7ez7vXm/mffmN9Kh1G2QGQOmMDiRyYEkSaCoKjDGdAAooOUdxzFsIcDzPPhSvgeO7YDrOLBRmQdlJHULVE0DNRSCvqFjUuHqhWP8+etvhR5m0CeengVhmiAsywdl2Dt03K1wZSrO220XaCaf8AFrQel32s0mrDcaWfovrq3Vc9OTvHj/Tb0Xzh6JxQwNyxtIgPXpqqJk94fDM+1Oh6CaEF4QTiIOGJ/DdQtBObsEmGxbll/rkCyDPDwMzW4XhHD88EH0NcRxDUeX4/qdnsi0s8Aas+kEp8Zg82pMkmpDigKbjSbQTD7hFL94/jin9ZRHBNLo3Wrt+uUkbzQsiEZVMPGKfv76DaawodnahkhY86+PNnXxs77ZgVOjMahWVuufi1NJRZhWvvT0beHGtQn++Nm7en+DzqXO8vfVxX+wsYnT/JWxWEe95P0eILsvkkdPKn4PUEBJmunILab5992PLVU++skoNmOniT7JX2Fkt5GM1EjqbMohXzQmqo7KwCQ6zYKiabu30PpQAnZ0HKSRMcMRwnBddw4ZOO4GLRYKFFdDhrrteTMMdWB9/QTdH8sIp0EKmNT4GWDjGZAPJ3TcrbBv+ibfwtwDqBvzYck/truxYjjLZRDflwLt7JUmEoAymdPV7INa5IXn0Uw+4f8PIqATMLQIWpQ0E/RFTmQ4nLx0B1Zfzrsr5eAmbLQW2hYpHwkcqfegNBJhzwY9sGC4aCZaF81CAvePAAMAcwtApJX/Wo0AAAAASUVORK5CYII=',toolTip);\r\n\t\t};\r\n\t\t\r\n\t\tthis.getLeftIcon = function(toolTip)\r\n\t\t{\r\n\t\t\treturn this.__createImage('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAe9JREFUeNqkUz1oE2EYfu7uuyRKLCFt6g+4VNQWWod+mQRRR1En0UFOHKoNCMKNju4SEQsOzsFNcRGl4CS42AzaKhKcsqhk0Etj7u+773y/6+USbOLSF5574b33eX+e906L4xh7MaYeC/c/IFcowMznEzDTBGPMoldnqEFtkPy708mIqvHHe0s7BcaYJYSwRwPu9vbYRH1XJI4tEYb2jYtHOHko9LvdxE9cYZQcBoF9+9oJ7jgRQt+HFAJSyv9rkO6UkGvXF3mr9QelkpkUINsYR6T8Jrkay8i+b9+5yfnmppMmSFw6e4yrIynBBsdS3jQ1PH/zeTiBIt+9dZpvbTlZh1+Oh/Z3F33XRUj7R1GUxA3DwMx0EYHnDUUMPe9Rfe1tc26uiL6M8aXno+UH6O7PIShPIapMQx6sQMxW4JbL+MkKCKhwNgGN2FD7Pnz82j63coF/aoc4ekDHtxfrzUniaZrW/FfEBomI9Scv7fnVq7zdBwIqajBWpeTd99d3vgBNCaQSzMOLyJ+6ApSPWxSzD61a/MfThupSjVuvxk2A3sazYYGBGbML0OcvW9rMyeRLFO8eVGXnKyacMiug5ikSplLs05dXzqNQWpbv6/URjpK+m6JH3GhQQI2QI+RTmBO0EwQ/RUBcqe31d/4rwAB0lPTXqN6HzgAAAABJRU5ErkJggg==',toolTip);\r\n\t\t};\r\n\t\t\r\n\t\tthis.getRightIcon = function(toolTip)\r\n\t\t{\r\n\t\t\treturn this.__createImage('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAfBJREFUeNqkUz1s00AU/hwSh1SEhiFCYuhCVSExgHRiYKjEVCEyMMGAsjCxZunesWM7dIgEA8JISPyoUhFDFoZOSE2GgtrSIAYWSEPb1HUS23c+8+7iuE5/JKQ+6fOdz/e+970fG2EY4jyWVo9b819hGEZ8WCgW4z2dV2lZFUJYgnNwz9PwXRebc3cGBMfN6XSQy+eHryyCMuv43dRpBCpSz7b1qlB+cI3RWkEYlv+LQFkgBLxuV8s9OAhQLk0w7vsnSHQKVMhqQuYRSRBouK5AqyXwpHSdvfywUYkKb8UEFIU9fXybOY6A+jbszGAP7O/7RBKg2eR4dH+KvV5ej0k0gaqobXO0214c3acUDnt99Pp9cKqDUqLsx68LuHd3gtU+b1eOCOiSaaZQKJjgMsSOy7EnJcSYCZnLwKbojic1weTVMXz81KhTexeSKdSXqrUzh2X84Qxr9SQmx1P48q6mnTPZrJUs4jMp5QlHlSd1Y203fRGFK8DPV28HzqZpjXShW3+D00bamCrpNU9DuvvcGsjea1rO+nvw39+AxRCGckyO8ciQFG8gPT27ptX8/b4gt1asYGdzRGE6MVCXCJcj5NShbG9B/NnYhttpyMYL5XmTYEdw1KgMFSgJJiEbIXNGPQXBi+CTrzTO+zv/E2AA3Y8Nbp4Kn1sAAAAASUVORK5CYII=',toolTip);\r\n\t\t};\r\n\t\t\r\n\t\tthis.__createImage = function(source,toolTip)\r\n\t\t{\r\n\t\t\tif(source)\r\n\t\t\t{\r\n\t\t\t\tvar img = this.doc.createElement('img');\r\n\t\t\t\timg.setAttribute(\"src\",source);\r\n\t\t\t\tif(toolTip)\r\n\t\t\t\t{\r\n\t\t\t\t\timg.setAttribute(\"title\",toolTip);\r\n\t\t\t\t}\r\n\t\t        return img;\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t};\r\n\t};\r\n\t\r\n\tNSUtil.prototype.localStorage = function(win)\r\n\t{\r\n\t\tthis.util = new NSUtil();\r\n\t\tthis.win = this.util.getWin(win);\r\n\t\tthis.STORAGE_PREFIX = \"nsStorage\";\r\n\t\tthis.setData = function(key,data) \r\n\t\t{\r\n\t\t    if (this.isAPISupported() && key) \r\n\t\t    {\r\n\t\t    \tvar calcKey = this.__getKey(key);\r\n\t\t    \tvar item = data;\r\n\t\t    \tthis.removeData(calcKey);\r\n\t\t    \tif(item && !this.util.isString(item) && this.__isJSONSupported())\r\n\t\t    \t{\r\n\t\t    \t\titem = JSON.stringify(item);\r\n\t\t    \t}\r\n\t\t    \tlocalStorage.setItem(calcKey,item);\r\n\t\t    \treturn true;\r\n\t\t    }\r\n\t\t    return false;\r\n\t\t};\r\n\t\t\r\n\t\tthis.getData = function(key) \r\n\t\t{\r\n\t\t\tif (this.isAPISupported() && key) \r\n\t\t\t{\r\n\t\t\t\tvar item = localStorage.getItem(this.__getKey(key));\r\n\t\t\t    if (item) \r\n\t\t\t    {\r\n\t\t\t    \tif(this.__isJSONSupported())\r\n\t\t\t    \t{\r\n\t\t\t    \t\treturn JSON.parse(item);\r\n\t\t\t    \t}\r\n\t\t\t    \telse\r\n\t\t\t    \t{\r\n\t\t\t    \t\treturn item;\r\n\t\t\t    \t}\r\n\t\t\t    \t\r\n\t\t\t    }\r\n\t\t    }\r\n\t\t    return null;\r\n\t\t};\r\n\t\t\r\n\t\tthis.removeData = function(key) \r\n\t\t{\r\n\t\t\tif (this.isAPISupported() && key) \r\n\t\t\t{\r\n\t\t\t\tlocalStorage.removeItem(this.__getKey(key));\r\n\t\t\t\treturn true;\r\n\t\t    }\r\n\t\t\treturn false;\r\n\t\t};\r\n\t\t\r\n\t\tthis.removeAll = function()\r\n\t\t{\r\n\t\t\tif (this.isAPISupported()) \r\n\t\t\t{\r\n\t\t\t\tvar callBack = function(key)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.removeData(key);\r\n\t\t\t\t};\r\n\t\t\t\tthis.__manipulateAllKeys(callBack.bind(this));\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\tthis.isAPISupported = function()\r\n\t\t{\r\n\t\t\tif (!this.win.localStorage || !this.win.JSON) \r\n\t\t\t{\r\n\t\t        return false;\r\n\t\t    }\r\n\t\t\t return true;\r\n\t\t};\r\n\t\t\r\n\t\tthis.__isJSONSupported = function()\r\n\t\t{\r\n\t\t\tif (!this.win.JSON) \r\n\t\t\t{\r\n\t\t        return false;\r\n\t\t    }\r\n\t\t\t return true;\r\n\t\t};\r\n\t\t\r\n\t\tthis.__manipulateAllKeys = function(callBack) \r\n\t\t{\r\n\t\t\tif(callBack)\r\n\t\t\t{\r\n\t\t\t\tvar keyRegex = new RegExp(\"^\" + this.STORAGE_PREFIX + \"(.*)\");\r\n\t\t\t\tfor (var count = localStorage.length-1; count >= 0 ; --count) \r\n\t\t\t\t{\r\n\t\t\t\t      var key = localStorage.key(count);\r\n\t\t\t\t      key = key && key.match(keyRegex);\r\n\t\t\t\t      key = key && key[1];\r\n\t\t\t\t      if (key && key.indexOf(this.STORAGE_PREFIX) < 0) \r\n\t\t\t\t      {\r\n\t\t\t\t    \t  callBack(key);\r\n\t\t\t\t      }\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\tthis.__getKey = function(key)\r\n\t\t{\r\n\t\t\treturn (this.STORAGE_PREFIX + key);\r\n\t\t};\r\n\t};\r\n\t\r\n\tNSUtil.prototype.replaceHTMLFromObject = function(config,doc)\r\n\t{\r\n\t\tthis.__config = config;\r\n\t\tthis.__setting = {};\r\n\t\t\r\n\t\tthis.util = new NSUtil();\r\n\t\tthis.doc = this.util.getDoc(doc);\r\n\t\tthis.__regex = \"([\\\\w\\\\.\\\\^]+)\";\r\n\t\tthis.__regexString = null;\r\n\t\t\r\n\t\tthis.__initialize = function()\r\n\t\t{\r\n\t\t\tif(!this.__config)\r\n\t\t\t{\r\n\t\t\t\tthis.__config = {};\r\n\t\t\t}\r\n\t\t\tthis.__setting = \r\n\t\t\t{\r\n\t\t\t\tstartSeparatorTag : (this.__config.startSeparatorTag) ? this.__config.startSeparatorTag : \"{{\",\r\n\t\t\t\tendSeparatorTag : (this.__config.endSeparatorTag) ? this.__config.endSeparatorTag : \"}}\"\r\n\t\t\t};\r\n\t\t\tthis.__regexString = this.__setting.startSeparatorTag + this.__regex + this.__setting.endSeparatorTag;\r\n\t\t};\r\n\t\t\r\n\t\tthis.replace = function(template,data,parent,isPureHTML) \r\n\t\t{\r\n\t\t\tvar retHTML = \"\";\r\n\t\t\tif(template && data)\r\n\t\t\t{\r\n\t\t\t\tisPureHTML = Boolean.parse(isPureHTML);\r\n\t\t\t\tvar innerHTML = \"\";\r\n\t\t\t\tif(isPureHTML)\r\n\t\t\t\t{\r\n\t\t\t\t\tinnerHTML = template;\r\n\t\t\t\t}\r\n\t\t\t\telse if(this.util.isString(template))\r\n\t\t\t\t{\r\n\t\t\t\t\tvar element = this.doc.querySelector(\"#\" + template);\r\n\t\t\t\t\tif(element)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tinnerHTML = element.innerHTML;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if(this.util.isElement(template))\r\n\t\t\t\t{\r\n\t\t\t\t\ttemplate = template.innerHTML;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tinnerHTML = template;\r\n\t\t\t\t}\r\n\t\t\t\tvar length = data.length;\r\n\t\t\t\tfor (var count = 0;count < length; count++) \r\n\t\t\t\t{\r\n\t\t\t\t\tretHTML += this.__replaceWithItem(data[count],innerHTML);\r\n\t\t\t    }\r\n\t\t\t\tif(parent)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(this.util.isString(parent))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tvar element = this.doc.querySelector(\"#\" + parent);\r\n\t\t\t\t\t\tif(element)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tparent = element;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(parent)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tparent.innerHTML += retHTML;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn retHTML;\r\n\t\t};\r\n\t\t\r\n\t\tthis.__replaceWithItem = function(item,htmlText)\r\n\t\t{\r\n\t\t\tvar html = null;\r\n\t        for (prop in item) \r\n\t        {\r\n\t            var regex = new RegExp(this.__setting.startSeparatorTag + prop + this.__setting.endSeparatorTag,\"g\");\r\n\t            html = (html || htmlText).replace(regex, item[prop]);\r\n\t        }\r\n\t        return html;\r\n\t\t};\r\n\t\t\r\n\t\tthis.__initialize();\r\n\t};\r\n\t\r\n\tNSUtil.prototype.nsPopUp = function(config,doc,win)\r\n\t{\r\n\t\tthis.__config = config;\r\n\t\tthis.__setting = {};\r\n\t\tthis.__popUp = null;\r\n\t\tthis.__documentClickHandlerRef = null;\r\n\t\tthis.__lastZIndex = null;\r\n\t\tthis.util = new NSUtil();\r\n\t\tthis.doc = this.util.getDoc(doc);\r\n\t\tthis.win = this.util.getWin(win);\r\n\t\t\r\n\t\tthis.create = function (dataSource) \r\n\t\t{ \r\n\t\t\tthis.__createElement();\r\n\t\t\treturn this.__popUp;\r\n\t\t};\r\n\t\r\n\t\tthis.remove = function() \r\n\t\t{\r\n\t\t\tif(this.__popUp)\r\n\t\t\t{\r\n\t\t\t\tthis.__popUp.parentNode.removeChild(this.__popUp);\r\n\t\t\t\tthis.__popUp = null;\r\n\t\t\t\tif(this.__documentClickHandlerRef)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.util.removeEvent(this.doc,\"click\",this.__documentClickHandlerRef);\r\n\t\t\t\t\tthis.__documentClickHandlerRef = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t\r\n\t\tthis.show = function() \r\n\t\t{\r\n\t\t\tif(this.__popUp)\r\n\t\t\t{\r\n\t\t\t\tthis.util.addStyleClass(this.__popUp,\"nsShowPopUp\");\r\n\t\t\t\tif(this.__setting.setZIndex)\r\n\t\t\t\t{\r\n\t\t\t\t\tvar zIndex = this.util.getMaxZIndex();\r\n\t\t\t\t\tif(zIndex > 0)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif(this.__popUp.style.zIndex)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tthis.__lastZIndex = this.__popUp.style.zIndex;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tthis.__popUp.style.zIndex = zIndex + 1;\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\t\tthis.hide = function() \r\n\t\t{\r\n\t\t\tif(this.__popUp)\r\n\t\t\t{\r\n\t\t\t\tthis.util.removeStyleClass(this.__popUp,\"nsShowPopUp\");\r\n\t\t\t\tif(this.__lastZIndex)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.__popUp.style.zIndex = this.__lastZIndex;\r\n\t\t\t\t\tthis.__lastZIndex = null;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.__popUp.style.zIndex = \"\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\tthis.placePopUp = function(event,isAbsolute)\r\n\t\t{\r\n\t\t\tif(this.__popUp)\r\n\t\t\t{\r\n\t\t\t\tvar position = this.__setting[\"position\"];\r\n\t\t\t\tposition = this.__getSuggestedPosition(event,position);\r\n\t\t\t\tvar offset = this.__getOffset(event,position,isAbsolute);\r\n\t\t\t\tthis.__popUp.style.top = offset.top + \"px\";\r\n\t\t\t\tthis.__popUp.style.left = offset.left + \"px\";\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\tthis.hideOtherNSPopUp = function()\r\n\t\t{\r\n\t\t\tvar arrMenus = this.doc.querySelectorAll(\".nsPopUp\");\r\n\t\t\tif(arrMenus && arrMenus.length > 0)\r\n\t\t\t{\r\n\t\t\t\tvar menu = null;\r\n\t\t\t\tfor(var count = 0;count < arrMenus.length;count++)\r\n\t\t\t\t{\r\n\t\t\t\t\tmenu = arrMenus[count];\r\n\t\t\t\t\tthis.util.removeStyleClass(menu,\"nsShowPopUp\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\tthis.getPopUp = function()\r\n\t\t{\r\n\t\t\treturn this.__popUp;\r\n\t\t};\r\n\t\t\r\n\t\tthis.isOpen = function()\r\n\t\t{\r\n\t\t\tif(this.__popUp)\r\n\t\t\t{\r\n\t\t\t\treturn this.util.hasStyleClass(this.__popUp,\"nsShowPopUp\");\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t};\r\n\t\t\r\n\t\tthis.__initialize = function()\r\n\t\t{\r\n\t\t\tif(!this.__config)\r\n\t\t\t{\r\n\t\t\t\tthis.__config = {};\r\n\t\t\t}\r\n\t\t\tthis.__setting = \r\n\t\t\t{\r\n\t\t\t\tid: this.__config[\"id\"] || null,\r\n\t\t\t\ttype: this.__config[\"type\"] || \"div\",\r\n\t\t\t\tparent: this.__config[\"parent\"] || this.doc.body,\r\n\t\t\t\twidth: this.__config[\"width\"] || -1,\r\n\t\t\t\tposition: this.__config[\"position\"] || this.util.POS_BOTTOMRIGHT,\r\n\t\t\t\tcloseOnOutsideClick: Boolean.parse(this.__config[\"closeOnOutsideClick\"]),\r\n\t\t\t\thideOrRemoveOnOutsideClick: this.__config[\"hideOrRemoveOnOutsideClick\"] || \"remove\",\r\n\t\t\t\ttitle: this.__config[\"title\"],\r\n\t\t\t\tsetZIndex: this.util.isUndefinedOrNull(this.__config[\"setZIndex\"]) ? true : Boolean.parse(this.__config[\"setZIndex\"]),\r\n\t\t\t\tcloseRequired: Boolean.parse(this.__config[\"closeRequired\"]),\r\n\t\t\t\tcloseHtml: this.__config[\"closeHtml\"],\r\n\t\t\t};\r\n\t\t};\r\n\t\t\r\n\t\tthis.__createElement = function() \r\n\t\t{\r\n\t\t\tif(this.__popUp)\r\n\t\t\t{\r\n\t\t\t\tthis.remove();\r\n\t\t\t}\r\n\t\t\tthis.__popUp = this.doc.createElement(this.__setting[\"type\"]); \r\n\t\t\tif(this.__setting[\"id\"])\r\n\t\t\t{\r\n\t\t\t\tthis.__popUp.setAttribute(\"id\",this.__setting[\"id\"]);\r\n\t\t\t}\r\n\t\t\tthis.util.addStyleClass(this.__popUp,\"nsPopUp\");\r\n\t\t\tif(this.__setting.width)\r\n\t\t\t{\r\n\t\t\t\tif(this.util.isNumber(this.__setting.width) && parseInt(this.__setting.width) > -1)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.__popUp.style.width = this.__setting.width + \"px\";\r\n\t\t\t\t}\r\n\t\t\t\telse //for width as auto\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.__popUp.style.width = this.__setting.width;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(this.__setting[\"title\"] || this.__setting[\"closeRequired\"])\r\n\t\t\t{\r\n\t\t\t\tthis.__popUp.style.minHeight = \"50px\";\r\n\t\t\t\tvar divHead = this.util.createDiv(null,\"nsPopUpHeader\");\r\n\t\t\t\tvar divHeadContainer = this.util.createDiv(null,\"nsPopUpHeaderContainer\");\r\n\t\t\t\tvar divTitleContainer = this.util.createDiv(null,\"nsPopUpTitleContainer\");\r\n\t\t\t\tif(this.__setting[\"title\"])\r\n\t\t\t\t{\r\n\t\t\t\t\tvar divTitle = this.util.createDiv(null,\"nsPopUpTitle\");\r\n\t\t\t\t\tdivTitle.innerHTML = this.__setting[\"title\"];\r\n\t\t\t\t\tdivTitleContainer.appendChild(divTitle);\r\n\t\t\t\t}\r\n\t\t\t\tdivHeadContainer.appendChild(divTitleContainer);\r\n\t\t\t\tvar divCloseContainer = this.util.createDiv(null,\"nsPopUpCloseContainer\");\r\n\t\t\t\tif(this.__setting[\"closeRequired\"])\r\n\t\t\t\t{\r\n\t\t\t\t\tvar btnTitle = this.util.createElement(\"button\",null,\"nsPopUpBtnClose\");\r\n\t\t\t\t\tdivCloseContainer.appendChild(btnTitle);\r\n\t\t\t\t\tbtnTitle.innerHTML = this.__setting[\"closeHtml\"] || \"<span class=\\\"nsPopUpClose\\\"></span>\";\r\n\t\t\t\t\tvar self = this;\r\n\t\t\t\t\tthis.util.addEvent(btnTitle,\"click\",function(event){\r\n\t\t\t\t\t\tself.__closeHandler.call(self,event);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\tdivHeadContainer.appendChild(divCloseContainer);\r\n\t\t\t\tdivHead.appendChild(divHeadContainer);\r\n\t\t\t\tthis.__popUp.appendChild(divHead);\r\n\t\t\t}\r\n\t\t\tif(this.__setting[\"closeOnOutsideClick\"])\r\n\t\t\t{\r\n\t\t\t\tthis.util.addEvent(this.__popUp,\"click\",this.__popUpClickHandler.bind(this));\r\n\t\t\t\tif(!this.__documentClickHandlerRef)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.__documentClickHandlerRef = this.__documentClickHandler.bind(this);\r\n\t\t\t\t\tthis.util.addEvent(this.doc,\"click\",this.__documentClickHandlerRef);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.__setting[\"parent\"].appendChild(this.__popUp);\r\n\t\t};\r\n\t\t\r\n\t\tthis.__popUpClickHandler = function(event)\r\n\t\t{\r\n\t\t\tevent.stopPropagation();\r\n\t\t};\r\n\t\t\r\n\t\tthis.__documentClickHandler = function(event)\r\n\t\t{\r\n\t\t\tthis.__closeHandler(event);\r\n\t\t};\r\n\t\t\r\n\t\tthis.__closeHandler = function(event)\r\n\t\t{\r\n\t\t\tif(this.__setting.hideOrRemoveOnOutsideClick == \"remove\")\r\n\t\t\t{\r\n\t\t\t\tthis.remove();\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tthis.hide();\r\n\t\t\t}\r\n\t\t};\r\n\t\r\n\t\tthis.__getOffset = function(event,position,isAbsolute)\r\n\t\t{\r\n\t\t\t  var rectPopUp = this.__popUp.getBoundingClientRect();\r\n\t\t\t  var item = {top: 0,left:0};\r\n\t\t\t  if(rectPopUp)\r\n\t\t\t  {\r\n\t\t\t\t  var popUpWidth = rectPopUp.width;\r\n\t\t\t\t  var popUpHeight = rectPopUp.height;\r\n\t\t\t\t  var offset = null;\r\n\t\t\t\t  if(this.util.isElement(event))\r\n\t\t\t\t  {\r\n\t\t\t\t\t  if(isAbsolute) {\r\n\t\t\t\t\t\t  var coords = this.__getAbsoluteOffset(event);\r\n\t\t\t\t\t      offset = {\r\n\t\t\t\t            top: coords.top + event.offsetHeight,\r\n\t\t\t\t            left: coords.left\r\n\t\t\t\t\t      };\r\n\t\t\t\t\t  }\r\n\t\t\t\t\t  else {\r\n\t\t\t\t\t\t  var rects = event.getClientRects();\r\n\t\t\t\t\t  \t  offset = {top:rects[0].top + event.offsetHeight,left:rects[0].left};\r\n\t\t\t\t\t  }\r\n\t\t\t\t  }\r\n\t\t\t\t  else\r\n\t\t\t\t  {\r\n\t\t\t\t\t  offset = this.util.getEventPosition(event);\r\n\t\t\t\t  }\r\n\t\t\t\t  switch(position) \r\n\t\t\t\t  {\r\n\t\t\t\t\tcase this.util.POS_TOP:\r\n\t\t\t\t\t\titem.top = offset.top - popUpHeight;\r\n\t\t\t\t\t\titem.left = offset.left - popUpWidth / 2;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase this.util.POS_BOTTOM:\r\n\t\t\t\t\t\titem.top = offset.top;\r\n\t\t\t\t\t\titem.left = offset.left - popUpWidth / 2;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase this.util.POS_LEFT:\r\n\t\t\t\t\t\titem.top =  offset.top - popUpHeight / 2;\r\n\t\t\t\t\t\titem.left = offset.left - popUpWidth;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase this.util.POS_RIGHT:\r\n\t\t\t\t\t\titem.top =  offset.top - popUpHeight / 2,\r\n\t\t\t\t\t\titem.left = offset.left;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase this.util.POS_TOPLEFT:\r\n\t\t\t\t\t\titem.top = offset.top - popUpHeight;\r\n\t\t\t\t\t\titem.left = offset.left - popUpWidth;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase this.util.POS_TOPRIGHT:\r\n\t\t\t\t\t\titem.top =  offset.top - popUpHeight;\r\n\t\t\t\t\t\titem.left = offset.left;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase this.util.POS_BOTTOMLEFT:\r\n\t\t\t\t\t\titem.top =  offset.top;\r\n\t\t\t\t\t\titem.left = offset.left - popUpWidth;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase this.util.POS_BOTTOMRIGHT:\r\n\t\t\t\t\t\titem.top =  offset.top;\r\n\t\t\t\t\t\titem.left = offset.left;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t  }\r\n\t\t\t  }\r\n\t\t\t  return item;\r\n\t\t};\r\n\t\r\n\t\tthis.__getSuggestedPosition = function(event,position)\r\n\t\t{\r\n\t\t\t  var popUpWidth = this.__popUp.clientWidth;\r\n\t\t\t  var popUpHeight = this.__popUp.clientHeight;\r\n\t\t\t  var offset = {};\r\n\t\t\t  if(this.util.isElement(event))\r\n\t\t\t  {\r\n\t\t\t\t  var coords = this.__getAbsoluteOffset(event);\r\n\t\t\t\t  offset = {\r\n\t\t\t        top: coords.top + event.offsetHeight,\r\n\t\t\t        left: coords.left\r\n\t\t\t\t  };\r\n\t\t\t  }\r\n\t\t\t  else\r\n\t\t\t  {\r\n\t\t\t\t  event = this.util.getEvent(event);\r\n\t\t\t\t  offset = this.util.getEventPosition(event);\r\n\t\t\t  }\r\n\t\t\t  var top = this.win.scrollY;\r\n\t\t\t  var left = this.win.scrollX;\r\n\t\t\t  var totalWidth = this.win.innerWidth;\r\n\t\t\t  var totalHeight = this.win.innerHeight;\r\n\t\t\t\r\n\t\t\t  var objPosition = {};\r\n\t\t\t  objPosition[this.util.POS_TOP] = true;\r\n\t\t\t  objPosition[this.util.POS_BOTTOM] = true;\r\n\t\t\t  objPosition[this.util.POS_LEFT] = true;\r\n\t\t\t  objPosition[this.util.POS_RIGHT] = true;\r\n\t\t\t  if (offset.top < top) \r\n\t\t\t  {\r\n\t\t\t\t  objPosition[this.util.POS_TOP] = false;\r\n\t\t\t  }\r\n\t\t\t  if (offset.top + popUpHeight > top + totalHeight) \r\n\t\t\t  {\r\n\t\t\t\t  objPosition[this.util.POS_BOTTOM] = false;\r\n\t\t\t  }\r\n\t\t\t  if (offset.left < left)\r\n\t\t\t  {\r\n\t\t\t\t  objPosition[this.util.POS_LEFT] = false;\r\n\t\t\t  }\r\n\t\t\t  if (offset.left + popUpWidth > left + totalWidth) \r\n\t\t\t  {\r\n\t\t\t\t  objPosition[this.util.POS_RIGHT] = false;\r\n\t\t\t  }\r\n\t\t\t\r\n\t\t\t  var positions = position.split(\"-\");\r\n\t\t\t  //below loop tries to give favourable position like bottom-right so if position has bottom and right both true it returns that position\r\n\t\t\t  for (var count = 0; count < positions.length; count++) \r\n\t\t\t  {\r\n\t\t\t\tif (!objPosition[positions[count]]) \r\n\t\t\t\t{\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}   \r\n\t\t\t\tif (count === positions.length - 1) \r\n\t\t\t\t{\r\n\t\t\t\t  return position;\r\n\t\t\t\t}\r\n\t\t\t  }\r\n\t\t\t  //below loop tries to give one favourable position like in bottom-right if bottom is true or right is true it gets returned\r\n\t\t\t  for (var count = 0; count < positions.length; count++) \r\n\t\t\t  {\r\n\t\t\t\tif (objPosition[positions[count]]) \r\n\t\t\t\t{\r\n\t\t\t\t\treturn positions[count];\r\n\t\t\t\t}\r\n\t\t\t  }\r\n\t\t\t  if (objPosition[position]) \r\n\t\t\t  {\r\n\t\t\t\t  return position;\r\n\t\t\t  }\r\n\t\t\t  for(var tmpPosition in objPosition)\r\n\t\t\t  {\r\n\t\t\t\t  if (objPosition[tmpPosition]) \r\n\t\t\t\t  {\r\n\t\t\t\t\t  return tmpPosition;\r\n\t\t\t\t  }\r\n\t\t\t  }\r\n\t\t};\r\n\t\tthis.__getAbsoluteOffset = function(elem) {\r\n\t\t    var x = 0, y = 0;\r\n\t\t    while (elem) {\r\n\t\t        x += (elem.offsetLeft - elem.scrollLeft + elem.clientLeft);\r\n\t\t        y += (elem.offsetTop - elem.scrollTop + elem.clientTop);\r\n\t\t        elem = elem.offsetParent;\r\n\t\t    }\r\n\t\t    return { top: y, left: x };\r\n\t\t};\r\n\t\tthis.__initialize();\r\n\t};\r\n\t\r\n\tNSUtil.prototype.nsToolTipInElement = function(doc)\r\n\t{\r\n\t\tthis.util = new NSUtil();\r\n\t\tthis.doc = this.util.getDoc(doc);\r\n\t\tthis.__nsToolTip = null;\r\n\t\tthis.__nsToolTipContent = null;\r\n\t\tthis.__documentClickHandlerRef = null;\r\n\t\t\r\n\t\tthis.addToolTip = function(element,toolTipHTML)\r\n\t\t{\r\n\t\t\telement = this.util.getElement(element);\r\n\t\t\tif(element && toolTipHTML && toolTipHTML.length > 0)\r\n\t\t\t{\r\n\t\t\t\tthis.__createToolTip();\r\n\t\t\t\tthis.util.addStyleClass(element,\"nsElementTooltip\");\r\n\t\t\t\telement.setAttribute(\"nsToolTip\",toolTipHTML);\r\n\t\t\t\tthis.util.addEvent(element,\"mouseover\",this.__elementMouseOverHandler.bind(this));\r\n\t\t\t\tthis.util.addEvent(element,\"mouseout\",this.__elementMouseOutHandler.bind(this));\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\tthis.__createToolTip = function()\r\n\t\t{\r\n\t\t\tif(!this.__nsToolTip)\r\n\t\t\t{\r\n\t\t\t\tvar id = \"nsElementToolTip\" + this.util.getUniqueId();\r\n\t\t\t\tthis.__nsToolTip = this.util.createElement(\"span\",id + \"ElementTooltipContainer\", \"nsElementTooltipContainer\");\r\n\t\t\t\tvar arrow = this.util.createElement(\"span\",id + \"ElementTooltipArrow\", \"nsElementTooltipTipArrow\");\r\n\t\t\t\tthis.__nsToolTip.appendChild(arrow);\r\n\t\t\t\tthis.__nsToolTipContent = this.util.createElement(\"span\",id + \"ElementTooltipContent\", \"nsElementTooltipContent\");\r\n\t\t\t\tthis.__nsToolTip.appendChild(this.__nsToolTipContent);\r\n\t\t\t\tthis.doc.body.appendChild(this.__nsToolTip);\r\n\t\t\t\tif(!this.__documentClickHandlerRef)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.__documentClickHandlerRef = this.__documentClickHandler.bind(this);\r\n\t\t\t\t\tthis.util.addEvent(this.doc,\"click\",this.__documentClickHandlerRef);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\tthis.__elementMouseOverHandler = function(event)\r\n\t\t{\r\n\t\t\tevent = this.util.getEvent(event);\r\n\t\t\tvar target = this.util.getTarget(event);\r\n\t\t\tif(!this.util.hasStyleClass(target, \"nsElementTooltip\"))\r\n\t\t\t{\r\n\t\t\t\ttarget = this.util.findParentBySelector(target,\".nsElementTooltip\");\r\n\t\t\t}\r\n\t\t\tif(target)\r\n\t\t\t{\r\n\t\t\t\tvar toolTipHTML = target.getAttribute(\"nsToolTip\");\r\n\t\t\t\t//var parentWithScroll = \r\n\t\t\t\tthis.__nsToolTipContent.innerHTML = toolTipHTML;\r\n\t\t\t\tvar offset = this.util.getEventPosition(event);\r\n\t\t\t\tthis.__nsToolTip.style.left = offset.left + \"px\";\r\n\t\t\t\tthis.__nsToolTip.style.top = offset.top + \"px\";\r\n\t\t\t\tthis.util.addStyleClass(this.__nsToolTip,\"nsElementTooltipContainerVisible\");\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\tthis.__elementMouseOutHandler = function(event)\r\n\t\t{\r\n\t\t\tthis.util.removeStyleClass(this.__nsToolTip,\"nsElementTooltipContainerVisible\");\r\n\t\t};\r\n\t\t\r\n\t\tthis.__documentClickHandler = function(event)\r\n\t\t{\r\n\t\t\tthis.__elementMouseOutHandler();\r\n\t\t};\r\n\t};\r\n\t\r\n\tNSUtil.prototype.nsCSSAnimationHelper = function()\r\n\t{\r\n\t\tthis.util = new NSUtil();\r\n\t\tthis.__prefixes = [\"webkit\", \"moz\", \"MS\", \"o\", \"\"];\r\n\t\t\r\n\t\tthis.addStartEvent = function(element,callback)\r\n\t\t{\r\n\t\t\tthis.__addEvent(element,\"AnimationStart\",callback);\r\n\t\t};\r\n\t\t\r\n\t\tthis.addIterationEvent = function(element,callback)\r\n\t\t{\r\n\t\t\tthis.__addEvent(element,\"AnimationIteration\",callback);\r\n\t\t};\r\n\t\t\r\n\t\tthis.addEndEvent = function(element,callback)\r\n\t\t{\r\n\t\t\tthis.__addEvent(element,\"AnimationEnd\",callback);\r\n\t\t};\r\n\t\t\r\n\t\tthis.removeStartEvent = function(element,callback)\r\n\t\t{\r\n\t\t\tthis.__removeEvent(element,\"AnimationStart\",callback);\r\n\t\t};\r\n\t\t\r\n\t\tthis.removeIterationEvent = function(element,callback)\r\n\t\t{\r\n\t\t\tthis.__removeEvent(element,\"AnimationIteration\",callback);\r\n\t\t};\r\n\t\t\r\n\t\tthis.removeEndEvent = function(element,callback)\r\n\t\t{\r\n\t\t\tthis.__removeEvent(element,\"AnimationEnd\",callback);\r\n\t\t};\r\n\t\t\r\n\t\tthis.__addEvent = function(element,type,callback) \r\n\t\t{\r\n\t\t    for (var count = 0; count < this.__prefixes.length; count++) \r\n\t\t    {\r\n\t\t        if (!this.__prefixes[count])\r\n\t\t        {\r\n\t\t        \ttype = type.toLowerCase();\r\n\t\t        }\r\n\t\t        var eventType = this.__prefixes[count] + type;\r\n\t\t        this.util.addEvent(element,eventType,callback);\r\n\t\t    }\r\n\t\t};\r\n\t\t\r\n\t\tthis.__removeEvent = function(element,type,callback) \r\n\t\t{\r\n\t\t    for (var count = 0; count < this.__prefixes.length; count++) \r\n\t\t    {\r\n\t\t        if (!this.__prefixes[count])\r\n\t\t        {\r\n\t\t        \ttype = type.toLowerCase();\r\n\t\t        }\r\n\t\t        var eventType = this.__prefixes[count] + type;\r\n\t\t        this.util.removeEvent(element,eventType,callback);\r\n\t\t    }\r\n\t\t};\r\n\t};\r\n\t\r\n\tNSUtil.prototype.nsResizeListener = function(doc,win)\r\n\t{\r\n\t\tthis.util = new NSUtil();\r\n\t\tthis.doc = this.util.getDoc(doc);\r\n\t\tthis.win = this.util.getWin(win);\r\n\t\tthis.__windowResizeRef = null;\r\n\t\t\r\n\t\tthis.addResizeListener = function(element,callback) \r\n\t\t{\r\n\t\t\tif(this.__isResizeObserverSupported())\r\n\t\t\t{\r\n\t\t\t\tthis.__addResizeObserver(element,callback);\r\n\t\t\t}\r\n\t\t\telse if(this.__isMutationSupported()) \r\n\t\t\t{\r\n\t\t\t\tthis.__addMutationObserver(element,callback);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tthis.__addResizeListener(element,callback);\r\n\t\t\t}\r\n\t    };\r\n\t    //below method will not work as we have to store the reference and then detach it\r\n\t    this.removeResizeListener = function(element,callback) \r\n\t    {\r\n\t    \tif(this.__isResizeObserverSupported())\r\n\t\t\t{\r\n\t    \t\tthis.__removeResizeObserver(element,callback);\r\n\t\t\t}\r\n\t    \telse if(this.__isMutationSupported())\r\n\t    \t{\r\n\t    \t\tif(this.__windowResizeRef)\r\n\t\t\t\t{\r\n\t    \t\t\tthis.util.removeEvent(this.win,\"resize\",this.__windowResizeRef);\r\n\t    \t\t\tthis.__windowResizeRef = null;\r\n\t\t\t\t}\r\n\t    \t}\r\n\t    \telse\r\n\t    \t{\r\n\t    \t\telement.__resizeListeners__.splice(element.__resizeListeners__.indexOf(callback), 1);\r\n\t            if (!element.__resizeListeners__.length) \r\n\t            {\r\n\t                if (attachEvent) \r\n\t                {\r\n\t                \telement.detachEvent('onresize', this.__resizeListener.bind(this));\r\n\t                }\r\n\t                else \r\n\t                {\r\n\t                    element.__resizeTrigger__.contentDocument.defaultView.removeEventListener('resize', this.__resizeListener.bind(this));\r\n\t                    element.__resizeTrigger__ = !element.removeChild(element.__resizeTrigger__);\r\n\t                }\r\n\t            }\r\n\t    \t}\r\n\t    };\r\n\t    \r\n\t    this.__addResizeObserver = function(element,callback)\r\n\t    {\r\n\t    \t//For performance reason creating 1 instance of ResizeObserver\r\n\t\t\tif(!NSUtil.__resizeObserverInstance)\r\n\t\t\t{\r\n\t\t\t\tNSUtil.__resizeObserverInstance = new ResizeObserver(function(entries)\r\n\t\t\t\t{\r\n\t\t\t\t\tfor (var count = 0;count < entries.length; count++) \r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tvar entry = entries[count];\r\n\t\t\t\t\t\tvar callbacks = NSUtil.__resizeObserverCallbacks.get(entry.target);\r\n\t\t\t\t\t\tif (callbacks) \r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tcallbacks.forEach(function logSetElements(key,value,set) \r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tvalue(entry,entry.target);\r\n\t\t\t\t\t\t\t\t  //console.log(key);\r\n\t\t\t\t\t\t\t\t  //console.log(value);\r\n\t\t\t\t\t\t\t\t  //console.log(set);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\tfor (var innerCount = 0;innerCount < callbacks.length; innerCount++) \r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tcallbacks[innerCount](entry,entry.target);\r\n\t\t\t\t\t\t\t}\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}\r\n\t\t\tif (!NSUtil.__resizeObserverCallbacks) \r\n\t\t\t{\r\n\t\t\t\tNSUtil.__resizeObserverCallbacks = new Map();\r\n\t\t\t}\r\n\t\t\tvar callbacks = NSUtil.__resizeObserverCallbacks.get(element);\r\n\t\t\tif (!callbacks) \r\n\t\t\t{\r\n\t\t\t\tcallbacks = new Set();\r\n\t\t\t\tNSUtil.__resizeObserverCallbacks.set(element,callbacks);\r\n\t\t\t}\r\n\t\t\tcallbacks.add(callback);\r\n\t\t\tNSUtil.__resizeObserverInstance.observe(element);\r\n\t    };\r\n\t    \r\n\t    this.__addMutationObserver = function(element,callback)\r\n\t    {\r\n\t    \tvar self = this;\r\n\t\t\tfunction getParameter(ele) \r\n\t\t\t{\r\n\t\t\t\tif(ele)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn [ele.style.width,ele.style.height,ele.clientWidth,ele.clientHeight].join('');\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tvar win = self.win;\r\n\t\t\t\t\treturn [win.innerWidth,win.innerHeight].join('');\r\n\t\t\t\t}\r\n\t\t\t    \r\n\t\t\t}\r\n\t\t\tvar resizeCallback = function(event)\r\n\t\t\t{\r\n\t\t\t\tvar current = getParameter(element);\r\n\t\t\t\tvar currentWin = getParameter();\r\n\t\t\t\tif (current !== last || currentWin !== lastWin) \r\n\t\t\t\t{\r\n\t\t\t\t\tlast = current;\r\n\t\t\t\t\tlastWin = currentWin;\r\n\t\t\t\t\tcallback(event,element);\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t};\r\n\t\t\tvar last = getParameter(element);\r\n\t\t\tvar lastWin = getParameter();\r\n\t\t\tvar observer = new MutationObserver(function (mutations) \r\n\t\t\t{\r\n\t\t\t\tfor (var count = 0; count < mutations.length; count++) \r\n\t\t\t\t{\r\n\t\t\t\t    var mutation = mutations[count];\r\n\t\t\t\t    if (mutation.attributeName !== \"style\")\r\n\t\t\t\t    {\r\n\t\t\t\t    \tcontinue;\r\n\t\t\t\t    }\r\n\t\t\t\t    if(resizeCallback())\r\n\t\t\t\t    {\r\n\t\t\t\t    \t  break;\r\n\t\t\t\t    }\r\n\t\t\t    }\r\n\t\t\t});\r\n\t\t\tobserver.observe(element,{\r\n\t\t\t    attributes: true,\r\n\t\t\t    childList: false,\r\n\t\t\t    characterData: false\r\n\t\t\t});\r\n\t\t\tif(!this.__windowResizeRef)\r\n\t\t\t{\r\n\t\t\t\tthis.__windowResizeRef = resizeCallback.bind(this);\r\n\t\t\t\tthis.util.addEvent(this.win,\"resize\",this.__windowResizeRef);\r\n\t\t\t}\r\n\t    };\r\n\t    \r\n\t    this.__addResizeListener = function(element,callback)\r\n\t    {\r\n\t    \tif (!element.__resizeListeners__) \r\n\t        {\r\n\t            element.__resizeListeners__ = [];\r\n\t            if (this.doc.attachEvent) \r\n\t            {\r\n\t                element.__resizeTrigger__ = element;\r\n\t                element.attachEvent('onresize', this.__resizeListener.bind(this));\r\n\t            } \r\n\t            else \r\n\t            {\r\n\t                if (getComputedStyle(element).position === 'static') \r\n\t                {\r\n\t                \telement.style.position = 'relative';\r\n\t                }\r\n\t                var obj = element.__resizeTrigger__ = this.doc.createElement('object');\r\n\t                this.util.addStyleClass(obj,\"nsResizeDetector\");\r\n\t                obj.setAttribute('style', 'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden; pointer-events: none; z-index: -1;');\r\n\t                obj.__resizeElement__ = element;\r\n\t                obj.onload = this.__objectLoad.bind(this);\r\n\t                obj.type = 'text/html';\r\n\t                var isIE = navigator.userAgent.match(/Trident/);//this.util.isBrowserIE();\r\n\t                if(isIE) \r\n\t                {\r\n\t                \telement.appendChild(obj);\r\n\t                }\r\n\t                obj.data = 'about:blank';\r\n\t                if(!isIE) \r\n\t                {\r\n\t                \telement.appendChild(obj);\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t        element.__resizeListeners__.push(callback);\r\n\t    };\r\n\t    \r\n\t    //if callback is null then delete and unobserver the element else just delete the callback\r\n\t    this.__removeResizeObserver = function(element,callback) \r\n\t    {\r\n\t\t\tvar callbacks = NSUtil.__resizeObserverCallbacks.get(element);\r\n\t\t\tif (callbacks) \r\n\t\t\t{\r\n\t\t\t\tcallback && callbacks.delete(callback);\r\n\t\t\t\tif (!callback || !callbacks.size) \r\n\t\t\t\t{\r\n\t\t\t\t\tNSUtil.__resizeObserverCallbacks.delete(element);\r\n\t\t\t\t\tNSUtil.__resizeObserverInstance.unobserve(element);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (NSUtil.__resizeObserverCallbacks && !NSUtil.__resizeObserverCallbacks.size) \r\n\t\t\t{\r\n\t\t\t\tNSUtil.__resizeObserverCallbacks = null;\r\n\t\t\t\tNSUtil.__resizeObserverInstance = null;\r\n\t\t\t}\r\n\t    };\r\n\t    \r\n\t    this.__resizeListener = function(event) \r\n\t    {\r\n\t    \tvar requestAnimation = function()\r\n\t    \t{\r\n\t    \t\t var trigger = win.__resizeTrigger__;\r\n\t             trigger.__resizeListeners__.forEach(function (callback) \r\n\t             {\r\n\t                 callback(event,trigger);\r\n\t             });\r\n\t    \t};\r\n\t    \tvar win = this.util.getTarget(event);\r\n\t        if (win.__resizeRAF__) \r\n\t        {\r\n\t        \tthis.util.getCancelAnimationFrame.bind(this.win)(win.__resizeRAF__);\r\n\t        }\r\n\t        win.__resizeRAF__ = this.util.getRequestAnimationFrame.bind(this.win)(requestAnimation.bind(this));\r\n\t    };\r\n\t\r\n\t    this.__objectLoad = function(event) \r\n\t    {\r\n\t    \tvar target = this.util.getTarget(event);\r\n\t    \ttarget.contentDocument.defaultView.__resizeTrigger__ = target.__resizeElement__;\r\n\t    \ttarget.contentDocument.defaultView.addEventListener('resize', this.__resizeListener.bind(this));\r\n\t    };\r\n\t    \r\n\t    this.__isMutationSupported = function()\r\n\t    {\r\n\t    \treturn (\"MutationObserver\" in this.win);\r\n\t    };\r\n\t    \r\n\t    this.__isResizeObserverSupported = function()\r\n\t    {\r\n\t    \treturn (\"ResizeObserver\" in this.win);\r\n\t    };\r\n\t};\r\n\t\r\n\t//if renderer component is refreshed using updateRowByIndex,updateRowByKeyField,updateCellByIndex,updateCellByKeyField \r\n    //then React throws error in removeChild as Grid is internally deleting all cell element while reRendering data\r\n\tNSUtil.prototype.overrideRemoveChild = function()\r\n\t{\r\n\t\tif(!Element.prototype.__removeChild) \r\n\t\t{\r\n\t\t\tDocument.prototype.__removeChild = Document.prototype.removeChild;\r\n\t\t\tElement.prototype.__removeChild = Element.prototype.removeChild;\r\n\t\t\t\r\n\t\t\tDocument.prototype.removeChild = Element.prototype.removeChild = function removeChild(child) \r\n\t\t\t{\r\n\t\t\t\tif(child && child.parentNode) \r\n\t\t\t\t{\r\n\t\t\t\t\tif(child.parentNode == this)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis.__removeChild(child);\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\tchild.parentNode.__removeChild(child);\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\t\r\n\tif (!String.prototype.startsWith) \r\n\t{\r\n\t\t  String.prototype.startsWith = function(searchString, position) \r\n\t\t  {\r\n\t\t    position = position || 0;\r\n\t\t    return this.indexOf(searchString, position) === position;\r\n\t\t  };\r\n\t}\r\n\t\r\n\tif (!Element.prototype.matches) \r\n\t{\r\n\t    Element.prototype.matches = Element.prototype.msMatchesSelector;\r\n\t}\r\n\t\r\n\t(function(doc, proto) \r\n\t{\r\n\t  try \r\n\t  { // check if browser supports :scope natively\r\n\t    doc.querySelector(':scope body');\r\n\t  } \r\n\t  catch (err) \r\n\t  { // polyfill native methods if it doesn't\r\n\t    ['querySelector', 'querySelectorAll'].forEach(function(method) \r\n\t    {\r\n\t      var nativ = proto[method];\r\n\t      proto[method] = function(selectors) \r\n\t      {\r\n\t        if (/(^|,)\\s*:scope/.test(selectors)) { // only if selectors contains :scope\r\n\t          var id = this.id; // remember current element id\r\n\t          this.id = 'ID_' + Date.now(); // assign new unique id\r\n\t          selectors = selectors.replace(/((^|,)\\s*):scope/g, '$1#' + this.id); // replace :scope with #ID\r\n\t          var result = doc[method](selectors);\r\n\t          this.id = id; // restore previous id\r\n\t          return result;\r\n\t        } else {\r\n\t          return nativ.call(this, selectors); // use native code for other selectors\r\n\t        }\r\n\t      };\r\n\t    });\r\n\t  }\r\n\t})(this.doc, Element.prototype);\r\n\t\r\n\treturn NSUtil;\r\n})();\r\nnsModuleExport(this,\"NSUtil\",NSUtil);";
