fit-ui
Version:
Object Oriented framework for building rich User Interfaces
1 lines • 450 kB
JavaScript
(function(factory){if(typeof module==="object"&&typeof module.exports==="object"){var fit=factory();module.exports=fit;Object.defineProperty(module.exports,"__esModule",{value:true})}else if(typeof define==="function"&&define.amd){define(["require","exports"],factory)}else if(window){var src=document.scripts[document.scripts.length-1].src;var paramSeparatorPos=src.indexOf("?");if(paramSeparatorPos>-1){var name=src.substring(paramSeparatorPos+1,src.indexOf("&")===-1?src.length:src.indexOf("&"));if(name.indexOf("=")===-1){window[name]=factory()}else{window.Fit=factory()}}else{window.Fit=factory()}}})(function(){var fitInstance=function(){(function(){if(!window.JSON||!window.NodeList){if(navigator.userAgent.indexOf("MSIE")>-1)throw new Error("Browser not supported - Internet Explorer 8 or newer is required - make sure Compatibility View is not enabled");else throw new Error("Browser not supported")}return true})();(function(){if(!window.console)window.console={};var shims=["log","debug","info","error","warn","trace"];for(var i=0;i<shims.length;i++){if(!console[shims[i]])console[shims[i]]=function(){}}})();var Fit={};Fit.Core={};Fit.Core.Extend=function(subInstance,superType){Fit.Validation.ExpectIsSet(subInstance);Fit.Validation.ExpectFunction(superType);var binder={Apply:function(){superType.apply(subInstance,arguments);if(!subInstance._internal)subInstance._internal={};if(!subInstance._internal.Extends)subInstance._internal.Extends=[];Fit.Array.Add(subInstance._internal.Extends,superType)}};return binder};Fit.Core.Extends=function(instance,superType){Fit.Validation.ExpectIsSet(instance);Fit.Validation.ExpectFunction(superType);return instance._internal!==undefined&&instance._internal.Extends!==undefined&&Fit.Array.Contains(instance._internal.Extends,superType)===true};Fit.Core.InstanceOf=function(instance,type){return instance instanceof type||Fit.Core.Extends(instance,type)===true};Fit.Core.CreateOverride=function(originalFunction,newFunction){Fit.Validation.ExpectFunction(originalFunction);Fit.Validation.ExpectFunction(newFunction);return function(){var orgBase=window.base;window.base=originalFunction;var error=null;var result=undefined;try{var args=[];for(var i=0;i<arguments.length;i++)args[i]=arguments[i];if(args.length>0)result=newFunction.apply(this,args);else result=newFunction.apply(this)}catch(err){error=err}if(orgBase){window.base=orgBase}else{try{delete window.base}catch(err){window.base=undefined}}if(error!==null)Fit.Validation.ThrowError(error);if(result!==undefined)return result}};Fit.Core.CreateDebouncer=function(func,timeoutMilliseconds,thisArg){var timeout=-1;var lastArgs=[];var d={Cancel:function(){if(timeout!==-1){clearTimeout(timeout);lastArgs=[];timeout=-1}},Invoke:function(){if(timeout!==-1){clearTimeout(timeout)}lastArgs=arguments;timeout=setTimeout(function(){var args=lastArgs;lastArgs=[];timeout=-1;func.apply(thisArg||this,args)},timeoutMilliseconds)},Flush:function(){if(timeout!==-1){var args=lastArgs;d.Cancel();func.apply(thisArg||this,args)}}};return d};Fit.Core.IsEqual=function(jsObj1,jsObj2){if(typeof jsObj1!==typeof jsObj2)return false;if(jsObj1===undefined&&jsObj2===undefined||jsObj1===null&&jsObj2===null){return true}else if(typeof jsObj1==="string"||typeof jsObj1==="boolean"){return jsObj1===jsObj2}else if(typeof jsObj1==="number"){if(isNaN(jsObj1)===true&&isNaN(jsObj2)===true)return true;else return jsObj1===jsObj2}else if(jsObj1 instanceof Date&&jsObj2 instanceof Date){return jsObj1.getTime()===jsObj2.getTime()}else if(jsObj1 instanceof Array&&jsObj2 instanceof Array){if(jsObj1.length!==jsObj2.length)return false;for(var i=0;i<jsObj1.length;i++){if(Fit.Core.IsEqual(jsObj1[i],jsObj2[i])===false)return false}return true}else if(typeof jsObj1==="object"&&typeof jsObj2==="object"&&jsObj1!==null&&jsObj2!==null){var identical=true;var keys=Fit.Array.Merge(Fit.Array.GetKeys(jsObj1),Fit.Array.GetKeys(jsObj2));Fit.Array.ForEach(keys,function(k){if(Fit.Core.IsEqual(jsObj1[k],jsObj2[k])===false){identical=false;return false}});return identical}else if(typeof jsObj1==="function"&&typeof jsObj2==="function"){return jsObj1===jsObj2}return false};Fit.Core.MergeOverwriteBehaviour={Always:"Always",SkipNullAndUndefined:"SkipNullAndUndefined",Never:"Never"};Fit.Core.Merge=function(targetObject,mergeObject,mergeObjectOverwriteBehaviour){Fit.Validation.ExpectObject(targetObject);Fit.Validation.ExpectObject(mergeObject);Fit.Validation.ExpectStringValue(mergeObjectOverwriteBehaviour,true);var isObject=function(val){return val!==undefined&&val!==null&&typeof val==="object"&&val instanceof Date===false&&val instanceof Array===false};var newObject=Fit.Core.Clone(targetObject);Fit.Array.ForEach(mergeObject,function(prop){if(isObject(newObject[prop])&&isObject(mergeObject[prop])){newObject[prop]=Fit.Core.Merge(newObject[prop],mergeObject[prop],mergeObjectOverwriteBehaviour)}else{if(mergeObjectOverwriteBehaviour===Fit.Core.MergeOverwriteBehaviour.SkipNullAndUndefined&&(mergeObject[prop]===null||mergeObject[prop]===undefined)){return}else if(mergeObjectOverwriteBehaviour===Fit.Core.MergeOverwriteBehaviour.Never&&prop in newObject){return}newObject[prop]=mergeObject[prop]}});return newObject};Fit.Core.Clone=function(obj){var serialized=JSON.stringify(obj);var clone=serialized!==undefined?JSON.parse(serialized):serialized;var fixClone=null;fixClone=function(org,clo){if(org instanceof Date){return new Date(org.getTime())}else if(typeof org==="function"){return org}else if(typeof org==="number"&&isNaN(org)===true){return parseInt("")}else if(typeof org==="number"&&org===Infinity){return Infinity}else if(org instanceof RegExp){var flags="";if(org.ignoreCase)flags+="i";if(org.global)flags+="g";if(org.multiline)flags+="m";if(org.sticky)flags+="y";return new RegExp(org.source,flags)}else if(org&&typeof org==="object"){for(var p in org)clo[p]=fixClone(org[p],clo[p])}return clo};clone=fixClone(obj,clone);return clone};Fit._internal={Core:{VersionInfo:{Major:3,Minor:2,Patch:12}}};Fit._internal.Core.EnsureStyles=function(){if(Fit._internal.Core.StylesEnsured===true)return;Fit._internal.Core.StylesEnsured=true;Fit.Events.OnDomReady(function(){var elm=Fit.Dom.CreateElement("<div class='FitUiStyleCheck'></div>");Fit.Dom.Add(document.body,elm);if(Fit.Dom.GetComputedStyle(elm,"width")!=="20px"){Fit.Browser.Log("Lazy loading Fit.UI stylesheet. It is recommended to add a stylesheet reference to Fit.UI.min.css to prevent temporarily unstyled content.");Fit.Loader.LoadStyleSheet(Fit.GetUrl()+"/Fit.UI.min.css?cacheKey="+Fit.GetVersion().Version)}Fit.Dom.Remove(elm)})};(function(){var script=document.querySelector("script#FitUI")||document.querySelector("script#fitui")||document.scripts[document.scripts.length-1];var src=script&&script.src||null;if(!src){src=location.href}Fit._internal.BaseUrl=src.substring(0,src.lastIndexOf("/"));var path=Fit._internal.BaseUrl.replace("http://","").replace("https://","");Fit._internal.BasePath=path.indexOf("/")!==-1?path.substring(path.indexOf("/")):"/"})();Fit.GetVersion=function(){var info=Fit.Core.Clone(Fit._internal.Core.VersionInfo);info.Version=info.Major+"."+info.Minor+"."+info.Patch;return info};Fit.GetUrl=function(){if(Fit._internal.BaseUrlOverride!==undefined)return Fit._internal.BaseUrlOverride;return Fit._internal.BaseUrl};Fit.GetPath=function(){if(Fit._internal.BasePathOverride!==undefined)return Fit._internal.BasePathOverride;return Fit._internal.BasePath};Fit.SetPath=function(basePath){Fit.Validation.ExpectStringValue(basePath===null?"-":basePath);if(basePath===null){delete Fit._internal.BasePathOverride;delete Fit._internal.BaseUrlOverride;return}if(basePath!=="/"&&basePath.lastIndexOf("/")===basePath.length-1){basePath=basePath.substring(0,basePath.length-1)}var rootUrl=location.protocol+"//"+location.host;Fit._internal.BasePathOverride=basePath;if(basePath==="/"){Fit._internal.BaseUrlOverride=rootUrl}else if(basePath.indexOf("/")===0){Fit._internal.BaseUrlOverride=rootUrl+basePath}else{var curPath=location.pathname.substring(0,location.pathname.lastIndexOf("/"));Fit._internal.BaseUrlOverride=rootUrl+curPath+"/"+basePath}};Fit.SetUrl=function(baseUrl){Fit.Validation.ExpectStringValue(baseUrl===null?"-":baseUrl);if(baseUrl===null){Fit.SetPath(null);return}var url=Fit.Browser.ParseUrl(baseUrl);Fit.SetPath(url.FullPath);var newUrl=url.Url.lastIndexOf("/")===url.Url.length-1?url.Url.substring(0,url.Url.length-1):url.Url;Fit._internal.BaseUrlOverride=newUrl};Fit.Validation={};Fit._internal.Validation={};Fit._internal.Validation.DebugMode=true;Fit._internal.Validation.Clone=null;(function(){if(!window.MSEventObj)window.MSEventObj=function(){};if(!window.StaticNodeList)window.StaticNodeList=function(){};if(!window.FileList)window.FileList=function(){};if(!window.File)window.File=function(){};if(!window.NamedNodeMap)window.NamedNodeMap=function(){}})();Fit.Validation.ExpectObject=function(val,allowNotSet){if(allowNotSet===true&&(val===undefined||val===null))return;if(!val||val.constructor!==Object)Fit.Validation.ThrowError("Value '"+val+"' is not a valid object")};Fit.Validation.ExpectNumber=function(val,allowNotSet){if(allowNotSet===true&&(val===undefined||val===null))return;if(typeof val!=="number"||isNaN(val)===true)Fit.Validation.ThrowError("Value '"+val+"' is not a valid number")};Fit.Validation.ExpectInteger=function(val,allowNotSet){if(allowNotSet===true&&(val===undefined||val===null))return;if(typeof val!=="number"||val%1!==0)Fit.Validation.ThrowError("Value '"+val+"' is not a valid integer")};Fit.Validation.ExpectString=function(val,allowNotSet){if(allowNotSet===true&&(val===undefined||val===null))return;if(typeof val!=="string")Fit.Validation.ThrowError("Value '"+val+"' is not a valid string")};Fit.Validation.ExpectStringValue=function(val,allowNotSet){if(allowNotSet===true&&(val===undefined||val===null))return;Fit.Validation.ExpectString(val);if(val==="")Fit.Validation.ThrowError("String cannot be empty")};Fit.Validation.ExpectBoolean=function(val,allowNotSet){if(allowNotSet===true&&(val===undefined||val===null))return;if(typeof val!=="boolean")Fit.Validation.ThrowError("Value '"+val+"' is not a valid boolean")};Fit.Validation.ExpectDate=function(val,allowNotSet){if(allowNotSet===true&&(val===undefined||val===null))return;if(val instanceof Date===false)Fit.Validation.ThrowError("Value '"+val+"' is not an instance of Date")};Fit.Validation.ExpectArray=function(val,allowNotSet){if(allowNotSet===true&&(val===undefined||val===null))return;if(val instanceof Array===false)Fit.Validation.ThrowError("Value '"+val+"' is not an instance of Array")};Fit.Validation.ExpectTypeArray=function(val,typeValCallback,allowNotSet){if(allowNotSet===true&&(val===undefined||val===null))return;if(val instanceof Array===false)Fit.Validation.ThrowError("Value '"+val+"' is not an instance of Array");Fit.Validation.ExpectFunction(typeValCallback);Fit.Array.ForEach(val,function(v){typeValCallback(v)})};Fit.Validation.ExpectInstanceArray=function(val,instanceType,allowNotSet){if(allowNotSet===true&&(val===undefined||val===null))return;if(val instanceof Array===false)Fit.Validation.ThrowError("Value '"+val+"' is not an instance of Array");Fit.Array.ForEach(val,function(v){Fit.Validation.ExpectInstance(v,instanceType)})};Fit.Validation.ExpectDictionary=function(val,typeValCallback,allowNotSet){if(allowNotSet===true&&(val===undefined||val===null))return;Fit.Validation.ExpectObject(val);Fit.Validation.ExpectFunction(typeValCallback);Fit.Array.ForEach(val,function(key){Fit.Validation.ExpectStringValue(key);typeValCallback(val[key])})};Fit.Validation.ExpectCollection=function(val,allowNotSet){if(allowNotSet===true&&(val===undefined||val===null))return;if(Fit._internal.Validation.IsCollectionType(val)===false)Fit.Validation.ThrowError("Value '"+val+"' is not a valid collection")};Fit.Validation.ExpectRegExp=function(val,allowNotSet){if(allowNotSet===true&&(val===undefined||val===null))return;if(val instanceof RegExp===false)Fit.Validation.ThrowError("Value '"+val+"' is not an instance of RegExp")};Fit.Validation.ExpectElement=function(val,allowNotSet){if(allowNotSet===true&&(val===undefined||val===null))return;if(window.HTMLElement&&val instanceof HTMLElement===false||val instanceof Element===false||val.style instanceof CSSStyleDeclaration===false)Fit.Validation.ThrowError("Value '"+val+"' is not an HTMLElement")};Fit.Validation.ExpectDomElement=Fit.Validation.ExpectElement;Fit.Validation.ExpectElementNode=Fit.Validation.ExpectElement;Fit.Validation.ExpectNode=function(val,allowNotSet){if(allowNotSet===true&&(val===undefined||val===null))return;if(!val.cloneNode||!val.nodeName||!val.nodeType||val.nodeType!==1&&val.nodeType!==3&&val.nodeType!==8)Fit.Validation.ThrowError("Value '"+val+"' is not a Node (Element, Text, or Comment)")};Fit.Validation.ExpectTextNode=function(val,allowNotSet){if(allowNotSet===true&&(val===undefined||val===null))return;if(!val.cloneNode||!val.nodeName||val.nodeType!==3)Fit.Validation.ThrowError("Value '"+val+"' is not a Text node")};Fit.Validation.ExpectWindow=function(val,allowNotSet){if(allowNotSet===true&&(val===undefined||val===null))return;if(val instanceof Window===false)Fit.Validation.ThrowError("Value '"+val+"' is not an instance of Window")};Fit.Validation.ExpectFunction=function(val,allowNotSet){if(allowNotSet===true&&(val===undefined||val===null))return;if(typeof val!=="function")Fit.Validation.ThrowError("Value '"+val+"' is not a valid function")};Fit.Validation.ExpectEventTarget=function(val,allowNotSet){if(allowNotSet===true&&(val===undefined||val===null))return;if(typeof EventTarget!=="undefined"&&val instanceof EventTarget===false)Fit.Validation.ThrowError("Value '"+val+"' is not an instance of EventTarget");else if(!val.removeEventListener&&!val.attachEvent)Fit.Validation.ThrowError("Value '"+val+"' is not an instance of EventTarget")};Fit.Validation.ExpectEvent=function(val,allowNotSet){if(allowNotSet===true&&(val===undefined||val===null))return;if(val instanceof Event===false&&val instanceof MSEventObj===false)Fit.Validation.ThrowError("Value '"+val+"' is not an instance of Event")};Fit.Validation.ExpectInstance=function(val,instanceType,allowNotSet){if(allowNotSet===true&&(val===undefined||val===null))return;if(val instanceof instanceType===true||Fit.Core.Extends(val,instanceType)===true)return;Fit.Validation.ThrowError("Unsupported object type passed")};Fit.Validation.ExpectIsSet=function(val){if(Fit.Validation.IsSet(val)===false)Fit.Validation.ThrowError("Value not set")};Fit.Validation.IsSet=function(obj){return obj!==null&&obj!==undefined};Fit.Validation.ThrowError=function(msg){if(Fit._internal.Validation.DebugMode===true){if(window.console&&console.log)console.log("ThrowError: "+msg);if(window.console&&console.trace)console.trace()}throw new Error(msg)};Fit.Validation.GetStackTrace=function(){if(window.Error===undefined||Error.captureStackTrace===undefined)return"";var obj={};Error.captureStackTrace(obj,Fit.Validation.GetStackTrace);return obj.stack};Fit.Validation.Enabled=function(val){if(Fit.Validation.IsSet(val)===true){if(val===true){Fit._internal.Validation.DebugMode=true;if(Fit._internal.Validation.Clone!==null)Fit.Validation=Fit.Core.Clone(Fit._internal.Validation.Clone)}else{Fit._internal.Validation.DebugMode=false;if(Fit._internal.Validation.Clone===null)Fit._internal.Validation.Clone=Fit.Core.Clone(Fit.Validation);for(var f in Fit.Validation)if(f.indexOf("Expect")===0)Fit.Validation[f]=function(){}}}return Fit._internal.Validation.DebugMode===true};Fit._internal.Validation.IsCollectionType=function(val){if(val===null||val===undefined)return false;else if(val instanceof Array)return true;else if(val instanceof NodeList)return true;else if(val instanceof StaticNodeList)return true;else if(val instanceof HTMLCollection)return true;else if(val instanceof NamedNodeMap)return true;else if(val instanceof FileList)return true;else if(val instanceof StyleSheetList)return true;else if(val instanceof CSSRuleList)return true;else if(val.callee&&val.length!==null&&val.length!==undefined)return true;return false};Fit.Array={};Fit.Array.ForEach=function(obj,callback){Fit.Validation.ExpectFunction(callback);if(Fit._internal.Validation.IsCollectionType(obj)===true){var count=obj.length;var res=false;for(var i=0;i<obj.length;i++){res=callback(obj[i]);if(obj.length!==count)Fit.Validation.ThrowError("Collection was modified while iterating objects");if(res===false)return false}}else if(typeof obj==="object"){for(var i in obj)if(callback(i)===false)return false}return true};Fit.Array.Count=function(obj){if(Fit._internal.Validation.IsCollectionType(obj)===true){return obj.length}else if(typeof obj==="object"){var count=0;for(var i in obj)count++;return count}Fit.Validation.ThrowError("Unsupported collection type passed - unable to determine number of contained elements")};Fit.Array.HasItems=function(obj){if(Fit._internal.Validation.IsCollectionType(obj)===true){return obj.length>0}else if(typeof obj==="object"){for(var i in obj){return true}return false}Fit.Validation.ThrowError("Unsupported collection type passed - unable to determine number of contained elements")};Fit.Array.Recurse=function(arr,childrenProperty,callback){Fit.Validation.ExpectCollection(arr,true);Fit.Validation.ExpectStringValue(childrenProperty);Fit.Validation.ExpectFunction(callback);if(Fit.Validation.IsSet(arr)===false)return true;var count=arr.length;for(var i=0;i<arr.length;i++){if(arr.length!==count)Fit.Validation.ThrowError("Collection was modified while iterating objects");if(callback(arr[i])===false)return false;if(Fit.Validation.IsSet(arr[i][childrenProperty])===false)continue;if(arr[i][childrenProperty]instanceof Function){if(Fit.Array.Recurse(arr[i][childrenProperty](),childrenProperty,callback)===false)return false}else{if(Fit.Array.Recurse(arr[i][childrenProperty],childrenProperty,callback)===false)return false}}return true};Fit.Array.CustomRecurse=function(arr,callback){Fit.Validation.ExpectFunction(callback);if(arr!==undefined&&arr!==null&&Fit._internal.Validation.IsCollectionType(arr)===false)Fit.Validation.ThrowError("Unexpected collection type passed");Fit.Array.ForEach(arr,function(o){Fit.Array.CustomRecurse(callback(o),callback)})};Fit.Array.Add=function(arr,obj){Fit.Validation.ExpectArray(arr);arr.push(obj)};Fit.Array.Insert=function(arr,idx,obj){Fit.Validation.ExpectArray(arr);Fit.Validation.ExpectInteger(idx);arr.splice(idx,0,obj)};Fit.Array.Move=function(arr,fromIdx,toIdx){Fit.Validation.ExpectArray(arr);Fit.Validation.ExpectInteger(fromIdx);Fit.Validation.ExpectInteger(toIdx);if(fromIdx<arr.length){var obj=arr[fromIdx];Fit.Array.RemoveAt(arr,fromIdx);Fit.Array.Insert(arr,toIdx>0?toIdx:0,obj)}};Fit.Array.Merge=function(arr1,arr2){Fit.Validation.ExpectArray(arr1);Fit.Validation.ExpectArray(arr2);return arr1.concat(arr2)};Fit.Array.Remove=function(arr,obj){Fit.Validation.ExpectArray(arr);var idx=Fit.Array.GetIndex(arr,obj);if(idx!==-1)arr.splice(idx,1)};Fit.Array.RemoveAt=function(arr,idx){Fit.Validation.ExpectArray(arr);Fit.Validation.ExpectInteger(idx);arr.splice(idx,1)};Fit.Array.Clear=function(arr){Fit.Validation.ExpectArray(arr);arr.length=0};Fit.Array.GetIndex=function(arr,obj){Fit.Validation.ExpectCollection(arr);for(var i=0;i<arr.length;i++)if(arr[i]===obj)return i;return-1};Fit.Array.GetKeys=function(obj){var keys=[];if(Fit._internal.Validation.IsCollectionType(obj)===true){for(var i=0;i<obj.length;i++){keys.push(i)}}else if(typeof obj==="object"){for(var i in obj){keys.push(i)}}return keys};Fit.Array.Contains=function(arr,obj){Fit.Validation.ExpectCollection(arr);return Fit.Array.GetIndex(arr,obj)>-1};Fit.Array.Copy=function(arr){return Fit.Array.ToArray(arr)};Fit.Array.ToArray=function(coll){Fit.Validation.ExpectCollection(coll);var arr=[];for(var i=0;i<coll.length;i++)arr.push(coll[i]);return arr};Fit.Array.Join=function(arr,separator,callback){Fit.Validation.ExpectCollection(arr);Fit.Validation.ExpectString(separator);Fit.Validation.ExpectFunction(callback);var result="";Fit.Array.ForEach(arr,function(obj){result+=(result!==""?separator:"")+callback(obj)});return result};Fit.Browser={};Fit._internal.Browser={};Fit._internal.Browser.UserAgent=navigator.userAgent;Fit.Browser.GetBrowser=function(returnAppId){Fit.Validation.ExpectBoolean(returnAppId,true);var agent=Fit._internal.Browser.UserAgent;if(agent.indexOf("Edge/")>-1||returnAppId===true&&(agent.indexOf("Edg/")>-1||agent.indexOf("EdgiOS/")>-1||agent.indexOf("EdgA/")>-1))return"Edge";if(agent.indexOf("MSIE")>-1||agent.indexOf("Trident")>-1)return"MSIE";if(agent.indexOf("Opera")>-1||returnAppId===true&&(agent.indexOf("OPR/")>-1||agent.indexOf("OPT/")>-1))return"Opera";if(agent.indexOf("OPT/")>-1&&(agent.indexOf("iPhone;")>-1||agent.indexOf("iPad;")>-1))return"Safari";if(agent.indexOf("Firefox")>-1||returnAppId===true&&agent.indexOf("FxiOS/")>-1)return"Firefox";if(agent.indexOf("Chrome")>-1||returnAppId===true&&agent.indexOf("CriOS/")>-1)return"Chrome";if(agent.indexOf("Safari")>-1)return"Safari";return"Unknown"};Fit.Browser.GetVersion=function(returnAppVersion){Fit.Validation.ExpectBoolean(returnAppVersion,true);var browser=Fit.Browser.GetBrowser(returnAppVersion);var start=0;var end=0;var agent=Fit._internal.Browser.UserAgent;if(browser==="Edge"){var search=agent.indexOf("Edge/")>-1&&"Edge/"||agent.indexOf("Edg/")>-1&&"Edg/"||agent.indexOf("EdgiOS/")>-1&&"EdgiOS/"||agent.indexOf("EdgA/")>-1&&"EdgA/"||null;start=search!==null&&agent.indexOf(search)||-1;start=start!==-1?start+search.length:0;end=agent.indexOf(".",start);end=end!==-1?end:0}else if(browser==="Chrome"){var search=agent.indexOf("Chrome/")>-1&&"Chrome/"||agent.indexOf("CriOS/")>-1&&"CriOS/"||null;start=search!==null&&agent.indexOf(search)||-1;start=start!==-1?start+search.length:0;end=agent.indexOf(".",start);end=end!==-1?end:0}else if(browser==="Safari"){var search=agent.indexOf("CriOS/")>-1&&"CriOS/"||agent.indexOf("FxiOS/")>-1&&"FxiOS/"||agent.indexOf("EdgiOS/")>-1&&"EdgiOS/"||agent.indexOf("OPT/")>-1&&"OPT/"||null;if(search!==null){if(returnAppVersion!==true){start=agent.indexOf(" OS ");start=start!==-1?start+4:0;end=agent.indexOf("_",start);end=end!==-1?end:0}else{start=agent.indexOf(search);start=start!==-1?start+search.length:0;end=agent.indexOf(".",start);end=end!==-1?end:0}}else{start=agent.indexOf("Version/");start=start!==-1?start+8:0;end=agent.indexOf(".",start);end=end!==-1?end:0}}else if(browser==="MSIE"){if(agent.indexOf("MSIE")>-1){start=agent.indexOf("MSIE ");start=start!==-1?start+5:0;end=agent.indexOf(".",start);end=end!==-1?end:0}else if(agent.indexOf("Trident")>-1){start=agent.indexOf("rv:");start=start!==-1?start+3:0;end=agent.indexOf(".",start);end=end!==-1?end:0}}else if(browser==="Firefox"){var search=agent.indexOf("Firefox/")>-1&&"Firefox/"||agent.indexOf("FxiOS/")>-1&&"FxiOS/"||null;start=search!==null&&agent.indexOf(search)||-1;start=start!==-1?start+search.length:0;end=agent.indexOf(".",start);end=end!==-1?end:0}else if(browser==="Opera"){var search=agent.indexOf("Version/")>-1&&"Version/"||agent.indexOf("Opera ")>-1&&"Opera "||agent.indexOf("Opera/")>-1&&"Opera/"||agent.indexOf("OPR/")>-1&&"OPR/"||agent.indexOf("OPT/")>-1&&"OPT/"||null;start=search!==null&&agent.indexOf(search)||-1;start=start!==-1?start+search.length:0;end=agent.indexOf(".",start);end=end!==-1?end:0}if(start!==0&&start!==0)return parseInt(agent.substring(start,end));return-1};Fit.Browser.GetQueryString=function(alternativeUrl){Fit.Validation.ExpectString(alternativeUrl,true);var qs={Url:null,Parameters:{},Hash:null,Anchor:null};var url=alternativeUrl!==undefined?alternativeUrl:location.href;var params=url.indexOf("?")>-1?url.split("?")[1]:"";var hash=null;params=params.indexOf("#")>-1?params.split("#")[0]:params;hash=url.indexOf("#")>-1?url.split("#")[1]:null;qs.Url=url;qs.Hash=hash;qs.Anchor=hash;Fit.Array.ForEach(params!==""?params.split("&"):[],function(p){var keyval=p.split("=");try{qs.Parameters[decodeURIComponent(keyval[0])]=keyval.length>1?decodeURIComponent(keyval[1]):""}catch(err){qs.Parameters[keyval[0]]=keyval.length>1?keyval[1]:""}});return qs};Fit.Browser.ParseUrl=function(url){Fit.Validation.ExpectString(url);var doubleSlashes=/(^.*:\/\/.*?)\/\/(.*)/;while(doubleSlashes.test(url)===true){url=url.replace(doubleSlashes,"$1/$2")}var regEx=/(.+):\/\/((.+)@)?((.+):((\d+)\/?)?|(.+?)\/|(.+?)$)((.*)\?(.+)|(.*)#(.*)|(.*)$)/;var match=regEx.exec(url);var result={Url:null,Protocol:null,Port:null,Auth:null,Host:null,FullPath:null,Path:null,Resource:null,Parameters:{},Hash:null,Anchor:null};if(match===null){Fit.Validation.ThrowError("Unable to parse invalid URL - valid example: schema://[auth@]host[:port][/path/resource[?parm=val[#hash]]]")}if(match.length!==16){Fit.Validation.ThrowError("Unexpected parse error - internal error")}var fullPath=match[11]||match[13]||match[15]||"";var qs=Fit.Browser.GetQueryString(url);result.Url=url;result.Protocol=match[1].toLowerCase();result.Auth=match[3]||null;result.Host=match[5]||match[8]||match[9];result.Port=match[7]?parseInt(match[7]):-1;result.FullPath="/"+fullPath;result.Parameters=qs.Parameters;result.Hash=qs.Hash;result.Anchor=qs.Hash;result.Path="/";if(fullPath!==""){var pathInfo=fullPath.split("/");if(pathInfo.length===1){result.Resource=fullPath}else{result.Path+=pathInfo.slice(0,-1).join("/")+"/";if(pathInfo[pathInfo.length-1]!==""){result.Resource=pathInfo[pathInfo.length-1]}}}return result};Fit.Browser.GetLanguage=function(){var lang=null;if(navigator.language)lang=navigator.language.toLowerCase();else if(navigator.browserLanguage)lang=navigator.browserLanguage.toLowerCase();if(lang===null||lang==="")return"en";if(lang.length===2)return lang;if(lang.length===5)return lang.substring(0,2);return"en"};Fit.Browser.GetPageWidth=function(){var w=0;if(window.innerWidth){w=window.innerWidth}else if(document.documentElement&&document.documentElement.clientWidth){w=document.documentElement.clientWidth;if(document.documentElement.scrollHeight>document.documentElement.clientHeight){w+=Fit.Browser.GetScrollBarSize()}}return w};Fit.Browser.GetPageHeight=function(){var h=0;if(window.innerHeight){h=window.innerHeight}else if(document.documentElement&&document.documentElement.clientHeight){h=document.documentElement.clientHeight;if(document.documentElement.scrollWidth>document.documentElement.clientWidth){h+=Fit.Browser.GetScrollBarSize()}}return h};Fit.Browser.GetViewPortDimensions=function(includeScrollbars){Fit.Validation.ExpectBoolean(includeScrollbars,true);var dim={Width:Fit.Browser.GetPageWidth(),Height:Fit.Browser.GetPageHeight()};if(includeScrollbars!==true){if(Fit.Browser.GetScrollDocument().scrollWidth>dim.Width){dim.Height=dim.Height-Fit.Browser.GetScrollBarSize()}if(Fit.Browser.GetScrollDocument().scrollHeight>dim.Height){dim.Width=dim.Width-Fit.Browser.GetScrollBarSize()}}return dim};Fit.Browser.GetScrollPosition=function(){var x=document.body.scrollLeft||document.documentElement.scrollLeft||window.pageXOffset||0;var y=document.body.scrollTop||document.documentElement.scrollTop||window.pageYOffset||0;return{X:x,Y:y}};Fit.Browser.GetScrollDocument=function(){if(Fit._internal.Browser.ScrollDocument===undefined){if(document.scrollingElement){Fit._internal.Browser.ScrollDocument=document.scrollingElement}else{var iframe=document.createElement("iframe");iframe.style.cssText="height: 1px; position: fixed; top: -100px; left: -100px;";document.documentElement.appendChild(iframe);var doc=iframe.contentWindow.document;doc.write("<!DOCTYPE html><div style='height: 100px'> </div>");doc.close();if(doc.documentElement.scrollHeight>doc.body.scrollHeight){Fit._internal.Browser.ScrollDocument=document.documentElement}else{Fit._internal.Browser.ScrollDocument=document.body}iframe.parentNode.removeChild(iframe)}}return Fit._internal.Browser.ScrollDocument};Fit.Browser.GetScrollBars=function(){var res={Vertical:{Enabled:false,Size:0},Horizontal:{Enabled:false,Size:0}};var doc=Fit.Browser.GetScrollDocument();if(doc.clientWidth<doc.scrollWidth&&Fit.Browser.GetComputedStyle(document.body,"overflow-x")!=="hidden"&&Fit.Browser.GetComputedStyle(document.documentElement,"overflow-x")!=="hidden"){res.Horizontal.Enabled=true;res.Horizontal.Size=Fit.Browser.GetScrollBarSize()}if(doc.clientHeight<doc.scrollHeight&&Fit.Browser.GetComputedStyle(document.body,"overflow-y")!=="hidden"&&Fit.Browser.GetComputedStyle(document.documentElement,"overflow-y")!=="hidden"){res.Vertical.Enabled=true;res.Vertical.Size=Fit.Browser.GetScrollBarSize()}return res};Fit.Browser.GetScrollBarSize=function(){if(Fit._internal.Browser.ScrollBarWidth===undefined){var outer=document.createElement("div");outer.style.cssText="visibility: hidden; overflow: scroll; position: fixed; top: -100px; left: -100px;";document.documentElement.appendChild(outer);var inner=document.createElement("div");outer.appendChild(inner);Fit._internal.Browser.ScrollBarWidth=outer.offsetWidth-inner.offsetWidth;outer.parentNode.removeChild(outer)}return Fit._internal.Browser.ScrollBarWidth};Fit.Browser.GetComputedStyle=function(elm,style){Fit.Validation.ExpectDomElement(elm);Fit.Validation.ExpectStringValue(style);var res=null;if(window.getComputedStyle){res=window.getComputedStyle(elm)[style]}else if(elm.currentStyle){if(style.indexOf("-")!==-1){var items=style.split("-");style="";Fit.Array.ForEach(items,function(i){if(style==="")style=i;else style+=i[0].toUpperCase()+i.slice(1)})}res=elm.currentStyle[style];if(res!==undefined&&res!==null&&/^\d+/.test(res)===true&&res.toLowerCase().indexOf("px")===-1){var orgLeft=elm.style.left;var runtimeStyle=elm.runtimeStyle.left;elm.runtimeStyle.left=elm.currentStyle.left;elm.style.left=style==="fontSize"?"1em":res||0;res=elm.style.pixelLeft+"px";elm.style.left=orgLeft;elm.runtimeStyle.left=runtimeStyle}}return res!==undefined?res:null};Fit.Browser.GetScreenWidth=function(onlyAvailable){Fit.Validation.ExpectBoolean(onlyAvailable,true);if(onlyAvailable===true)return window.screen.availWidth;return window.screen.width};Fit.Browser.GetScreenHeight=function(onlyAvailable){Fit.Validation.ExpectBoolean(onlyAvailable,true);if(onlyAvailable===true)return window.screen.availHeight;return window.screen.height};Fit.Browser.GetScreenDimensions=function(onlyAvailable){Fit.Validation.ExpectBoolean(onlyAvailable,true);return{Width:Fit.Browser.GetScreenWidth(onlyAvailable),Height:Fit.Browser.GetScreenHeight(onlyAvailable)}};Fit.Browser.IsMobile=function(includeTablets){Fit.Validation.ExpectBoolean(includeTablets,true);var nav=Fit._internal.Browser.UserAgent;if(includeTablets!==false&&/android|ipad|playbook|silk/i.test(nav))return true;return/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(nav)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(nav.substr(0,4))};Fit.Browser.IsTouchEnabled=function(){return"ontouchstart"in window};Fit.Browser.Log=function(msg){if(window.console)console.log(msg)};Fit.Browser.Debug=function(msg){if(window.console&&Fit._internal.Validation.DebugMode===true)console.log(msg)};Fit.Browser.LogDeprecated=function(msg){Fit.Validation.ExpectString(msg);if(window.console&&console.warn)console.warn(msg);else Fit.Browser.Log(msg)};Fit.Browser.GetInfo=function(returnAppInfo){Fit.Validation.ExpectBoolean(returnAppInfo,true);if(returnAppInfo===true){if(!Fit._internal.Browser.AppInfo){Fit._internal.Browser.AppInfo=Fit.Browser.GetInfo();Fit._internal.Browser.AppInfo.Name=Fit.Browser.GetBrowser(true);Fit._internal.Browser.AppInfo.Version=Fit.Browser.GetVersion(true)}return Fit.Core.Clone(Fit._internal.Browser.AppInfo)}if(!Fit._internal.Browser.Info){Fit._internal.Browser.Info={};Fit._internal.Browser.Info.Name=Fit.Browser.GetBrowser();Fit._internal.Browser.Info.Version=Fit.Browser.GetVersion();Fit._internal.Browser.Info.Language=Fit.Browser.GetLanguage();Fit._internal.Browser.Info.IsMobile=Fit.Browser.IsMobile();Fit._internal.Browser.Info.IsPhone=Fit.Browser.IsMobile(false);Fit._internal.Browser.Info.IsTablet=Fit.Browser.IsMobile()===true&&Fit.Browser.IsMobile(false)===false;Fit._internal.Browser.Info.IsTouchEnabled=Fit.Browser.IsTouchEnabled()}return Fit.Core.Clone(Fit._internal.Browser.Info)};Fit.Browser.IsStorageSupported=function(){if(Fit._internal.Browser.StorageSupported===undefined){Fit._internal.Browser.StorageSupported=false;try{if(window.localStorage&&window.sessionStorage){var x="__FITUITEST__";localStorage.setItem(x,x);localStorage.removeItem(x);sessionStorage.setItem(x,x);sessionStorage.removeItem(x);Fit._internal.Browser.StorageSupported=true}}catch(err){}}return Fit._internal.Browser.StorageSupported};Fit.Controls={};Fit._internal.Controls={};Fit._internal.ControlBase={Controls:{}};Fit.Controls.Component=function(controlId){Fit.Validation.ExpectStringValue(controlId,true);var me=this;var id=null;var container=null;var isIe8=Fit.Browser.GetInfo().Name==="MSIE"&&Fit.Browser.GetInfo().Version===8;function init(){Fit._internal.Core.EnsureStyles();id=Fit.Validation.IsSet(controlId)===true?controlId:"Ctl"+Fit.Data.CreateGuid();if(Fit._internal.ControlBase.Controls[id]!==undefined)Fit.Validation.ThrowError("Control with ID '"+id+"' has already been defined - Control IDs must be unique!");Fit._internal.ControlBase.Controls[id]=me;container=document.createElement("div");container.id=id;container._internal={Instance:me};Fit.Dom.Data(container,"device",Fit.Device.OptimizeForTouch===false?"Desktop":"Touch")}this.GetId=function(){return id};this.GetDomElement=function(){return container};this.Render=function(toElement){Fit.Validation.ExpectDomElement(toElement,true);if(Fit.Validation.IsSet(toElement)===true){Fit.Dom.Add(toElement,me.GetDomElement())}else{var script=document.scripts[document.scripts.length-1];Fit.Dom.InsertBefore(script,me.GetDomElement())}};this.Dispose=function(){Fit.Dom.Remove(container);delete container._internal;delete Fit._internal.ControlBase.Controls[id];me=id=container=isIe8=null};this._internal=this._internal?this._internal:{};this._internal.Repaint=function(f){Fit.Validation.ExpectFunction(f,true);var cb=Fit.Validation.IsSet(f)===true?f:function(){};if(isIe8===false){cb()}else{Fit.Dom.AddClass(me.GetDomElement(),"FitUi_Non_Existing_ControlBase_Class");Fit.Dom.RemoveClass(me.GetDomElement(),"FitUi_Non_Existing_ControlBase_Class");setTimeout(function(){if(me===null)return;cb();Fit.Dom.AddClass(me.GetDomElement(),"FitUi_Non_Existing_ControlBase_Class");Fit.Dom.RemoveClass(me.GetDomElement(),"FitUi_Non_Existing_ControlBase_Class")},0)}};this._internal.IsIe8=function(){return isIe8};init()};Fit.Controls.ControlBase=function(controlId){Fit.Validation.ExpectStringValue(controlId,true);Fit.Core.Extend(this,Fit.Controls.Component).Apply(controlId);this.Value=function(val,preserveDirtyState){Fit.Validation.ThrowError("Not implemented")};this.UserValue=function(val){return me.Value(val,true)};this.IsDirty=function(){Fit.Validation.ThrowError("Not implemented")};this.Clear=function(){Fit.Validation.ThrowError("Not implemented")};this.Focused=function(val){Fit.Validation.ThrowError("Not implemented")};var me=this;var container=me.GetDomElement();var width={Value:200,Unit:"px"};var height={Value:-1,Unit:"px"};var scope=null;var required=false;var orgDirtyFunction=null;var validationExpr=null;var validationError=null;var validationErrorType=-1;var validationCallbackFunc=null;var validationCallbackError=null;var validationHandlerFunc=null;var validationHandlerError=null;var validationRules=[];var validationRuleError=null;var lazyValidation=false;var lazyValidationDisabled=false;var hideValidationErrorOnChanging=true;var hasValidated=false;var blockAutoPostBack=false;var onChangeHandlers=[];var onFocusHandlers=[];var onBlurHandlers=[];var hasFocus=false;var onBlurTimeout=null;var ensureFocusFires=false;var waitingForFocus=false;var focusStateLocked=false;var txtValue=null;var txtDirty=null;var txtValid=null;var txtEnabled=null;var baseControlDisabled=false;var ie8DisabledLayer=null;function init(){Fit.Dom.AddClass(container,"FitUiControl");me._internal.Data("focused","false");me._internal.Data("valid","true");me._internal.Data("dirty","false");me._internal.Data("enabled","true");me._internal.Data("showinvalid","true");txtValue=document.createElement("textarea");txtValue.style.display="none";txtValue.name="FitUIValue"+me.GetId();Fit.Dom.Add(container,txtValue);txtDirty=document.createElement("input");txtDirty.type="hidden";txtDirty.name="FitUIDirty"+me.GetId();Fit.Dom.Add(container,txtDirty);txtValid=document.createElement("input");txtValid.type="hidden";txtValid.name="FitUIValid"+me.GetId();Fit.Dom.Add(container,txtValid);txtEnabled=document.createElement("input");txtEnabled.type="hidden";txtEnabled.name="FitUIEnabled"+me.GetId();Fit.Dom.Add(container,txtEnabled);me.OnChange(function(sender){if(blockAutoPostBack===false&&me.AutoPostBack()===true&&document.forms.length>0){setTimeout(function(){blockAutoPostBack=true;document.forms[0].submit();setTimeout(function(){blockAutoPostBack=false},500)},0)}});if(me._internal.IsIe8()===false){Fit.Events.AddHandler(container,"focus",true,onFocusIn);Fit.Events.AddHandler(container,"blur",true,onFocusOut)}else{container.onfocusin=onFocusIn;container.onfocusout=onFocusOut}me.OnBlur(function(sender){if(lazyValidation===true&&lazyValidationDisabled===false){lazyValidationDisabled=true;me._internal.Validate()}me._internal.Data("showinvalid","true")});me.OnChange(function(sender){if(hideValidationErrorOnChanging===true&&me.Focused()===true){me._internal.Data("showinvalid","false")}});Fit.Internationalization.OnLocaleChanged(localize)}this.AutoPostBack=function(val){Fit.Validation.ExpectBoolean(val,true);if(Fit.Validation.IsSet(val)===true){me._internal.Data("autopost",val.toString())}return me._internal.Data("autopost")==="true"};this.GetDomElement=Fit.Core.CreateOverride(this.GetDomElement,function(){if(hasValidated===false){hasValidated=true;me._internal.Validate();updateInternalState()}return base()});this.Dispose=Fit.Core.CreateOverride(this.Dispose,function(){Fit.Internationalization.RemoveOnLocaleChanged(localize);me=container=width=height=scope=required=validationExpr=validationError=validationErrorType=validationCallbackFunc=validationCallbackError=validationHandlerFunc=validationHandlerError=validationRules=validationRuleError=lazyValidation=lazyValidationDisabled=hideValidationErrorOnChanging=hasValidated=blockAutoPostBack=onChangeHandlers=onFocusHandlers=onBlurHandlers=hasFocus=onBlurTimeout=ensureFocusFires=waitingForFocus=focusStateLocked=txtValue=txtDirty=txtValid=txtEnabled=baseControlDisabled=ie8DisabledLayer=null;base()});this.Width=function(val,unit){Fit.Validation.ExpectNumber(val,true);Fit.Validation.ExpectStringValue(unit,true);if(Fit.Validation.IsSet(val)===true){if(val>-1){width={Value:val,Unit:Fit.Validation.IsSet(unit)===true?unit:"px"};container.style.width=width.Value+width.Unit}else{width={Value:200,Unit:"px"};container.style.width=""}}return width};this.Height=function(val,unit){Fit.Validation.ExpectNumber(val,true);Fit.Validation.ExpectStringValue(unit,true);if(Fit.Validation.IsSet(val)===true){height={Value:val,Unit:Fit.Validation.IsSet(unit)===true&&val!==-1?unit:"px"};if(height.Value>-1)container.style.height=height.Value+height.Unit;else container.style.height=""}return height};this.AddCssClass=function(val){Fit.Validation.ExpectStringValue(val);Fit.Dom.AddClass(container,val)};this.RemoveCssClass=function(val){Fit.Validation.ExpectStringValue(val);Fit.Dom.RemoveClass(container,val)};this.HasCssClass=function(val){Fit.Validation.ExpectStringValue(val);return Fit.Dom.HasClass(container,val)};this.Enabled=function(val){Fit.Validation.ExpectBoolean(val,true);if(Fit.Validation.IsSet(val)===true&&val!==me.Enabled()){baseControlDisabled=val===false;var disableSelector="input, textarea, select, button";var disableEvents={contextmenu:preventEventDefault,click:stopEventPropagation,dblclick:stopEventPropagation,mousedown:stopEventPropagation,mouseup:stopEventPropagation,mousemove:stopEventPropagation,keydown:stopEventPropagation,keypress:stopEventPropagation,keyup:stopEventPropagation,touchstart:stopEventPropagation,touchmove:stopEventPropagation,touchend:stopEventPropagation,touchcancel:stopEventPropagation};var dom=me.GetDomElement();me._internal.Data("enabled",val===true?"true":"false");if(val===false){me.Focused(false);if(me._internal.IsIe8()===false){Fit.Array.ForEach(disableEvents,function(eventName){Fit.Events.AddHandler(dom,eventName,true,disableEvents[eventName])})}else{ie8DisabledLayer=document.createElement("div");ie8DisabledLayer.className="FitUiControlDisabledLayer";Fit.Dom.Add(me.GetDomElement(),ie8DisabledLayer)}Fit.Array.ForEach(dom.querySelectorAll(disableSelector),function(elm){if(elm===txtValue||elm===txtDirty||elm===txtValid||elm===txtEnabled){return}elm._fitDisabled=elm.disabled;elm.disabled=true;elm._fitReadOnly=elm.readOnly;elm.readOnly=true});Fit.Array.CustomRecurse([dom],function(elm){if(Fit.Dom.Attribute(elm,"tabindex")!==null){elm._fitTabIndex=elm.tabIndex;Fit.Dom.Attribute(elm,"tabindex",null);if(elm.tagName==="A"){elm.tabIndex=-1}}return elm.children})}else if(val===true){if(me._internal.IsIe8()===false){Fit.Array.ForEach(disableEvents,function(eventName){Fit.Events.RemoveHandler(dom,eventName,true,disableEvents[eventName])})}else{Fit.Dom.Remove(ie8DisabledLayer);ie8DisabledLayer=null}Fit.Array.ForEach(dom.querySelectorAll(disableSelector),function(elm){elm.disabled=elm._fitDisabled;elm._fitDisabled=undefined;elm.readOnly=elm._fitReadOnly;elm._fitReadOnly=undefined});Fit.Array.CustomRecurse([dom],function(elm){if(elm._fitTabIndex!==undefined){elm.tabIndex=elm._fitTabIndex;elm._fitTabIndex=undefined}return elm.children})}updateInternalState();me._internal.Repaint()}return me._internal.Data("enabled")==="true"};this.Visible=function(val){Fit.Validation.ExpectBoolean(val,true);if(Fit.Validation.IsSet(val)===true)container.style.display=val===true?"":"none";return container.style.display!=="none"};this.Required=function(val){Fit.Validation.ExpectBoolean(val,true);if(Fit.Validation.IsSet(val)===true){required=val;me._internal.Validate()}return required};this.Scope=function(val){Fit.Validation.ExpectString(val,true);if(Fit.Validation.IsSet(val)===true){if(val==="")scope=null;else scope=val}return scope};this.AlwaysDirty=function(val){Fit.Validation.ExpectBoolean(val,true);if(Fit.Validation.IsSet(val)===true){if(val===true&&orgDirtyFunction===null){orgDirtyFunction=this.IsDirty;this.IsDirty=function(){return true};updateInternalState()}else if(val===false&&orgDirtyFunction!==null){this.IsDirty=orgDirtyFunction;orgDirtyFunction=null;updateInternalState()}}return orgDirtyFunction!==null};this.SetValidationExpression=function(regEx,errorMsg){Fit.Validation.ExpectRegExp(regEx,true);Fit.Validation.ExpectString(errorMsg,true);Fit.Browser.LogDeprecated("Use of deprecated function SetValidationExpression - please use AddValidationRule instead");validationExpr=regEx?regEx:null;validationError=errorMsg?errorMsg:null;me._internal.Validate()};this.SetValidationCallback=function(cb,errorMsg){Fit.Validation.ExpectFunction(cb,true);Fit.Validation.ExpectString(errorMsg,true);Fit.Browser.LogDeprecated("Use of deprecated function SetValidationCallback - please use AddValidationRule instead");validationHandlerFunc=null;validationCallbackFunc=cb?cb:null;validationCallbackError=errorMsg?errorMsg:null;me._internal.Validate()};this.SetValidationHandler=function(cb){Fit.Validation.ExpectFunction(cb,true);Fit.Browser.LogDeprecated("Use of deprecated function SetValidationHandler - please use AddValidationRule instead");validationCallbackFunc=null;validationHandlerFunc=cb?cb:null;validationHandlerError=null;me._internal.Validate()};this.AddValidationRule=function(validator,errorMessage){Fit.Validation.ExpectIsSet(validator);Fit.Validation.ExpectString(errorMessage,true);if(typeof validator==="function"){Fit.Validation.ExpectFunction(validator);validationRules.push({Type:"Callback",Validator:validator,ErrorMessage:null})}else{Fit.Validation.ExpectRegExp(validator);validationRules.push({Type:"RegExp",Validator:validator,ErrorMessage:errorMessage||null})}me._internal.Validate()};this.RemoveValidationRule=function(validator){Fit.Validation.ExpectIsSet(validator);var found=null;Fit.Array.ForEach(validationRules,function(rule){if(rule.Validator===validator){found=rule;return false}});if(found!==null){Fit.Array.Remove(validationRules,found)}me._internal.Validate()};this.RemoveAllValidationRules=function(){validationRules=[];me._internal.Validate()};this.IsValid=function(){validationErrorType=-1;validationHandlerError=null;validationRuleError=null;if(validationExpr===null&&validationCallbackFunc===null&&validationHandlerFunc===null&&required===false&&validationRules.length===0)return true;var obj=me.Value();var val=Fit.Validation.IsSet(obj)===true?obj.toString():"";if(required===true&&val===""){validationErrorType=0;return false}if(validationExpr!==null&&validationExpr.test(val)===false){validationErrorType=1;return false}if(validationHandlerFunc!==null){var errorMessage=validationHandlerFunc(me,val);if(errorMessage!==null&&errorMessage!==""&&typeof errorMessage==="string"){validationErrorType=2;validationHandlerError=errorMessage;return false}}else if(validationCallbackFunc!==null&&validationCallbackFunc(val)===false){validationErrorType=3;return false}if(validationRules.length>0){Fit.Array.ForEach(validationRules,function(rule){if(rule.Type==="Callback"){var result=rule.Validator(me);if(result===false||typeof result==="string"&&result!==""){validationErrorType=4;validationRuleError=result||null;return false}}else{if(rule.Validator.test(me.Value())===false){validationErrorType=4;validationRuleError=rule.ErrorMessage;return false}}});if(validationErrorType===4){return false}}return true};this.LazyValidation=function(val){Fit.Validation.ExpectBoolean(val,true);if(Fit.Validation.IsSet(val)===true){lazyValidation=val;lazyValidationDisabled=false;if(lazyValidation===true){me._internal.Data("valid","true");me._internal.Data("errormessage",null);Fit.Dom.Attribute(me.GetDomElement(),"title",null)}else{me._internal.Validate()}}return lazyValidation};this.ShowValidationErrorsOnChange=function(val){Fit.Validation.ExpectBoolean(val,true);if(Fit.Validation.IsSet(val)===true&&val!==!hideValidationErrorOnChanging){hideValidationErrorOnChanging=!val;me._internal.Data("showinvalid","true")}return!hideValidationErrorOnChanging};this.OnChange=function(cb){Fit.Validation.ExpectFunction(cb);Fit.Array.Add(onChangeHandlers,cb)};this.OnFocus=function(cb){Fit.Validation.ExpectFunction(cb);Fit.Array.Add(onFocusHandlers,cb)};this.OnBlur=function(cb){Fit.Validation.ExpectFunction(cb);Fit.Array.Add(onBlurHandlers,cb)};this._internal=this._internal?this._internal:{};this._internal.DisableAndKeepFocus=function(){if(me.Focused()===true){me.Enabled(false);clearTimeout(onBlurTimeout);onBlurTimeout=null;var dom=me.GetDomElement();var orgTabIndex=Fit.Dom.Attribute(dom,"tabindex");Fit.Dom.Attribute(dom,"tabindex","-1");dom.focus({preventScroll:true});return function(){me.Enabled(true);if(hasFocus===true){me.Focused(true)}Fit.Dom.Attribute(dom,"tabindex",orgTabIndex)}}else{me.Enabled(false);return function(){me.Enabled(true)}}};function stopEventPropagation(e){Fit.Events.StopPropagation(e);if(e.type==="click"&&Fit.Events.GetTarget(e).tagName==="A"){preventEventDefault(e)}}function preventEventDefault(e){Fit.Events.PreventDefault(e)}function onFocusIn(e){if(baseControlDisabled===true&&Fit.Dom.GetFocused()!==me.GetDomElement()){var focused=Fit.Dom.GetFocused();if(me._internal.IsIe8()===true&&focused===ie8DisabledLayer){return}if(focused.tagName!=="A"||focused.tabIndex>=0){var msg="";msg+="Disabled control '"+me.GetId()+"' received focus because an object was introduced in the control ";msg+="that is focusable, which did not exist when the control was disabled. Control's disabled state will ";msg+="now be updated to prevent this from happening again with the control's current state. Since the control ";msg+="has already received focus, and we do not know the exact tab navigation order of the page, focus will ";msg+="now be returned to the component previously focused. The user will experience this as TAB navigation ";msg+="being ignored for this keystroke