var ASPx = ASPx || {}; var dx = dx || {}; (function () { ASPx.modules = {}; if(!ASPx.attachToReady) ASPx.attachToReady = function (callback) { ASPx.Evt.AttachEventToElement(window, "load", callback); }; if(!ASPx.attachToLoad) ASPx.attachToLoad = function(callback) { ASPx.Evt.AttachEventToDocumentCore("DOMContentLoaded", callback); }; ASPx.EmptyObject = { }; ASPx.FalseFunction = function() { return false; }; ASPx.SSLSecureBlankUrl = '/DXR.axd?r=1_120-DA2nm'; ASPx.EmptyImageUrl = '/DXR.axd?r=1_121-DA2nm'; ASPx.VersionInfo = 'Version=\'18.2.7.0\', File Version=\'18.2.7.0\', Date Modified=\'3/1/2021 8:27:48 PM\''; ASPx.Platform = 'ASP'; ASPx.InvalidDimension = -10000; ASPx.InvalidPosition = -10000; ASPx.AbsoluteLeftPosition = -10000; ASPx.EmptyGuid = "00000000-0000-0000-0000-000000000000"; ASPx.CallbackSeparator = ":"; ASPx.ItemIndexSeparator = "i"; ASPx.CallbackResultPrefix = "/*DX*/"; ASPx.StyleValueEncodedSemicolon = "DXsmcln"; ASPx.AccessibilityEmptyUrl = "javascript:;"; ASPx.AccessibilityPronounceTimeout = 500; ASPx.MaxMobileWindowWidth = 576; ASPx.PossibleNumberDecimalSeparators = [",", "."]; ASPx.CultureInfo = { twoDigitYearMax: 2029, ts: ":", ds: "/", am: "AM", pm: "PM", monthNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", ""], genMonthNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", ""], abbrMonthNames: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", ""], abbrDayNames: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], invariantCultureDecimalPoint: ".", numDecimalPoint: ".", numPrec: 2, numGroupSeparator: ",", numGroups: [ 3 ], numNegPattern: 1, numPosInf: "Infinity", numNegInf: "-Infinity", numNan: "NaN", currency: "$", currDecimalPoint: ".", currPrec: 2, currGroupSeparator: ",", currGroups: [ 3 ], currPosPattern: 0, currNegPattern: 0, percentPattern: 0, shortTime: "h:mm tt", longTime: "h:mm:ss tt", shortDate: "M/d/yyyy", longDate: "dddd, MMMM d, yyyy", monthDay: "MMMM d", yearMonth: "MMMM yyyy" }; ASPx.CultureInfo.genMonthNames = ASPx.CultureInfo.monthNames; ASPx.Position = { Left: "Left", Right: "Right", Top: "Top", Bottom: "Bottom" }; function setInnerHtmlInternal(el, trustedHtmlString) { el.innerHTML = trustedHtmlString; } var DateUtils = { }; DateUtils.GetInvariantDateString = function(date) { if(!date) return "01/01/0001"; var day = date.getDate(); var month = date.getMonth() + 1; var year = date.getFullYear(); var result = ""; if(month < 10) result += "0"; result += month.toString() + "/"; if(day < 10) result += "0"; result += day.toString() + "/"; if(year < 1000) result += "0"; result += year.toString(); return result; }; DateUtils.GetInvariantDateTimeString = function(date) { var dateTimeString = DateUtils.GetInvariantDateString(date); var time = { h: date.getHours(), m: date.getMinutes(), s: date.getSeconds() }; for(var key in time) { if(time.hasOwnProperty(key)) { var str = time[key].toString(); if(str.length < 2) str = "0" + str; time[key] = str; } } dateTimeString += " " + time.h + ":" + time.m + ":" + time.s; var msec = date.getMilliseconds(); if(msec > 0) dateTimeString += "." + ("000" + msec.toString()).substr(-3); return dateTimeString; }; DateUtils.ExpandTwoDigitYear = function(value) { value += 1900; if(value + 99 < ASPx.CultureInfo.twoDigitYearMax) value += 100; return value; }; DateUtils.GetTimeZoneOffset = function(date) { var utcFullYear = date.getUTCFullYear(); var utcDate = DateUtils.GetUtcDate(date); var hoursDifference = DateUtils.GetUtcHoursDifference(date); if(hoursDifference !== 0) utcDate.setTime(utcDate.valueOf() + hoursDifference * 3600000); if(utcFullYear < 100) utcDate.setFullYear(utcFullYear); return utcDate - date; }; DateUtils.GetUtcHoursDifference = function(date) { var utcDateWithoutHours = DateUtils.GetUtcDate(date, 0); var utcDate = DateUtils.GetUtcDate(date); var utcDateHoursDifference = 0; if(utcDate.getDate() !== date.getDate()) utcDateHoursDifference = DateUtils.GetUtcHoursDifference(utcDate); var utcDateWithoutHours_Hours = DateUtils.GetHoursFromFirstDayOfMonth(utcDateWithoutHours); var utcDate_Hours = DateUtils.GetHoursFromFirstDayOfMonth(utcDate); var utcHours = Math.max(date.getUTCHours(), utcDate.getHours()); return utcDateWithoutHours_Hours + utcHours - utcDate_Hours - utcDateHoursDifference; }; DateUtils.GetUtcDate = function(date, hours) { var utcHours = hours == null ? date.getUTCHours() : 0; return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), utcHours, date.getUTCMinutes(), date.getUTCSeconds(), date.getUTCMilliseconds()); }; DateUtils.GetHoursFromFirstDayOfMonth = function(date) { var result = 0; var utcMonthDifference = date.getMonth() - date.getUTCMonth(); var utcYearDifference = date.getFullYear() - date.getUTCFullYear(); if(utcMonthDifference > 0 && utcYearDifference == 0 || utcYearDifference > 0) result = date.getUTCHours() - 24; else if(utcMonthDifference < 0 && utcYearDifference == 0 || utcYearDifference < 0) result = date.getDate() * 24 + date.getUTCHours(); else result = (date.getUTCDate() - 1) * 24 + date.getUTCHours(); return result; }; DateUtils.ToUtcTime = function(date) { var result = new Date(); result.setTime(date.valueOf() + ASPx.DateUtils.GetTimeZoneOffset(date)); return result; }; DateUtils.ToLocalTime = function(date) { var result = new Date(); result.setTime(date.valueOf() - ASPx.DateUtils.GetTimeZoneOffset(date)); return result; }; DateUtils.AreDatesEqualExact = function(date1, date2) { if(date1 == null && date2 == null) return true; if(date1 == null || date2 == null) return false; return date1.getTime() == date2.getTime(); }; DateUtils.FixTimezoneGap = function(oldDate, newDate) { var diff = newDate.getHours() - oldDate.getHours(); if(diff == 0) return; var sign = (diff == 1 || diff == -23) ? -1 : 1; var trial = new Date(newDate.getTime() + sign * 3600000); var isDateChangedAsExpected = newDate.getHours() - trial.getHours() === diff; if(isDateChangedAsExpected && (sign > 0 || trial.getDate() == newDate.getDate())) newDate.setTime(trial.getTime()); }; DateUtils.GetDecadeStartYear = function(year) { return 10 * Math.floor(year / 10); }; DateUtils.GetCenturyStartYear = function(year) { return 100 * Math.floor(year / 100); }; DateUtils.GetCorrectedYear = function(date, pickerType) { var year = date.getFullYear(); return pickerType != ASPx.DatePickerType.Decades ? year : DateUtils.GetDecadeStartYear(year); }; DateUtils.GetCorrectedMonth = function(date, pickerType) { return pickerType < ASPx.DatePickerType.Years ? date.getMonth() : 0; }; DateUtils.GetCorrectedDay = function(date, pickerType) { return pickerType == ASPx.DatePickerType.Days ? date.getDate() : 1; }; DateUtils.CorrectDateByPickerType = function(date, pickerType) { if(!ASPx.IsExists(pickerType)) pickerType = ASPx.DatePickerType.Days; if(!date || pickerType == ASPx.DatePickerType.Days) return date; var correctedYear = DateUtils.GetCorrectedYear(date, pickerType); var result = new Date( correctedYear, DateUtils.GetCorrectedMonth(date, pickerType), DateUtils.GetCorrectedDay(date, pickerType), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds() ); result.setFullYear(correctedYear); return result; }; DateUtils.GetYearRangeFormatString = function(startYear, rangeLength) { return startYear + " - " + (startYear + rangeLength - 1); }; ASPx.DateUtils = DateUtils; var Timer = { }; Timer.ClearTimer = function(timerID){ if(timerID > -1) window.clearTimeout(timerID); return -1; }; Timer.ClearInterval = function(timerID){ if(timerID > -1) window.clearInterval(timerID); return -1; }; var setControlBoundTimer = function(handler, control, setTimerFunction, clearTimerFunction, delay) { var timerId; var getTimerId = function() { return timerId; }; var boundHandler = function() { var controlExists = control && ASPx.GetControlCollection().Get(control.name) === control && !control.IsDOMDisposed(); if(controlExists) handler.aspxBind(control)(); else clearTimerFunction(getTimerId()); }; timerId = setTimerFunction(boundHandler, delay); return timerId; }; Timer.SetControlBoundTimeout = function(handler, control, delay) { return setControlBoundTimer(handler, control, window.setTimeout, Timer.ClearTimer, delay); }; Timer.SetControlBoundInterval = function(handler, control, delay) { return setControlBoundTimer(handler, control, window.setInterval, Timer.ClearInterval, delay); }; Timer.Throttle = function(func, delay) { var isThrottled = false, savedArgs, savedThis = this; function wrapper() { if(isThrottled) { savedArgs = arguments; savedThis = this; return; } func.apply(this, arguments); isThrottled = true; setTimeout(function() { isThrottled = false; if(savedArgs) { wrapper.apply(savedThis, savedArgs); savedArgs = null; } }, delay); } wrapper.cancel = function() { clearTimeout(delay); delay = savedArgs = savedThis = null; }; return wrapper; }; ASPx.Timer = Timer; var Browser = { }; Browser.UserAgent = navigator.userAgent.toLowerCase(); Browser.Mozilla = false; Browser.IE = false; Browser.Firefox = false; Browser.Netscape = false; Browser.Safari = false; Browser.Chrome = false; Browser.Opera = false; Browser.Edge = false; Browser.Version = undefined; Browser.MajorVersion = undefined; Browser.WindowsPlatform = false; Browser.MacOSPlatform = false; Browser.MacOSMobilePlatform = false; Browser.AndroidMobilePlatform = false; Browser.PlaformMajorVersion = false; Browser.WindowsPhonePlatform = false; Browser.AndroidDefaultBrowser = false; Browser.AndroidChromeBrowser = false; Browser.SamsungAndroidDevice = false; Browser.WebKitTouchUI = false; Browser.MSTouchUI = false; Browser.TouchUI = false; Browser.WebKitFamily = false; Browser.NetscapeFamily = false; Browser.HardwareAcceleration = false; Browser.VirtualKeyboardSupported = false; Browser.Info = ""; function indentPlatformMajorVersion(userAgent) { var regex = /(?:(?:windows nt|macintosh|mac os|cpu os|cpu iphone os|android|windows phone|linux) )(\d+)(?:[-0-9_.])*/; var matches = regex.exec(userAgent); if(matches) Browser.PlaformMajorVersion = matches[1]; } function getIECompatibleVersionString() { if(document.compatible) { for(var i = 0; i < document.compatible.length; i++) if(document.compatible[i].userAgent === "IE" && document.compatible[i].version) return document.compatible[i].version.toLowerCase(); } return ""; } Browser.IdentUserAgent = function(userAgent, ignoreDocumentMode) { var browserTypesOrderedList = [ "Mozilla", "IE", "Firefox", "Netscape", "Safari", "Chrome", "Opera", "Opera10", "Edge" ]; var defaultBrowserType = "IE"; var defaultPlatform = "Win"; var defaultVersions = { Safari: 2, Chrome: 0.1, Mozilla: 1.9, Netscape: 8, Firefox: 2, Opera: 9, IE: 6, Edge: 12 }; if(!userAgent || userAgent.length == 0) { fillUserAgentInfo(browserTypesOrderedList, defaultBrowserType, defaultVersions[defaultBrowserType], defaultPlatform); return; } userAgent = userAgent.toLowerCase(); indentPlatformMajorVersion(userAgent); try { var platformIdentStrings = { "Windows": "Win", "Macintosh": "Mac", "Mac OS": "Mac", "Mac_PowerPC": "Mac", "cpu os": "MacMobile", "cpu iphone os": "MacMobile", "Android": "Android", "!Windows Phone": "WinPhone", "!WPDesktop": "WinPhone", "!ZuneWP": "WinPhone" }; var optSlashOrSpace = "(?:/|\\s*)?"; var version = "(\\d+)(?:\\.((?:\\d+?[1-9])|\\d)0*?)?"; var optVersion = "(?:" + version + ")?"; var patterns = { Safari: "applewebkit(?:.*?(?:version/" + version + "[\\.\\w\\d]*?(?:\\s+mobile\/\\S*)?\\s+safari))?", Chrome: "(?:chrome|crios)(?!frame)" + optSlashOrSpace + optVersion, Mozilla: "mozilla(?:.*rv:" + optVersion + ".*Gecko)?", Netscape: "(?:netscape|navigator)\\d*/?\\s*" + optVersion, Firefox: "firefox" + optSlashOrSpace + optVersion, Opera: "(?:opera|\sopr)" + optSlashOrSpace + optVersion, Opera10: "opera.*\\s*version" + optSlashOrSpace + optVersion, IE: "msie\\s*" + optVersion, Edge: "edge" + optSlashOrSpace + optVersion }; var browserType; var version = -1; for(var i = 0; i < browserTypesOrderedList.length; i++) { var browserTypeCandidate = browserTypesOrderedList[i]; var regExp = new RegExp(patterns[browserTypeCandidate], "i"); if(regExp.compile) regExp.compile(patterns[browserTypeCandidate], "i"); var matches = regExp.exec(userAgent); if(matches && matches.index >= 0) { if(browserType == "IE" && version >= 11 && browserTypeCandidate == "Safari") continue; browserType = browserTypeCandidate; if(browserType == "Opera10") browserType = "Opera"; var tridentPattern = "trident" + optSlashOrSpace + optVersion; version = Browser.GetBrowserVersion(userAgent, matches, tridentPattern, getIECompatibleVersionString()); if(browserType == "Mozilla" && version >= 11) browserType = "IE"; } } if(!browserType) browserType = defaultBrowserType; var browserVersionDetected = version != -1; if(!browserVersionDetected) version = defaultVersions[browserType]; var platform; var minOccurenceIndex = Number.MAX_VALUE; for(var identStr in platformIdentStrings) { if(!platformIdentStrings.hasOwnProperty(identStr)) continue; var importantIdent = identStr.substr(0,1) == "!"; var occurenceIndex = userAgent.indexOf((importantIdent ? identStr.substr(1) : identStr).toLowerCase()); if(occurenceIndex >= 0 && (occurenceIndex < minOccurenceIndex || importantIdent)) { minOccurenceIndex = importantIdent ? 0 : occurenceIndex; platform = platformIdentStrings[identStr]; } } var samsungPattern = "SM-[A-Z]"; var matches = userAgent.toUpperCase().match(samsungPattern); var isSamsungAndroidDevice = matches && matches.length > 0; if(platform == "WinPhone" && version < 9) version = Math.floor(getVersionFromTrident(userAgent, "trident" + optSlashOrSpace + optVersion)); if(!ignoreDocumentMode && browserType == "IE" && version > 7 && document.documentMode < version) version = document.documentMode; if(platform == "WinPhone") version = Math.max(9, version); if(!platform) platform = defaultPlatform; if(platform == platformIdentStrings["cpu os"] && !browserVersionDetected) version = 4; fillUserAgentInfo(browserTypesOrderedList, browserType, version, platform, isSamsungAndroidDevice); } catch(e) { fillUserAgentInfo(browserTypesOrderedList, defaultBrowserType, defaultVersions[defaultBrowserType], defaultPlatform); } }; function getVersionFromMatches(matches) { var result = -1; var versionStr = ""; if(matches[1]) { versionStr += matches[1]; if(matches[2]) versionStr += "." + matches[2]; } if(versionStr != "") { result = parseFloat(versionStr); if(isNaN(result)) result = -1; } return result; } function getVersionFromTrident(userAgent, tridentPattern) { var tridentDiffFromVersion = 4; var matches = new RegExp(tridentPattern, "i").exec(userAgent); return getVersionFromMatches(matches) + tridentDiffFromVersion; } Browser.GetBrowserVersion = function(userAgent, matches, tridentPattern, ieCompatibleVersionString) { var version = getVersionFromMatches(matches); if(ieCompatibleVersionString) { var versionFromTrident = getVersionFromTrident(userAgent, tridentPattern); if(ieCompatibleVersionString === "edge" || parseInt(ieCompatibleVersionString) === versionFromTrident) return versionFromTrident; } return version; }; function fillUserAgentInfo(browserTypesOrderedList, browserType, version, platform, isSamsungAndroidDevice) { for(var i = 0; i < browserTypesOrderedList.length; i++) { var type = browserTypesOrderedList[i]; Browser[type] = type == browserType; } Browser.Version = Math.floor(10.0 * version) / 10.0; Browser.MajorVersion = Math.floor(Browser.Version); Browser.WindowsPlatform = platform == "Win" || platform == "WinPhone"; Browser.MacOSPlatform = platform == "Mac"; Browser.MacOSMobilePlatform = platform == "MacMobile"; Browser.AndroidMobilePlatform = platform == "Android"; Browser.WindowsPhonePlatform = platform == "WinPhone"; Browser.WebKitFamily = Browser.Safari || Browser.Chrome || Browser.Opera && Browser.MajorVersion >= 15; Browser.NetscapeFamily = Browser.Netscape || Browser.Mozilla || Browser.Firefox; Browser.HardwareAcceleration = (Browser.IE && Browser.MajorVersion >= 9) || (Browser.Firefox && Browser.MajorVersion >= 4) || (Browser.AndroidMobilePlatform && Browser.Chrome) || (Browser.Chrome && Browser.MajorVersion >= 37) || (Browser.Safari && !Browser.WindowsPlatform) || Browser.Edge || (Browser.Opera && Browser.MajorVersion >= 46); Browser.WebKitTouchUI = Browser.MacOSMobilePlatform || Browser.AndroidMobilePlatform; var isIETouchUI = Browser.IE && Browser.MajorVersion > 9 && Browser.WindowsPlatform && Browser.UserAgent.toLowerCase().indexOf("touch") >= 0; Browser.MSTouchUI = isIETouchUI || (Browser.Edge && !!window.navigator.maxTouchPoints); Browser.TouchUI = Browser.WebKitTouchUI || Browser.MSTouchUI; Browser.MobileUI = Browser.WebKitTouchUI || Browser.WindowsPhonePlatform; Browser.AndroidDefaultBrowser = Browser.AndroidMobilePlatform && !Browser.Chrome; Browser.AndroidChromeBrowser = Browser.AndroidMobilePlatform && Browser.Chrome; if(isSamsungAndroidDevice) Browser.SamsungAndroidDevice = isSamsungAndroidDevice; if(Browser.MSTouchUI) { var isARMArchitecture = Browser.UserAgent.toLowerCase().indexOf("arm;") > -1; Browser.VirtualKeyboardSupported = isARMArchitecture || Browser.WindowsPhonePlatform; } else { Browser.VirtualKeyboardSupported = Browser.WebKitTouchUI; } fillDocumentElementBrowserTypeClassNames(browserTypesOrderedList); } function fillDocumentElementBrowserTypeClassNames(browserTypesOrderedList) { var documentElementClassName = ""; var browserTypeslist = browserTypesOrderedList.concat(["WindowsPlatform", "MacOSPlatform", "MacOSMobilePlatform", "AndroidMobilePlatform", "WindowsPhonePlatform", "WebKitFamily", "WebKitTouchUI", "MSTouchUI", "TouchUI", "AndroidDefaultBrowser", "MobileUI"]); for(var i = 0; i < browserTypeslist.length; i++) { var type = browserTypeslist[i]; if(Browser[type]) documentElementClassName += "dx" + type + " "; } documentElementClassName += "dxBrowserVersion-" + Browser.MajorVersion; if(document && document.documentElement) { if(document.documentElement.className != "") documentElementClassName = " " + documentElementClassName; document.documentElement.className += documentElementClassName; Browser.Info = documentElementClassName; } } Browser.SupportsStickyPositioning = function() { return this.Chrome && this.MajorVersion >= 56 || this.Firefox && this.MajorVersion >= 32 || this.Safari && this.MajorVersion >= 6 && this.Version !== "6" || this.Opera && this.MajorVersion >= 42; }; Browser.IdentUserAgent(Browser.UserAgent); ASPx.Browser = Browser; ASPx.BlankUrl = Browser.IE ? ASPx.SSLSecureBlankUrl : (Browser.Opera ? "about:blank" : ""); var Data = { }; Data.ArrayInsert = function(array, element, position){ if(0 <= position && position < array.length){ for(var i = array.length; i > position; i --) array[i] = array[i - 1]; array[position] = element; } else array.push(element); }; Data.ArrayRemove = function(array, element){ var index = Data.ArrayIndexOf(array, element); if(index > -1) Data.ArrayRemoveAt(array, index); }; Data.ArrayRemoveAt = function(array, index){ if(index >= 0 && index < array.length){ for(var i = index; i < array.length - 1; i++) array[i] = array[i + 1]; array.pop(); } }; Data.ArrayClear = function(array){ while(array.length > 0) array.pop(); }; Data.ArrayIndexOf = function(array, element, comparer) { if(!comparer) { for(var i = 0; i < array.length; i++) { if(array[i] == element) return i; } } else { for(var i = 0; i < array.length; i++) { if(comparer(array[i], element)) return i; } } return -1; }; Data.ArrayContains = function(array, element) { return Data.ArrayIndexOf(array, element) >= 0; }; Data.ArrayEqual = function(array1, array2) { var count1 = array1.length; var count2 = array2.length; if(count1 != count2) return false; for(var i = 0; i < count1; i++) if(array1[i] != array2[i]) return false; return true; }; Data.ArraySame = function(array1, array2) { if(array1.length !== array2.length) return false; return array1.every(function(elem) { return Data.ArrayContains(array2, elem); }); }; Data.ArrayGetIntegerEdgeValues = function(array) { var arrayToSort = Data.CollectionToArray(array); Data.ArrayIntegerAscendingSort(arrayToSort); return { start: arrayToSort[0], end: arrayToSort[arrayToSort.length - 1] }; }; Data.ArrayIntegerAscendingSort = function(array){ Data.ArrayIntegerSort(array); }; Data.ArrayIntegerSort = function(array, desc) { array.sort(function(i1, i2) { var res = 0; if(i1 > i2) res = 1; else if(i1 < i2) res = -1; if(desc) res *= -1; return res; }); }; Data.CollectionsUnionToArray = function(firstCollection, secondCollection) { var result = []; var firstCollectionLength = firstCollection.length; var secondCollectionLength = secondCollection.length; for(var i = 0; i < firstCollectionLength + secondCollectionLength; i++) { if(i < firstCollectionLength) result.push(firstCollection[i]); else result.push(secondCollection[i - firstCollectionLength]); } return result; }; Data.CollectionToArray = function(collection) { var array = []; for(var i = 0; i < collection.length; i++) array.push(collection[i]); return array; }; Data.CreateHashTableFromArray = function(array) { var hash = []; for(var i = 0; i < array.length; i++) hash[array[i]] = 1; return hash; }; Data.CreateIndexHashTableFromArray = function(array) { var hash = []; for(var i = 0; i < array.length; i++) hash[array[i]] = i; return hash; }; Data.ArrayToHash = function(array, getKeyFunc, getValueFunc) { if(!(array instanceof Array)) return { }; return array.reduce(function(map, element, index) { var key = getKeyFunc(element, index); var value = getValueFunc(element, index); map[key] = value; return map; }, { }); }; Data.Sum = function(array, getValueFunc) { if(!(array instanceof Array)) return 0; return array.reduce(function(prevValue, item) { var value = getValueFunc ? getValueFunc(item) : item; if(!ASPx.IsNumber(value)) value = 0; return prevValue + value; }, 0); }; Data.Min = function(array, getValueFunc) { return CalculateArrayMinMax(array, getValueFunc, false); }; Data.Max = function(array, getValueFunc) { return CalculateArrayMinMax(array, getValueFunc, true); }; var CalculateArrayMinMax = function(array, getValueFunc, isMax) { if(!(array instanceof Array)) return 0; var startValue = isMax ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY; return array.reduce(function(prevValue, item) { var value = getValueFunc ? getValueFunc(item) : item; if(!ASPx.IsNumber(value)) value = startValue; var func = isMax ? Math.max : Math.min; return func(value, prevValue); }, startValue); }; var defaultBinarySearchComparer = function(array, index, value) { var arrayElement = array[index]; if(arrayElement == value) return 0; else return arrayElement < value ? -1 : 1; }; Data.NearestLeftBinarySearchComparer = function(array, index, value) { var arrayElement = array[index]; var leftPoint = arrayElement < value; var lastLeftPoint = leftPoint && index == array.length - 1; var nearestLeftPoint = lastLeftPoint || (leftPoint && array[index + 1] >= value); if(nearestLeftPoint) return 0; else return arrayElement < value ? -1 : 1; }; Data.ArrayBinarySearch = function(array, value, binarySearchComparer, startIndex, length) { if(!binarySearchComparer) binarySearchComparer = defaultBinarySearchComparer; if(!ASPx.IsExists(startIndex)) startIndex = 0; if(!ASPx.IsExists(length)) length = array.length - startIndex; var endIndex = (startIndex + length) - 1; while(startIndex <= endIndex) { var middle = (startIndex + ((endIndex - startIndex) >> 1)); var compareResult = binarySearchComparer(array, middle, value); if(compareResult == 0) return middle; if(compareResult < 0) startIndex = middle + 1; else endIndex = middle - 1; } return -(startIndex + 1); }; Data.ArrayFlatten = function(arrayOfArrays) { return [].concat.apply([], arrayOfArrays); }; Data.GetDistinctArray = function(array) { var resultArray = []; for(var i = 0; i < array.length; i++) { var currentEntry = array[i]; if(Data.ArrayIndexOf(resultArray, currentEntry) == -1) { resultArray.push(currentEntry); } } return resultArray; }; Data.ForEach = function(arr, callback) { if(Array.prototype.forEach) { Array.prototype.forEach.call(arr, callback); } else { for(var i = 0, len = arr.length; i < len; i++) { callback(arr[i], i, arr); } } }; Data.MergeHashTables = function(target, object) { if(!object || typeof (object) == "string") return target; if(!target) target = {}; for(var key in object) if(key && !(key in target)) target[key] = object[key]; return target; }; Data.Range = function(count, start) { count = parseInt(count) || 0; start = parseInt(start) || 0; if(count < 0) count = 0; if(start < 0) start = 0; return Array.apply(null, Array(count)).map(function(val, i) { return start + i; }); }; ASPx.Data = Data; var Cookie = { }; Cookie.DelCookie = function(name){ setCookieInternal(name, "", new Date(1970, 1, 1)); }; Cookie.GetCookie = function(name) { name = escape(name); var cookies = document.cookie.split(';'); for(var i = 0; i < cookies.length; i++) { var cookie = Str.Trim(cookies[i]); if(cookie.indexOf(name + "=") == 0) return unescape(cookie.substring(name.length + 1, cookie.length)); else if(cookie.indexOf(name + ";") == 0 || cookie === name) return ""; } return null; }; Cookie.SetCookie = function(name, value, expirationDate){ if(!ASPx.IsExists(value)) { Cookie.DelCookie(name); return; } if(!ASPx.Ident.IsDate(expirationDate)) { expirationDate = new Date(); expirationDate.setFullYear(expirationDate.getFullYear() + 1); } setCookieInternal(name, value, expirationDate); }; function setCookieInternal(name, value, date){ document.cookie = escape(name) + "=" + escape(value.toString()) + "; expires=" + date.toGMTString() + "; path=/"; } ASPx.Cookie = Cookie; ASPx.ImageUtils = { GetImageSrc: function (image){ return image.src; }, SetImageSrc: function(image, src){ if(isSourceResetRequired()) image.src = ""; image.src = src; }, SetSize: function(image, width, height){ image.style.width = width + "px"; image.style.height = height + "px"; }, GetSize: function(image, isWidth){ return (isWidth ? image.offsetWidth : image.offsetHeight); } }; var Str = { }; Str.ApplyReplacement = function(text, replecementTable) { if(typeof(text) != "string") text = text.toString(); for(var i = 0; i < replecementTable.length; i++) { var replacement = replecementTable[i]; text = text.replace(replacement[0], replacement[1]); } return text; }; Str.CompleteReplace = function(text, regexp, newSubStr) { if(typeof(text) != "string") text = text.toString(); var textPrev; do { textPrev = text; text = text.replace(regexp, newSubStr); } while(text != textPrev); return text; }; Str.EncodeHtml = function(html) { return Str.ApplyReplacement(html, [ [ /&/g, '&x;' ], [ /&/g, '&' ], [ /"/g, '"x;' ], [ /"/g, '"' ], [ /</g, '<x;' ], [ //g, '>' ] ]); }; Str.DecodeHtml = function(html) { return Str.ApplyReplacement(html, [ [ />/g, '>' ], [ />x;/g, '>' ], [ /</g, '<' ], [ /<x;/g, '<' ], [ /"/g, '"' ], [ /"x;/g,'"' ], [ /&/g, '&' ], [ /&x;/g, '&' ] ]); }; Str.DecodeHtmlViaTextArea = function(html) { var textArea = document.createElement("TEXTAREA"); setInnerHtmlInternal(textArea, html); return textArea.value; }; Str.TrimStart = function(str) { return trimInternal(str, true); }; Str.TrimEnd = function(str) { return trimInternal(str, false, true); }; Str.Trim = function(str) { return trimInternal(str, true, true); }; Str.EscapeForRegEx = function(str) { return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); }; var whiteSpaces = { 0x0009: 1, 0x000a: 1, 0x000b: 1, 0x000c: 1, 0x000d: 1, 0x0020: 1, 0x0085: 1, 0x00a0: 1, 0x1680: 1, 0x180e: 1, 0x2000: 1, 0x2001: 1, 0x2002: 1, 0x2003: 1, 0x2004: 1, 0x2005: 1, 0x2006: 1, 0x2007: 1, 0x2008: 1, 0x2009: 1, 0x200a: 1, 0x200b: 1, 0x2028: 1, 0x2029: 1, 0x202f: 1, 0x205f: 1, 0x3000: 1 }; var caretWidth = 1; function trimInternal(source, trimStart, trimEnd) { var len = source.length; if(!len) return source; if(len < 0xBABA1) { var result = source; if(trimStart) { result = result.replace(/^\s+/, ""); } if(trimEnd) { result = result.replace(/\s+$/, ""); } return result; } else { var start = 0; if(trimEnd) { while(len > 0 && whiteSpaces[source.charCodeAt(len - 1)]) { len--; } } if(trimStart && len > 0) { while(start < len && whiteSpaces[source.charCodeAt(start)]) { start++; } } return source.substring(start, len); } } Str.Insert = function(str, subStr, index) { var leftText = str.slice(0, index); var rightText = str.slice(index); return leftText + subStr + rightText; }; Str.InsertEx = function(str, subStr, startIndex, endIndex) { var leftText = str.slice(0, startIndex); var rightText = str.slice(endIndex); return leftText + subStr + rightText; }; var greekSLFSigmaChar = String.fromCharCode(962); var greekSLSigmaChar = String.fromCharCode(963); Str.PrepareStringForFilter = function(s){ s = s.toLowerCase(); if(ASPx.Browser.WebKitFamily) { return s.replace(new RegExp(greekSLFSigmaChar, "g"), greekSLSigmaChar); } return s; }; Str.GetCoincideCharCount = function(text, filter, textMatchingDelegate) { var coincideText = ASPx.Str.PrepareStringForFilter(filter); var originText = ASPx.Str.PrepareStringForFilter(text); while(coincideText != "" && !textMatchingDelegate(originText, coincideText)) { coincideText = coincideText.slice(0, -1); } return coincideText.length; }; ASPx.Str = Str; var Xml = { }; Xml.Parse = function(xmlStr) { if(window.DOMParser) { var parser = new DOMParser(); return parser.parseFromString(xmlStr, "text/xml"); } else if(window.ActiveXObject) { var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM"); if(xmlDoc) { xmlDoc.async = false; xmlDoc.loadXML(xmlStr); return xmlDoc; } } return null; }; ASPx.Xml = Xml; ASPx.Key = { F1 : 112, F2 : 113, F3 : 114, F4 : 115, F5 : 116, F6 : 117, F7 : 118, F8 : 119, F9 : 120, F10 : 121, F11 : 122, F12 : 123, Ctrl : 17, Shift : 16, Alt : 18, Enter : 13, Home : 36, End : 35, Left : 37, Right : 39, Up : 38, Down : 40, PageUp : 33, PageDown : 34, Esc : 27, Space : 32, Tab : 9, Backspace : 8, Delete : 46, Insert : 45, ContextMenu : 93, Windows : 91, Decimal : 110 }; ASPx.ModifierKey = { None: 0, Ctrl: 1 << (0 + 16), Shift: 1 << (2 + 16), Alt: 1 << (4 + 16), Meta: 1 << (8 + 16) }; ASPx.KeyCode = { Backspace : 8, Tab : 9, Enter : 13, Pause : 19, CapsLock : 20, Esc : 27, Space : 32, PageUp : 33, PageDown : 34, End : 35, Home : 36, Left : 37, Up : 38, Right : 39, Down : 40, Insert : 45, Delete : 46, Key_0 : 48, Key_1 : 49, Key_2 : 50, Key_3 : 51, Key_4 : 52, Key_5 : 53, Key_6 : 54, Key_7 : 55, Key_8 : 56, Key_9 : 57, Key_a : 65, Key_b : 66, Key_c : 67, Key_d : 68, Key_e : 69, Key_f : 70, Key_g : 71, Key_h : 72, Key_i : 73, Key_j : 74, Key_k : 75, Key_l : 76, Key_m : 77, Key_n : 78, Key_o : 79, Key_p : 80, Key_q : 81, Key_r : 82, Key_s : 83, Key_t : 84, Key_u : 85, Key_v : 86, Key_w : 87, Key_x : 88, Key_y : 89, Key_z : 90, Windows : 91, ContextMenu : 93, Numpad_0 : 96, Numpad_1 : 97, Numpad_2 : 98, Numpad_3 : 99, Numpad_4 : 100, Numpad_5 : 101, Numpad_6 : 102, Numpad_7 : 103, Numpad_8 : 104, Numpad_9 : 105, Multiply : 106, Add : 107, Subtract : 109, Decimal : 110, Divide : 111, F1 : 112, F2 : 113, F3 : 114, F4 : 115, F5 : 116, F6 : 117, F7 : 118, F8 : 119, F9 : 120, F10 : 121, F11 : 122, F12 : 123, NumLock : 144, ScrollLock : 145, Semicolon : 186, Equals : 187, Comma : 188, Dash : 189, Period : 190, ForwardSlash : 191, GraveAccent : 192, OpenBracket : 219, BackSlash : 220, CloseBracket : 221, SingleQuote : 222 }; ASPx.ScrollBarMode = { Hidden: 0, Visible: 1, Auto: 2 }; ASPx.ColumnResizeMode = { None: 0, Control: 1, NextColumn: 2 }; var Selection = { }; Selection.Set = function(input, startPos, endPos, scrollToSelection, isApi) { if(!ASPx.IsExistsElement(input)) return; var isInputFocused = ASPx.GetActiveElement() === input; var isInputNativeFocusLocked = ASPx.VirtualKeyboardUI.getInputNativeFocusLocked(); if(!isApi && Browser.VirtualKeyboardSupported && (!isInputFocused || isInputNativeFocusLocked)) return; var textLen = input.value.length; startPos = ASPx.GetDefinedValue(startPos, 0); endPos = ASPx.GetDefinedValue(endPos, textLen); if(startPos < 0) startPos = 0; if(endPos < 0 || endPos > textLen) endPos = textLen; if(startPos > endPos) startPos = endPos; var makeReadOnly = false; if(Browser.WebKitFamily && input.readOnly) { input.readOnly = false; makeReadOnly = true; } try { if(Browser.Firefox && Browser.Version >= 8) input.setSelectionRange(startPos, endPos, "backward"); else if(Browser.IE && input.createTextRange) { var range = input.createTextRange(); range.collapse(true); range.moveStart("character", startPos); range.moveEnd("character", endPos - startPos); range.select(); } else { forceScrollToSelectionRange(input, startPos, endPos); input.setSelectionRange(startPos, endPos); } if(Browser.Opera || Browser.Firefox || Browser.Chrome) input.focus(); } catch(e) { } if(scrollToSelection && input.tagName == 'TEXTAREA') { var scrollHeight = input.scrollHeight; var approxCaretPos = startPos; var scrollTop = Math.max(Math.round(approxCaretPos * scrollHeight / textLen - input.clientHeight / 2), 0); input.scrollTop = scrollTop; } if(makeReadOnly) input.readOnly = true; }; var getTextWidthBeforePos = function(input, pos) { return ASPx.GetSizeOfText(input.value.toString().substr(0, pos), ASPx.GetCurrentStyle(input)).width; }; var forceScrollToSelectionRange = function(input, startPos, endPos) { if(endPos === input.value.length) input.scrollLeft = input.scrollWidth; else if(startPos === 0 && endPos === 0) input.scrollLeft = 0; else { var inputRawWidth = input.offsetWidth - ASPx.GetLeftRightBordersAndPaddingsSummaryValue(input); if(inputRawWidth < input.scrollWidth) { var widthBeforeEndPos = getTextWidthBeforePos(input, endPos) + caretWidth; if(input.scrollLeft < widthBeforeEndPos - inputRawWidth) input.scrollLeft = widthBeforeEndPos - inputRawWidth; else { var widthBeforeStartPos = getTextWidthBeforePos(input, startPos) - caretWidth; if(input.scrollLeft > widthBeforeStartPos) input.scrollLeft = widthBeforeStartPos; } } } }; Selection.GetInfo = function(input) { var start, end; if(Browser.IE && Browser.Version < 9) { var range = document.selection.createRange(); var rangeCopy = range.duplicate(); range.move('character', -input.value.length); range.setEndPoint('EndToStart', rangeCopy); start = range.text.length; end = start + rangeCopy.text.length; } else { try { start = input.selectionStart; end = input.selectionEnd; } catch (e) { } } return { startPos: start, endPos: end }; }; Selection.GetExtInfo = function(input) { var start = 0, end = 0, textLen = 0; if(Browser.IE && Browser.Version < 9) { var normalizedValue; var range, textInputRange, textInputEndRange; range = document.selection.createRange(); if(range && range.parentElement() == input) { textLen = input.value.length; normalizedValue = input.value.replace(/\r\n/g, "\n"); textInputRange = input.createTextRange(); textInputRange.moveToBookmark(range.getBookmark()); textInputEndRange = input.createTextRange(); textInputEndRange.collapse(false); if(textInputRange.compareEndPoints("StartToEnd", textInputEndRange) > -1) { start = textLen; end = textLen; } else { start = normalizedValue.slice(0, start).split("\n").length - textInputRange.moveStart("character", -textLen) -1; if(textInputRange.compareEndPoints("EndToEnd", textInputEndRange) > -1) end = textLen; else end = normalizedValue.slice(0, end).split("\n").length - textInputRange.moveEnd("character", -textLen) - 1; } } return {startPos: start, endPos: end}; } try { start = input.selectionStart; end = input.selectionEnd; } catch (e) { } return {startPos: start, endPos: end}; }; Selection.SetCaretPosition = function(input, caretPos) { if(typeof caretPos === "undefined" || caretPos < 0) caretPos = input.value.length; Selection.Set(input, caretPos, caretPos, true); }; Selection.GetCaretPosition = function(element, isDialogMode) { var pos = 0; if("selectionStart" in element) { pos = element.selectionStart; } else if("selection" in document) { element.focus(); var sel = document.selection.createRange(), selLength = document.selection.createRange().text.length; sel.moveStart("character", -element.value.length); pos = sel.text.length - selLength; } if(isDialogMode && !pos) { pos = element.value.length - 1; } return pos; }; Selection.Clear = function() { try { if(window.getSelection) { window.getSelection().removeAllRanges(); } else if(document.selection) { if(document.selection.empty) document.selection.empty(); else if(document.selection.clear) document.selection.clear(); } } catch(e) { } }; Selection.ClearOnMouseMove = function(evt) { if(!Browser.IE || (evt.button != 0)) Selection.Clear(); }; Selection.SetElementSelectionEnabled = function(element, value) { var userSelectValue = value ? "" : "none"; var func = value ? Evt.DetachEventFromElement : Evt.AttachEventToElement; if(Browser.Firefox) element.style.MozUserSelect = userSelectValue; else if(Browser.WebKitFamily) element.style.webkitUserSelect = userSelectValue; else if(Browser.IE && Browser.Version > 10 || Browser.Edge) element.style.msUserSelect = userSelectValue; else if(Browser.Opera) func(element, "mousemove", Selection.Clear); else { func(element, "selectstart", ASPx.FalseFunction); func(element, "mousemove", Selection.Clear); } }; Selection.SetElementAsUnselectable = function(element, isWithChild, recursive) { if(element && element.nodeType == 1) { element.unselectable = "on"; if(Browser.NetscapeFamily) element.onmousedown = ASPx.FalseFunction; if((Browser.IE && Browser.Version >= 9) || Browser.WebKitFamily) Evt.AttachEventToElement(element, "mousedown", Evt.PreventEventAndBubble); if(isWithChild === true){ for(var j = 0; j < element.childNodes.length; j ++) Selection.SetElementAsUnselectable(element.childNodes[j], (!!recursive ? true : false), (!!recursive)); } } }; Selection.AreEqual = function(selection1, selection2) { return selection1.startPos === selection2.startPos && selection1.endPos === selection2.endPos; }; ASPx.Selection = Selection; var MouseScroller = { }; MouseScroller.MinimumOffset = 10; MouseScroller.Create = function(getElement, getScrollXElement, getScrollYElement, needPreventScrolling, vertRecursive, onMouseDown, onMouseMove, onMouseUp, onMouseUpMissed) { var element = getElement(); if(!element) return; if(!element.dxMouseScroller) element.dxMouseScroller = new MouseScroller.Extender(getElement, getScrollXElement, getScrollYElement, needPreventScrolling, vertRecursive, onMouseDown, onMouseMove, onMouseUp, onMouseUpMissed); return element.dxMouseScroller; }; MouseScroller.Extender = function(getElement, getScrollXElement, getScrollYElement, needPreventScrolling, vertRecursive, onMouseDown, onMouseMove, onMouseUp, onMouseUpMissed) { this.getElement = getElement; this.getScrollXElement = getScrollXElement; this.getScrollYElement = getScrollYElement; this.needPreventScrolling = needPreventScrolling; this.vertRecursive = !!vertRecursive; this.createHandlers(onMouseDown || function() { }, onMouseMove || function() { }, onMouseUp || function() { }, onMouseUpMissed || function() { }); this.update(); }; MouseScroller.Extender.prototype = { update: function() { if(this.element) Evt.DetachEventFromElement(this.element, ASPx.TouchUIHelper.touchMouseDownEventName, this.mouseDownHandler); this.element = this.getElement(); Evt.AttachEventToElement(this.element, ASPx.TouchUIHelper.touchMouseDownEventName, this.mouseDownHandler); Evt.AttachEventToElement(this.element, "click", this.mouseClickHandler); if(Browser.MSTouchUI && this.element.className.indexOf(ASPx.TouchUIHelper.msTouchDraggableClassName) < 0) this.element.className += " " + ASPx.TouchUIHelper.msTouchDraggableClassName; this.scrollXElement = this.getScrollXElement(); this.scrollYElement = this.getScrollYElement(); }, createHandlers: function(onMouseDown, onMouseMove, onMouseUp, onMouseUpMissed) { var mouseDownCounter = 0; this.onMouseDown = onMouseDown; this.onMouseMove = onMouseMove; this.onMouseUp = onMouseUp; this.mouseDownHandler = function(e) { if(mouseDownCounter++ > 0) { this.finishScrolling(); onMouseUpMissed(); } var eventSource = Evt.GetEventSource(e); var requirePreventCustonScroll = ASPx.IsExists(ASPx.TouchUIHelper.RequirePreventCustomScroll) && ASPx.TouchUIHelper.RequirePreventCustomScroll(eventSource, this.element); this.requirePreventScroll = requirePreventCustonScroll || this.needPreventScrolling && this.needPreventScrolling(eventSource); if(this.requirePreventScroll) return; this.scrollableTreeLine = this.GetScrollableElements(); this.firstX = this.prevX = Evt.GetEventX(e); this.firstY = this.prevY = Evt.GetEventY(e); Evt.AttachEventToDocument(ASPx.TouchUIHelper.touchMouseMoveEventName, this.mouseMoveHandler); Evt.AttachEventToDocument(ASPx.TouchUIHelper.touchMouseUpEventName, this.mouseUpHandler); this.onMouseDown(e); }.aspxBind(this); this.mouseMoveHandler = function(e) { if(ASPx.TouchUIHelper.isGesture) return; var x = Evt.GetEventX(e); var y = Evt.GetEventY(e); var xDiff = this.prevX - x; var yDiff = this.prevY - y; if(this.vertRecursive) { var isTopDirection = yDiff < 0; this.scrollYElement = this.GetElementForVertScrolling(isTopDirection, this.prevIsTopDirection, this.scrollYElement); this.prevIsTopDirection = isTopDirection; } if(this.scrollXElement && xDiff != 0) this.scrollXElement.scrollLeft += xDiff; if(this.scrollYElement && yDiff != 0) { this.scrollYElement.scrollTop += yDiff; var isOuterScrollableElement = this.scrollableTreeLine[this.scrollableTreeLine.length - 1] == this.scrollYElement; if(isOuterScrollableElement) y += yDiff; } this.prevX = x; this.prevY = y; e.preventDefault(); this.onMouseMove(e); }.aspxBind(this); this.mouseUpHandler = function(e) { this.finishScrolling(); this.onMouseUp(e); }.aspxBind(this); this.mouseClickHandler = function(e){ if(this.requirePreventScroll) return; var xDiff = this.firstX - Evt.GetEventX(e); var yDiff = this.firstY - Evt.GetEventY(e); if(xDiff > MouseScroller.MinimumOffset || yDiff > MouseScroller.MinimumOffset) return Evt.PreventEventAndBubble(e); }.aspxBind(this); this.finishScrolling = function() { Evt.DetachEventFromDocument(ASPx.TouchUIHelper.touchMouseMoveEventName, this.mouseMoveHandler); Evt.DetachEventFromDocument(ASPx.TouchUIHelper.touchMouseUpEventName, this.mouseUpHandler); this.scrollableTreeLine = []; this.prevIsTopDirection = null; mouseDownCounter--; }; }, GetScrollableElements: function() { if(!this.vertRecursive) return [ ]; var outerScrollableElementTag = ASPx.Browser.IE ? "HTML" : "BODY"; return ASPx.GetElementTreeLine(this.element, null, function(el) { return el == document; }) .filter(function(el) { return ASPx.IsScrollableElement(el, false, true) || el.tagName == outerScrollableElementTag; }.bind(this)); }, GetElementForVertScrolling: function(currentIsTop, prevIsTop, prevElement) { if(prevElement && currentIsTop === prevIsTop && this.GetVertScrollExcess(prevElement, currentIsTop) > 0) return prevElement; for(var i = 0; i < this.scrollableTreeLine.length; i++) { var element = this.scrollableTreeLine[i]; var excess = this.GetVertScrollExcess(element, currentIsTop); if(excess > 0) return element; } return null; }, GetVertScrollExcess: function(element, isTop) { if(isTop) return element.scrollTop; var isBodyElement = element.tagName == "BODY"; var clientHeight = isBodyElement ? ASPx.GetDocumentClientHeight() : element.clientHeight; return element.scrollHeight - clientHeight - element.scrollTop; } }; ASPx.MouseScroller = MouseScroller; var Evt = { }; Evt.GetEvent = function(evt){ return (typeof(event) != "undefined" && event != null && Browser.IE) ? event : evt; }; Evt.IsEventPrevented = function(evt) { return evt.defaultPrevented || evt.returnValue === false; }; Evt.PreventEvent = function(evt){ if(evt.preventDefault) evt.preventDefault(); else evt.returnValue = false; return false; }; Evt.PreventEventAndBubble = function(evt){ Evt.PreventEvent(evt); if(evt.stopPropagation) evt.stopPropagation(); evt.cancelBubble = true; return false; }; Evt.CancelBubble = function(evt){ evt.cancelBubble = true; return false; }; Evt.PreventImageDragging = function(image) { if(image) image.ondragstart = function() { return false; }; }; Evt.PreventDragStart = function(evt) { evt = Evt.GetEvent(evt); var element = Evt.GetEventSource(evt); if(element.releaseCapture) element.releaseCapture(); return false; }; Evt.PreventElementDrag = function(element) { if(Browser.IE) Evt.AttachEventToElement(element, "dragstart", Evt.PreventEvent); else Evt.AttachEventToElement(element, "mousedown", Evt.PreventEvent); }; Evt.PreventElementDragAndSelect = function(element, skipMouseMove, skipIESelect){ if(Browser.WebKitFamily) Evt.AttachEventToElement(element, "selectstart", Evt.PreventEventAndBubble); if(Browser.IE){ if(!skipIESelect) Evt.AttachEventToElement(element, "selectstart", ASPx.FalseFunction); if(!skipMouseMove) Evt.AttachEventToElement(element, "mousemove", Selection.ClearOnMouseMove); Evt.AttachEventToElement(element, "dragstart", Evt.PreventDragStart); } }; Evt.GetEventSource = function(evt){ if(!ASPx.IsExists(evt)) return null; return evt.srcElement ? evt.srcElement : evt.target; }; Evt.GetKeyCode = function(srcEvt) { return Browser.NetscapeFamily || Browser.Opera ? srcEvt.which : srcEvt.keyCode; }; function clientEventRequiresDocScrollCorrection() { var isSafariVerLess3 = Browser.Safari && Browser.Version < 3, isMacOSMobileVerLess51 = Browser.MacOSMobilePlatform && Browser.Version < 5.1; return Browser.AndroidDefaultBrowser || Browser.AndroidChromeBrowser || !(isSafariVerLess3 || isMacOSMobileVerLess51); } Evt.GetEventX = function(evt){ if(ASPx.TouchUIHelper.isTouchEvent(evt)) return ASPx.TouchUIHelper.getEventX(evt); return evt.clientX + (clientEventRequiresDocScrollCorrection() ? ASPx.GetDocumentScrollLeft() : 0); }; Evt.GetEventY = function(evt){ if(ASPx.TouchUIHelper.isTouchEvent(evt)) return ASPx.TouchUIHelper.getEventY(evt); return evt.clientY + (clientEventRequiresDocScrollCorrection() ? ASPx.GetDocumentScrollTop() : 0 ); }; Evt.IsLeftButtonPressed = function(evt) { if(ASPx.TouchUIHelper.isTouchEvent(evt)) return true; evt = Evt.GetEvent(evt); if(!evt) return false; if(Browser.IE && Browser.Version < 11) { if(Browser.MSTouchUI) return true; return evt.button % 2 == 1; } else if(Browser.WebKitFamily) { if(evt.type === "pointermove") return evt.buttons === 1; return evt.which == 1; } else if(Browser.NetscapeFamily || Browser.Edge || (Browser.IE && Browser.Version >= 11)) { if(evt.type === ASPx.TouchUIHelper.touchMouseMoveEventName) return evt.buttons === 1; return evt.which == 1; } else if(Browser.Opera) return evt.button == 0; return true; }; Evt.IsRightButtonPressed = function(evt){ evt = Evt.GetEvent(evt); if(!ASPx.IsExists(evt)) return false; if(Browser.IE || Browser.Edge) { if(evt.type === "pointermove") return evt.buttons === 2; return evt.button == 2; } else if(Browser.NetscapeFamily || Browser.WebKitFamily) return evt.which == 3; else if (Browser.Opera) return evt.button == 1; return true; }; Evt.GetWheelDelta = function(evt) { var ret; if(Browser.NetscapeFamily && Browser.MajorVersion < 17) ret = -evt.detail; else if(Browser.Safari) ret = evt.wheelDelta; else ret = -evt.deltaY; if(Browser.Opera && Browser.Version < 9) ret = -ret; return ret; }; Evt.IsWheelEventWithDirection = function(evt) { return ASPx.Data.ArrayContains(["wheel", "mousewheel"], evt.type); }; Evt.GetWheelDeltaX = function(evt) { if(evt.type === "wheel") return -evt.deltaX; if(evt.type === "mousewheel") return evt.wheelDeltaX; }; Evt.GetWheelDeltaY = function(evt) { if(evt.type === "wheel") return -evt.deltaY; if(evt.type === "mousewheel") return evt.wheelDeltaY; }; Evt.IsPassiveListenersSupported = function() { if(Browser.Chrome && Browser.MajorVersion > 69 || Browser.Edge && Browser.MajorVersion > 15 || Browser.Firefox && Browser.MajorVersion > 62) return true; if(Evt.isPassiveListenersSupported === undefined) { Evt.isPassiveListenersSupported = false; try { var options = Object.defineProperty({}, "passive", { get: function() { Evt.isPassiveListenersSupported = true; } }); window.addEventListener("test", options, options); window.removeEventListener("test", options, options); } catch(err) { Evt.isPassiveListenersSupported = false; } } return !!Evt.isPassiveListenersSupported; }; Evt.AttachEventToElement = function(element, eventName, func, onlyBubbling, passive) { if(element.addEventListener) element.addEventListener(eventName, func, Evt.IsPassiveListenersSupported() ? { capture: !onlyBubbling, passive: !!passive } : !onlyBubbling); else element.attachEvent("on" + eventName, func); }; Evt.DetachEventFromElement = function(element, eventName, func) { if(element.removeEventListener) element.removeEventListener(eventName, func, true); else element.detachEvent("on" + eventName, func); }; Evt.AttachEventToDocument = function(eventName, func) { var attachingAllowed = ASPx.TouchUIHelper.onEventAttachingToDocument(eventName, func); if(attachingAllowed) Evt.AttachEventToDocumentCore(eventName, func); }; Evt.AttachEventToDocumentCore = function(eventName, func) { Evt.AttachEventToElement(document, eventName, func); }; Evt.DetachEventFromDocument = function(eventName, func) { Evt.DetachEventFromDocumentCore(eventName, func); ASPx.TouchUIHelper.onEventDettachedFromDocument(eventName, func); }; Evt.DetachEventFromDocumentCore = function(eventName, func){ Evt.DetachEventFromElement(document, eventName, func); }; Evt.GetMouseWheelEventName = function() { if(Browser.Safari) return "mousewheel"; if(Browser.NetscapeFamily && Browser.MajorVersion < 17) return "DOMMouseScroll"; return "wheel"; }; Evt.AttachMouseEnterToElement = function (element, onMouseOverHandler, onMouseOutHandler) { Evt.AttachEventToElement(element, ASPx.TouchUIHelper.pointerEnabled ? ASPx.TouchUIHelper.pointerOverEventName : "mouseover", function (evt) { mouseEnterHandler(evt, element, onMouseOverHandler, onMouseOutHandler); }); Evt.AttachEventToElement(element, ASPx.TouchUIHelper.pointerEnabled ? ASPx.TouchUIHelper.pointerOutEventName : "mouseout", function (evt) { mouseEnterHandler(evt, element, onMouseOverHandler, onMouseOutHandler); }); }; Evt.GetEventRelatedTarget = function(evt, isMouseOverEvent) { return evt.relatedTarget || (isMouseOverEvent ? evt.srcElement : evt.toElement); }; function mouseEnterHandler(evt, element, onMouseOverHandler, onMouseOutHandler) { var isMouseOverExecuted = !!element.dxMouseOverExecuted; var isMouseOverEvent = (evt.type == "mouseover" || evt.type == ASPx.TouchUIHelper.pointerOverEventName); if(isMouseOverEvent && isMouseOverExecuted || !isMouseOverEvent && !isMouseOverExecuted) return; var source = Evt.GetEventRelatedTarget(evt, isMouseOverEvent); if(!ASPx.GetIsParent(element, source)) { element.dxMouseOverExecuted = isMouseOverEvent; if(isMouseOverEvent) onMouseOverHandler(element); else onMouseOutHandler(element); } else if(isMouseOverEvent && !isMouseOverExecuted) { element.dxMouseOverExecuted = true; onMouseOverHandler(element); } } Evt.DispatchEvent = function(target, eventName, canBubble, cancellable) { var event; if(Browser.IE && Browser.Version < 9) { eventName = "on" + eventName; if(eventName in target) { event = document.createEventObject(); target.fireEvent("on" + eventName, event); } } else { event = document.createEvent("Event"); event.initEvent(eventName, canBubble || false, cancellable || false); target.dispatchEvent(event); } }; Evt.EmulateDocumentOnMouseDown = function(evt) { Evt.EmulateOnMouseDown(document, evt); }; Evt.EmulateOnMouseDown = function(element, evt) { if(Browser.IE && Browser.Version < 9) element.fireEvent("onmousedown", evt); else if(!Browser.WebKitFamily){ var emulatedEvt = document.createEvent("MouseEvents"); emulatedEvt.initMouseEvent("mousedown", true, true, window, 0, evt.screenX, evt.screenY, evt.clientX, evt.clientY, evt.ctrlKey, evt.altKey, evt.shiftKey, false, 0, null); element.dispatchEvent(emulatedEvt); } }; Evt.EmulateOnMouseEvent = function (type, element, evt) { evt.type = type; var emulatedEvt = document.createEvent("MouseEvents"); emulatedEvt.initMouseEvent(type, true, true, window, 0, evt.screenX, evt.screenY, evt.clientX, evt.clientY, evt.ctrlKey, evt.altKey, evt.shiftKey, false, 0, null); emulatedEvt.target = element; element.dispatchEvent(emulatedEvt); }; Evt.EmulateMouseClick = function (element, evt) { var x = element.offsetWidth / 2; var y = element.offsetHeight / 2; if (!evt) evt = { bubbles: true, cancelable: true, view: window, detail: 1, screenX: 0, screenY: 0, clientX: x, clientY: y, ctrlKey: false, altKey: false, shiftKey: false, metaKey: false, button: 0, relatedTarget: null }; Evt.EmulateOnMouseEvent("mousedown", element, evt); Evt.EmulateOnMouseEvent("mouseup", element, evt); Evt.EmulateOnMouseEvent("click", element, evt); }; Evt.DoElementClick = function(element) { try{ element.click(); } catch(e){ } }; Evt.IsActionKeyPressed = function(evt) { return evt.keyCode === ASPx.Key.Space || evt.keyCode === ASPx.Key.Enter || (evt.keyCode === ASPx.Key.Down && evt.altKey); }; Evt.InvokeMouseClickByKeyDown = function(evt, handler) { if(Evt.IsActionKeyPressed(evt)) { ASPx.Evt.PreventEvent(evt); if(!handler) ASPx.Evt.GetEventSource(evt).onclick(); else handler(evt); } }; Evt.AttachContextMenuToElement = function (element, handler, onlyBubbling) { if (ASPx.TouchUIHelper.useLongTapHelper()) element.detachContextMenuEventHandler = ASPx.TouchUIHelper.attachLongTapHandler(element, handler, onlyBubbling); else Evt.AttachEventToElement(element, "contextmenu", handler, onlyBubbling); }; Evt.DetachContextMenuFromElement = function (element, handler) { if (element.detachContextMenuEventHandler) element.detachContextMenuEventHandler(); else Evt.DetachEventFromElement(element, "contextmenu", handler); }; ASPx.Evt = Evt; var Attr = { }; Attr.GetAttribute = function(obj, attrName){ if(obj.getAttribute) return obj.getAttribute(attrName); else if(obj.getPropertyValue) { if(Browser.Firefox) { try { return obj.getPropertyValue(attrName); } catch(e) { return obj[attrName]; } } return obj.getPropertyValue(attrName); } return null; }; Attr.SetAttribute = function(obj, attrName, value){ if(obj.setAttribute) { if(isSourceResetRequired() && attrName.toLowerCase() === "src") obj.setAttribute(attrName, ""); obj.setAttribute(attrName, value); } else if(obj.setProperty) obj.setProperty(attrName, value, ""); }; Attr.ToggleAttribute = function(obj, attrName, value, condition) { if(condition) Attr.SetAttribute(obj, attrName, value); else Attr.RemoveAttribute(obj, attrName); }; Attr.RemoveAttribute = function(obj, attrName){ if(obj.removeAttribute) obj.removeAttribute(attrName); else if(obj.removeProperty) obj.removeProperty(attrName); }; Attr.IsExistsAttribute = function(obj, attrName){ var value = Attr.GetAttribute(obj, attrName); return (value != null) && (value !== ""); }; Attr.SetOrRemoveAttribute = function(obj, attrName, value) { if(!value) Attr.RemoveAttribute(obj, attrName); else Attr.SetAttribute(obj, attrName, value); }; Attr.SaveAttribute = function(obj, attrName, savedObj, savedAttrName){ if(!Attr.IsExistsAttribute(savedObj, savedAttrName)){ var oldValue = Attr.IsExistsAttribute(obj, attrName) ? Attr.GetAttribute(obj, attrName) : ASPx.EmptyObject; Attr.SetAttribute(savedObj, savedAttrName, oldValue); } }; Attr.SaveStyleAttribute = function(obj, attrName){ Attr.SaveAttribute(obj.style, attrName, obj, "saved" + attrName); }; Attr.ChangeAttributeExtended = function(obj, attrName, savedObj, savedAttrName, newValue){ Attr.SaveAttribute(obj, attrName, savedObj, savedAttrName); Attr.SetAttribute(obj, attrName, newValue); }; Attr.ChangeAttribute = function(obj, attrName, newValue){ Attr.ChangeAttributeExtended(obj, attrName, obj, "saved" + attrName, newValue); }; Attr.ChangeStyleAttribute = function(obj, attrName, newValue){ Attr.ChangeAttributeExtended(obj.style, attrName, obj, "saved" + attrName, newValue); }; Attr.ResetAttributeExtended = function(obj, attrName, savedObj, savedAttrName){ Attr.SaveAttribute(obj, attrName, savedObj, savedAttrName); Attr.SetAttribute(obj, attrName, ""); Attr.RemoveAttribute(obj, attrName); }; Attr.ResetAttribute = function(obj, attrName){ Attr.ResetAttributeExtended(obj, attrName, obj, "saved" + attrName); }; Attr.ResetStyleAttribute = function(obj, attrName){ Attr.ResetAttributeExtended(obj.style, attrName, obj, "saved" + attrName); }; Attr.RestoreAttributeExtended = function(obj, attrName, savedObj, savedAttrName){ if(Attr.IsExistsAttribute(savedObj, savedAttrName)){ var oldValue = Attr.GetAttribute(savedObj, savedAttrName); if(oldValue != ASPx.EmptyObject) Attr.SetAttribute(obj, attrName, oldValue); else Attr.RemoveAttribute(obj, attrName); Attr.RemoveAttribute(savedObj, savedAttrName); return true; } return false; }; Attr.RestoreAttribute = function(obj, attrName){ return Attr.RestoreAttributeExtended(obj, attrName, obj, "saved" + attrName); }; Attr.RestoreStyleAttribute = function(obj, attrName){ return Attr.RestoreAttributeExtended(obj.style, attrName, obj, "saved" + attrName); }; Attr.CopyAllAttributes = function(sourceElem, destElement) { var attrs = sourceElem.attributes; for(var n = 0; n < attrs.length; n++) { var attr = attrs[n]; if(attr.specified) { var attrName = attr.nodeName; var attrValue = sourceElem.getAttribute(attrName, 2); if(attrValue == null) attrValue = attr.nodeValue; destElement.setAttribute(attrName, attrValue, 0); } } if(sourceElem.style.cssText !== '') destElement.style.cssText = sourceElem.style.cssText; }; Attr.RemoveAllAttributes = function(element, excludedAttributes) { var excludedAttributesHashTable = {}; if(excludedAttributes) excludedAttributesHashTable = Data.CreateHashTableFromArray(excludedAttributes); if(element.attributes) { var attrArray = element.attributes; for(var i = 0; i < attrArray.length; i++) { var attrName = attrArray[i].name; if(!ASPx.IsExists(excludedAttributesHashTable[attrName.toLowerCase()])) { try { attrArray.removeNamedItem(attrName); } catch (e) { } } } } }; Attr.RemoveStyleAttribute = function(element, attrName) { if(element.style) { if(Browser.Firefox && element.style[attrName]) element.style[attrName] = ""; if(element.style.removeAttribute && element.style.removeAttribute != "") element.style.removeAttribute(attrName); else if(element.style.removeProperty && element.style.removeProperty != "") element.style.removeProperty(attrName); } }; Attr.RemoveAllStyles = function(element) { if(element.style) { for(var key in element.style) Attr.RemoveStyleAttribute(element, key); Attr.RemoveAttribute(element, "style"); } }; Attr.GetTabIndexAttributeName = function(){ return Browser.IE ? "tabIndex" : "tabindex"; }; Attr.ChangeTabIndexAttribute = function(element){ var attribute = Attr.GetTabIndexAttributeName(); if(Attr.GetAttribute(element, attribute) != -1) Attr.ChangeAttribute(element, attribute, -1); }; Attr.SaveTabIndexAttributeAndReset = function(element) { var attribute = Attr.GetTabIndexAttributeName(); Attr.SaveAttribute(element, attribute, element, "saved" + attribute); Attr.SetAttribute(element, attribute, -1); }; Attr.RestoreTabIndexAttribute = function(element){ var attribute = Attr.GetTabIndexAttributeName(); if(Attr.IsExistsAttribute(element, attribute)) { if(Attr.GetAttribute(element, attribute) == -1) { if(Attr.IsExistsAttribute(element, "saved" + attribute)){ var oldValue = Attr.GetAttribute(element, "saved" + attribute); if(oldValue != ASPx.EmptyObject) Attr.SetAttribute(element, attribute, oldValue); else { if(Browser.WebKitFamily) Attr.SetAttribute(element, attribute, 0); Attr.RemoveAttribute(element, attribute); } Attr.RemoveAttribute(element, "saved" + attribute); } } } }; Attr.ChangeAttributesMethod = function(enabled){ return enabled ? Attr.RestoreAttribute : Attr.ResetAttribute; }; Attr.InitiallyChangeAttributesMethod = function(enabled){ return enabled ? Attr.ChangeAttribute : Attr.ResetAttribute; }; Attr.ChangeStyleAttributesMethod = function(enabled){ return enabled ? Attr.RestoreStyleAttribute : Attr.ResetStyleAttribute; }; Attr.InitiallyChangeStyleAttributesMethod = function(enabled){ return enabled ? Attr.ChangeStyleAttribute : Attr.ResetStyleAttribute; }; Attr.ChangeEventsMethod = function(enabled){ return enabled ? Evt.AttachEventToElement : Evt.DetachEventFromElement; }; Attr.ChangeDocumentEventsMethod = function(enabled){ return enabled ? Evt.AttachEventToDocument : Evt.DetachEventFromDocument; }; Attr.ChangeCellSpanCount = function(cell, value, isColumnSpan) { if(!cell) return; var propertyKey = isColumnSpan ? "colSpan" : "rowSpan"; var prevValue = cell[propertyKey]; if(value > 1) cell[propertyKey] = value; else if(prevValue !== 1) Attr.RemoveAttribute(cell, propertyKey); }; function isSourceResetRequired() { return Browser.IE && Browser.MajorVersion >= 11; } ASPx.Attr = Attr; var Aria = { atomic: "aria-atomic", checked: "aria-checked", descendant: "aria-activedescendant", described: "aria-describedby", disabled: "aria-disabled", expanded: "aria-expanded", haspopup: "aria-haspopup", invalid: "aria-invalid", label: "aria-label", labelled: "aria-labelledby", level: "aria-level", owns: "aria-owns", posinset: "aria-posinset", role: "role", selected: "aria-selected", setsize: "aria-setsize", valuemax: "aria-valuemax", valuemin: "aria-valuemin", valuenow: "aria-valuenow" }; Aria.SetOrRemoveDescendant = function(obj, value) { ASPx.Attr.SetOrRemoveAttribute(obj, Aria.descendant, value); }; Aria.SetOrRemoveLabel = function(obj, value) { ASPx.Attr.SetOrRemoveAttribute(obj, Aria.label, value); }; Aria.AppendLabel = function(obj, value, checkExists) { var currentValue = ASPx.Attr.GetAttribute(obj, Aria.label) || ""; var resultParts = [ ]; if(currentValue) resultParts.push(currentValue); var needAppendValue = value && (!checkExists || currentValue.indexOf(value) == -1); if(needAppendValue) resultParts.push(value); ASPx.Attr.SetAttribute(obj, Aria.label, resultParts.join(" ")); }; Aria.SetOrRemoveLabelled = function(obj, value) { ASPx.Attr.SetOrRemoveAttribute(obj, Aria.labelled, value); }; Aria.SetApplicationRole = function(obj) { ASPx.Attr.SetAttribute(obj, Aria.role, "application"); }; Aria.SetSilence = function(obj) { ASPx.Attr.SetAttribute(obj, Aria.label, ";"); }; Aria.SetExpanded = function(obj, expanded) { if(!obj || !ASPx.Attr.GetAttribute(obj, Aria.expanded)) return; Aria.SetBoolAttribute(obj, Aria.expanded, expanded); }; Aria.SetAtomic = function(obj, value) { Aria.SetBoolAttribute(obj, Aria.atomic, value); }; Aria.SetBoolAttribute = function(obj, attribute, value) { if(value) ASPx.Attr.SetAttribute(obj, attribute, true); else ASPx.Attr.SetAttribute(obj, attribute, false); }; ASPx.Attr.Aria = Aria; var Color = { }; function _aspxToHex(d) { return (d < 16) ? ("0" + d.toString(16)) : d.toString(16); } Color.RGBRegexp = /rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/; Color.RGBARegexp = /rgba?\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*,?\s*([0-9]*\.?[0-9]*)\s*\)/; Color.ColorToHexadecimal = function(colorValue, isRGBA) { if(typeof(colorValue) == "number") { var r = colorValue & 0xFF; var g = (colorValue >> 8) & 0xFF; var b = (colorValue >> 16) & 0xFF; return "#" + _aspxToHex(r) + _aspxToHex(g) + _aspxToHex(b); } if(colorValue && (colorValue.substr(0, 3).toLowerCase() == "rgb")) { var regResult = colorValue.toLowerCase().match(isRGBA ? Color.RGBARegexp : Color.RGBRegexp); if(regResult) { var r = parseInt(regResult[1]); var g = parseInt(regResult[2]); var b = parseInt(regResult[3]); if (isRGBA) return { r: r, g: g, b: b, a: regResult[4] !== undefined ? parseFloat(regResult[4]) : 1 }; return "#" + _aspxToHex(r) + _aspxToHex(g) + _aspxToHex(b); } return null; } if(colorValue && (colorValue.charAt(0) == "#")) return colorValue; return null; }; Color.Names = { AddColorNames: function(stringResourcesObj) { if(stringResourcesObj) { for(var key in stringResourcesObj) if(stringResourcesObj.hasOwnProperty(key)) this[key] = stringResourcesObj[key]; } } }; ASPx.Color = Color; var Url = { }; Url.Navigate = function(url, target) { var javascriptPrefix = "javascript:"; if(!url || url === "") return; else if(url.indexOf(javascriptPrefix) != -1) eval(url.substr(javascriptPrefix.length)); else { try{ if(target != "") navigateTo(url, target); else location.href = url; } catch(e){ } } }; Url.NavigateByLink = function(linkElement) { Url.Navigate(Attr.GetAttribute(linkElement, "href"), linkElement.target); }; Url.GetAbsoluteUrl = function(url) { if(url) url = Url.getURLObject(url).href; return url; }; Url.Redirect = function(url) { if(!ASPx.Browser.IE) window.location.href = url; else { var fakeLink = document.createElement("a"); fakeLink.href = url; document.body.appendChild(fakeLink); try { fakeLink.click(); } catch(e) { } } }; var absolutePathPrefixes = [ "about:", "file:///", "ftp://", "gopher://", "https://", "https://", "javascript:", "mailto:", "news:", "res://", "telnet://", "view-source:" ]; Url.isAbsoluteUrl = function(url) { if (url) { for (var i = 0; i < absolutePathPrefixes.length; i++) { if(url.indexOf(absolutePathPrefixes[i]) == 0) return true; } } return false; }; Url.getURLObject = function(url) { var link = document.createElement('A'); link.href = url || ""; return { href: link.href, protocol: link.protocol, host: link.host, port: link.port, pathname: link.pathname, search: link.search, hash: link.hash }; }; Url.getRootRelativeUrl = function(url) { return getRelativeUrl(url, !Url.isRootRelativeUrl(url), true); }; Url.getPathRelativeUrl = function(url) { return getRelativeUrl(url, !Url.isPathRelativeUrl(url), false); }; function getRelativeUrl(url, isValid, isRootRelative) { if(url && !(/data:([^;]+\/?[^;]*)(;charset=[^;]*)?(;base64,)/.test(url)) && isValid) { var urlObject = Url.getURLObject(url); var baseUrlObject = Url.getURLObject(); if(!Url.isAbsoluteUrl(url) || urlObject.host === baseUrlObject.host && urlObject.protocol === baseUrlObject.protocol) { url = urlObject.pathname; if(!isRootRelative) url = getPathRelativeUrl(baseUrlObject.pathname, url); url = url + urlObject.search + urlObject.hash; } } return url; } function getPathRelativeUrl(baseUrl, url) { var requestSegments = getSegments(baseUrl, false); var urlSegments = getSegments(url, true); return buildPathRelativeUrl(requestSegments, urlSegments, 0, 0, ""); } function getSegments(url, addTail) { var segments = []; var startIndex = 0; var endIndex = -1; while ((endIndex = url.indexOf("/", startIndex)) != -1) { segments.push(url.substring(startIndex, ++endIndex)); startIndex = endIndex; } if(addTail && startIndex < url.length) segments.push(url.substring(startIndex, url.length)); return segments; } function buildPathRelativeUrl(requestSegments, urlSegments, reqIndex, urlIndex, buffer) { if(urlIndex >= urlSegments.length) return buffer; if(reqIndex >= requestSegments.length) return buildPathRelativeUrl(requestSegments, urlSegments, reqIndex, urlIndex + 1, buffer + urlSegments[urlIndex]); if(requestSegments[reqIndex] === urlSegments[urlIndex] && urlIndex === reqIndex) return buildPathRelativeUrl(requestSegments, urlSegments, reqIndex + 1, urlIndex + 1, buffer); return buildPathRelativeUrl(requestSegments, urlSegments, reqIndex + 1, urlIndex, buffer + "../"); } Url.isPathRelativeUrl = function(url) { return !!url && !Url.isAbsoluteUrl(url) && url.indexOf("/") != 0; }; Url.isRootRelativeUrl = function(url) { return !!url && !Url.isAbsoluteUrl(url) && url.indexOf("/") == 0 && url.indexOf("//") != 0; }; function navigateTo(url, target) { var lowerCaseTarget = target.toLowerCase(); if("_top" == lowerCaseTarget) top.location.href = url; else if("_self" == lowerCaseTarget) location.href = url; else if("_search" == lowerCaseTarget) openInNewWindow(url); else if("_media" == lowerCaseTarget) openInNewWindow(url); else if("_parent" == lowerCaseTarget) window.parent.location.href = url; else if("_blank" == lowerCaseTarget) openInNewWindow(url); else { var frame = getFrame(top.frames, target); if(frame != null) frame.location.href = url; else openInNewWindow(url); } } function openInNewWindow(url) { if(ASPx.Browser.Safari) openInNewWindowViaIframe(url); else { var newWindow = window.open(); newWindow.opener = null; newWindow.location = url; } } function openInNewWindowViaIframe(url) { var iframe = document.createElement('iframe'); iframe.style.display = 'none'; document.body.appendChild(iframe); var iframeDoc = iframe.contentDocument || iframe.contentWindow.document; var openArgs = '"' + url + '"'; var script = iframeDoc.createElement('script'); script.type = 'text/javascript'; script.text = 'window.parent = null; ' + 'window.top = null;' + 'window.frameElement = null;' + 'var child = window.open(' + openArgs + ');' + 'child.opener = null'; iframeDoc.body.appendChild(script); document.body.removeChild(iframe); } ASPx.Url = Url; var Json = { }; function isValid(JsonString) { return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(JsonString.replace(/"(\\.|[^"\\])*"/g, ''))); } Json.Eval = function(jsonString, controlName) { if(isValid(jsonString)) return eval("(" + jsonString + ")"); else throw new Error(controlName + " received incorrect JSON-data: " + jsonString); }; Json.ToJson = function(param, skipEncodeHtml){ var paramType = typeof(param); if((paramType == "undefined") || (param == null)) return null; if((paramType == "object") && (typeof(param.__toJson) == "function")) return param.__toJson(); if((paramType == "number") || (paramType == "boolean")) return param; if(param.constructor == Date) return dateToJson(param); if(paramType == "string") { var result = param.replace(/\\/g, "\\\\"); result = result.replace(/"/g, "\\\""); result = result.replace(/\n/g, "\\n"); result = result.replace(/\r/g, "\\r"); if(!skipEncodeHtml) { result = result.replace(//g, "\\u003e"); } return "\"" + result + "\""; } if(param.constructor == Array){ var values = []; for(var i = 0; i < param.length; i++) { var jsonValue = Json.ToJson(param[i], skipEncodeHtml); if(jsonValue === null) jsonValue = "null"; values.push(jsonValue); } return "[" + values.join(",") + "]"; } var exceptKeys = {}; if(ASPx.Ident.IsArray(param.__toJsonExceptKeys)) exceptKeys = Data.CreateHashTableFromArray(param.__toJsonExceptKeys); exceptKeys["__toJsonExceptKeys"] = 1; var values = []; for(var key in param) { if(param.hasOwnProperty(key)) { if(ASPx.IsFunction(param[key])) continue; if(exceptKeys[key] == 1) continue; values.push(Json.ToJson(key) + ":" + Json.ToJson(param[key], skipEncodeHtml)); } } return "{" + values.join(",") + "}"; }; function dateToJson(date) { var result = [ date.getFullYear(), date.getMonth(), date.getDate() ]; var time = { h: date.getHours(), m: date.getMinutes(), s: date.getSeconds(), ms: date.getMilliseconds() }; if(time.h || time.m || time.s || time.ms) result.push(time.h); if(time.m || time.s || time.ms) result.push(time.m); if(time.s || time.ms) result.push(time.s); if(time.ms) result.push(time.ms); return "new Date(" + result.join() + ")"; } ASPx.Json = Json; ASPx.CreateClass = function(parentClass, properties) { if(arguments.length == 1) { properties = parentClass; parentClass = null; } var ret = function() { if(ret.preparing) return delete(ret.preparing); if(ret.constr) { this.constructor = ret; ret.constr.apply(this, arguments); } }; ret.prototype = {}; if(parentClass) { parentClass.preparing = true; for(var name in parentClass) { if(parentClass.hasOwnProperty(name) && name != 'constr' && ASPx.IsFunction(parentClass[name]) && !ret[name]) ret[name] = parentClass[name].aspxBind(parentClass); } ret.prototype = new parentClass; ret.prototype.constructor = parentClass; ret.constr = parentClass; } if(properties) { var constructorName = "constructor"; for(var name in properties) { if(!properties.hasOwnProperty(name)) continue; var getter = Object.getOwnPropertyDescriptor(properties, name).get; var setter = Object.getOwnPropertyDescriptor(properties, name).set; if(getter || setter) Object.defineProperty(ret.prototype, name, { set: setter, get: getter, enumerable: true, configurable: true }); if(name != constructorName && !getter && !setter) ret.prototype[name] = properties[name]; } if(properties[constructorName] && properties[constructorName] != Object) ret.constr = properties[constructorName]; } return ret; }; var registeredMixins = {}; ASPx.GetMixin = function (name, baseClass) { var mixinCache = baseClass._mixins || (baseClass._mixins = {}); var resultClass = mixinCache[name]; if (!resultClass) { var mixinCodeBuilder = registeredMixins[name]; if (!mixinCodeBuilder) throw new Error("mixin with the '" + name + "' is not registered"); var mixinCode = mixinCodeBuilder(baseClass); mixinCode.mixinName = name; resultClass = ASPx.CreateClass(baseClass, mixinCode); mixinCache[name] = resultClass; } return resultClass; }; ASPx.RegisterMixin = function() { var name = arguments.length == 1 ? "mixin_" + ASPx.CreateGuid() : arguments[0]; var mixinCodeBuilder = arguments[arguments.length - 1]; if (registeredMixins[name]) throw new Error("mixin with the '" + name + "' name is already defined"); registeredMixins[name] = mixinCodeBuilder; return function(baseClass) { return ASPx.GetMixin(name, baseClass); }; }; ASPx.FormatCallbackArg = function(prefix, arg) { if(prefix == null && arg == null) return ""; if(prefix == null) prefix = ""; if(arg == null) arg = ""; if(arg != null && !ASPx.IsExists(arg.length) && ASPx.IsExists(arg.value)) arg = arg.value; arg = arg.toString(); return [prefix, '|', arg.length, '|' , arg].join(''); }; ASPx.FormatCallbackArgs = function(callbackData) { var sb = [ ]; for(var i = 0; i < callbackData.length; i++) sb.push(ASPx.FormatCallbackArg(callbackData[i][0], callbackData[i][1])); return sb.join(""); }; ASPx.ParseShortcutString = function(shortcutString) { if(!shortcutString) return 0; var isCtrlKey = false; var isShiftKey = false; var isAltKey = false; var isMetaKey = false; var keyCode = null; var shcKeys = shortcutString.toString().split("+"); if(shcKeys.length > 0) { for(var i = 0; i < shcKeys.length; i++) { var key = Str.Trim(shcKeys[i].toUpperCase()); switch (key) { case "CONTROL": case "CONTROLKEY": case "CTRL": isCtrlKey = true; break; case "SHIFT": case "SHIFTKEY": isShiftKey = true; break; case "ALT": isAltKey = true; break; case "CMD": isMetaKey = true; break; case "F1": keyCode = ASPx.Key.F1; break; case "F2": keyCode = ASPx.Key.F2; break; case "F3": keyCode = ASPx.Key.F3; break; case "F4": keyCode = ASPx.Key.F4; break; case "F5": keyCode = ASPx.Key.F5; break; case "F6": keyCode = ASPx.Key.F6; break; case "F7": keyCode = ASPx.Key.F7; break; case "F8": keyCode = ASPx.Key.F8; break; case "F9": keyCode = ASPx.Key.F9; break; case "F10": keyCode = ASPx.Key.F10; break; case "F11": keyCode = ASPx.Key.F11; break; case "F12": keyCode = ASPx.Key.F12; break; case "RETURN": case "ENTER": keyCode = ASPx.Key.Enter; break; case "HOME": keyCode = ASPx.Key.Home; break; case "END": keyCode = ASPx.Key.End; break; case "LEFT": keyCode = ASPx.Key.Left; break; case "RIGHT": keyCode = ASPx.Key.Right; break; case "UP": keyCode = ASPx.Key.Up; break; case "DOWN": keyCode = ASPx.Key.Down; break; case "PAGEUP": keyCode = ASPx.Key.PageUp; break; case "PAGEDOWN": keyCode = ASPx.Key.PageDown; break; case "SPACE": keyCode = ASPx.Key.Space; break; case "TAB": keyCode = ASPx.Key.Tab; break; case "BACKSPACE": case "BACK": keyCode = ASPx.Key.Backspace; break; case "CONTEXT": keyCode = ASPx.Key.ContextMenu; break; case "ESCAPE": case "ESC": keyCode = ASPx.Key.Esc; break; case "DELETE": case "DEL": keyCode = ASPx.Key.Delete; break; case "INSERT": case "INS": keyCode = ASPx.Key.Insert; break; case "PLUS": keyCode = "+".charCodeAt(0); break; default: keyCode = key.charCodeAt(0); break; } } } else ASPx.ShowErrorAlert("Invalid shortcut"); return ASPx.GetShortcutCode(keyCode, isCtrlKey, isShiftKey, isAltKey, isMetaKey); }; ASPx.GetShortcutCode = function(keyCode, isCtrlKey, isShiftKey, isAltKey, isMetaKey) { var value = keyCode; value |= isCtrlKey ? ASPx.ModifierKey.Ctrl : 0; value |= isShiftKey ? ASPx.ModifierKey.Shift : 0; value |= isAltKey ? ASPx.ModifierKey.Alt : 0; value |= isMetaKey ? ASPx.ModifierKey.Meta : 0; return value; }; ASPx.GetShortcutCodeByEvent = function(evt) { return ASPx.GetShortcutCode(Evt.GetKeyCode(evt), evt.ctrlKey, evt.shiftKey, evt.altKey, ASPx.Browser.MacOSPlatform ? evt.metaKey : false); }; ASPx.IsPasteShortcut = function(evt) { if(evt.type === "paste") return true; var keyCode = Evt.GetKeyCode(evt); if(Browser.NetscapeFamily && evt.which == 0) keyCode = evt.keyCode; return (evt.ctrlKey && (keyCode == 118 || (keyCode == 86))) || (evt.shiftKey && !evt.ctrlKey && !evt.altKey && (keyCode == ASPx.Key.Insert)) ; }; var NotPrintableKeyCodes = null; ASPx.IsPrintableKey = function(keyCode) { if (!NotPrintableKeyCodes) NotPrintableKeyCodes = Object.keys(ASPx.Key).map(function(key) { return ASPx.Key[key]; }); return !ASPx.Data.ArrayContains(NotPrintableKeyCodes, keyCode); }; ASPx.SetFocus = function(element, selectAction) { function focusCore(element, selectAction){ try { element.focus(); if(Browser.IE && document.activeElement != element) element.focus(); if(selectAction) { var currentSelection = Selection.GetInfo(element); if(currentSelection.startPos == currentSelection.endPos) { switch(selectAction) { case "start": Selection.SetCaretPosition(element, 0); break; case "all": Selection.Set(element); break; } } } } catch (e) { } } if(ASPxClientUtils.iOSPlatform) focusCore(element, selectAction); else { window.setTimeout(function() { focusCore(element, selectAction); }, 100); } }; ASPx.IsFocusableCore = function(element, skipContainerVisibilityCheck) { var current = element; while(current && current.nodeType == 1) { if(current == element || !skipContainerVisibilityCheck(current)) { var tagName = current.tagName.toUpperCase(); if(tagName == "BODY") return true; var disabledElementTags = ["INPUT", "BUTTON", "TEXTAREA", "SELECT", "OPTION"]; if(disabledElementTags.indexOf(tagName) !== -1 && current.disabled || !ASPx.GetElementDisplay(current) || !ASPx.GetElementVisibility(current)) return false; } current = current.parentNode; } return true; }; ASPx.IsFocusable = function(element) { return ASPx.IsFocusableCore(element, ASPx.FalseFunction); }; ASPx.IsActionElement = function(element) { if(!ASPx.IsExistsElement(element)) return false; var tabIndex = parseInt(ASPx.Attr.GetAttribute(element, ASPx.Attr.GetTabIndexAttributeName())); var hasTabIndex = !isNaN(tabIndex); var hasNonNegativeTabIndex = hasTabIndex && tabIndex > -1; var hasNegativeTabIndex = hasTabIndex && tabIndex < 0; var tagName = element.tagName; var focusableElementTags = ["BUTTON", "SELECT", "TEXTAREA", "OPTION", "IFRAME"]; var isFocusableCore = ASPx.IsFocusable(element); var isFocusableTag = focusableElementTags.indexOf(tagName) !== -1; var isFocusableLink = tagName === "A" && (!!element.href || hasNonNegativeTabIndex); var isFocusableInput = tagName === "INPUT" && element.type.toLowerCase() !== "hidden"; var isFocusableByTabIndex = tagName !== "INPUT" && hasNonNegativeTabIndex; var isEditableDiv = tagName == "DIV" && element.contentEditable === "true"; return isFocusableCore && !hasNegativeTabIndex && (isFocusableTag || isFocusableLink || isFocusableInput || isFocusableByTabIndex || isEditableDiv); }; ASPx.GetCanBeActiveElementsInContainer = function(container) { var canBeActiveTags = ["INPUT", "A", "UL", "BUTTON", "TEXTAREA", "SELECT", "IFRAME"], canBeActiveElements = []; Data.ForEach(canBeActiveTags, function(tag) { var elements = container.getElementsByTagName(tag); canBeActiveElements = canBeActiveElements.concat([].slice.call(elements)); }); return canBeActiveElements; }; function isActionElementAllowedByPredicate(element, predicate) { var allowedByPredicate = !predicate || predicate(element); return allowedByPredicate && ASPx.IsActionElement(element); } ASPx.FindChildActionElements = function(container, predicate) { return ASPx.GetNodes(container, function(el) { return isActionElementAllowedByPredicate(el, predicate); }); }; ASPx.FindAllSortedActionElements = function(container, predicate) { var result = [ ]; if(!container || !container.getElementsByTagName) return result; var actionElements = ASPx.FindChildActionElements(container, predicate); var getTabOrderValue = function(el) { var tabIndex = parseInt(ASPx.Attr.GetAttribute(el, ASPx.Attr.GetTabIndexAttributeName())); return isNaN(tabIndex) ? 0 : tabIndex; }; var positiveTabIndexElements = actionElements.filter(function(x) { return getTabOrderValue(x) > 0; }); var nonPositiveTabIndexElements = actionElements.filter(function(x) { return getTabOrderValue(x) === 0; }); var sortedTabIndexElements = positiveTabIndexElements.sort(function(x, y) { return getTabOrderValue(x) - getTabOrderValue(y); }); result = sortedTabIndexElements.concat(nonPositiveTabIndexElements); return result; }; ASPx.FindFirstChildActionElement = function(container, predicate) { if(!container || isActionElementAllowedByPredicate(container, predicate)) return !container ? null : container; var sortedActionElements = ASPx.FindAllSortedActionElements(container, predicate); return sortedActionElements[0]; }; ASPx.FindLastChildActionElement = function(container, predicate) { if(!container) return null; var sortedActionElements = ASPx.FindAllSortedActionElements(container, predicate); var actionElement = sortedActionElements[sortedActionElements.length - 1]; if(!actionElement && isActionElementAllowedByPredicate(container, predicate)) actionElement = container; return actionElement; }; ASPx.GetParentClientControls = function(name) { var nameParts = name.split("_"); var result = [ ]; var controlCollection = ASPx.GetControlCollection(); for(var i = 1; i <= nameParts.length; i++) { var controlName = nameParts.slice(0, i).join("_"); var control = controlCollection.Get(controlName); if(control) result.push(control); } return result; }; ASPx.GetRootClientControl = function(childControlName) { var parentControls = ASPx.GetParentClientControls(childControlName); return parentControls[0]; }; ASPx.GetClientControlByElementID = function(elementID) { var parentControls = ASPx.GetParentClientControls(elementID); return parentControls[parentControls.length - 1]; }; ASPx.IsExists = function(obj){ return (typeof(obj) != "undefined") && (obj != null); }; ASPx.IsFunction = function(obj){ return typeof(obj) == "function"; }; ASPx.IsNumber = function(str) { return !isNaN(parseFloat(str)) && isFinite(str); }; ASPx.GetDefinedValue = function(value, defaultValue){ return (typeof(value) != "undefined") ? value : defaultValue; }; ASPx.CorrectJSFloatNumber = function(number) { var ret = 21; var numString = number.toPrecision(21); numString = numString.replace("-", ""); var integerDigitsCount = numString.indexOf(ASPx.PossibleNumberDecimalSeparators[0]); if(integerDigitsCount < 0) integerDigitsCount = numString.indexOf(ASPx.PossibleNumberDecimalSeparators[1]); var floatDigitsCount = numString.length - integerDigitsCount - 1; if(floatDigitsCount < 10) return number; if(integerDigitsCount > 0) { ret = integerDigitsCount + 12; } var toPrecisionNumber = Math.min(ret, 21); var newValueString = number.toPrecision(toPrecisionNumber); return parseFloat(newValueString, 10); }; ASPx.CorrectRounding = function(number, step) { var regex = /[,|.](.*)/, isFloatValue = regex.test(number), isFloatStep = regex.test(step); if(isFloatValue || isFloatStep) { var valueAccuracy = (isFloatValue) ? regex.exec(number)[0].length - 1 : 0, stepAccuracy = (isFloatStep) ? regex.exec(step)[0].length - 1 : 0, accuracy = Math.max(valueAccuracy, stepAccuracy); var multiplier = Math.pow(10, accuracy); number = Math.round((number + step) * multiplier) / multiplier; return number; } return number + step; }; ASPx.GetActiveElement = function() { try{ return document.activeElement; } catch(e) { return null; } }; var verticalScrollBarWidth; ASPx.GetVerticalScrollBarWidth = function() { if(typeof(verticalScrollBarWidth) == "undefined") { var container = document.createElement("DIV"); container.style.cssText = "position: absolute; top: 0px; left: 0px; visibility: hidden; width: 200px; height: 150px; overflow: hidden; box-sizing: content-box"; document.body.appendChild(container); var child = document.createElement("P"); container.appendChild(child); child.style.cssText = "width: 100%; height: 200px;"; var widthWithoutScrollBar = child.offsetWidth; container.style.overflow = "scroll"; var widthWithScrollBar = child.offsetWidth; if(widthWithoutScrollBar == widthWithScrollBar) widthWithScrollBar = container.clientWidth; verticalScrollBarWidth = widthWithoutScrollBar - widthWithScrollBar; document.body.removeChild(container); } return verticalScrollBarWidth; }; function hideScrollBarCore(element, scrollName) { if(element.tagName == "IFRAME") { if((element.scrolling == "yes") || (element.scrolling == "auto")) { Attr.ChangeAttribute(element, "scrolling", "no"); return true; } } else if(element.tagName == "DIV") { if((element.style[scrollName] == "scroll") || (element.style[scrollName] == "auto")) { Attr.ChangeStyleAttribute(element, scrollName, "hidden"); return true; } } return false; } function restoreScrollBarCore(element, scrollName) { if(element.tagName == "IFRAME") return Attr.RestoreAttribute(element, "scrolling"); else if(element.tagName == "DIV") return Attr.RestoreStyleAttribute(element, scrollName); return false; } ASPx.SetScrollBarVisibilityCore = function(element, scrollName, isVisible) { return isVisible ? restoreScrollBarCore(element, scrollName) : hideScrollBarCore(element, scrollName); }; ASPx.SetScrollBarVisibility = function(element, isVisible) { if(ASPx.SetScrollBarVisibilityCore(element, "overflow", isVisible)) return true; var result = ASPx.SetScrollBarVisibilityCore(element, "overflowX", isVisible) || ASPx.SetScrollBarVisibilityCore(element, "overflowY", isVisible); return result; }; ASPx.SetInnerHtml = function(element, html) { if(Browser.IE) { setInnerHtmlInternal(element, " " + html); element.removeChild(element.firstChild); } else setInnerHtmlInternal(element, html); }; ASPx.GetInnerText = function(container) { if(Browser.Safari && Browser.MajorVersion <= 5) { var filter = getHtml2PlainTextFilter(); setInnerHtmlInternal(filter, container.innerHTML); ASPx.SetElementDisplay(filter, true); var innerText = filter.innerText; ASPx.SetElementDisplay(filter, false); return innerText; } else if(Browser.NetscapeFamily || Browser.WebKitFamily || (Browser.IE && Browser.Version >= 9) || Browser.Edge) { return container.textContent; } else return container.innerText; }; var html2PlainTextFilter = null; function getHtml2PlainTextFilter() { if(html2PlainTextFilter == null) { html2PlainTextFilter = document.createElement("DIV"); html2PlainTextFilter.style.width = "0"; html2PlainTextFilter.style.height = "0"; html2PlainTextFilter.style.overflow = "visible"; ASPx.SetElementDisplay(html2PlainTextFilter, false); document.body.appendChild(html2PlainTextFilter); } return html2PlainTextFilter; } ASPx.CreateHiddenField = function(name, id, parent) { var input = document.createElement("INPUT"); input.setAttribute("type", "hidden"); if(name) input.setAttribute("name", name); if(id) input.setAttribute("id", id); if(parent) parent.appendChild(input); return input; }; ASPx.CloneObject = function(srcObject) { if(typeof(srcObject) != 'object' || srcObject == null) return srcObject; var newObject = {}; for(var i in srcObject) newObject[i] = srcObject[i]; return newObject; }; ASPx.InsertRowsBefore = function(table, rowsHtml, index) { var row = null; if(index >= 0 && index < table.rows.length) row = table.rows[index]; var func = ASPx.Browser.IE && ASPx.Browser.Version < 10 ? insertRowsBefore_IE9 : insertRowsBefore; func(table, rowsHtml, row); }; var insertRowsBefore = function(table, rowsHtml, row) { if(!row && table.tBodies.length > 0) { row = document.createElement("TR"); table.tBodies[0].appendChild(row); row.shouldRemove = true; } if(row) { row.insertAdjacentHTML("beforeBegin", rowsHtml); if(row.shouldRemove) ASPx.RemoveElement(row); } }; var insertRowsBefore_IE9 = function(table, rowsHtml, nextRow) { var row = document.createElement("TR"); var cell = document.createElement("TD"); setInnerHtmlInternal(cell, "" + rowsHtml + "
"); var tbody = table.tBodies[0]; tbody.appendChild(row); row.appendChild(cell); var newTable = ASPx.GetNodeByTagName(cell, "TABLE", 0); var rowCount = newTable.rows.length; for(var i = rowCount - 1; i >= 0; i--) { var newRow = newTable.rows[i]; if(nextRow == null) tbody.appendChild(newRow); else tbody.insertBefore(newRow, nextRow); nextRow = newRow; } ASPx.RemoveElement(row); }; ASPx.IsPercentageSize = function(size) { return size && size.indexOf('%') != -1; }; ASPx.GetElementById = function(id) { if(document.getElementById) return document.getElementById(id); else return document.all[id]; }; ASPx.GetInputElementById = function(id) { var elem = ASPx.GetElementById(id); if(!Browser.IE) return elem; if(elem) { if(elem.id == id) return elem; else { for(var i = 1; i < document.all[id].length; i++) { if(document.all[id][i].id == id) return document.all[id][i]; } } } return null; }; ASPx.GetElementByIdInDocument = function(documentObj, id) { if(documentObj.getElementById) return documentObj.getElementById(id); else return documentObj.all[id]; }; ASPx.GetIsParent = function(parentElement, element) { if(!parentElement || !element) return false; while(element){ if(element === parentElement) return true; if(element.tagName === "BODY") return false; element = element.parentNode; } return false; }; ASPx.GetParentById = function(element, id) { element = element.parentNode; while(element){ if(element.id === id) return element; element = element.parentNode; } return null; }; ASPx.GetParentByPartialId = function(element, idPart){ while(element && element.tagName != "BODY") { if(element.id && element.id.match(idPart)) return element; element = element.parentNode; } return null; }; ASPx.GetParentByTagName = function(element, tagName) { tagName = tagName.toUpperCase(); while(element) { if(element.tagName === "BODY") return null; if(element.tagName === tagName) return element; element = element.parentNode; } return null; }; function getParentByClassNameInternal(element, className, selector) { while(element != null) { if(element.tagName == "BODY" || element.nodeName == "#document") return null; if(selector(element, className)) return element; element = element.parentNode; } return null; } ASPx.GetParentByPartialClassName = function(element, className) { return getParentByClassNameInternal(element, className, ASPx.ElementContainsCssClass); }; ASPx.GetParentByClassName = function(element, className) { return getParentByClassNameInternal(element, className, ASPx.ElementHasCssClass); }; ASPx.GetParentByTagNameAndAttributeValue = function(element, tagName, attrName, attrValue) { tagName = tagName.toUpperCase(); while(element != null) { if(element.tagName == "BODY") return null; if(element.tagName == tagName && element[attrName] == attrValue) return element; element = element.parentNode; } return null; }; ASPx.GetParent = function(element, testFunc){ if (!ASPx.IsExists(testFunc)) return null; while(element != null && element.tagName != "BODY"){ if(testFunc(element)) return element; element = element.parentNode; } return null; }; ASPx.GetElementTreeLine = function(element, stopTagName, stopFunc) { var result = []; stopTagName = stopTagName || "BODY"; while(element != null) { if(!stopFunc && element.tagName == stopTagName) break; if(stopFunc && stopFunc(element)) break; result.push(element); element = element.parentNode; } return result; }; ASPx.IsScrollableElement = function(element, isHorzScrollable, isVertScrollable) { isHorzScrollable = ASPx.IsExists(isHorzScrollable) ? isHorzScrollable : true; isVertScrollable = ASPx.IsExists(isVertScrollable) ? isVertScrollable : true; var style = ASPx.GetCurrentStyle(element); var overflowStyleNames = ["overflow"]; if(isHorzScrollable) overflowStyleNames.push("overflowX"); if(isVertScrollable) overflowStyleNames.push("overflowY"); for(var i = 0; i < overflowStyleNames.length; i++) if(style[overflowStyleNames[i]] == "scroll" || style[overflowStyleNames[i]] == "auto") return true; return false; }; ASPx.GetPreviousSibling = function(el) { if(el.previousElementSibling) { return el.previousElementSibling; } else { while(el = el.previousSibling) { if(el.nodeType === 1) return el; } } }; ASPx.ElementMatchesSelector = (function (e) { return (function (matches) { return function (el, selector) { return !!el && !!selector && matches.call(el, selector); }; })(e.matches || e.matchesSelector || e.webkitMatchesSelector || e.mozMatchesSelector || e.msMatchesSelector || e.oMatchesSelector); })(Element.prototype); ASPx.ElementHasCssClass = function(element, className) { try { var elementClasses; var classList = element.classList; if(!classList) { if(!element.className) return false; elementClasses = element.className.split(" "); } var classNames = className.split(" "); for(var i = classNames.length - 1; i >= 0; i--) { if(classList) { if(!classList.contains(classNames[i])) return false; continue; } if(Data.ArrayIndexOf(elementClasses, classNames[i]) < 0) return false; } return true; } catch(e) { return false; } }; ASPx.ElementContainsCssClass = function(element, className) { try { if(!element.className) return false; return element.className.indexOf(className) != -1; } catch(e) { return false; } }; ASPx.AddClassNameToElement = function (element, className) { if(!element || typeof(className) !== "string" ) return; className = className.trim(); if(!ASPx.ElementHasCssClass(element, className) && className !== "") element.className = (element.className === "") ? className : element.className + " " + className; }; ASPx.RemoveClassNameFromElement = function(element, className) { if(!element) return; var updClassName = " " + element.className + " "; var newClassName = updClassName.replace(" " + className + " ", " "); if(updClassName.length != newClassName.length) element.className = Str.Trim(newClassName); }; ASPx.RemoveClassNamesFromElement = function(element, classNames) { if(!element) return; for(var i = 0; i < classNames.length; i++) { var className = classNames[i]; if(ASPx.Browser.IE && ASPx.Browser.Version < 10) ASPx.RemoveClassNameFromElement(element, className); else element.classList.remove(className); } }; ASPx.ToggleClassNameToElement = function(element, className, contains) { if (!contains) ASPx.RemoveClassNameFromElement(element, className); if (contains && !ASPx.ElementHasCssClass(element, className)) ASPx.AddClassNameToElement(element, className); }; ASPx.GetClassNameList = function(element) { if(element.classList) return [ ].slice.call(element.classList); return element.className.replace(/^\s+|\s+$/g, '').split(/\s+/); }; function nodeListToArray(nodeList, filter) { var result = []; for(var i = 0, element; element = nodeList[i]; i++) { if(filter && !filter(element)) continue; result.push(element); } return result; } ASPx.NodeListToArray = nodeListToArray; function getItemByIndex(collection, index) { if(!index) index = 0; if(collection != null && collection.length > index) return collection[index]; return null; } ASPx.GetChildNodesByQuerySelector = function (parent, selector) { return nodeListToArray(parent.querySelectorAll(selector), function (el) { return el.parentNode === parent; }); }; ASPx.GetChildNodesByClassName = function(parent, className) { if(!parent) return []; if(parent.querySelectorAll) { var children = parent.querySelectorAll('.' + className); return nodeListToArray(children, function(element) { return element.parentNode === parent; }); } return ASPx.GetChildNodes(parent, function(elem) { return elem.className && ASPx.ElementHasCssClass(elem, className); }); }; ASPx.GetChildNodesByPartialClassName = function(element, className) { return ASPx.GetChildElementNodesByPredicate(element, function(child) { return ASPx.ElementContainsCssClass(child, className); }); }; ASPx.GetChildByPartialClassName = function(element, className, index) { if(element != null){ var collection = ASPx.GetChildNodesByPartialClassName(element, className); return getItemByIndex(collection, index); } return null; }; ASPx.GetChildByClassName = function(element, className, index) { if(element != null){ var collection = ASPx.GetChildNodesByClassName(element, className); return getItemByIndex(collection, index); } return null; }; ASPx.GetNodesByPartialClassName = function(element, className) { if(element.querySelectorAll) { var list = element.querySelectorAll('*[class*=' + className + ']'); return nodeListToArray(list); } var collection = element.all || element.getElementsByTagName('*'); var ret = [ ]; if(collection != null) { for(var i = 0; i < collection.length; i ++) { if(ASPx.ElementContainsCssClass(collection[i], className)) ret.push(collection[i]); } } return ret; }; ASPx.GetNodesByClassName = function(parent, className) { if(parent.querySelectorAll) { var children = parent.querySelectorAll('.' + className); return nodeListToArray(children); } return ASPx.GetNodes(parent, function(elem) { return elem.className && ASPx.ElementHasCssClass(elem, className); }); }; ASPx.GetNodeByClassName = function(element, className, index) { if(element != null){ var collection = ASPx.GetNodesByClassName(element, className); return getItemByIndex(collection, index); } return null; }; ASPx.GetChildById = function(element, id) { if(element.all) { var child = element.all[id]; if(!child) { child = element.all(id); if(!child) return Browser.IE ? document.getElementById(id) : null; } if(!ASPx.IsExists(child.length)) return child; else return ASPx.GetElementById(id); } else return ASPx.GetElementById(id); }; ASPx.GetNodesByPartialId = function(element, partialName, list) { if(element.id && element.id.indexOf(partialName) > -1) list.push(element); if(element.childNodes) { for(var i = 0; i < element.childNodes.length; i ++) ASPx.GetNodesByPartialId(element.childNodes[i], partialName, list); } }; ASPx.GetNodesByTagName = function(element, tagName) { tagName = tagName.toUpperCase(); if(element) { if(element.getElementsByTagName) return element.getElementsByTagName(tagName); else if(element.all && element.all.tags !== undefined) return Browser.Netscape ? element.all.tags[tagName] : element.all.tags(tagName); } return null; }; ASPx.GetNodeByTagName = function(element, tagName, index) { if(element != null){ var collection = ASPx.GetNodesByTagName(element, tagName); return getItemByIndex(collection, index); } return null; }; ASPx.GetChildNodesByTagName = function(parent, tagName) { return ASPx.GetChildNodes(parent, function (child) { return child.tagName === tagName; }); }; ASPx.GetChildByTagName = function(element, tagName, index) { if(element != null){ var collection = ASPx.GetChildNodesByTagName(element, tagName); return getItemByIndex(collection, index); } return null; }; ASPx.RetrieveByPredicate = function(scourceCollection, predicate) { var result = []; for(var i = 0; i < scourceCollection.length; i++) { var element = scourceCollection[i]; if(!predicate || predicate(element)) result.push(element); } return result; }; ASPx.GetChildNodes = function(parent, predicate) { return ASPx.RetrieveByPredicate(parent.childNodes, predicate); }; ASPx.GetNodes = function(parent, predicate) { var c = parent.all || parent.getElementsByTagName('*'); return ASPx.RetrieveByPredicate(c, predicate); }; ASPx.GetChildElementNodes = function(parent) { if(!parent) return null; return ASPx.GetChildNodes(parent, function(e) { return e.nodeType == 1; }); }; ASPx.GetChildElementNodesByPredicate = function(parent, predicate) { if(!parent) return null; if(!predicate) return ASPx.GetChildElementNodes(parent); return ASPx.GetChildNodes(parent, function(e) { return e.nodeType == 1 && predicate(e); }); }; ASPx.GetTextNode = function(element, index) { if(element != null){ var collection = [ ]; ASPx.GetTextNodes(element, collection); return getItemByIndex(collection, index); } return null; }; ASPx.GetTextNodes = function(element, collection) { for(var i = 0; i < element.childNodes.length; i ++){ var childNode = element.childNodes[i]; if(ASPx.IsExists(childNode.nodeValue)) collection.push(childNode); ASPx.GetTextNodes(childNode, collection); } }; ASPx.GetNormalizedTextNode = function(element, index) { var textNode = ASPx.GetTextNode(element, index); if(textNode != null) ASPx.MergeAdjacentTextNodes(textNode); return textNode; }; ASPx.MergeAdjacentTextNodes = function(firstTextNode) { if(!ASPx.IsExists(firstTextNode.nodeValue)) return; var textNode = firstTextNode; while(textNode.nextSibling && ASPx.IsExists(textNode.nextSibling.nodeValue)) { textNode.nodeValue += textNode.nextSibling.nodeValue; textNode.parentNode.removeChild(textNode.nextSibling); } }; ASPx.GetElementDocument = function(element) { return element.document || element.ownerDocument; }; ASPx.RemoveElement = function(element) { if(element && element.parentNode) element.parentNode.removeChild(element); }; ASPx.ReplaceTagName = function(element, newTagName, cloneChilds) { if(element.nodeType != 1) return null; if(element.nodeName == newTagName) return element; cloneChilds = cloneChilds !== undefined ? cloneChilds : true; var doc = element.ownerDocument; var newElem = doc.createElement(newTagName); Attr.CopyAllAttributes(element, newElem); if(cloneChilds) { for(var i = 0; i < element.childNodes.length; i++) newElem.appendChild(element.childNodes[i].cloneNode(true)); } else { for(var child; child = element.firstChild; ) newElem.appendChild(child); } element.parentNode.replaceChild(newElem, element); return newElem; }; ASPx.RemoveOuterTags = function(element) { if(ASPx.Browser.IE) { element.insertAdjacentHTML( 'beforeBegin', element.innerHTML ) ; ASPx.RemoveElement(element); } else { var docFragment = element.ownerDocument.createDocumentFragment(); for(var i = 0; i < element.childNodes.length; i++) docFragment.appendChild(element.childNodes[i].cloneNode(true)); element.parentNode.replaceChild(docFragment, element); } }; ASPx.WrapElementInNewElement = function(element, newElementTagName) { var wrapElement = null; if(Browser.IE) { var wrapElement = element.ownerDocument.createElement(newElementTagName); wrapElement.appendChild(element.cloneNode(true)); element.parentNode.insertBefore(wrapElement, element); element.parentNode.removeChild(element); } else { var docFragment = element.ownerDocument.createDocumentFragment(); wrapElement = element.ownerDocument.createElement(newElementTagName); docFragment.appendChild(wrapElement); wrapElement.appendChild(element.cloneNode(true)); element.parentNode.replaceChild(docFragment, element); } return wrapElement; }; ASPx.InsertElementAfter = function(newElement, targetElement) { var parentElem = targetElement.parentNode; if(parentElem.childNodes[parentElem.childNodes.length - 1] == targetElement) parentElem.appendChild(newElement); else parentElem.insertBefore(newElement, targetElement.nextSibling); }; ASPx.SetElementOpacity = function(element, value) { var useOpacityStyle = !Browser.IE || Browser.Version > 8; if(useOpacityStyle){ element.style.opacity = value; } else { if(typeof(element.filters) === "object" && element.filters["DXImageTransform.Microsoft.Alpha"]) element.filters.item("DXImageTransform.Microsoft.Alpha").Opacity = value*100; else element.style.filter = "alpha(opacity=" + (value * 100) + ")"; } }; ASPx.GetElementOpacity = function(element) { var useOpacityStyle = !Browser.IE || Browser.Version > 8; if(useOpacityStyle) return parseFloat(ASPx.GetCurrentStyle(element).opacity); else { if(typeof(element.filters) === "object" && element.filters["DXImageTransform.Microsoft.Alpha"]){ return element.filters.item("DXImageTransform.Microsoft.Alpha").Opacity / 100; } else { var alphaValue = ASPx.GetCurrentStyle(element).filter; var value = alphaValue.replace("alpha(opacity=", ""); value = value.replace(")", ""); return parseInt(value) / 100; } return 100; } }; ASPx.HiddenChangable = "dx-hc"; ASPx.DefaultDisplayNoneSelectors = [ "dxmodalSys" ]; ASPx.DefaultDisplaySelectors = ["show"]; function getIsDefaultDisplayNone(element) { for(var i = 0; i < ASPx.DefaultDisplayNoneSelectors.length; i++) { if(ASPx.ElementHasCssClass(element, ASPx.DefaultDisplayNoneSelectors[i])) return true; } return false; } ASPx.GetElementDisplay = function(element, isCurrentStyle) { if(isCurrentStyle) return ASPx.GetCurrentStyle(element).display != "none"; if(getIsDefaultDisplayNone(element)) return element.style.display != "none" && element.style.display != "" || ASPx.DefaultDisplaySelectors.some(function(s) { return ASPx.ElementHasCssClass(element, s); }); return element.style.display != "none" && !ASPx.ElementHasCssClass(element, ASPx.HiddenChangable); }; ASPx.SetElementDisplay = function(element, value) { if(!element) return; if(ASPx.ElementHasCssClass(element, ASPx.HiddenChangable)) ASPx.RemoveClassNameFromElement(element, ASPx.HiddenChangable); if(typeof(value) === "string") element.style.display = value; else if(getIsDefaultDisplayNone(element)) element.style.display = value ? (element.tagName === "TABLE" ? "table" : "block") : ""; else if(!value) element.style.display = "none"; else element.style.display = ""; }; ASPx.GetElementVisibility = function(element, isCurrentStyle) { if(isCurrentStyle) return ASPx.GetCurrentStyle(element).visibility != "hidden"; return element.style.visibility != "hidden"; }; ASPx.SetElementVisibility = function(element, value) { if(!element) return; if(typeof(value) === "string") element.style.visibility = value; else element.style.visibility = value ? "visible" : "hidden"; }; ASPx.IsElementVisible = function(element, isCurrentStyle) { while(element && element.tagName != "BODY") { if(!ASPx.GetElementDisplay(element, isCurrentStyle) || (!ASPx.GetElementVisibility(element, isCurrentStyle) && !Attr.IsExistsAttribute(element, "errorFrame"))) return false; element = element.parentNode; } return true; }; ASPx.IsElementDisplayed = function(element) { while(element && element.tagName != "BODY") { if(!ASPx.GetElementDisplay(element)) return false; element = element.parentNode; } return true; }; ASPx.GetElementInitializedFlag = function(element) { return element["dxinit"]; }; ASPx.SetElementInitializedFlag = function(element) { element["dxinit"] = true; }; ASPx.AddStyleSheetLinkToDocument = function(doc, linkUrl) { var newLink = createStyleLink(doc, linkUrl); var head = ASPx.GetHeadElementOrCreateIfNotExist(doc); head.appendChild(newLink); return newLink; }; ASPx.GetHeadElementOrCreateIfNotExist = function(doc) { var elements = ASPx.GetNodesByTagName(doc, "head"); var head = null; if(elements.length == 0) { head = doc.createElement("head"); head.visibility = "hidden"; doc.insertBefore(head, doc.body); } else head = elements[0]; return head; }; function createStyleLink(doc, url) { var newLink = doc.createElement("link"); Attr.SetAttribute(newLink, "href", url); Attr.SetAttribute(newLink, "type", "text/css"); Attr.SetAttribute(newLink, "rel", "stylesheet"); return newLink; } ASPx.GetCurrentStyle = function(element) { if(document.defaultView && document.defaultView.getComputedStyle) { var result = document.defaultView.getComputedStyle(element, null); if(!result && Browser.Firefox && window.frameElement) { var changes = []; var curElement = window.frameElement; while(!(result = document.defaultView.getComputedStyle(element, null))) { changes.push([curElement, curElement.style.display]); ASPx.SetStylesCore(curElement, "display", "block", true); curElement = curElement.tagName == "BODY" ? curElement.ownerDocument.defaultView.frameElement : curElement.parentNode; } result = ASPx.CloneObject(result); for(var ch, i = 0; ch = changes[i]; i++) ASPx.SetStylesCore(ch[0], "display", ch[1]); var dummy = document.body.offsetWidth; } if(Browser.Firefox && Browser.MajorVersion >= 62 && window.frameElement && result.length === 0) { result = ASPx.CloneObject(result); result.display = element.style.display; } return result; } return window.getComputedStyle(element, null); }; ASPx.CreateStyleSheetInDocument = function(doc) { if(doc.createStyleSheet) { try { return doc.createStyleSheet(); } catch(e) { var message = "The CSS link limit (31) has been exceeded. Please enable CSS merging or reduce the number of CSS files on the page. For details, see https://www.devexpress.com/Support/Center/p/K18487.aspx."; throw new Error(message); } } else { var styleSheet = doc.createElement("STYLE"); ASPx.GetNodeByTagName(doc, "HEAD", 0).appendChild(styleSheet); return styleSheet.sheet; } }; ASPx.currentStyleSheet = null; ASPx.GetCurrentStyleSheet = function() { if(!ASPx.currentStyleSheet) ASPx.currentStyleSheet = ASPx.CreateStyleSheetInDocument(document); return ASPx.currentStyleSheet; }; function getStyleSheetRules(styleSheet){ try { return Browser.IE && Browser.Version == 8 ? styleSheet.rules : styleSheet.cssRules; } catch(e) { return null; } } ASPx.cachedCssRules = { }; ASPx.GetStyleSheetRules = function (className, stylesStorageDocument) { if(ASPx.cachedCssRules[className]) { if(ASPx.cachedCssRules[className] != ASPx.EmptyObject) return ASPx.cachedCssRules[className]; return null; } var result = iterateStyleSheetRules(stylesStorageDocument, function(rule) { if(rule.selectorText == "." + className){ ASPx.cachedCssRules[className] = rule; return rule; } }); if(ASPx.IsExists(result)) return result; ASPx.cachedCssRules[className] = ASPx.EmptyObject; return null; }; function iterateStyleSheetRules(stylesStorageDocument, callback) { var doc = stylesStorageDocument || document; for(var i = 0; i < doc.styleSheets.length; i ++){ var styleSheet = doc.styleSheets[i]; var rules = getStyleSheetRules(styleSheet); if(rules != null){ for(var j = 0; j < rules.length; j ++) { var result = callback(rules[j]); if(result !== undefined) return result; } } } } ASPx.ProcessStyleSheetRules = function(prefix, callback) { iterateStyleSheetRules(null, function(rule) { if(!!rule.selectorText && rule.selectorText.indexOf(prefix) === 0) { var name = rule.selectorText.substring(prefix.length); var result = callback(name, rule.style, rule); if(result !== undefined) return result; } }); }; ASPx.ClearCachedCssRules = function(){ ASPx.cachedCssRules = { }; }; var styleCount = 0; var styleNameCache = { }; ASPx.CreateImportantStyleRule = function(styleSheet, cssText, postfix, prefix) { styleSheet = styleSheet || ASPx.GetCurrentStyleSheet(); var cacheKey = (postfix ? postfix + "||" : "") + cssText + (prefix ? "||" + prefix : ""); if(styleNameCache[cacheKey]) return styleNameCache[cacheKey]; prefix = prefix ? prefix + " " : ""; var className = "dxh" + styleCount + (postfix ? postfix : ""); ASPx.AddStyleSheetRule(styleSheet, prefix + "." + className, ASPx.CreateImportantCssText(cssText)); styleCount++; styleNameCache[cacheKey] = className; return className; }; ASPx.CreateImportantCssText = function(cssText) { var newText = ""; var hasEncodedSemicolon = cssText.indexOf(ASPx.StyleValueEncodedSemicolon) > -1; var attributes = cssText.split(";"); for(var i = 0; i < attributes.length; i++) { var rule = attributes[i]; if(rule != "") newText += ASPx.CreateImportantCssRule(rule, hasEncodedSemicolon); } return newText; }; ASPx.CreateImportantCssRule = function(rule, hasEncodedSemicolon) { var result = rule; if(hasEncodedSemicolon) { var regex = new RegExp(ASPx.StyleValueEncodedSemicolon, "g"); result = result.replace(regex, ";"); } result = result + " !important;"; return result; }; ASPx.AddStyleSheetRule = function(styleSheet, selector, cssText){ if(!cssText) return; styleSheet.insertRule(selector + " { " + cssText + " }", styleSheet.cssRules.length); }; ASPx.GetPointerCursor = function() { return "pointer"; }; ASPx.SetPointerCursor = function(element) { if(element.style.cursor == "") element.style.cursor = ASPx.GetPointerCursor(); }; ASPx.SetElementFloat = function(element, value) { if(ASPx.IsExists(element.style.cssFloat)) element.style.cssFloat = value; else if(ASPx.IsExists(element.style.styleFloat)) element.style.styleFloat = value; else Attr.SetAttribute(element.style, "float", value); }; ASPx.GetElementFloat = function(element) { var currentStyle = ASPx.GetCurrentStyle(element); if(ASPx.IsExists(currentStyle.cssFloat)) return currentStyle.cssFloat; if(ASPx.IsExists(currentStyle.styleFloat)) return currentStyle.styleFloat; return Attr.GetAttribute(currentStyle, "float"); }; function getElementDirection(element) { return ASPx.GetCurrentStyle(element).direction; } ASPx.IsElementRightToLeft = function(element) { return getElementDirection(element) == "rtl"; }; ASPx.AdjustVerticalMarginsInContainer = function(container) { var containerBorderAndPaddings = ASPx.GetTopBottomBordersAndPaddingsSummaryValue(container); var flowElements = [], floatElements = [], floatTextElements = []; var maxHeight = 0, maxFlowHeight = 0; for(var i = 0; i < container.childNodes.length; i++) { var element = container.childNodes[i]; if(!element.offsetHeight) continue; ASPx.ClearVerticalMargins(element); } for(var i = 0; i < container.childNodes.length; i++) { var element = container.childNodes[i]; if(!element.offsetHeight) continue; var float = ASPx.GetElementFloat(element); var isFloat = (float === "left" || float === "right"); if(isFloat) floatElements.push(element); else { flowElements.push(element); if(element.tagName !== "IMG"){ if(!ASPx.IsTextWrapped(element)) element.style.verticalAlign = 'baseline'; floatTextElements.push(element); } if(element.tagName === "DIV") Attr.ChangeStyleAttribute(element, "float", "left"); } if(element.offsetHeight > maxHeight) maxHeight = element.offsetHeight; if(!isFloat && element.offsetHeight > maxFlowHeight) maxFlowHeight = element.offsetHeight; } for(var i = 0; i < flowElements.length; i++) Attr.RestoreStyleAttribute(flowElements[i], "float"); var containerBorderAndPaddings = ASPx.GetTopBottomBordersAndPaddingsSummaryValue(container); var containerHeight = container.offsetHeight - containerBorderAndPaddings; if(maxHeight == containerHeight) { var verticalAlign = ASPx.GetCurrentStyle(container).verticalAlign; for(var i = 0; i < floatTextElements.length; i++) floatTextElements[i].style.verticalAlign = ''; containerHeight = container.offsetHeight - containerBorderAndPaddings; for(var i = 0; i < floatElements.length; i++) adjustVerticalMarginsCore(floatElements[i], containerHeight, verticalAlign, true); for(var i = 0; i < flowElements.length; i++) { if(maxFlowHeight != maxHeight) adjustVerticalMarginsCore(flowElements[i], containerHeight, verticalAlign); } } }; ASPx.AdjustVerticalMargins = function(element) { ASPx.ClearVerticalMargins(element); var parentElement = element.parentNode; var parentHeight = parentElement.getBoundingClientRect().height - ASPx.GetTopBottomBordersAndPaddingsSummaryValue(parentElement); adjustVerticalMarginsCore(element, parentHeight, ASPx.GetCurrentStyle(parentElement).verticalAlign); }; function adjustVerticalMarginsCore(element, parentHeight, verticalAlign, toBottom) { var marginTop; if(verticalAlign == "top") marginTop = 0; else if(verticalAlign == "bottom") marginTop = parentHeight - element.getBoundingClientRect().height; else marginTop = (parentHeight - element.getBoundingClientRect().height) / 2; if(marginTop !== 0){ element.style.marginTop = marginTop + "px"; } } ASPx.ClearVerticalMargins = function(element) { element.style.marginTop = ""; element.style.marginBottom = ""; }; ASPx.AdjustHeightInContainer = function(container) { var height = container.offsetHeight - ASPx.GetTopBottomBordersAndPaddingsSummaryValue(container); for(var i = 0; i < container.childNodes.length; i++) { var element = container.childNodes[i]; if(!element.offsetHeight) continue; ASPx.ClearHeight(element); } var elements = []; var childrenHeight = 0; for(var i = 0; i < container.childNodes.length; i++) { var element = container.childNodes[i]; if(!element.offsetHeight) continue; childrenHeight += element.offsetHeight + ASPx.GetTopBottomMargins(element); elements.push(element); } if(elements.length > 0 && childrenHeight < height) { var correctedHeight = 0; for(var i = 0; i < elements.length; i++) { var elementHeight = 0; if(i < elements.length - 1){ var elementHeight = Math.floor(height / elements.length); correctedHeight += elementHeight; } else{ var elementHeight = height - correctedHeight; if(elementHeight < 0) elementHeight = 0; } adjustHeightCore(elements[i], elementHeight); } } }; ASPx.AdjustHeight = function(element) { ASPx.ClearHeight(element); var parentElement = element.parentNode; var height = parentElement.getBoundingClientRect().height - ASPx.GetTopBottomBordersAndPaddingsSummaryValue(parentElement); adjustHeightCore(element, height); }; function adjustHeightCore(element, height) { var height = height - ASPx.GetTopBottomBordersAndPaddingsSummaryValue(element); if(height < 0) height = 0; element.style.height = height + "px"; } ASPx.ClearHeight = function(element) { element.style.height = ""; }; ASPx.ShrinkWrappedTextInContainer = function(container) { if(!container) return; for(var i = 0; i < container.childNodes.length; i++){ var child = container.childNodes[i]; if(child.style && ASPx.IsTextWrapped(child)) { Attr.ChangeStyleAttribute(child, "width", "1px"); child.shrinkedTextContainer = true; } } }; ASPx.AdjustWrappedTextInContainer = function(container) { if(!container) return; var textContainer, leftWidth = 0, rightWidth = 0; for(var i = 0; i < container.childNodes.length; i++){ var child = container.childNodes[i]; if(child.tagName === "BR") return; if(!child.tagName) continue; if(child.tagName !== "IMG"){ textContainer = child; if(ASPx.IsTextWrapped(textContainer)){ if(!textContainer.shrinkedTextContainer) textContainer.style.width = ""; textContainer.style.marginRight = ""; } } else { if(child.offsetWidth === 0) Evt.AttachEventToElement(child, "load", function(evt) { ASPx.AdjustWrappedTextInContainer(container); }); else { var width = child.offsetWidth + ASPx.GetLeftRightMargins(child); if(textContainer) rightWidth += width; else leftWidth += width; } } } if(textContainer && ASPx.IsTextWrapped(textContainer)) { var containerWidth = container.offsetWidth - ASPx.GetLeftRightBordersAndPaddingsSummaryValue(container); if(textContainer.shrinkedTextContainer) { Attr.RestoreStyleAttribute(textContainer, "width"); Attr.ChangeStyleAttribute(container, "width", containerWidth + "px"); } if(textContainer.offsetWidth + leftWidth + rightWidth >= containerWidth) { if(rightWidth > 0 && !textContainer.shrinkedTextContainer) textContainer.style.width = (containerWidth - rightWidth) + "px"; else if(leftWidth > 0){ if(ASPx.IsElementRightToLeft(container)) textContainer.style.marginLeft = leftWidth + "px"; else textContainer.style.marginRight = leftWidth + "px"; } } } }; ASPx.IsTextWrapped = function(element) { return element && ASPx.GetCurrentStyle(element).whiteSpace !== "nowrap"; }; ASPx.IsValidPosition = function(pos){ return pos != ASPx.InvalidPosition && pos != -ASPx.InvalidPosition; }; ASPx.getSpriteMainElement = function(element) { var cssClassMarker = "dx-acc"; if(ASPx.ElementContainsCssClass(element, cssClassMarker)) return element; if(element.parentNode && ASPx.ElementContainsCssClass(element.parentNode, cssClassMarker)) return element.parentNode; return element; }; ASPx.GetAbsoluteX = function(curEl){ return ASPx.GetAbsolutePositionX(curEl); }; ASPx.GetAbsoluteY = function(curEl){ return ASPx.GetAbsolutePositionY(curEl); }; ASPx.SetAbsoluteX = function(element, x){ element.style.left = ASPx.PrepareClientPosForElement(x, element, true) + "px"; }; ASPx.SetAbsoluteY = function(element, y){ element.style.top = ASPx.PrepareClientPosForElement(y, element, false) + "px"; }; ASPx.GetAbsolutePositionX = function(element){ if(Browser.IE) return getAbsolutePositionX_IE(element); else if(Browser.Firefox && Browser.Version >= 3) return getAbsolutePositionX_FF3(element); else if(Browser.Opera) return getAbsolutePositionX_Opera(element); else if(Browser.NetscapeFamily && (!Browser.Firefox || Browser.Version < 3)) return getAbsolutePositionX_NS(element); else if(Browser.WebKitFamily || Browser.Edge) return getAbsolutePositionX_FF3(element); else return getAbsolutePositionX_Other(element); }; function getAbsolutePositionX_Opera(curEl){ var isFirstCycle = true; var pos = getAbsoluteScrollOffset_OperaFF(curEl, true); while(curEl != null) { pos += curEl.offsetLeft; if(!isFirstCycle) pos -= curEl.scrollLeft; curEl = curEl.offsetParent; isFirstCycle = false; } pos += document.body.scrollLeft; return pos; } function getAbsolutePositionX_IE(element){ if(element == null || Browser.IE && element.parentNode == null) return 0; return element.getBoundingClientRect().left + ASPx.GetDocumentScrollLeft(); } function getAbsolutePositionX_FF3(element){ if(element == null) return 0; var x = element.getBoundingClientRect().left + ASPx.GetDocumentScrollLeft(); return x; } function getAbsolutePositionX_NS(curEl){ var pos = getAbsoluteScrollOffset_OperaFF(curEl, true); var isFirstCycle = true; while(curEl != null) { pos += curEl.offsetLeft; if(!isFirstCycle && curEl.offsetParent != null) pos -= curEl.scrollLeft; if(!isFirstCycle && Browser.Firefox){ var style = ASPx.GetCurrentStyle(curEl); if(curEl.tagName == "DIV" && style.overflow != "visible") pos += ASPx.PxToInt(style.borderLeftWidth); } isFirstCycle = false; curEl = curEl.offsetParent; } return pos; } function getAbsolutePositionX_Other(curEl){ var pos = 0; var isFirstCycle = true; while(curEl != null) { pos += curEl.offsetLeft; if(!isFirstCycle && curEl.offsetParent != null) pos -= curEl.scrollLeft; isFirstCycle = false; curEl = curEl.offsetParent; } return pos; } ASPx.GetAbsolutePositionY = function(element){ if(Browser.IE) return getAbsolutePositionY_IE(element); else if(Browser.Firefox && Browser.Version >= 3) return getAbsolutePositionY_FF3(element); else if(Browser.Opera) return getAbsolutePositionY_Opera(element); else if(Browser.NetscapeFamily && (!Browser.Firefox || Browser.Version < 3)) return getAbsolutePositionY_NS(element); else if(Browser.WebKitFamily || Browser.Edge) return getAbsolutePositionY_FF3(element); else return getAbsolutePositionY_Other(element); }; function getAbsolutePositionY_Opera(curEl){ var isFirstCycle = true; if(curEl && curEl.tagName == "TR" && curEl.cells.length > 0) curEl = curEl.cells[0]; var pos = getAbsoluteScrollOffset_OperaFF(curEl, false); while(curEl != null) { pos += curEl.offsetTop; if(!isFirstCycle) pos -= curEl.scrollTop; curEl = curEl.offsetParent; isFirstCycle = false; } pos += document.body.scrollTop; return pos; } function getAbsolutePositionY_IE(element){ if(element == null || Browser.IE && element.parentNode == null) return 0; return element.getBoundingClientRect().top + ASPx.GetDocumentScrollTop(); } function getAbsolutePositionY_FF3(element){ if(element == null) return 0; var y = element.getBoundingClientRect().top + ASPx.GetDocumentScrollTop(); return y; } function getAbsolutePositionY_NS(curEl){ var pos = getAbsoluteScrollOffset_OperaFF(curEl, false); var isFirstCycle = true; while(curEl != null) { pos += curEl.offsetTop; if(!isFirstCycle && curEl.offsetParent != null) pos -= curEl.scrollTop; if(!isFirstCycle && Browser.Firefox){ var style = ASPx.GetCurrentStyle(curEl); if(curEl.tagName == "DIV" && style.overflow != "visible") pos += ASPx.PxToInt(style.borderTopWidth); } isFirstCycle = false; curEl = curEl.offsetParent; } return pos; } function getAbsoluteScrollOffset_OperaFF(curEl, isX) { var pos = 0; var isFirstCycle = true; while(curEl != null) { if(curEl.tagName == "BODY") break; var style = ASPx.GetCurrentStyle(curEl); if(style.position == "absolute") break; if(!isFirstCycle && curEl.tagName == "DIV" && (style.position == "" || style.position == "static")) pos -= isX ? curEl.scrollLeft : curEl.scrollTop; curEl = curEl.parentNode; isFirstCycle = false; } return pos; } function getAbsolutePositionY_Other(curEl){ var pos = 0; var isFirstCycle = true; while(curEl != null) { pos += curEl.offsetTop; if(!isFirstCycle && curEl.offsetParent != null) pos -= curEl.scrollTop; isFirstCycle = false; curEl = curEl.offsetParent; } return pos; } function createElementMock(element) { var div = document.createElement('DIV'); div.style.top = "0px"; div.style.left = "0px"; div.visibility = "hidden"; div.style.position = ASPx.GetCurrentStyle(element).position; return div; } ASPx.PrepareClientPosElementForOtherParent = function(pos, element, otherParent, isX) { if(element.parentNode == otherParent) return ASPx.PrepareClientPosForElement(pos, element, isX); var elementMock = createElementMock(element); otherParent.appendChild(elementMock); var preparedPos = ASPx.PrepareClientPosForElement(pos, elementMock, isX); otherParent.removeChild(elementMock); return preparedPos; }; ASPx.PrepareClientPosForElement = function(pos, element, isX) { pos -= ASPx.GetPositionElementOffset(element, isX); return pos; }; function getExperimentalPositionOffset(element, isX) { var div = createElementMock(element); if(div.style.position == "static") div.style.position = "absolute"; element.parentNode.appendChild(div); var realPos = isX ? ASPx.GetAbsoluteX(div) : ASPx.GetAbsoluteY(div); element.parentNode.removeChild(div); return realPos; } ASPx.GetPositionElementOffset = function(element, isX) { return getExperimentalPositionOffset(element, isX); }; ASPx.GetSizeOfText = function(text, textCss) { var testContainer = document.createElement("tester"); var defaultLineHeight = ASPx.Browser.Firefox ? "1" : ""; testContainer.style.fontSize = textCss.fontSize; testContainer.style.fontFamily = textCss.fontFamily; testContainer.style.fontWeight = textCss.fontWeight; testContainer.style.letterSpacing = textCss.letterSpacing; testContainer.style.lineHeight = textCss.lineHeight || defaultLineHeight; testContainer.style.position = "absolute"; testContainer.style.top = ASPx.InvalidPosition + "px"; testContainer.style.left = ASPx.InvalidPosition + "px"; testContainer.style.width = "auto"; testContainer.style.whiteSpace = "nowrap"; testContainer.appendChild(document.createTextNode(text)); var testElement = document.body.appendChild(testContainer); var size = { "width": testElement.offsetWidth, "height": testElement.offsetHeight }; document.body.removeChild(testElement); return size; }; ASPx.PointToPixel = function(points, addPx) { var result = 0; try { var indexOfPt = points.toLowerCase().indexOf("pt"); if(indexOfPt > -1) result = parseInt(points.substr(0, indexOfPt)) * 96 / 72; else result = parseInt(points) * 96 / 72; if(addPx) result = result + "px"; } catch(e) {} return result; }; ASPx.PixelToPoint = function(pixels, addPt) { var result = 0; try { var indexOfPx = pixels.toLowerCase().indexOf("px"); if(indexOfPx > -1) result = parseInt(pixels.substr(0, indexOfPx)) * 72 / 96; else result = parseInt(pixels) * 72 / 96; if(addPt) result = result + "pt"; } catch(e) {} return result; }; ASPx.PxToInt = function(px) { return pxToNumber(px, parseInt); }; ASPx.PxToFloat = function(px) { return pxToNumber(px, parseFloat); }; function pxToNumber(px, parseFunction) { var result = 0; if(px != null && px != "") { try { var indexOfPx = px.indexOf("px"); if(indexOfPx > -1) result = parseFunction(px.substr(0, indexOfPx)); } catch(e) { } } return result; } ASPx.PercentageToFloat = function(perc) { var result = 0; if(perc != null && perc != "") { try { var indexOfPerc = perc.indexOf("%"); if(indexOfPerc > -1) result = parseFloat(perc.substr(0, indexOfPerc)) / 100; } catch(e) { } } return result; }; ASPx.CreateGuid = function() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random()*16|0,v=c=='x'?r:r&0x3|0x8; return v.toString(16); }); }; ASPx.GetLeftRightBordersAndPaddingsSummaryValue = function(element, currentStyle) { return ASPx.GetLeftRightPaddings(element, currentStyle) + ASPx.GetHorizontalBordersWidth(element, currentStyle); }; ASPx.GetTopBottomBordersAndPaddingsSummaryValue = function(element, currentStyle) { return ASPx.GetTopBottomPaddings(element, currentStyle) + ASPx.GetVerticalBordersWidth(element, currentStyle); }; ASPx.GetVerticalBordersWidth = function(element, style) { if(!ASPx.IsExists(style)) style = (Browser.IE && Browser.MajorVersion != 9 && window.getComputedStyle) ? window.getComputedStyle(element) : ASPx.GetCurrentStyle(element); var res = 0; if(style.borderTopStyle != "none") { res += ASPx.PxToFloat(style.borderTopWidth); if(Browser.IE && Browser.MajorVersion < 9) res += getIe8BorderWidthFromText(style.borderTopWidth); } if(style.borderBottomStyle != "none") { res += ASPx.PxToFloat(style.borderBottomWidth); if(Browser.IE && Browser.MajorVersion < 9) res += getIe8BorderWidthFromText(style.borderBottomWidth); } return res; }; ASPx.GetHorizontalBordersWidth = function(element, style) { if(!ASPx.IsExists(style)) style = (Browser.IE && window.getComputedStyle) ? window.getComputedStyle(element) : ASPx.GetCurrentStyle(element); var res = 0; if(style.borderLeftStyle != "none") { res += ASPx.PxToFloat(style.borderLeftWidth); if(Browser.IE && Browser.MajorVersion < 9) res += getIe8BorderWidthFromText(style.borderLeftWidth); } if(style.borderRightStyle != "none") { res += ASPx.PxToFloat(style.borderRightWidth); if(Browser.IE && Browser.MajorVersion < 9) res += getIe8BorderWidthFromText(style.borderRightWidth); } return res; }; function getIe8BorderWidthFromText(textWidth) { var availableWidth = { "thin": 1, "medium" : 3, "thick": 5 }; var width = availableWidth[textWidth]; return width ? width : 0; } ASPx.GetTopBottomPaddings = function(element, style) { var currentStyle = style ? style : ASPx.GetCurrentStyle(element); return ASPx.PxToInt(currentStyle.paddingTop) + ASPx.PxToInt(currentStyle.paddingBottom); }; ASPx.GetLeftRightPaddings = function(element, style) { var currentStyle = style ? style : ASPx.GetCurrentStyle(element); return ASPx.PxToInt(currentStyle.paddingLeft) + ASPx.PxToInt(currentStyle.paddingRight); }; ASPx.GetTopBottomMargins = function(element, style) { var currentStyle = style ? style : ASPx.GetCurrentStyle(element); return ASPx.PxToInt(currentStyle.marginTop) + ASPx.PxToInt(currentStyle.marginBottom); }; ASPx.GetLeftRightMargins = function(element, style) { var currentStyle = style ? style : ASPx.GetCurrentStyle(element); return ASPx.PxToInt(currentStyle.marginLeft) + ASPx.PxToInt(currentStyle.marginRight); }; ASPx.GetClearClientWidth = function(element) { return element.offsetWidth - ASPx.GetLeftRightBordersAndPaddingsSummaryValue(element); }; ASPx.GetClearClientHeight = function(element) { return element.offsetHeight - ASPx.GetTopBottomBordersAndPaddingsSummaryValue(element); }; ASPx.SetOffsetWidth = function(element, widthValue, currentStyle) { if(!ASPx.IsExists(currentStyle)) currentStyle = ASPx.GetCurrentStyle(element); var value = widthValue - ASPx.PxToInt(currentStyle.marginLeft) - ASPx.PxToInt(currentStyle.marginRight); value -= ASPx.GetLeftRightBordersAndPaddingsSummaryValue(element, currentStyle); if(value > -1) element.style.width = value + "px"; }; ASPx.SetOffsetHeight = function(element, heightValue, currentStyle) { if(!ASPx.IsExists(currentStyle)) currentStyle = ASPx.GetCurrentStyle(element); var value = heightValue - ASPx.PxToInt(currentStyle.marginTop) - ASPx.PxToInt(currentStyle.marginBottom); value -= ASPx.GetTopBottomBordersAndPaddingsSummaryValue(element, currentStyle); if(value > -1) element.style.height = value + "px"; }; ASPx.FindOffsetParent = function(element) { var currentElement = element.parentNode; while(ASPx.IsExistsElement(currentElement) && currentElement.tagName != "BODY") { if(currentElement.offsetWidth > 0 && currentElement.offsetHeight > 0) return currentElement; currentElement = currentElement.parentNode; } return document.body; }; ASPx.GetDocumentScrollTop = function(){ var isScrollBodyIE = Browser.IE && ASPx.GetCurrentStyle(document.body).overflow == "hidden" && document.body.scrollTop > 0; if(Browser.WebKitFamily || Browser.Edge || isScrollBodyIE) { if(Browser.MacOSMobilePlatform) return window.pageYOffset; if(Browser.WebKitFamily) return document.documentElement.scrollTop || document.body.scrollTop; return document.body.scrollTop; } else return document.documentElement.scrollTop; }; ASPx.SetDocumentScrollTop = function(scrollTop) { if(Browser.WebKitFamily && Browser.Version < 60 || Browser.Edge) document.body.scrollTop = scrollTop; else document.documentElement.scrollTop = scrollTop; }; ASPx.GetDocumentScrollLeft = function(){ var isScrollBodyIE = Browser.IE && ASPx.GetCurrentStyle(document.body).overflow == "hidden" && document.body.scrollLeft > 0; if(Browser.Edge || isScrollBodyIE) return document.body ? document.body.scrollLeft : document.documentElement.scrollLeft; if(Browser.WebKitFamily) return document.documentElement.scrollLeft || document.body.scrollLeft; return document.documentElement.scrollLeft; }; ASPx.SetDocumentScrollLeft = function (scrollLeft) { if(Browser.WebKitFamily && Browser.Version < 60 || Browser.Edge) document.body.scrollLeft = scrollLeft; else document.documentElement.scrollLeft = scrollLeft; }; ASPx.GetDocumentClientWidth = function(){ if(document.documentElement.clientWidth == 0) return document.body.clientWidth; else return document.documentElement.clientWidth; }; ASPx.GetDocumentClientHeight = function() { if(Browser.Firefox && window.innerHeight - document.documentElement.clientHeight > ASPx.GetVerticalScrollBarWidth()) { return window.innerHeight; } else if(Browser.Opera && Browser.Version < 9.6 || document.documentElement.clientHeight == 0) { return document.body.clientHeight; } return document.documentElement.clientHeight; }; ASPx.GetDocumentWidth = function(){ var bodyWidth = document.body.offsetWidth; var docWidth = Browser.IE ? document.documentElement.clientWidth : document.documentElement.offsetWidth; var bodyScrollWidth = document.body.scrollWidth; var docScrollWidth = document.documentElement.scrollWidth; return getMaxDimensionOf(bodyWidth, docWidth, bodyScrollWidth, docScrollWidth); }; ASPx.GetDocumentHeight = function(){ var bodyHeight = document.body.offsetHeight; var docHeight = Browser.IE ? document.documentElement.clientHeight : document.documentElement.offsetHeight; var bodyScrollHeight = document.body.scrollHeight; var docScrollHeight = document.documentElement.scrollHeight; var maxHeight = getMaxDimensionOf(bodyHeight, docHeight, bodyScrollHeight, docScrollHeight); if(Browser.Opera && Browser.Version >= 9.6){ if(Browser.Version < 10) maxHeight = getMaxDimensionOf(bodyHeight, docHeight, bodyScrollHeight); var visibleHeightOfDocument = document.documentElement.clientHeight; if(maxHeight > visibleHeightOfDocument) maxHeight = getMaxDimensionOf(window.outerHeight, maxHeight); else maxHeight = document.documentElement.clientHeight; return maxHeight; } return maxHeight; }; ASPx.GetDocumentMaxClientWidth = function(){ var bodyWidth = document.body.offsetWidth; var docWidth = document.documentElement.offsetWidth; var docClientWidth = document.documentElement.clientWidth; return getMaxDimensionOf(bodyWidth, docWidth, docClientWidth); }; ASPx.GetDocumentMaxClientHeight = function(){ var bodyHeight = document.body.offsetHeight; var docHeight = document.documentElement.offsetHeight; var docClientHeight = document.documentElement.clientHeight; return getMaxDimensionOf(bodyHeight, docHeight, docClientHeight); }; ASPx.verticalScrollIsNotHidden = null; ASPx.horizontalScrollIsNotHidden = null; ASPx.GetVerticalScrollIsNotHidden = function() { if(!ASPx.IsExists(ASPx.verticalScrollIsNotHidden)) ASPx.verticalScrollIsNotHidden = ASPx.GetCurrentStyle(document.body).overflowY !== "hidden" && ASPx.GetCurrentStyle(document.documentElement).overflowY !== "hidden"; return ASPx.verticalScrollIsNotHidden; }; ASPx.GetHorizontalScrollIsNotHidden = function() { if(!ASPx.IsExists(ASPx.horizontalScrollIsNotHidden)) ASPx.horizontalScrollIsNotHidden = ASPx.GetCurrentStyle(document.body).overflowX !== "hidden" && ASPx.GetCurrentStyle(document.documentElement).overflowX !== "hidden"; return ASPx.horizontalScrollIsNotHidden; }; ASPx.GetCurrentDocumentWidth = function() { var result = ASPx.GetDocumentClientWidth(); if(!ASPx.Browser.Safari && ASPx.GetVerticalScrollIsNotHidden() && ASPx.GetDocumentHeight() > ASPx.GetDocumentClientHeight()) result += ASPx.GetVerticalScrollBarWidth(); return result; }; ASPx.GetCurrentDocumentHeight = function() { var result = ASPx.GetDocumentClientHeight(); if(!ASPx.Browser.Safari && ASPx.GetHorizontalScrollIsNotHidden() && ASPx.GetDocumentWidth() > ASPx.GetDocumentClientWidth()) result += ASPx.GetVerticalScrollBarWidth(); return result; }; function getMaxDimensionOf(){ var max = ASPx.InvalidDimension; for(var i = 0; i < arguments.length; i++){ if(max < arguments[i]) max = arguments[i]; } return max; } ASPx.GetClientLeft = function(element){ return ASPx.IsExists(element.clientLeft) ? element.clientLeft : (element.offsetWidth - element.clientWidth) / 2; }; ASPx.GetClientTop = function(element){ return ASPx.IsExists(element.clientTop) ? element.clientTop : (element.offsetHeight - element.clientHeight) / 2; }; var requestAnimationFrameFunc = window.requestAnimationFrame || function(callback) { callback(); }; var cancelAnimationFrameFunc = window.cancelAnimationFrame || function(id) { }; ASPx.CancelAnimationFrame = function(id) { cancelAnimationFrameFunc(id); }; ASPx.RequestAnimationFrame = function (callback) { return requestAnimationFrameFunc(callback); }; if(window.requestAnimationFrame) { var animationFrameUpdatesBuffer = []; var applyAnimationFrameUpdates = function() { if(animationFrameUpdatesBuffer.length > 0) { var animationFrameUpdatesBatch = animationFrameUpdatesBuffer; animationFrameUpdatesBuffer = []; for(var i = 0; i < animationFrameUpdatesBatch.length; i++) animationFrameUpdatesBatch[i](); } requestAnimationFrame(applyAnimationFrameUpdates); }; requestAnimationFrame(applyAnimationFrameUpdates); ASPx.ExecuteWithinAnimationFrame = function(callback) { animationFrameUpdatesBuffer.push(callback); }; } else ASPx.ExecuteWithinAnimationFrame = function(callback) { callback(); }; ASPx.RequestSetStyles = function (element, styles, token) { var stylesArr = []; for (var property in styles) { if (styles.hasOwnProperty(property)) stylesArr.push({ attr: property, value: styles[property] }); } var callback = null; if (stylesArr.length === 1) { var singleStyle = stylesArr[0]; callback = function () { element.style[singleStyle.attr] = singleStyle.value; }; } else { var cssText = ""; if (element.style.cssText) { var oldStylesArr = element.style.cssText.split(';').map(function (nvp) { return nvp.trim().split(':'); }); for (var i = 0; i < oldStylesArr.length; i++) { var oldStyleArr = oldStylesArr[i]; if (oldStyleArr.length === 2 && styles[oldStyleArr[0]] === undefined) cssText += oldStyleArr[0] + ":" + oldStyleArr[1].trim() + ";"; } } for (var i = 0; i < stylesArr.length; i++) { var style = stylesArr[i]; if(style.value !== "") cssText += style.attr + ":" + style.value + ";"; } callback = function () { element.style.cssText = cssText; }; } if (!token) return ASPx.RequestAnimationFrame(callback); else if (token.savedCallback) callback = (function (o, n) { return function () { o(); n(); }; })(token.savedCallback, callback); token.savedCallback = callback; token.applyChanges = function () { return ASPx.RequestAnimationFrame(callback); }; }; ASPx.SetStyles = function(element, styles, makeImportant) { if(ASPx.IsExists(styles.cssText)) element.style.cssText = styles.cssText; if(ASPx.IsExists(styles.className)) element.className = styles.className; for(var property in styles) { if(!styles.hasOwnProperty(property)) continue; var value = styles[property]; switch (property) { case "cssText": case "className": break; case "float": ASPx.SetElementFloat(element, value); break; case "opacity": ASPx.SetElementOpacity(element, value); break; case "zIndex": ASPx.SetStylesCore(element, property, value, makeImportant); break; case "fontWeight": if(ASPx.Browser.IE && ASPx.Browser.Version < 9 && typeof(styles[property]) == "number") value = styles[property].toString(); default: ASPx.SetStylesCore(element, property, value + (typeof (value) == "number" ? "px" : ""), makeImportant); } } }; ASPx.SetStylesCore = function(element, property, value, makeImportant) { if(makeImportant) { var index = property.search("[A-Z]"); if(index != -1) property = property.replace(property.charAt(index), "-" + property.charAt(index).toLowerCase()); if(element.style.setProperty) element.style.setProperty(property, value, "important"); else element.style.cssText += ";" + property + ":" + value + "!important"; } else element.style[property] = value; }; ASPx.RemoveBordersAndShadows = function(el) { if(!el || !el.style) return; el.style.borderWidth = 0; if(ASPx.IsExists(el.style.boxShadow)) el.style.boxShadow = "none"; else if(ASPx.IsExists(el.style.MozBoxShadow)) el.style.MozBoxShadow = "none"; else if(ASPx.IsExists(el.style.webkitBoxShadow)) el.style.webkitBoxShadow = "none"; }; ASPx.GetCellSpacing = function(element) { var val = parseInt(element.cellSpacing); if(!isNaN(val)) return val; val = parseInt(ASPx.GetCurrentStyle(element).borderSpacing); if(!isNaN(val)) return val; return 0; }; ASPx.GetInnerScrollPositions = function(element) { var scrolls = []; getInnerScrollPositionsCore(element, scrolls); return scrolls; }; function getInnerScrollPositionsCore(element, scrolls) { for(var child = element.firstChild; child; child = child.nextSibling) { var scrollTop = child.scrollTop, scrollLeft = child.scrollLeft; if(scrollTop > 0 || scrollLeft > 0) scrolls.push([child, scrollTop, scrollLeft]); getInnerScrollPositionsCore(child, scrolls); } } ASPx.RestoreInnerScrollPositions = function(scrolls) { for(var i = 0, scrollArr; scrollArr = scrolls[i]; i++) { if(scrollArr[1] > 0) scrollArr[0].scrollTop = scrollArr[1]; if(scrollArr[2] > 0) scrollArr[0].scrollLeft = scrollArr[2]; } }; ASPx.GetOuterScrollPosition = function(element) { while(element && element.tagName !== "BODY") { var scrollTop = element.scrollTop, scrollLeft = element.scrollLeft; if(scrollTop > 0 || scrollLeft > 0) { return { scrollTop: scrollTop, scrollLeft: scrollLeft, element: element }; } element = element.parentNode; } return { scrollTop: ASPx.GetDocumentScrollTop(), scrollLeft: ASPx.GetDocumentScrollLeft() }; }; ASPx.RestoreOuterScrollPosition = function(scrollInfo) { if(scrollInfo.element) { if(scrollInfo.scrollTop > 0) scrollInfo.element.scrollTop = scrollInfo.scrollTop; if(scrollInfo.scrollLeft > 0) scrollInfo.element.scrollLeft = scrollInfo.scrollLeft; } else { if(scrollInfo.scrollTop > 0) ASPx.SetDocumentScrollTop(scrollInfo.scrollTop); if(scrollInfo.scrollLeft > 0) ASPx.SetDocumentScrollLeft(scrollInfo.scrollLeft); } }; ASPx.ChangeElementContainer = function(element, container, savePreviousContainer) { if(element.parentNode != container) { var parentNode = element.parentNode; parentNode.removeChild(element); container.appendChild(element); if(savePreviousContainer) element.previousContainer = parentNode; } }; ASPx.RestoreElementContainer = function(element) { if(element.previousContainer) { ASPx.ChangeElementContainer(element, element.previousContainer, false); element.previousContainer = null; } }; ASPx.MoveChildrenToElement = function(sourceElement, destinationElement){ while(sourceElement.childNodes.length > 0) destinationElement.appendChild(sourceElement.childNodes[0]); }; ASPx.GetScriptCode = function(script) { var useFirstChildElement = Browser.Chrome && Browser.Version < 11 || Browser.Safari && Browser.Version < 5; var text = useFirstChildElement ? script.firstChild.data : script.text; var comment = "