{"version":3,"sources":["kendo.custom.js"],"names":["f","define","$","window","undefined","Class","compilePart","part","stringPart","split","join","replace","first","charAt","rest","substring","pad","number","digits","end","length","zeros","getShadows","element","shadow","css","kendo","support","transitions","radius","match","boxShadowRegExp","blur","math","max","left","right","bottom","wrap","autosize","percentage","width","height","percentWidth","percentHeight","forceWidth","browser","outerWidth","_outerWidth","outerHeight","_outerHeight","parent","windowOuterWidth","removeClass","hasClass","wrapResize","style","percentRegExp","test","is","addClass","boxSizing","mozBoxSizing","webkitBoxSizing","msie","floor","version","zoom","children","wrapper","wrapperStyle","display","position","deepExtend","destination","i","arguments","deepExtendOne","source","property","propValue","propType","propInit","destProp","ObservableArray","data","LazyObservableArray","DataSource","HierarchicalDataSource","OBJECT","constructor","Array","RegExp","isFunction","ArrayBuffer","UNDEFINED","Date","getTime","clone","testRx","agent","rxs","dflt","rx","hasOwnProperty","toHyphens","str","g","toLowerCase","toCamelCase","strMatch","g1","toUpperCase","getComputedStyles","properties","computedStyle","styles","document","defaultView","getComputedStyle","each","idx","value","getPropertyValue","currentStyle","size","isScrollable","className","indexOf","overflow","scrollLeft","isRtl","webkit","mozila","mozilla","el","scrollWidth","clientWidth","Math","abs","obj","key","result","getOffset","type","positioned","offset","sign","top","pointers","msPointers","pageYOffset","documentElement","scrollTop","pageXOffset","parseEffects","input","effects","this","fx","Element","prepareAnimationOptions","options","duration","reverse","complete","STRING","BOOLEAN","extend","init","noop","teardown","hide","completeCallback","animate","instance","queue","promise","toggleClass","classes","add","htmlEncode","ampRegExp","ltRegExp","gtRegExp","quoteRegExp","aposRegExp","unescape","template","decodeURIComponent","error","_","m1","m2","String","fromCharCode","parseInt","parseOption","option","dashRegExp","getAttribute","ns","numberRegExp","parseFloat","jsonRegExp","jsonFormatRegExp","Function","parseOptions","role","templateRegExp","html","containmentComparer","a","b","contains","resizableWidget","widget","inArray","attr","focusable","isTabIndexNotNaN","nodeName","disabled","href","visible","expr","pseudos","parents","addBack","filter","kendoJQuery","selector","context","fn","Template","preventDefault","isDefaultPrevented","Observable","argumentNameRegExp","encodeRegExp","escapedCurlyRegExp","curlyRegExp","escapedSharpRegExp","sharpRegExp","directions","eventTarget","wrapExpression","localUrlRe","Widget","DataBoundWidget","ContainerNullObject","MobileWidget","MOUSE_EVENTS","EXCLUDE_BUST_CLICK_SELECTOR","MouseEventNormalizer","eventMap","getEventMap","eventRegEx","on","rootjQuery","animationFrame","animationQueue","cultures","isArray","proxy","JSON","formatRegExp","FUNCTION","NUMBER","NULL","getterCache","setterCache","slice","noDepricateExtend","src","copyIsArray","copy","name","target","deep","jQuery","isPlainObject","proto","member","base","that","subclass","apply","prototype","Object","_initOptions","_defaultPrevented","_events","bind","eventName","handlers","one","original","handler","events","eventNames","handlersIsFunction","unbind","push","unshift","trigger","e","sender","call","splice","paramName","useWithBlock","render","compile","parts","settings","argumentName","functionBody","_slotCount","Error","format","quote","string","escapable","lastIndex","c","meta","charCodeAt","toString","holder","k","v","partial","mind","gap","toJSON","rep","isFinite","indent","\b","\t","\n","\f","\r","\"","\\","valueOf","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","Number","Boolean","stringify","replacer","space","","findCulture","culture","numberFormat","getCulture","current","formatDate","date","calendar","calendars","standard","days","months","patterns","dateFormatRegExp","minutes","getDate","namesAbbr","getDay","names","getMonth","getFullYear","getHours","getMinutes","getSeconds","getMilliseconds","AM","PM","getTimezoneOffset","formatNumber","decimal","precision","pattern","literals","symbol","isCurrency","isPercent","customPrecision","formatAndPrecision","negative","integer","fraction","integerLength","fractionLength","replacement","ch","hasGroup","hasNegativeFormat","decimalIndex","sharpIndex","zeroIndex","hasZero","hasSharp","percentIndex","currencyIndex","startZeroIndex","start","exp","rounded","POINT","decimals","EMPTY","toLocaleString","standardFormatRegExp","exec","currency","percent","toExponential","round","groupInteger","literalRegExp","quoteChar","literal","PLACEHOLDER","SHARP","ZERO","COMMA","commaRegExp","lastIndexOf","EN","objectToString",",",".","groupSize","abbr","namesShort","d","D","F","G","m","M","s","t","T","u","y","Y","/",":","firstDay","twoDigitYearMax","cultureName","newGroupSize","groupSizes","shift","toFixed","min","fmt","values","index","placeholderFormat","_extractFormat","_activeElement","activeElement","_round","includeMargin","outOfRange","designatorPredicate","designator","mapDesignators","designators","map","adjustDST","hours","setHours","lowerArray","array","lowerLocalInfo","localInfo","newLocalInfo","parseExact","strict","count","pmHour","UTC","matches","amDesignators","pmDesignators","hoursOffset","minutesOffset","hasTime","lookAhead","getNumber","rg","substr","valueIdx","getIndexByName","lower","nameLength","subValue","matchLength","matchIdx","checkLiteral","year","month","day","seconds","milliseconds","defaultYear","_lowerDays","_lowerMonths","longTimeZoneRegExp","shortTimeZoneRegExp","isNaN","setFullYear","parseMicrosoftFormatOffset","getDefaultFormats","cultureFormats","formatIdx","FORMATS_SEQUENCE","STANDARD_FORMATS","formats","concat","internalParseDate","tzoffset","dateRegExp","offsetRegExp","timezone","convert","nonBreakingSpaceRegExp","exponentRegExp","2","3","4","parseDate","parseExactDate","percentSymbol","table","docStyle","transforms","elementProto","mobileOS","documentMode","chrome","mobileChrome","safari","_scrollbar","scrollbar","refresh","div","createElement","cssText","innerHTML","body","appendChild","offsetWidth","removeChild","closest","tbodyInnerHtml","touch","HTMLElement","hasHW3D","WebKitCSSMatrix","cssFlexbox","lowPrefix","prefix","hasTransitions","event","devicePixelRatio","screenWidth","screen","availWidth","innerWidth","screenHeight","availHeight","innerHeight","detectOS","ua","minorVersion","os","notAndroidPhone","agentRxs","wp","fire","android","iphone","ipad","meego","webos","blackberry","playbook","windows","tizen","sailfish","ffos","osRxs","ios","flat","formFactorRxs","tablet","browserRxs","omini","omobile","firefox","mobilesafari","ie","navigator","device","majorVersion","flatVersion","cordova","PhoneGap","appMode","standalone","location","protocol","userAgent","wpDevicePixelRatio","hasNativeScrolling","delayedClick","mouseAndTouchPresent","detectBrowser","edge","opera","detectClipboardAccess","commands","queryCommandSupported","cut","paste","clipboard","zoomLevel","ie11WidthCorrection","docEl","scrollHeight","clientHeight","cssBorderSpacing","borderSpacing","cssClass","docElement","eventCapture","addEventListener","placeholder","propertyChangeEvent","types","setAttribute","cssFloat","stableSort","threshold","sorted","field","sort","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","nodeList","querySelectorAll","parentNode","matchMedia","pushState","history","hashChange","customElements","crios","MSPointerEvent","PointerEvent","kineticScrollNeeded","down","up","in","out","enabled","dequeue","disable","promiseShim","enable","animatedPromise","kendoStop","clearQueue","gotoEnd","stop","kendoAnimate","kendoAddClass","kendoRemoveClass","kendoToggleClass","toggle","touches","originalEvent","changedTouches","elementFromPoint","clientX","clientY","callback","mousedown","mouseup","mousemove","mousecancel","click","resize","members","widgets","_widgetRegisteredCallbacks","ui","mobile","dataviz","drawing","spreadsheet","messages","keys","INSERT","DELETE","BACKSPACE","TAB","ENTER","ESC","LEFT","UP","RIGHT","DOWN","END","HOME","SPACEBAR","PAGEUP","PAGEDOWN","F2","F10","F12","NUMPAD_PLUS","NUMPAD_MINUS","NUMPAD_DOT","isLocalUrl","url","expression","safe","getter","setter","accessor","get","set","guid","random","id","roleSelector","directiveSelector","directives","selectors","triggeredByInput","tagName","onWidgetRegistered","len","logToConsole","message","console","suppressLog","log","dataSource","angular","defaults","_hasBindingTarget","kendoBindingTarget","_tabindex","TABINDEX","tabindex","removeAttr","setOptions","_setEvents","force","getSize","currentSize","_size","_resize","dimensions","setSize","destroy","removeData","_destroy","_muteAngularRebind","_muteRebind","dataItems","flatView","_angularItems","cmd","elements","items","dataItem","domElement","offsetHeight","notify","initWidget","roles","fullPath","widgetKeyRegExp","widgetKey","nodeType","isEmptyObject","rolesFromNamespaces","namespaces","find","widgetsArray","makeArray","widgetInstance","progress","container","leftRight","webkitCorrection","containerScrollLeft","mask","opacity","loading","prependTo","remove","plugin","register","widgetEntry","args","method","nullObject","autoApplyNS","kendoDestroy","view","viewElement","viewHasNativeScrolling","useNativeScrolling","eq","appLevelNativeScrolling","application","themes","views","touchScroller","useNative","Scroller","kendoMobileScroller","suites","editorToolbar","elementData","onResize","setTimeout","unbindResize","off","attrValue","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","kendoFocusable","setupMouseMute","mouseTrap","bustClick","captureMouse","stopPropagation","muteMouse","clearTimeout","mouseTrapTimeoutID","unMuteMouse","move","cancel","MSPointerEnter","MSPointerLeave","orig","fix","special","delegateType","bindType","handle","ret","related","relatedTarget","handleObj","origType","applyEventMap","keyDownHandler","kendoKeydown","preventKendoKeydown","keyDownCallBack","pop","search","touchstart","touchend","ruleToDate","rule","targetDay","ourDay","time","cache","getUTCDay","setUTCDate","findRule","utcTime","rules","zone","grep","from","to","findZone","zones","until","zoneRules","zoneAndRule","info","fromOffset","toOffset","diff","fromLocalOffset","toLocalOffset","tempToOffset","toLocalDate","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","Sun","Mon","Tue","Wed","Thu","Fri","Sat","setDayOfWeek","dir","setDate","dayOfWeek","firstDayOfMonth","lastDayOfMonth","last","timeOffset","moveDateToWeekStart","weekStartDay","addDays","calcWeekInYear","firstWeekInYear","newDate","diffInMS","MS_PER_DAY","weekInYear","prevWeekDate","nextWeekDate","weekNumber","toUtcTime","toInvariantTime","isInTimeRange","msValue","msMin","msMax","isInDateRange","setTime","ignoreDST","difference","MS_PER_MINUTE","today","isToday","staticDate","nextDay","previousDay","MS_PER_HOUR","stripWhitespace","iterator","child","createNodeIterator","NodeFilter","SHOW_TEXT","node","FILTER_ACCEPT","FILTER_REJECT","nextNode","referenceNode","textContent","trim","childNodes","nodeValue","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","queueAnimation","runNextAnimation","parseQueryStringParams","queryString","params","paramParts","elementUnderCursor","x","client","wheelDeltaY","jQueryEvent","delta","deltaY","wheelDelta","detail","axis","VERTICAL_AXIS","throttle","delay","timeout","throttled","lastExecTime","elapsed","caret","rangeElement","rangeDuplicated","selectionStart","selectionEnd","isPosition","focus","setSelectionRange","selection","createTextRange","collapse","moveStart","moveEnd","select","duplicate","moveToBookmark","createRange","getBookmark","setEndPoint","text","compileMobileDirective","scope","injector","invoke","$compile","$$phase","$digest","antiForgeryTokens","tokens","csrf_token","csrf_param","cycleForm","form","firstElement","lastElement","keyCode","shiftKey","focusElement","scrollTopPositions","scrollableParents","parentsUntil","setActive","focusNextElement","focussable","nextElement","matchesMedia","mediaQuery","media","_bootstrapToMedia","bootstrapMedia","xs","sm","md","lg","xl","fileGroupMap","audio","video","image","txt","presentation","programming","pdf","config","zip","disc-image","getFileGroup","extension","withPrefix","extensions","fileTypeMap","groups","getFileSizeMessage","sizes","pow","postToProxy","dataURI","fileName","proxyURL","proxyTarget","action","contentType","base64","appendTo","submit","saveAsBlob","blob","atob","Uint8Array","Blob","buffer","msSaveBlob","saveAsDataURI","URL","createObjectURL","fileSaver","download","createEvent","initMouseEvent","dispatchEvent","revokeObjectURL","downloadAttribute","saveAs","save","forceProxy","proxyModelSetters","observable","forEach","defineProperty","dirty","setDefaults","path","curr","amd","a1","a2","a3","touchDelta","touch1","touch2","x1","y1","x2","y2","dx","dy","center","distance","sqrt","getTouches","currentTarget","api","identifier","pointerId","withEachUpEvent","downEvents","now","OS","invalidZeroEvents","DEFAULT_MIN_HOLD","CLICK_DELAY","DEFAULT_THRESHOLD","PRESS","HOLD","SELECT","START","MOVE","CANCEL","TAP","DOUBLETAP","RELEASE","GESTURESTART","GESTURECHANGE","GESTUREEND","GESTURETAP","THRESHOLD","mouse","pointer","ENABLE_GLOBAL_SURFACE","TouchAxis","_updateLocationData","startLocation","velocity","timeStamp","timeDelta","initialDelta","Touch","userEvents","touchInfo","useClickAsTap","initialTouch","pressEvent","_clicks","supportDoubleTap","_moved","_finished","press","_holdTimeout","minHold","_trigger","_tap","_clickTimeout","_hold","preventMove","_shouldNotMove","_withinIgnoreThreshold","UserEvents","dispose","_start","endTime","activeTouches","skip","isMoved","startTime","xDelta","yDelta","defaultAction","surfaceElement","preventIfMovingProxy","_maxTouches","multiTouch","allowSelection","captureUpIfMoved","fastTap","eventNS","surface","global","ownerDocument","pressed","touchAction","preventDragEvent","root","preventIfMoving","_isMoved","_destroyed","removeEventListener","_disposeAll","capture","_isMultiTouch","_apiCall","_maxTouchesReached","_select","which","_move","_eachTouch","_end","_click","pageX","pageY","methodName","matchingTouch","dict","defaultThreshold","collision","elementPosition","Selectable","ARIASELECTED","SELECTED","ACTIVE","SELECTABLE","CHANGE","NS","UNSELECT","UNSELECTING","INPUTSELECTOR","supportEventDelegation","multiple","_marquee","_lastActive","aria","tap","inputSelectors","_isElement","selected","ctrlKey","metaKey","whichCode","buttonCode","button","_allowSelection","clear","selectRange","_firstSelectee","_unselect","_notify","_downTarget","currentElement","useAllItems","_items","_selectElement","_invalidateSelectables","toSelect","val","selectElement","preventNotify","isPrevented","resetTouchEvents","tmp","continuousItems","selectable","asLowerString","cell","title","modular","minYear","maxYear","build","weekNumberBuild","cells","isWeekColumnVisible","cellsPerRow","perRow","otherMonth","weekNumberTemplate","content","cellTemplate","empty","emptyCellTemplate","otherMonthTemplate","otherMonthCellTemplate","createDate","disableDates","OTHERMONTH","isInRange","compare","date1","date2","modifier","year1","getToday","DATE","restrictValue","shiftArray","multiplier","daysBetweenTwoDates","startDate","endDate","temp","fromDateUTC","endDateUTC","ceil","addDaysToArray","numberOfDays","fromDate","mousetoggle","HOVER","MOUSEENTER","FOCUS","prevent","dateObject","getCalendarInfo","normalize","depth","extractFormat","MONTH","dates","makeUnselectable","isIE8","addClassToViewContainer","currentView","isEqualDatePart","value1","value2","isEqualMonth","getDisabledExpr","createDisabledExpr","convertDatesArray","disabledDates","searchExpression","isEqualDate","oldValue","newValue","toDateObject","link","VALUE","parse","transitionOrigin","CLICK","KEYDOWN_NS","ID","MIN","SLIDE","CENTURY","NAVIGATE","DISABLED","FOCUSED","OTHERMONTHCLASS","OUTOFRANGE","TODAY","CELLSELECTOR","CELLSELECTORVALID","WEEKCOLUMNSELECTOR","BLUR","FOCUS_WITH_NS","MOUSEENTER_WITH_NS","MOUSELEAVE","PREVARROW","NEXTARROW","ARIA_DISABLED","ARIA_SELECTED","ARIA_LABEL","decade","century","Calendar","_templates","_selectable","_header","_viewWrapper","_footer","footer","firstChild","_view","_focusView","focusOnNav","_cellID","_isMultipleSelection","_current","_value","_class","_selectDates","_index","_addClassProxy","_active","_cell","todayString","toDateString","_cellByDate","_removeClassProxy","selectDates","animation","horizontal","divisor","vertical","weekColumnHeader","_destroySelectable","navigate","_today","_title","_table","_bindTable","_option","navigateToPast","_navigate","navigateToFuture","navigateUp","navigateDown","old","currentValue","future","_oldTable","_changeView","_animate","_focus","_visualizeSelectedDatesInView","validSelectedDates","datesUnique","_validateValue","selectedDates","selectableOptions","change","_onSelect","_onRelatedTarget","eventArgs","_toggleSelection","_cellsBySelector","_deselect","_addSelectedCellsToArray","_rangeSelection","currentCell","toDateCell","daysDifference","toDate","item","currentDateIndex","_dateInView","firstDateInView","lastDateInView","_isNavigatable","cellIndex","isDisabled","focusedDate","_keyboardToggleSelection","_nextNavigatable","_keyboardRangeSelection","navigatableDate","active","viewWrapper","append","insertAfter","_horizontal","viewWidth","float","margin-left","unwrap","_vertical","insertBefore","disabledDate","removeAttribute","show","_toggle","links","arrow","firstDayCurrentMonth","has","isBigger","isTodayDisabled","_todayClick","footerTemplate","firstVisibleDay","calendarInfo","tzOffsetBefore","resultDATE","tzOffsetDiff","navigateUrl","showHeader","hasUrl","currentCalendar","firstDayIdx","shortNames","linkClass","dateString","currentDate","month1","month2","year2","setMonth","viewsEnum","tabKeyTrapNS","focusableNodesSelector","TabKeyTrap","OPEN","CLOSE","DEACTIVATE","ACTIVATE","CENTER","TOP","BOTTOM","ABSOLUTE","HIDDEN","BODY","LOCATION","POSITION","VISIBLE","EFFECTS","ACTIVEBORDER","ACTIVEBORDERREGEXP","ACTIVECHILDREN","MOUSEDOWN","DOCUMENT_ELEMENT","WINDOW","SCROLL","cssPrefix","TRANSFORM","Popup","parentPopup","origin","collisions","downEvent","anchor","_hovered","list","scrollArea","prop","open","close","_activated","_animationClose","_mousedownProxy","_mousedown","_resizeProxy","toggleTarget","toggleEvent","viewport","copyAnchorStyles","modal","adjustSize","transition","_hideDirClass","_closing","_toggleResize","fixed","isFixed","flipped","_position","_openAnimation","_showDirClass","_location","direction","dirClass","slideIn","skipEffects","openEffects","closeEffects","popup","ev","_resizeTimeout","_scrollableParents","_fit","viewPortSize","output","_flip","anchorSize","boxSize","siblingContainer","parentZIndex","viewportOffset","viewportWidth","viewportHeight","pos","anchorParent","offsets","flipPos","elementHeight","wrapperHeight","isWindow","origins","positions","zIndex","siblings","_align","offsetParent","appendToOffset","verticalOrigin","horizontalOrigin","verticalPosition","horizontalPosition","anchorOffset","anchorWidth","anchorHeight","trap","_keepInTrap","removeTrap","shouldTrap","sortedElements","next","_focusableElements","_sortFocusableElements","_nextFocusable","tabIndex","attrName","prev","contentWindow","_haveSelectionRange","elementType","approximateStringMatching","oldText","oldFormat","newText","deletedSymbol","oldTextSeparator","knownSymbols","customDateTime","INPUT_EVENT_NAME","STATEDISABLED","STATEDEFAULT","STATEINVALID","READONLY","DateInput","insidePicker","_inputWrapper","_form","_change","readonly","weekday","hour","minute","second","dayperiod","_unbindInput","_bindInput","_updateElementValue","_formElement","_resetHandler","_dateTime","getDateObject","_oldValue","stringAndFromat","toPair","_oldText","_format","_editable","_paste","_keydown","_input","_mouseUp","_scroll","navigationOnly","valid","difSym","newEvent","stateInvalid","blinkInvalid","parsePart","_selectSegment","_blinkInvalidTimeout","_selectNearestSegment","returnValue","formId","initialValue","interval","keycode","modifyPart","j","begin","initDate","initFormat","initCulture","initMessages","generateMatcher","retFormat","returnsFormat","matcher","setExisting","typedMonthPart","typedDayPeriodPart","sampleFormat","placeholders","mins","formatResult","setValue","getValue","newMonth","setMinutes","setSeconds","currentChar","newHours","monthNames","newYear","newMinutes","newSeconds","parseFormats","DatePicker","DIV","SPAN","DEFAULT","HOVEREVENTS","MAX","ARIA_EXPANDED","ARIA_HIDDEN","DateView","_dateViewID","_calendar","_setOptions","popupHovered","selectIsClicked","handled","altKey","_initialOptions","_wrapper","dateView","_updateARIA","_icon","aria-expanded","aria-owns","autocomplete","_reset","_template","_createDateInput","_old","_update","ARIATemplate","dateInput","_dateInput","icon","_dateIcon","_toggleHover","_blur","_focusElement","eventType","dateChanged","valueUpdated","textFormatted","_typing","stopImmediatePropagation","aria-controls","formattedValue","isSameType","optionsValue","defaultValue","_ariaTemplate","toOdataFilter","useOdataFour","operator","ignoreCase","logic","filters","odataFilters","odataFiltersVersionFour","stripMetadata","hex16","createBoundary","createDelimeter","boundary","NEWLINE","createCommand","transport","httpVerb","command","transportUrl","commandPrefix","getOperationHeader","changeset","changeId","header","getOperationContent","DOUBLELINE","getOperations","collection","skipContent","requestBody","processCollection","colection","getBoundary","createBatchRequest","colections","batchURL","batch","headers","Content-Type","updated","destroyed","created","parseBatchResponse","responseText","changeBody","status","code","marker","jsonModel","responseMarkers","markerIndex","collections","models","passed","neq","gt","gte","lt","lte","doesnotcontain","endswith","startswith","isnull","isnotnull","isnullorempty","isnotnullorempty","isempty","isnotempty","mappers","pageSize","page","useVersionFour","$filter","orderby","order","$orderby","$skip","take","$top","defaultDataType","read","dataType","schemas","odata","results","total","transports","jsonp","update","create","parameterMap","$inlinecount","$format","odata-v4","$count","ajax","success","response","responses","XmlDataReader","idField","xmlParse","model","errors","serialize","modelBase","Model","fields","xpathToMember","modelInstance","evaluate","record","_parse","xml","parseDOM","parsedNode","attribute","attributes","attributeCount","nextSibling","intermediateResult","tree","parseXML","raw","readers","eventHandler","_notifyChange","equal","xtype","ytype","getFieldByName","fieldName","Query","normalizeSort","descriptor","descriptors","sortFields","sorts","sortObject","normalizeOperator","operatorMap","normalizeFilter","compareDescriptor","f1","f2","normalizeDescriptor","fieldComparer","compareFilters","expr1","expr2","filters1","filters2","normalizeAggregate","expressions","normalizeGroup","skipItemSorting","aggregates","normalizeGroupWithoutCompare","anyGroupDescriptorHasCompare","groupDescriptors","groupValueComparer","calculateAggregate","accumulator","state","aggr","functionName","aggregate","functions","isNumber","isDate","serializeRecords","getters","originalFieldNames","fieldNames","originalName","setters","convertRecords","convertGroup","hasSubgroups","wrapDataAccess","originalFunction","converter","wrapDataAccessBase","fillLastGroup","originalGroup","newGroup","currOriginal","currentNew","mergeGroups","dest","group","flatGroups","indexFunction","groupIndex","itemIndex","groupsLength","indexFn","flattenGroups","at","wrapGroupItems","eachGroupItems","func","replaceInRanges","ranges","replaceInRange","replaceWithObservable","serverGrouping","viewIndex","removeModel","uid","indexOfPristineModel","_defaultId","indexOfModel","comparer","fieldNameFromModel","convertFilterDescriptorsField","convertDescriptorsField","inferSelect","firstField","secondField","optgroup","label","specified","inferTable","fieldIndex","tbody","tBodies","rows","fieldCount","dataMethod","_data","_attachBubbleHandlers","inferList","textChild","textField","urlField","spriteCssClassField","imageUrlField","_loaded","hasChildren","ObservableObject","parsers","defaultValues","Comparer","StableComparer","operators","LocalTransport","RemoteTransport","Cache","DataReader","Transport","Node","Buffer","BatchBuffer","ASCENDING","CREATE","READ","UPDATE","DESTROY","SYNC","GET","ERROR","REQUESTSTART","PROGRESS","REQUESTEND","crud","identity","o","wrapAll","serializeFunctions","json","object","howMany","thisArg","reduce","reduceRight","every","some","Symbol","_parent","_handlers","shouldSerialize","_set","paths","composite","isSetPrevented","isObservableArray","isDataSource","boolean","default","_initializers","dirtyFields","editable","accept","isNew","functionFields","nullable","localeCompare","combine","comparers","asc","valueA","valueB","__position","desc","textOp","impl","ignore","accentFoldingFiltering","toLocaleLowerCase","op","getMatchRegexp","esc","doesnotstartwith","n","doesnotendwith","doesnotmatch","filterExpr","and","or","fieldFunctions","operatorFunctions","==","equals","isequalto","equalto","!=","ne","notequals","isnotequalto","notequalto","notequal","<","islessthan","lessthan","less","<=","le","islessthanorequalto","lessthanequal",">","isgreaterthan","greaterthan","greater",">=","isgreaterthanorequalto","greaterthanequal","ge","notsubstringof","toArray","range","inPlace","orderBy","orderByDescending","compiled","predicate","allData","groupBy","groupValue","_sortForGrouping","_sortGroups","sum","average","process","customGroupSort","query","groupDescriptorsWithoutCompare","normalizedSort","groupDescriptorsWithoutSort","filterCallback","groupDescriptor","setup","parameters","operation","_store","store","inmemory","schema","dataFunction","groupsFunction","serializeFunction","serializeGetters","_dataAccessFunction","fromName","_wrapDataAccessBase","_map","_prefetch","_pristineData","_ranges","_pristineTotal","_pageSize","_page","_sort","_filter","_group","_aggregate","_total","_shouldDetachObservableParents","pushCreate","_pushCreate","pushUpdate","_pushUpdate","pushDestroy","_pushDestroy","offlineStorage","_storage","getItem","localStorage","setItem","reader","_detachObservableParents","_observe","_online","serverSorting","serverPaging","serverFiltering","serverAggregates","inPlaceSort","online","sync","Deferred","resolve","offlineData","_isServerGrouped","_push","_readData","_flatData","useRanges","getByUid","_getByUid","_storeData","_addRange","_process","_observeView","insert","_createNewModel","_wrapInEmptyGroup","_insertModelInRange","pushInsert","pushed","autoSync","pristine","rangeSpan","_getCurrentRangeSpan","pristineData","_updatePristineForModel","_removeItems","removePristine","shouldRemovePristine","found","_eachItem","_removePristineForModel","hasGroups","_removeModelFromRanges","promises","_sendSubmit","_send","when","then","_accept","_syncEnd","cancelChanges","_cancelModel","_changesCanceled","_markOfflineUpdatesAsDirty","__state__","hasChanges","serverGroup","_handleCustomErrors","_executeOnPristineForModel","_eachPristineItem","_pristineForModel","_modelCanceled","_submit","reject","deferred","_promise","converted","_params","_queueRequest","_dequeueRequest","_readAggregates","replaceSubset","itemIds","_aggregateResult","_skip","endless","_changeHandler","updatePristine","timestamp","_timeStamp","_sortRanges","xhr","errorThrown","_requestInProgress","_pending","_shouldWrap","arrayType","_updateTotalForAction","_calculateAggregates","_take","currentRangeStart","_clearEmptyGroups","_queryProcess","dataToAggregate","_setFilterTotal","_mergeState","_currentRangeStart","_sortFields","moreItemsCount","remote","filterTotal","setDefaultValue","fetch","_query","done","totalPages","_pageableQueryOptions","_emptyAggregates","inRange","_findRange","lastRange","firstItemUid","enableRequestsInProgress","_skipRequestsInProgress","_currentRequestTimeStamp","pageSkip","_processRangeData","_rangeExists","prefetch","skipIdx","takeIdx","startIndex","endIndex","rangeData","rangeEnd","processed","flatData","_mergeGroups","prevGroup","paging","sorting","filtering","_prefetchSuccessHandler","_timeout","_multiplePrefetch","_removeModelFromRange","_updateRangesLength","rangesLength","mismatchFound","mismatchLength","lengthDifference","transportOptions","hasChildrenObject","childrenField","childrenOptions","_childrenOptions","_initChildren","_updateChildrenField","loaded","level","_childrenLoaded","load","_matchFilter","_hierarchicalFilter","_markHierarchicalQuery","_updateHierarchicalFilter","_find","_dataSource","viewSize","disablePrefetch","_prefetching","_syncWithDataSource","setViewSize","_recalculate","itemPresent","dataOffset","prefetchThreshold","midPageThreshold","nextMidRange","nextPageThreshold","nextFullRange","pullBackThreshold","previousMidRange","previousFullRange","_goToRange","nextRange","syncDataSource","prefetchOffset","expanding","_expanding","_syncPending","_firstItemUid","batchSize","batchBuffer","endreached","prefetching","prefetched","reset","unifyType","getSelectedOption","selectedIndex","mapChangedItems","itemsToMatch","itemsLength","selectedLength","changed","unchanged","isValidFilterExpr","removeFiltersForField","STATIC_LIST_NS","StaticList","percentageUnitsRegex","LOADING","GROUPHEADER","ITEMSELECTOR","LABELIDPART","CASCADE","FOCUSOUT","HIDDENCLASS","WIDTH","isIE","quotRegExp","alternativeNames","ComboBox","DropDownList","MultiColumnComboBox","List","_isSelect","dataTextField","dataValueField","ul","aria-hidden","_listMousedown","columns","_columnsHeader","_noData","_accessors","_initValue","valuePrimitive","headerTemplate","noDataTemplate","noData","_renderFooter","_renderNoData","_focused","_angularElement","prepend","colGroup","row","currentColumn","columnsHeaderTemplate","currentWidth","currentWidthInt","widthStyle","columnsHeader","_listOptions","currentOptions","virtual","changeEventOption","_listChange","listBoundHandler","_listBound","autoBind","activate","_activateItem","deactivate","_deactivateItem","dataBinding","dataBound","groupTemplate","fixedGroupTemplate","$angular","_initList","listOptions","selectedItemChange","listView","VirtualList","_setListValue","_updateSelectionState","filterInput","_isFilterEnabled","_hideClear","_clear","_showClear","_clearValue","_clearText","_accessor","_customOption","enforceMinLength","word","highlightFirst","_clearFilter","bound","_filterSource","newExpression","dataSourceState","isMultiColumnFiltering","filterFields","resetPageSettings","removed","_clearFilterExpressions","_pushFilterExpression","_cascading","setDSFilter","filtersToRemove","_toggleNoData","_toggleHeader","groupHeader","_allowOpening","_ignoreCase","candidate","widgetOptions","fromFilter","_buildExpression","_open","_clearButton","clearTitle","clearButton","_inputValue","_typingTimeout","minLength","_state","_emptySearch","_searchByWord","_unbindDataSource","selectedDataItems","valueField","_text","_aria","suggest","_ariaLabel","labelId","focusedElm","inputElm","inputId","labelElm","ariaLabel","ariaLabelledBy","_generateLabelId","_userTriggered","optionValue","_valueBeforeCascade","_oldIndex","isFiltered","typing","_enable","_dataValue","_offsetHeight","prevAll","_height","offsetTop","popups","footerHeight","_openHandler","_adjustListWidth","computedWidth","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","fontFamily","autoWidth","minWidth","whiteSpace","_closeHandler","_focusItem","noFocusedItem","scrollToIndex","_calculateGroupPadding","li","padding","_calculatePopupHeight","_calculateColumnsHeaderPadding","_refreshScroll","enableYScroll","overflowX","overflowY","_resizePopup","_popup","_makeUnselectable","not","preventFocus","touchEnabled","MSPointers","_prevent","_triggerCascade","_cascadeTriggered","_cascadedValue","userTriggered","_triggerChange","_requestStartHandler","_requestEndHandler","_errorHandler","requireValueMapper","hasValue","valueMapper","Select","_initial","setDataSource","_initialIndex","_parentWidget","_cascadeSelect","_cascadeValue","_accessorInput","_accessorSelect","_custom","_syncValueAndText","custom","_hideBusy","_busy","_arrowIcon","_showBusy","_request","_requestEnd","_firstItem","focusFirst","_lastItem","focusLast","_nextItem","focusNext","_prevItem","focusPrev","_getNormalizedDataItem","isIndex","hasOptionLabel","optionLabel","getElementIndex","dataItemByIndex","_getNormalizedSelectCandidate","normalizedCandidate","moveIndex","selectCandidate","activeFilter","shouldTrigger","isVirtual","_fetch","_get","focusout","scrollWith","_fetchData","hasItems","cascadeFrom","_options","dataText","dataValue","htmlElement","parentElement","_cascade","cascade","_cascadeHandlerProxy","_cascadeHandler","_cascadeFilterRequests","_selectedValue","_toggleCascadeOnFocus","valueBeforeCascade","_clearSelection","_cascadeChange","filterValue","cascadeFromParentField","cascadeFromField","currentHandler","_touchHandlers","before","_optionID","_selectedIndices","_dataItems","_values","_getter","_onScroll","_scrollId","_renderHeader","_refreshHandler","_fixedHeader","startY","endY","tapPosition","_touchTriggered","_triggerClick","_render","scroll","itemOffsetTop","itemOffsetHeight","contentScrollTop","contentOffsetHeight","bottomDistance","_getValues","_valueGetter","hasCandidate","focusIndex","skipUpdate","_skipUpdate","indices","filtered","singleSelection","selectedIndices","uiSelectedIndices","added","_deselectFiltered","_valueComparer","removeAt","_valueDeferred","_valueIndices","_valueExpr","normalized","_valueType","_dataItemPosition","valueExpr","removedIndices","templateText","templates","_normalizeIndices","newIndices","_firstVisibleItem","itemHeight","lastChild","forward","previousSibling","isGrouped","visibleItem","_renderItem","notFirstItem","hasColumns","isLastGroupedItem","_renderColumns","dataContext","_selected","_lastDSFilter","skipUpdateOnBind","isItemChange","_bound","parseInteger","parseCSS","propertyName","acc","strip3DTransforms","transformProps","transform2d","normalizeCSS","lowerKey","isTransformed","transformation","cssValues","animationProperty","transform","computed","NONE","matrix3dRegExp","translateXRegExp","atan2","capitalize","createEffect","definition","effectClass","Effect","opt1","opt2","opt3","theDirection","createToggleEffect","defaultStart","defaultEnd","IN_OUT","startValue","_startValue","endValue","_endValue","shouldHide","_shouldHide","prepare","_direction","startDataValue","startDataValueIsSet","_reverse","clipInHalf","HEIGHT","CLIPS","curProxy","EffectSet","FOUR_DIRECTIONS","TRANSFER_START_STATE","ROTATIONS","RESTORE_OVERFLOW","IGNORE_TRANSITION_EVENT_SELECTOR","Animation","Transition","scaleProperties","scale","scalex","scaley","scale3d","translateProperties","translate","translatex","translatey","translate3d","hasZoom","cssParamsRegExp","oldEffectsRegExp","singleEffectRegExp","unitRegExp","transform2units","rotate","skew","BLANK","PX","AUTO","ORIGIN","ABORT_ID","OVERFLOW","TRANSLATE","COMPLETE_CALLBACK","TRANSITION","BACKFACE","PERSPECTIVE","DEFAULT_PERSPECTIVE","TRANSFORM_PERSPECTIVE","stopQueue","transformValue","step","elem","cur","exclusive","ease","mirror","redirectedEffect","resolved","$1","$2","effect","effectBody","timeoutID","stopTransitionCalled","stopTransition","oldKeys","speeds","merge","uniqueSort","unique","taskKeys","retainPosition","restore","run","jdx","childrenLength","effectName","setReverse","addRestoreProperties","restoreCallback","effectSet","parsedEffects","useTransition","single","originalPosition","dX","dY","marginLeft","marginTop","_additionalEffects","play","additional","_duration","compositeRun","_complete","previous","previousDivisor","margin","setLength","oldLength","realLength","outerBox","box","innerBox","currentScale","fillScale","transformOrigin","_container","rotation","_clipInHalf","clip","face","_face","temporary","back","reverseDirection","faceClone","backClone","staticPage","turningPage","transformStyle","_before","_after","transitionClass","_previous","_transitionClass","beforeTransition","afterTransition","_both","_element","_containerClass","containerClass","completeProxy","isAbsolute","originalOverflow","both","_tickProxy","_tick","_started","tick","onEnd","onCancel","timePassed","moveTo","movable","initial","_easeProxy","moveAxis","easeOutExpo","easeOutBack","inner","outer","fitScale","numericCssPropery","within","containerBoundaries","minX","minY","maxX","maxY","checkTarget","targets","areas","theTarget","theFilter","targetLen","areaLen","targetElement","destroyDroppable","groupName","droppables","scrollableViewPort","scrollableRoot","$window","findScrollableParent","autoScrollVelocity","mouseX","mouseY","rect","AUTO_SCROLL_AREA","lastDropTarget","Movable","DropTarget","DropTargetArea","Draggable","draggables","dropTargets","dropAreas","KEYUP","DRAGSTART","DRAG","DRAGEND","DRAGCANCEL","HINTDESTROYED","DRAGENTER","DRAGLEAVE","DROP","TapCapture","_press","_release","attachEvent","captureNext","cancelCapture","PaneDimension","forcedEnabled","measure","scrollSize","makeVirtual","_virtualMin","_virtualMax","virtualSize","outOfBounds","forceEnabled","getTotal","rescale","silent","scaledTotal","minScale","centerOffset","PaneDimensions","forcedMinScale","maxScale","newScale","centerCoordinates","PaneAxis","dimension","dragMove","resistance","translateAxis","Pane","elastic","gesturestart","gesture","gesturechange","coordinates","offsetX","offsetY","previousGesture","previousCenter","scaleDelta","scaleWith","TRANSFORM_STYLE","webkitTransformOrigin","_saveCoordinates","by","scaleTo","newCoordinates","draggable","dropTarget","_over","_out","_drop","dropped","destroyGroup","_cache","hold","_drag","_cancel","_afterEndHandler","_afterEnd","_captureEscape","cursorOffset","holdToDrag","autoScroll","cancelHold","_updateHint","boundaries","hintOffset","hint","_shouldIgnoreTarget","ignoreSelector","currentTargetOffset","scopeTarget","scopeFrom","cursorElement","_elementUnderCursor","_cursorElement","_scrollableParent","_lastEvent","_processMovement","_scrollCompenstation","_scrollVelocity","clearInterval","_scrollInterval","setInterval","_withDropTarget","_autoScroll","yIsScrollable","xIsScrollable","isRootNode","yInBounds","xInBounds","compensation","initialTarget","utils","SNAPBACK_DURATION","SCROLLBAR_OPACITY","FRICTION","VELOCITY_MULTIPLIER","MAX_VELOCITY","OUT_OF_BOUNDS_FRICTION","ANIMATED_SCROLLER_PRECISION","RELEASECLASS","REFRESHCLASS","PULL","RESIZE","MOUSE_WHEEL_ID","ZoomSnapBack","tapCapture","DragInertia","freeze","_moveTo","paneAxis","_snapBack","velocityMultiplier","friction","snapBack","AnimatedScroller","_updateCoordinates","setCoordinates","setCallback","ScrollBar","elementSize","scrollMovable","alwaysVisible","paneSize","sizeRatio","visibility","avoidScrolling","pane","zoomSnapBack","animatedScroller","_native","scrollElement","fixedContainer","wrapInner","velocityX","velocityY","horizontalSwipe","originatedFromFixedContainer","verticalSwipe","scrollTo","mousewheelScrolling","pulled","_initAxis","_wheelEnd","_wheel","_wheelY","pullToRefresh","_initPullToRefresh","_wheelScroll","_wheelTimeout","pullOffset","visibleScrollHints","pullTemplate","releaseTemplate","refreshTemplate","contentResized","_scale","zoomOut","animatedScrollTo","pullHandled","refreshHint","hintContainer","yinertia","xinertia","_paneChange","_dragEnd","scrollBar","lastFrom","isPrimitive","getItemCount","listScreens","getDefaultItemHeight","lineHeight","mockList","bufferSizes","opposite","listValidator","downThreshold","upThreshold","lastScrollTop","scrollCallback","syncList","reorder","webkitTransform","map2","arr1","arr2","ITEMCHANGE","reshift","itemTemplate","placeholderTemplate","renderColumns","GROUPITEM","isActivePromise","WRAPPER","VIRTUALLIST","CONTENT","LIST","HEADER","VIRTUALITEM","ITEM","HEIGHTCONTAINER","LISTBOUND","VIRTUAL_LIST_NS","_fetching","_selectedDataItems","_selectedIndexes","_rangesList","_promisesList","_renderItems","_triggerListBound","oppositeBuffer","mapValueTo","_selectProxy","_clean","_deferValueSet","mute","_selectingValue","_highlightSelectedItems","_getElementByDataItem","_mute","_createList","_forcePrefetch","shouldClear","_prefetchByValue","_checkValuesOrder","_removedAddedIndexes","dataView","_dataView","valueGetter","forSelection","mapValueToIndex","mapValueToDataItem","indexes","_getIndecies","deferredRange","itemCount","defs","low","high","pages","existingRange","isEmptyList","_activeDeferred","_getSkip","_findDataItem","_getRange","triggerEvent","_getElementByIndex","_focusedIndex","_getElementLocation","_screenHeight","heightContainer","initialIndices","isAlreadySelected","prefetchStarted","_selectDeferred","_deselectCurrentValues","_listCreated","_lastScrollTop","hasData","setScreenHeight","yPosition","yDownPostion","screenEnd","_generateItems","minHeight","_saveInitialRanges","_buildValueGetter","_setHeight","getList","_listItems","_whenChanged","_reorderList","currentHeight","padHeight","lastRequestedRange","lastRangeStart","rangeStart","flatGroup","groupLength","_getterDeferred","firstItemIndex","_indexConstraint","firstVisibleGroup","fixedGroupText","currentVisibleGroup","firstVisibleDataItemIndex","firstVisibleDataItem","_itemMapper","listType","currentIndex","_currentGroup","_range","_getDataItemsCollection","_listIndex","theValidator","theNew","currentOffset","Infinity","list2","range2","_bufferSizes","buffers","elementIndex","selectedIndexes","removedindexesCounter","_deselectSingleItem","oldSkip","_clickHandler","firstItem","assign","normalizeIndex","sameCharsOnly","character","nsFocusEvent","CLICKEVENTS","STATE_FILTER","STATE_ACCEPT","MSG_INVALID_OPTION_LABEL","_focusHandler","_focusInputHandler","_focusInput","_optionLabel","_inputTemplate","_prev","_word","_span","_mobile","_filterHeader","_attachFocusHandlers","_textAccessor","_optionLabelText","valueTemplate","optionLabelTemplate","_arrow","_focusFilter","_resizeFilterInput","isInputActive","originalPrevent","_optionLabelDataItem","loweredText","_valueSetter","_assignInstance","_buildOptions","optionLabelValue","initialIndex","_presetValue","_selectValue","_filterPaste","_search","_focusinHandler","_focusoutHandler","isIFrame","self","_wrapperMousedown","_wrapperClick","dropDownWrapper","_keypress","isPopupVisible","_getElementDataItem","_matchText","_shuffleData","splitIndex","optionDataItem","_selectNext","oldFocusedItem","dataLength","isInLoop","_last","charCode","_popupOpen","compareElement","jQueryCandidate","_resetOptionLabel","focusedItem","additionalClass","keepState","aria-haspopup","span","SELECTOR","DOMelement","accesskey","unselectable","getElements","optionLabelText","_preselect"],"mappings":"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t+B,GAAM6gC,aAAe,SAAUC,GAC3B,GAAIC,GAAQ/gC,GAAMghC,kBAAkBF,IAAeA,CACnD,OAAO7gC,IAAQioB,YAAczpB,EAAOypB,WAAW6Y,GAAO3jB,SAE1Dpd,GAAMghC,kBAAoB,SAAUC,GAChC,OACIC,GAAM,qBACNC,GAAM,qBACNC,GAAM,qBACNC,GAAM,qBACNC,GAAM,uBACRL,IAENjhC,GAAMuhC,cACFC,OACI,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,OACI,OACA,OACA,OACA,OACA,OACA,OACA,MACA,QACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,QAEJC,OACI,MACA,OACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,OACA,OACA,MACA,OACA,OACA,QACA,OACA,SAEJC,KACI,OACA,QACA,OACA,SACA,OACA,OACA,OACA,OACA,OACA,QACA,OACA,QAEJC,cACI,OACA,OACA,OACA,OACA,SAEJj+B,MACI,OACA,OACA,SAEJk+B,aACI,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,OACA,QACA,OACA,OACA,OACA,OACA,QACA,OACA,OACA,OACA,OACA,OACA,QACA,MACA,OACA,OACA,UAEJC,KAAM,QACNC,QACI,OACA,OACA,OACA,OACA,OACA,OACA,UACA,OACA,QAEJC,KACI,MACA,OACA,MACA,QACA,OACA,OACA,OACA,OACA,OACA,UACA,KACA,OACA,SAEJC,cACI,OACA,OACA,SACA,OACA,OACA,OACA,SAGRjiC,GAAMkiC,aAAe,SAAUC,EAAWC,GAArB,GAORn/B,GACDo/B,EAPJC,EAActiC,GAAMuhC,aACpBgB,EAAShyB,OAAO6a,KAAKkX,GACrBh7B,EAAO,MACX,IAAI66B,IAAczjC,IAAcyjC,EAAUziC,OACtC,MAAO4H,EAEX,KAASrE,EAAI,EAAGA,EAAIs/B,EAAO7iC,OAAQuD,GAAK,EAEpC,GADIo/B,EAAaC,EAAYC,EAAOt/B,IACh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","file":"kendo.custom.min.js","sourcesContent":["/*!\n * Copyright 2020 Progress Software Corporation and/or one of its subsidiaries or affiliates. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n(function (f, define) {\n define('kendo.core', ['jquery'], f);\n}(function () {\n var __meta__ = {\n id: 'core',\n name: 'Core',\n category: 'framework',\n description: 'The core of the Kendo framework.'\n };\n (function ($, window, undefined) {\n var kendo = window.kendo = window.kendo || { cultures: {} }, extend = $.extend, each = $.each, isArray = $.isArray, proxy = $.proxy, noop = $.noop, math = Math, Template, JSON = window.JSON || {}, support = {}, percentRegExp = /%/, formatRegExp = /\\{(\\d+)(:[^\\}]+)?\\}/g, boxShadowRegExp = /(\\d+(?:\\.?)\\d*)px\\s*(\\d+(?:\\.?)\\d*)px\\s*(\\d+(?:\\.?)\\d*)px\\s*(\\d+)?/i, numberRegExp = /^(\\+|-?)\\d+(\\.?)\\d*$/, FUNCTION = 'function', STRING = 'string', NUMBER = 'number', OBJECT = 'object', NULL = 'null', BOOLEAN = 'boolean', UNDEFINED = 'undefined', getterCache = {}, setterCache = {}, slice = [].slice, noDepricateExtend = function () {\n var src, copyIsArray, copy, name, options, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false;\n if (typeof target === 'boolean') {\n deep = target;\n target = arguments[i] || {};\n i++;\n }\n if (typeof target !== 'object' && !jQuery.isFunction(target)) {\n target = {};\n }\n if (i === length) {\n target = this;\n i--;\n }\n for (; i < length; i++) {\n if ((options = arguments[i]) != null) {\n for (name in options) {\n if (name == 'filters' || name == 'concat' || name == ':') {\n continue;\n }\n src = target[name];\n copy = options[name];\n if (target === copy) {\n continue;\n }\n if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) {\n if (copyIsArray) {\n copyIsArray = false;\n clone = src && jQuery.isArray(src) ? src : [];\n } else {\n clone = src && jQuery.isPlainObject(src) ? src : {};\n }\n target[name] = noDepricateExtend(deep, clone, copy);\n } else if (copy !== undefined) {\n target[name] = copy;\n }\n }\n }\n }\n return target;\n };\n kendo.version = '2020.2.402'.replace(/^\\s+|\\s+$/g, '');\n function Class() {\n }\n Class.extend = function (proto) {\n var base = function () {\n }, member, that = this, subclass = proto && proto.init ? proto.init : function () {\n that.apply(this, arguments);\n }, fn;\n base.prototype = that.prototype;\n fn = subclass.fn = subclass.prototype = new base();\n for (member in proto) {\n if (proto[member] != null && proto[member].constructor === Object) {\n fn[member] = extend(true, {}, base.prototype[member], proto[member]);\n } else {\n fn[member] = proto[member];\n }\n }\n fn.constructor = subclass;\n subclass.extend = that.extend;\n return subclass;\n };\n Class.prototype._initOptions = function (options) {\n this.options = deepExtend({}, this.options, options);\n };\n var isFunction = kendo.isFunction = function (fn) {\n return typeof fn === 'function';\n };\n var preventDefault = function () {\n this._defaultPrevented = true;\n };\n var isDefaultPrevented = function () {\n return this._defaultPrevented === true;\n };\n var Observable = Class.extend({\n init: function () {\n this._events = {};\n },\n bind: function (eventName, handlers, one) {\n var that = this, idx, eventNames = typeof eventName === STRING ? [eventName] : eventName, length, original, handler, handlersIsFunction = typeof handlers === FUNCTION, events;\n if (handlers === undefined) {\n for (idx in eventName) {\n that.bind(idx, eventName[idx]);\n }\n return that;\n }\n for (idx = 0, length = eventNames.length; idx < length; idx++) {\n eventName = eventNames[idx];\n handler = handlersIsFunction ? handlers : handlers[eventName];\n if (handler) {\n if (one) {\n original = handler;\n handler = function () {\n that.unbind(eventName, handler);\n original.apply(that, arguments);\n };\n handler.original = original;\n }\n events = that._events[eventName] = that._events[eventName] || [];\n events.push(handler);\n }\n }\n return that;\n },\n one: function (eventNames, handlers) {\n return this.bind(eventNames, handlers, true);\n },\n first: function (eventName, handlers) {\n var that = this, idx, eventNames = typeof eventName === STRING ? [eventName] : eventName, length, handler, handlersIsFunction = typeof handlers === FUNCTION, events;\n for (idx = 0, length = eventNames.length; idx < length; idx++) {\n eventName = eventNames[idx];\n handler = handlersIsFunction ? handlers : handlers[eventName];\n if (handler) {\n events = that._events[eventName] = that._events[eventName] || [];\n events.unshift(handler);\n }\n }\n return that;\n },\n trigger: function (eventName, e) {\n var that = this, events = that._events[eventName], idx, length;\n if (events) {\n e = e || {};\n e.sender = that;\n e._defaultPrevented = false;\n e.preventDefault = preventDefault;\n e.isDefaultPrevented = isDefaultPrevented;\n events = events.slice();\n for (idx = 0, length = events.length; idx < length; idx++) {\n events[idx].call(that, e);\n }\n return e._defaultPrevented === true;\n }\n return false;\n },\n unbind: function (eventName, handler) {\n var that = this, events = that._events[eventName], idx;\n if (eventName === undefined) {\n that._events = {};\n } else if (events) {\n if (handler) {\n for (idx = events.length - 1; idx >= 0; idx--) {\n if (events[idx] === handler || events[idx].original === handler) {\n events.splice(idx, 1);\n }\n }\n } else {\n that._events[eventName] = [];\n }\n }\n return that;\n }\n });\n function compilePart(part, stringPart) {\n if (stringPart) {\n return '\\'' + part.split('\\'').join('\\\\\\'').split('\\\\\"').join('\\\\\\\\\\\\\"').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r').replace(/\\t/g, '\\\\t') + '\\'';\n } else {\n var first = part.charAt(0), rest = part.substring(1);\n if (first === '=') {\n return '+(' + rest + ')+';\n } else if (first === ':') {\n return '+$kendoHtmlEncode(' + rest + ')+';\n } else {\n return ';' + part + ';$kendoOutput+=';\n }\n }\n }\n var argumentNameRegExp = /^\\w+/, encodeRegExp = /\\$\\{([^}]*)\\}/g, escapedCurlyRegExp = /\\\\\\}/g, curlyRegExp = /__CURLY__/g, escapedSharpRegExp = /\\\\#/g, sharpRegExp = /__SHARP__/g, zeros = [\n '',\n '0',\n '00',\n '000',\n '0000'\n ];\n Template = {\n paramName: 'data',\n useWithBlock: true,\n render: function (template, data) {\n var idx, length, html = '';\n for (idx = 0, length = data.length; idx < length; idx++) {\n html += template(data[idx]);\n }\n return html;\n },\n compile: function (template, options) {\n var settings = extend({}, this, options), paramName = settings.paramName, argumentName = paramName.match(argumentNameRegExp)[0], useWithBlock = settings.useWithBlock, functionBody = 'var $kendoOutput, $kendoHtmlEncode = kendo.htmlEncode;', fn, parts, idx;\n if (isFunction(template)) {\n return template;\n }\n functionBody += useWithBlock ? 'with(' + paramName + '){' : '';\n functionBody += '$kendoOutput=';\n parts = template.replace(escapedCurlyRegExp, '__CURLY__').replace(encodeRegExp, '#=$kendoHtmlEncode($1)#').replace(curlyRegExp, '}').replace(escapedSharpRegExp, '__SHARP__').split('#');\n for (idx = 0; idx < parts.length; idx++) {\n functionBody += compilePart(parts[idx], idx % 2 === 0);\n }\n functionBody += useWithBlock ? ';}' : ';';\n functionBody += 'return $kendoOutput;';\n functionBody = functionBody.replace(sharpRegExp, '#');\n try {\n fn = new Function(argumentName, functionBody);\n fn._slotCount = Math.floor(parts.length / 2);\n return fn;\n } catch (e) {\n throw new Error(kendo.format('Invalid template:\\'{0}\\' Generated code:\\'{1}\\'', template, functionBody));\n }\n }\n };\n function pad(number, digits, end) {\n number = number + '';\n digits = digits || 2;\n end = digits - number.length;\n if (end) {\n return zeros[digits].substring(0, end) + number;\n }\n return number;\n }\n (function () {\n var escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g, gap, indent, meta = {\n '\\b': '\\\\b',\n '\\t': '\\\\t',\n '\\n': '\\\\n',\n '\\f': '\\\\f',\n '\\r': '\\\\r',\n '\"': '\\\\\"',\n '\\\\': '\\\\\\\\'\n }, rep, toString = {}.toString;\n if (typeof Date.prototype.toJSON !== FUNCTION) {\n Date.prototype.toJSON = function () {\n var that = this;\n return isFinite(that.valueOf()) ? pad(that.getUTCFullYear(), 4) + '-' + pad(that.getUTCMonth() + 1) + '-' + pad(that.getUTCDate()) + 'T' + pad(that.getUTCHours()) + ':' + pad(that.getUTCMinutes()) + ':' + pad(that.getUTCSeconds()) + 'Z' : null;\n };\n String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function () {\n return this.valueOf();\n };\n }\n function quote(string) {\n escapable.lastIndex = 0;\n return escapable.test(string) ? '\"' + string.replace(escapable, function (a) {\n var c = meta[a];\n return typeof c === STRING ? c : '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n }) + '\"' : '\"' + string + '\"';\n }\n function str(key, holder) {\n var i, k, v, length, mind = gap, partial, value = holder[key], type;\n if (value && typeof value === OBJECT && typeof value.toJSON === FUNCTION) {\n value = value.toJSON(key);\n }\n if (typeof rep === FUNCTION) {\n value = rep.call(holder, key, value);\n }\n type = typeof value;\n if (type === STRING) {\n return quote(value);\n } else if (type === NUMBER) {\n return isFinite(value) ? String(value) : NULL;\n } else if (type === BOOLEAN || type === NULL) {\n return String(value);\n } else if (type === OBJECT) {\n if (!value) {\n return NULL;\n }\n gap += indent;\n partial = [];\n if (toString.apply(value) === '[object Array]') {\n length = value.length;\n for (i = 0; i < length; i++) {\n partial[i] = str(i, value) || NULL;\n }\n v = partial.length === 0 ? '[]' : gap ? '[\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + ']' : '[' + partial.join(',') + ']';\n gap = mind;\n return v;\n }\n if (rep && typeof rep === OBJECT) {\n length = rep.length;\n for (i = 0; i < length; i++) {\n if (typeof rep[i] === STRING) {\n k = rep[i];\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n } else {\n for (k in value) {\n if (Object.hasOwnProperty.call(value, k)) {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n }\n v = partial.length === 0 ? '{}' : gap ? '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + '}' : '{' + partial.join(',') + '}';\n gap = mind;\n return v;\n }\n }\n if (typeof JSON.stringify !== FUNCTION) {\n JSON.stringify = function (value, replacer, space) {\n var i;\n gap = '';\n indent = '';\n if (typeof space === NUMBER) {\n for (i = 0; i < space; i += 1) {\n indent += ' ';\n }\n } else if (typeof space === STRING) {\n indent = space;\n }\n rep = replacer;\n if (replacer && typeof replacer !== FUNCTION && (typeof replacer !== OBJECT || typeof replacer.length !== NUMBER)) {\n throw new Error('JSON.stringify');\n }\n return str('', { '': value });\n };\n }\n }());\n (function () {\n var dateFormatRegExp = /dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|HH|H|hh|h|mm|m|fff|ff|f|tt|ss|s|zzz|zz|z|\"[^\"]*\"|'[^']*'/g, standardFormatRegExp = /^(n|c|p|e)(\\d*)$/i, literalRegExp = /(\\\\.)|(['][^']*[']?)|([\"][^\"]*[\"]?)/g, commaRegExp = /\\,/g, EMPTY = '', POINT = '.', COMMA = ',', SHARP = '#', ZERO = '0', PLACEHOLDER = '??', EN = 'en-US', objectToString = {}.toString;\n kendo.cultures['en-US'] = {\n name: EN,\n numberFormat: {\n pattern: ['-n'],\n decimals: 2,\n ',': ',',\n '.': '.',\n groupSize: [3],\n percent: {\n pattern: [\n '-n %',\n 'n %'\n ],\n decimals: 2,\n ',': ',',\n '.': '.',\n groupSize: [3],\n symbol: '%'\n },\n currency: {\n name: 'US Dollar',\n abbr: 'USD',\n pattern: [\n '($n)',\n '$n'\n ],\n decimals: 2,\n ',': ',',\n '.': '.',\n groupSize: [3],\n symbol: '$'\n }\n },\n calendars: {\n standard: {\n days: {\n names: [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday'\n ],\n namesAbbr: [\n 'Sun',\n 'Mon',\n 'Tue',\n 'Wed',\n 'Thu',\n 'Fri',\n 'Sat'\n ],\n namesShort: [\n 'Su',\n 'Mo',\n 'Tu',\n 'We',\n 'Th',\n 'Fr',\n 'Sa'\n ]\n },\n months: {\n names: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December'\n ],\n namesAbbr: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec'\n ]\n },\n AM: [\n 'AM',\n 'am',\n 'AM'\n ],\n PM: [\n 'PM',\n 'pm',\n 'PM'\n ],\n patterns: {\n d: 'M/d/yyyy',\n D: 'dddd, MMMM dd, yyyy',\n F: 'dddd, MMMM dd, yyyy h:mm:ss tt',\n g: 'M/d/yyyy h:mm tt',\n G: 'M/d/yyyy h:mm:ss tt',\n m: 'MMMM dd',\n M: 'MMMM dd',\n s: 'yyyy\\'-\\'MM\\'-\\'ddTHH\\':\\'mm\\':\\'ss',\n t: 'h:mm tt',\n T: 'h:mm:ss tt',\n u: 'yyyy\\'-\\'MM\\'-\\'dd HH\\':\\'mm\\':\\'ss\\'Z\\'',\n y: 'MMMM, yyyy',\n Y: 'MMMM, yyyy'\n },\n '/': '/',\n ':': ':',\n firstDay: 0,\n twoDigitYearMax: 2029\n }\n }\n };\n function findCulture(culture) {\n if (culture) {\n if (culture.numberFormat) {\n return culture;\n }\n if (typeof culture === STRING) {\n var cultures = kendo.cultures;\n return cultures[culture] || cultures[culture.split('-')[0]] || null;\n }\n return null;\n }\n return null;\n }\n function getCulture(culture) {\n if (culture) {\n culture = findCulture(culture);\n }\n return culture || kendo.cultures.current;\n }\n kendo.culture = function (cultureName) {\n var cultures = kendo.cultures, culture;\n if (cultureName !== undefined) {\n culture = findCulture(cultureName) || cultures[EN];\n culture.calendar = culture.calendars.standard;\n cultures.current = culture;\n } else {\n return cultures.current;\n }\n };\n kendo.findCulture = findCulture;\n kendo.getCulture = getCulture;\n kendo.culture(EN);\n function formatDate(date, format, culture) {\n culture = getCulture(culture);\n var calendar = culture.calendars.standard, days = calendar.days, months = calendar.months;\n format = calendar.patterns[format] || format;\n return format.replace(dateFormatRegExp, function (match) {\n var minutes;\n var result;\n var sign;\n if (match === 'd') {\n result = date.getDate();\n } else if (match === 'dd') {\n result = pad(date.getDate());\n } else if (match === 'ddd') {\n result = days.namesAbbr[date.getDay()];\n } else if (match === 'dddd') {\n result = days.names[date.getDay()];\n } else if (match === 'M') {\n result = date.getMonth() + 1;\n } else if (match === 'MM') {\n result = pad(date.getMonth() + 1);\n } else if (match === 'MMM') {\n result = months.namesAbbr[date.getMonth()];\n } else if (match === 'MMMM') {\n result = months.names[date.getMonth()];\n } else if (match === 'yy') {\n result = pad(date.getFullYear() % 100);\n } else if (match === 'yyyy') {\n result = pad(date.getFullYear(), 4);\n } else if (match === 'h') {\n result = date.getHours() % 12 || 12;\n } else if (match === 'hh') {\n result = pad(date.getHours() % 12 || 12);\n } else if (match === 'H') {\n result = date.getHours();\n } else if (match === 'HH') {\n result = pad(date.getHours());\n } else if (match === 'm') {\n result = date.getMinutes();\n } else if (match === 'mm') {\n result = pad(date.getMinutes());\n } else if (match === 's') {\n result = date.getSeconds();\n } else if (match === 'ss') {\n result = pad(date.getSeconds());\n } else if (match === 'f') {\n result = math.floor(date.getMilliseconds() / 100);\n } else if (match === 'ff') {\n result = date.getMilliseconds();\n if (result > 99) {\n result = math.floor(result / 10);\n }\n result = pad(result);\n } else if (match === 'fff') {\n result = pad(date.getMilliseconds(), 3);\n } else if (match === 'tt') {\n result = date.getHours() < 12 ? calendar.AM[0] : calendar.PM[0];\n } else if (match === 'zzz') {\n minutes = date.getTimezoneOffset();\n sign = minutes < 0;\n result = math.abs(minutes / 60).toString().split('.')[0];\n minutes = math.abs(minutes) - result * 60;\n result = (sign ? '+' : '-') + pad(result);\n result += ':' + pad(minutes);\n } else if (match === 'zz' || match === 'z') {\n result = date.getTimezoneOffset() / 60;\n sign = result < 0;\n result = math.abs(result).toString().split('.')[0];\n result = (sign ? '+' : '-') + (match === 'zz' ? pad(result) : result);\n }\n return result !== undefined ? result : match.slice(1, match.length - 1);\n });\n }\n function formatNumber(number, format, culture) {\n culture = getCulture(culture);\n var numberFormat = culture.numberFormat, decimal = numberFormat[POINT], precision = numberFormat.decimals, pattern = numberFormat.pattern[0], literals = [], symbol, isCurrency, isPercent, customPrecision, formatAndPrecision, negative = number < 0, integer, fraction, integerLength, fractionLength, replacement = EMPTY, value = EMPTY, idx, length, ch, hasGroup, hasNegativeFormat, decimalIndex, sharpIndex, zeroIndex, hasZero, hasSharp, percentIndex, currencyIndex, startZeroIndex, start = -1, end;\n if (number === undefined) {\n return EMPTY;\n }\n if (!isFinite(number)) {\n return number;\n }\n if (!format) {\n return culture.name.length ? number.toLocaleString() : number.toString();\n }\n formatAndPrecision = standardFormatRegExp.exec(format);\n if (formatAndPrecision) {\n format = formatAndPrecision[1].toLowerCase();\n isCurrency = format === 'c';\n isPercent = format === 'p';\n if (isCurrency || isPercent) {\n numberFormat = isCurrency ? numberFormat.currency : numberFormat.percent;\n decimal = numberFormat[POINT];\n precision = numberFormat.decimals;\n symbol = numberFormat.symbol;\n pattern = numberFormat.pattern[negative ? 0 : 1];\n }\n customPrecision = formatAndPrecision[2];\n if (customPrecision) {\n precision = +customPrecision;\n }\n if (format === 'e') {\n var exp = customPrecision ? number.toExponential(precision) : number.toExponential();\n return exp.replace(POINT, numberFormat[POINT]);\n }\n if (isPercent) {\n number *= 100;\n }\n number = round(number, precision);\n negative = number < 0;\n number = number.split(POINT);\n integer = number[0];\n fraction = number[1];\n if (negative) {\n integer = integer.substring(1);\n }\n value = groupInteger(integer, 0, integer.length, numberFormat);\n if (fraction) {\n value += decimal + fraction;\n }\n if (format === 'n' && !negative) {\n return value;\n }\n number = EMPTY;\n for (idx = 0, length = pattern.length; idx < length; idx++) {\n ch = pattern.charAt(idx);\n if (ch === 'n') {\n number += value;\n } else if (ch === '$' || ch === '%') {\n number += symbol;\n } else {\n number += ch;\n }\n }\n return number;\n }\n if (format.indexOf('\\'') > -1 || format.indexOf('\"') > -1 || format.indexOf('\\\\') > -1) {\n format = format.replace(literalRegExp, function (match) {\n var quoteChar = match.charAt(0).replace('\\\\', ''), literal = match.slice(1).replace(quoteChar, '');\n literals.push(literal);\n return PLACEHOLDER;\n });\n }\n format = format.split(';');\n if (negative && format[1]) {\n format = format[1];\n hasNegativeFormat = true;\n } else if (number === 0 && format[2]) {\n format = format[2];\n if (format.indexOf(SHARP) == -1 && format.indexOf(ZERO) == -1) {\n return format;\n }\n } else {\n format = format[0];\n }\n percentIndex = format.indexOf('%');\n currencyIndex = format.indexOf('$');\n isPercent = percentIndex != -1;\n isCurrency = currencyIndex != -1;\n if (isPercent) {\n number *= 100;\n }\n if (isCurrency && format[currencyIndex - 1] === '\\\\') {\n format = format.split('\\\\').join('');\n isCurrency = false;\n }\n if (isCurrency || isPercent) {\n numberFormat = isCurrency ? numberFormat.currency : numberFormat.percent;\n decimal = numberFormat[POINT];\n precision = numberFormat.decimals;\n symbol = numberFormat.symbol;\n }\n hasGroup = format.indexOf(COMMA) > -1;\n if (hasGroup) {\n format = format.replace(commaRegExp, EMPTY);\n }\n decimalIndex = format.indexOf(POINT);\n length = format.length;\n if (decimalIndex != -1) {\n fraction = number.toString().split('e');\n if (fraction[1]) {\n fraction = round(number, Math.abs(fraction[1]));\n } else {\n fraction = fraction[0];\n }\n fraction = fraction.split(POINT)[1] || EMPTY;\n zeroIndex = format.lastIndexOf(ZERO) - decimalIndex;\n sharpIndex = format.lastIndexOf(SHARP) - decimalIndex;\n hasZero = zeroIndex > -1;\n hasSharp = sharpIndex > -1;\n idx = fraction.length;\n if (!hasZero && !hasSharp) {\n format = format.substring(0, decimalIndex) + format.substring(decimalIndex + 1);\n length = format.length;\n decimalIndex = -1;\n idx = 0;\n }\n if (hasZero && zeroIndex > sharpIndex) {\n idx = zeroIndex;\n } else if (sharpIndex > zeroIndex) {\n if (hasSharp && idx > sharpIndex) {\n var rounded = round(number, sharpIndex, negative);\n while (rounded.charAt(rounded.length - 1) === ZERO && sharpIndex > 0 && sharpIndex > zeroIndex) {\n sharpIndex--;\n rounded = round(number, sharpIndex, negative);\n }\n idx = sharpIndex;\n } else if (hasZero && idx < zeroIndex) {\n idx = zeroIndex;\n }\n }\n }\n number = round(number, idx, negative);\n sharpIndex = format.indexOf(SHARP);\n startZeroIndex = zeroIndex = format.indexOf(ZERO);\n if (sharpIndex == -1 && zeroIndex != -1) {\n start = zeroIndex;\n } else if (sharpIndex != -1 && zeroIndex == -1) {\n start = sharpIndex;\n } else {\n start = sharpIndex > zeroIndex ? zeroIndex : sharpIndex;\n }\n sharpIndex = format.lastIndexOf(SHARP);\n zeroIndex = format.lastIndexOf(ZERO);\n if (sharpIndex == -1 && zeroIndex != -1) {\n end = zeroIndex;\n } else if (sharpIndex != -1 && zeroIndex == -1) {\n end = sharpIndex;\n } else {\n end = sharpIndex > zeroIndex ? sharpIndex : zeroIndex;\n }\n if (start == length) {\n end = start;\n }\n if (start != -1) {\n value = number.toString().split(POINT);\n integer = value[0];\n fraction = value[1] || EMPTY;\n integerLength = integer.length;\n fractionLength = fraction.length;\n if (negative && number * -1 >= 0) {\n negative = false;\n }\n number = format.substring(0, start);\n if (negative && !hasNegativeFormat) {\n number += '-';\n }\n for (idx = start; idx < length; idx++) {\n ch = format.charAt(idx);\n if (decimalIndex == -1) {\n if (end - idx < integerLength) {\n number += integer;\n break;\n }\n } else {\n if (zeroIndex != -1 && zeroIndex < idx) {\n replacement = EMPTY;\n }\n if (decimalIndex - idx <= integerLength && decimalIndex - idx > -1) {\n number += integer;\n idx = decimalIndex;\n }\n if (decimalIndex === idx) {\n number += (fraction ? decimal : EMPTY) + fraction;\n idx += end - decimalIndex + 1;\n continue;\n }\n }\n if (ch === ZERO) {\n number += ch;\n replacement = ch;\n } else if (ch === SHARP) {\n number += replacement;\n }\n }\n if (hasGroup) {\n number = groupInteger(number, start + (negative && !hasNegativeFormat ? 1 : 0), Math.max(end, integerLength + start), numberFormat);\n }\n if (end >= start) {\n number += format.substring(end + 1);\n }\n if (isCurrency || isPercent) {\n value = EMPTY;\n for (idx = 0, length = number.length; idx < length; idx++) {\n ch = number.charAt(idx);\n value += ch === '$' || ch === '%' ? symbol : ch;\n }\n number = value;\n }\n length = literals.length;\n if (length) {\n for (idx = 0; idx < length; idx++) {\n number = number.replace(PLACEHOLDER, literals[idx]);\n }\n }\n }\n return number;\n }\n var groupInteger = function (number, start, end, numberFormat) {\n var decimalIndex = number.indexOf(numberFormat[POINT]);\n var groupSizes = numberFormat.groupSize.slice();\n var groupSize = groupSizes.shift();\n var integer, integerLength;\n var idx, parts, value;\n var newGroupSize;\n end = decimalIndex !== -1 ? decimalIndex : end + 1;\n integer = number.substring(start, end);\n integerLength = integer.length;\n if (integerLength >= groupSize) {\n idx = integerLength;\n parts = [];\n while (idx > -1) {\n value = integer.substring(idx - groupSize, idx);\n if (value) {\n parts.push(value);\n }\n idx -= groupSize;\n newGroupSize = groupSizes.shift();\n groupSize = newGroupSize !== undefined ? newGroupSize : groupSize;\n if (groupSize === 0) {\n if (idx > 0) {\n parts.push(integer.substring(0, idx));\n }\n break;\n }\n }\n integer = parts.reverse().join(numberFormat[COMMA]);\n number = number.substring(0, start) + integer + number.substring(end);\n }\n return number;\n };\n var round = function (value, precision, negative) {\n precision = precision || 0;\n value = value.toString().split('e');\n value = Math.round(+(value[0] + 'e' + (value[1] ? +value[1] + precision : precision)));\n if (negative) {\n value = -value;\n }\n value = value.toString().split('e');\n value = +(value[0] + 'e' + (value[1] ? +value[1] - precision : -precision));\n return value.toFixed(Math.min(precision, 20));\n };\n var toString = function (value, fmt, culture) {\n if (fmt) {\n if (objectToString.call(value) === '[object Date]') {\n return formatDate(value, fmt, culture);\n } else if (typeof value === NUMBER) {\n return formatNumber(value, fmt, culture);\n }\n }\n return value !== undefined ? value : '';\n };\n kendo.format = function (fmt) {\n var values = arguments;\n return fmt.replace(formatRegExp, function (match, index, placeholderFormat) {\n var value = values[parseInt(index, 10) + 1];\n return toString(value, placeholderFormat ? placeholderFormat.substring(1) : '');\n });\n };\n kendo._extractFormat = function (format) {\n if (format.slice(0, 3) === '{0:') {\n format = format.slice(3, format.length - 1);\n }\n return format;\n };\n kendo._activeElement = function () {\n try {\n return document.activeElement;\n } catch (e) {\n return document.documentElement.activeElement;\n }\n };\n kendo._round = round;\n kendo._outerWidth = function (element, includeMargin) {\n return $(element).outerWidth(includeMargin || false) || 0;\n };\n kendo._outerHeight = function (element, includeMargin) {\n return $(element).outerHeight(includeMargin || false) || 0;\n };\n kendo.toString = toString;\n }());\n (function () {\n var nonBreakingSpaceRegExp = /\\u00A0/g, exponentRegExp = /[eE][\\-+]?[0-9]+/, shortTimeZoneRegExp = /[+|\\-]\\d{1,2}/, longTimeZoneRegExp = /[+|\\-]\\d{1,2}:?\\d{2}/, dateRegExp = /^\\/Date\\((.*?)\\)\\/$/, offsetRegExp = /[+-]\\d*/, FORMATS_SEQUENCE = [\n [],\n [\n 'G',\n 'g',\n 'F'\n ],\n [\n 'D',\n 'd',\n 'y',\n 'm',\n 'T',\n 't'\n ]\n ], STANDARD_FORMATS = [\n [\n 'yyyy-MM-ddTHH:mm:ss.fffffffzzz',\n 'yyyy-MM-ddTHH:mm:ss.fffffff',\n 'yyyy-MM-ddTHH:mm:ss.fffzzz',\n 'yyyy-MM-ddTHH:mm:ss.fff',\n 'ddd MMM dd yyyy HH:mm:ss',\n 'yyyy-MM-ddTHH:mm:sszzz',\n 'yyyy-MM-ddTHH:mmzzz',\n 'yyyy-MM-ddTHH:mmzz',\n 'yyyy-MM-ddTHH:mm:ss',\n 'yyyy-MM-dd HH:mm:ss',\n 'yyyy/MM/dd HH:mm:ss'\n ],\n [\n 'yyyy-MM-ddTHH:mm',\n 'yyyy-MM-dd HH:mm',\n 'yyyy/MM/dd HH:mm'\n ],\n [\n 'yyyy/MM/dd',\n 'yyyy-MM-dd',\n 'HH:mm:ss',\n 'HH:mm'\n ]\n ], numberRegExp = {\n 2: /^\\d{1,2}/,\n 3: /^\\d{1,3}/,\n 4: /^\\d{4}/\n }, objectToString = {}.toString;\n function outOfRange(value, start, end) {\n return !(value >= start && value <= end);\n }\n function designatorPredicate(designator) {\n return designator.charAt(0);\n }\n function mapDesignators(designators) {\n return $.map(designators, designatorPredicate);\n }\n function adjustDST(date, hours) {\n if (!hours && date.getHours() === 23) {\n date.setHours(date.getHours() + 2);\n }\n }\n function lowerArray(data) {\n var idx = 0, length = data.length, array = [];\n for (; idx < length; idx++) {\n array[idx] = (data[idx] + '').toLowerCase();\n }\n return array;\n }\n function lowerLocalInfo(localInfo) {\n var newLocalInfo = {}, property;\n for (property in localInfo) {\n newLocalInfo[property] = lowerArray(localInfo[property]);\n }\n return newLocalInfo;\n }\n function parseExact(value, format, culture, strict) {\n if (!value) {\n return null;\n }\n var lookAhead = function (match) {\n var i = 0;\n while (format[idx] === match) {\n i++;\n idx++;\n }\n if (i > 0) {\n idx -= 1;\n }\n return i;\n }, getNumber = function (size) {\n var rg = numberRegExp[size] || new RegExp('^\\\\d{1,' + size + '}'), match = value.substr(valueIdx, size).match(rg);\n if (match) {\n match = match[0];\n valueIdx += match.length;\n return parseInt(match, 10);\n }\n return null;\n }, getIndexByName = function (names, lower) {\n var i = 0, length = names.length, name, nameLength, matchLength = 0, matchIdx = 0, subValue;\n for (; i < length; i++) {\n name = names[i];\n nameLength = name.length;\n subValue = value.substr(valueIdx, nameLength);\n if (lower) {\n subValue = subValue.toLowerCase();\n }\n if (subValue == name && nameLength > matchLength) {\n matchLength = nameLength;\n matchIdx = i;\n }\n }\n if (matchLength) {\n valueIdx += matchLength;\n return matchIdx + 1;\n }\n return null;\n }, checkLiteral = function () {\n var result = false;\n if (value.charAt(valueIdx) === format[idx]) {\n valueIdx++;\n result = true;\n }\n return result;\n }, calendar = culture.calendars.standard, year = null, month = null, day = null, hours = null, minutes = null, seconds = null, milliseconds = null, idx = 0, valueIdx = 0, literal = false, date = new Date(), twoDigitYearMax = calendar.twoDigitYearMax || 2029, defaultYear = date.getFullYear(), ch, count, length, pattern, pmHour, UTC, matches, amDesignators, pmDesignators, hoursOffset, minutesOffset, hasTime, match;\n if (!format) {\n format = 'd';\n }\n pattern = calendar.patterns[format];\n if (pattern) {\n format = pattern;\n }\n format = format.split('');\n length = format.length;\n for (; idx < length; idx++) {\n ch = format[idx];\n if (literal) {\n if (ch === '\\'') {\n literal = false;\n } else {\n checkLiteral();\n }\n } else {\n if (ch === 'd') {\n count = lookAhead('d');\n if (!calendar._lowerDays) {\n calendar._lowerDays = lowerLocalInfo(calendar.days);\n }\n if (day !== null && count > 2) {\n continue;\n }\n day = count < 3 ? getNumber(2) : getIndexByName(calendar._lowerDays[count == 3 ? 'namesAbbr' : 'names'], true);\n if (day === null || outOfRange(day, 1, 31)) {\n return null;\n }\n } else if (ch === 'M') {\n count = lookAhead('M');\n if (!calendar._lowerMonths) {\n calendar._lowerMonths = lowerLocalInfo(calendar.months);\n }\n month = count < 3 ? getNumber(2) : getIndexByName(calendar._lowerMonths[count == 3 ? 'namesAbbr' : 'names'], true);\n if (month === null || outOfRange(month, 1, 12)) {\n return null;\n }\n month -= 1;\n } else if (ch === 'y') {\n count = lookAhead('y');\n year = getNumber(count);\n if (year === null) {\n return null;\n }\n if (count == 2) {\n if (typeof twoDigitYearMax === 'string') {\n twoDigitYearMax = defaultYear + parseInt(twoDigitYearMax, 10);\n }\n year = defaultYear - defaultYear % 100 + year;\n if (year > twoDigitYearMax) {\n year -= 100;\n }\n }\n } else if (ch === 'h') {\n lookAhead('h');\n hours = getNumber(2);\n if (hours == 12) {\n hours = 0;\n }\n if (hours === null || outOfRange(hours, 0, 11)) {\n return null;\n }\n } else if (ch === 'H') {\n lookAhead('H');\n hours = getNumber(2);\n if (hours === null || outOfRange(hours, 0, 23)) {\n return null;\n }\n } else if (ch === 'm') {\n lookAhead('m');\n minutes = getNumber(2);\n if (minutes === null || outOfRange(minutes, 0, 59)) {\n return null;\n }\n } else if (ch === 's') {\n lookAhead('s');\n seconds = getNumber(2);\n if (seconds === null || outOfRange(seconds, 0, 59)) {\n return null;\n }\n } else if (ch === 'f') {\n count = lookAhead('f');\n match = value.substr(valueIdx, count).match(numberRegExp[3]);\n milliseconds = getNumber(count);\n if (milliseconds !== null) {\n milliseconds = parseFloat('0.' + match[0], 10);\n milliseconds = kendo._round(milliseconds, 3);\n milliseconds *= 1000;\n }\n if (milliseconds === null || outOfRange(milliseconds, 0, 999)) {\n return null;\n }\n } else if (ch === 't') {\n count = lookAhead('t');\n amDesignators = calendar.AM;\n pmDesignators = calendar.PM;\n if (count === 1) {\n amDesignators = mapDesignators(amDesignators);\n pmDesignators = mapDesignators(pmDesignators);\n }\n pmHour = getIndexByName(pmDesignators);\n if (!pmHour && !getIndexByName(amDesignators)) {\n return null;\n }\n } else if (ch === 'z') {\n UTC = true;\n count = lookAhead('z');\n if (value.substr(valueIdx, 1) === 'Z') {\n checkLiteral();\n continue;\n }\n matches = value.substr(valueIdx, 6).match(count > 2 ? longTimeZoneRegExp : shortTimeZoneRegExp);\n if (!matches) {\n return null;\n }\n matches = matches[0].split(':');\n hoursOffset = matches[0];\n minutesOffset = matches[1];\n if (!minutesOffset && hoursOffset.length > 3) {\n valueIdx = hoursOffset.length - 2;\n minutesOffset = hoursOffset.substring(valueIdx);\n hoursOffset = hoursOffset.substring(0, valueIdx);\n }\n hoursOffset = parseInt(hoursOffset, 10);\n if (outOfRange(hoursOffset, -12, 13)) {\n return null;\n }\n if (count > 2) {\n minutesOffset = matches[0][0] + minutesOffset;\n minutesOffset = parseInt(minutesOffset, 10);\n if (isNaN(minutesOffset) || outOfRange(minutesOffset, -59, 59)) {\n return null;\n }\n }\n } else if (ch === '\\'') {\n literal = true;\n checkLiteral();\n } else if (!checkLiteral()) {\n return null;\n }\n }\n }\n if (strict && !/^\\s*$/.test(value.substr(valueIdx))) {\n return null;\n }\n hasTime = hours !== null || minutes !== null || seconds || null;\n if (year === null && month === null && day === null && hasTime) {\n year = defaultYear;\n month = date.getMonth();\n day = date.getDate();\n } else {\n if (year === null) {\n year = defaultYear;\n }\n if (day === null) {\n day = 1;\n }\n }\n if (pmHour && hours < 12) {\n hours += 12;\n }\n if (UTC) {\n if (hoursOffset) {\n hours += -hoursOffset;\n }\n if (minutesOffset) {\n minutes += -minutesOffset;\n }\n value = new Date(Date.UTC(year, month, day, hours, minutes, seconds, milliseconds));\n } else {\n value = new Date(year, month, day, hours, minutes, seconds, milliseconds);\n adjustDST(value, hours);\n }\n if (year < 100) {\n value.setFullYear(year);\n }\n if (value.getDate() !== day && UTC === undefined) {\n return null;\n }\n return value;\n }\n function parseMicrosoftFormatOffset(offset) {\n var sign = offset.substr(0, 1) === '-' ? -1 : 1;\n offset = offset.substring(1);\n offset = parseInt(offset.substr(0, 2), 10) * 60 + parseInt(offset.substring(2), 10);\n return sign * offset;\n }\n function getDefaultFormats(culture) {\n var length = math.max(FORMATS_SEQUENCE.length, STANDARD_FORMATS.length);\n var calendar = culture.calendar || culture.calendars.standard;\n var patterns = calendar.patterns;\n var cultureFormats, formatIdx, idx;\n var formats = [];\n for (idx = 0; idx < length; idx++) {\n cultureFormats = FORMATS_SEQUENCE[idx];\n for (formatIdx = 0; formatIdx < cultureFormats.length; formatIdx++) {\n formats.push(patterns[cultureFormats[formatIdx]]);\n }\n formats = formats.concat(STANDARD_FORMATS[idx]);\n }\n return formats;\n }\n function internalParseDate(value, formats, culture, strict) {\n if (objectToString.call(value) === '[object Date]') {\n return value;\n }\n var idx = 0;\n var date = null;\n var length;\n var tzoffset;\n if (value && value.indexOf('/D') === 0) {\n date = dateRegExp.exec(value);\n if (date) {\n date = date[1];\n tzoffset = offsetRegExp.exec(date.substring(1));\n date = new Date(parseInt(date, 10));\n if (tzoffset) {\n tzoffset = parseMicrosoftFormatOffset(tzoffset[0]);\n date = kendo.timezone.apply(date, 0);\n date = kendo.timezone.convert(date, 0, -1 * tzoffset);\n }\n return date;\n }\n }\n culture = kendo.getCulture(culture);\n if (!formats) {\n formats = getDefaultFormats(culture);\n }\n formats = isArray(formats) ? formats : [formats];\n length = formats.length;\n for (; idx < length; idx++) {\n date = parseExact(value, formats[idx], culture, strict);\n if (date) {\n return date;\n }\n }\n return date;\n }\n kendo.parseDate = function (value, formats, culture) {\n return internalParseDate(value, formats, culture, false);\n };\n kendo.parseExactDate = function (value, formats, culture) {\n return internalParseDate(value, formats, culture, true);\n };\n kendo.parseInt = function (value, culture) {\n var result = kendo.parseFloat(value, culture);\n if (result) {\n result = result | 0;\n }\n return result;\n };\n kendo.parseFloat = function (value, culture, format) {\n if (!value && value !== 0) {\n return null;\n }\n if (typeof value === NUMBER) {\n return value;\n }\n value = value.toString();\n culture = kendo.getCulture(culture);\n var number = culture.numberFormat, percent = number.percent, currency = number.currency, symbol = currency.symbol, percentSymbol = percent.symbol, negative = value.indexOf('-'), parts, isPercent;\n if (exponentRegExp.test(value)) {\n value = parseFloat(value.replace(number['.'], '.'));\n if (isNaN(value)) {\n value = null;\n }\n return value;\n }\n if (negative > 0) {\n return null;\n } else {\n negative = negative > -1;\n }\n if (value.indexOf(symbol) > -1 || format && format.toLowerCase().indexOf('c') > -1) {\n number = currency;\n parts = number.pattern[0].replace('$', symbol).split('n');\n if (value.indexOf(parts[0]) > -1 && value.indexOf(parts[1]) > -1) {\n value = value.replace(parts[0], '').replace(parts[1], '');\n negative = true;\n }\n } else if (value.indexOf(percentSymbol) > -1) {\n isPercent = true;\n number = percent;\n symbol = percentSymbol;\n }\n value = value.replace('-', '').replace(symbol, '').replace(nonBreakingSpaceRegExp, ' ').split(number[','].replace(nonBreakingSpaceRegExp, ' ')).join('').replace(number['.'], '.');\n value = parseFloat(value);\n if (isNaN(value)) {\n value = null;\n } else if (negative) {\n value *= -1;\n }\n if (value && isPercent) {\n value /= 100;\n }\n return value;\n };\n }());\n function getShadows(element) {\n var shadow = element.css(kendo.support.transitions.css + 'box-shadow') || element.css('box-shadow'), radius = shadow ? shadow.match(boxShadowRegExp) || [\n 0,\n 0,\n 0,\n 0,\n 0\n ] : [\n 0,\n 0,\n 0,\n 0,\n 0\n ], blur = math.max(+radius[3], +(radius[4] || 0));\n return {\n left: -radius[1] + blur,\n right: +radius[1] + blur,\n bottom: +radius[2] + blur\n };\n }\n function wrap(element, autosize) {\n var browser = support.browser, percentage, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, parent = element.parent(), windowOuterWidth = outerWidth(window);\n parent.removeClass('k-animation-container-sm');\n if (!parent.hasClass('k-animation-container')) {\n var width = element[0].style.width, height = element[0].style.height, percentWidth = percentRegExp.test(width), percentHeight = percentRegExp.test(height), forceWidth = element.hasClass('k-tooltip') || element.is('.k-menu-horizontal.k-context-menu');\n percentage = percentWidth || percentHeight;\n if (!percentWidth && (!autosize || autosize && width || forceWidth)) {\n width = autosize ? outerWidth(element) + 1 : outerWidth(element);\n }\n if (!percentHeight && (!autosize || autosize && height) || element.is('.k-menu-horizontal.k-context-menu')) {\n height = outerHeight(element);\n }\n element.wrap($('
').addClass('k-animation-container').css({\n width: width,\n height: height\n }));\n parent = element.parent();\n if (percentage) {\n element.css({\n width: '100%',\n height: '100%',\n boxSizing: 'border-box',\n mozBoxSizing: 'border-box',\n webkitBoxSizing: 'border-box'\n });\n }\n } else {\n wrapResize(element, autosize);\n }\n if (windowOuterWidth < outerWidth(parent)) {\n parent.addClass('k-animation-container-sm');\n wrapResize(element, autosize);\n }\n if (browser.msie && math.floor(browser.version) <= 7) {\n element.css({ zoom: 1 });\n element.children('.k-menu').width(element.width());\n }\n return parent;\n }\n function wrapResize(element, autosize) {\n var percentage, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, wrapper = element.parent('.k-animation-container'), wrapperStyle = wrapper[0].style;\n if (wrapper.is(':hidden')) {\n wrapper.css({\n display: '',\n position: ''\n });\n }\n percentage = percentRegExp.test(wrapperStyle.width) || percentRegExp.test(wrapperStyle.height);\n if (!percentage) {\n wrapper.css({\n width: autosize ? outerWidth(element) + 1 : outerWidth(element),\n height: outerHeight(element),\n boxSizing: 'content-box',\n mozBoxSizing: 'content-box',\n webkitBoxSizing: 'content-box'\n });\n }\n }\n function deepExtend(destination) {\n var i = 1, length = arguments.length;\n for (i = 1; i < length; i++) {\n deepExtendOne(destination, arguments[i]);\n }\n return destination;\n }\n function deepExtendOne(destination, source) {\n var ObservableArray = kendo.data.ObservableArray, LazyObservableArray = kendo.data.LazyObservableArray, DataSource = kendo.data.DataSource, HierarchicalDataSource = kendo.data.HierarchicalDataSource, property, propValue, propType, propInit, destProp;\n for (property in source) {\n propValue = source[property];\n propType = typeof propValue;\n if (propType === OBJECT && propValue !== null) {\n propInit = propValue.constructor;\n } else {\n propInit = null;\n }\n if (propInit && propInit !== Array && propInit !== ObservableArray && propInit !== LazyObservableArray && propInit !== DataSource && propInit !== HierarchicalDataSource && propInit !== RegExp && (!kendo.isFunction(window.ArrayBuffer) || propInit !== ArrayBuffer)) {\n if (propValue instanceof Date) {\n destination[property] = new Date(propValue.getTime());\n } else if (isFunction(propValue.clone)) {\n destination[property] = propValue.clone();\n } else {\n destProp = destination[property];\n if (typeof destProp === OBJECT) {\n destination[property] = destProp || {};\n } else {\n destination[property] = {};\n }\n deepExtendOne(destination[property], propValue);\n }\n } else if (propType !== UNDEFINED) {\n destination[property] = propValue;\n }\n }\n return destination;\n }\n function testRx(agent, rxs, dflt) {\n for (var rx in rxs) {\n if (rxs.hasOwnProperty(rx) && rxs[rx].test(agent)) {\n return rx;\n }\n }\n return dflt !== undefined ? dflt : agent;\n }\n function toHyphens(str) {\n return str.replace(/([a-z][A-Z])/g, function (g) {\n return g.charAt(0) + '-' + g.charAt(1).toLowerCase();\n });\n }\n function toCamelCase(str) {\n return str.replace(/\\-(\\w)/g, function (strMatch, g1) {\n return g1.toUpperCase();\n });\n }\n function getComputedStyles(element, properties) {\n var styles = {}, computedStyle;\n if (document.defaultView && document.defaultView.getComputedStyle) {\n computedStyle = document.defaultView.getComputedStyle(element, '');\n if (properties) {\n $.each(properties, function (idx, value) {\n styles[value] = computedStyle.getPropertyValue(value);\n });\n }\n } else {\n computedStyle = element.currentStyle;\n if (properties) {\n $.each(properties, function (idx, value) {\n styles[value] = computedStyle[toCamelCase(value)];\n });\n }\n }\n if (!kendo.size(styles)) {\n styles = computedStyle;\n }\n return styles;\n }\n function isScrollable(element) {\n if (element && element.className && typeof element.className === 'string' && element.className.indexOf('k-auto-scrollable') > -1) {\n return true;\n }\n var overflow = getComputedStyles(element, ['overflow']).overflow;\n return overflow == 'auto' || overflow == 'scroll';\n }\n function scrollLeft(element, value) {\n var webkit = support.browser.webkit;\n var mozila = support.browser.mozilla;\n var el = element instanceof $ ? element[0] : element;\n var isRtl;\n if (!element) {\n return;\n }\n isRtl = support.isRtl(element);\n if (value !== undefined) {\n if (isRtl && webkit) {\n el.scrollLeft = el.scrollWidth - el.clientWidth - value;\n } else if (isRtl && mozila) {\n el.scrollLeft = -value;\n } else {\n el.scrollLeft = value;\n }\n } else {\n if (isRtl && webkit) {\n return el.scrollWidth - el.clientWidth - el.scrollLeft;\n } else {\n return Math.abs(el.scrollLeft);\n }\n }\n }\n (function () {\n support._scrollbar = undefined;\n support.scrollbar = function (refresh) {\n if (!isNaN(support._scrollbar) && !refresh) {\n return support._scrollbar;\n } else {\n var div = document.createElement('div'), result;\n div.style.cssText = 'overflow:scroll;overflow-x:hidden;zoom:1;clear:both;display:block';\n div.innerHTML = ' ';\n document.body.appendChild(div);\n support._scrollbar = result = div.offsetWidth - div.scrollWidth;\n document.body.removeChild(div);\n return result;\n }\n };\n support.isRtl = function (element) {\n return $(element).closest('.k-rtl').length > 0;\n };\n var table = document.createElement('table');\n try {\n table.innerHTML = '';\n support.tbodyInnerHtml = true;\n } catch (e) {\n support.tbodyInnerHtml = false;\n }\n support.touch = 'ontouchstart' in window;\n var docStyle = document.documentElement.style;\n var transitions = support.transitions = false, transforms = support.transforms = false, elementProto = 'HTMLElement' in window ? HTMLElement.prototype : [];\n support.hasHW3D = 'WebKitCSSMatrix' in window && 'm11' in new window.WebKitCSSMatrix() || 'MozPerspective' in docStyle || 'msPerspective' in docStyle;\n support.cssFlexbox = 'flexWrap' in docStyle || 'WebkitFlexWrap' in docStyle || 'msFlexWrap' in docStyle;\n each([\n 'Moz',\n 'webkit',\n 'O',\n 'ms'\n ], function () {\n var prefix = this.toString(), hasTransitions = typeof table.style[prefix + 'Transition'] === STRING;\n if (hasTransitions || typeof table.style[prefix + 'Transform'] === STRING) {\n var lowPrefix = prefix.toLowerCase();\n transforms = {\n css: lowPrefix != 'ms' ? '-' + lowPrefix + '-' : '',\n prefix: prefix,\n event: lowPrefix === 'o' || lowPrefix === 'webkit' ? lowPrefix : ''\n };\n if (hasTransitions) {\n transitions = transforms;\n transitions.event = transitions.event ? transitions.event + 'TransitionEnd' : 'transitionend';\n }\n return false;\n }\n });\n table = null;\n support.transforms = transforms;\n support.transitions = transitions;\n support.devicePixelRatio = window.devicePixelRatio === undefined ? 1 : window.devicePixelRatio;\n try {\n support.screenWidth = window.outerWidth || window.screen ? window.screen.availWidth : window.innerWidth;\n support.screenHeight = window.outerHeight || window.screen ? window.screen.availHeight : window.innerHeight;\n } catch (e) {\n support.screenWidth = window.screen.availWidth;\n support.screenHeight = window.screen.availHeight;\n }\n support.detectOS = function (ua) {\n var os = false, minorVersion, match = [], notAndroidPhone = !/mobile safari/i.test(ua), agentRxs = {\n wp: /(Windows Phone(?: OS)?)\\s(\\d+)\\.(\\d+(\\.\\d+)?)/,\n fire: /(Silk)\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n android: /(Android|Android.*(?:Opera|Firefox).*?\\/)\\s*(\\d+)\\.?(\\d+(\\.\\d+)?)?/,\n iphone: /(iPhone|iPod).*OS\\s+(\\d+)[\\._]([\\d\\._]+)/,\n ipad: /(iPad).*OS\\s+(\\d+)[\\._]([\\d_]+)/,\n meego: /(MeeGo).+NokiaBrowser\\/(\\d+)\\.([\\d\\._]+)/,\n webos: /(webOS)\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n blackberry: /(BlackBerry|BB10).*?Version\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n playbook: /(PlayBook).*?Tablet\\s*OS\\s*(\\d+)\\.(\\d+(\\.\\d+)?)/,\n windows: /(MSIE)\\s+(\\d+)\\.(\\d+(\\.\\d+)?)/,\n tizen: /(tizen).*?Version\\/(\\d+)\\.(\\d+(\\.\\d+)?)/i,\n sailfish: /(sailfish).*rv:(\\d+)\\.(\\d+(\\.\\d+)?).*firefox/i,\n ffos: /(Mobile).*rv:(\\d+)\\.(\\d+(\\.\\d+)?).*Firefox/\n }, osRxs = {\n ios: /^i(phone|pad|pod)$/i,\n android: /^android|fire$/i,\n blackberry: /^blackberry|playbook/i,\n windows: /windows/,\n wp: /wp/,\n flat: /sailfish|ffos|tizen/i,\n meego: /meego/\n }, formFactorRxs = { tablet: /playbook|ipad|fire/i }, browserRxs = {\n omini: /Opera\\sMini/i,\n omobile: /Opera\\sMobi/i,\n firefox: /Firefox|Fennec/i,\n mobilesafari: /version\\/.*safari/i,\n ie: /MSIE|Windows\\sPhone/i,\n chrome: /chrome|crios/i,\n webkit: /webkit/i\n };\n for (var agent in agentRxs) {\n if (agentRxs.hasOwnProperty(agent)) {\n match = ua.match(agentRxs[agent]);\n if (match) {\n if (agent == 'windows' && 'plugins' in navigator) {\n return false;\n }\n os = {};\n os.device = agent;\n os.tablet = testRx(agent, formFactorRxs, false);\n os.browser = testRx(ua, browserRxs, 'default');\n os.name = testRx(agent, osRxs);\n os[os.name] = true;\n os.majorVersion = match[2];\n os.minorVersion = (match[3] || '0').replace('_', '.');\n minorVersion = os.minorVersion.replace('.', '').substr(0, 2);\n os.flatVersion = os.majorVersion + minorVersion + new Array(3 - (minorVersion.length < 3 ? minorVersion.length : 2)).join('0');\n os.cordova = typeof window.PhoneGap !== UNDEFINED || typeof window.cordova !== UNDEFINED;\n os.appMode = window.navigator.standalone || /file|local|wmapp/.test(window.location.protocol) || os.cordova;\n if (os.android && (support.devicePixelRatio < 1.5 && os.flatVersion < 400 || notAndroidPhone) && (support.screenWidth > 800 || support.screenHeight > 800)) {\n os.tablet = agent;\n }\n break;\n }\n }\n }\n return os;\n };\n var mobileOS = support.mobileOS = support.detectOS(navigator.userAgent);\n support.wpDevicePixelRatio = mobileOS.wp ? screen.width / 320 : 0;\n support.hasNativeScrolling = false;\n if (mobileOS.ios || mobileOS.android && mobileOS.majorVersion > 2 || mobileOS.wp) {\n support.hasNativeScrolling = mobileOS;\n }\n support.delayedClick = function () {\n if (support.touch) {\n if (mobileOS.ios) {\n return true;\n }\n if (mobileOS.android) {\n if (!support.browser.chrome) {\n return true;\n }\n if (support.browser.version < 32) {\n return false;\n }\n return !($('meta[name=viewport]').attr('content') || '').match(/user-scalable=no/i);\n }\n }\n return false;\n };\n support.mouseAndTouchPresent = support.touch && !(support.mobileOS.ios || support.mobileOS.android);\n support.detectBrowser = function (ua) {\n var browser = false, match = [], browserRxs = {\n edge: /(edge)[ \\/]([\\w.]+)/i,\n webkit: /(chrome|crios)[ \\/]([\\w.]+)/i,\n safari: /(webkit)[ \\/]([\\w.]+)/i,\n opera: /(opera)(?:.*version|)[ \\/]([\\w.]+)/i,\n msie: /(msie\\s|trident.*? rv:)([\\w.]+)/i,\n mozilla: /(mozilla)(?:.*? rv:([\\w.]+)|)/i\n };\n for (var agent in browserRxs) {\n if (browserRxs.hasOwnProperty(agent)) {\n match = ua.match(browserRxs[agent]);\n if (match) {\n browser = {};\n browser[agent] = true;\n browser[match[1].toLowerCase().split(' ')[0].split('/')[0]] = true;\n browser.version = parseInt(document.documentMode || match[2], 10);\n break;\n }\n }\n }\n return browser;\n };\n support.browser = support.detectBrowser(navigator.userAgent);\n support.detectClipboardAccess = function () {\n var commands = {\n copy: document.queryCommandSupported ? document.queryCommandSupported('copy') : false,\n cut: document.queryCommandSupported ? document.queryCommandSupported('cut') : false,\n paste: document.queryCommandSupported ? document.queryCommandSupported('paste') : false\n };\n if (support.browser.chrome) {\n commands.paste = false;\n if (support.browser.version >= 43) {\n commands.copy = true;\n commands.cut = true;\n }\n }\n return commands;\n };\n support.clipboard = support.detectClipboardAccess();\n support.zoomLevel = function () {\n try {\n var browser = support.browser;\n var ie11WidthCorrection = 0;\n var docEl = document.documentElement;\n if (browser.msie && browser.version == 11 && docEl.scrollHeight > docEl.clientHeight && !support.touch) {\n ie11WidthCorrection = support.scrollbar();\n }\n return support.touch ? docEl.clientWidth / window.innerWidth : browser.msie && browser.version >= 10 ? ((top || window).document.documentElement.offsetWidth + ie11WidthCorrection) / (top || window).innerWidth : 1;\n } catch (e) {\n return 1;\n }\n };\n support.cssBorderSpacing = typeof docStyle.borderSpacing != 'undefined' && !(support.browser.msie && support.browser.version < 8);\n (function (browser) {\n var cssClass = '', docElement = $(document.documentElement), majorVersion = parseInt(browser.version, 10);\n if (browser.msie) {\n cssClass = 'ie';\n } else if (browser.mozilla) {\n cssClass = 'ff';\n } else if (browser.safari) {\n cssClass = 'safari';\n } else if (browser.webkit) {\n cssClass = 'webkit';\n } else if (browser.opera) {\n cssClass = 'opera';\n } else if (browser.edge) {\n cssClass = 'edge';\n }\n if (cssClass) {\n cssClass = 'k-' + cssClass + ' k-' + cssClass + majorVersion;\n }\n if (support.mobileOS) {\n cssClass += ' k-mobile';\n }\n if (!support.cssFlexbox) {\n cssClass += ' k-no-flexbox';\n }\n docElement.addClass(cssClass);\n }(support.browser));\n support.eventCapture = document.documentElement.addEventListener;\n var input = document.createElement('input');\n support.placeholder = 'placeholder' in input;\n support.propertyChangeEvent = 'onpropertychange' in input;\n support.input = function () {\n var types = [\n 'number',\n 'date',\n 'time',\n 'month',\n 'week',\n 'datetime',\n 'datetime-local'\n ];\n var length = types.length;\n var value = 'test';\n var result = {};\n var idx = 0;\n var type;\n for (; idx < length; idx++) {\n type = types[idx];\n input.setAttribute('type', type);\n input.value = value;\n result[type.replace('-', '')] = input.type !== 'text' && input.value !== value;\n }\n return result;\n }();\n input.style.cssText = 'float:left;';\n support.cssFloat = !!input.style.cssFloat;\n input = null;\n support.stableSort = function () {\n var threshold = 513;\n var sorted = [{\n index: 0,\n field: 'b'\n }];\n for (var i = 1; i < threshold; i++) {\n sorted.push({\n index: i,\n field: 'a'\n });\n }\n sorted.sort(function (a, b) {\n return a.field > b.field ? 1 : a.field < b.field ? -1 : 0;\n });\n return sorted[0].index === 1;\n }();\n support.matchesSelector = elementProto.webkitMatchesSelector || elementProto.mozMatchesSelector || elementProto.msMatchesSelector || elementProto.oMatchesSelector || elementProto.matchesSelector || elementProto.matches || function (selector) {\n var nodeList = document.querySelectorAll ? (this.parentNode || document).querySelectorAll(selector) || [] : $(selector), i = nodeList.length;\n while (i--) {\n if (nodeList[i] == this) {\n return true;\n }\n }\n return false;\n };\n support.matchMedia = 'matchMedia' in window;\n support.pushState = window.history && window.history.pushState;\n var documentMode = document.documentMode;\n support.hashChange = 'onhashchange' in window && !(support.browser.msie && (!documentMode || documentMode <= 8));\n support.customElements = 'registerElement' in window.document;\n var chrome = support.browser.chrome, mobileChrome = support.browser.crios, mozilla = support.browser.mozilla, safari = support.browser.safari;\n support.msPointers = !chrome && window.MSPointerEvent;\n support.pointers = !chrome && !mobileChrome && !mozilla && !safari && window.PointerEvent;\n support.kineticScrollNeeded = mobileOS && (support.touch || support.msPointers || support.pointers);\n }());\n function size(obj) {\n var result = 0, key;\n for (key in obj) {\n if (obj.hasOwnProperty(key) && key != 'toJSON') {\n result++;\n }\n }\n return result;\n }\n function getOffset(element, type, positioned) {\n if (!type) {\n type = 'offset';\n }\n var offset = element[type]();\n var result = {\n top: offset.top,\n right: offset.right,\n bottom: offset.bottom,\n left: offset.left\n };\n if (support.browser.msie && (support.pointers || support.msPointers) && !positioned) {\n var sign = support.isRtl(element) ? 1 : -1;\n result.top -= window.pageYOffset - document.documentElement.scrollTop;\n result.left -= window.pageXOffset + sign * document.documentElement.scrollLeft;\n }\n return result;\n }\n var directions = {\n left: { reverse: 'right' },\n right: { reverse: 'left' },\n down: { reverse: 'up' },\n up: { reverse: 'down' },\n top: { reverse: 'bottom' },\n bottom: { reverse: 'top' },\n 'in': { reverse: 'out' },\n out: { reverse: 'in' }\n };\n function parseEffects(input) {\n var effects = {};\n each(typeof input === 'string' ? input.split(' ') : input, function (idx) {\n effects[idx] = this;\n });\n return effects;\n }\n function fx(element) {\n return new kendo.effects.Element(element);\n }\n var effects = {};\n $.extend(effects, {\n enabled: true,\n Element: function (element) {\n this.element = $(element);\n },\n promise: function (element, options) {\n if (!element.is(':visible')) {\n element.css({ display: element.data('olddisplay') || 'block' }).css('display');\n }\n if (options.hide) {\n element.data('olddisplay', element.css('display')).hide();\n }\n if (options.init) {\n options.init();\n }\n if (options.completeCallback) {\n options.completeCallback(element);\n }\n element.dequeue();\n },\n disable: function () {\n this.enabled = false;\n this.promise = this.promiseShim;\n },\n enable: function () {\n this.enabled = true;\n this.promise = this.animatedPromise;\n }\n });\n effects.promiseShim = effects.promise;\n function prepareAnimationOptions(options, duration, reverse, complete) {\n if (typeof options === STRING) {\n if (isFunction(duration)) {\n complete = duration;\n duration = 400;\n reverse = false;\n }\n if (isFunction(reverse)) {\n complete = reverse;\n reverse = false;\n }\n if (typeof duration === BOOLEAN) {\n reverse = duration;\n duration = 400;\n }\n options = {\n effects: options,\n duration: duration,\n reverse: reverse,\n complete: complete\n };\n }\n return extend({\n effects: {},\n duration: 400,\n reverse: false,\n init: noop,\n teardown: noop,\n hide: false\n }, options, {\n completeCallback: options.complete,\n complete: noop\n });\n }\n function animate(element, options, duration, reverse, complete) {\n var idx = 0, length = element.length, instance;\n for (; idx < length; idx++) {\n instance = $(element[idx]);\n instance.queue(function () {\n effects.promise(instance, prepareAnimationOptions(options, duration, reverse, complete));\n });\n }\n return element;\n }\n function toggleClass(element, classes, options, add) {\n if (classes) {\n classes = classes.split(' ');\n each(classes, function (idx, value) {\n element.toggleClass(value, add);\n });\n }\n return element;\n }\n if (!('kendoAnimate' in $.fn)) {\n extend($.fn, {\n kendoStop: function (clearQueue, gotoEnd) {\n return this.stop(clearQueue, gotoEnd);\n },\n kendoAnimate: function (options, duration, reverse, complete) {\n return animate(this, options, duration, reverse, complete);\n },\n kendoAddClass: function (classes, options) {\n return kendo.toggleClass(this, classes, options, true);\n },\n kendoRemoveClass: function (classes, options) {\n return kendo.toggleClass(this, classes, options, false);\n },\n kendoToggleClass: function (classes, options, toggle) {\n return kendo.toggleClass(this, classes, options, toggle);\n }\n });\n }\n var ampRegExp = /&/g, ltRegExp = //g;\n function htmlEncode(value) {\n return ('' + value).replace(ampRegExp, '&').replace(ltRegExp, '<').replace(gtRegExp, '>').replace(quoteRegExp, '"').replace(aposRegExp, ''');\n }\n function unescape(value) {\n var template;\n try {\n template = window.decodeURIComponent(value);\n } catch (error) {\n template = value.replace(/%u([\\dA-F]{4})|%([\\dA-F]{2})/gi, function (_, m1, m2) {\n return String.fromCharCode(parseInt('0x' + (m1 || m2), 16));\n });\n }\n return template;\n }\n var eventTarget = function (e) {\n return e.target;\n };\n if (support.touch) {\n eventTarget = function (e) {\n var touches = 'originalEvent' in e ? e.originalEvent.changedTouches : 'changedTouches' in e ? e.changedTouches : null;\n return touches ? document.elementFromPoint(touches[0].clientX, touches[0].clientY) : e.target;\n };\n each([\n 'swipe',\n 'swipeLeft',\n 'swipeRight',\n 'swipeUp',\n 'swipeDown',\n 'doubleTap',\n 'tap'\n ], function (m, value) {\n $.fn[value] = function (callback) {\n return this.bind(value, callback);\n };\n });\n }\n if (support.touch) {\n if (!support.mobileOS) {\n support.mousedown = 'mousedown touchstart';\n support.mouseup = 'mouseup touchend';\n support.mousemove = 'mousemove touchmove';\n support.mousecancel = 'mouseleave touchcancel';\n support.click = 'click';\n support.resize = 'resize';\n } else {\n support.mousedown = 'touchstart';\n support.mouseup = 'touchend';\n support.mousemove = 'touchmove';\n support.mousecancel = 'touchcancel';\n support.click = 'touchend';\n support.resize = 'orientationchange';\n }\n } else if (support.pointers) {\n support.mousemove = 'pointermove';\n support.mousedown = 'pointerdown';\n support.mouseup = 'pointerup';\n support.mousecancel = 'pointercancel';\n support.click = 'pointerup';\n support.resize = 'orientationchange resize';\n } else if (support.msPointers) {\n support.mousemove = 'MSPointerMove';\n support.mousedown = 'MSPointerDown';\n support.mouseup = 'MSPointerUp';\n support.mousecancel = 'MSPointerCancel';\n support.click = 'MSPointerUp';\n support.resize = 'orientationchange resize';\n } else {\n support.mousemove = 'mousemove';\n support.mousedown = 'mousedown';\n support.mouseup = 'mouseup';\n support.mousecancel = 'mouseleave';\n support.click = 'click';\n support.resize = 'resize';\n }\n var wrapExpression = function (members, paramName) {\n var result = paramName || 'd', index, idx, length, member, count = 1;\n for (idx = 0, length = members.length; idx < length; idx++) {\n member = members[idx];\n if (member !== '') {\n index = member.indexOf('[');\n if (index !== 0) {\n if (index == -1) {\n member = '.' + member;\n } else {\n count++;\n member = '.' + member.substring(0, index) + ' || {})' + member.substring(index);\n }\n }\n count++;\n result += member + (idx < length - 1 ? ' || {})' : ')');\n }\n }\n return new Array(count).join('(') + result;\n }, localUrlRe = /^([a-z]+:)?\\/\\//i;\n extend(kendo, {\n widgets: [],\n _widgetRegisteredCallbacks: [],\n ui: kendo.ui || {},\n fx: kendo.fx || fx,\n effects: kendo.effects || effects,\n mobile: kendo.mobile || {},\n data: kendo.data || {},\n dataviz: kendo.dataviz || {},\n drawing: kendo.drawing || {},\n spreadsheet: { messages: {} },\n keys: {\n INSERT: 45,\n DELETE: 46,\n BACKSPACE: 8,\n TAB: 9,\n ENTER: 13,\n ESC: 27,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40,\n END: 35,\n HOME: 36,\n SPACEBAR: 32,\n PAGEUP: 33,\n PAGEDOWN: 34,\n F2: 113,\n F10: 121,\n F12: 123,\n NUMPAD_PLUS: 107,\n NUMPAD_MINUS: 109,\n NUMPAD_DOT: 110\n },\n support: kendo.support || support,\n animate: kendo.animate || animate,\n ns: '',\n attr: function (value) {\n return 'data-' + kendo.ns + value;\n },\n getShadows: getShadows,\n wrap: wrap,\n deepExtend: deepExtend,\n getComputedStyles: getComputedStyles,\n isScrollable: isScrollable,\n scrollLeft: scrollLeft,\n size: size,\n toCamelCase: toCamelCase,\n toHyphens: toHyphens,\n getOffset: kendo.getOffset || getOffset,\n parseEffects: kendo.parseEffects || parseEffects,\n toggleClass: kendo.toggleClass || toggleClass,\n directions: kendo.directions || directions,\n Observable: Observable,\n Class: Class,\n Template: Template,\n template: proxy(Template.compile, Template),\n render: proxy(Template.render, Template),\n stringify: proxy(JSON.stringify, JSON),\n eventTarget: eventTarget,\n htmlEncode: htmlEncode,\n unescape: unescape,\n isLocalUrl: function (url) {\n return url && !localUrlRe.test(url);\n },\n expr: function (expression, safe, paramName) {\n expression = expression || '';\n if (typeof safe == STRING) {\n paramName = safe;\n safe = false;\n }\n paramName = paramName || 'd';\n if (expression && expression.charAt(0) !== '[') {\n expression = '.' + expression;\n }\n if (safe) {\n expression = expression.replace(/\"([^.]*)\\.([^\"]*)\"/g, '\"$1_$DOT$_$2\"');\n expression = expression.replace(/'([^.]*)\\.([^']*)'/g, '\\'$1_$DOT$_$2\\'');\n expression = wrapExpression(expression.split('.'), paramName);\n expression = expression.replace(/_\\$DOT\\$_/g, '.');\n } else {\n expression = paramName + expression;\n }\n return expression;\n },\n getter: function (expression, safe) {\n var key = expression + safe;\n return getterCache[key] = getterCache[key] || new Function('d', 'return ' + kendo.expr(expression, safe));\n },\n setter: function (expression) {\n return setterCache[expression] = setterCache[expression] || new Function('d,value', kendo.expr(expression) + '=value');\n },\n accessor: function (expression) {\n return {\n get: kendo.getter(expression),\n set: kendo.setter(expression)\n };\n },\n guid: function () {\n var id = '', i, random;\n for (i = 0; i < 32; i++) {\n random = math.random() * 16 | 0;\n if (i == 8 || i == 12 || i == 16 || i == 20) {\n id += '-';\n }\n id += (i == 12 ? 4 : i == 16 ? random & 3 | 8 : random).toString(16);\n }\n return id;\n },\n roleSelector: function (role) {\n return role.replace(/(\\S+)/g, '[' + kendo.attr('role') + '=$1],').slice(0, -1);\n },\n directiveSelector: function (directives) {\n var selectors = directives.split(' ');\n if (selectors) {\n for (var i = 0; i < selectors.length; i++) {\n if (selectors[i] != 'view') {\n selectors[i] = selectors[i].replace(/(\\w*)(view|bar|strip|over)$/, '$1-$2');\n }\n }\n }\n return selectors.join(' ').replace(/(\\S+)/g, 'kendo-mobile-$1,').slice(0, -1);\n },\n triggeredByInput: function (e) {\n return /^(label|input|textarea|select)$/i.test(e.target.tagName);\n },\n onWidgetRegistered: function (callback) {\n for (var i = 0, len = kendo.widgets.length; i < len; i++) {\n callback(kendo.widgets[i]);\n }\n kendo._widgetRegisteredCallbacks.push(callback);\n },\n logToConsole: function (message, type) {\n var console = window.console;\n if (!kendo.suppressLog && typeof console != 'undefined' && console.log) {\n console[type || 'log'](message);\n }\n }\n });\n var Widget = Observable.extend({\n init: function (element, options) {\n var that = this;\n that.element = kendo.jQuery(element).handler(that);\n that.angular('init', options);\n Observable.fn.init.call(that);\n var dataSource = options ? options.dataSource : null;\n if (dataSource) {\n options = extend({}, options, { dataSource: {} });\n }\n options = that.options = extend(true, {}, that.options, that.defaults, options);\n if (dataSource) {\n options.dataSource = dataSource;\n }\n if (!that.element.attr(kendo.attr('role'))) {\n that.element.attr(kendo.attr('role'), (options.name || '').toLowerCase());\n }\n that.element.data('kendo' + options.prefix + options.name, that);\n that.bind(that.events, options);\n },\n events: [],\n options: { prefix: '' },\n _hasBindingTarget: function () {\n return !!this.element[0].kendoBindingTarget;\n },\n _tabindex: function (target) {\n target = target || this.wrapper;\n var element = this.element, TABINDEX = 'tabindex', tabindex = target.attr(TABINDEX) || element.attr(TABINDEX);\n element.removeAttr(TABINDEX);\n target.attr(TABINDEX, !isNaN(tabindex) ? tabindex : 0);\n },\n setOptions: function (options) {\n this._setEvents(options);\n $.extend(this.options, options);\n },\n _setEvents: function (options) {\n var that = this, idx = 0, length = that.events.length, e;\n for (; idx < length; idx++) {\n e = that.events[idx];\n if (that.options[e] && options[e]) {\n that.unbind(e, that.options[e]);\n if (that._events && that._events[e]) {\n delete that._events[e];\n }\n }\n }\n that.bind(that.events, options);\n },\n resize: function (force) {\n var size = this.getSize(), currentSize = this._size;\n if (force || (size.width > 0 || size.height > 0) && (!currentSize || size.width !== currentSize.width || size.height !== currentSize.height)) {\n this._size = size;\n this._resize(size, force);\n this.trigger('resize', size);\n }\n },\n getSize: function () {\n return kendo.dimensions(this.element);\n },\n size: function (size) {\n if (!size) {\n return this.getSize();\n } else {\n this.setSize(size);\n }\n },\n setSize: $.noop,\n _resize: $.noop,\n destroy: function () {\n var that = this;\n that.element.removeData('kendo' + that.options.prefix + that.options.name);\n that.element.removeData('handler');\n that.unbind();\n },\n _destroy: function () {\n this.destroy();\n },\n angular: function () {\n },\n _muteAngularRebind: function (callback) {\n this._muteRebind = true;\n callback.call(this);\n this._muteRebind = false;\n }\n });\n var DataBoundWidget = Widget.extend({\n dataItems: function () {\n return this.dataSource.flatView();\n },\n _angularItems: function (cmd) {\n var that = this;\n that.angular(cmd, function () {\n return {\n elements: that.items(),\n data: $.map(that.dataItems(), function (dataItem) {\n return { dataItem: dataItem };\n })\n };\n });\n }\n });\n kendo.dimensions = function (element, dimensions) {\n var domElement = element[0];\n if (dimensions) {\n element.css(dimensions);\n }\n return {\n width: domElement.offsetWidth,\n height: domElement.offsetHeight\n };\n };\n kendo.notify = noop;\n var templateRegExp = /template$/i, jsonRegExp = /^\\s*(?:\\{(?:.|\\r\\n|\\n)*\\}|\\[(?:.|\\r\\n|\\n)*\\])\\s*$/, jsonFormatRegExp = /^\\{(\\d+)(:[^\\}]+)?\\}|^\\[[A-Za-z_]+\\]$/, dashRegExp = /([A-Z])/g;\n function parseOption(element, option) {\n var value;\n if (option.indexOf('data') === 0) {\n option = option.substring(4);\n option = option.charAt(0).toLowerCase() + option.substring(1);\n }\n option = option.replace(dashRegExp, '-$1');\n value = element.getAttribute('data-' + kendo.ns + option);\n if (value === null) {\n value = undefined;\n } else if (value === 'null') {\n value = null;\n } else if (value === 'true') {\n value = true;\n } else if (value === 'false') {\n value = false;\n } else if (numberRegExp.test(value) && option != 'mask') {\n value = parseFloat(value);\n } else if (jsonRegExp.test(value) && !jsonFormatRegExp.test(value)) {\n value = new Function('return (' + value + ')')();\n }\n return value;\n }\n function parseOptions(element, options, source) {\n var result = {}, option, value, role = element.getAttribute('data-' + kendo.ns + 'role');\n for (option in options) {\n value = parseOption(element, option);\n if (value !== undefined) {\n if (templateRegExp.test(option) && role != 'drawer') {\n if (typeof value === 'string') {\n if ($('#' + value).length) {\n value = kendo.template($('#' + value).html());\n } else if (source) {\n value = kendo.template(source[value]);\n }\n } else {\n value = element.getAttribute(option);\n }\n }\n result[option] = value;\n }\n }\n return result;\n }\n kendo.initWidget = function (element, options, roles) {\n var result, option, widget, idx, length, role, value, dataSource, fullPath, widgetKeyRegExp;\n if (!roles) {\n roles = kendo.ui.roles;\n } else if (roles.roles) {\n roles = roles.roles;\n }\n element = element.nodeType ? element : element[0];\n role = element.getAttribute('data-' + kendo.ns + 'role');\n if (!role) {\n return;\n }\n fullPath = role.indexOf('.') === -1;\n if (fullPath) {\n widget = roles[role];\n } else {\n widget = kendo.getter(role)(window);\n }\n var data = $(element).data(), widgetKey = widget ? 'kendo' + widget.fn.options.prefix + widget.fn.options.name : '';\n if (fullPath) {\n widgetKeyRegExp = new RegExp('^kendo.*' + role + '$', 'i');\n } else {\n widgetKeyRegExp = new RegExp('^' + widgetKey + '$', 'i');\n }\n for (var key in data) {\n if (key.match(widgetKeyRegExp)) {\n if (key === widgetKey) {\n result = data[key];\n } else {\n return data[key];\n }\n }\n }\n if (!widget) {\n return;\n }\n dataSource = parseOption(element, 'dataSource');\n options = $.extend({}, parseOptions(element, widget.fn.options), options);\n if (dataSource) {\n if (typeof dataSource === STRING) {\n options.dataSource = kendo.getter(dataSource)(window);\n } else {\n options.dataSource = dataSource;\n }\n }\n for (idx = 0, length = widget.fn.events.length; idx < length; idx++) {\n option = widget.fn.events[idx];\n value = parseOption(element, option);\n if (value !== undefined) {\n options[option] = kendo.getter(value)(window);\n }\n }\n if (!result) {\n result = new widget(element, options);\n } else if (!$.isEmptyObject(options)) {\n result.setOptions(options);\n }\n return result;\n };\n kendo.rolesFromNamespaces = function (namespaces) {\n var roles = [], idx, length;\n if (!namespaces[0]) {\n namespaces = [\n kendo.ui,\n kendo.dataviz.ui\n ];\n }\n for (idx = 0, length = namespaces.length; idx < length; idx++) {\n roles[idx] = namespaces[idx].roles;\n }\n return extend.apply(null, [{}].concat(roles.reverse()));\n };\n kendo.init = function (element) {\n var roles = kendo.rolesFromNamespaces(slice.call(arguments, 1));\n $(element).find('[data-' + kendo.ns + 'role]').addBack().each(function () {\n kendo.initWidget(this, {}, roles);\n });\n };\n kendo.destroy = function (element) {\n $(element).find('[data-' + kendo.ns + 'role]').addBack().each(function () {\n var data = $(this).data();\n for (var key in data) {\n if (key.indexOf('kendo') === 0 && typeof data[key].destroy === FUNCTION) {\n data[key].destroy();\n }\n }\n });\n };\n function containmentComparer(a, b) {\n return $.contains(a, b) ? -1 : 1;\n }\n function resizableWidget() {\n var widget = $(this);\n return $.inArray(widget.attr('data-' + kendo.ns + 'role'), [\n 'slider',\n 'rangeslider',\n 'breadcrumb'\n ]) > -1 || widget.is(':visible');\n }\n kendo.resize = function (element, force) {\n var widgets = $(element).find('[data-' + kendo.ns + 'role]').addBack().filter(resizableWidget);\n if (!widgets.length) {\n return;\n }\n var widgetsArray = $.makeArray(widgets);\n widgetsArray.sort(containmentComparer);\n $.each(widgetsArray, function () {\n var widget = kendo.widgetInstance($(this));\n if (widget) {\n widget.resize(force);\n }\n });\n };\n kendo.parseOptions = parseOptions;\n extend(kendo.ui, {\n Widget: Widget,\n DataBoundWidget: DataBoundWidget,\n roles: {},\n progress: function (container, toggle, options) {\n var mask = container.find('.k-loading-mask'), support = kendo.support, browser = support.browser, isRtl, leftRight, webkitCorrection, containerScrollLeft, cssClass;\n options = $.extend({}, {\n width: '100%',\n height: '100%',\n top: container.scrollTop(),\n opacity: false\n }, options);\n cssClass = options.opacity ? 'k-loading-mask k-opaque' : 'k-loading-mask';\n if (toggle) {\n if (!mask.length) {\n isRtl = support.isRtl(container);\n leftRight = isRtl ? 'right' : 'left';\n containerScrollLeft = container.scrollLeft();\n webkitCorrection = browser.webkit ? !isRtl ? 0 : container[0].scrollWidth - container.width() - 2 * containerScrollLeft : 0;\n mask = $(kendo.format('
{1}
', cssClass, kendo.ui.progress.messages.loading)).width(options.width).height(options.height).css('top', options.top).css(leftRight, Math.abs(containerScrollLeft) + webkitCorrection).prependTo(container);\n }\n } else if (mask) {\n mask.remove();\n }\n },\n plugin: function (widget, register, prefix) {\n var name = widget.fn.options.name, getter;\n register = register || kendo.ui;\n prefix = prefix || '';\n register[name] = widget;\n register.roles[name.toLowerCase()] = widget;\n getter = 'getKendo' + prefix + name;\n name = 'kendo' + prefix + name;\n var widgetEntry = {\n name: name,\n widget: widget,\n prefix: prefix || ''\n };\n kendo.widgets.push(widgetEntry);\n for (var i = 0, len = kendo._widgetRegisteredCallbacks.length; i < len; i++) {\n kendo._widgetRegisteredCallbacks[i](widgetEntry);\n }\n $.fn[name] = function (options) {\n var value = this, args;\n if (typeof options === STRING) {\n args = slice.call(arguments, 1);\n this.each(function () {\n var widget = $.data(this, name), method, result;\n if (!widget) {\n throw new Error(kendo.format('Cannot call method \\'{0}\\' of {1} before it is initialized', options, name));\n }\n method = widget[options];\n if (typeof method !== FUNCTION) {\n throw new Error(kendo.format('Cannot find method \\'{0}\\' of {1}', options, name));\n }\n result = method.apply(widget, args);\n if (result !== undefined) {\n value = result;\n return false;\n }\n });\n } else {\n this.each(function () {\n return new widget(this, options);\n });\n }\n return value;\n };\n $.fn[name].widget = widget;\n $.fn[getter] = function () {\n return this.data(name);\n };\n }\n });\n kendo.ui.progress.messages = { loading: 'Loading...' };\n var ContainerNullObject = {\n bind: function () {\n return this;\n },\n nullObject: true,\n options: {}\n };\n var MobileWidget = Widget.extend({\n init: function (element, options) {\n Widget.fn.init.call(this, element, options);\n this.element.autoApplyNS();\n this.wrapper = this.element;\n this.element.addClass('km-widget');\n },\n destroy: function () {\n Widget.fn.destroy.call(this);\n this.element.kendoDestroy();\n },\n options: { prefix: 'Mobile' },\n events: [],\n view: function () {\n var viewElement = this.element.closest(kendo.roleSelector('view splitview modalview drawer'));\n return kendo.widgetInstance(viewElement, kendo.mobile.ui) || ContainerNullObject;\n },\n viewHasNativeScrolling: function () {\n var view = this.view();\n return view && view.options.useNativeScrolling;\n },\n container: function () {\n var element = this.element.closest(kendo.roleSelector('view layout modalview drawer splitview'));\n return kendo.widgetInstance(element.eq(0), kendo.mobile.ui) || ContainerNullObject;\n }\n });\n extend(kendo.mobile, {\n init: function (element) {\n kendo.init(element, kendo.mobile.ui, kendo.ui, kendo.dataviz.ui);\n },\n appLevelNativeScrolling: function () {\n return kendo.mobile.application && kendo.mobile.application.options && kendo.mobile.application.options.useNativeScrolling;\n },\n roles: {},\n ui: {\n Widget: MobileWidget,\n DataBoundWidget: DataBoundWidget.extend(MobileWidget.prototype),\n roles: {},\n plugin: function (widget) {\n kendo.ui.plugin(widget, kendo.mobile.ui, 'Mobile');\n }\n }\n });\n deepExtend(kendo.dataviz, {\n init: function (element) {\n kendo.init(element, kendo.dataviz.ui);\n },\n ui: {\n roles: {},\n themes: {},\n views: [],\n plugin: function (widget) {\n kendo.ui.plugin(widget, kendo.dataviz.ui);\n }\n },\n roles: {}\n });\n kendo.touchScroller = function (elements, options) {\n if (!options) {\n options = {};\n }\n options.useNative = true;\n return $(elements).map(function (idx, element) {\n element = $(element);\n if (support.kineticScrollNeeded && kendo.mobile.ui.Scroller && !element.data('kendoMobileScroller')) {\n element.kendoMobileScroller(options);\n return element.data('kendoMobileScroller');\n } else {\n return false;\n }\n })[0];\n };\n kendo.preventDefault = function (e) {\n e.preventDefault();\n };\n kendo.widgetInstance = function (element, suites) {\n var role = element.data(kendo.ns + 'role'), widgets = [], i, length, elementData = element.data('kendoView');\n if (role) {\n if (role === 'content') {\n role = 'scroller';\n }\n if (role === 'editortoolbar') {\n var editorToolbar = element.data('kendoEditorToolbar');\n if (editorToolbar) {\n return editorToolbar;\n }\n }\n if (role === 'view' && elementData) {\n return elementData;\n }\n if (suites) {\n if (suites[0]) {\n for (i = 0, length = suites.length; i < length; i++) {\n widgets.push(suites[i].roles[role]);\n }\n } else {\n widgets.push(suites.roles[role]);\n }\n } else {\n widgets = [\n kendo.ui.roles[role],\n kendo.dataviz.ui.roles[role],\n kendo.mobile.ui.roles[role]\n ];\n }\n if (role.indexOf('.') >= 0) {\n widgets = [kendo.getter(role)(window)];\n }\n for (i = 0, length = widgets.length; i < length; i++) {\n var widget = widgets[i];\n if (widget) {\n var instance = element.data('kendo' + widget.fn.options.prefix + widget.fn.options.name);\n if (instance) {\n return instance;\n }\n }\n }\n }\n };\n kendo.onResize = function (callback) {\n var handler = callback;\n if (support.mobileOS.android) {\n handler = function () {\n setTimeout(callback, 600);\n };\n }\n $(window).on(support.resize, handler);\n return handler;\n };\n kendo.unbindResize = function (callback) {\n $(window).off(support.resize, callback);\n };\n kendo.attrValue = function (element, key) {\n return element.data(kendo.ns + key);\n };\n kendo.days = {\n Sunday: 0,\n Monday: 1,\n Tuesday: 2,\n Wednesday: 3,\n Thursday: 4,\n Friday: 5,\n Saturday: 6\n };\n function focusable(element, isTabIndexNotNaN) {\n var nodeName = element.nodeName.toLowerCase();\n return (/input|select|textarea|button|object/.test(nodeName) ? !element.disabled : 'a' === nodeName ? element.href || isTabIndexNotNaN : isTabIndexNotNaN) && visible(element);\n }\n function visible(element) {\n return $.expr.pseudos.visible(element) && !$(element).parents().addBack().filter(function () {\n return $.css(this, 'visibility') === 'hidden';\n }).length;\n }\n $.extend($.expr.pseudos, {\n kendoFocusable: function (element) {\n var idx = $.attr(element, 'tabindex');\n return focusable(element, !isNaN(idx) && idx > -1);\n }\n });\n var MOUSE_EVENTS = [\n 'mousedown',\n 'mousemove',\n 'mouseenter',\n 'mouseleave',\n 'mouseover',\n 'mouseout',\n 'mouseup',\n 'click'\n ];\n var EXCLUDE_BUST_CLICK_SELECTOR = 'label, input, [data-rel=external]';\n var MouseEventNormalizer = {\n setupMouseMute: function () {\n var idx = 0, length = MOUSE_EVENTS.length, element = document.documentElement;\n if (MouseEventNormalizer.mouseTrap || !support.eventCapture) {\n return;\n }\n MouseEventNormalizer.mouseTrap = true;\n MouseEventNormalizer.bustClick = false;\n MouseEventNormalizer.captureMouse = false;\n var handler = function (e) {\n if (MouseEventNormalizer.captureMouse) {\n if (e.type === 'click') {\n if (MouseEventNormalizer.bustClick && !$(e.target).is(EXCLUDE_BUST_CLICK_SELECTOR)) {\n e.preventDefault();\n e.stopPropagation();\n }\n } else {\n e.stopPropagation();\n }\n }\n };\n for (; idx < length; idx++) {\n element.addEventListener(MOUSE_EVENTS[idx], handler, true);\n }\n },\n muteMouse: function (e) {\n MouseEventNormalizer.captureMouse = true;\n if (e.data.bustClick) {\n MouseEventNormalizer.bustClick = true;\n }\n clearTimeout(MouseEventNormalizer.mouseTrapTimeoutID);\n },\n unMuteMouse: function () {\n clearTimeout(MouseEventNormalizer.mouseTrapTimeoutID);\n MouseEventNormalizer.mouseTrapTimeoutID = setTimeout(function () {\n MouseEventNormalizer.captureMouse = false;\n MouseEventNormalizer.bustClick = false;\n }, 400);\n }\n };\n var eventMap = {\n down: 'touchstart mousedown',\n move: 'mousemove touchmove',\n up: 'mouseup touchend touchcancel',\n cancel: 'mouseleave touchcancel'\n };\n if (support.touch && (support.mobileOS.ios || support.mobileOS.android)) {\n eventMap = {\n down: 'touchstart',\n move: 'touchmove',\n up: 'touchend touchcancel',\n cancel: 'touchcancel'\n };\n } else if (support.pointers) {\n eventMap = {\n down: 'pointerdown',\n move: 'pointermove',\n up: 'pointerup',\n cancel: 'pointercancel pointerleave'\n };\n } else if (support.msPointers) {\n eventMap = {\n down: 'MSPointerDown',\n move: 'MSPointerMove',\n up: 'MSPointerUp',\n cancel: 'MSPointerCancel MSPointerLeave'\n };\n }\n if (support.msPointers && !('onmspointerenter' in window)) {\n $.each({\n MSPointerEnter: 'MSPointerOver',\n MSPointerLeave: 'MSPointerOut'\n }, function (orig, fix) {\n $.event.special[orig] = {\n delegateType: fix,\n bindType: fix,\n handle: function (event) {\n var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj;\n if (!related || related !== target && !$.contains(target, related)) {\n event.type = handleObj.origType;\n ret = handleObj.handler.apply(this, arguments);\n event.type = fix;\n }\n return ret;\n }\n };\n });\n }\n var getEventMap = function (e) {\n return eventMap[e] || e;\n }, eventRegEx = /([^ ]+)/g;\n kendo.applyEventMap = function (events, ns) {\n events = events.replace(eventRegEx, getEventMap);\n if (ns) {\n events = events.replace(eventRegEx, '$1.' + ns);\n }\n return events;\n };\n kendo.keyDownHandler = function (e, widget) {\n var events = widget._events.kendoKeydown;\n if (!events) {\n return true;\n }\n events = events.slice();\n e.sender = widget;\n e.preventKendoKeydown = false;\n for (var idx = 0, length = events.length; idx < length; idx++) {\n events[idx].call(widget, e);\n }\n return !e.preventKendoKeydown;\n };\n var on = $.fn.on;\n function kendoJQuery(selector, context) {\n return new kendoJQuery.fn.init(selector, context);\n }\n noDepricateExtend(true, kendoJQuery, $);\n kendoJQuery.fn = kendoJQuery.prototype = new $();\n kendoJQuery.fn.constructor = kendoJQuery;\n kendoJQuery.fn.init = function (selector, context) {\n if (context && context instanceof $ && !(context instanceof kendoJQuery)) {\n context = kendoJQuery(context);\n }\n return $.fn.init.call(this, selector, context, rootjQuery);\n };\n kendoJQuery.fn.init.prototype = kendoJQuery.fn;\n var rootjQuery = kendoJQuery(document);\n extend(kendoJQuery.fn, {\n handler: function (handler) {\n this.data('handler', handler);\n return this;\n },\n autoApplyNS: function (ns) {\n this.data('kendoNS', ns || kendo.guid());\n return this;\n },\n on: function () {\n var that = this, ns = that.data('kendoNS');\n if (arguments.length === 1) {\n return on.call(that, arguments[0]);\n }\n var context = that, args = slice.call(arguments);\n if (typeof args[args.length - 1] === UNDEFINED) {\n args.pop();\n }\n var callback = args[args.length - 1], events = kendo.applyEventMap(args[0], ns);\n if (support.mouseAndTouchPresent && events.search(/mouse|click/) > -1 && this[0] !== document.documentElement) {\n MouseEventNormalizer.setupMouseMute();\n var selector = args.length === 2 ? null : args[1], bustClick = events.indexOf('click') > -1 && events.indexOf('touchend') > -1;\n on.call(this, {\n touchstart: MouseEventNormalizer.muteMouse,\n touchend: MouseEventNormalizer.unMuteMouse\n }, selector, { bustClick: bustClick });\n }\n if (arguments[0].indexOf('keydown') !== -1 && args[1] && args[1].options) {\n args[0] = events;\n var widget = args[1];\n var keyDownCallBack = args[args.length - 1];\n args[args.length - 1] = function (e) {\n if (kendo.keyDownHandler(e, widget)) {\n return keyDownCallBack.apply(this, [e]);\n }\n };\n on.apply(that, args);\n return that;\n }\n if (typeof callback === STRING) {\n context = that.data('handler');\n callback = context[callback];\n args[args.length - 1] = function (e) {\n callback.call(context, e);\n };\n }\n args[0] = events;\n on.apply(that, args);\n return that;\n },\n kendoDestroy: function (ns) {\n ns = ns || this.data('kendoNS');\n if (ns) {\n this.off('.' + ns);\n }\n return this;\n }\n });\n kendo.jQuery = kendoJQuery;\n kendo.eventMap = eventMap;\n kendo.timezone = function () {\n var months = {\n Jan: 0,\n Feb: 1,\n Mar: 2,\n Apr: 3,\n May: 4,\n Jun: 5,\n Jul: 6,\n Aug: 7,\n Sep: 8,\n Oct: 9,\n Nov: 10,\n Dec: 11\n };\n var days = {\n Sun: 0,\n Mon: 1,\n Tue: 2,\n Wed: 3,\n Thu: 4,\n Fri: 5,\n Sat: 6\n };\n function ruleToDate(year, rule) {\n var date;\n var targetDay;\n var ourDay;\n var month = rule[3];\n var on = rule[4];\n var time = rule[5];\n var cache = rule[8];\n if (!cache) {\n rule[8] = cache = {};\n }\n if (cache[year]) {\n return cache[year];\n }\n if (!isNaN(on)) {\n date = new Date(Date.UTC(year, months[month], on, time[0], time[1], time[2], 0));\n } else if (on.indexOf('last') === 0) {\n date = new Date(Date.UTC(year, months[month] + 1, 1, time[0] - 24, time[1], time[2], 0));\n targetDay = days[on.substr(4, 3)];\n ourDay = date.getUTCDay();\n date.setUTCDate(date.getUTCDate() + targetDay - ourDay - (targetDay > ourDay ? 7 : 0));\n } else if (on.indexOf('>=') >= 0) {\n date = new Date(Date.UTC(year, months[month], on.substr(5), time[0], time[1], time[2], 0));\n targetDay = days[on.substr(0, 3)];\n ourDay = date.getUTCDay();\n date.setUTCDate(date.getUTCDate() + targetDay - ourDay + (targetDay < ourDay ? 7 : 0));\n } else if (on.indexOf('<=') >= 0) {\n date = new Date(Date.UTC(year, months[month], on.substr(5), time[0], time[1], time[2], 0));\n targetDay = days[on.substr(0, 3)];\n ourDay = date.getUTCDay();\n date.setUTCDate(date.getUTCDate() + targetDay - ourDay - (targetDay > ourDay ? 7 : 0));\n }\n return cache[year] = date;\n }\n function findRule(utcTime, rules, zone) {\n rules = rules[zone];\n if (!rules) {\n var time = zone.split(':');\n var offset = 0;\n if (time.length > 1) {\n offset = time[0] * 60 + Number(time[1]);\n }\n return [\n -1000000,\n 'max',\n '-',\n 'Jan',\n 1,\n [\n 0,\n 0,\n 0\n ],\n offset,\n '-'\n ];\n }\n var year = new Date(utcTime).getUTCFullYear();\n rules = jQuery.grep(rules, function (rule) {\n var from = rule[0];\n var to = rule[1];\n return from <= year && (to >= year || from == year && to == 'only' || to == 'max');\n });\n rules.push(utcTime);\n rules.sort(function (a, b) {\n if (typeof a != 'number') {\n a = Number(ruleToDate(year, a));\n }\n if (typeof b != 'number') {\n b = Number(ruleToDate(year, b));\n }\n return a - b;\n });\n var rule = rules[jQuery.inArray(utcTime, rules) - 1] || rules[rules.length - 1];\n return isNaN(rule) ? rule : null;\n }\n function findZone(utcTime, zones, timezone) {\n var zoneRules = zones[timezone];\n if (typeof zoneRules === 'string') {\n zoneRules = zones[zoneRules];\n }\n if (!zoneRules) {\n throw new Error('Timezone \"' + timezone + '\" is either incorrect, or kendo.timezones.min.js is not included.');\n }\n for (var idx = zoneRules.length - 1; idx >= 0; idx--) {\n var until = zoneRules[idx][3];\n if (until && utcTime > until) {\n break;\n }\n }\n var zone = zoneRules[idx + 1];\n if (!zone) {\n throw new Error('Timezone \"' + timezone + '\" not found on ' + utcTime + '.');\n }\n return zone;\n }\n function zoneAndRule(utcTime, zones, rules, timezone) {\n if (typeof utcTime != NUMBER) {\n utcTime = Date.UTC(utcTime.getFullYear(), utcTime.getMonth(), utcTime.getDate(), utcTime.getHours(), utcTime.getMinutes(), utcTime.getSeconds(), utcTime.getMilliseconds());\n }\n var zone = findZone(utcTime, zones, timezone);\n return {\n zone: zone,\n rule: findRule(utcTime, rules, zone[1])\n };\n }\n function offset(utcTime, timezone) {\n if (timezone == 'Etc/UTC' || timezone == 'Etc/GMT') {\n return 0;\n }\n var info = zoneAndRule(utcTime, this.zones, this.rules, timezone);\n var zone = info.zone;\n var rule = info.rule;\n return kendo.parseFloat(rule ? zone[0] - rule[6] : zone[0]);\n }\n function abbr(utcTime, timezone) {\n var info = zoneAndRule(utcTime, this.zones, this.rules, timezone);\n var zone = info.zone;\n var rule = info.rule;\n var base = zone[2];\n if (base.indexOf('/') >= 0) {\n return base.split('/')[rule && +rule[6] ? 1 : 0];\n } else if (base.indexOf('%s') >= 0) {\n return base.replace('%s', !rule || rule[7] == '-' ? '' : rule[7]);\n }\n return base;\n }\n function convert(date, fromOffset, toOffset) {\n var tempToOffset = toOffset;\n var diff;\n if (typeof fromOffset == STRING) {\n fromOffset = this.offset(date, fromOffset);\n }\n if (typeof toOffset == STRING) {\n toOffset = this.offset(date, toOffset);\n }\n var fromLocalOffset = date.getTimezoneOffset();\n date = new Date(date.getTime() + (fromOffset - toOffset) * 60000);\n var toLocalOffset = date.getTimezoneOffset();\n if (typeof tempToOffset == STRING) {\n tempToOffset = this.offset(date, tempToOffset);\n }\n diff = toLocalOffset - fromLocalOffset + (toOffset - tempToOffset);\n return new Date(date.getTime() + diff * 60000);\n }\n function apply(date, timezone) {\n return this.convert(date, date.getTimezoneOffset(), timezone);\n }\n function remove(date, timezone) {\n return this.convert(date, timezone, date.getTimezoneOffset());\n }\n function toLocalDate(time) {\n return this.apply(new Date(time), 'Etc/UTC');\n }\n return {\n zones: {},\n rules: {},\n offset: offset,\n convert: convert,\n apply: apply,\n remove: remove,\n abbr: abbr,\n toLocalDate: toLocalDate\n };\n }();\n kendo.date = function () {\n var MS_PER_MINUTE = 60000, MS_PER_DAY = 86400000;\n function adjustDST(date, hours) {\n if (hours === 0 && date.getHours() === 23) {\n date.setHours(date.getHours() + 2);\n return true;\n }\n return false;\n }\n function setDayOfWeek(date, day, dir) {\n var hours = date.getHours();\n dir = dir || 1;\n day = (day - date.getDay() + 7 * dir) % 7;\n date.setDate(date.getDate() + day);\n adjustDST(date, hours);\n }\n function dayOfWeek(date, day, dir) {\n date = new Date(date);\n setDayOfWeek(date, day, dir);\n return date;\n }\n function firstDayOfMonth(date) {\n return new Date(date.getFullYear(), date.getMonth(), 1);\n }\n function lastDayOfMonth(date) {\n var last = new Date(date.getFullYear(), date.getMonth() + 1, 0), first = firstDayOfMonth(date), timeOffset = Math.abs(last.getTimezoneOffset() - first.getTimezoneOffset());\n if (timeOffset) {\n last.setHours(first.getHours() + timeOffset / 60);\n }\n return last;\n }\n function moveDateToWeekStart(date, weekStartDay) {\n if (weekStartDay !== 1) {\n return addDays(dayOfWeek(date, weekStartDay, -1), 4);\n }\n return addDays(date, 4 - (date.getDay() || 7));\n }\n function calcWeekInYear(date, weekStartDay) {\n var firstWeekInYear = new Date(date.getFullYear(), 0, 1, -6);\n var newDate = moveDateToWeekStart(date, weekStartDay);\n var diffInMS = newDate.getTime() - firstWeekInYear.getTime();\n var days = Math.floor(diffInMS / MS_PER_DAY);\n return 1 + Math.floor(days / 7);\n }\n function weekInYear(date, weekStartDay) {\n if (weekStartDay === undefined) {\n weekStartDay = kendo.culture().calendar.firstDay;\n }\n var prevWeekDate = addDays(date, -7);\n var nextWeekDate = addDays(date, 7);\n var weekNumber = calcWeekInYear(date, weekStartDay);\n if (weekNumber === 0) {\n return calcWeekInYear(prevWeekDate, weekStartDay) + 1;\n }\n if (weekNumber === 53 && calcWeekInYear(nextWeekDate, weekStartDay) > 1) {\n return 1;\n }\n return weekNumber;\n }\n function getDate(date) {\n date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\n adjustDST(date, 0);\n return date;\n }\n function toUtcTime(date) {\n return Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n }\n function getMilliseconds(date) {\n return toInvariantTime(date).getTime() - getDate(toInvariantTime(date));\n }\n function isInTimeRange(value, min, max) {\n var msMin = getMilliseconds(min), msMax = getMilliseconds(max), msValue;\n if (!value || msMin == msMax) {\n return true;\n }\n if (min >= max) {\n max += MS_PER_DAY;\n }\n msValue = getMilliseconds(value);\n if (msMin > msValue) {\n msValue += MS_PER_DAY;\n }\n if (msMax < msMin) {\n msMax += MS_PER_DAY;\n }\n return msValue >= msMin && msValue <= msMax;\n }\n function isInDateRange(value, min, max) {\n var msMin = min.getTime(), msMax = max.getTime(), msValue;\n if (msMin >= msMax) {\n msMax += MS_PER_DAY;\n }\n msValue = value.getTime();\n return msValue >= msMin && msValue <= msMax;\n }\n function addDays(date, offset) {\n var hours = date.getHours();\n date = new Date(date);\n setTime(date, offset * MS_PER_DAY);\n adjustDST(date, hours);\n return date;\n }\n function setTime(date, milliseconds, ignoreDST) {\n var offset = date.getTimezoneOffset();\n var difference;\n date.setTime(date.getTime() + milliseconds);\n if (!ignoreDST) {\n difference = date.getTimezoneOffset() - offset;\n date.setTime(date.getTime() + difference * MS_PER_MINUTE);\n }\n }\n function setHours(date, time) {\n date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds());\n adjustDST(date, time.getHours());\n return date;\n }\n function today() {\n return getDate(new Date());\n }\n function isToday(date) {\n return getDate(date).getTime() == today().getTime();\n }\n function toInvariantTime(date) {\n var staticDate = new Date(1980, 1, 1, 0, 0, 0);\n if (date) {\n staticDate.setHours(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n }\n return staticDate;\n }\n return {\n adjustDST: adjustDST,\n dayOfWeek: dayOfWeek,\n setDayOfWeek: setDayOfWeek,\n getDate: getDate,\n isInDateRange: isInDateRange,\n isInTimeRange: isInTimeRange,\n isToday: isToday,\n nextDay: function (date) {\n return addDays(date, 1);\n },\n previousDay: function (date) {\n return addDays(date, -1);\n },\n toUtcTime: toUtcTime,\n MS_PER_DAY: MS_PER_DAY,\n MS_PER_HOUR: 60 * MS_PER_MINUTE,\n MS_PER_MINUTE: MS_PER_MINUTE,\n setTime: setTime,\n setHours: setHours,\n addDays: addDays,\n today: today,\n toInvariantTime: toInvariantTime,\n firstDayOfMonth: firstDayOfMonth,\n lastDayOfMonth: lastDayOfMonth,\n weekInYear: weekInYear,\n getMilliseconds: getMilliseconds\n };\n }();\n kendo.stripWhitespace = function (element) {\n if (document.createNodeIterator) {\n var iterator = document.createNodeIterator(element, NodeFilter.SHOW_TEXT, function (node) {\n return node.parentNode == element ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n }, false);\n while (iterator.nextNode()) {\n if (iterator.referenceNode && !iterator.referenceNode.textContent.trim()) {\n iterator.referenceNode.parentNode.removeChild(iterator.referenceNode);\n }\n }\n } else {\n for (var i = 0; i < element.childNodes.length; i++) {\n var child = element.childNodes[i];\n if (child.nodeType == 3 && !/\\S/.test(child.nodeValue)) {\n element.removeChild(child);\n i--;\n }\n if (child.nodeType == 1) {\n kendo.stripWhitespace(child);\n }\n }\n }\n };\n var animationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) {\n setTimeout(callback, 1000 / 60);\n };\n kendo.animationFrame = function (callback) {\n animationFrame.call(window, callback);\n };\n var animationQueue = [];\n kendo.queueAnimation = function (callback) {\n animationQueue[animationQueue.length] = callback;\n if (animationQueue.length === 1) {\n kendo.runNextAnimation();\n }\n };\n kendo.runNextAnimation = function () {\n kendo.animationFrame(function () {\n if (animationQueue[0]) {\n animationQueue.shift()();\n if (animationQueue[0]) {\n kendo.runNextAnimation();\n }\n }\n });\n };\n kendo.parseQueryStringParams = function (url) {\n var queryString = url.split('?')[1] || '', params = {}, paramParts = queryString.split(/&|=/), length = paramParts.length, idx = 0;\n for (; idx < length; idx += 2) {\n if (paramParts[idx] !== '') {\n params[decodeURIComponent(paramParts[idx])] = decodeURIComponent(paramParts[idx + 1]);\n }\n }\n return params;\n };\n kendo.elementUnderCursor = function (e) {\n if (typeof e.x.client != 'undefined') {\n return document.elementFromPoint(e.x.client, e.y.client);\n }\n };\n kendo.wheelDeltaY = function (jQueryEvent) {\n var e = jQueryEvent.originalEvent, deltaY = e.wheelDeltaY, delta;\n if (e.wheelDelta) {\n if (deltaY === undefined || deltaY) {\n delta = e.wheelDelta;\n }\n } else if (e.detail && e.axis === e.VERTICAL_AXIS) {\n delta = -e.detail * 10;\n }\n return delta;\n };\n kendo.throttle = function (fn, delay) {\n var timeout;\n var lastExecTime = 0;\n if (!delay || delay <= 0) {\n return fn;\n }\n var throttled = function () {\n var that = this;\n var elapsed = +new Date() - lastExecTime;\n var args = arguments;\n function exec() {\n fn.apply(that, args);\n lastExecTime = +new Date();\n }\n if (!lastExecTime) {\n return exec();\n }\n if (timeout) {\n clearTimeout(timeout);\n }\n if (elapsed > delay) {\n exec();\n } else {\n timeout = setTimeout(exec, delay - elapsed);\n }\n };\n throttled.cancel = function () {\n clearTimeout(timeout);\n };\n return throttled;\n };\n kendo.caret = function (element, start, end) {\n var rangeElement;\n var isPosition = start !== undefined;\n if (end === undefined) {\n end = start;\n }\n if (element[0]) {\n element = element[0];\n }\n if (isPosition && element.disabled) {\n return;\n }\n try {\n if (element.selectionStart !== undefined) {\n if (isPosition) {\n element.focus();\n var mobile = support.mobileOS;\n if (mobile.wp || mobile.android) {\n setTimeout(function () {\n element.setSelectionRange(start, end);\n }, 0);\n } else {\n element.setSelectionRange(start, end);\n }\n } else {\n start = [\n element.selectionStart,\n element.selectionEnd\n ];\n }\n } else if (document.selection) {\n if ($(element).is(':visible')) {\n element.focus();\n }\n rangeElement = element.createTextRange();\n if (isPosition) {\n rangeElement.collapse(true);\n rangeElement.moveStart('character', start);\n rangeElement.moveEnd('character', end - start);\n rangeElement.select();\n } else {\n var rangeDuplicated = rangeElement.duplicate(), selectionStart, selectionEnd;\n rangeElement.moveToBookmark(document.selection.createRange().getBookmark());\n rangeDuplicated.setEndPoint('EndToStart', rangeElement);\n selectionStart = rangeDuplicated.text.length;\n selectionEnd = selectionStart + rangeElement.text.length;\n start = [\n selectionStart,\n selectionEnd\n ];\n }\n }\n } catch (e) {\n start = [];\n }\n return start;\n };\n kendo.compileMobileDirective = function (element, scope) {\n var angular = window.angular;\n element.attr('data-' + kendo.ns + 'role', element[0].tagName.toLowerCase().replace('kendo-mobile-', '').replace('-', ''));\n angular.element(element).injector().invoke([\n '$compile',\n function ($compile) {\n $compile(element)(scope);\n if (!/^\\$(digest|apply)$/.test(scope.$$phase)) {\n scope.$digest();\n }\n }\n ]);\n return kendo.widgetInstance(element, kendo.mobile.ui);\n };\n kendo.antiForgeryTokens = function () {\n var tokens = {}, csrf_token = $('meta[name=csrf-token],meta[name=_csrf]').attr('content'), csrf_param = $('meta[name=csrf-param],meta[name=_csrf_header]').attr('content');\n $('input[name^=\\'__RequestVerificationToken\\']').each(function () {\n tokens[this.name] = this.value;\n });\n if (csrf_param !== undefined && csrf_token !== undefined) {\n tokens[csrf_param] = csrf_token;\n }\n return tokens;\n };\n kendo.cycleForm = function (form) {\n var firstElement = form.find('input, .k-widget').first();\n var lastElement = form.find('button, .k-button').last();\n function focus(el) {\n var widget = kendo.widgetInstance(el);\n if (widget && widget.focus) {\n widget.focus();\n } else {\n el.focus();\n }\n }\n lastElement.on('keydown', function (e) {\n if (e.keyCode == kendo.keys.TAB && !e.shiftKey) {\n e.preventDefault();\n focus(firstElement);\n }\n });\n firstElement.on('keydown', function (e) {\n if (e.keyCode == kendo.keys.TAB && e.shiftKey) {\n e.preventDefault();\n focus(lastElement);\n }\n });\n };\n kendo.focusElement = function (element) {\n var scrollTopPositions = [];\n var scrollableParents = element.parentsUntil('body').filter(function (index, element) {\n var computedStyle = kendo.getComputedStyles(element, ['overflow']);\n return computedStyle.overflow !== 'visible';\n }).add(window);\n scrollableParents.each(function (index, parent) {\n scrollTopPositions[index] = $(parent).scrollTop();\n });\n try {\n element[0].setActive();\n } catch (e) {\n element[0].focus();\n }\n scrollableParents.each(function (index, parent) {\n $(parent).scrollTop(scrollTopPositions[index]);\n });\n };\n kendo.focusNextElement = function () {\n if (document.activeElement) {\n var focussable = $(':kendoFocusable');\n var index = focussable.index(document.activeElement);\n if (index > -1) {\n var nextElement = focussable[index + 1] || focussable[0];\n nextElement.focus();\n }\n }\n };\n kendo.matchesMedia = function (mediaQuery) {\n var media = kendo._bootstrapToMedia(mediaQuery) || mediaQuery;\n return support.matchMedia && window.matchMedia(media).matches;\n };\n kendo._bootstrapToMedia = function (bootstrapMedia) {\n return {\n 'xs': '(max-width: 576px)',\n 'sm': '(min-width: 576px)',\n 'md': '(min-width: 768px)',\n 'lg': '(min-width: 992px)',\n 'xl': '(min-width: 1200px)'\n }[bootstrapMedia];\n };\n kendo.fileGroupMap = {\n audio: [\n '.aif',\n '.iff',\n '.m3u',\n '.m4a',\n '.mid',\n '.mp3',\n '.mpa',\n '.wav',\n '.wma',\n '.ogg',\n '.wav',\n '.wma',\n '.wpl'\n ],\n video: [\n '.3g2',\n '.3gp',\n '.avi',\n '.asf',\n '.flv',\n '.m4u',\n '.rm',\n '.h264',\n '.m4v',\n '.mkv',\n '.mov',\n '.mp4',\n '.mpg',\n '.rm',\n '.swf',\n '.vob',\n '.wmv'\n ],\n image: [\n '.ai',\n '.dds',\n '.heic',\n '.jpe',\n 'jfif',\n '.jif',\n '.jp2',\n '.jps',\n '.eps',\n '.bmp',\n '.gif',\n '.jpeg',\n '.jpg',\n '.png',\n '.ps',\n '.psd',\n '.svg',\n '.svgz',\n '.tif',\n '.tiff'\n ],\n txt: [\n '.doc',\n '.docx',\n '.log',\n '.pages',\n '.tex',\n '.wpd',\n '.wps',\n '.odt',\n '.rtf',\n '.text',\n '.txt',\n '.wks'\n ],\n presentation: [\n '.key',\n '.odp',\n '.pps',\n '.ppt',\n '.pptx'\n ],\n data: [\n '.xlr',\n '.xls',\n '.xlsx'\n ],\n programming: [\n '.tmp',\n '.bak',\n '.msi',\n '.cab',\n '.cpl',\n '.cur',\n '.dll',\n '.dmp',\n '.drv',\n '.icns',\n '.ico',\n '.link',\n '.sys',\n '.cfg',\n '.ini',\n '.asp',\n '.aspx',\n '.cer',\n '.csr',\n '.css',\n '.dcr',\n '.htm',\n '.html',\n '.js',\n '.php',\n '.rss',\n '.xhtml'\n ],\n pdf: ['.pdf'],\n config: [\n '.apk',\n '.app',\n '.bat',\n '.cgi',\n '.com',\n '.exe',\n '.gadget',\n '.jar',\n '.wsf'\n ],\n zip: [\n '.7z',\n '.cbr',\n '.gz',\n '.sitx',\n '.arj',\n '.deb',\n '.pkg',\n '.rar',\n '.rpm',\n '.tar.gz',\n '.z',\n '.zip',\n '.zipx'\n ],\n 'disc-image': [\n '.dmg',\n '.iso',\n '.toast',\n '.vcd',\n '.bin',\n '.cue',\n '.mdf'\n ]\n };\n kendo.getFileGroup = function (extension, withPrefix) {\n var fileTypeMap = kendo.fileGroupMap;\n var groups = Object.keys(fileTypeMap);\n var type = 'file';\n if (extension === undefined || !extension.length) {\n return type;\n }\n for (var i = 0; i < groups.length; i += 1) {\n var extensions = fileTypeMap[groups[i]];\n if (extensions.indexOf(extension.toLowerCase()) > -1) {\n return withPrefix ? 'file-' + groups[i] : groups[i];\n }\n }\n return type;\n };\n kendo.getFileSizeMessage = function (size) {\n var sizes = [\n 'Bytes',\n 'KB',\n 'MB',\n 'GB',\n 'TB'\n ];\n if (size === 0) {\n return '0 Byte';\n }\n var i = parseInt(Math.floor(Math.log(size) / Math.log(1024)), 10);\n return Math.round(size / Math.pow(1024, i), 2) + ' ' + sizes[i];\n };\n (function () {\n function postToProxy(dataURI, fileName, proxyURL, proxyTarget) {\n var form = $('
').attr({\n action: proxyURL,\n method: 'POST',\n target: proxyTarget\n });\n var data = kendo.antiForgeryTokens();\n data.fileName = fileName;\n var parts = dataURI.split(';base64,');\n data.contentType = parts[0].replace('data:', '');\n data.base64 = parts[1];\n for (var name in data) {\n if (data.hasOwnProperty(name)) {\n $('').attr({\n value: data[name],\n name: name,\n type: 'hidden'\n }).appendTo(form);\n }\n }\n form.appendTo('body').submit().remove();\n }\n var fileSaver = document.createElement('a');\n var downloadAttribute = 'download' in fileSaver && !kendo.support.browser.edge;\n function saveAsBlob(dataURI, fileName) {\n var blob = dataURI;\n if (typeof dataURI == 'string') {\n var parts = dataURI.split(';base64,');\n var contentType = parts[0];\n var base64 = atob(parts[1]);\n var array = new Uint8Array(base64.length);\n for (var idx = 0; idx < base64.length; idx++) {\n array[idx] = base64.charCodeAt(idx);\n }\n blob = new Blob([array.buffer], { type: contentType });\n }\n navigator.msSaveBlob(blob, fileName);\n }\n function saveAsDataURI(dataURI, fileName) {\n if (window.Blob && dataURI instanceof Blob) {\n dataURI = URL.createObjectURL(dataURI);\n }\n fileSaver.download = fileName;\n fileSaver.href = dataURI;\n var e = document.createEvent('MouseEvents');\n e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n fileSaver.dispatchEvent(e);\n setTimeout(function () {\n URL.revokeObjectURL(dataURI);\n });\n }\n kendo.saveAs = function (options) {\n var save = postToProxy;\n if (!options.forceProxy) {\n if (downloadAttribute) {\n save = saveAsDataURI;\n } else if (navigator.msSaveBlob) {\n save = saveAsBlob;\n }\n }\n save(options.dataURI, options.fileName, options.proxyURL, options.proxyTarget);\n };\n }());\n kendo.proxyModelSetters = function proxyModelSetters(data) {\n var observable = {};\n Object.keys(data || {}).forEach(function (property) {\n Object.defineProperty(observable, property, {\n get: function () {\n return data[property];\n },\n set: function (value) {\n data[property] = value;\n data.dirty = true;\n }\n });\n });\n return observable;\n };\n (function () {\n kendo.defaults = kendo.defaults || {};\n kendo.setDefaults = function (key, value) {\n var path = key.split('.');\n var curr = kendo.defaults;\n key = path.pop();\n path.forEach(function (part) {\n if (curr[part] === undefined) {\n curr[part] = {};\n }\n curr = curr[part];\n });\n if (value.constructor === Object) {\n curr[key] = deepExtend({}, curr[key], value);\n } else {\n curr[key] = value;\n }\n };\n }());\n }(jQuery, window));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('kendo.userevents', ['kendo.core'], f);\n}(function () {\n var __meta__ = {\n id: 'userevents',\n name: 'User Events',\n category: 'framework',\n depends: ['core'],\n hidden: true\n };\n (function ($, undefined) {\n var kendo = window.kendo, support = kendo.support, Class = kendo.Class, Observable = kendo.Observable, now = $.now, extend = $.extend, OS = support.mobileOS, invalidZeroEvents = OS && OS.android, DEFAULT_MIN_HOLD = 800, CLICK_DELAY = 300, DEFAULT_THRESHOLD = support.browser.msie ? 5 : 0, PRESS = 'press', HOLD = 'hold', SELECT = 'select', START = 'start', MOVE = 'move', END = 'end', CANCEL = 'cancel', TAP = 'tap', DOUBLETAP = 'doubleTap', RELEASE = 'release', GESTURESTART = 'gesturestart', GESTURECHANGE = 'gesturechange', GESTUREEND = 'gestureend', GESTURETAP = 'gesturetap';\n var THRESHOLD = {\n 'api': 0,\n 'touch': 0,\n 'mouse': 9,\n 'pointer': 9\n };\n var ENABLE_GLOBAL_SURFACE = !support.touch || support.mouseAndTouchPresent;\n function touchDelta(touch1, touch2) {\n var x1 = touch1.x.location, y1 = touch1.y.location, x2 = touch2.x.location, y2 = touch2.y.location, dx = x1 - x2, dy = y1 - y2;\n return {\n center: {\n x: (x1 + x2) / 2,\n y: (y1 + y2) / 2\n },\n distance: Math.sqrt(dx * dx + dy * dy)\n };\n }\n function getTouches(e) {\n var touches = [], originalEvent = e.originalEvent, currentTarget = e.currentTarget, idx = 0, length, changedTouches, touch;\n if (e.api) {\n touches.push({\n id: 2,\n event: e,\n target: e.target,\n currentTarget: e.target,\n location: e,\n type: 'api'\n });\n } else if (e.type.match(/touch/)) {\n changedTouches = originalEvent ? originalEvent.changedTouches : [];\n for (length = changedTouches.length; idx < length; idx++) {\n touch = changedTouches[idx];\n touches.push({\n location: touch,\n event: e,\n target: touch.target,\n currentTarget: currentTarget,\n id: touch.identifier,\n type: 'touch'\n });\n }\n } else if (support.pointers || support.msPointers) {\n touches.push({\n location: originalEvent,\n event: e,\n target: e.target,\n currentTarget: currentTarget,\n id: originalEvent.pointerId,\n type: 'pointer'\n });\n } else {\n touches.push({\n id: 1,\n event: e,\n target: e.target,\n currentTarget: currentTarget,\n location: e,\n type: 'mouse'\n });\n }\n return touches;\n }\n var TouchAxis = Class.extend({\n init: function (axis, location) {\n var that = this;\n that.axis = axis;\n that._updateLocationData(location);\n that.startLocation = that.location;\n that.velocity = that.delta = 0;\n that.timeStamp = now();\n },\n move: function (location) {\n var that = this, offset = location['page' + that.axis], timeStamp = now(), timeDelta = timeStamp - that.timeStamp || 1;\n if (!offset && invalidZeroEvents) {\n return;\n }\n that.delta = offset - that.location;\n that._updateLocationData(location);\n that.initialDelta = offset - that.startLocation;\n that.velocity = that.delta / timeDelta;\n that.timeStamp = timeStamp;\n },\n _updateLocationData: function (location) {\n var that = this, axis = that.axis;\n that.location = location['page' + axis];\n that.client = location['client' + axis];\n that.screen = location['screen' + axis];\n }\n });\n var Touch = Class.extend({\n init: function (userEvents, target, touchInfo) {\n extend(this, {\n x: new TouchAxis('X', touchInfo.location),\n y: new TouchAxis('Y', touchInfo.location),\n type: touchInfo.type,\n useClickAsTap: userEvents.useClickAsTap,\n threshold: userEvents.threshold || THRESHOLD[touchInfo.type],\n userEvents: userEvents,\n target: target,\n currentTarget: touchInfo.currentTarget,\n initialTouch: touchInfo.target,\n id: touchInfo.id,\n pressEvent: touchInfo,\n _clicks: userEvents._clicks,\n supportDoubleTap: userEvents.supportDoubleTap,\n _moved: false,\n _finished: false\n });\n },\n press: function () {\n this._holdTimeout = setTimeout($.proxy(this, '_hold'), this.userEvents.minHold);\n this._trigger(PRESS, this.pressEvent);\n },\n _tap: function (touchInfo) {\n var that = this;\n that.userEvents._clicks++;\n if (that.userEvents._clicks == 1) {\n that._clickTimeout = setTimeout(function () {\n if (that.userEvents._clicks == 1) {\n that._trigger(TAP, touchInfo);\n } else {\n that._trigger(DOUBLETAP, touchInfo);\n }\n that.userEvents._clicks = 0;\n }, CLICK_DELAY);\n }\n },\n _hold: function () {\n this._trigger(HOLD, this.pressEvent);\n },\n move: function (touchInfo) {\n var that = this;\n var preventMove = touchInfo.type !== 'api' && that.userEvents._shouldNotMove;\n if (that._finished || preventMove) {\n return;\n }\n that.x.move(touchInfo.location);\n that.y.move(touchInfo.location);\n if (!that._moved) {\n if (that._withinIgnoreThreshold()) {\n return;\n }\n if (!UserEvents.current || UserEvents.current === that.userEvents) {\n that._start(touchInfo);\n } else {\n return that.dispose();\n }\n }\n if (!that._finished) {\n that._trigger(MOVE, touchInfo);\n }\n },\n end: function (touchInfo) {\n this.endTime = now();\n if (this._finished) {\n return;\n }\n this._finished = true;\n this._trigger(RELEASE, touchInfo);\n if (this._moved) {\n this._trigger(END, touchInfo);\n } else {\n if (!this.useClickAsTap) {\n if (this.supportDoubleTap) {\n this._tap(touchInfo);\n } else {\n this._trigger(TAP, touchInfo);\n }\n }\n }\n clearTimeout(this._holdTimeout);\n this.dispose();\n },\n dispose: function () {\n var userEvents = this.userEvents, activeTouches = userEvents.touches;\n this._finished = true;\n this.pressEvent = null;\n clearTimeout(this._holdTimeout);\n activeTouches.splice($.inArray(this, activeTouches), 1);\n },\n skip: function () {\n this.dispose();\n },\n cancel: function () {\n this.dispose();\n },\n isMoved: function () {\n return this._moved;\n },\n _start: function (touchInfo) {\n clearTimeout(this._holdTimeout);\n this.startTime = now();\n this._moved = true;\n this._trigger(START, touchInfo);\n },\n _trigger: function (name, touchInfo) {\n var that = this, jQueryEvent = touchInfo.event, data = {\n touch: that,\n x: that.x,\n y: that.y,\n target: that.target,\n event: jQueryEvent\n };\n if (that.userEvents.notify(name, data)) {\n jQueryEvent.preventDefault();\n }\n },\n _withinIgnoreThreshold: function () {\n var xDelta = this.x.initialDelta, yDelta = this.y.initialDelta;\n return Math.sqrt(xDelta * xDelta + yDelta * yDelta) <= this.threshold;\n }\n });\n function withEachUpEvent(callback) {\n var downEvents = kendo.eventMap.up.split(' '), idx = 0, length = downEvents.length;\n for (; idx < length; idx++) {\n callback(downEvents[idx]);\n }\n }\n var UserEvents = Observable.extend({\n init: function (element, options) {\n var that = this, filter, ns = kendo.guid();\n options = options || {};\n filter = that.filter = options.filter;\n that.threshold = options.threshold || DEFAULT_THRESHOLD;\n that.minHold = options.minHold || DEFAULT_MIN_HOLD;\n that.touches = [];\n that._maxTouches = options.multiTouch ? 2 : 1;\n that.allowSelection = options.allowSelection;\n that.captureUpIfMoved = options.captureUpIfMoved;\n that.useClickAsTap = !options.fastTap && !support.delayedClick();\n that.eventNS = ns;\n that._clicks = 0;\n that.supportDoubleTap = options.supportDoubleTap;\n element = $(element).handler(that);\n Observable.fn.init.call(that);\n extend(that, {\n element: element,\n surface: options.global && ENABLE_GLOBAL_SURFACE ? $(element[0].ownerDocument.documentElement) : $(options.surface || element),\n stopPropagation: options.stopPropagation,\n pressed: false\n });\n that.surface.handler(that).on(kendo.applyEventMap('move', ns), '_move').on(kendo.applyEventMap('up cancel', ns), '_end');\n element.on(kendo.applyEventMap('down', ns), filter, '_start');\n if (that.useClickAsTap) {\n element.on(kendo.applyEventMap('click', ns), filter, '_click');\n }\n if (support.pointers || support.msPointers) {\n if (support.browser.version < 11) {\n var defaultAction = 'pinch-zoom double-tap-zoom';\n element.css('-ms-touch-action', options.touchAction && options.touchAction != 'none' ? defaultAction + ' ' + options.touchAction : defaultAction);\n } else {\n element.css('touch-action', options.touchAction || 'none');\n }\n }\n if (options.preventDragEvent) {\n element.on(kendo.applyEventMap('dragstart', ns), kendo.preventDefault);\n }\n element.on(kendo.applyEventMap('mousedown', ns), filter, { root: element }, '_select');\n if (that.captureUpIfMoved && support.eventCapture) {\n var surfaceElement = that.surface[0], preventIfMovingProxy = $.proxy(that.preventIfMoving, that);\n withEachUpEvent(function (eventName) {\n surfaceElement.addEventListener(eventName, preventIfMovingProxy, true);\n });\n }\n that.bind([\n PRESS,\n HOLD,\n TAP,\n DOUBLETAP,\n START,\n MOVE,\n END,\n RELEASE,\n CANCEL,\n GESTURESTART,\n GESTURECHANGE,\n GESTUREEND,\n GESTURETAP,\n SELECT\n ], options);\n },\n preventIfMoving: function (e) {\n if (this._isMoved()) {\n e.preventDefault();\n }\n },\n destroy: function () {\n var that = this;\n if (that._destroyed) {\n return;\n }\n that._destroyed = true;\n if (that.captureUpIfMoved && support.eventCapture) {\n var surfaceElement = that.surface[0];\n withEachUpEvent(function (eventName) {\n surfaceElement.removeEventListener(eventName, that.preventIfMoving);\n });\n }\n that.element.kendoDestroy(that.eventNS);\n that.surface.kendoDestroy(that.eventNS);\n that.element.removeData('handler');\n that.surface.removeData('handler');\n that._disposeAll();\n that.unbind();\n delete that.surface;\n delete that.element;\n delete that.currentTarget;\n },\n capture: function () {\n UserEvents.current = this;\n },\n cancel: function () {\n this._disposeAll();\n this.trigger(CANCEL);\n },\n notify: function (eventName, data) {\n var that = this, touches = that.touches;\n if (this._isMultiTouch()) {\n switch (eventName) {\n case MOVE:\n eventName = GESTURECHANGE;\n break;\n case END:\n eventName = GESTUREEND;\n break;\n case TAP:\n eventName = GESTURETAP;\n break;\n }\n extend(data, { touches: touches }, touchDelta(touches[0], touches[1]));\n }\n return this.trigger(eventName, extend(data, { type: eventName }));\n },\n press: function (x, y, target) {\n this._apiCall('_start', x, y, target);\n },\n move: function (x, y) {\n this._apiCall('_move', x, y);\n },\n end: function (x, y) {\n this._apiCall('_end', x, y);\n },\n _isMultiTouch: function () {\n return this.touches.length > 1;\n },\n _maxTouchesReached: function () {\n return this.touches.length >= this._maxTouches;\n },\n _disposeAll: function () {\n var touches = this.touches;\n while (touches.length > 0) {\n touches.pop().dispose();\n }\n },\n _isMoved: function () {\n return $.grep(this.touches, function (touch) {\n return touch.isMoved();\n }).length;\n },\n _select: function (e) {\n if (!this.allowSelection || this.trigger(SELECT, { event: e })) {\n e.preventDefault();\n }\n },\n _start: function (e) {\n var that = this, idx = 0, filter = that.filter, target, touches = getTouches(e), length = touches.length, touch, which = e.which;\n if (which && which > 1 || that._maxTouchesReached()) {\n return;\n }\n UserEvents.current = null;\n that.currentTarget = e.currentTarget;\n if (that.stopPropagation) {\n e.stopPropagation();\n }\n for (; idx < length; idx++) {\n if (that._maxTouchesReached()) {\n break;\n }\n touch = touches[idx];\n if (filter) {\n target = $(touch.currentTarget);\n } else {\n target = that.element;\n }\n if (!target.length) {\n continue;\n }\n touch = new Touch(that, target, touch);\n that.touches.push(touch);\n touch.press();\n if (that._isMultiTouch()) {\n that.notify('gesturestart', {});\n }\n }\n },\n _move: function (e) {\n this._eachTouch('move', e);\n },\n _end: function (e) {\n this._eachTouch('end', e);\n },\n _click: function (e) {\n var data = {\n touch: {\n initialTouch: e.target,\n target: $(e.currentTarget),\n endTime: now(),\n x: {\n location: e.pageX,\n client: e.clientX\n },\n y: {\n location: e.pageY,\n client: e.clientY\n }\n },\n x: e.pageX,\n y: e.pageY,\n target: $(e.currentTarget),\n event: e,\n type: 'tap'\n };\n if (this.trigger('tap', data)) {\n e.preventDefault();\n }\n },\n _eachTouch: function (methodName, e) {\n var that = this, dict = {}, touches = getTouches(e), activeTouches = that.touches, idx, touch, touchInfo, matchingTouch;\n for (idx = 0; idx < activeTouches.length; idx++) {\n touch = activeTouches[idx];\n dict[touch.id] = touch;\n }\n for (idx = 0; idx < touches.length; idx++) {\n touchInfo = touches[idx];\n matchingTouch = dict[touchInfo.id];\n if (matchingTouch) {\n matchingTouch[methodName](touchInfo);\n }\n }\n },\n _apiCall: function (type, x, y, target) {\n this[type]({\n api: true,\n pageX: x,\n pageY: y,\n clientX: x,\n clientY: y,\n target: $(target || this.element)[0],\n stopPropagation: $.noop,\n preventDefault: $.noop\n });\n }\n });\n UserEvents.defaultThreshold = function (value) {\n DEFAULT_THRESHOLD = value;\n };\n UserEvents.minHold = function (value) {\n DEFAULT_MIN_HOLD = value;\n };\n kendo.getTouches = getTouches;\n kendo.touchDelta = touchDelta;\n kendo.UserEvents = UserEvents;\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('kendo.selectable', [\n 'kendo.core',\n 'kendo.userevents'\n ], f);\n}(function () {\n var __meta__ = {\n id: 'selectable',\n name: 'Selectable',\n category: 'framework',\n depends: [\n 'core',\n 'userevents'\n ],\n advanced: true\n };\n (function ($, undefined) {\n var kendo = window.kendo, Widget = kendo.ui.Widget, proxy = $.proxy, abs = Math.abs, ARIASELECTED = 'aria-selected', SELECTED = 'k-state-selected', ACTIVE = 'k-state-selecting', SELECTABLE = 'k-selectable', CHANGE = 'change', NS = '.kendoSelectable', UNSELECT = 'unselect', UNSELECTING = 'k-state-unselecting', INPUTSELECTOR = 'input,a,textarea,.k-multiselect-wrap,select,button,.k-button>span,.k-button>img,span.k-icon.k-i-arrow-60-down,span.k-icon.k-i-arrow-60-up,label.k-checkbox-label.k-no-text,.k-icon.k-i-collapse,.k-icon.k-i-expand,span.k-numeric-wrap,.k-focusable', msie = kendo.support.browser.msie, supportEventDelegation = false;\n (function ($) {\n (function () {\n $('
').on('click', '>*', function () {\n supportEventDelegation = true;\n }).find('span').trigger('click').end().off();\n }());\n }($));\n var Selectable = Widget.extend({\n init: function (element, options) {\n var that = this, multiple;\n Widget.fn.init.call(that, element, options);\n that._marquee = $('
');\n that._lastActive = null;\n that.element.addClass(SELECTABLE);\n that.relatedTarget = that.options.relatedTarget;\n multiple = that.options.multiple;\n if (this.options.aria && multiple) {\n that.element.attr('aria-multiselectable', true);\n }\n that.userEvents = new kendo.UserEvents(that.element, {\n global: true,\n allowSelection: true,\n filter: (!supportEventDelegation ? '.' + SELECTABLE + ' ' : '') + that.options.filter,\n tap: proxy(that._tap, that),\n touchAction: multiple ? 'none' : 'pan-x pan-y'\n });\n if (multiple) {\n that.userEvents.bind('start', proxy(that._start, that)).bind('move', proxy(that._move, that)).bind('end', proxy(that._end, that)).bind('select', proxy(that._select, that));\n }\n },\n events: [\n CHANGE,\n UNSELECT\n ],\n options: {\n name: 'Selectable',\n filter: '>*',\n inputSelectors: INPUTSELECTOR,\n multiple: false,\n relatedTarget: $.noop\n },\n _isElement: function (target) {\n var elements = this.element;\n var idx, length = elements.length, result = false;\n target = target[0];\n for (idx = 0; idx < length; idx++) {\n if (elements[idx] === target) {\n result = true;\n break;\n }\n }\n return result;\n },\n _tap: function (e) {\n var target = $(e.target), that = this, ctrlKey = e.event.ctrlKey || e.event.metaKey, multiple = that.options.multiple, shiftKey = multiple && e.event.shiftKey, selected, whichCode = e.event.which, buttonCode = e.event.button;\n if (!that._isElement(target.closest('.' + SELECTABLE)) || whichCode && whichCode == 3 || buttonCode && buttonCode == 2) {\n return;\n }\n if (!this._allowSelection(e.event.target)) {\n return;\n }\n selected = target.hasClass(SELECTED);\n if (!multiple || !ctrlKey) {\n that.clear();\n }\n target = target.add(that.relatedTarget(target));\n if (shiftKey) {\n that.selectRange(that._firstSelectee(), target, e);\n } else {\n if (selected && ctrlKey) {\n that._unselect(target);\n that._notify(CHANGE, e);\n } else {\n that.value(target, e);\n }\n that._lastActive = that._downTarget = target;\n }\n },\n _start: function (e) {\n var that = this, target = $(e.target), selected = target.hasClass(SELECTED), currentElement, ctrlKey = e.event.ctrlKey || e.event.metaKey;\n if (!this._allowSelection(e.event.target)) {\n return;\n }\n that._downTarget = target;\n if (!that._isElement(target.closest('.' + SELECTABLE))) {\n that.userEvents.cancel();\n return;\n }\n if (that.options.useAllItems) {\n that._items = that.element.find(that.options.filter);\n } else {\n currentElement = target.closest(that.element);\n that._items = currentElement.find(that.options.filter);\n }\n e.sender.capture();\n that._marquee.appendTo(document.body).css({\n left: e.x.client + 1,\n top: e.y.client + 1,\n width: 0,\n height: 0\n });\n if (!ctrlKey) {\n that.clear();\n }\n target = target.add(that.relatedTarget(target));\n if (selected) {\n that._selectElement(target, true);\n if (ctrlKey) {\n target.addClass(UNSELECTING);\n }\n }\n },\n _move: function (e) {\n var that = this, position = {\n left: e.x.startLocation > e.x.location ? e.x.location : e.x.startLocation,\n top: e.y.startLocation > e.y.location ? e.y.location : e.y.startLocation,\n width: abs(e.x.initialDelta),\n height: abs(e.y.initialDelta)\n };\n that._marquee.css(position);\n that._invalidateSelectables(position, e.event.ctrlKey || e.event.metaKey);\n e.preventDefault();\n },\n _end: function (e) {\n var that = this;\n that._marquee.remove();\n that._unselect(that.element.find(that.options.filter + '.' + UNSELECTING)).removeClass(UNSELECTING);\n var target = that.element.find(that.options.filter + '.' + ACTIVE);\n target = target.add(that.relatedTarget(target));\n that.value(target, e);\n that._lastActive = that._downTarget;\n that._items = null;\n },\n _invalidateSelectables: function (position, ctrlKey) {\n var idx, length, target = this._downTarget[0], items = this._items, related, toSelect;\n for (idx = 0, length = items.length; idx < length; idx++) {\n toSelect = items.eq(idx);\n related = toSelect.add(this.relatedTarget(toSelect));\n if (collision(toSelect, position)) {\n if (toSelect.hasClass(SELECTED)) {\n if (ctrlKey && target !== toSelect[0]) {\n related.removeClass(SELECTED).addClass(UNSELECTING);\n }\n } else if (!toSelect.hasClass(ACTIVE) && !toSelect.hasClass(UNSELECTING)) {\n related.addClass(ACTIVE);\n }\n } else {\n if (toSelect.hasClass(ACTIVE)) {\n related.removeClass(ACTIVE);\n } else if (ctrlKey && toSelect.hasClass(UNSELECTING)) {\n related.removeClass(UNSELECTING).addClass(SELECTED);\n }\n }\n }\n },\n value: function (val, e) {\n var that = this, selectElement = proxy(that._selectElement, that);\n if (val) {\n val.each(function () {\n selectElement(this);\n });\n that._notify(CHANGE, e);\n return;\n }\n return that.element.find(that.options.filter + '.' + SELECTED);\n },\n _firstSelectee: function () {\n var that = this, selected;\n if (that._lastActive !== null) {\n return that._lastActive;\n }\n selected = that.value();\n return selected.length > 0 ? selected[0] : that.element.find(that.options.filter)[0];\n },\n _selectElement: function (element, preventNotify) {\n var toSelect = $(element), isPrevented = !preventNotify && this._notify('select', { element: element });\n toSelect.removeClass(ACTIVE);\n if (!isPrevented) {\n toSelect.addClass(SELECTED);\n if (this.options.aria) {\n toSelect.attr(ARIASELECTED, true);\n }\n }\n },\n _notify: function (name, args) {\n args = args || {};\n return this.trigger(name, args);\n },\n _unselect: function (element) {\n if (this.trigger(UNSELECT, { element: element })) {\n return;\n }\n element.removeClass(SELECTED);\n if (this.options.aria) {\n element.attr(ARIASELECTED, false);\n }\n return element;\n },\n _select: function (e) {\n if (this._allowSelection(e.event.target)) {\n if (!msie || msie && !$(kendo._activeElement()).is(this.options.inputSelectors)) {\n e.preventDefault();\n }\n }\n },\n _allowSelection: function (target) {\n if ($(target).is(this.options.inputSelectors)) {\n this.userEvents.cancel();\n this._downTarget = null;\n return false;\n }\n return true;\n },\n resetTouchEvents: function () {\n this.userEvents.cancel();\n },\n clear: function () {\n var items = this.element.find(this.options.filter + '.' + SELECTED);\n this._unselect(items);\n },\n selectRange: function (start, end, e) {\n var that = this, idx, tmp, items;\n that.clear();\n if (that.element.length > 1) {\n items = that.options.continuousItems();\n }\n if (!items || !items.length) {\n items = that.element.find(that.options.filter);\n }\n start = $.inArray($(start)[0], items);\n end = $.inArray($(end)[0], items);\n if (start > end) {\n tmp = start;\n start = end;\n end = tmp;\n }\n if (!that.options.useAllItems) {\n end += that.element.length - 1;\n }\n for (idx = start; idx <= end; idx++) {\n that._selectElement(items[idx]);\n }\n that._notify(CHANGE, e);\n },\n destroy: function () {\n var that = this;\n Widget.fn.destroy.call(that);\n that.element.off(NS);\n that.userEvents.destroy();\n that._marquee = that._lastActive = that.element = that.userEvents = null;\n }\n });\n Selectable.parseOptions = function (selectable) {\n var asLowerString = typeof selectable === 'string' && selectable.toLowerCase();\n return {\n multiple: asLowerString && asLowerString.indexOf('multiple') > -1,\n cell: asLowerString && asLowerString.indexOf('cell') > -1\n };\n };\n function collision(element, position) {\n if (!element.is(':visible')) {\n return false;\n }\n var elementPosition = kendo.getOffset(element), right = position.left + position.width, bottom = position.top + position.height;\n elementPosition.right = elementPosition.left + kendo._outerWidth(element);\n elementPosition.bottom = elementPosition.top + kendo._outerHeight(element);\n return !(elementPosition.left > right || elementPosition.right < position.left || elementPosition.top > bottom || elementPosition.bottom < position.top);\n }\n kendo.ui.plugin(Selectable);\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('kendo.calendar', [\n 'kendo.core',\n 'kendo.selectable'\n ], f);\n}(function () {\n var __meta__ = {\n id: 'calendar',\n name: 'Calendar',\n category: 'web',\n description: 'The Calendar widget renders a graphical calendar that supports navigation and selection.',\n depends: [\n 'core',\n 'selectable'\n ]\n };\n (function ($, undefined) {\n var kendo = window.kendo, support = kendo.support, ui = kendo.ui, Widget = ui.Widget, keys = kendo.keys, parse = kendo.parseDate, adjustDST = kendo.date.adjustDST, weekInYear = kendo.date.weekInYear, Selectable = kendo.ui.Selectable, extractFormat = kendo._extractFormat, template = kendo.template, getCulture = kendo.getCulture, transitions = kendo.support.transitions, transitionOrigin = transitions ? transitions.css + 'transform-origin' : '', cellTemplate = template('#=data.value#', { useWithBlock: false }), emptyCellTemplate = template('', { useWithBlock: false }), otherMonthCellTemplate = template(' ', { useWithBlock: false }), weekNumberTemplate = template('#= data.weekNumber #', { useWithBlock: false }), browser = kendo.support.browser, isIE8 = browser.msie && browser.version < 9, outerWidth = kendo._outerWidth, ns = '.kendoCalendar', CLICK = 'click' + ns, KEYDOWN_NS = 'keydown' + ns, ID = 'id', MIN = 'min', LEFT = 'left', SLIDE = 'slideIn', MONTH = 'month', CENTURY = 'century', CHANGE = 'change', NAVIGATE = 'navigate', VALUE = 'value', HOVER = 'k-state-hover', DISABLED = 'k-state-disabled', FOCUSED = 'k-state-focused', OTHERMONTH = 'k-other-month', OTHERMONTHCLASS = ' class=\"' + OTHERMONTH + '\"', OUTOFRANGE = 'k-out-of-range', TODAY = 'k-nav-today', CELLSELECTOR = 'td:has(.k-link)', CELLSELECTORVALID = 'td:has(.k-link):not(.' + DISABLED + '):not(.' + OUTOFRANGE + ')', WEEKCOLUMNSELECTOR = 'td:not(:has(.k-link))', SELECTED = 'k-state-selected', BLUR = 'blur' + ns, FOCUS = 'focus', FOCUS_WITH_NS = FOCUS + ns, MOUSEENTER = support.touch ? 'touchstart' : 'mouseenter', MOUSEENTER_WITH_NS = support.touch ? 'touchstart' + ns : 'mouseenter' + ns, MOUSELEAVE = support.touch ? 'touchend' + ns + ' touchmove' + ns : 'mouseleave' + ns, MS_PER_MINUTE = 60000, MS_PER_DAY = 86400000, PREVARROW = '_prevArrow', NEXTARROW = '_nextArrow', ARIA_DISABLED = 'aria-disabled', ARIA_SELECTED = 'aria-selected', ARIA_LABEL = 'aria-label', proxy = $.proxy, extend = $.extend, DATE = Date, views = {\n month: 0,\n year: 1,\n decade: 2,\n century: 3\n };\n var Calendar = Widget.extend({\n init: function (element, options) {\n var that = this, value, id;\n Widget.fn.init.call(that, element, options);\n element = that.wrapper = that.element;\n options = that.options;\n options.url = kendo.unescape(options.url);\n that.options.disableDates = getDisabledExpr(that.options.disableDates);\n that._templates();\n that._selectable();\n that._header();\n that._viewWrapper();\n that._footer(that.footer);\n id = element.addClass('k-widget k-calendar ' + (options.weekNumber ? ' k-week-number' : '')).on(MOUSEENTER_WITH_NS + ' ' + MOUSELEAVE, CELLSELECTOR, mousetoggle).on(KEYDOWN_NS, 'table.k-content', proxy(that._move, that)).on(CLICK + ' touchend', CELLSELECTOR, function (e) {\n var link = e.currentTarget.firstChild, value = toDateObject(link);\n if (link.href.indexOf('#') != -1) {\n e.preventDefault();\n }\n if (that._view.name == 'month' && that.options.disableDates(value)) {\n return;\n }\n if (that._view.name != 'month' || options.selectable == 'single') {\n that._click($(link));\n }\n }).on('mouseup' + ns, 'table.k-content, .k-footer', function () {\n that._focusView(that.options.focusOnNav !== false);\n }).attr(ID);\n if (id) {\n that._cellID = id + '_cell_selected';\n }\n if (that._isMultipleSelection() && that.options.weekNumber) {\n element.on(CLICK, WEEKCOLUMNSELECTOR, function (e) {\n var first = $(e.currentTarget).closest('tr').find(CELLSELECTORVALID).first(), last = that.selectable._lastActive = $(e.currentTarget).closest('tr').find(CELLSELECTORVALID).last();\n that.selectable.selectRange(first, last, { event: e });\n that._current = that._value = toDateObject(last.find('a'));\n that._class(FOCUSED, that._current);\n });\n }\n normalize(options);\n value = parse(options.value, options.format, options.culture);\n that._selectDates = [];\n that._index = views[options.start];\n that._current = new DATE(+restrictValue(value, options.min, options.max));\n that._addClassProxy = function () {\n that._active = true;\n if (that._cell.hasClass(DISABLED)) {\n var todayString = that._view.toDateString(getToday());\n that._cell = that._cellByDate(todayString);\n }\n that._cell.addClass(FOCUSED);\n };\n that._removeClassProxy = function () {\n that._active = false;\n that._cell.removeClass(FOCUSED);\n };\n that.value(value);\n if (that._isMultipleSelection() && options.selectDates.length > 0) {\n that.selectDates(options.selectDates);\n }\n kendo.notify(that);\n },\n options: {\n name: 'Calendar',\n value: null,\n min: new DATE(1900, 0, 1),\n max: new DATE(2099, 11, 31),\n dates: [],\n disableDates: null,\n url: '',\n culture: '',\n footer: '',\n format: '',\n month: {},\n weekNumber: false,\n selectable: 'single',\n selectDates: [],\n start: MONTH,\n depth: MONTH,\n animation: {\n horizontal: {\n effects: SLIDE,\n reverse: true,\n duration: 500,\n divisor: 2\n },\n vertical: {\n effects: 'zoomIn',\n duration: 400\n }\n },\n messages: { weekColumnHeader: '' }\n },\n events: [\n CHANGE,\n NAVIGATE\n ],\n setOptions: function (options) {\n var that = this;\n normalize(options);\n options.disableDates = getDisabledExpr(options.disableDates);\n that._destroySelectable();\n Widget.fn.setOptions.call(that, options);\n that._templates();\n that._selectable();\n that._viewWrapper();\n that._footer(that.footer);\n that._index = views[that.options.start];\n that.navigate();\n if (options.weekNumber) {\n that.element.addClass('k-week-number');\n }\n },\n destroy: function () {\n var that = this, today = that._today;\n that.element.off(ns);\n that._title.off(ns);\n that[PREVARROW].off(ns);\n that[NEXTARROW].off(ns);\n that._destroySelectable();\n kendo.destroy(that._table);\n if (today) {\n kendo.destroy(today.off(ns));\n }\n Widget.fn.destroy.call(that);\n },\n current: function () {\n return this._current;\n },\n view: function () {\n return this._view;\n },\n focus: function (table) {\n table = table || this._table;\n this._bindTable(table);\n table.trigger('focus');\n },\n min: function (value) {\n return this._option(MIN, value);\n },\n max: function (value) {\n return this._option('max', value);\n },\n navigateToPast: function () {\n this._navigate(PREVARROW, -1);\n },\n navigateToFuture: function () {\n this._navigate(NEXTARROW, 1);\n },\n navigateUp: function () {\n var that = this, index = that._index;\n if (that._title.hasClass(DISABLED)) {\n return;\n }\n that.navigate(that._current, ++index);\n },\n navigateDown: function (value) {\n var that = this, index = that._index, depth = that.options.depth;\n if (!value) {\n return;\n }\n if (index === views[depth]) {\n if (!isEqualDate(that._value, that._current) || !isEqualDate(that._value, value)) {\n that.value(value);\n that.trigger(CHANGE);\n }\n return;\n }\n that.navigate(value, --index);\n },\n navigate: function (value, view) {\n view = isNaN(view) ? views[view] : view;\n var that = this, options = that.options, culture = options.culture, min = options.min, max = options.max, title = that._title, from = that._table, old = that._oldTable, currentValue = that._current, future = value && +value > +currentValue, vertical = view !== undefined && view !== that._index, to, currentView, compare, disabled;\n if (!value) {\n value = currentValue;\n }\n that._current = value = new DATE(+restrictValue(value, min, max));\n if (view === undefined) {\n view = that._index;\n } else {\n that._index = view;\n }\n that._view = currentView = calendar.views[view];\n compare = currentView.compare;\n disabled = view === views[CENTURY];\n title.toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled);\n disabled = compare(value, min) < 1;\n that[PREVARROW].toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled);\n if (that[PREVARROW].hasClass(DISABLED)) {\n that[PREVARROW].removeClass(HOVER);\n }\n disabled = compare(value, max) > -1;\n that[NEXTARROW].toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled);\n if (that[NEXTARROW].hasClass(DISABLED)) {\n that[NEXTARROW].removeClass(HOVER);\n }\n if (from && old && old.data('animating')) {\n old.kendoStop(true, true);\n from.kendoStop(true, true);\n }\n that._oldTable = from;\n if (!from || that._changeView) {\n title.html(currentView.title(value, min, max, culture));\n that._table = to = $(currentView.content(extend({\n min: min,\n max: max,\n date: value,\n url: options.url,\n dates: options.dates,\n format: options.format,\n otherMonth: true,\n culture: culture,\n disableDates: options.disableDates,\n isWeekColumnVisible: options.weekNumber,\n messages: options.messages\n }, that[currentView.name])));\n addClassToViewContainer(to, currentView.name);\n makeUnselectable(to);\n var replace = from && from.data('start') === to.data('start');\n that._animate({\n from: from,\n to: to,\n vertical: vertical,\n future: future,\n replace: replace\n });\n that.trigger(NAVIGATE);\n that._focus(value);\n }\n if (view === views[options.depth] && that._selectDates.length > 0) {\n that._visualizeSelectedDatesInView();\n }\n if (that.options.selectable === 'single') {\n if (view === views[options.depth] && that._value && !that.options.disableDates(that._value)) {\n that._class('k-state-selected', that._value);\n }\n }\n that._class(FOCUSED, value);\n if (!from && that._cell) {\n that._cell.removeClass(FOCUSED);\n }\n that._changeView = true;\n },\n selectDates: function (dates) {\n var that = this, validSelectedDates, datesUnique;\n if (dates === undefined) {\n return that._selectDates;\n }\n datesUnique = dates.map(function (date) {\n return date.getTime();\n }).filter(function (date, position, array) {\n return array.indexOf(date) === position;\n }).map(function (time) {\n return new Date(time);\n });\n validSelectedDates = $.grep(datesUnique, function (value) {\n if (value) {\n return +that._validateValue(new Date(value.setHours(0, 0, 0, 0))) === +value;\n }\n });\n that._selectDates = validSelectedDates.length > 0 ? validSelectedDates : datesUnique.length === 0 ? datesUnique : that._selectDates;\n that._visualizeSelectedDatesInView();\n },\n value: function (value) {\n var that = this, old = that._view, view = that._view;\n if (value === undefined) {\n return that._value;\n }\n value = that._validateValue(value);\n if (value && that._isMultipleSelection()) {\n var date = new Date(+value);\n date.setHours(0, 0, 0, 0);\n that._selectDates = [date];\n that.selectable._lastActive = null;\n }\n if (old && value === null && that._cell) {\n that._cell.removeClass(SELECTED);\n } else {\n that._changeView = !value || view && view.compare(value, that._current) !== 0;\n that.navigate(value);\n }\n },\n _validateValue: function (value) {\n var that = this, options = that.options, min = options.min, max = options.max;\n if (value === null) {\n that._current = createDate(that._current.getFullYear(), that._current.getMonth(), that._current.getDate());\n }\n value = parse(value, options.format, options.culture);\n if (value !== null) {\n value = new DATE(+value);\n if (!isInRange(value, min, max)) {\n value = null;\n }\n }\n if (value === null || !that.options.disableDates(new Date(+value))) {\n that._value = value;\n } else if (that._value === undefined) {\n that._value = null;\n }\n return that._value;\n },\n _visualizeSelectedDatesInView: function () {\n var that = this;\n var selectedDates = {};\n $.each(that._selectDates, function (index, value) {\n selectedDates[kendo.calendar.views[0].toDateString(value)] = value;\n });\n that.selectable.clear();\n var cells = that._table.find(CELLSELECTOR).filter(function (index, element) {\n return selectedDates[$(element.firstChild).attr(kendo.attr(VALUE))];\n });\n if (cells.length > 0) {\n that.selectable._selectElement(cells, true);\n }\n },\n _isMultipleSelection: function () {\n var that = this;\n return that.options.selectable === 'multiple';\n },\n _selectable: function () {\n var that = this;\n if (!that._isMultipleSelection()) {\n return;\n }\n var selectable = that.options.selectable, selectableOptions = Selectable.parseOptions(selectable);\n if (selectableOptions.multiple) {\n that.element.attr('aria-multiselectable', 'true');\n }\n that.selectable = new Selectable(that.wrapper, {\n aria: true,\n inputSelectors: 'input,textarea,.k-multiselect-wrap,select,button,.k-button>span,.k-button>img,span.k-icon.k-i-arrow-60-down,span.k-icon.k-i-arrow-60-up',\n multiple: selectableOptions.multiple,\n filter: 'table.k-month:eq(0) ' + CELLSELECTORVALID,\n change: proxy(that._onSelect, that),\n relatedTarget: proxy(that._onRelatedTarget, that)\n });\n },\n _onRelatedTarget: function (target) {\n var that = this;\n if (that.selectable.options.multiple && target.is(CELLSELECTORVALID)) {\n that._current = toDateObject(target.find('a'));\n that._class(FOCUSED, toDateObject(target.find('a')));\n }\n },\n _onSelect: function (e) {\n var that = this, eventArgs = e, selectableOptions = Selectable.parseOptions(that.options.selectable);\n if (!selectableOptions.multiple) {\n if ($(eventArgs.event.currentTarget).is('td') && !$(eventArgs.event.currentTarget).hasClass('k-state-selected')) {\n $(eventArgs.event.currentTarget).addClass('k-state-selected');\n } else {\n that._click($(eventArgs.event.currentTarget).find('a'));\n }\n return;\n }\n if (eventArgs.event.ctrlKey || eventArgs.event.metaKey) {\n if ($(eventArgs.event.currentTarget).is(CELLSELECTORVALID)) {\n that._toggleSelection($(eventArgs.event.currentTarget));\n } else {\n that._cellsBySelector(CELLSELECTORVALID).each(function (index, element) {\n var value = toDateObject($(element).find('a'));\n that._deselect(value);\n });\n that._addSelectedCellsToArray();\n }\n } else if (eventArgs.event.shiftKey) {\n that._rangeSelection(that._cell);\n } else if ($(eventArgs.event.currentTarget).is(CELLSELECTOR)) {\n that.value(toDateObject($(eventArgs.event.currentTarget).find('a')));\n } else {\n that._selectDates = [];\n that._addSelectedCellsToArray();\n }\n that.trigger(CHANGE);\n },\n _destroySelectable: function () {\n var that = this;\n if (that.selectable) {\n that.selectable.destroy();\n that.selectable = null;\n }\n },\n _toggleSelection: function (currentCell) {\n var that = this, date = toDateObject(currentCell.find('a'));\n if (currentCell.hasClass('k-state-selected')) {\n that._selectDates.push(date);\n } else {\n that._deselect(date);\n }\n },\n _rangeSelection: function (toDateCell, startDate) {\n var that = this, fromDate = startDate || toDateObject(that.selectable.value().first().find('a')), toDate = toDateObject(toDateCell.find('a')), daysDifference;\n if (that.selectable._lastActive || that._value) {\n fromDate = that.selectable._lastActive ? toDateObject(that.selectable._lastActive.find('a')) : new Date(+that._value);\n } else {\n that.selectable._lastActive = startDate ? that._cellByDate(that._view.toDateString(startDate), CELLSELECTORVALID) : that.selectable.value().first();\n }\n that._selectDates = [];\n daysDifference = daysBetweenTwoDates(fromDate, toDate);\n addDaysToArray(that._selectDates, daysDifference, fromDate, that.options.disableDates);\n that._visualizeSelectedDatesInView();\n },\n _cellsBySelector: function (selector) {\n var that = this;\n return that._table.find(selector);\n },\n _addSelectedCellsToArray: function () {\n var that = this;\n that.selectable.value().each(function (index, item) {\n var date = toDateObject($(item.firstChild));\n if (!that.options.disableDates(date)) {\n that._selectDates.push(date);\n }\n });\n },\n _deselect: function (date) {\n var that = this;\n var currentDateIndex = that._selectDates.map(Number).indexOf(+date);\n if (currentDateIndex != -1) {\n that._selectDates.splice(currentDateIndex, 1);\n }\n },\n _dateInView: function (date) {\n var that = this, firstDateInView = toDateObject(that._cellsBySelector(CELLSELECTORVALID + ':first').find('a')), lastDateInView = toDateObject(that._cellsBySelector(CELLSELECTORVALID + ':last').find('a'));\n return +date <= +lastDateInView && +date >= +firstDateInView;\n },\n _isNavigatable: function (currentValue, cellIndex) {\n var that = this;\n var isDisabled = that.options.disableDates;\n var cell;\n var index;\n if (that._view.name == 'month') {\n return !isDisabled(currentValue);\n } else {\n index = that.wrapper.find('.' + FOCUSED).index();\n cell = that.wrapper.find('.k-content td:eq(' + (index + cellIndex) + ')');\n return cell.is(CELLSELECTORVALID) || !isDisabled(currentValue);\n }\n },\n _move: function (e) {\n var that = this, options = that.options, key = e.keyCode, view = that._view, index = that._index, min = that.options.min, max = that.options.max, currentValue = new DATE(+that._current), isRtl = kendo.support.isRtl(that.wrapper), isDisabled = that.options.disableDates, value, prevent, method, temp;\n if (e.target === that._table[0]) {\n that._active = true;\n }\n if (key == keys.RIGHT && !isRtl || key == keys.LEFT && isRtl) {\n value = 1;\n prevent = true;\n } else if (key == keys.LEFT && !isRtl || key == keys.RIGHT && isRtl) {\n value = -1;\n prevent = true;\n } else if (key == keys.UP) {\n value = index === 0 ? -7 : -4;\n prevent = true;\n } else if (key == keys.DOWN) {\n value = index === 0 ? 7 : 4;\n prevent = true;\n } else if (key == keys.SPACEBAR) {\n value = 0;\n prevent = true;\n } else if (key == keys.HOME || key == keys.END) {\n method = key == keys.HOME ? 'first' : 'last';\n temp = view[method](currentValue);\n currentValue = new DATE(temp.getFullYear(), temp.getMonth(), temp.getDate(), currentValue.getHours(), currentValue.getMinutes(), currentValue.getSeconds(), currentValue.getMilliseconds());\n currentValue.setFullYear(temp.getFullYear());\n prevent = true;\n }\n if (e.ctrlKey || e.metaKey) {\n if (key == keys.RIGHT && !isRtl || key == keys.LEFT && isRtl) {\n that.navigateToFuture();\n prevent = true;\n } else if (key == keys.LEFT && !isRtl || key == keys.RIGHT && isRtl) {\n that.navigateToPast();\n prevent = true;\n } else if (key == keys.UP) {\n that.navigateUp();\n prevent = true;\n } else if (key == keys.DOWN) {\n that._click($(that._cell[0].firstChild));\n prevent = true;\n } else if ((key == keys.ENTER || key == keys.SPACEBAR) && that._isMultipleSelection()) {\n that._keyboardToggleSelection(e);\n var focusedDate = toDateObject($(that._cell[0]).find('a'));\n that._class(FOCUSED, focusedDate);\n }\n } else if (e.shiftKey) {\n if (value !== undefined || method) {\n if (!method) {\n view.setDate(currentValue, value);\n }\n if (!isInRange(currentValue, min, max)) {\n currentValue = restrictValue(currentValue, options.min, options.max);\n }\n if (isDisabled(currentValue)) {\n currentValue = that._nextNavigatable(currentValue, value);\n }\n min = createDate(min.getFullYear(), min.getMonth(), min.getDate());\n if (that._isMultipleSelection()) {\n that._keyboardRangeSelection(e, currentValue);\n } else {\n that._focus(currentValue);\n }\n }\n } else {\n if (key == keys.ENTER || key == keys.SPACEBAR) {\n if (view.name == 'month' && that._isMultipleSelection()) {\n that.value(toDateObject($(that._cell.find('a'))));\n that.selectable._lastActive = $(that._cell[0]);\n that.trigger(CHANGE);\n } else {\n that._click($(that._cell[0].firstChild));\n }\n prevent = true;\n } else if (key == keys.PAGEUP) {\n prevent = true;\n that.navigateToPast();\n } else if (key == keys.PAGEDOWN) {\n prevent = true;\n that.navigateToFuture();\n }\n if (value || method) {\n if (!method) {\n view.setDate(currentValue, value);\n }\n min = createDate(min.getFullYear(), min.getMonth(), min.getDate());\n if (!isInRange(currentValue, min, max)) {\n currentValue = restrictValue(currentValue, options.min, options.max);\n }\n if (!that._isNavigatable(currentValue, value)) {\n currentValue = that._nextNavigatable(currentValue, value);\n }\n if (that._isMultipleSelection()) {\n if (!that._dateInView(currentValue)) {\n that.navigate(currentValue);\n } else {\n that._current = currentValue;\n that._class(FOCUSED, currentValue);\n }\n } else {\n that._focus(currentValue);\n }\n }\n }\n if (prevent) {\n e.preventDefault();\n }\n return that._current;\n },\n _keyboardRangeSelection: function (event, currentValue) {\n var that = this, fromDate, daysDifference;\n if (!that._dateInView(currentValue)) {\n that._selectDates = [];\n fromDate = that.selectable._lastActive ? toDateObject(that.selectable._lastActive.find('a')) : currentValue;\n daysDifference = daysBetweenTwoDates(fromDate, new Date(+currentValue));\n addDaysToArray(that._selectDates, daysDifference, fromDate, that.options.disableDates);\n that.navigate(currentValue);\n that._current = currentValue;\n that.selectable._lastActive = that.selectable._lastActive || that._cellByDate(that._view.toDateString(currentValue), CELLSELECTORVALID);\n that.trigger(CHANGE);\n return;\n }\n that.selectable.options.filter = that.wrapper.find('table').length > 1 && +currentValue > +that._current ? 'table.k-month:eq(1) ' + CELLSELECTORVALID : 'table.k-month:eq(0) ' + CELLSELECTORVALID;\n that._class(FOCUSED, currentValue);\n that._current = currentValue;\n that._rangeSelection(that._cellByDate(that._view.toDateString(currentValue), CELLSELECTORVALID), currentValue);\n that.trigger(CHANGE);\n that.selectable.options.filter = 'table.k-month:eq(0) ' + CELLSELECTORVALID;\n },\n _keyboardToggleSelection: function (event) {\n var that = this;\n event.currentTarget = that._cell[0];\n that.selectable._lastActive = $(that._cell[0]);\n if ($(that._cell[0]).hasClass(SELECTED)) {\n that.selectable._unselect($(that._cell[0]));\n that.selectable.trigger(CHANGE, { event: event });\n } else {\n that.selectable.value($(that._cell[0]), { event: event });\n }\n },\n _nextNavigatable: function (currentValue, value) {\n var that = this, disabled = true, view = that._view, min = that.options.min, max = that.options.max, isDisabled = that.options.disableDates, navigatableDate = new Date(currentValue.getTime());\n view.setDate(navigatableDate, -value);\n while (disabled) {\n view.setDate(currentValue, value);\n if (!isInRange(currentValue, min, max)) {\n currentValue = navigatableDate;\n break;\n }\n disabled = isDisabled(currentValue);\n }\n return currentValue;\n },\n _animate: function (options) {\n var that = this;\n var from = options.from;\n var to = options.to;\n var active = that._active;\n var viewWrapper = that.element.children('.k-calendar-view');\n if (!from) {\n viewWrapper.append(to);\n that._bindTable(to);\n } else if (from.parent().data('animating')) {\n from.off(ns);\n from.parent().kendoStop(true, true).remove();\n from.remove();\n viewWrapper.append(to);\n that._focusView(active);\n } else if (!from.is(':visible') || that.options.animation === false || options.replace) {\n to.insertAfter(from);\n from.off(ns).remove();\n that._focusView(active);\n } else {\n that[options.vertical ? '_vertical' : '_horizontal'](from, to, options.future);\n }\n },\n _horizontal: function (from, to, future) {\n var that = this, active = that._active, horizontal = that.options.animation.horizontal, effects = horizontal.effects, viewWidth = outerWidth(from);\n if (effects && effects.indexOf(SLIDE) != -1) {\n from.add(to).css({ width: viewWidth });\n from.wrap('
');\n that._focusView(active, from);\n from.parent().css({\n position: 'relative',\n width: viewWidth * 2,\n 'float': LEFT,\n 'margin-left': future ? 0 : -viewWidth\n });\n to[future ? 'insertAfter' : 'insertBefore'](from);\n extend(horizontal, {\n effects: SLIDE + ':' + (future ? 'right' : LEFT),\n complete: function () {\n from.off(ns).remove();\n that._oldTable = null;\n to.unwrap();\n that._focusView(active);\n }\n });\n from.parent().kendoStop(true, true).kendoAnimate(horizontal);\n }\n },\n _vertical: function (from, to) {\n var that = this, vertical = that.options.animation.vertical, effects = vertical.effects, active = that._active, cell, position;\n if (effects && effects.indexOf('zoom') != -1) {\n to.insertBefore(from);\n from.css({\n position: 'absolute',\n width: to.width()\n });\n if (transitionOrigin) {\n cell = that._cellByDate(that._view.toDateString(that._current));\n position = cell.position();\n position = position.left + parseInt(cell.width() / 2, 10) + 'px' + ' ' + (position.top + parseInt(cell.height() / 2, 10) + 'px');\n to.css(transitionOrigin, position);\n }\n from.kendoStop(true, true).kendoAnimate({\n effects: 'fadeOut',\n duration: 600,\n complete: function () {\n from.off(ns).remove();\n that._oldTable = null;\n that._focusView(active);\n }\n });\n to.kendoStop(true, true).kendoAnimate(vertical);\n }\n },\n _cellByDate: function (value, selector) {\n return this._table.find(selector ? selector : 'td:not(.' + OTHERMONTH + ')').filter(function () {\n return $(this.firstChild).attr(kendo.attr(VALUE)) === value;\n });\n },\n _class: function (className, date) {\n var that = this, id = that._cellID, cell = that._cell, value = that._view.toDateString(date), disabledDate;\n if (cell && cell.length) {\n cell[0].removeAttribute(ARIA_SELECTED);\n cell[0].removeAttribute(ARIA_LABEL);\n cell[0].removeAttribute(ID);\n }\n if (date && that._view.name == 'month') {\n disabledDate = that.options.disableDates(date);\n }\n that._cellsBySelector(that._isMultipleSelection() ? CELLSELECTOR : 'td:not(.' + OTHERMONTH + ')').removeClass(className);\n cell = that._cellByDate(value, that.options.selectable == 'multiple' ? CELLSELECTOR : 'td:not(.' + OTHERMONTH + ')').attr(ARIA_SELECTED, true);\n if (className === FOCUSED && !that._active && that.options.focusOnNav !== false || disabledDate) {\n className = '';\n }\n cell.addClass(className);\n if (cell[0]) {\n that._cell = cell;\n }\n if (id) {\n cell.attr(ID, id);\n that._table[0].removeAttribute('aria-activedescendant');\n that._table.attr('aria-activedescendant', id);\n }\n },\n _bindTable: function (table) {\n table.on(FOCUS_WITH_NS, this._addClassProxy).on(BLUR, this._removeClassProxy);\n },\n _click: function (link) {\n var that = this, options = that.options, currentValue = new Date(+that._current), value = toDateObject(link);\n adjustDST(value, 0);\n if (that._view.name == 'month' && that.options.disableDates(value)) {\n value = that._value;\n }\n that._view.setDate(currentValue, value);\n that.navigateDown(restrictValue(currentValue, options.min, options.max));\n },\n _focus: function (value) {\n var that = this, view = that._view;\n if (view.compare(value, that._current) !== 0) {\n that.navigate(value);\n } else {\n that._current = value;\n that._class(FOCUSED, value);\n }\n },\n _focusView: function (active, table) {\n if (active) {\n this.focus(table);\n }\n },\n _viewWrapper: function () {\n var that = this;\n var element = that.element;\n var viewWrapper = element.children('.k-calendar-view');\n if (!viewWrapper[0]) {\n viewWrapper = $('
').insertAfter(element.find('.k-header'));\n }\n },\n _footer: function (template) {\n var that = this, today = getToday(), element = that.element, footer = element.find('.k-footer');\n if (!template) {\n that._toggle(false);\n footer.hide();\n return;\n }\n if (!footer[0]) {\n footer = $('
').appendTo(element);\n }\n that._today = footer.show().find('.k-link').html(template(today)).attr('title', kendo.toString(today, 'D', that.options.culture));\n that._toggle();\n },\n _header: function () {\n var that = this, element = that.element, links;\n if (!element.find('.k-header')[0]) {\n element.html('
' + '' + '' + '' + '
');\n }\n links = element.find('.k-link').on(MOUSEENTER_WITH_NS + ' ' + MOUSELEAVE + ' ' + FOCUS_WITH_NS + ' ' + BLUR, mousetoggle).on(CLICK + ' touchend' + ns, function () {\n return false;\n });\n that._title = links.eq(1).on(CLICK + ' touchend' + ns, function () {\n that._active = that.options.focusOnNav !== false;\n that.navigateUp();\n });\n that[PREVARROW] = links.eq(0).on(CLICK + ' touchend' + ns, function () {\n that._active = that.options.focusOnNav !== false;\n that.navigateToPast();\n });\n that[NEXTARROW] = links.eq(2).on(CLICK + ' touchend' + ns, function () {\n that._active = that.options.focusOnNav !== false;\n that.navigateToFuture();\n });\n },\n _navigate: function (arrow, modifier) {\n var that = this, index = that._index + 1, currentValue = new DATE(+that._current);\n if (that._isMultipleSelection()) {\n var firstDayCurrentMonth = that._table.find('td:not(.k-other-month):not(.k-out-of-range)').has('.k-link').first();\n currentValue = toDateObject(firstDayCurrentMonth.find('a'));\n that._current = new Date(+currentValue);\n }\n arrow = that[arrow];\n if (!arrow.hasClass(DISABLED)) {\n if (index > 3) {\n currentValue.setFullYear(currentValue.getFullYear() + 100 * modifier);\n } else {\n calendar.views[index].setDate(currentValue, modifier);\n }\n that.navigate(currentValue);\n }\n },\n _option: function (option, value) {\n var that = this, options = that.options, currentValue = that._value || that._current, isBigger;\n if (value === undefined) {\n return options[option];\n }\n value = parse(value, options.format, options.culture);\n if (!value) {\n return;\n }\n options[option] = new DATE(+value);\n if (option === MIN) {\n isBigger = value > currentValue;\n } else {\n isBigger = currentValue > value;\n }\n if (isBigger || isEqualMonth(currentValue, value)) {\n if (isBigger) {\n that._value = null;\n }\n that._changeView = true;\n }\n if (!that._changeView) {\n that._changeView = !!(options.month.content || options.month.empty);\n }\n that.navigate(that._value);\n that._toggle();\n },\n _toggle: function (toggle) {\n var that = this, options = that.options, isTodayDisabled = that.options.disableDates(getToday()), link = that._today;\n if (toggle === undefined) {\n toggle = isInRange(getToday(), options.min, options.max);\n }\n if (link) {\n link.off(CLICK);\n if (toggle && !isTodayDisabled) {\n link.addClass(TODAY).removeClass(DISABLED).on(CLICK, proxy(that._todayClick, that));\n } else {\n link.removeClass(TODAY).addClass(DISABLED).on(CLICK, prevent);\n }\n }\n },\n _todayClick: function (e) {\n var that = this, depth = views[that.options.depth], disabled = that.options.disableDates, today = getToday();\n e.preventDefault();\n if (disabled(today)) {\n return;\n }\n if (that._view.compare(that._current, today) === 0 && that._index == depth) {\n that._changeView = false;\n }\n if (that._isMultipleSelection()) {\n that._selectDates = [today];\n that.selectable._lastActive = null;\n }\n that._value = today;\n that.navigate(today, depth);\n that.trigger(CHANGE);\n },\n _templates: function () {\n var that = this, options = that.options, footer = options.footer, month = options.month, content = month.content, weekNumber = month.weekNumber, empty = month.empty, footerTemplate = '#= kendo.toString(data,\"D\",\"' + options.culture + '\") #';\n that.month = {\n content: template('' + (content || '#=data.value#') + '', { useWithBlock: !!content }),\n empty: template('' + (empty || ' ') + '', { useWithBlock: !!empty }),\n weekNumber: template('' + (weekNumber || '#= data.weekNumber #') + '', { useWithBlock: !!weekNumber })\n };\n if (footer && footer !== true) {\n footerTemplate = footer;\n }\n that.footer = footer !== false ? template(footerTemplate, { useWithBlock: false }) : null;\n }\n });\n ui.plugin(Calendar);\n var calendar = {\n firstDayOfMonth: function (date) {\n return createDate(date.getFullYear(), date.getMonth(), 1);\n },\n firstVisibleDay: function (date, calendarInfo) {\n calendarInfo = calendarInfo || kendo.culture().calendar;\n var firstDay = calendarInfo.firstDay, firstVisibleDay = new DATE(date.getFullYear(), date.getMonth(), 1, date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n firstVisibleDay.setFullYear(date.getFullYear());\n while (firstVisibleDay.getDay() != firstDay) {\n calendar.setTime(firstVisibleDay, -1 * MS_PER_DAY);\n }\n return firstVisibleDay;\n },\n setTime: function (date, time) {\n var tzOffsetBefore = date.getTimezoneOffset(), resultDATE = new DATE(date.getTime() + time), tzOffsetDiff = resultDATE.getTimezoneOffset() - tzOffsetBefore;\n date.setTime(resultDATE.getTime() + tzOffsetDiff * MS_PER_MINUTE);\n },\n views: [\n {\n name: MONTH,\n title: function (date, min, max, culture) {\n return getCalendarInfo(culture).months.names[date.getMonth()] + ' ' + date.getFullYear();\n },\n content: function (options) {\n var that = this, idx = 0, min = options.min, max = options.max, date = options.date, dates = options.dates, format = options.format, culture = options.culture, navigateUrl = options.url, showHeader = options.showHeader, otherMonth = options.otherMonth, isWeekColumnVisible = options.isWeekColumnVisible, hasUrl = navigateUrl && dates[0], currentCalendar = getCalendarInfo(culture), firstDayIdx = currentCalendar.firstDay, days = currentCalendar.days, names = shiftArray(days.names, firstDayIdx), shortNames = shiftArray(days.namesShort, firstDayIdx), start = calendar.firstVisibleDay(date, currentCalendar), firstDayOfMonth = that.first(date), lastDayOfMonth = that.last(date), toDateString = that.toDateString, today = getToday(), html = '';\n if (showHeader) {\n html += '';\n } else {\n html += '';\n }\n if (isWeekColumnVisible) {\n html += '';\n }\n for (; idx < 7; idx++) {\n html += '';\n }\n adjustDST(today, 0);\n today = +today;\n return view({\n cells: 42,\n perRow: 7,\n html: html += '',\n start: start,\n isWeekColumnVisible: isWeekColumnVisible,\n weekNumber: options.weekNumber,\n min: createDate(min.getFullYear(), min.getMonth(), min.getDate()),\n max: createDate(max.getFullYear(), max.getMonth(), max.getDate()),\n otherMonth: otherMonth,\n content: options.content,\n lastDayOfMonth: lastDayOfMonth,\n empty: options.empty,\n setter: that.setDate,\n disableDates: options.disableDates,\n build: function (date, idx, disableDates) {\n var cssClass = [], day = date.getDay(), linkClass = '', url = '#';\n if (date < firstDayOfMonth || date > lastDayOfMonth) {\n cssClass.push(OTHERMONTH);\n }\n if (disableDates(date)) {\n cssClass.push(DISABLED);\n }\n if (+date === today) {\n cssClass.push('k-today');\n }\n if (day === 0 || day === 6) {\n cssClass.push('k-weekend');\n }\n if (hasUrl && inArray(+date, dates)) {\n url = navigateUrl.replace('{0}', kendo.toString(date, format, culture));\n linkClass = ' k-action-link';\n }\n return {\n date: date,\n dates: dates,\n ns: kendo.ns,\n title: kendo.toString(date, 'D', culture),\n value: date.getDate(),\n dateString: toDateString(date),\n cssClass: cssClass[0] ? ' class=\"' + cssClass.join(' ') + '\"' : '',\n linkClass: linkClass,\n url: url\n };\n },\n weekNumberBuild: function (date) {\n return {\n weekNumber: weekInYear(date, kendo.culture().calendar.firstDay),\n currentDate: date\n };\n }\n });\n },\n first: function (date) {\n return calendar.firstDayOfMonth(date);\n },\n last: function (date) {\n var last = createDate(date.getFullYear(), date.getMonth() + 1, 0), first = calendar.firstDayOfMonth(date), timeOffset = Math.abs(last.getTimezoneOffset() - first.getTimezoneOffset());\n if (timeOffset) {\n last.setHours(first.getHours() + timeOffset / 60);\n }\n return last;\n },\n compare: function (date1, date2) {\n var result, month1 = date1.getMonth(), year1 = date1.getFullYear(), month2 = date2.getMonth(), year2 = date2.getFullYear();\n if (year1 > year2) {\n result = 1;\n } else if (year1 < year2) {\n result = -1;\n } else {\n result = month1 == month2 ? 0 : month1 > month2 ? 1 : -1;\n }\n return result;\n },\n setDate: function (date, value) {\n var hours = date.getHours();\n if (value instanceof DATE) {\n date.setFullYear(value.getFullYear(), value.getMonth(), value.getDate());\n } else {\n calendar.setTime(date, value * MS_PER_DAY);\n }\n adjustDST(date, hours);\n },\n toDateString: function (date) {\n return date.getFullYear() + '/' + date.getMonth() + '/' + date.getDate();\n }\n },\n {\n name: 'year',\n title: function (date) {\n return date.getFullYear();\n },\n content: function (options) {\n var namesAbbr = getCalendarInfo(options.culture).months.namesAbbr, toDateString = this.toDateString, min = options.min, max = options.max, html = '';\n if (options.showHeader) {\n html += '
' + this.title(date, min, max, culture) + '
' + options.messages.weekColumnHeader + '' + shortNames[idx] + '
';\n }\n return view({\n min: createDate(min.getFullYear(), min.getMonth(), 1),\n max: createDate(max.getFullYear(), max.getMonth(), 1),\n start: createDate(options.date.getFullYear(), 0, 1),\n html: html,\n setter: this.setDate,\n build: function (date) {\n return {\n value: namesAbbr[date.getMonth()],\n ns: kendo.ns,\n dateString: toDateString(date),\n cssClass: ''\n };\n }\n });\n },\n first: function (date) {\n return createDate(date.getFullYear(), 0, date.getDate());\n },\n last: function (date) {\n return createDate(date.getFullYear(), 11, date.getDate());\n },\n compare: function (date1, date2) {\n return compare(date1, date2);\n },\n setDate: function (date, value) {\n var month, hours = date.getHours();\n if (value instanceof DATE) {\n month = value.getMonth();\n date.setFullYear(value.getFullYear(), month, date.getDate());\n if (month !== date.getMonth()) {\n date.setDate(0);\n }\n } else {\n month = date.getMonth() + value;\n date.setMonth(month);\n if (month > 11) {\n month -= 12;\n }\n if (month > 0 && date.getMonth() != month) {\n date.setDate(0);\n }\n }\n adjustDST(date, hours);\n },\n toDateString: function (date) {\n return date.getFullYear() + '/' + date.getMonth() + '/1';\n }\n },\n {\n name: 'decade',\n title: function (date, min, max) {\n return title(date, min, max, 10);\n },\n content: function (options) {\n var year = options.date.getFullYear(), toDateString = this.toDateString, html = '';\n if (options.showHeader) {\n html += '
';\n html += this.title(options.date);\n html += '
';\n }\n return view({\n start: createDate(year - year % 10 - 1, 0, 1),\n min: createDate(options.min.getFullYear(), 0, 1),\n max: createDate(options.max.getFullYear(), 0, 1),\n otherMonth: options.otherMonth,\n html: html,\n setter: this.setDate,\n build: function (date, idx) {\n return {\n value: date.getFullYear(),\n ns: kendo.ns,\n dateString: toDateString(date),\n cssClass: idx === 0 || idx == 11 ? OTHERMONTHCLASS : ''\n };\n }\n });\n },\n first: function (date) {\n var year = date.getFullYear();\n return createDate(year - year % 10, date.getMonth(), date.getDate());\n },\n last: function (date) {\n var year = date.getFullYear();\n return createDate(year - year % 10 + 9, date.getMonth(), date.getDate());\n },\n compare: function (date1, date2) {\n return compare(date1, date2, 10);\n },\n setDate: function (date, value) {\n setDate(date, value, 1);\n },\n toDateString: function (date) {\n return date.getFullYear() + '/0/1';\n }\n },\n {\n name: CENTURY,\n title: function (date, min, max) {\n return title(date, min, max, 100);\n },\n content: function (options) {\n var year = options.date.getFullYear(), min = options.min.getFullYear(), max = options.max.getFullYear(), toDateString = this.toDateString, minYear = min, maxYear = max, html = '';\n minYear = minYear - minYear % 10;\n maxYear = maxYear - maxYear % 10;\n if (maxYear - minYear < 10) {\n maxYear = minYear + 9;\n }\n if (options.showHeader) {\n html += '
';\n html += this.title(options.date, options.min, options.max);\n html += '
';\n }\n return view({\n start: createDate(year - year % 100 - 10, 0, 1),\n min: createDate(minYear, 0, 1),\n max: createDate(maxYear, 0, 1),\n otherMonth: options.otherMonth,\n html: html,\n setter: this.setDate,\n build: function (date, idx) {\n var start = date.getFullYear(), end = start + 9;\n if (start < min) {\n start = min;\n }\n if (end > max) {\n end = max;\n }\n return {\n ns: kendo.ns,\n value: start + ' - ' + end,\n dateString: toDateString(date),\n cssClass: idx === 0 || idx == 11 ? OTHERMONTHCLASS : ''\n };\n }\n });\n },\n first: function (date) {\n var year = date.getFullYear();\n return createDate(year - year % 100, date.getMonth(), date.getDate());\n },\n last: function (date) {\n var year = date.getFullYear();\n return createDate(year - year % 100 + 99, date.getMonth(), date.getDate());\n },\n compare: function (date1, date2) {\n return compare(date1, date2, 100);\n },\n setDate: function (date, value) {\n setDate(date, value, 10);\n },\n toDateString: function (date) {\n var year = date.getFullYear();\n return year - year % 10 + '/0/1';\n }\n }\n ]\n };\n function title(date, min, max, modular) {\n var start = date.getFullYear(), minYear = min.getFullYear(), maxYear = max.getFullYear(), end;\n start = start - start % modular;\n end = start + (modular - 1);\n if (start < minYear) {\n start = minYear;\n }\n if (end > maxYear) {\n end = maxYear;\n }\n return start + '-' + end;\n }\n function view(options) {\n var idx = 0, data, min = options.min, max = options.max, start = options.start, setter = options.setter, build = options.build, weekNumberBuild = options.weekNumberBuild, length = options.cells || 12, isWeekColumnVisible = options.isWeekColumnVisible, cellsPerRow = options.perRow || 4, otherMonth = options.otherMonth, lastDayOfMonth = options.lastDayOfMonth, weekNumber = options.weekNumber || weekNumberTemplate, content = options.content || cellTemplate, empty = options.empty || emptyCellTemplate, otherMonthTemplate = options.otherMonthCellTemplate || otherMonthCellTemplate, html = options.html || '
';\n html += this.title(options.date, options.min, options.max);\n html += '
';\n if (isWeekColumnVisible) {\n html += weekNumber(weekNumberBuild(start));\n }\n for (; idx < length; idx++) {\n if (idx > 0 && idx % cellsPerRow === 0) {\n html += '';\n if (isWeekColumnVisible) {\n html += otherMonth || +start <= +lastDayOfMonth ? weekNumber(weekNumberBuild(start)) : weekNumber({ weekNumber: ' ' });\n }\n }\n start = createDate(start.getFullYear(), start.getMonth(), start.getDate());\n adjustDST(start, 0);\n data = build(start, idx, options.disableDates);\n html += data.cssClass.indexOf(OTHERMONTH) !== -1 && !otherMonth ? otherMonthTemplate(data) : isInRange(start, min, max) ? content(data) : empty(data);\n setter(start, 1);\n }\n return html + '
';\n }\n function compare(date1, date2, modifier) {\n var year1 = date1.getFullYear(), start = date2.getFullYear(), end = start, result = 0;\n if (modifier) {\n start = start - start % modifier;\n end = start - start % modifier + modifier - 1;\n }\n if (year1 > end) {\n result = 1;\n } else if (year1 < start) {\n result = -1;\n }\n return result;\n }\n function getToday() {\n var today = new DATE();\n return new DATE(today.getFullYear(), today.getMonth(), today.getDate());\n }\n function restrictValue(value, min, max) {\n var today = getToday();\n if (value) {\n today = new DATE(+value);\n }\n if (min > today) {\n today = new DATE(+min);\n } else if (max < today) {\n today = new DATE(+max);\n }\n return today;\n }\n function isInRange(date, min, max) {\n return +date >= +min && +date <= +max;\n }\n function shiftArray(array, idx) {\n return array.slice(idx).concat(array.slice(0, idx));\n }\n function setDate(date, value, multiplier) {\n value = value instanceof DATE ? value.getFullYear() : date.getFullYear() + multiplier * value;\n date.setFullYear(value);\n }\n function daysBetweenTwoDates(startDate, endDate) {\n if (+endDate < +startDate) {\n var temp = +startDate;\n calendar.views[0].setDate(startDate, endDate);\n calendar.views[0].setDate(endDate, new Date(temp));\n }\n var fromDateUTC = Date.UTC(startDate.getFullYear(), startDate.getMonth(), startDate.getDate());\n var endDateUTC = Date.UTC(endDate.getFullYear(), endDate.getMonth(), endDate.getDate());\n return Math.ceil((+endDateUTC - +fromDateUTC) / kendo.date.MS_PER_DAY);\n }\n function addDaysToArray(array, numberOfDays, fromDate, disableDates) {\n for (var i = 0; i <= numberOfDays; i++) {\n var nextDay = new Date(fromDate.getTime());\n nextDay = new Date(nextDay.setDate(nextDay.getDate() + i));\n if (!disableDates(nextDay)) {\n array.push(nextDay);\n }\n }\n }\n function mousetoggle(e) {\n var disabled = $(this).hasClass('k-state-disabled');\n if (!disabled) {\n $(this).toggleClass(HOVER, MOUSEENTER.indexOf(e.type) > -1 || e.type == FOCUS);\n }\n }\n function prevent(e) {\n e.preventDefault();\n }\n function createDate(year, month, date) {\n var dateObject = new DATE(year, month, date);\n dateObject.setFullYear(year, month, date);\n return dateObject;\n }\n function getCalendarInfo(culture) {\n return getCulture(culture).calendars.standard;\n }\n function normalize(options) {\n var start = views[options.start], depth = views[options.depth], culture = getCulture(options.culture);\n options.format = extractFormat(options.format || culture.calendars.standard.patterns.d);\n if (isNaN(start)) {\n start = 0;\n options.start = MONTH;\n }\n if (depth === undefined || depth > start) {\n options.depth = MONTH;\n }\n if (options.dates === null) {\n options.dates = [];\n }\n }\n function makeUnselectable(element) {\n if (isIE8) {\n element.find('*').attr('unselectable', 'on');\n }\n }\n function addClassToViewContainer(element, currentView) {\n element.addClass('k-' + currentView);\n }\n function inArray(date, dates) {\n for (var i = 0, length = dates.length; i < length; i++) {\n if (date === +dates[i]) {\n return true;\n }\n }\n return false;\n }\n function isEqualDatePart(value1, value2) {\n if (value1) {\n return value1.getFullYear() === value2.getFullYear() && value1.getMonth() === value2.getMonth() && value1.getDate() === value2.getDate();\n }\n return false;\n }\n function isEqualMonth(value1, value2) {\n if (value1) {\n return value1.getFullYear() === value2.getFullYear() && value1.getMonth() === value2.getMonth();\n }\n return false;\n }\n function getDisabledExpr(option) {\n if (kendo.isFunction(option)) {\n return option;\n }\n if ($.isArray(option)) {\n return createDisabledExpr(option);\n }\n return $.noop;\n }\n function convertDatesArray(dates) {\n var result = [];\n for (var i = 0; i < dates.length; i++) {\n result.push(dates[i].setHours(0, 0, 0, 0));\n }\n return result;\n }\n function createDisabledExpr(dates) {\n var body, callback, disabledDates = [], days = [\n 'su',\n 'mo',\n 'tu',\n 'we',\n 'th',\n 'fr',\n 'sa'\n ], searchExpression = 'if (found) {' + ' return true ' + '} else {' + 'return false' + '}';\n if (dates[0] instanceof DATE) {\n disabledDates = convertDatesArray(dates);\n body = 'var found = date && window.kendo.jQuery.inArray(date.setHours(0, 0, 0, 0),[' + disabledDates + ']) > -1;' + searchExpression;\n } else {\n for (var i = 0; i < dates.length; i++) {\n var day = dates[i].slice(0, 2).toLowerCase();\n var index = $.inArray(day, days);\n if (index > -1) {\n disabledDates.push(index);\n }\n }\n body = 'var found = date && window.kendo.jQuery.inArray(date.getDay(),[' + disabledDates + ']) > -1;' + searchExpression;\n }\n callback = new Function('date', body);\n return callback;\n }\n function isEqualDate(oldValue, newValue) {\n if (oldValue instanceof Date && newValue instanceof Date) {\n oldValue = oldValue.getTime();\n newValue = newValue.getTime();\n }\n return oldValue === newValue;\n }\n function toDateObject(link) {\n var value = $(link).attr(kendo.attr(VALUE)).split('/');\n value = createDate(value[0], value[1], value[2]);\n return value;\n }\n calendar.isEqualDatePart = isEqualDatePart;\n calendar.isEqualDate = isEqualDate;\n calendar.makeUnselectable = makeUnselectable;\n calendar.restrictValue = restrictValue;\n calendar.isInRange = isInRange;\n calendar.addClassToViewContainer = addClassToViewContainer;\n calendar.normalize = normalize;\n calendar.viewsEnum = views;\n calendar.disabled = getDisabledExpr;\n calendar.toDateObject = toDateObject;\n calendar.getToday = getToday;\n calendar.createDate = createDate;\n kendo.calendar = calendar;\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('kendo.popup', ['kendo.core'], f);\n}(function () {\n var __meta__ = {\n id: 'popup',\n name: 'Pop-up',\n category: 'framework',\n depends: ['core'],\n advanced: true\n };\n (function ($, undefined) {\n var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, Class = kendo.Class, support = kendo.support, getOffset = kendo.getOffset, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, OPEN = 'open', CLOSE = 'close', DEACTIVATE = 'deactivate', ACTIVATE = 'activate', CENTER = 'center', LEFT = 'left', RIGHT = 'right', TOP = 'top', BOTTOM = 'bottom', ABSOLUTE = 'absolute', HIDDEN = 'hidden', BODY = 'body', LOCATION = 'location', POSITION = 'position', VISIBLE = 'visible', EFFECTS = 'effects', ACTIVE = 'k-state-active', ACTIVEBORDER = 'k-state-border', ACTIVEBORDERREGEXP = /k-state-border-(\\w+)/, ACTIVECHILDREN = '.k-picker-wrap, .k-dropdown-wrap, .k-link', MOUSEDOWN = 'down', DOCUMENT_ELEMENT = $(document.documentElement), proxy = $.proxy, WINDOW = $(window), SCROLL = 'scroll', cssPrefix = support.transitions.css, TRANSFORM = cssPrefix + 'transform', extend = $.extend, NS = '.kendoPopup', styles = [\n 'font-size',\n 'font-family',\n 'font-stretch',\n 'font-style',\n 'font-weight',\n 'line-height'\n ];\n function contains(container, target) {\n if (!container || !target) {\n return false;\n }\n return container === target || $.contains(container, target);\n }\n var Popup = Widget.extend({\n init: function (element, options) {\n var that = this, parentPopup;\n options = options || {};\n if (options.isRtl) {\n options.origin = options.origin || BOTTOM + ' ' + RIGHT;\n options.position = options.position || TOP + ' ' + RIGHT;\n }\n Widget.fn.init.call(that, element, options);\n element = that.element;\n options = that.options;\n that.collisions = options.collision ? options.collision.split(' ') : [];\n that.downEvent = kendo.applyEventMap(MOUSEDOWN, kendo.guid());\n if (that.collisions.length === 1) {\n that.collisions.push(that.collisions[0]);\n }\n parentPopup = $(that.options.anchor).closest('.k-popup,.k-group').filter(':not([class^=km-])');\n options.appendTo = $($(options.appendTo)[0] || parentPopup[0] || document.body);\n that.element.hide().addClass('k-popup k-group k-reset').toggleClass('k-rtl', !!options.isRtl).css({ position: ABSOLUTE }).appendTo(options.appendTo).attr('aria-hidden', true).on('mouseenter' + NS, function () {\n that._hovered = true;\n }).on('wheel' + NS, function (e) {\n var list = $(e.target).find('.k-list');\n var scrollArea = list.parent();\n if (list.length && list.is(':visible') && (scrollArea.scrollTop() === 0 && e.originalEvent.deltaY < 0 || scrollArea.scrollTop() === scrollArea.prop('scrollHeight') - scrollArea.prop('offsetHeight') && e.originalEvent.deltaY > 0)) {\n e.preventDefault();\n }\n }).on('mouseleave' + NS, function () {\n that._hovered = false;\n });\n that.wrapper = $();\n if (options.animation === false) {\n options.animation = {\n open: { effects: {} },\n close: {\n hide: true,\n effects: {}\n }\n };\n }\n extend(options.animation.open, {\n complete: function () {\n that.wrapper.css({ overflow: VISIBLE });\n that._activated = true;\n that._trigger(ACTIVATE);\n }\n });\n extend(options.animation.close, {\n complete: function () {\n that._animationClose();\n }\n });\n that._mousedownProxy = function (e) {\n that._mousedown(e);\n };\n if (support.mobileOS.android) {\n that._resizeProxy = function (e) {\n setTimeout(function () {\n that._resize(e);\n }, 600);\n };\n } else {\n that._resizeProxy = function (e) {\n that._resize(e);\n };\n }\n if (options.toggleTarget) {\n $(options.toggleTarget).on(options.toggleEvent + NS, $.proxy(that.toggle, that));\n }\n },\n events: [\n OPEN,\n ACTIVATE,\n CLOSE,\n DEACTIVATE\n ],\n options: {\n name: 'Popup',\n toggleEvent: 'click',\n origin: BOTTOM + ' ' + LEFT,\n position: TOP + ' ' + LEFT,\n anchor: BODY,\n appendTo: null,\n collision: 'flip fit',\n viewport: window,\n copyAnchorStyles: true,\n autosize: false,\n modal: false,\n adjustSize: {\n width: 0,\n height: 0\n },\n animation: {\n open: {\n effects: 'slideIn:down',\n transition: true,\n duration: 200\n },\n close: {\n duration: 100,\n hide: true\n }\n }\n },\n _animationClose: function () {\n var that = this;\n var location = that.wrapper.data(LOCATION);\n that.wrapper.hide();\n if (location) {\n that.wrapper.css(location);\n }\n if (that.options.anchor != BODY) {\n that._hideDirClass();\n }\n that._closing = false;\n that._trigger(DEACTIVATE);\n },\n destroy: function () {\n var that = this, options = that.options, element = that.element.off(NS), parent;\n Widget.fn.destroy.call(that);\n if (options.toggleTarget) {\n $(options.toggleTarget).off(NS);\n }\n if (!options.modal) {\n DOCUMENT_ELEMENT.off(that.downEvent, that._mousedownProxy);\n that._toggleResize(false);\n }\n kendo.destroy(that.element.children());\n element.removeData();\n if (options.appendTo[0] === document.body) {\n parent = element.parent('.k-animation-container');\n if (parent[0]) {\n parent.remove();\n } else {\n element.remove();\n }\n }\n },\n open: function (x, y) {\n var that = this, fixed = {\n isFixed: !isNaN(parseInt(y, 10)),\n x: x,\n y: y\n }, element = that.element, options = that.options, animation, wrapper, anchor = $(options.anchor), mobile = element[0] && element.hasClass('km-widget');\n if (!that.visible()) {\n if (options.copyAnchorStyles) {\n if (mobile && styles[0] == 'font-size') {\n styles.shift();\n }\n element.css(kendo.getComputedStyles(anchor[0], styles));\n }\n if (element.data('animating') || that._trigger(OPEN)) {\n return;\n }\n that._activated = false;\n if (!options.modal) {\n DOCUMENT_ELEMENT.off(that.downEvent, that._mousedownProxy).on(that.downEvent, that._mousedownProxy);\n that._toggleResize(false);\n that._toggleResize(true);\n }\n that.wrapper = wrapper = kendo.wrap(element, options.autosize).css({\n overflow: HIDDEN,\n display: 'block',\n position: ABSOLUTE\n }).attr('aria-hidden', false);\n if (support.mobileOS.android) {\n wrapper.css(TRANSFORM, 'translatez(0)');\n }\n wrapper.css(POSITION);\n if ($(options.appendTo)[0] == document.body) {\n wrapper.css(TOP, '-10000px');\n }\n that.flipped = that._position(fixed);\n animation = that._openAnimation();\n if (options.anchor != BODY) {\n that._showDirClass(animation);\n }\n element.data(EFFECTS, animation.effects).kendoStop(true).kendoAnimate(animation).attr('aria-hidden', false);\n }\n },\n _location: function (isFixed) {\n var that = this, element = that.element, options = that.options, wrapper, anchor = $(options.anchor), mobile = element[0] && element.hasClass('km-widget');\n if (options.copyAnchorStyles) {\n if (mobile && styles[0] == 'font-size') {\n styles.shift();\n }\n element.css(kendo.getComputedStyles(anchor[0], styles));\n }\n that.wrapper = wrapper = kendo.wrap(element, options.autosize).css({\n overflow: HIDDEN,\n display: 'block',\n position: ABSOLUTE\n });\n if (support.mobileOS.android) {\n wrapper.css(TRANSFORM, 'translatez(0)');\n }\n wrapper.css(POSITION);\n if ($(options.appendTo)[0] == document.body) {\n wrapper.css(TOP, '-10000px');\n }\n that._position(isFixed || {});\n var offset = wrapper.offset();\n return {\n width: kendo._outerWidth(wrapper),\n height: kendo._outerHeight(wrapper),\n left: offset.left,\n top: offset.top\n };\n },\n _openAnimation: function () {\n var animation = extend(true, {}, this.options.animation.open);\n animation.effects = kendo.parseEffects(animation.effects, this.flipped);\n return animation;\n },\n _hideDirClass: function () {\n var anchor = $(this.options.anchor);\n var direction = ((anchor.attr('class') || '').match(ACTIVEBORDERREGEXP) || [\n '',\n 'down'\n ])[1];\n var dirClass = ACTIVEBORDER + '-' + direction;\n anchor.removeClass(dirClass).children(ACTIVECHILDREN).removeClass(ACTIVE).removeClass(dirClass);\n this.element.removeClass(ACTIVEBORDER + '-' + kendo.directions[direction].reverse);\n },\n _showDirClass: function (animation) {\n var direction = animation.effects.slideIn ? animation.effects.slideIn.direction : 'down';\n var dirClass = ACTIVEBORDER + '-' + direction;\n $(this.options.anchor).addClass(dirClass).children(ACTIVECHILDREN).addClass(ACTIVE).addClass(dirClass);\n this.element.addClass(ACTIVEBORDER + '-' + kendo.directions[direction].reverse);\n },\n position: function () {\n if (this.visible()) {\n this.flipped = this._position();\n }\n },\n toggle: function () {\n var that = this;\n that[that.visible() ? CLOSE : OPEN]();\n },\n visible: function () {\n return this.element.is(':' + VISIBLE);\n },\n close: function (skipEffects) {\n var that = this, options = that.options, wrap, animation, openEffects, closeEffects;\n if (that.visible()) {\n wrap = that.wrapper[0] ? that.wrapper : kendo.wrap(that.element).hide();\n that._toggleResize(false);\n if (that._closing || that._trigger(CLOSE)) {\n that._toggleResize(true);\n return;\n }\n that.element.find('.k-popup').each(function () {\n var that = $(this), popup = that.data('kendoPopup');\n if (popup) {\n popup.close(skipEffects);\n }\n });\n DOCUMENT_ELEMENT.off(that.downEvent, that._mousedownProxy);\n if (skipEffects) {\n animation = {\n hide: true,\n effects: {}\n };\n } else {\n animation = extend(true, {}, options.animation.close);\n openEffects = that.element.data(EFFECTS);\n closeEffects = animation.effects;\n if (!closeEffects && !kendo.size(closeEffects) && openEffects && kendo.size(openEffects)) {\n animation.effects = openEffects;\n animation.reverse = true;\n }\n that._closing = true;\n }\n that.element.kendoStop(true).attr('aria-hidden', true);\n wrap.css({ overflow: HIDDEN }).attr('aria-hidden', true);\n that.element.kendoAnimate(animation);\n if (skipEffects) {\n that._animationClose();\n }\n }\n },\n _trigger: function (ev) {\n return this.trigger(ev, { type: ev });\n },\n _resize: function (e) {\n var that = this;\n if (support.resize.indexOf(e.type) !== -1) {\n clearTimeout(that._resizeTimeout);\n that._resizeTimeout = setTimeout(function () {\n that._position();\n that._resizeTimeout = null;\n }, 50);\n } else {\n if (!that._hovered || that._activated && that.element.hasClass('k-list-container')) {\n that.close();\n }\n }\n },\n _toggleResize: function (toggle) {\n var method = toggle ? 'on' : 'off';\n var eventNames = support.resize;\n if (!(support.mobileOS.ios || support.mobileOS.android || support.browser.safari)) {\n eventNames += ' ' + SCROLL;\n }\n if (toggle && !this.scrollableParents) {\n this.scrollableParents = this._scrollableParents();\n }\n if (this.scrollableParents && this.scrollableParents.length) {\n this.scrollableParents[method](SCROLL, this._resizeProxy);\n }\n WINDOW[method](eventNames, this._resizeProxy);\n },\n _mousedown: function (e) {\n var that = this, container = that.element[0], options = that.options, anchor = $(options.anchor)[0], toggleTarget = options.toggleTarget, target = kendo.eventTarget(e), popup = $(target).closest('.k-popup'), mobile = popup.parent().parent('.km-shim').length;\n popup = popup[0];\n if (!mobile && popup && popup !== that.element[0]) {\n return;\n }\n if ($(e.target).closest('a').data('rel') === 'popover') {\n return;\n }\n if (!contains(container, target) && !contains(anchor, target) && !(toggleTarget && contains($(toggleTarget)[0], target))) {\n that.close();\n }\n },\n _fit: function (position, size, viewPortSize) {\n var output = 0;\n if (position + size > viewPortSize) {\n output = viewPortSize - (position + size);\n }\n if (position < 0) {\n output = -position;\n }\n return output;\n },\n _flip: function (offset, size, anchorSize, viewPortSize, origin, position, boxSize) {\n var output = 0;\n boxSize = boxSize || size;\n if (position !== origin && position !== CENTER && origin !== CENTER) {\n if (offset + boxSize > viewPortSize) {\n output += -(anchorSize + size);\n }\n if (offset + output < 0) {\n output += anchorSize + size;\n }\n }\n return output;\n },\n _scrollableParents: function () {\n return $(this.options.anchor).parentsUntil('body').filter(function (index, element) {\n return kendo.isScrollable(element);\n });\n },\n _position: function (fixed) {\n var that = this, element = that.element, wrapper = that.wrapper, options = that.options, viewport = $(options.viewport), zoomLevel = support.zoomLevel(), isWindow = !!(viewport[0] == window && window.innerWidth && zoomLevel <= 1.02), anchor = $(options.anchor), origins = options.origin.toLowerCase().split(' '), positions = options.position.toLowerCase().split(' '), collisions = that.collisions, siblingContainer, parents, parentZIndex, zIndex = 10002, idx = 0, docEl = document.documentElement, length, viewportOffset, viewportWidth, viewportHeight;\n if (options.viewport === window) {\n viewportOffset = {\n top: window.pageYOffset || document.documentElement.scrollTop || 0,\n left: window.pageXOffset || document.documentElement.scrollLeft || 0\n };\n } else {\n viewportOffset = viewport.offset();\n }\n if (isWindow) {\n viewportWidth = window.innerWidth;\n viewportHeight = window.innerHeight;\n } else {\n viewportWidth = viewport.width();\n viewportHeight = viewport.height();\n }\n if (isWindow && docEl.scrollHeight - docEl.clientHeight > 0) {\n var sign = options.isRtl ? -1 : 1;\n viewportWidth -= sign * kendo.support.scrollbar();\n }\n siblingContainer = anchor.parents().filter(wrapper.siblings());\n if (siblingContainer[0]) {\n parentZIndex = Math.max(Number(siblingContainer.css('zIndex')), 0);\n if (parentZIndex) {\n zIndex = parentZIndex + 10;\n } else {\n parents = anchor.parentsUntil(siblingContainer);\n for (length = parents.length; idx < length; idx++) {\n parentZIndex = Number($(parents[idx]).css('zIndex'));\n if (parentZIndex && zIndex < parentZIndex) {\n zIndex = parentZIndex + 10;\n }\n }\n }\n }\n wrapper.css('zIndex', zIndex);\n if (fixed && fixed.isFixed) {\n wrapper.css({\n left: fixed.x,\n top: fixed.y\n });\n } else {\n wrapper.css(that._align(origins, positions));\n }\n var pos = getOffset(wrapper, POSITION, anchor[0] === wrapper.offsetParent()[0]), offset = getOffset(wrapper), anchorParent = anchor.offsetParent().parent('.k-animation-container,.k-popup,.k-group');\n if (anchorParent.length) {\n pos = getOffset(wrapper, POSITION, true);\n offset = getOffset(wrapper);\n }\n offset.top -= viewportOffset.top;\n offset.left -= viewportOffset.left;\n if (!that.wrapper.data(LOCATION)) {\n wrapper.data(LOCATION, extend({}, pos));\n }\n var offsets = extend({}, offset), location = extend({}, pos), adjustSize = options.adjustSize;\n if (collisions[0] === 'fit') {\n location.top += that._fit(offsets.top, outerHeight(wrapper) + adjustSize.height, viewportHeight / zoomLevel);\n }\n if (collisions[1] === 'fit') {\n location.left += that._fit(offsets.left, outerWidth(wrapper) + adjustSize.width, viewportWidth / zoomLevel);\n }\n var flipPos = extend({}, location);\n var elementHeight = outerHeight(element);\n var wrapperHeight = outerHeight(wrapper);\n if (!wrapper.height() && elementHeight) {\n wrapperHeight = wrapperHeight + elementHeight;\n }\n if (collisions[0] === 'flip') {\n location.top += that._flip(offsets.top, elementHeight, outerHeight(anchor), viewportHeight / zoomLevel, origins[0], positions[0], wrapperHeight);\n }\n if (collisions[1] === 'flip') {\n location.left += that._flip(offsets.left, outerWidth(element), outerWidth(anchor), viewportWidth / zoomLevel, origins[1], positions[1], outerWidth(wrapper));\n }\n element.css(POSITION, ABSOLUTE);\n wrapper.css(location);\n return location.left != flipPos.left || location.top != flipPos.top;\n },\n _align: function (origin, position) {\n var that = this, element = that.wrapper, anchor = $(that.options.anchor), verticalOrigin = origin[0], horizontalOrigin = origin[1], verticalPosition = position[0], horizontalPosition = position[1], anchorOffset = getOffset(anchor), appendTo = $(that.options.appendTo), appendToOffset, width = outerWidth(element), height = outerHeight(element) || outerHeight(element.children().first()), anchorWidth = outerWidth(anchor), anchorHeight = outerHeight(anchor), top = anchorOffset.top, left = anchorOffset.left, round = Math.round;\n if (appendTo[0] != document.body) {\n appendToOffset = getOffset(appendTo);\n top -= appendToOffset.top;\n left -= appendToOffset.left;\n }\n if (verticalOrigin === BOTTOM) {\n top += anchorHeight;\n }\n if (verticalOrigin === CENTER) {\n top += round(anchorHeight / 2);\n }\n if (verticalPosition === BOTTOM) {\n top -= height;\n }\n if (verticalPosition === CENTER) {\n top -= round(height / 2);\n }\n if (horizontalOrigin === RIGHT) {\n left += anchorWidth;\n }\n if (horizontalOrigin === CENTER) {\n left += round(anchorWidth / 2);\n }\n if (horizontalPosition === RIGHT) {\n left -= width;\n }\n if (horizontalPosition === CENTER) {\n left -= round(width / 2);\n }\n return {\n top: top,\n left: left\n };\n }\n });\n ui.plugin(Popup);\n var stableSort = kendo.support.stableSort;\n var tabKeyTrapNS = 'kendoTabKeyTrap';\n var focusableNodesSelector = 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex], *[contenteditable]';\n var TabKeyTrap = Class.extend({\n init: function (element) {\n this.element = $(element);\n this.element.autoApplyNS(tabKeyTrapNS);\n },\n trap: function () {\n this.element.on('keydown', proxy(this._keepInTrap, this));\n },\n removeTrap: function () {\n this.element.kendoDestroy(tabKeyTrapNS);\n },\n destroy: function () {\n this.element.kendoDestroy(tabKeyTrapNS);\n this.element = undefined;\n },\n shouldTrap: function () {\n return true;\n },\n _keepInTrap: function (e) {\n if (e.which !== 9 || !this.shouldTrap() || e.isDefaultPrevented()) {\n return;\n }\n var elements = this._focusableElements();\n var sortedElements = this._sortFocusableElements(elements);\n var next = this._nextFocusable(e, sortedElements);\n this._focus(next);\n e.preventDefault();\n },\n _focusableElements: function () {\n var elements = this.element.find(focusableNodesSelector).filter(function (i, item) {\n return item.tabIndex >= 0 && $(item).is(':visible') && !$(item).is('[disabled]');\n });\n if (this.element.is('[tabindex]')) {\n elements.push(this.element[0]);\n }\n return elements;\n },\n _sortFocusableElements: function (elements) {\n var sortedElements;\n if (stableSort) {\n sortedElements = elements.sort(function (prev, next) {\n return prev.tabIndex - next.tabIndex;\n });\n } else {\n var attrName = '__k_index';\n elements.each(function (i, item) {\n item.setAttribute(attrName, i);\n });\n sortedElements = elements.sort(function (prev, next) {\n return prev.tabIndex === next.tabIndex ? parseInt(prev.getAttribute(attrName), 10) - parseInt(next.getAttribute(attrName), 10) : prev.tabIndex - next.tabIndex;\n });\n elements.removeAttr(attrName);\n }\n return sortedElements;\n },\n _nextFocusable: function (e, elements) {\n var count = elements.length;\n var current = elements.index(e.target);\n return elements.get((current + (e.shiftKey ? -1 : 1)) % count);\n },\n _focus: function (element) {\n if (element.nodeName == 'IFRAME') {\n element.contentWindow.document.body.focus();\n return;\n }\n element.focus();\n if (element.nodeName == 'INPUT' && element.setSelectionRange && this._haveSelectionRange(element)) {\n element.setSelectionRange(0, element.value.length);\n }\n },\n _haveSelectionRange: function (element) {\n var elementType = element.type.toLowerCase();\n return elementType === 'text' || elementType === 'search' || elementType === 'url' || elementType === 'tel' || elementType === 'password';\n }\n });\n ui.Popup.TabKeyTrap = TabKeyTrap;\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('kendo.dateinput', ['kendo.core'], f);\n}(function () {\n var __meta__ = {\n id: 'dateinput',\n name: 'DateInput',\n category: 'web',\n description: 'The DateInput widget allows to edit date by typing.',\n depends: ['core']\n };\n (function ($, undefined) {\n var global = window;\n var kendo = global.kendo;\n var caret = kendo.caret;\n var ui = kendo.ui;\n var Widget = ui.Widget;\n var keys = kendo.keys;\n var ns = '.kendoDateInput';\n var proxy = $.proxy;\n var objectToString = {}.toString;\n var INPUT_EVENT_NAME = (kendo.support.propertyChangeEvent ? 'propertychange.kendoDateInput input' : 'input') + ns;\n var STATEDISABLED = 'k-state-disabled';\n var STATEDEFAULT = 'k-state-default';\n var STATEINVALID = 'k-state-invalid';\n var DISABLED = 'disabled';\n var READONLY = 'readonly';\n var CHANGE = 'change';\n var knownSymbols = 'dMyHhmftsz';\n var DateInput = Widget.extend({\n init: function (element, options) {\n var that = this;\n Widget.fn.init.call(that, element, options);\n element = that.element;\n options = that.options;\n options.format = kendo._extractFormat(options.format || kendo.getCulture(options.culture).calendars.standard.patterns.d);\n options.min = kendo.parseDate(element.attr('min')) || kendo.parseDate(options.min);\n options.max = kendo.parseDate(element.attr('max')) || kendo.parseDate(options.max);\n var insidePicker = (element.parent().attr('class') || '').indexOf('k-picker-wrap') >= 0;\n if (insidePicker) {\n that.wrapper = element.parent();\n } else {\n that.wrapper = element.wrap('').parent();\n that.wrapper.addClass(element[0].className).removeClass('input-validation-error');\n that.wrapper[0].style.cssText = element[0].style.cssText;\n element.css({\n width: '100%',\n height: element[0].style.height\n });\n }\n that._inputWrapper = $(that.wrapper[0]);\n $('').insertAfter(element);\n that._form();\n that.element.addClass(insidePicker ? ' ' : 'k-textbox').attr('autocomplete', 'off').on('focusout' + ns, function () {\n that._change();\n });\n try {\n element[0].setAttribute('type', 'text');\n } catch (e) {\n element[0].type = 'text';\n }\n var disabled = element.is('[disabled]') || $(that.element).parents('fieldset').is(':disabled');\n if (disabled) {\n that.enable(false);\n } else {\n that.readonly(element.is('[readonly]'));\n }\n that.value(that.options.value || element.val());\n kendo.notify(that);\n },\n options: {\n name: 'DateInput',\n culture: '',\n value: '',\n format: '',\n min: new Date(1900, 0, 1),\n max: new Date(2099, 11, 31),\n messages: {\n 'year': 'year',\n 'month': 'month',\n 'day': 'day',\n 'weekday': 'day of the week',\n 'hour': 'hours',\n 'minute': 'minutes',\n 'second': 'seconds',\n 'dayperiod': 'AM/PM'\n }\n },\n events: [CHANGE],\n min: function (value) {\n if (value !== undefined) {\n this.options.min = value;\n } else {\n return this.options.min;\n }\n },\n max: function (value) {\n if (value !== undefined) {\n this.options.max = value;\n } else {\n return this.options.max;\n }\n },\n setOptions: function (options) {\n var that = this;\n Widget.fn.setOptions.call(that, options);\n this._unbindInput();\n this._bindInput();\n this._updateElementValue();\n },\n destroy: function () {\n var that = this;\n that.element.off(ns);\n if (that._formElement) {\n that._formElement.off('reset', that._resetHandler);\n }\n Widget.fn.destroy.call(that);\n },\n value: function (value) {\n if (value === undefined) {\n return this._dateTime.getDateObject();\n }\n if (value === null) {\n value = '';\n }\n if (objectToString.call(value) !== '[object Date]') {\n value = kendo.parseDate(value, this.options.format, this.options.culture);\n }\n if (value && !value.getTime()) {\n value = null;\n }\n this._dateTime = new customDateTime(value, this.options.format, this.options.culture, this.options.messages);\n this._updateElementValue();\n this._oldValue = value;\n },\n _updateElementValue: function () {\n var stringAndFromat = this._dateTime.toPair(this.options.format, this.options.culture, this.options.messages);\n this.element.val(stringAndFromat[0]);\n this._oldText = stringAndFromat[0];\n this._format = stringAndFromat[1];\n },\n readonly: function (readonly) {\n this._editable({\n readonly: readonly === undefined ? true : readonly,\n disable: false\n });\n },\n enable: function (enable) {\n this._editable({\n readonly: false,\n disable: !(enable = enable === undefined ? true : enable)\n });\n },\n _bindInput: function () {\n var that = this;\n that.element.on('focusout' + ns, function () {\n that._change();\n }).on('paste' + ns, proxy(that._paste, that)).on('keydown' + ns, proxy(that._keydown, that)).on(INPUT_EVENT_NAME, proxy(that._input, that)).on('mouseup' + ns, proxy(that._mouseUp, that)).on('DOMMouseScroll' + ns + ' mousewheel' + ns, proxy(that._scroll, that));\n },\n _unbindInput: function () {\n this.element.off('keydown' + ns).off('paste' + ns).off('focusout' + ns).off(INPUT_EVENT_NAME).off('mouseup' + ns).off('DOMMouseScroll' + ns + ' mousewheel' + ns);\n },\n _editable: function (options) {\n var that = this;\n var element = that.element;\n var disable = options.disable;\n var readonly = options.readonly;\n var wrapper = that.wrapper;\n that._unbindInput();\n if (!readonly && !disable) {\n wrapper.addClass(STATEDEFAULT).removeClass(STATEDISABLED);\n if (element && element.length) {\n element[0].removeAttribute(DISABLED);\n element[0].removeAttribute(READONLY);\n }\n that._bindInput();\n } else {\n if (disable) {\n wrapper.addClass(STATEDISABLED).removeClass(STATEDEFAULT);\n element.attr(DISABLED, disable);\n if (element && element.length) {\n element[0].removeAttribute(READONLY);\n }\n }\n if (readonly) {\n element.attr(READONLY, readonly);\n }\n }\n },\n _change: function () {\n var that = this;\n var oldValue = that._oldValue;\n var value = that.value();\n if (value && that.min() && value < that.min()) {\n that.value(that.min());\n value = that.value();\n }\n if (value && that.max() && value > that.max()) {\n that.value(that.max());\n value = that.value();\n }\n if (oldValue && value && value.getTime() !== oldValue.getTime() || oldValue && !value || !oldValue && value) {\n that._oldValue = value;\n that.trigger(CHANGE);\n that.element.trigger(CHANGE);\n }\n },\n _input: function () {\n var that = this;\n var element = that.element[0];\n var blinkInvalid = false;\n if (kendo._activeElement() !== element) {\n return;\n }\n var diff = approximateStringMatching(this._oldText, this._format, this.element[0].value, caret(this.element[0])[0]);\n var navigationOnly = diff.length === 1 && diff[0][1] === ' ';\n if (!navigationOnly) {\n for (var i = 0; i < diff.length; i++) {\n var valid = this._dateTime.parsePart(diff[i][0], diff[i][1]);\n blinkInvalid = blinkInvalid || !valid;\n }\n }\n this._updateElementValue();\n if (diff.length && diff[0][0] !== ' ') {\n this._selectSegment(diff[0][0]);\n if (!navigationOnly) {\n var difSym = diff[0][0];\n setTimeout(function () {\n that._selectSegment(difSym);\n });\n }\n }\n if (navigationOnly) {\n var newEvent = {\n keyCode: 39,\n preventDefault: function () {\n }\n };\n this._keydown(newEvent);\n }\n if (blinkInvalid) {\n clearTimeout(that._blinkInvalidTimeout);\n var stateInvalid = STATEINVALID;\n that.wrapper.addClass(STATEINVALID);\n that._blinkInvalidTimeout = setTimeout(function () {\n that.wrapper.removeClass(stateInvalid);\n }, 100);\n }\n },\n _mouseUp: function () {\n var selection = caret(this.element[0]);\n if (selection[0] === selection[1]) {\n this._selectNearestSegment();\n }\n },\n _scroll: function (e) {\n if (kendo._activeElement() !== this.element[0] || this.element.is('[readonly]')) {\n return;\n }\n e = window.event || e;\n var newEvent = {\n keyCode: 37,\n preventDefault: function () {\n }\n };\n if (e.shiftKey) {\n newEvent.keyCode = (e.wheelDelta || -e.detail) > 0 ? 37 : 39;\n } else {\n newEvent.keyCode = (e.wheelDelta || -e.detail) > 0 ? 38 : 40;\n }\n this._keydown(newEvent);\n e.returnValue = false;\n if (e.preventDefault) {\n e.preventDefault();\n }\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n },\n _form: function () {\n var that = this;\n var element = that.element;\n var formId = element.attr('form');\n var form = formId ? $('#' + formId) : element.closest('form');\n var initialValue = element[0].value;\n if (!initialValue && that.options.value) {\n initialValue = that.options.value;\n }\n if (form[0]) {\n that._resetHandler = function () {\n setTimeout(function () {\n that.value(initialValue);\n });\n };\n that._formElement = form.on('reset', that._resetHandler);\n }\n },\n _paste: function (e) {\n e.preventDefault();\n },\n _keydown: function (e) {\n var key = e.keyCode;\n var selection;\n if (key == 37 || key == 39) {\n e.preventDefault();\n selection = caret(this.element[0]);\n if (selection[0] != selection[1]) {\n this._selectNearestSegment();\n }\n var dir = key == 37 ? -1 : 1;\n var index = dir == -1 ? caret(this.element[0])[0] - 1 : caret(this.element[0])[1] + 1;\n while (index >= 0 && index < this._format.length) {\n if (knownSymbols.indexOf(this._format[index]) >= 0) {\n this._selectSegment(this._format[index]);\n break;\n }\n index += dir;\n }\n }\n if (key == 38 || key == 40) {\n e.preventDefault();\n selection = caret(this.element[0]);\n var symbol = this._format[selection[0]];\n if (knownSymbols.indexOf(symbol) >= 0) {\n var interval = 1;\n if (symbol == 'm') {\n interval = this.options.interval || 1;\n }\n this._dateTime.modifyPart(symbol, key == 38 ? interval * 1 : interval * -1);\n this._updateElementValue();\n this._selectSegment(symbol);\n this.element.trigger(CHANGE);\n }\n }\n if (kendo.support.browser.msie && kendo.support.browser.version < 10) {\n var keycode = e.keyCode ? e.keyCode : e.which;\n if (keycode === 8 || keycode === 46) {\n var that = this;\n setTimeout(function () {\n that._input();\n }, 0);\n }\n }\n if (key === keys.ENTER) {\n this._change();\n }\n },\n _selectNearestSegment: function () {\n var selection = caret(this.element[0]);\n var start = selection[0];\n for (var i = start, j = start - 1; i < this._format.length || j >= 0; i++, j--) {\n if (i < this._format.length && knownSymbols.indexOf(this._format[i]) !== -1) {\n this._selectSegment(this._format[i]);\n return;\n }\n if (j >= 0 && knownSymbols.indexOf(this._format[j]) !== -1) {\n this._selectSegment(this._format[j]);\n return;\n }\n }\n },\n _selectSegment: function (symbol) {\n var begin = -1, end = 0;\n for (var i = 0; i < this._format.length; i++) {\n if (this._format[i] === symbol) {\n end = i + 1;\n if (begin === -1) {\n begin = i;\n }\n }\n }\n if (begin < 0) {\n begin = 0;\n }\n caret(this.element, begin, end);\n }\n });\n ui.plugin(DateInput);\n var customDateTime = function (initDate, initFormat, initCulture, initMessages) {\n var value = null;\n var year = true, month = true, date = true, hours = true, minutes = true, seconds = true, milliseconds = true;\n var typedMonthPart = '';\n var typedDayPeriodPart = '';\n var placeholders = {};\n var zeros = [\n '',\n '0',\n '00',\n '000',\n '0000'\n ];\n function pad(number, digits, end) {\n number = number + '';\n digits = digits || 2;\n end = digits - number.length;\n if (end) {\n return zeros[digits].substring(0, end) + number;\n }\n return number;\n }\n var dateFormatRegExp = /dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|HH|H|hh|h|mm|m|fff|ff|f|tt|ss|s|zzz|zz|z|\"[^\"]*\"|'[^']*'/g;\n var months = null, calendar = null, days = null, returnsFormat = false;\n var matcher = function (match) {\n var mins, sign;\n var result;\n switch (match) {\n case 'd':\n result = date ? value.getDate() : placeholders.day;\n break;\n case 'dd':\n result = date ? pad(value.getDate()) : placeholders.day;\n break;\n case 'ddd':\n result = date && month && year ? days.namesAbbr[value.getDay()] : placeholders.weekday;\n break;\n case 'dddd':\n result = date && month && year ? days.names[value.getDay()] : placeholders.weekday;\n break;\n case 'M':\n result = month ? value.getMonth() + 1 : placeholders.month;\n break;\n case 'MM':\n result = month ? pad(value.getMonth() + 1) : placeholders.month;\n break;\n case 'MMM':\n result = month ? months.namesAbbr[value.getMonth()] : placeholders.month;\n break;\n case 'MMMM':\n result = month ? months.names[value.getMonth()] : placeholders.month;\n break;\n case 'yy':\n result = year ? pad(value.getFullYear() % 100) : placeholders.year;\n break;\n case 'yyyy':\n result = year ? pad(value.getFullYear(), 4) : placeholders.year;\n break;\n case 'h':\n result = hours ? value.getHours() % 12 || 12 : placeholders.hour;\n break;\n case 'hh':\n result = hours ? pad(value.getHours() % 12 || 12) : placeholders.hour;\n break;\n case 'H':\n result = hours ? value.getHours() : placeholders.hour;\n break;\n case 'HH':\n result = hours ? pad(value.getHours()) : placeholders.hour;\n break;\n case 'm':\n result = minutes ? value.getMinutes() : placeholders.minute;\n break;\n case 'mm':\n result = minutes ? pad(value.getMinutes()) : placeholders.minute;\n break;\n case 's':\n result = seconds ? value.getSeconds() : placeholders.second;\n break;\n case 'ss':\n result = seconds ? pad(value.getSeconds()) : placeholders.second;\n break;\n case 'f':\n result = milliseconds ? Math.floor(value.getMilliseconds() / 100) : milliseconds;\n break;\n case 'ff':\n result = value.getMilliseconds();\n if (result > 99) {\n result = Math.floor(result / 10);\n }\n result = milliseconds ? pad(result) : match;\n break;\n case 'fff':\n result = milliseconds ? pad(value.getMilliseconds(), 3) : match;\n break;\n case 'tt':\n result = hours ? value.getHours() < 12 ? calendar.AM[0] : calendar.PM[0] : placeholders.dayperiod;\n break;\n case 'zzz':\n mins = value.getTimezoneOffset();\n sign = mins < 0;\n result = Math.abs(mins / 60).toString().split('.')[0];\n mins = Math.abs(mins) - result * 60;\n result = (sign ? '+' : '-') + pad(result);\n result += ':' + pad(mins);\n break;\n case 'z':\n case 'zz':\n result = value.getTimezoneOffset() / 60;\n sign = result < 0;\n result = Math.abs(result).toString().split('.')[0];\n result = (sign ? '+' : '-') + (match === 'zz' ? pad(result) : result);\n break;\n }\n result = result !== undefined ? result : match.slice(1, match.length - 1);\n if (returnsFormat) {\n result = '' + result;\n var formatResult = '';\n if (match == 'ddd') {\n match = 'EEE';\n }\n if (match == 'dddd') {\n match = 'EEEE';\n }\n for (var i = 0; i < result.length; i++) {\n formatResult += match[0];\n }\n return formatResult;\n } else {\n return result;\n }\n };\n function generateMatcher(retFormat) {\n returnsFormat = retFormat;\n return matcher;\n }\n function setExisting(symbol, val) {\n switch (symbol) {\n case 'y':\n year = val;\n break;\n case 'M':\n month = val;\n if (!val) {\n value.setMonth(0);\n typedMonthPart = '';\n }\n break;\n case 'd':\n date = val;\n break;\n case 'H':\n case 'h':\n hours = val;\n if (!val) {\n typedDayPeriodPart = '';\n }\n break;\n case 'm':\n minutes = val;\n break;\n case 's':\n seconds = val;\n break;\n default:\n return;\n }\n }\n this.setValue = function (val) {\n date = val;\n };\n this.getValue = function () {\n return date;\n };\n this.modifyPart = function (symbol, offset) {\n var newValue = new Date(value && value.getTime ? value.getTime() : value);\n switch (symbol) {\n case 'y':\n newValue.setFullYear(newValue.getFullYear() + offset);\n break;\n case 'M':\n var newMonth = newValue.getMonth() + offset;\n newValue.setMonth(newMonth);\n if (newValue.getMonth() % 12 !== (newMonth + 12) % 12) {\n newValue.setDate(1);\n newValue.setMonth(newMonth);\n }\n break;\n case 'd':\n case 'E':\n newValue.setDate(newValue.getDate() + offset);\n break;\n case 'H':\n case 'h':\n newValue.setHours(newValue.getHours() + offset);\n break;\n case 'm':\n newValue.setMinutes(newValue.getMinutes() + offset);\n break;\n case 's':\n newValue.setSeconds(newValue.getSeconds() + offset);\n break;\n case 't':\n newValue.setHours((newValue.getHours() + 12) % 24);\n break;\n default:\n break;\n }\n if (newValue.getFullYear() > 0) {\n setExisting(symbol, true);\n value = newValue;\n }\n };\n this.parsePart = function (symbol, currentChar) {\n if (!currentChar) {\n setExisting(symbol, false);\n return true;\n }\n var newValue = new Date(value && value.getTime ? value.getTime() : value);\n var newHours;\n switch (symbol) {\n case 'd':\n var newDate = (date ? newValue.getDate() * 10 : 0) + parseInt(currentChar, 10);\n if (isNaN(newDate)) {\n return;\n }\n while (newDate > 31) {\n newDate = parseInt(newDate.toString().slice(1), 10);\n }\n if (newDate < 1) {\n date = false;\n } else {\n newValue.setDate(newDate);\n if (newValue.getMonth() !== value.getMonth()) {\n return;\n }\n date = true;\n }\n break;\n case 'M':\n var newMonth = (month ? (newValue.getMonth() + 1) * 10 : 0) + parseInt(currentChar, 10);\n if (!isNaN(newMonth)) {\n while (newMonth > 12) {\n newMonth = parseInt(newMonth.toString().slice(1), 10);\n }\n if (newMonth < 1) {\n month = false;\n } else {\n newValue.setMonth(newMonth - 1);\n if (newValue.getMonth() !== newMonth - 1) {\n newValue.setDate(1);\n newValue.setMonth(newMonth - 1);\n }\n month = true;\n }\n } else {\n var monthNames = calendar.months.names;\n typedMonthPart += currentChar.toLowerCase();\n while (typedMonthPart.length > 0) {\n for (var i = 0; i < monthNames.length; i++) {\n if (monthNames[i].toLowerCase().indexOf(typedMonthPart) === 0) {\n newValue.setMonth(i);\n month = true;\n value = newValue;\n return true;\n }\n }\n typedMonthPart = typedMonthPart.substring(1, typedMonthPart.length);\n }\n return false;\n }\n break;\n case 'y':\n var newYear = (year ? newValue.getFullYear() * 10 : 0) + parseInt(currentChar, 10);\n if (isNaN(newYear)) {\n return;\n }\n while (newYear > 9999) {\n newYear = parseInt(newYear.toString().slice(1), 10);\n }\n if (newYear < 1) {\n year = false;\n } else {\n newValue.setFullYear(newYear);\n year = true;\n }\n break;\n case 'h':\n newHours = (hours ? (newValue.getHours() % 12 || 12) * 10 : 0) + parseInt(currentChar, 10);\n if (isNaN(newHours)) {\n return;\n }\n while (newHours > 12) {\n newHours = parseInt(newHours.toString().slice(1), 10);\n }\n newValue.setHours(Math.floor(newValue.getHours() / 12) * 12 + newHours % 12);\n hours = true;\n break;\n case 'H':\n newHours = (hours ? newValue.getHours() * 10 : 0) + parseInt(currentChar, 10);\n if (isNaN(newHours)) {\n return;\n }\n while (newHours > 23) {\n newHours = parseInt(newHours.toString().slice(1), 10);\n }\n newValue.setHours(newHours);\n hours = true;\n break;\n case 'm':\n var newMinutes = (minutes ? newValue.getMinutes() * 10 : 0) + parseInt(currentChar, 10);\n if (isNaN(newMinutes)) {\n return;\n }\n while (newMinutes > 59) {\n newMinutes = parseInt(newMinutes.toString().slice(1), 10);\n }\n newValue.setMinutes(newMinutes);\n minutes = true;\n break;\n case 's':\n var newSeconds = (seconds ? newValue.getSeconds() * 10 : 0) + parseInt(currentChar, 10);\n if (isNaN(newSeconds)) {\n return;\n }\n while (newSeconds > 59) {\n newSeconds = parseInt(newSeconds.toString().slice(1), 10);\n }\n newValue.setSeconds(newSeconds);\n seconds = true;\n break;\n case 't':\n if (hours) {\n typedDayPeriodPart += currentChar.toLowerCase();\n while (typedDayPeriodPart.length > 0) {\n if (calendar.AM[0].toLowerCase().indexOf(typedDayPeriodPart) === 0 && newValue.getHours() >= 12 || calendar.PM[0].toLowerCase().indexOf(typedDayPeriodPart) === 0 && newValue.getHours() < 12) {\n newValue.setHours((newValue.getHours() + 12) % 24);\n value = newValue;\n return true;\n }\n typedDayPeriodPart = typedDayPeriodPart.substring(1, typedDayPeriodPart.length);\n }\n return false;\n }\n break;\n default:\n break;\n }\n value = newValue;\n return true;\n };\n this.toPair = function (format, culture, messages) {\n if (!format) {\n return [\n '',\n ''\n ];\n }\n culture = kendo.getCulture(culture);\n calendar = culture.calendars.standard;\n format = calendar.patterns[format] || format;\n days = calendar.days;\n months = calendar.months;\n placeholders = messages;\n return [\n format.replace(dateFormatRegExp, generateMatcher(false)),\n format.replace(dateFormatRegExp, generateMatcher(true))\n ];\n };\n this.getDateObject = function () {\n return year && month && date && hours && minutes && seconds && milliseconds ? new Date(value.getTime()) : null;\n };\n if (!initDate) {\n value = new Date();\n var sampleFormat = this.toPair(initFormat, initCulture, initMessages)[1];\n for (var i = 0; i < sampleFormat.length; i++) {\n setExisting(sampleFormat[i], false);\n }\n } else {\n value = new Date(initDate.getTime());\n }\n };\n function approximateStringMatching(oldText, oldFormat, newText, caret) {\n var oldTextSeparator = oldText[caret + oldText.length - newText.length];\n oldText = oldText.substring(0, caret + oldText.length - newText.length);\n newText = newText.substring(0, caret);\n var diff = [];\n var i;\n if (oldText === newText && caret > 0) {\n diff.push([\n oldFormat[caret - 1],\n newText[caret - 1]\n ]);\n return diff;\n }\n if (oldText.indexOf(newText) === 0 && (newText.length === 0 || oldFormat[newText.length - 1] !== oldFormat[newText.length])) {\n var deletedSymbol = '';\n for (i = newText.length; i < oldText.length; i++) {\n if (oldFormat[i] !== deletedSymbol && knownSymbols.indexOf(oldFormat[i]) >= 0) {\n deletedSymbol = oldFormat[i];\n diff.push([\n deletedSymbol,\n ''\n ]);\n }\n }\n return diff;\n }\n if (newText[newText.length - 1] === ' ' || newText[newText.length - 1] === oldTextSeparator) {\n return [[\n oldFormat[caret - 1],\n ' '\n ]];\n }\n if (newText.indexOf(oldText) === 0 || knownSymbols.indexOf(oldFormat[caret - 1]) === -1) {\n var symbol = oldFormat[0];\n for (i = Math.max(0, oldText.length - 1); i < oldFormat.length; i++) {\n if (knownSymbols.indexOf(oldFormat[i]) >= 0) {\n symbol = oldFormat[i];\n break;\n }\n }\n return [[\n symbol,\n newText[caret - 1]\n ]];\n }\n return [[\n oldFormat[caret - 1],\n newText[caret - 1]\n ]];\n }\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('kendo.datepicker', [\n 'kendo.calendar',\n 'kendo.popup',\n 'kendo.dateinput'\n ], f);\n}(function () {\n var __meta__ = {\n id: 'datepicker',\n name: 'DatePicker',\n category: 'web',\n description: 'The DatePicker widget allows the user to select a date from a calendar or by direct input.',\n depends: [\n 'calendar',\n 'popup'\n ]\n };\n (function ($, undefined) {\n var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, parse = kendo.parseDate, keys = kendo.keys, support = kendo.support, template = kendo.template, activeElement = kendo._activeElement, DIV = '
', SPAN = '', ns = '.kendoDatePicker', CLICK = 'click' + ns, UP = support.mouseAndTouchPresent ? kendo.applyEventMap('up', ns.slice(1)) : CLICK, OPEN = 'open', CLOSE = 'close', CHANGE = 'change', DISABLED = 'disabled', READONLY = 'readonly', DEFAULT = 'k-state-default', FOCUSED = 'k-state-focused', SELECTED = 'k-state-selected', STATEDISABLED = 'k-state-disabled', HOVER = 'k-state-hover', HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, MOUSEDOWN = 'mousedown' + ns, ID = 'id', MIN = 'min', MAX = 'max', MONTH = 'month', ARIA_DISABLED = 'aria-disabled', ARIA_EXPANDED = 'aria-expanded', ARIA_HIDDEN = 'aria-hidden', calendar = kendo.calendar, isInRange = calendar.isInRange, restrictValue = calendar.restrictValue, isEqualDatePart = calendar.isEqualDatePart, extend = $.extend, proxy = $.proxy, DATE = Date;\n function normalize(options) {\n var parseFormats = options.parseFormats, format = options.format;\n calendar.normalize(options);\n parseFormats = $.isArray(parseFormats) ? parseFormats : [parseFormats];\n if (!parseFormats.length) {\n parseFormats.push('yyyy-MM-dd');\n }\n if ($.inArray(format, parseFormats) === -1) {\n parseFormats.splice(0, 0, options.format);\n }\n options.parseFormats = parseFormats;\n }\n function preventDefault(e) {\n e.preventDefault();\n }\n var DateView = function (options) {\n var that = this, id, body = document.body, div = $(DIV).attr(ARIA_HIDDEN, 'true').addClass('k-calendar-container').appendTo(body);\n that.options = options = options || {};\n id = options.id;\n if (id) {\n id += '_dateview';\n div.attr(ID, id);\n that._dateViewID = id;\n }\n that.popup = new ui.Popup(div, extend(options.popup, options, {\n name: 'Popup',\n isRtl: kendo.support.isRtl(options.anchor)\n }));\n that.div = div;\n that.value(options.value);\n };\n DateView.prototype = {\n _calendar: function () {\n var that = this;\n var calendar = that.calendar;\n var options = that.options;\n var div;\n if (!calendar) {\n div = $(DIV).attr(ID, kendo.guid()).appendTo(that.popup.element).on(MOUSEDOWN, preventDefault).on(CLICK, 'td:has(.k-link)', proxy(that._click, that));\n that.calendar = calendar = new ui.Calendar(div);\n that._setOptions(options);\n kendo.calendar.makeUnselectable(calendar.element);\n calendar.navigate(that._value || that._current, options.start);\n that.value(that._value);\n }\n },\n _setOptions: function (options) {\n this.calendar.setOptions({\n focusOnNav: false,\n change: options.change,\n culture: options.culture,\n dates: options.dates,\n depth: options.depth,\n footer: options.footer,\n format: options.format,\n max: options.max,\n min: options.min,\n month: options.month,\n weekNumber: options.weekNumber,\n start: options.start,\n disableDates: options.disableDates\n });\n },\n setOptions: function (options) {\n var old = this.options;\n var disableDates = options.disableDates;\n if (disableDates) {\n options.disableDates = calendar.disabled(disableDates);\n }\n this.options = extend(old, options, {\n change: old.change,\n close: old.close,\n open: old.open\n });\n if (this.calendar) {\n this._setOptions(this.options);\n }\n },\n destroy: function () {\n this.popup.destroy();\n },\n open: function () {\n var that = this;\n var popupHovered;\n that._calendar();\n popupHovered = that.popup._hovered;\n that.popup._hovered = true;\n that.popup.open();\n setTimeout(function () {\n that.popup._hovered = popupHovered;\n }, 1);\n },\n close: function () {\n this.popup.close();\n },\n min: function (value) {\n this._option(MIN, value);\n },\n max: function (value) {\n this._option(MAX, value);\n },\n toggle: function () {\n var that = this;\n that[that.popup.visible() ? CLOSE : OPEN]();\n },\n move: function (e) {\n var that = this, key = e.keyCode, calendar = that.calendar, selectIsClicked = e.ctrlKey && key == keys.DOWN || key == keys.ENTER, handled = false;\n if (e.altKey) {\n if (key == keys.DOWN) {\n that.open();\n e.preventDefault();\n handled = true;\n } else if (key == keys.UP) {\n that.close();\n e.preventDefault();\n handled = true;\n }\n } else if (that.popup.visible()) {\n if (key == keys.ESC || selectIsClicked && calendar._cell.hasClass(SELECTED)) {\n that.close();\n e.preventDefault();\n return true;\n }\n if (key != keys.SPACEBAR) {\n that._current = calendar._move(e);\n }\n handled = true;\n }\n return handled;\n },\n current: function (date) {\n this._current = date;\n if (this.calendar) {\n this.calendar._focus(date);\n }\n },\n value: function (value) {\n var that = this, calendar = that.calendar, options = that.options, disabledDate = options.disableDates;\n if (disabledDate && disabledDate(value)) {\n value = null;\n }\n that._value = value;\n that._current = new DATE(+restrictValue(value, options.min, options.max));\n if (calendar) {\n calendar.value(value);\n }\n },\n _click: function (e) {\n if (e.currentTarget.className.indexOf(SELECTED) !== -1) {\n this.calendar.trigger('change');\n this.close();\n }\n },\n _option: function (option, value) {\n var that = this;\n var calendar = that.calendar;\n that.options[option] = value;\n if (calendar) {\n calendar[option](value);\n }\n }\n };\n DateView.normalize = normalize;\n kendo.DateView = DateView;\n var DatePicker = Widget.extend({\n init: function (element, options) {\n var that = this, disabled, div;\n Widget.fn.init.call(that, element, options);\n element = that.element;\n options = that.options;\n options.disableDates = kendo.calendar.disabled(options.disableDates);\n options.min = parse(element.attr('min')) || parse(options.min);\n options.max = parse(element.attr('max')) || parse(options.max);\n normalize(options);\n that._initialOptions = extend({}, options);\n that._wrapper();\n that.dateView = new DateView(extend({}, options, {\n id: element.attr(ID),\n anchor: that.wrapper,\n change: function () {\n that._change(this.value());\n that.close();\n },\n close: function (e) {\n if (that.trigger(CLOSE)) {\n e.preventDefault();\n } else {\n element.attr(ARIA_EXPANDED, false);\n div.attr(ARIA_HIDDEN, true);\n }\n },\n open: function (e) {\n var options = that.options, date;\n if (that.trigger(OPEN)) {\n e.preventDefault();\n } else {\n if (that.element.val() !== that._oldText) {\n date = parse(element.val(), options.parseFormats, options.culture);\n that.dateView[date ? 'current' : 'value'](date);\n }\n element.attr(ARIA_EXPANDED, true);\n div.attr(ARIA_HIDDEN, false);\n that._updateARIA(date);\n }\n }\n }));\n div = that.dateView.div;\n that._icon();\n try {\n element[0].setAttribute('type', 'text');\n } catch (e) {\n element[0].type = 'text';\n }\n element.addClass('k-input').attr({\n role: 'combobox',\n 'aria-expanded': false,\n 'aria-owns': that.dateView._dateViewID,\n 'autocomplete': 'off'\n });\n that._reset();\n that._template();\n disabled = element.is('[disabled]') || $(that.element).parents('fieldset').is(':disabled');\n if (disabled) {\n that.enable(false);\n } else {\n that.readonly(element.is('[readonly]'));\n }\n that._createDateInput(options);\n that._old = that._update(options.value || that.element.val());\n that._oldText = element.val();\n kendo.notify(that);\n },\n events: [\n OPEN,\n CLOSE,\n CHANGE\n ],\n options: {\n name: 'DatePicker',\n value: null,\n footer: '',\n format: '',\n culture: '',\n parseFormats: [],\n min: new Date(1900, 0, 1),\n max: new Date(2099, 11, 31),\n start: MONTH,\n depth: MONTH,\n animation: {},\n month: {},\n dates: [],\n disableDates: null,\n ARIATemplate: 'Current focused date is #=kendo.toString(data.current, \"D\")#',\n dateInput: false,\n weekNumber: false\n },\n setOptions: function (options) {\n var that = this;\n var value = that._value;\n Widget.fn.setOptions.call(that, options);\n options = that.options;\n options.min = parse(options.min);\n options.max = parse(options.max);\n normalize(options);\n that.dateView.setOptions(options);\n that._createDateInput(options);\n if (!that._dateInput) {\n that.element.val(kendo.toString(value, options.format, options.culture));\n }\n if (value) {\n that._updateARIA(value);\n }\n },\n _editable: function (options) {\n var that = this, icon = that._dateIcon.off(ns), element = that.element.off(ns), wrapper = that._inputWrapper.off(ns), readonly = options.readonly, disable = options.disable;\n if (!readonly && !disable) {\n wrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n if (element && element.length) {\n element[0].removeAttribute(DISABLED);\n element[0].removeAttribute(READONLY);\n }\n element.attr(ARIA_DISABLED, false).on('keydown' + ns, proxy(that._keydown, that)).on('focusout' + ns, proxy(that._blur, that)).on('focus' + ns, function () {\n that._inputWrapper.addClass(FOCUSED);\n });\n icon.on(UP, proxy(that._click, that)).on(MOUSEDOWN, preventDefault);\n } else {\n wrapper.addClass(disable ? STATEDISABLED : DEFAULT).removeClass(disable ? DEFAULT : STATEDISABLED);\n element.attr(DISABLED, disable).attr(READONLY, readonly).attr(ARIA_DISABLED, disable);\n }\n },\n readonly: function (readonly) {\n this._editable({\n readonly: readonly === undefined ? true : readonly,\n disable: false\n });\n if (this._dateInput) {\n this._dateInput._editable({\n readonly: readonly === undefined ? true : readonly,\n disable: false\n });\n }\n },\n enable: function (enable) {\n this._editable({\n readonly: false,\n disable: !(enable = enable === undefined ? true : enable)\n });\n if (this._dateInput) {\n this._dateInput._editable({\n readonly: false,\n disable: !(enable = enable === undefined ? true : enable)\n });\n }\n },\n destroy: function () {\n var that = this;\n Widget.fn.destroy.call(that);\n that.dateView.destroy();\n that.element.off(ns);\n that._dateIcon.off(ns);\n that._inputWrapper.off(ns);\n if (that._form) {\n that._form.off('reset', that._resetHandler);\n }\n },\n open: function () {\n this.dateView.open();\n },\n close: function () {\n this.dateView.close();\n },\n min: function (value) {\n return this._option(MIN, value);\n },\n max: function (value) {\n return this._option(MAX, value);\n },\n value: function (value) {\n var that = this;\n if (value === undefined) {\n return that._value;\n }\n that._old = that._update(value);\n if (that._old === null) {\n that.element.val('');\n }\n that._oldText = that.element.val();\n },\n _toggleHover: function (e) {\n $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter');\n },\n _blur: function () {\n var that = this, value = that.element.val();\n that.close();\n if (value !== that._oldText) {\n that._change(value);\n if (!value) {\n that.dateView.current(kendo.calendar.getToday());\n }\n }\n that._inputWrapper.removeClass(FOCUSED);\n },\n _click: function (e) {\n var that = this;\n that.dateView.toggle();\n that._focusElement(e.type);\n },\n _focusElement: function (eventType) {\n var element = this.element;\n if ((!support.touch || support.mouseAndTouchPresent && !(eventType || '').match(/touch/i)) && element[0] !== activeElement()) {\n element.trigger('focus');\n }\n },\n _change: function (value) {\n var that = this, oldValue = that.element.val(), dateChanged;\n value = that._update(value);\n dateChanged = !kendo.calendar.isEqualDate(that._old, value);\n var valueUpdated = dateChanged && !that._typing;\n var textFormatted = oldValue !== that.element.val();\n if (valueUpdated || textFormatted) {\n that.element.trigger(CHANGE);\n }\n if (dateChanged) {\n that._old = value;\n that._oldText = that.element.val();\n that.trigger(CHANGE);\n }\n that._typing = false;\n },\n _keydown: function (e) {\n var that = this, dateView = that.dateView, value = that.element.val(), handled = false;\n if (!dateView.popup.visible() && e.keyCode == keys.ENTER && value !== that._oldText) {\n that._change(value);\n } else {\n handled = dateView.move(e);\n that._updateARIA(dateView._current);\n if (!handled) {\n that._typing = true;\n } else if (that._dateInput && e.stopImmediatePropagation) {\n e.stopImmediatePropagation();\n }\n }\n },\n _icon: function () {\n var that = this, element = that.element, icon;\n icon = element.next('span.k-select');\n if (!icon[0]) {\n icon = $('').insertAfter(element);\n }\n that._dateIcon = icon.attr({\n 'role': 'button',\n 'aria-controls': that.dateView._dateViewID\n });\n },\n _option: function (option, value) {\n var that = this, options = that.options;\n if (value === undefined) {\n return options[option];\n }\n value = parse(value, options.parseFormats, options.culture);\n if (!value) {\n return;\n }\n options[option] = new DATE(+value);\n that.dateView[option](value);\n },\n _update: function (value) {\n var that = this, options = that.options, min = options.min, max = options.max, current = that._value, date = parse(value, options.parseFormats, options.culture), isSameType = date === null && current === null || date instanceof Date && current instanceof Date, formattedValue;\n if (options.disableDates(date)) {\n date = null;\n if (!that._old && !that.element.val()) {\n value = null;\n }\n }\n if (+date === +current && isSameType) {\n formattedValue = kendo.toString(date, options.format, options.culture);\n if (formattedValue !== value) {\n that.element.val(date === null ? value : formattedValue);\n }\n return date;\n }\n if (date !== null && isEqualDatePart(date, min)) {\n date = restrictValue(date, min, max);\n } else if (!isInRange(date, min, max)) {\n date = null;\n }\n that._value = date;\n that.dateView.value(date);\n if (that._dateInput && date) {\n that._dateInput.value(date || value);\n } else {\n that.element.val(kendo.toString(date || value, options.format, options.culture));\n }\n that._updateARIA(date);\n return date;\n },\n _wrapper: function () {\n var that = this, element = that.element, wrapper;\n wrapper = element.parents('.k-datepicker');\n if (!wrapper[0]) {\n wrapper = element.wrap(SPAN).parent().addClass('k-picker-wrap k-state-default');\n wrapper = wrapper.wrap(SPAN).parent();\n }\n wrapper[0].style.cssText = element[0].style.cssText;\n element.css({\n width: '100%',\n height: element[0].style.height\n });\n that.wrapper = wrapper.addClass('k-widget k-datepicker').addClass(element[0].className).removeClass('input-validation-error');\n that._inputWrapper = $(wrapper[0].firstChild);\n },\n _reset: function () {\n var that = this, element = that.element, formId = element.attr('form'), options = that.options, disabledDate = options.disableDates, parseFormats = options.parseFormats.length ? options.parseFormats : null, optionsValue = that._initialOptions.value, form = formId ? $('#' + formId) : element.closest('form'), initialValue = element[0].defaultValue;\n if (optionsValue && (disabledDate && disabledDate(optionsValue))) {\n optionsValue = null;\n }\n if ((!initialValue || !kendo.parseDate(initialValue, parseFormats, options.culture)) && optionsValue) {\n element.attr('value', kendo.toString(optionsValue, options.format, options.culture));\n }\n if (form[0]) {\n that._resetHandler = function () {\n that.value(optionsValue || element[0].defaultValue);\n that.max(that._initialOptions.max);\n that.min(that._initialOptions.min);\n };\n that._form = form.on('reset', that._resetHandler);\n }\n },\n _template: function () {\n this._ariaTemplate = template(this.options.ARIATemplate);\n },\n _createDateInput: function (options) {\n if (this._dateInput) {\n this._dateInput.destroy();\n this._dateInput = null;\n }\n if (options.dateInput) {\n this._dateInput = new ui.DateInput(this.element, {\n culture: options.culture,\n format: options.format,\n min: options.min,\n max: options.max\n });\n }\n },\n _updateARIA: function (date) {\n var cell;\n var that = this;\n var calendar = that.dateView.calendar;\n if (that.element && that.element.length) {\n that.element[0].removeAttribute('aria-activedescendant');\n }\n if (calendar) {\n cell = calendar._cell;\n cell.attr('aria-label', that._ariaTemplate({ current: date || calendar.current() }));\n that.element.attr('aria-activedescendant', cell.attr('id'));\n }\n }\n });\n ui.plugin(DatePicker);\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('kendo.data.odata', ['kendo.core'], f);\n}(function () {\n var __meta__ = {\n id: 'data.odata',\n name: 'OData',\n category: 'framework',\n depends: ['core'],\n hidden: true\n };\n (function ($, undefined) {\n var kendo = window.kendo, extend = $.extend, NEWLINE = '\\r\\n', DOUBLELINE = '\\r\\n\\r\\n', isFunction = kendo.isFunction, odataFilters = {\n eq: 'eq',\n neq: 'ne',\n gt: 'gt',\n gte: 'ge',\n lt: 'lt',\n lte: 'le',\n contains: 'substringof',\n doesnotcontain: 'substringof',\n endswith: 'endswith',\n startswith: 'startswith',\n isnull: 'eq',\n isnotnull: 'ne',\n isnullorempty: 'eq',\n isnotnullorempty: 'ne',\n isempty: 'eq',\n isnotempty: 'ne'\n }, odataFiltersVersionFour = extend({}, odataFilters, { contains: 'contains' }), mappers = {\n pageSize: $.noop,\n page: $.noop,\n filter: function (params, filter, useVersionFour) {\n if (filter) {\n filter = toOdataFilter(filter, useVersionFour);\n if (filter) {\n params.$filter = filter;\n }\n }\n },\n sort: function (params, orderby) {\n var expr = $.map(orderby, function (value) {\n var order = value.field.replace(/\\./g, '/');\n if (value.dir === 'desc') {\n order += ' desc';\n }\n return order;\n }).join(',');\n if (expr) {\n params.$orderby = expr;\n }\n },\n skip: function (params, skip) {\n if (skip) {\n params.$skip = skip;\n }\n },\n take: function (params, take) {\n if (take) {\n params.$top = take;\n }\n }\n }, defaultDataType = { read: { dataType: 'jsonp' } };\n function toOdataFilter(filter, useOdataFour) {\n var result = [], logic = filter.logic || 'and', idx, length, field, type, format, operator, value, ignoreCase, filters = filter.filters;\n for (idx = 0, length = filters.length; idx < length; idx++) {\n filter = filters[idx];\n field = filter.field;\n value = filter.value;\n operator = filter.operator;\n if (filter.filters) {\n filter = toOdataFilter(filter, useOdataFour);\n } else {\n ignoreCase = filter.ignoreCase;\n field = field.replace(/\\./g, '/');\n filter = odataFilters[operator];\n if (useOdataFour) {\n filter = odataFiltersVersionFour[operator];\n }\n if (operator === 'isnullorempty') {\n filter = kendo.format('{0} {1} null or {0} {1} \\'\\'', field, filter);\n } else if (operator === 'isnotnullorempty') {\n filter = kendo.format('{0} {1} null and {0} {1} \\'\\'', field, filter);\n } else if (operator === 'isnull' || operator === 'isnotnull') {\n filter = kendo.format('{0} {1} null', field, filter);\n } else if (operator === 'isempty' || operator === 'isnotempty') {\n filter = kendo.format('{0} {1} \\'\\'', field, filter);\n } else if (filter && value !== undefined) {\n type = $.type(value);\n if (type === 'string') {\n format = '\\'{1}\\'';\n value = value.replace(/'/g, '\\'\\'');\n if (ignoreCase === true) {\n field = 'tolower(' + field + ')';\n }\n } else if (type === 'date') {\n if (useOdataFour) {\n format = '{1:yyyy-MM-ddTHH:mm:ss+00:00}';\n value = kendo.timezone.apply(value, 'Etc/UTC');\n } else {\n format = 'datetime\\'{1:yyyy-MM-ddTHH:mm:ss}\\'';\n }\n } else {\n format = '{1}';\n }\n if (filter.length > 3) {\n if (filter !== 'substringof') {\n format = '{0}({2},' + format + ')';\n } else {\n format = '{0}(' + format + ',{2})';\n if (operator === 'doesnotcontain') {\n if (useOdataFour) {\n format = '{0}({2},\\'{1}\\') eq -1';\n filter = 'indexof';\n } else {\n format += ' eq false';\n }\n }\n }\n } else {\n format = '{2} {0} ' + format;\n }\n filter = kendo.format(format, filter, value, field);\n }\n }\n result.push(filter);\n }\n filter = result.join(' ' + logic + ' ');\n if (result.length > 1) {\n filter = '(' + filter + ')';\n }\n return filter;\n }\n function stripMetadata(obj) {\n for (var name in obj) {\n if (name.indexOf('@odata') === 0) {\n delete obj[name];\n }\n }\n }\n function hex16() {\n return Math.floor((1 + Math.random()) * 65536).toString(16).substr(1);\n }\n function createBoundary(prefix) {\n return prefix + hex16() + '-' + hex16() + '-' + hex16();\n }\n function createDelimeter(boundary, close) {\n var result = NEWLINE + '--' + boundary;\n if (close) {\n result += '--';\n }\n return result;\n }\n function createCommand(transport, item, httpVerb, command) {\n var transportUrl = transport.options[command].url;\n var commandPrefix = kendo.format('{0} ', httpVerb);\n if (isFunction(transportUrl)) {\n return commandPrefix + transportUrl(item);\n } else {\n return commandPrefix + transportUrl;\n }\n }\n function getOperationHeader(changeset, changeId) {\n var header = '';\n header += createDelimeter(changeset, false);\n header += NEWLINE + 'Content-Type: application/http';\n header += NEWLINE + 'Content-Transfer-Encoding: binary';\n header += NEWLINE + 'Content-ID: ' + changeId;\n return header;\n }\n function getOperationContent(item) {\n var content = '';\n content += NEWLINE + 'Content-Type: application/json;odata=minimalmetadata';\n content += NEWLINE + 'Prefer: return=representation';\n content += DOUBLELINE + kendo.stringify(item);\n return content;\n }\n function getOperations(collection, changeset, changeId, command, transport, skipContent) {\n var requestBody = '';\n for (var i = 0; i < collection.length; i++) {\n requestBody += getOperationHeader(changeset, changeId);\n requestBody += DOUBLELINE + createCommand(transport, collection[i], transport.options[command].type, command) + ' HTTP/1.1';\n if (!skipContent) {\n requestBody += getOperationContent(collection[i]);\n }\n requestBody += NEWLINE;\n changeId++;\n }\n return requestBody;\n }\n function processCollection(colection, boundary, changeset, changeId, transport, command, skipContent) {\n var requestBody = '';\n requestBody += getBoundary(boundary, changeset);\n requestBody += getOperations(colection, changeset, changeId, command, transport, skipContent);\n requestBody += createDelimeter(changeset, true);\n requestBody += NEWLINE;\n return requestBody;\n }\n function getBoundary(boundary, changeset) {\n var requestBody = '';\n requestBody += '--' + boundary + NEWLINE;\n requestBody += 'Content-Type: multipart/mixed; boundary=' + changeset + NEWLINE;\n return requestBody;\n }\n function createBatchRequest(transport, colections) {\n var options = {};\n var boundary = createBoundary('sf_batch_');\n var requestBody = '';\n var changeId = 0;\n var batchURL = transport.options.batch.url;\n var changeset = createBoundary('sf_changeset_');\n options.type = transport.options.batch.type;\n options.url = isFunction(batchURL) ? batchURL() : batchURL;\n options.headers = { 'Content-Type': 'multipart/mixed; boundary=' + boundary };\n if (colections.updated.length) {\n requestBody += processCollection(colections.updated, boundary, changeset, changeId, transport, 'update', false);\n changeId += colections.updated.length;\n changeset = createBoundary('sf_changeset_');\n }\n if (colections.destroyed.length) {\n requestBody += processCollection(colections.destroyed, boundary, changeset, changeId, transport, 'destroy', true);\n changeId += colections.destroyed.length;\n changeset = createBoundary('sf_changeset_');\n }\n if (colections.created.length) {\n requestBody += processCollection(colections.created, boundary, changeset, changeId, transport, 'create', false);\n }\n requestBody += createDelimeter(boundary, true);\n options.data = requestBody;\n return options;\n }\n function parseBatchResponse(responseText) {\n var responseMarkers = responseText.match(/--changesetresponse_[a-z0-9-]+$/gm);\n var markerIndex = 0;\n var collections = [];\n var changeBody;\n var status;\n var code;\n var marker;\n var jsonModel;\n collections.push({\n models: [],\n passed: true\n });\n for (var i = 0; i < responseMarkers.length; i++) {\n marker = responseMarkers[i];\n if (marker.lastIndexOf('--', marker.length - 1)) {\n if (i < responseMarkers.length - 1) {\n collections.push({\n models: [],\n passed: true\n });\n }\n continue;\n }\n if (!markerIndex) {\n markerIndex = responseText.indexOf(marker);\n } else {\n markerIndex = responseText.indexOf(marker, markerIndex + marker.length);\n }\n changeBody = responseText.substring(markerIndex, responseText.indexOf('--', markerIndex + 1));\n status = changeBody.match(/^HTTP\\/1\\.\\d (\\d{3}) (.*)$/gm).pop();\n code = kendo.parseFloat(status.match(/\\d{3}/g).pop());\n if (code >= 200 && code <= 299) {\n jsonModel = changeBody.match(/\\{.*\\}/gm);\n if (jsonModel) {\n collections[collections.length - 1].models.push(JSON.parse(jsonModel[0]));\n }\n } else {\n collections[collections.length - 1].passed = false;\n }\n }\n return collections;\n }\n extend(true, kendo.data, {\n schemas: {\n odata: {\n type: 'json',\n data: function (data) {\n return data.d.results || [data.d];\n },\n total: 'd.__count'\n }\n },\n transports: {\n odata: {\n read: {\n cache: true,\n dataType: 'jsonp',\n jsonp: '$callback'\n },\n update: {\n cache: true,\n dataType: 'json',\n contentType: 'application/json',\n type: 'PUT'\n },\n create: {\n cache: true,\n dataType: 'json',\n contentType: 'application/json',\n type: 'POST'\n },\n destroy: {\n cache: true,\n dataType: 'json',\n type: 'DELETE'\n },\n parameterMap: function (options, type, useVersionFour) {\n var params, value, option, dataType;\n options = options || {};\n type = type || 'read';\n dataType = (this.options || defaultDataType)[type];\n dataType = dataType ? dataType.dataType : 'json';\n if (type === 'read') {\n params = { $inlinecount: 'allpages' };\n if (dataType != 'json') {\n params.$format = 'json';\n }\n for (option in options) {\n if (mappers[option]) {\n mappers[option](params, options[option], useVersionFour);\n } else {\n params[option] = options[option];\n }\n }\n } else {\n if (dataType !== 'json') {\n throw new Error('Only json dataType can be used for ' + type + ' operation.');\n }\n if (type !== 'destroy') {\n for (option in options) {\n value = options[option];\n if (typeof value === 'number') {\n options[option] = value + '';\n }\n }\n params = kendo.stringify(options);\n }\n }\n return params;\n }\n }\n }\n });\n extend(true, kendo.data, {\n schemas: {\n 'odata-v4': {\n type: 'json',\n data: function (data) {\n if ($.isArray(data)) {\n for (var i = 0; i < data.length; i++) {\n stripMetadata(data[i]);\n }\n return data;\n } else {\n data = $.extend({}, data);\n stripMetadata(data);\n if (data.value) {\n return data.value;\n }\n return [data];\n }\n },\n total: function (data) {\n return data['@odata.count'];\n }\n }\n },\n transports: {\n 'odata-v4': {\n batch: { type: 'POST' },\n read: {\n cache: true,\n dataType: 'json'\n },\n update: {\n cache: true,\n dataType: 'json',\n contentType: 'application/json;IEEE754Compatible=true',\n type: 'PUT'\n },\n create: {\n cache: true,\n dataType: 'json',\n contentType: 'application/json;IEEE754Compatible=true',\n type: 'POST'\n },\n destroy: {\n cache: true,\n dataType: 'json',\n type: 'DELETE'\n },\n parameterMap: function (options, type) {\n var result = kendo.data.transports.odata.parameterMap(options, type, true);\n if (type == 'read') {\n result.$count = true;\n delete result.$inlinecount;\n }\n return result;\n },\n submit: function (e) {\n var that = this;\n var options = createBatchRequest(that, e.data);\n var collections = e.data;\n if (!collections.updated.length && !collections.destroyed.length && !collections.created.length) {\n return;\n }\n $.ajax(extend(true, {}, {\n success: function (response) {\n var responses = parseBatchResponse(response);\n var index = 0;\n var current;\n if (collections.updated.length) {\n current = responses[index];\n if (current.passed) {\n e.success(current.models.length ? current.models : [], 'update');\n }\n index++;\n }\n if (collections.destroyed.length) {\n current = responses[index];\n if (current.passed) {\n e.success([], 'destroy');\n }\n index++;\n }\n if (collections.created.length) {\n current = responses[index];\n if (current.passed) {\n e.success(current.models, 'create');\n }\n }\n },\n error: function (response, status, error) {\n e.error(response, status, error);\n }\n }, options));\n }\n }\n }\n });\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('kendo.data.xml', ['kendo.core'], f);\n}(function () {\n var __meta__ = {\n id: 'data.xml',\n name: 'XML',\n category: 'framework',\n depends: ['core'],\n hidden: true\n };\n (function ($, undefined) {\n var kendo = window.kendo, isArray = $.isArray, isPlainObject = $.isPlainObject, map = $.map, each = $.each, extend = $.extend, getter = kendo.getter, Class = kendo.Class;\n var XmlDataReader = Class.extend({\n init: function (options) {\n var that = this, total = options.total, model = options.model, parse = options.parse, errors = options.errors, serialize = options.serialize, data = options.data;\n if (model) {\n if (isPlainObject(model)) {\n var base = options.modelBase || kendo.data.Model;\n if (model.fields) {\n each(model.fields, function (field, value) {\n if (isPlainObject(value) && value.field) {\n if (!$.isFunction(value.field)) {\n value = extend(value, { field: that.getter(value.field) });\n }\n } else {\n value = { field: that.getter(value) };\n }\n model.fields[field] = value;\n });\n }\n var id = model.id;\n if (id) {\n var idField = {};\n idField[that.xpathToMember(id, true)] = { field: that.getter(id) };\n model.fields = extend(idField, model.fields);\n model.id = that.xpathToMember(id);\n }\n model = base.define(model);\n }\n that.model = model;\n }\n if (total) {\n if (typeof total == 'string') {\n total = that.getter(total);\n that.total = function (data) {\n return parseInt(total(data), 10);\n };\n } else if (typeof total == 'function') {\n that.total = total;\n }\n }\n if (errors) {\n if (typeof errors == 'string') {\n errors = that.getter(errors);\n that.errors = function (data) {\n return errors(data) || null;\n };\n } else if (typeof errors == 'function') {\n that.errors = errors;\n }\n }\n if (data) {\n if (typeof data == 'string') {\n data = that.xpathToMember(data);\n that.data = function (value) {\n var result = that.evaluate(value, data), modelInstance;\n result = isArray(result) ? result : [result];\n if (that.model && model.fields) {\n modelInstance = new that.model();\n return map(result, function (value) {\n if (value) {\n var record = {}, field;\n for (field in model.fields) {\n record[field] = modelInstance._parse(field, model.fields[field].field(value));\n }\n return record;\n }\n });\n }\n return result;\n };\n } else if (typeof data == 'function') {\n that.data = data;\n }\n }\n if (typeof parse == 'function') {\n var xmlParse = that.parse;\n that.parse = function (data) {\n var xml = parse.call(that, data);\n return xmlParse.call(that, xml);\n };\n }\n if (typeof serialize == 'function') {\n that.serialize = serialize;\n }\n },\n total: function (result) {\n return this.data(result).length;\n },\n errors: function (data) {\n return data ? data.errors : null;\n },\n serialize: function (data) {\n return data;\n },\n parseDOM: function (element) {\n var result = {}, parsedNode, node, nodeType, nodeName, member, attribute, attributes = element.attributes, attributeCount = attributes.length, idx;\n for (idx = 0; idx < attributeCount; idx++) {\n attribute = attributes[idx];\n result['@' + attribute.nodeName] = attribute.nodeValue;\n }\n for (node = element.firstChild; node; node = node.nextSibling) {\n nodeType = node.nodeType;\n if (nodeType === 3 || nodeType === 4) {\n result['#text'] = node.nodeValue;\n } else if (nodeType === 1) {\n parsedNode = this.parseDOM(node);\n nodeName = node.nodeName;\n member = result[nodeName];\n if (isArray(member)) {\n member.push(parsedNode);\n } else if (member !== undefined) {\n member = [\n member,\n parsedNode\n ];\n } else {\n member = parsedNode;\n }\n result[nodeName] = member;\n }\n }\n return result;\n },\n evaluate: function (value, expression) {\n var members = expression.split('.'), member, result, length, intermediateResult, idx;\n while (member = members.shift()) {\n value = value[member];\n if (isArray(value)) {\n result = [];\n expression = members.join('.');\n for (idx = 0, length = value.length; idx < length; idx++) {\n intermediateResult = this.evaluate(value[idx], expression);\n intermediateResult = isArray(intermediateResult) ? intermediateResult : [intermediateResult];\n result.push.apply(result, intermediateResult);\n }\n return result;\n }\n }\n return value;\n },\n parse: function (xml) {\n var documentElement, tree, result = {};\n documentElement = xml.documentElement || $.parseXML(xml).documentElement;\n tree = this.parseDOM(documentElement);\n result[documentElement.nodeName] = tree;\n return result;\n },\n xpathToMember: function (member, raw) {\n if (!member) {\n return '';\n }\n member = member.replace(/^\\//, '').replace(/\\//g, '.');\n if (member.indexOf('@') >= 0) {\n return member.replace(/\\.?(@.*)/, raw ? '$1' : '[\"$1\"]');\n }\n if (member.indexOf('text()') >= 0) {\n return member.replace(/(\\.?text\\(\\))/, raw ? '#text' : '[\"#text\"]');\n }\n return member;\n },\n getter: function (member) {\n return getter(this.xpathToMember(member), true);\n }\n });\n $.extend(true, kendo.data, {\n XmlDataReader: XmlDataReader,\n readers: { xml: XmlDataReader }\n });\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('kendo.data', [\n 'kendo.core',\n 'kendo.data.odata',\n 'kendo.data.xml'\n ], f);\n}(function () {\n var __meta__ = {\n id: 'data',\n name: 'Data source',\n category: 'framework',\n description: 'Powerful component for using local and remote data.Fully supports CRUD, Sorting, Paging, Filtering, Grouping, and Aggregates.',\n depends: ['core'],\n features: [\n {\n id: 'data-odata',\n name: 'OData',\n description: 'Support for accessing Open Data Protocol (OData) services.',\n depends: ['data.odata']\n },\n {\n id: 'data-signalr',\n name: 'SignalR',\n description: 'Support for binding to SignalR hubs.',\n depends: ['data.signalr']\n },\n {\n id: 'data-XML',\n name: 'XML',\n description: 'Support for binding to XML.',\n depends: ['data.xml']\n }\n ]\n };\n (function ($, undefined) {\n var extend = $.extend, proxy = $.proxy, isPlainObject = $.isPlainObject, isEmptyObject = $.isEmptyObject, isArray = $.isArray, grep = $.grep, ajax = $.ajax, map, each = $.each, noop = $.noop, kendo = window.kendo, isFunction = kendo.isFunction, Observable = kendo.Observable, Class = kendo.Class, STRING = 'string', FUNCTION = 'function', ASCENDING = 'asc', CREATE = 'create', READ = 'read', UPDATE = 'update', DESTROY = 'destroy', CHANGE = 'change', SYNC = 'sync', GET = 'get', ERROR = 'error', REQUESTSTART = 'requestStart', PROGRESS = 'progress', REQUESTEND = 'requestEnd', crud = [\n CREATE,\n READ,\n UPDATE,\n DESTROY\n ], identity = function (o) {\n return o;\n }, getter = kendo.getter, stringify = kendo.stringify, math = Math, push = [].push, join = [].join, pop = [].pop, splice = [].splice, shift = [].shift, slice = [].slice, unshift = [].unshift, toString = {}.toString, stableSort = kendo.support.stableSort, dateRegExp = /^\\/Date\\((.*?)\\)\\/$/;\n var ObservableArray = Observable.extend({\n init: function (array, type) {\n var that = this;\n that.type = type || ObservableObject;\n Observable.fn.init.call(that);\n that.length = array.length;\n that.wrapAll(array, that);\n },\n at: function (index) {\n return this[index];\n },\n toJSON: function (serializeFunctions) {\n var idx, length = this.length, value, json = new Array(length);\n for (idx = 0; idx < length; idx++) {\n value = this[idx];\n if (value instanceof ObservableObject) {\n value = value.toJSON(serializeFunctions);\n }\n json[idx] = value;\n }\n return json;\n },\n parent: noop,\n wrapAll: function (source, target) {\n var that = this, idx, length, parent = function () {\n return that;\n };\n target = target || [];\n for (idx = 0, length = source.length; idx < length; idx++) {\n target[idx] = that.wrap(source[idx], parent);\n }\n return target;\n },\n wrap: function (object, parent) {\n var that = this, observable;\n if (object !== null && toString.call(object) === '[object Object]') {\n observable = object instanceof that.type || object instanceof Model;\n if (!observable) {\n object = object instanceof ObservableObject ? object.toJSON() : object;\n object = new that.type(object);\n }\n object.parent = parent;\n object.bind(CHANGE, function (e) {\n that.trigger(CHANGE, {\n field: e.field,\n node: e.node,\n index: e.index,\n items: e.items || [this],\n action: e.node ? e.action || 'itemloaded' : 'itemchange'\n });\n });\n }\n return object;\n },\n push: function () {\n var index = this.length, items = this.wrapAll(arguments), result;\n result = push.apply(this, items);\n this.trigger(CHANGE, {\n action: 'add',\n index: index,\n items: items\n });\n return result;\n },\n slice: slice,\n sort: [].sort,\n join: join,\n pop: function () {\n var length = this.length, result = pop.apply(this);\n if (length) {\n this.trigger(CHANGE, {\n action: 'remove',\n index: length - 1,\n items: [result]\n });\n }\n return result;\n },\n splice: function (index, howMany, item) {\n var items = this.wrapAll(slice.call(arguments, 2)), result, i, len;\n result = splice.apply(this, [\n index,\n howMany\n ].concat(items));\n if (result.length) {\n this.trigger(CHANGE, {\n action: 'remove',\n index: index,\n items: result\n });\n for (i = 0, len = result.length; i < len; i++) {\n if (result[i] && result[i].children) {\n result[i].unbind(CHANGE);\n }\n }\n }\n if (item) {\n this.trigger(CHANGE, {\n action: 'add',\n index: index,\n items: items\n });\n }\n return result;\n },\n shift: function () {\n var length = this.length, result = shift.apply(this);\n if (length) {\n this.trigger(CHANGE, {\n action: 'remove',\n index: 0,\n items: [result]\n });\n }\n return result;\n },\n unshift: function () {\n var items = this.wrapAll(arguments), result;\n result = unshift.apply(this, items);\n this.trigger(CHANGE, {\n action: 'add',\n index: 0,\n items: items\n });\n return result;\n },\n indexOf: function (item) {\n var that = this, idx, length;\n for (idx = 0, length = that.length; idx < length; idx++) {\n if (that[idx] === item) {\n return idx;\n }\n }\n return -1;\n },\n forEach: function (callback, thisArg) {\n var idx = 0;\n var length = this.length;\n var context = thisArg || window;\n for (; idx < length; idx++) {\n callback.call(context, this[idx], idx, this);\n }\n },\n map: function (callback, thisArg) {\n var idx = 0;\n var result = [];\n var length = this.length;\n var context = thisArg || window;\n for (; idx < length; idx++) {\n result[idx] = callback.call(context, this[idx], idx, this);\n }\n return result;\n },\n reduce: function (callback) {\n var idx = 0, result, length = this.length;\n if (arguments.length == 2) {\n result = arguments[1];\n } else if (idx < length) {\n result = this[idx++];\n }\n for (; idx < length; idx++) {\n result = callback(result, this[idx], idx, this);\n }\n return result;\n },\n reduceRight: function (callback) {\n var idx = this.length - 1, result;\n if (arguments.length == 2) {\n result = arguments[1];\n } else if (idx > 0) {\n result = this[idx--];\n }\n for (; idx >= 0; idx--) {\n result = callback(result, this[idx], idx, this);\n }\n return result;\n },\n filter: function (callback, thisArg) {\n var idx = 0;\n var result = [];\n var item;\n var length = this.length;\n var context = thisArg || window;\n for (; idx < length; idx++) {\n item = this[idx];\n if (callback.call(context, item, idx, this)) {\n result[result.length] = item;\n }\n }\n return result;\n },\n find: function (callback, thisArg) {\n var idx = 0;\n var item;\n var length = this.length;\n var context = thisArg || window;\n for (; idx < length; idx++) {\n item = this[idx];\n if (callback.call(context, item, idx, this)) {\n return item;\n }\n }\n },\n every: function (callback, thisArg) {\n var idx = 0;\n var item;\n var length = this.length;\n var context = thisArg || window;\n for (; idx < length; idx++) {\n item = this[idx];\n if (!callback.call(context, item, idx, this)) {\n return false;\n }\n }\n return true;\n },\n some: function (callback, thisArg) {\n var idx = 0;\n var item;\n var length = this.length;\n var context = thisArg || window;\n for (; idx < length; idx++) {\n item = this[idx];\n if (callback.call(context, item, idx, this)) {\n return true;\n }\n }\n return false;\n },\n remove: function (item) {\n var idx = this.indexOf(item);\n if (idx !== -1) {\n this.splice(idx, 1);\n }\n },\n empty: function () {\n this.splice(0, this.length);\n }\n });\n if (typeof Symbol !== 'undefined' && Symbol.iterator && !ObservableArray.prototype[Symbol.iterator]) {\n ObservableArray.prototype[Symbol.iterator] = [][Symbol.iterator];\n }\n var LazyObservableArray = ObservableArray.extend({\n init: function (data, type, events) {\n Observable.fn.init.call(this);\n this.type = type || ObservableObject;\n if (events) {\n this._events = events;\n }\n for (var idx = 0; idx < data.length; idx++) {\n this[idx] = data[idx];\n }\n this.length = idx;\n this._parent = proxy(function () {\n return this;\n }, this);\n },\n at: function (index) {\n var item = this[index];\n if (!(item instanceof this.type)) {\n item = this[index] = this.wrap(item, this._parent);\n } else {\n item.parent = this._parent;\n }\n return item;\n }\n });\n function eventHandler(context, type, field, prefix) {\n return function (e) {\n var event = {}, key;\n for (key in e) {\n event[key] = e[key];\n }\n if (prefix) {\n event.field = field + '.' + e.field;\n } else {\n event.field = field;\n }\n if (type == CHANGE && context._notifyChange) {\n context._notifyChange(event);\n }\n context.trigger(type, event);\n };\n }\n var ObservableObject = Observable.extend({\n init: function (value) {\n var that = this, member, field, parent = function () {\n return that;\n };\n Observable.fn.init.call(this);\n this._handlers = {};\n for (field in value) {\n member = value[field];\n if (typeof member === 'object' && member && !member.getTime && field.charAt(0) != '_') {\n member = that.wrap(member, field, parent);\n }\n that[field] = member;\n }\n that.uid = kendo.guid();\n },\n shouldSerialize: function (field, serializeFunctions) {\n return this.hasOwnProperty(field) && field !== '_handlers' && field !== '_events' && (serializeFunctions && serializeFunctions[field] || typeof this[field] !== FUNCTION) && field !== 'uid';\n },\n forEach: function (f) {\n for (var i in this) {\n if (this.shouldSerialize(i)) {\n f(this[i], i);\n }\n }\n },\n toJSON: function (serializeFunctions) {\n var result = {}, value, field;\n for (field in this) {\n if (this.shouldSerialize(field, serializeFunctions)) {\n value = this[field];\n if (value instanceof ObservableObject || value instanceof ObservableArray) {\n value = value.toJSON(serializeFunctions);\n }\n result[field] = value;\n }\n }\n return result;\n },\n get: function (field) {\n var that = this, result;\n that.trigger(GET, { field: field });\n if (field === 'this') {\n result = that;\n } else {\n result = kendo.getter(field, true)(that);\n }\n return result;\n },\n _set: function (field, value) {\n var that = this;\n var composite = field.indexOf('.') >= 0;\n if (composite) {\n var paths = field.split('.'), path = '';\n while (paths.length > 1) {\n path += paths.shift();\n var obj = kendo.getter(path, true)(that);\n if (obj instanceof ObservableObject) {\n obj.set(paths.join('.'), value);\n return composite;\n }\n path += '.';\n }\n }\n kendo.setter(field)(that, value);\n return composite;\n },\n set: function (field, value) {\n var that = this, isSetPrevented = false, composite = field.indexOf('.') >= 0, current = kendo.getter(field, true)(that);\n if (current !== value) {\n if (current instanceof Observable && this._handlers[field]) {\n if (this._handlers[field].get) {\n current.unbind(GET, this._handlers[field].get);\n }\n current.unbind(CHANGE, this._handlers[field].change);\n }\n isSetPrevented = that.trigger('set', {\n field: field,\n value: value\n });\n if (!isSetPrevented) {\n if (!composite) {\n value = that.wrap(value, field, function () {\n return that;\n });\n }\n if (!that._set(field, value) || field.indexOf('(') >= 0 || field.indexOf('[') >= 0) {\n that.trigger(CHANGE, { field: field });\n }\n }\n }\n return isSetPrevented;\n },\n parent: noop,\n wrap: function (object, field, parent) {\n var that = this;\n var get;\n var change;\n var type = toString.call(object);\n if (object != null && (type === '[object Object]' || type === '[object Array]')) {\n var isObservableArray = object instanceof ObservableArray;\n var isDataSource = object instanceof DataSource;\n if (type === '[object Object]' && !isDataSource && !isObservableArray) {\n if (!(object instanceof ObservableObject)) {\n object = new ObservableObject(object);\n }\n get = eventHandler(that, GET, field, true);\n object.bind(GET, get);\n change = eventHandler(that, CHANGE, field, true);\n object.bind(CHANGE, change);\n that._handlers[field] = {\n get: get,\n change: change\n };\n } else if (type === '[object Array]' || isObservableArray || isDataSource) {\n if (!isObservableArray && !isDataSource) {\n object = new ObservableArray(object);\n }\n change = eventHandler(that, CHANGE, field, false);\n object.bind(CHANGE, change);\n that._handlers[field] = { change: change };\n }\n object.parent = parent;\n }\n return object;\n }\n });\n function equal(x, y) {\n if (x === y) {\n return true;\n }\n var xtype = $.type(x), ytype = $.type(y), field;\n if (xtype !== ytype) {\n return false;\n }\n if (xtype === 'date') {\n return x.getTime() === y.getTime();\n }\n if (xtype !== 'object' && xtype !== 'array') {\n return false;\n }\n for (field in x) {\n if (!equal(x[field], y[field])) {\n return false;\n }\n }\n return true;\n }\n var parsers = {\n 'number': function (value) {\n if (typeof value === STRING && value.toLowerCase() === 'null') {\n return null;\n }\n return kendo.parseFloat(value);\n },\n 'date': function (value) {\n if (typeof value === STRING && value.toLowerCase() === 'null') {\n return null;\n }\n return kendo.parseDate(value);\n },\n 'boolean': function (value) {\n if (typeof value === STRING) {\n if (value.toLowerCase() === 'null') {\n return null;\n } else {\n return value.toLowerCase() === 'true';\n }\n }\n return value != null ? !!value : value;\n },\n 'string': function (value) {\n if (typeof value === STRING && value.toLowerCase() === 'null') {\n return null;\n }\n return value != null ? value + '' : value;\n },\n 'default': function (value) {\n return value;\n }\n };\n var defaultValues = {\n 'string': '',\n 'number': 0,\n 'date': new Date(),\n 'boolean': false,\n 'default': ''\n };\n function getFieldByName(obj, name) {\n var field, fieldName;\n for (fieldName in obj) {\n field = obj[fieldName];\n if (isPlainObject(field) && field.field && field.field === name) {\n return field;\n } else if (field === name) {\n return field;\n }\n }\n return null;\n }\n var Model = ObservableObject.extend({\n init: function (data) {\n var that = this;\n if (!data || $.isEmptyObject(data)) {\n data = $.extend({}, that.defaults, data);\n if (that._initializers) {\n for (var idx = 0; idx < that._initializers.length; idx++) {\n var name = that._initializers[idx];\n data[name] = that.defaults[name]();\n }\n }\n }\n ObservableObject.fn.init.call(that, data);\n that.dirty = false;\n that.dirtyFields = {};\n if (that.idField) {\n that.id = that.get(that.idField);\n if (that.id === undefined) {\n that.id = that._defaultId;\n }\n }\n },\n shouldSerialize: function (field) {\n return ObservableObject.fn.shouldSerialize.call(this, field) && field !== 'uid' && !(this.idField !== 'id' && field === 'id') && field !== 'dirty' && field !== 'dirtyFields' && field !== '_accessors';\n },\n _parse: function (field, value) {\n var that = this, fieldName = field, fields = that.fields || {}, parse;\n field = fields[field];\n if (!field) {\n field = getFieldByName(fields, fieldName);\n }\n if (field) {\n parse = field.parse;\n if (!parse && field.type) {\n parse = parsers[field.type.toLowerCase()];\n }\n }\n return parse ? parse(value) : value;\n },\n _notifyChange: function (e) {\n var action = e.action;\n if (action == 'add' || action == 'remove') {\n this.dirty = true;\n this.dirtyFields[e.field] = true;\n }\n },\n editable: function (field) {\n field = (this.fields || {})[field];\n return field ? field.editable !== false : true;\n },\n set: function (field, value) {\n var that = this;\n var dirty = that.dirty;\n if (that.editable(field)) {\n value = that._parse(field, value);\n if (!equal(value, that.get(field))) {\n that.dirty = true;\n that.dirtyFields[field] = true;\n if (ObservableObject.fn.set.call(that, field, value) && !dirty) {\n that.dirty = dirty;\n if (!that.dirty) {\n that.dirtyFields[field] = false;\n }\n }\n } else {\n that.trigger('equalSet', {\n field: field,\n value: value\n });\n }\n }\n },\n accept: function (data) {\n var that = this, parent = function () {\n return that;\n }, field;\n for (field in data) {\n var value = data[field];\n if (field.charAt(0) != '_') {\n value = that.wrap(data[field], field, parent);\n }\n that._set(field, value);\n }\n if (that.idField) {\n that.id = that.get(that.idField);\n }\n that.dirty = false;\n that.dirtyFields = {};\n },\n isNew: function () {\n return this.id === this._defaultId;\n }\n });\n Model.define = function (base, options) {\n if (options === undefined) {\n options = base;\n base = Model;\n }\n var model, proto = extend({ defaults: {} }, options), name, field, type, value, idx, length, fields = {}, originalName, id = proto.id, functionFields = [];\n if (id) {\n proto.idField = id;\n }\n if (proto.id) {\n delete proto.id;\n }\n if (id) {\n proto.defaults[id] = proto._defaultId = '';\n }\n if (toString.call(proto.fields) === '[object Array]') {\n for (idx = 0, length = proto.fields.length; idx < length; idx++) {\n field = proto.fields[idx];\n if (typeof field === STRING) {\n fields[field] = {};\n } else if (field.field) {\n fields[field.field] = field;\n }\n }\n proto.fields = fields;\n }\n for (name in proto.fields) {\n field = proto.fields[name];\n type = field.type || 'default';\n value = null;\n originalName = name;\n name = typeof field.field === STRING ? field.field : name;\n if (!field.nullable) {\n value = proto.defaults[originalName !== name ? originalName : name] = field.defaultValue !== undefined ? field.defaultValue : defaultValues[type.toLowerCase()];\n if (typeof value === 'function') {\n functionFields.push(name);\n }\n }\n if (options.id === name) {\n proto._defaultId = value;\n }\n proto.defaults[originalName !== name ? originalName : name] = value;\n field.parse = field.parse || parsers[type];\n }\n if (functionFields.length > 0) {\n proto._initializers = functionFields;\n }\n model = base.extend(proto);\n model.define = function (options) {\n return Model.define(model, options);\n };\n if (proto.fields) {\n model.fields = proto.fields;\n model.idField = proto.idField;\n }\n return model;\n };\n var Comparer = {\n selector: function (field) {\n return isFunction(field) ? field : getter(field);\n },\n compare: function (field) {\n var selector = this.selector(field);\n return function (a, b) {\n a = selector(a);\n b = selector(b);\n if (a == null && b == null) {\n return 0;\n }\n if (a == null) {\n return -1;\n }\n if (b == null) {\n return 1;\n }\n if (a.localeCompare) {\n return a.localeCompare(b);\n }\n return a > b ? 1 : a < b ? -1 : 0;\n };\n },\n create: function (sort) {\n var compare = sort.compare || this.compare(sort.field);\n if (sort.dir == 'desc') {\n return function (a, b) {\n return compare(b, a, true);\n };\n }\n return compare;\n },\n combine: function (comparers) {\n return function (a, b) {\n var result = comparers[0](a, b), idx, length;\n for (idx = 1, length = comparers.length; idx < length; idx++) {\n result = result || comparers[idx](a, b);\n }\n return result;\n };\n }\n };\n var StableComparer = extend({}, Comparer, {\n asc: function (field) {\n var selector = this.selector(field);\n return function (a, b) {\n var valueA = selector(a);\n var valueB = selector(b);\n if (valueA && valueA.getTime && valueB && valueB.getTime) {\n valueA = valueA.getTime();\n valueB = valueB.getTime();\n }\n if (valueA === valueB) {\n return a.__position - b.__position;\n }\n if (valueA == null) {\n return -1;\n }\n if (valueB == null) {\n return 1;\n }\n if (valueA.localeCompare) {\n return valueA.localeCompare(valueB);\n }\n return valueA > valueB ? 1 : -1;\n };\n },\n desc: function (field) {\n var selector = this.selector(field);\n return function (a, b) {\n var valueA = selector(a);\n var valueB = selector(b);\n if (valueA && valueA.getTime && valueB && valueB.getTime) {\n valueA = valueA.getTime();\n valueB = valueB.getTime();\n }\n if (valueA === valueB) {\n return a.__position - b.__position;\n }\n if (valueA == null) {\n return 1;\n }\n if (valueB == null) {\n return -1;\n }\n if (valueB.localeCompare) {\n return valueB.localeCompare(valueA);\n }\n return valueA < valueB ? 1 : -1;\n };\n },\n create: function (sort) {\n return this[sort.dir](sort.field);\n }\n });\n map = function (array, callback) {\n var idx, length = array.length, result = new Array(length);\n for (idx = 0; idx < length; idx++) {\n result[idx] = callback(array[idx], idx, array);\n }\n return result;\n };\n var operators = function () {\n function quote(str) {\n if (typeof str == 'string') {\n str = str.replace(/[\\r\\n]+/g, '');\n }\n return JSON.stringify(str);\n }\n function textOp(impl) {\n return function (a, b, ignore, accentFoldingFiltering) {\n b += '';\n if (ignore) {\n a = '(' + a + ' + \\'\\').toString()' + (accentFoldingFiltering ? '.toLocaleLowerCase(\\'' + accentFoldingFiltering + '\\')' : '.toLowerCase()');\n b = accentFoldingFiltering ? b.toLocaleLowerCase(accentFoldingFiltering) : b.toLowerCase();\n }\n return impl(a, quote(b), ignore);\n };\n }\n function operator(op, a, b, ignore, accentFoldingFiltering) {\n if (b != null) {\n if (typeof b === STRING) {\n var date = dateRegExp.exec(b);\n if (date) {\n b = new Date(+date[1]);\n } else if (ignore) {\n b = quote(accentFoldingFiltering ? b.toLocaleLowerCase(accentFoldingFiltering) : b.toLowerCase());\n a = '((' + a + ' || \\'\\')+\\'\\')' + (accentFoldingFiltering ? '.toLocaleLowerCase(\\'' + accentFoldingFiltering + '\\')' : '.toLowerCase()');\n } else {\n b = quote(b);\n }\n }\n if (b.getTime) {\n a = '(' + a + '&&' + a + '.getTime?' + a + '.getTime():' + a + ')';\n b = b.getTime();\n }\n }\n return a + ' ' + op + ' ' + b;\n }\n function getMatchRegexp(pattern) {\n for (var rx = '/^', esc = false, i = 0; i < pattern.length; ++i) {\n var ch = pattern.charAt(i);\n if (esc) {\n rx += '\\\\' + ch;\n } else if (ch == '~') {\n esc = true;\n continue;\n } else if (ch == '*') {\n rx += '.*';\n } else if (ch == '?') {\n rx += '.';\n } else if ('.+^$()[]{}|\\\\/\\n\\r\\u2028\\u2029\\xA0'.indexOf(ch) >= 0) {\n rx += '\\\\' + ch;\n } else {\n rx += ch;\n }\n esc = false;\n }\n return rx + '$/';\n }\n return {\n quote: function (value) {\n if (value && value.getTime) {\n return 'new Date(' + value.getTime() + ')';\n }\n return quote(value);\n },\n eq: function (a, b, ignore, accentFoldingFiltering) {\n return operator('==', a, b, ignore, accentFoldingFiltering);\n },\n neq: function (a, b, ignore, accentFoldingFiltering) {\n return operator('!=', a, b, ignore, accentFoldingFiltering);\n },\n gt: function (a, b, ignore) {\n return operator('>', a, b, ignore);\n },\n gte: function (a, b, ignore) {\n return operator('>=', a, b, ignore);\n },\n lt: function (a, b, ignore) {\n return operator('<', a, b, ignore);\n },\n lte: function (a, b, ignore) {\n return operator('<=', a, b, ignore);\n },\n startswith: textOp(function (a, b) {\n return a + '.lastIndexOf(' + b + ', 0) == 0';\n }),\n doesnotstartwith: textOp(function (a, b) {\n return a + '.lastIndexOf(' + b + ', 0) == -1';\n }),\n endswith: textOp(function (a, b) {\n var n = b ? b.length - 2 : 0;\n return a + '.indexOf(' + b + ', ' + a + '.length - ' + n + ') >= 0';\n }),\n doesnotendwith: textOp(function (a, b) {\n var n = b ? b.length - 2 : 0;\n return a + '.indexOf(' + b + ', ' + a + '.length - ' + n + ') < 0';\n }),\n contains: textOp(function (a, b) {\n return a + '.indexOf(' + b + ') >= 0';\n }),\n doesnotcontain: textOp(function (a, b) {\n return a + '.indexOf(' + b + ') == -1';\n }),\n matches: textOp(function (a, b) {\n b = b.substring(1, b.length - 1);\n return getMatchRegexp(b) + '.test(' + a + ')';\n }),\n doesnotmatch: textOp(function (a, b) {\n b = b.substring(1, b.length - 1);\n return '!' + getMatchRegexp(b) + '.test(' + a + ')';\n }),\n isempty: function (a) {\n return a + ' === \\'\\'';\n },\n isnotempty: function (a) {\n return a + ' !== \\'\\'';\n },\n isnull: function (a) {\n return '(' + a + ' == null)';\n },\n isnotnull: function (a) {\n return '(' + a + ' != null)';\n },\n isnullorempty: function (a) {\n return '(' + a + ' === null) || (' + a + ' === \\'\\')';\n },\n isnotnullorempty: function (a) {\n return '(' + a + ' !== null) && (' + a + ' !== \\'\\')';\n }\n };\n }();\n function Query(data) {\n this.data = data || [];\n }\n Query.filterExpr = function (expression) {\n var expressions = [], logic = {\n and: ' && ',\n or: ' || '\n }, idx, length, filter, expr, fieldFunctions = [], operatorFunctions = [], field, operator, filters = expression.filters;\n for (idx = 0, length = filters.length; idx < length; idx++) {\n filter = filters[idx];\n field = filter.field;\n operator = filter.operator;\n if (filter.filters) {\n expr = Query.filterExpr(filter);\n filter = expr.expression.replace(/__o\\[(\\d+)\\]/g, function (match, index) {\n index = +index;\n return '__o[' + (operatorFunctions.length + index) + ']';\n }).replace(/__f\\[(\\d+)\\]/g, function (match, index) {\n index = +index;\n return '__f[' + (fieldFunctions.length + index) + ']';\n });\n operatorFunctions.push.apply(operatorFunctions, expr.operators);\n fieldFunctions.push.apply(fieldFunctions, expr.fields);\n } else {\n if (typeof field === FUNCTION) {\n expr = '__f[' + fieldFunctions.length + '](d)';\n fieldFunctions.push(field);\n } else {\n expr = kendo.expr(field);\n }\n if (typeof operator === FUNCTION) {\n filter = '__o[' + operatorFunctions.length + '](' + expr + ', ' + operators.quote(filter.value) + ')';\n operatorFunctions.push(operator);\n } else {\n filter = operators[(operator || 'eq').toLowerCase()](expr, filter.value, filter.ignoreCase !== undefined ? filter.ignoreCase : true, expression.accentFoldingFiltering);\n }\n }\n expressions.push(filter);\n }\n return {\n expression: '(' + expressions.join(logic[expression.logic]) + ')',\n fields: fieldFunctions,\n operators: operatorFunctions\n };\n };\n function normalizeSort(field, dir) {\n if (field) {\n var descriptor = typeof field === STRING ? {\n field: field,\n dir: dir\n } : field, descriptors = isArray(descriptor) ? descriptor : descriptor !== undefined ? [descriptor] : [];\n return grep(descriptors, function (d) {\n return !!d.dir;\n });\n }\n }\n function sortFields(sorts, dir) {\n var sortObject = {};\n if (sorts) {\n var descriptor = typeof sorts === STRING ? {\n field: sorts,\n dir: dir\n } : sorts, descriptors = isArray(descriptor) ? descriptor : descriptor !== undefined ? [descriptor] : [];\n for (var i = 0; i < descriptors.length; i++) {\n sortObject[descriptors[i].field] = {\n dir: descriptors[i].dir,\n index: i + 1\n };\n }\n }\n return sortObject;\n }\n var operatorMap = {\n '==': 'eq',\n equals: 'eq',\n isequalto: 'eq',\n equalto: 'eq',\n equal: 'eq',\n '!=': 'neq',\n ne: 'neq',\n notequals: 'neq',\n isnotequalto: 'neq',\n notequalto: 'neq',\n notequal: 'neq',\n '<': 'lt',\n islessthan: 'lt',\n lessthan: 'lt',\n less: 'lt',\n '<=': 'lte',\n le: 'lte',\n islessthanorequalto: 'lte',\n lessthanequal: 'lte',\n '>': 'gt',\n isgreaterthan: 'gt',\n greaterthan: 'gt',\n greater: 'gt',\n '>=': 'gte',\n isgreaterthanorequalto: 'gte',\n greaterthanequal: 'gte',\n ge: 'gte',\n notsubstringof: 'doesnotcontain',\n isnull: 'isnull',\n isempty: 'isempty',\n isnotempty: 'isnotempty'\n };\n function normalizeOperator(expression) {\n var idx, length, filter, operator, filters = expression.filters;\n if (filters) {\n for (idx = 0, length = filters.length; idx < length; idx++) {\n filter = filters[idx];\n operator = filter.operator;\n if (operator && typeof operator === STRING) {\n filter.operator = operatorMap[operator.toLowerCase()] || operator;\n }\n normalizeOperator(filter);\n }\n }\n }\n function normalizeFilter(expression) {\n if (expression && !isEmptyObject(expression)) {\n if (isArray(expression) || !expression.filters) {\n expression = {\n logic: 'and',\n filters: isArray(expression) ? expression : [expression]\n };\n }\n normalizeOperator(expression);\n return expression;\n }\n }\n Query.normalizeFilter = normalizeFilter;\n function compareDescriptor(f1, f2) {\n if (f1.logic || f2.logic) {\n return false;\n }\n return f1.field === f2.field && f1.value === f2.value && f1.operator === f2.operator;\n }\n function normalizeDescriptor(filter) {\n filter = filter || {};\n if (isEmptyObject(filter)) {\n return {\n logic: 'and',\n filters: []\n };\n }\n return normalizeFilter(filter);\n }\n function fieldComparer(a, b) {\n if (b.logic || a.field > b.field) {\n return 1;\n } else if (a.field < b.field) {\n return -1;\n } else {\n return 0;\n }\n }\n function compareFilters(expr1, expr2) {\n expr1 = normalizeDescriptor(expr1);\n expr2 = normalizeDescriptor(expr2);\n if (expr1.logic !== expr2.logic) {\n return false;\n }\n var f1, f2;\n var filters1 = (expr1.filters || []).slice();\n var filters2 = (expr2.filters || []).slice();\n if (filters1.length !== filters2.length) {\n return false;\n }\n filters1 = filters1.sort(fieldComparer);\n filters2 = filters2.sort(fieldComparer);\n for (var idx = 0; idx < filters1.length; idx++) {\n f1 = filters1[idx];\n f2 = filters2[idx];\n if (f1.logic && f2.logic) {\n if (!compareFilters(f1, f2)) {\n return false;\n }\n } else if (!compareDescriptor(f1, f2)) {\n return false;\n }\n }\n return true;\n }\n Query.compareFilters = compareFilters;\n function normalizeAggregate(expressions) {\n return isArray(expressions) ? expressions : [expressions];\n }\n function normalizeGroup(field, dir, compare, skipItemSorting) {\n var descriptor = typeof field === STRING ? {\n field: field,\n dir: dir,\n compare: compare,\n skipItemSorting: skipItemSorting\n } : field, descriptors = isArray(descriptor) ? descriptor : descriptor !== undefined ? [descriptor] : [];\n return map(descriptors, function (d) {\n return {\n field: d.field,\n dir: d.dir || 'asc',\n aggregates: d.aggregates,\n compare: d.compare,\n skipItemSorting: d.skipItemSorting\n };\n });\n }\n function normalizeGroupWithoutCompare(field, dir, compare) {\n var descriptors = normalizeGroup(field, dir, compare);\n for (var i = 0; i < descriptors.length; i++) {\n delete descriptors[i].compare;\n }\n return descriptors;\n }\n function anyGroupDescriptorHasCompare(groupDescriptors) {\n var descriptors = isArray(groupDescriptors) ? groupDescriptors : [groupDescriptors];\n for (var i = 0; i < descriptors.length; i++) {\n if (descriptors[i] && isFunction(descriptors[i].compare)) {\n return true;\n }\n }\n return false;\n }\n Query.prototype = {\n toArray: function () {\n return this.data;\n },\n range: function (index, count) {\n return new Query(this.data.slice(index, index + count));\n },\n skip: function (count) {\n return new Query(this.data.slice(count));\n },\n take: function (count) {\n return new Query(this.data.slice(0, count));\n },\n select: function (selector) {\n return new Query(map(this.data, selector));\n },\n order: function (selector, dir, inPlace) {\n var sort = { dir: dir };\n if (selector) {\n if (selector.compare) {\n sort.compare = selector.compare;\n } else {\n sort.field = selector;\n }\n }\n if (inPlace) {\n return new Query(this.data.sort(Comparer.create(sort)));\n }\n return new Query(this.data.slice(0).sort(Comparer.create(sort)));\n },\n orderBy: function (selector, inPlace) {\n return this.order(selector, 'asc', inPlace);\n },\n orderByDescending: function (selector, inPlace) {\n return this.order(selector, 'desc', inPlace);\n },\n sort: function (field, dir, comparer, inPlace) {\n var idx, length, descriptors = normalizeSort(field, dir), comparers = [];\n comparer = comparer || Comparer;\n if (descriptors.length) {\n for (idx = 0, length = descriptors.length; idx < length; idx++) {\n comparers.push(comparer.create(descriptors[idx]));\n }\n return this.orderBy({ compare: comparer.combine(comparers) }, inPlace);\n }\n return this;\n },\n filter: function (expressions) {\n var idx, current, length, compiled, predicate, data = this.data, fields, operators, result = [], filter;\n expressions = normalizeFilter(expressions);\n if (!expressions || expressions.filters.length === 0) {\n return this;\n }\n compiled = Query.filterExpr(expressions);\n fields = compiled.fields;\n operators = compiled.operators;\n predicate = filter = new Function('d, __f, __o', 'return ' + compiled.expression);\n if (fields.length || operators.length) {\n filter = function (d) {\n return predicate(d, fields, operators);\n };\n }\n for (idx = 0, length = data.length; idx < length; idx++) {\n current = data[idx];\n if (filter(current)) {\n result.push(current);\n }\n }\n return new Query(result);\n },\n group: function (descriptors, allData) {\n descriptors = normalizeGroup(descriptors || []);\n allData = allData || this.data;\n var that = this, result = new Query(that.data), descriptor;\n if (descriptors.length > 0) {\n descriptor = descriptors[0];\n result = result.groupBy(descriptor).select(function (group) {\n var data = new Query(allData).filter([{\n field: group.field,\n operator: 'eq',\n value: group.value,\n ignoreCase: false\n }]);\n return {\n field: group.field,\n value: group.value,\n items: descriptors.length > 1 ? new Query(group.items).group(descriptors.slice(1), data.toArray()).toArray() : group.items,\n hasSubgroups: descriptors.length > 1,\n aggregates: data.aggregate(descriptor.aggregates)\n };\n });\n }\n return result;\n },\n groupBy: function (descriptor) {\n var that = this;\n if (isEmptyObject(descriptor) || !this.data.length) {\n return new Query([]);\n }\n var field = descriptor.field, sorted = descriptor.skipItemSorting ? this.data : this._sortForGrouping(field, descriptor.dir || 'asc'), accessor = kendo.accessor(field), item, groupValue = accessor.get(sorted[0], field), group = {\n field: field,\n value: groupValue,\n items: []\n }, currentValue, idx, len, result = [group];\n for (idx = 0, len = sorted.length; idx < len; idx++) {\n item = sorted[idx];\n currentValue = accessor.get(item, field);\n if (!groupValueComparer(groupValue, currentValue)) {\n groupValue = currentValue;\n group = {\n field: field,\n value: groupValue,\n items: []\n };\n result.push(group);\n }\n group.items.push(item);\n }\n result = that._sortGroups(result, descriptor);\n return new Query(result);\n },\n _sortForGrouping: function (field, dir) {\n var idx, length, data = this.data;\n if (!stableSort) {\n for (idx = 0, length = data.length; idx < length; idx++) {\n data[idx].__position = idx;\n }\n data = new Query(data).sort(field, dir, StableComparer).toArray();\n for (idx = 0, length = data.length; idx < length; idx++) {\n delete data[idx].__position;\n }\n return data;\n }\n return this.sort(field, dir).toArray();\n },\n _sortGroups: function (groups, descriptor) {\n var result = groups;\n if (descriptor && isFunction(descriptor.compare)) {\n result = new Query(result).order({ compare: descriptor.compare }, descriptor.dir || ASCENDING).toArray();\n }\n return result;\n },\n aggregate: function (aggregates) {\n var idx, len, result = {}, state = {};\n if (aggregates && aggregates.length) {\n for (idx = 0, len = this.data.length; idx < len; idx++) {\n calculateAggregate(result, aggregates, this.data[idx], idx, len, state);\n }\n }\n return result;\n }\n };\n function groupValueComparer(a, b) {\n if (a && a.getTime && b && b.getTime) {\n return a.getTime() === b.getTime();\n }\n return a === b;\n }\n function calculateAggregate(accumulator, aggregates, item, index, length, state) {\n aggregates = aggregates || [];\n var idx, aggr, functionName, len = aggregates.length;\n for (idx = 0; idx < len; idx++) {\n aggr = aggregates[idx];\n functionName = aggr.aggregate;\n var field = aggr.field;\n accumulator[field] = accumulator[field] || {};\n state[field] = state[field] || {};\n state[field][functionName] = state[field][functionName] || {};\n accumulator[field][functionName] = functions[functionName.toLowerCase()](accumulator[field][functionName], item, kendo.accessor(field), index, length, state[field][functionName]);\n }\n }\n var functions = {\n sum: function (accumulator, item, accessor) {\n var value = accessor.get(item);\n if (!isNumber(accumulator)) {\n accumulator = value;\n } else if (isNumber(value)) {\n accumulator += value;\n }\n return accumulator;\n },\n count: function (accumulator) {\n return (accumulator || 0) + 1;\n },\n average: function (accumulator, item, accessor, index, length, state) {\n var value = accessor.get(item);\n if (state.count === undefined) {\n state.count = 0;\n }\n if (!isNumber(accumulator)) {\n accumulator = value;\n } else if (isNumber(value)) {\n accumulator += value;\n }\n if (isNumber(value)) {\n state.count++;\n }\n if (index == length - 1 && isNumber(accumulator)) {\n accumulator = accumulator / state.count;\n }\n return accumulator;\n },\n max: function (accumulator, item, accessor) {\n var value = accessor.get(item);\n if (!isNumber(accumulator) && !isDate(accumulator)) {\n accumulator = value;\n }\n if (accumulator < value && (isNumber(value) || isDate(value))) {\n accumulator = value;\n }\n return accumulator;\n },\n min: function (accumulator, item, accessor) {\n var value = accessor.get(item);\n if (!isNumber(accumulator) && !isDate(accumulator)) {\n accumulator = value;\n }\n if (accumulator > value && (isNumber(value) || isDate(value))) {\n accumulator = value;\n }\n return accumulator;\n }\n };\n function isNumber(val) {\n return typeof val === 'number' && !isNaN(val);\n }\n function isDate(val) {\n return val && val.getTime;\n }\n function toJSON(array) {\n var idx, length = array.length, result = new Array(length);\n for (idx = 0; idx < length; idx++) {\n result[idx] = array[idx].toJSON();\n }\n return result;\n }\n Query.normalizeGroup = normalizeGroup;\n Query.normalizeSort = normalizeSort;\n Query.process = function (data, options, inPlace) {\n options = options || {};\n var group = options.group;\n var customGroupSort = anyGroupDescriptorHasCompare(normalizeGroup(group || []));\n var query = new Query(data), groupDescriptorsWithoutCompare = normalizeGroupWithoutCompare(group || []), normalizedSort = normalizeSort(options.sort || []), sort = customGroupSort ? normalizedSort : groupDescriptorsWithoutCompare.concat(normalizedSort), groupDescriptorsWithoutSort, total, filterCallback = options.filterCallback, filter = options.filter, skip = options.skip, take = options.take;\n if (sort && inPlace) {\n query = query.sort(sort, undefined, undefined, inPlace);\n }\n if (filter) {\n query = query.filter(filter);\n if (filterCallback) {\n query = filterCallback(query);\n }\n total = query.toArray().length;\n }\n if (sort) {\n if (!inPlace) {\n query = query.sort(sort);\n }\n if (group) {\n data = query.toArray();\n }\n }\n if (customGroupSort) {\n query = query.group(group, data);\n if (skip !== undefined && take !== undefined) {\n query = new Query(flatGroups(query.toArray())).range(skip, take);\n groupDescriptorsWithoutSort = map(groupDescriptorsWithoutCompare, function (groupDescriptor) {\n return extend({}, groupDescriptor, { skipItemSorting: true });\n });\n query = query.group(groupDescriptorsWithoutSort, data);\n }\n } else {\n if (skip !== undefined && take !== undefined) {\n query = query.range(skip, take);\n }\n if (group) {\n query = query.group(group, data);\n }\n }\n return {\n total: total,\n data: query.toArray()\n };\n };\n var LocalTransport = Class.extend({\n init: function (options) {\n this.data = options.data;\n },\n read: function (options) {\n options.success(this.data);\n },\n update: function (options) {\n options.success(options.data);\n },\n create: function (options) {\n options.success(options.data);\n },\n destroy: function (options) {\n options.success(options.data);\n }\n });\n var RemoteTransport = Class.extend({\n init: function (options) {\n var that = this, parameterMap;\n options = that.options = extend({}, that.options, options);\n each(crud, function (index, type) {\n if (typeof options[type] === STRING) {\n options[type] = { url: options[type] };\n }\n });\n that.cache = options.cache ? Cache.create(options.cache) : {\n find: noop,\n add: noop\n };\n parameterMap = options.parameterMap;\n if (options.submit) {\n that.submit = options.submit;\n }\n if (isFunction(options.push)) {\n that.push = options.push;\n }\n if (!that.push) {\n that.push = identity;\n }\n that.parameterMap = isFunction(parameterMap) ? parameterMap : function (options) {\n var result = {};\n each(options, function (option, value) {\n if (option in parameterMap) {\n option = parameterMap[option];\n if (isPlainObject(option)) {\n value = option.value(value);\n option = option.key;\n }\n }\n result[option] = value;\n });\n return result;\n };\n },\n options: { parameterMap: identity },\n create: function (options) {\n return ajax(this.setup(options, CREATE));\n },\n read: function (options) {\n var that = this, success, error, result, cache = that.cache;\n options = that.setup(options, READ);\n success = options.success || noop;\n error = options.error || noop;\n result = cache.find(options.data);\n if (result !== undefined) {\n success(result);\n } else {\n options.success = function (result) {\n cache.add(options.data, result);\n success(result);\n };\n $.ajax(options);\n }\n },\n update: function (options) {\n return ajax(this.setup(options, UPDATE));\n },\n destroy: function (options) {\n return ajax(this.setup(options, DESTROY));\n },\n setup: function (options, type) {\n options = options || {};\n var that = this, parameters, operation = that.options[type], data = isFunction(operation.data) ? operation.data(options.data) : operation.data;\n options = extend(true, {}, operation, options);\n parameters = extend(true, {}, data, options.data);\n options.data = that.parameterMap(parameters, type);\n if (isFunction(options.url)) {\n options.url = options.url(parameters);\n }\n return options;\n }\n });\n var Cache = Class.extend({\n init: function () {\n this._store = {};\n },\n add: function (key, data) {\n if (key !== undefined) {\n this._store[stringify(key)] = data;\n }\n },\n find: function (key) {\n return this._store[stringify(key)];\n },\n clear: function () {\n this._store = {};\n },\n remove: function (key) {\n delete this._store[stringify(key)];\n }\n });\n Cache.create = function (options) {\n var store = {\n 'inmemory': function () {\n return new Cache();\n }\n };\n if (isPlainObject(options) && isFunction(options.find)) {\n return options;\n }\n if (options === true) {\n return new Cache();\n }\n return store[options]();\n };\n function serializeRecords(data, getters, modelInstance, originalFieldNames, fieldNames) {\n var record, getter, originalName, idx, setters = {}, length;\n for (idx = 0, length = data.length; idx < length; idx++) {\n record = data[idx];\n for (getter in getters) {\n originalName = fieldNames[getter];\n if (originalName && originalName !== getter) {\n if (!setters[originalName]) {\n setters[originalName] = kendo.setter(originalName);\n }\n setters[originalName](record, getters[getter](record));\n delete record[getter];\n }\n }\n }\n }\n function convertRecords(data, getters, modelInstance, originalFieldNames, fieldNames) {\n var record, getter, originalName, idx, length;\n for (idx = 0, length = data.length; idx < length; idx++) {\n record = data[idx];\n for (getter in getters) {\n record[getter] = modelInstance._parse(getter, getters[getter](record));\n originalName = fieldNames[getter];\n if (originalName && originalName !== getter) {\n delete record[originalName];\n }\n }\n }\n }\n function convertGroup(data, getters, modelInstance, originalFieldNames, fieldNames) {\n var record, idx, fieldName, length;\n for (idx = 0, length = data.length; idx < length; idx++) {\n record = data[idx];\n fieldName = originalFieldNames[record.field];\n if (fieldName && fieldName != record.field) {\n record.field = fieldName;\n }\n record.value = modelInstance._parse(record.field, record.value);\n if (record.hasSubgroups) {\n convertGroup(record.items, getters, modelInstance, originalFieldNames, fieldNames);\n } else {\n convertRecords(record.items, getters, modelInstance, originalFieldNames, fieldNames);\n }\n }\n }\n function wrapDataAccess(originalFunction, model, converter, getters, originalFieldNames, fieldNames) {\n return function (data) {\n data = originalFunction(data);\n return wrapDataAccessBase(model, converter, getters, originalFieldNames, fieldNames)(data);\n };\n }\n function wrapDataAccessBase(model, converter, getters, originalFieldNames, fieldNames) {\n return function (data) {\n if (data && !isEmptyObject(getters)) {\n if (toString.call(data) !== '[object Array]' && !(data instanceof ObservableArray)) {\n data = [data];\n }\n converter(data, getters, new model(), originalFieldNames, fieldNames);\n }\n return data || [];\n };\n }\n var DataReader = Class.extend({\n init: function (schema) {\n var that = this, member, get, model, base;\n schema = schema || {};\n for (member in schema) {\n get = schema[member];\n that[member] = typeof get === STRING ? getter(get) : get;\n }\n base = schema.modelBase || Model;\n if (isPlainObject(that.model)) {\n that.model = model = base.define(that.model);\n }\n var dataFunction = proxy(that.data, that);\n that._dataAccessFunction = dataFunction;\n if (that.model) {\n var groupsFunction = proxy(that.groups, that), serializeFunction = proxy(that.serialize, that), originalFieldNames = {}, getters = {}, serializeGetters = {}, fieldNames = {}, shouldSerialize = false, fieldName, name;\n model = that.model;\n if (model.fields) {\n each(model.fields, function (field, value) {\n var fromName;\n fieldName = field;\n if (isPlainObject(value) && value.field) {\n fieldName = value.field;\n } else if (typeof value === STRING) {\n fieldName = value;\n }\n if (isPlainObject(value) && value.from) {\n fromName = value.from;\n }\n shouldSerialize = shouldSerialize || fromName && fromName !== field || fieldName !== field;\n name = fromName || fieldName;\n getters[field] = name.indexOf('.') !== -1 ? getter(name, true) : getter(name);\n serializeGetters[field] = getter(field);\n originalFieldNames[fromName || fieldName] = field;\n fieldNames[field] = fromName || fieldName;\n });\n if (!schema.serialize && shouldSerialize) {\n that.serialize = wrapDataAccess(serializeFunction, model, serializeRecords, serializeGetters, originalFieldNames, fieldNames);\n }\n }\n that._dataAccessFunction = dataFunction;\n that._wrapDataAccessBase = wrapDataAccessBase(model, convertRecords, getters, originalFieldNames, fieldNames);\n that.data = wrapDataAccess(dataFunction, model, convertRecords, getters, originalFieldNames, fieldNames);\n that.groups = wrapDataAccess(groupsFunction, model, convertGroup, getters, originalFieldNames, fieldNames);\n }\n },\n errors: function (data) {\n return data ? data.errors : null;\n },\n parse: identity,\n data: identity,\n total: function (data) {\n return data.length;\n },\n groups: identity,\n aggregates: function () {\n return {};\n },\n serialize: function (data) {\n return data;\n }\n });\n function fillLastGroup(originalGroup, newGroup) {\n var currOriginal;\n var currentNew;\n if (newGroup.items && newGroup.items.length) {\n for (var i = 0; i < newGroup.items.length; i++) {\n currOriginal = originalGroup.items[i];\n currentNew = newGroup.items[i];\n if (currOriginal && currentNew) {\n if (currOriginal.hasSubgroups) {\n fillLastGroup(currOriginal, currentNew);\n } else if (currOriginal.field && currOriginal.value == currentNew.value) {\n currOriginal.items.push.apply(currOriginal.items, currentNew.items);\n } else {\n originalGroup.items.push.apply(originalGroup.items, [currentNew]);\n }\n } else if (currentNew) {\n originalGroup.items.push.apply(originalGroup.items, [currentNew]);\n }\n }\n }\n }\n function mergeGroups(target, dest, skip, take) {\n var group, idx = 0, items;\n while (dest.length && take) {\n group = dest[idx];\n items = group.items;\n var length = items.length;\n if (target && target.field === group.field && target.value === group.value) {\n if (target.hasSubgroups && target.items.length) {\n mergeGroups(target.items[target.items.length - 1], group.items, skip, take);\n } else {\n items = items.slice(skip, skip + take);\n target.items = target.items.concat(items);\n }\n dest.splice(idx--, 1);\n } else if (group.hasSubgroups && items.length) {\n mergeGroups(group, items, skip, take);\n if (!group.items.length) {\n dest.splice(idx--, 1);\n }\n } else {\n items = items.slice(skip, skip + take);\n group.items = items;\n if (!group.items.length) {\n dest.splice(idx--, 1);\n }\n }\n if (items.length === 0) {\n skip -= length;\n } else {\n skip = 0;\n take -= items.length;\n }\n if (++idx >= dest.length) {\n break;\n }\n }\n if (idx < dest.length) {\n dest.splice(idx, dest.length - idx);\n }\n }\n function flatGroups(groups, indexFunction) {\n var result = [];\n var groupsLength = (groups || []).length;\n var group;\n var items;\n var indexFn = isFunction(indexFunction) ? indexFunction : function (array, index) {\n return array[index];\n };\n for (var groupIndex = 0; groupIndex < groupsLength; groupIndex++) {\n group = indexFn(groups, groupIndex);\n if (group.hasSubgroups) {\n result = result.concat(flatGroups(group.items));\n } else {\n items = group.items;\n for (var itemIndex = 0; itemIndex < items.length; itemIndex++) {\n result.push(indexFn(items, itemIndex));\n }\n }\n }\n return result;\n }\n function flattenGroups(data) {\n var idx, result = [], length, items, itemIndex;\n for (idx = 0, length = data.length; idx < length; idx++) {\n var group = data.at(idx);\n if (group.hasSubgroups) {\n result = result.concat(flattenGroups(group.items));\n } else {\n items = group.items;\n for (itemIndex = 0; itemIndex < items.length; itemIndex++) {\n result.push(items.at(itemIndex));\n }\n }\n }\n return result;\n }\n function wrapGroupItems(data, model) {\n var idx, length, group;\n if (model) {\n for (idx = 0, length = data.length; idx < length; idx++) {\n group = data.at(idx);\n if (group.hasSubgroups) {\n wrapGroupItems(group.items, model);\n } else {\n group.items = new LazyObservableArray(group.items, model, group.items._events);\n }\n }\n }\n }\n function eachGroupItems(data, func) {\n for (var idx = 0; idx < data.length; idx++) {\n if (data[idx].hasSubgroups) {\n if (eachGroupItems(data[idx].items, func)) {\n return true;\n }\n } else if (func(data[idx].items, data[idx])) {\n return true;\n }\n }\n }\n function replaceInRanges(ranges, data, item, observable) {\n for (var idx = 0; idx < ranges.length; idx++) {\n if (ranges[idx].data === data) {\n break;\n }\n if (replaceInRange(ranges[idx].data, item, observable)) {\n break;\n }\n }\n }\n function replaceInRange(items, item, observable) {\n for (var idx = 0, length = items.length; idx < length; idx++) {\n if (items[idx] && items[idx].hasSubgroups) {\n return replaceInRange(items[idx].items, item, observable);\n } else if (items[idx] === item || items[idx] === observable) {\n items[idx] = observable;\n return true;\n }\n }\n }\n function replaceWithObservable(view, data, ranges, type, serverGrouping) {\n for (var viewIndex = 0, length = view.length; viewIndex < length; viewIndex++) {\n var item = view[viewIndex];\n if (!item || item instanceof type) {\n continue;\n }\n if (item.hasSubgroups !== undefined && !serverGrouping) {\n replaceWithObservable(item.items, data, ranges, type, serverGrouping);\n } else {\n for (var idx = 0; idx < data.length; idx++) {\n if (data[idx] === item) {\n view[viewIndex] = data.at(idx);\n replaceInRanges(ranges, data, item, view[viewIndex]);\n break;\n }\n }\n }\n }\n }\n function removeModel(data, model) {\n var length = data.length;\n var dataItem;\n var idx;\n for (idx = 0; idx < length; idx++) {\n dataItem = data[idx];\n if (dataItem.uid && dataItem.uid == model.uid) {\n data.splice(idx, 1);\n return dataItem;\n }\n }\n }\n function indexOfPristineModel(data, model) {\n if (model) {\n return indexOf(data, function (item) {\n return item.uid && item.uid == model.uid || item[model.idField] === model.id && model.id !== model._defaultId;\n });\n }\n return -1;\n }\n function indexOfModel(data, model) {\n if (model) {\n return indexOf(data, function (item) {\n return item.uid == model.uid;\n });\n }\n return -1;\n }\n function indexOf(data, comparer) {\n var idx, length;\n for (idx = 0, length = data.length; idx < length; idx++) {\n if (comparer(data[idx])) {\n return idx;\n }\n }\n return -1;\n }\n function fieldNameFromModel(fields, name) {\n if (fields && !isEmptyObject(fields)) {\n var descriptor = fields[name];\n var fieldName;\n if (isPlainObject(descriptor)) {\n fieldName = descriptor.from || descriptor.field || name;\n } else {\n fieldName = fields[name] || name;\n }\n if (isFunction(fieldName)) {\n return name;\n }\n return fieldName;\n }\n return name;\n }\n function convertFilterDescriptorsField(descriptor, model) {\n var idx, length, target = {};\n for (var field in descriptor) {\n if (field !== 'filters') {\n target[field] = descriptor[field];\n }\n }\n if (descriptor.filters) {\n target.filters = [];\n for (idx = 0, length = descriptor.filters.length; idx < length; idx++) {\n target.filters[idx] = convertFilterDescriptorsField(descriptor.filters[idx], model);\n }\n } else {\n target.field = fieldNameFromModel(model.fields, target.field);\n }\n return target;\n }\n function convertDescriptorsField(descriptors, model) {\n var idx, length, result = [], target, descriptor;\n for (idx = 0, length = descriptors.length; idx < length; idx++) {\n target = {};\n descriptor = descriptors[idx];\n for (var field in descriptor) {\n target[field] = descriptor[field];\n }\n target.field = fieldNameFromModel(model.fields, target.field);\n if (target.aggregates && isArray(target.aggregates)) {\n target.aggregates = convertDescriptorsField(target.aggregates, model);\n }\n result.push(target);\n }\n return result;\n }\n var DataSource = Observable.extend({\n init: function (options) {\n var that = this, model, data;\n if (options) {\n data = options.data;\n }\n options = that.options = extend({}, that.options, options);\n that._map = {};\n that._prefetch = {};\n that._data = [];\n that._pristineData = [];\n that._ranges = [];\n that._view = [];\n that._pristineTotal = 0;\n that._destroyed = [];\n that._pageSize = options.pageSize;\n that._page = options.page || (options.pageSize ? 1 : undefined);\n that._sort = normalizeSort(options.sort);\n that._filter = normalizeFilter(options.filter);\n that._group = normalizeGroup(options.group);\n that._aggregate = options.aggregate;\n that._total = options.total;\n that._shouldDetachObservableParents = true;\n Observable.fn.init.call(that);\n that.transport = Transport.create(options, data, that);\n if (isFunction(that.transport.push)) {\n that.transport.push({\n pushCreate: proxy(that._pushCreate, that),\n pushUpdate: proxy(that._pushUpdate, that),\n pushDestroy: proxy(that._pushDestroy, that)\n });\n }\n if (options.offlineStorage != null) {\n if (typeof options.offlineStorage == 'string') {\n var key = options.offlineStorage;\n that._storage = {\n getItem: function () {\n return JSON.parse(localStorage.getItem(key));\n },\n setItem: function (item) {\n localStorage.setItem(key, stringify(that.reader.serialize(item)));\n }\n };\n } else {\n that._storage = options.offlineStorage;\n }\n }\n that.reader = new kendo.data.readers[options.schema.type || 'json'](options.schema);\n model = that.reader.model || {};\n that._detachObservableParents();\n that._data = that._observe(that._data);\n that._online = true;\n that.bind([\n 'push',\n ERROR,\n CHANGE,\n REQUESTSTART,\n SYNC,\n REQUESTEND,\n PROGRESS\n ], options);\n },\n options: {\n data: null,\n schema: { modelBase: Model },\n offlineStorage: null,\n serverSorting: false,\n serverPaging: false,\n serverFiltering: false,\n serverGrouping: false,\n serverAggregates: false,\n batch: false,\n inPlaceSort: false\n },\n clone: function () {\n return this;\n },\n online: function (value) {\n if (value !== undefined) {\n if (this._online != value) {\n this._online = value;\n if (value) {\n return this.sync();\n }\n }\n return $.Deferred().resolve().promise();\n } else {\n return this._online;\n }\n },\n offlineData: function (state) {\n if (this.options.offlineStorage == null) {\n return null;\n }\n if (state !== undefined) {\n return this._storage.setItem(state);\n }\n return this._storage.getItem() || [];\n },\n _isServerGrouped: function () {\n var group = this.group() || [];\n return this.options.serverGrouping && group.length;\n },\n _pushCreate: function (result) {\n this._push(result, 'pushCreate');\n },\n _pushUpdate: function (result) {\n this._push(result, 'pushUpdate');\n },\n _pushDestroy: function (result) {\n this._push(result, 'pushDestroy');\n },\n _push: function (result, operation) {\n var data = this._readData(result);\n if (!data) {\n data = result;\n }\n this[operation](data);\n },\n _flatData: function (data, skip) {\n if (data) {\n if (this._isServerGrouped()) {\n return flattenGroups(data);\n }\n if (!skip) {\n for (var idx = 0; idx < data.length; idx++) {\n data.at(idx);\n }\n }\n }\n return data;\n },\n parent: noop,\n get: function (id) {\n var idx, length, data = this._flatData(this._data, this.options.useRanges);\n for (idx = 0, length = data.length; idx < length; idx++) {\n if (data[idx].id == id) {\n return data[idx];\n }\n }\n },\n getByUid: function (id) {\n return this._getByUid(id, this._data);\n },\n _getByUid: function (id, dataItems) {\n var idx, length, data = this._flatData(dataItems, this.options.useRanges);\n if (!data) {\n return;\n }\n for (idx = 0, length = data.length; idx < length; idx++) {\n if (data[idx].uid == id) {\n return data[idx];\n }\n }\n },\n indexOf: function (model) {\n return indexOfModel(this._data, model);\n },\n at: function (index) {\n return this._data.at(index);\n },\n data: function (value) {\n var that = this;\n if (value !== undefined) {\n that._detachObservableParents();\n that._data = this._observe(value);\n that._pristineData = value.slice(0);\n that._storeData();\n that._ranges = [];\n that.trigger('reset');\n that._addRange(that._data);\n that._total = that._data.length;\n that._pristineTotal = that._total;\n that._process(that._data);\n } else {\n if (that._data) {\n for (var idx = 0; idx < that._data.length; idx++) {\n that._data.at(idx);\n }\n }\n return that._data;\n }\n },\n view: function (value) {\n if (value === undefined) {\n return this._view;\n } else {\n this._view = this._observeView(value);\n }\n },\n _observeView: function (data) {\n var that = this;\n replaceWithObservable(data, that._data, that._ranges, that.reader.model || ObservableObject, that._isServerGrouped());\n var view = new LazyObservableArray(data, that.reader.model);\n view.parent = function () {\n return that.parent();\n };\n return view;\n },\n flatView: function () {\n var groups = this.group() || [];\n if (groups.length) {\n return flattenGroups(this._view);\n } else {\n return this._view;\n }\n },\n add: function (model) {\n return this.insert(this._data.length, model);\n },\n _createNewModel: function (model) {\n if (this.reader.model) {\n return new this.reader.model(model);\n }\n if (model instanceof ObservableObject) {\n return model;\n }\n return new ObservableObject(model);\n },\n insert: function (index, model) {\n if (!model) {\n model = index;\n index = 0;\n }\n if (!(model instanceof Model)) {\n model = this._createNewModel(model);\n }\n if (this._isServerGrouped()) {\n this._data.splice(index, 0, this._wrapInEmptyGroup(model));\n } else {\n this._data.splice(index, 0, model);\n }\n this._insertModelInRange(index, model);\n return model;\n },\n pushInsert: function (index, items) {\n var that = this;\n var rangeSpan = that._getCurrentRangeSpan();\n if (!items) {\n items = index;\n index = 0;\n }\n if (!isArray(items)) {\n items = [items];\n }\n var pushed = [];\n var autoSync = this.options.autoSync;\n this.options.autoSync = false;\n try {\n for (var idx = 0; idx < items.length; idx++) {\n var item = items[idx];\n var result = this.insert(index, item);\n pushed.push(result);\n var pristine = result.toJSON();\n if (this._isServerGrouped()) {\n pristine = this._wrapInEmptyGroup(pristine);\n }\n this._pristineData.push(pristine);\n if (rangeSpan && rangeSpan.length) {\n $(rangeSpan).last()[0].pristineData.push(pristine);\n }\n index++;\n }\n } finally {\n this.options.autoSync = autoSync;\n }\n if (pushed.length) {\n this.trigger('push', {\n type: 'create',\n items: pushed\n });\n }\n },\n pushCreate: function (items) {\n this.pushInsert(this._data.length, items);\n },\n pushUpdate: function (items) {\n if (!isArray(items)) {\n items = [items];\n }\n var pushed = [];\n for (var idx = 0; idx < items.length; idx++) {\n var item = items[idx];\n var model = this._createNewModel(item);\n var target = this.get(model.id);\n if (target) {\n pushed.push(target);\n target.accept(item);\n target.trigger(CHANGE);\n this._updatePristineForModel(target, item);\n } else {\n this.pushCreate(item);\n }\n }\n if (pushed.length) {\n this.trigger('push', {\n type: 'update',\n items: pushed\n });\n }\n },\n pushDestroy: function (items) {\n var pushed = this._removeItems(items);\n if (pushed.length) {\n this.trigger('push', {\n type: 'destroy',\n items: pushed\n });\n }\n },\n _removeItems: function (items, removePristine) {\n if (!isArray(items)) {\n items = [items];\n }\n var shouldRemovePristine = typeof removePristine !== 'undefined' ? removePristine : true;\n var destroyed = [];\n var autoSync = this.options.autoSync;\n this.options.autoSync = false;\n try {\n for (var idx = 0; idx < items.length; idx++) {\n var item = items[idx];\n var model = this._createNewModel(item);\n var found = false;\n this._eachItem(this._data, function (items) {\n for (var idx = 0; idx < items.length; idx++) {\n var item = items.at(idx);\n if (item.id === model.id) {\n destroyed.push(item);\n items.splice(idx, 1);\n found = true;\n break;\n }\n }\n });\n if (found && shouldRemovePristine) {\n this._removePristineForModel(model);\n this._destroyed.pop();\n }\n }\n } finally {\n this.options.autoSync = autoSync;\n }\n return destroyed;\n },\n remove: function (model) {\n var result, that = this, hasGroups = that._isServerGrouped();\n this._eachItem(that._data, function (items) {\n result = removeModel(items, model);\n if (result && hasGroups) {\n if (!result.isNew || !result.isNew()) {\n that._destroyed.push(result);\n }\n return true;\n }\n });\n this._removeModelFromRanges(model);\n return model;\n },\n destroyed: function () {\n return this._destroyed;\n },\n created: function () {\n var idx, length, result = [], data = this._flatData(this._data, this.options.useRanges);\n for (idx = 0, length = data.length; idx < length; idx++) {\n if (data[idx].isNew && data[idx].isNew()) {\n result.push(data[idx]);\n }\n }\n return result;\n },\n updated: function () {\n var idx, length, result = [], data = this._flatData(this._data, this.options.useRanges);\n for (idx = 0, length = data.length; idx < length; idx++) {\n if (data[idx].isNew && !data[idx].isNew() && data[idx].dirty) {\n result.push(data[idx]);\n }\n }\n return result;\n },\n sync: function () {\n var that = this, created = [], updated = [], destroyed = that._destroyed;\n var promise = $.Deferred().resolve().promise();\n if (that.online()) {\n if (!that.reader.model) {\n return promise;\n }\n created = that.created();\n updated = that.updated();\n var promises = [];\n if (that.options.batch && that.transport.submit) {\n promises = that._sendSubmit(created, updated, destroyed);\n } else {\n promises.push.apply(promises, that._send('create', created));\n promises.push.apply(promises, that._send('update', updated));\n promises.push.apply(promises, that._send('destroy', destroyed));\n }\n promise = $.when.apply(null, promises).then(function () {\n var idx, length;\n for (idx = 0, length = arguments.length; idx < length; idx++) {\n if (arguments[idx]) {\n that._accept(arguments[idx]);\n }\n }\n that._storeData(true);\n that._syncEnd();\n that._change({ action: 'sync' });\n that.trigger(SYNC);\n });\n } else {\n that._storeData(true);\n that._syncEnd();\n that._change({ action: 'sync' });\n }\n return promise;\n },\n _syncEnd: noop,\n cancelChanges: function (model) {\n var that = this;\n if (model instanceof kendo.data.Model) {\n that._cancelModel(model);\n } else {\n that._destroyed = [];\n that._detachObservableParents();\n that._data = that._observe(that._pristineData);\n if (that.options.serverPaging) {\n that._total = that._pristineTotal;\n }\n that._ranges = [];\n that._addRange(that._data, 0);\n that._changesCanceled();\n that._change();\n that._markOfflineUpdatesAsDirty();\n }\n },\n _changesCanceled: noop,\n _markOfflineUpdatesAsDirty: function () {\n var that = this;\n if (that.options.offlineStorage != null) {\n that._eachItem(that._data, function (items) {\n for (var idx = 0; idx < items.length; idx++) {\n var item = items.at(idx);\n if (item.__state__ == 'update' || item.__state__ == 'create') {\n item.dirty = true;\n }\n }\n });\n }\n },\n hasChanges: function () {\n var idx, length, data = this._flatData(this._data, this.options.useRanges);\n if (this._destroyed.length) {\n return true;\n }\n for (idx = 0, length = data.length; idx < length; idx++) {\n if (data[idx].isNew && data[idx].isNew() || data[idx].dirty) {\n return true;\n }\n }\n return false;\n },\n _accept: function (result) {\n var that = this, models = result.models, response = result.response, idx = 0, serverGroup = that._isServerGrouped(), pristine = that._pristineData, type = result.type, length;\n that.trigger(REQUESTEND, {\n response: response,\n type: type\n });\n if (response && !isEmptyObject(response)) {\n response = that.reader.parse(response);\n if (that._handleCustomErrors(response)) {\n return;\n }\n response = that.reader.data(response);\n if (!isArray(response)) {\n response = [response];\n }\n } else {\n response = $.map(models, function (model) {\n return model.toJSON();\n });\n }\n if (type === 'destroy') {\n that._destroyed = [];\n }\n for (idx = 0, length = models.length; idx < length; idx++) {\n if (type !== 'destroy') {\n models[idx].accept(response[idx]);\n if (type === 'create') {\n pristine.push(serverGroup ? that._wrapInEmptyGroup(models[idx].toJSON()) : response[idx]);\n } else if (type === 'update') {\n that._updatePristineForModel(models[idx], response[idx]);\n }\n } else {\n that._removePristineForModel(models[idx]);\n }\n }\n },\n _updatePristineForModel: function (model, values) {\n this._executeOnPristineForModel(model, function (index, items) {\n kendo.deepExtend(items[index], values);\n });\n },\n _executeOnPristineForModel: function (model, callback) {\n this._eachPristineItem(function (items) {\n var index = indexOfPristineModel(items, model);\n if (index > -1) {\n callback(index, items);\n return true;\n }\n });\n },\n _removePristineForModel: function (model) {\n this._executeOnPristineForModel(model, function (index, items) {\n items.splice(index, 1);\n });\n },\n _readData: function (data) {\n var read = !this._isServerGrouped() ? this.reader.data : this.reader.groups;\n return read.call(this.reader, data);\n },\n _eachPristineItem: function (callback) {\n var that = this;\n var options = that.options;\n var rangeSpan = that._getCurrentRangeSpan();\n that._eachItem(that._pristineData, callback);\n if (options.serverPaging && options.useRanges) {\n each(rangeSpan, function (i, range) {\n that._eachItem(range.pristineData, callback);\n });\n }\n },\n _eachItem: function (data, callback) {\n if (data && data.length) {\n if (this._isServerGrouped()) {\n eachGroupItems(data, callback);\n } else {\n callback(data);\n }\n }\n },\n _pristineForModel: function (model) {\n var pristine, idx, callback = function (items) {\n idx = indexOfPristineModel(items, model);\n if (idx > -1) {\n pristine = items[idx];\n return true;\n }\n };\n this._eachPristineItem(callback);\n return pristine;\n },\n _cancelModel: function (model) {\n var that = this;\n var pristine = this._pristineForModel(model);\n this._eachItem(this._data, function (items) {\n var idx = indexOfModel(items, model);\n if (idx >= 0) {\n if (pristine && (!model.isNew() || pristine.__state__)) {\n items[idx].accept(pristine);\n if (pristine.__state__ == 'update') {\n items[idx].dirty = true;\n }\n } else {\n that._modelCanceled(model);\n items.splice(idx, 1);\n that._removeModelFromRanges(model);\n }\n }\n });\n },\n _modelCanceled: noop,\n _submit: function (promises, data) {\n var that = this;\n that.trigger(REQUESTSTART, { type: 'submit' });\n that.trigger(PROGRESS);\n that.transport.submit(extend({\n success: function (response, type) {\n var promise = $.grep(promises, function (x) {\n return x.type == type;\n })[0];\n if (promise) {\n promise.resolve({\n response: response,\n models: promise.models,\n type: type\n });\n }\n },\n error: function (response, status, error) {\n for (var idx = 0; idx < promises.length; idx++) {\n promises[idx].reject(response);\n }\n that.error(response, status, error);\n }\n }, data));\n },\n _sendSubmit: function (created, updated, destroyed) {\n var that = this, promises = [];\n if (that.options.batch) {\n if (created.length) {\n promises.push($.Deferred(function (deferred) {\n deferred.type = 'create';\n deferred.models = created;\n }));\n }\n if (updated.length) {\n promises.push($.Deferred(function (deferred) {\n deferred.type = 'update';\n deferred.models = updated;\n }));\n }\n if (destroyed.length) {\n promises.push($.Deferred(function (deferred) {\n deferred.type = 'destroy';\n deferred.models = destroyed;\n }));\n }\n that._submit(promises, {\n data: {\n created: that.reader.serialize(toJSON(created)),\n updated: that.reader.serialize(toJSON(updated)),\n destroyed: that.reader.serialize(toJSON(destroyed))\n }\n });\n }\n return promises;\n },\n _promise: function (data, models, type) {\n var that = this;\n return $.Deferred(function (deferred) {\n that.trigger(REQUESTSTART, { type: type });\n that.trigger(PROGRESS);\n that.transport[type].call(that.transport, extend({\n success: function (response) {\n deferred.resolve({\n response: response,\n models: models,\n type: type\n });\n },\n error: function (response, status, error) {\n deferred.reject(response);\n that.error(response, status, error);\n }\n }, data));\n }).promise();\n },\n _send: function (method, data) {\n var that = this, idx, length, promises = [], converted = that.reader.serialize(toJSON(data));\n if (that.options.batch) {\n if (data.length) {\n promises.push(that._promise({ data: { models: converted } }, data, method));\n }\n } else {\n for (idx = 0, length = data.length; idx < length; idx++) {\n promises.push(that._promise({ data: converted[idx] }, [data[idx]], method));\n }\n }\n return promises;\n },\n read: function (data) {\n var that = this, params = that._params(data);\n var deferred = $.Deferred();\n that._queueRequest(params, function () {\n var isPrevented = that.trigger(REQUESTSTART, { type: 'read' });\n if (!isPrevented) {\n that.trigger(PROGRESS);\n that._ranges = [];\n that.trigger('reset');\n if (that.online()) {\n that.transport.read({\n data: params,\n success: function (data) {\n that._ranges = [];\n that.success(data, params);\n deferred.resolve();\n },\n error: function () {\n var args = slice.call(arguments);\n that.error.apply(that, args);\n deferred.reject.apply(deferred, args);\n }\n });\n } else if (that.options.offlineStorage != null) {\n that.success(that.offlineData(), params);\n deferred.resolve();\n }\n } else {\n that._dequeueRequest();\n deferred.resolve(isPrevented);\n }\n });\n return deferred.promise();\n },\n _readAggregates: function (data) {\n return this.reader.aggregates(data);\n },\n success: function (data) {\n var that = this, options = that.options, items, replaceSubset;\n that.trigger(REQUESTEND, {\n response: data,\n type: 'read'\n });\n if (that.online()) {\n data = that.reader.parse(data);\n if (that._handleCustomErrors(data)) {\n that._dequeueRequest();\n return;\n }\n that._total = that.reader.total(data);\n if (that._pageSize > that._total) {\n that._pageSize = that._total;\n if (that.options.pageSize && that.options.pageSize > that._pageSize) {\n that._pageSize = that.options.pageSize;\n }\n }\n if (that._aggregate && options.serverAggregates) {\n that._aggregateResult = that._readAggregates(data);\n }\n data = that._readData(data);\n that._destroyed = [];\n } else {\n data = that._readData(data);\n items = [];\n var itemIds = {};\n var model = that.reader.model;\n var idField = model ? model.idField : 'id';\n var idx;\n for (idx = 0; idx < this._destroyed.length; idx++) {\n var id = this._destroyed[idx][idField];\n itemIds[id] = id;\n }\n for (idx = 0; idx < data.length; idx++) {\n var item = data[idx];\n var state = item.__state__;\n if (state == 'destroy') {\n if (!itemIds[item[idField]]) {\n this._destroyed.push(this._createNewModel(item));\n }\n } else {\n items.push(item);\n }\n }\n data = items;\n that._total = data.length;\n }\n that._pristineTotal = that._total;\n replaceSubset = that._skip && that._data.length && that._skip < that._data.length;\n if (that.options.endless) {\n if (replaceSubset) {\n that._pristineData.splice(that._skip, that._pristineData.length);\n }\n items = data.slice(0);\n for (var j = 0; j < items.length; j++) {\n that._pristineData.push(items[j]);\n }\n } else {\n that._pristineData = data.slice(0);\n }\n that._detachObservableParents();\n if (that.options.endless) {\n that._data.unbind(CHANGE, that._changeHandler);\n if (that._isServerGrouped() && that._data[that._data.length - 1].value === data[0].value) {\n fillLastGroup(that._data[that._data.length - 1], data[0]);\n data.shift();\n }\n data = that._observe(data);\n if (replaceSubset) {\n that._data.splice(that._skip, that._data.length);\n }\n for (var i = 0; i < data.length; i++) {\n that._data.push(data[i]);\n }\n that._data.bind(CHANGE, that._changeHandler);\n } else {\n that._data = that._observe(data);\n }\n that._markOfflineUpdatesAsDirty();\n that._storeData();\n that._addRange(that._data);\n that._process(that._data);\n that._dequeueRequest();\n },\n _detachObservableParents: function () {\n if (this._data && this._shouldDetachObservableParents) {\n for (var idx = 0; idx < this._data.length; idx++) {\n if (this._data[idx].parent) {\n this._data[idx].parent = noop;\n }\n }\n }\n },\n _storeData: function (updatePristine) {\n var serverGrouping = this._isServerGrouped();\n var model = this.reader.model;\n function items(data) {\n var state = [];\n for (var idx = 0; idx < data.length; idx++) {\n var dataItem = data.at(idx);\n var item = dataItem.toJSON();\n if (serverGrouping && dataItem.items) {\n item.items = items(dataItem.items);\n } else {\n item.uid = dataItem.uid;\n if (model) {\n if (dataItem.isNew()) {\n item.__state__ = 'create';\n } else if (dataItem.dirty) {\n item.__state__ = 'update';\n }\n }\n }\n state.push(item);\n }\n return state;\n }\n if (this.options.offlineStorage != null) {\n var state = items(this._data);\n var destroyed = [];\n for (var idx = 0; idx < this._destroyed.length; idx++) {\n var item = this._destroyed[idx].toJSON();\n item.__state__ = 'destroy';\n destroyed.push(item);\n }\n this.offlineData(state.concat(destroyed));\n if (updatePristine) {\n this._pristineData = this.reader.reader ? this.reader.reader._wrapDataAccessBase(state) : this.reader._wrapDataAccessBase(state);\n }\n }\n },\n _addRange: function (data, skip) {\n var that = this, start = typeof skip !== 'undefined' ? skip : that._skip || 0, end = start + that._flatData(data, true).length;\n that._ranges.push({\n start: start,\n end: end,\n data: data,\n pristineData: data.toJSON(),\n timestamp: that._timeStamp()\n });\n that._sortRanges();\n },\n _sortRanges: function () {\n this._ranges.sort(function (x, y) {\n return x.start - y.start;\n });\n },\n error: function (xhr, status, errorThrown) {\n this._dequeueRequest();\n this.trigger(REQUESTEND, {});\n this.trigger(ERROR, {\n xhr: xhr,\n status: status,\n errorThrown: errorThrown\n });\n },\n _params: function (data) {\n var that = this, options = extend({\n take: that.take(),\n skip: that.skip(),\n page: that.page(),\n pageSize: that.pageSize(),\n sort: that._sort,\n filter: that._filter,\n group: that._group,\n aggregate: that._aggregate\n }, data);\n if (!that.options.serverPaging) {\n delete options.take;\n delete options.skip;\n delete options.page;\n delete options.pageSize;\n }\n if (!that.options.serverGrouping) {\n delete options.group;\n } else if (that.reader.model && options.group) {\n options.group = convertDescriptorsField(options.group, that.reader.model);\n }\n if (!that.options.serverFiltering) {\n delete options.filter;\n } else if (that.reader.model && options.filter) {\n options.filter = convertFilterDescriptorsField(options.filter, that.reader.model);\n }\n if (!that.options.serverSorting) {\n delete options.sort;\n } else if (that.reader.model && options.sort) {\n options.sort = convertDescriptorsField(options.sort, that.reader.model);\n }\n if (!that.options.serverAggregates) {\n delete options.aggregate;\n } else if (that.reader.model && options.aggregate) {\n options.aggregate = convertDescriptorsField(options.aggregate, that.reader.model);\n }\n return options;\n },\n _queueRequest: function (options, callback) {\n var that = this;\n if (!that._requestInProgress) {\n that._requestInProgress = true;\n that._pending = undefined;\n callback();\n } else {\n that._pending = {\n callback: proxy(callback, that),\n options: options\n };\n }\n },\n _dequeueRequest: function () {\n var that = this;\n that._requestInProgress = false;\n if (that._pending) {\n that._queueRequest(that._pending.options, that._pending.callback);\n }\n },\n _handleCustomErrors: function (response) {\n if (this.reader.errors) {\n var errors = this.reader.errors(response);\n if (errors) {\n this.trigger(ERROR, {\n xhr: null,\n status: 'customerror',\n errorThrown: 'custom error',\n errors: errors\n });\n return true;\n }\n }\n return false;\n },\n _shouldWrap: function (data) {\n var model = this.reader.model;\n if (model && data.length) {\n return !(data[0] instanceof model);\n }\n return false;\n },\n _observe: function (data) {\n var that = this, model = that.reader.model;\n that._shouldDetachObservableParents = true;\n if (data instanceof ObservableArray) {\n that._shouldDetachObservableParents = false;\n if (that._shouldWrap(data)) {\n data.type = that.reader.model;\n data.wrapAll(data, data);\n }\n } else {\n var arrayType = that.pageSize() && !that.options.serverPaging ? LazyObservableArray : ObservableArray;\n data = new arrayType(data, that.reader.model);\n data.parent = function () {\n return that.parent();\n };\n }\n if (that._isServerGrouped()) {\n wrapGroupItems(data, model);\n }\n if (that._changeHandler && that._data && that._data instanceof ObservableArray && !(that.options.useRanges && that.options.serverPaging)) {\n that._data.unbind(CHANGE, that._changeHandler);\n } else {\n that._changeHandler = proxy(that._change, that);\n }\n return data.bind(CHANGE, that._changeHandler);\n },\n _updateTotalForAction: function (action, items) {\n var that = this;\n var total = parseInt(that._total, 10);\n if (!isNumber(that._total)) {\n total = parseInt(that._pristineTotal, 10);\n }\n if (action === 'add') {\n total += items.length;\n } else if (action === 'remove') {\n total -= items.length;\n } else if (action !== 'itemchange' && action !== 'sync' && !that.options.serverPaging) {\n total = that._pristineTotal;\n } else if (action === 'sync') {\n total = that._pristineTotal = parseInt(that._total, 10);\n }\n that._total = total;\n },\n _change: function (e) {\n var that = this, idx, length, action = e ? e.action : '';\n if (action === 'remove') {\n for (idx = 0, length = e.items.length; idx < length; idx++) {\n if (!e.items[idx].isNew || !e.items[idx].isNew()) {\n that._destroyed.push(e.items[idx]);\n }\n }\n }\n if (that.options.autoSync && (action === 'add' || action === 'remove' || action === 'itemchange')) {\n var handler = function (args) {\n if (args.action === 'sync') {\n that.unbind('change', handler);\n that._updateTotalForAction(action, e.items);\n }\n };\n that.first('change', handler);\n that.sync();\n } else {\n that._updateTotalForAction(action, e ? e.items : []);\n that._process(that._data, e);\n }\n },\n _calculateAggregates: function (data, options) {\n options = options || {};\n var query = new Query(data), aggregates = options.aggregate, filter = options.filter;\n if (filter) {\n query = query.filter(filter);\n }\n return query.aggregate(aggregates);\n },\n _process: function (data, e) {\n var that = this, options = {}, result;\n if (that.options.serverPaging !== true) {\n options.skip = that._skip;\n options.take = that._take || that._pageSize;\n if (options.skip === undefined && that._page !== undefined && that._pageSize !== undefined) {\n options.skip = (that._page - 1) * that._pageSize;\n }\n if (that.options.useRanges) {\n options.skip = that.currentRangeStart();\n }\n }\n if (that.options.serverSorting !== true) {\n options.sort = that._sort;\n }\n if (that.options.serverFiltering !== true) {\n options.filter = that._filter;\n }\n if (that.options.serverGrouping !== true) {\n options.group = that._group;\n }\n if (that.options.serverAggregates !== true) {\n options.aggregate = that._aggregate;\n }\n if (that.options.serverGrouping) {\n that._clearEmptyGroups(data);\n }\n result = that._queryProcess(data, options);\n if (that.options.serverAggregates !== true) {\n that._aggregateResult = that._calculateAggregates(result.dataToAggregate || data, options);\n }\n that.view(result.data);\n that._setFilterTotal(result.total, false);\n e = e || {};\n e.items = e.items || that._view;\n that.trigger(CHANGE, e);\n },\n _clearEmptyGroups: function (data) {\n for (var idx = data.length - 1; idx >= 0; idx--) {\n var group = data[idx];\n if (group.hasSubgroups) {\n this._clearEmptyGroups(group.items);\n } else {\n if (group.items && !group.items.length) {\n splice.apply(group.parent(), [\n idx,\n 1\n ]);\n }\n }\n }\n },\n _queryProcess: function (data, options) {\n if (this.options.inPlaceSort) {\n return Query.process(data, options, this.options.inPlaceSort);\n } else {\n return Query.process(data, options);\n }\n },\n _mergeState: function (options) {\n var that = this;\n if (options !== undefined) {\n that._pageSize = options.pageSize;\n that._page = options.page;\n that._sort = options.sort;\n that._filter = options.filter;\n that._group = options.group;\n that._aggregate = options.aggregate;\n that._skip = that._currentRangeStart = options.skip;\n that._take = options.take;\n if (that._skip === undefined) {\n that._skip = that._currentRangeStart = that.skip();\n options.skip = that.skip();\n }\n if (that._take === undefined && that._pageSize !== undefined) {\n that._take = that._pageSize;\n options.take = that._take;\n }\n if (options.sort) {\n that._sort = options.sort = normalizeSort(options.sort);\n that._sortFields = sortFields(options.sort);\n }\n if (options.filter) {\n that._filter = options.filter = that.options.accentFoldingFiltering && !$.isEmptyObject(options.filter) ? $.extend({}, normalizeFilter(options.filter), { accentFoldingFiltering: that.options.accentFoldingFiltering }) : normalizeFilter(options.filter);\n }\n if (options.group) {\n that._group = options.group = normalizeGroup(options.group);\n }\n if (options.aggregate) {\n that._aggregate = options.aggregate = normalizeAggregate(options.aggregate);\n }\n }\n return options;\n },\n query: function (options) {\n var result;\n var remote = this.options.serverSorting || this.options.serverPaging || this.options.serverFiltering || this.options.serverGrouping || this.options.serverAggregates;\n if (remote || (this._data === undefined || this._data.length === 0) && !this._destroyed.length) {\n if (this.options.endless) {\n var moreItemsCount = options.pageSize - this.pageSize();\n if (moreItemsCount > 0) {\n moreItemsCount = this.pageSize();\n options.page = options.pageSize / moreItemsCount;\n options.pageSize = moreItemsCount;\n } else {\n options.page = 1;\n this.options.endless = false;\n }\n }\n return this.read(this._mergeState(options));\n }\n var isPrevented = this.trigger(REQUESTSTART, { type: 'read' });\n if (!isPrevented) {\n this.trigger(PROGRESS);\n result = this._queryProcess(this._data, this._mergeState(options));\n this._setFilterTotal(result.total, true);\n this._aggregateResult = this._calculateAggregates(result.dataToAggregate || this._data, options);\n this.view(result.data);\n this.trigger(REQUESTEND, { type: 'read' });\n this.trigger(CHANGE, { items: result.data });\n }\n return $.Deferred().resolve(isPrevented).promise();\n },\n _setFilterTotal: function (filterTotal, setDefaultValue) {\n var that = this;\n if (!that.options.serverFiltering) {\n if (filterTotal !== undefined) {\n that._total = filterTotal;\n } else if (setDefaultValue) {\n that._total = that._data.length;\n }\n }\n },\n fetch: function (callback) {\n var that = this;\n var fn = function (isPrevented) {\n if (isPrevented !== true && isFunction(callback)) {\n callback.call(that);\n }\n };\n return this._query().done(fn);\n },\n _query: function (options) {\n var that = this;\n return that.query(extend({}, {\n page: that.page(),\n pageSize: that.pageSize(),\n sort: that.sort(),\n filter: that.filter(),\n group: that.group(),\n aggregate: that.aggregate()\n }, options));\n },\n next: function (options) {\n var that = this, page = that.page(), total = that.total();\n options = options || {};\n if (!page || total && page + 1 > that.totalPages()) {\n return;\n }\n that._skip = that._currentRangeStart = page * that.take();\n page += 1;\n options.page = page;\n that._query(options);\n return page;\n },\n prev: function (options) {\n var that = this, page = that.page();\n options = options || {};\n if (!page || page === 1) {\n return;\n }\n that._skip = that._currentRangeStart = that._skip - that.take();\n page -= 1;\n options.page = page;\n that._query(options);\n return page;\n },\n page: function (val) {\n var that = this, skip;\n if (val !== undefined) {\n val = math.max(math.min(math.max(val, 1), that.totalPages()), 1);\n that._query(that._pageableQueryOptions({ page: val }));\n return;\n }\n skip = that.skip();\n return skip !== undefined ? math.round((skip || 0) / (that.take() || 1)) + 1 : undefined;\n },\n pageSize: function (val) {\n var that = this;\n if (val !== undefined) {\n that._query(that._pageableQueryOptions({\n pageSize: val,\n page: 1\n }));\n return;\n }\n return that.take();\n },\n sort: function (val) {\n var that = this;\n if (val !== undefined) {\n that.trigger('sort');\n that._query({ sort: val });\n return;\n }\n return that._sort;\n },\n filter: function (val) {\n var that = this;\n if (val === undefined) {\n return that._filter;\n }\n that.trigger('reset');\n that._query({\n filter: val,\n page: 1\n });\n },\n group: function (val) {\n var that = this;\n if (val !== undefined) {\n that._query({ group: val });\n return;\n }\n return that._group;\n },\n total: function () {\n return parseInt(this._total || 0, 10);\n },\n aggregate: function (val) {\n var that = this;\n if (val !== undefined) {\n that._query({ aggregate: val });\n return;\n }\n return that._aggregate;\n },\n aggregates: function () {\n var result = this._aggregateResult;\n if (isEmptyObject(result)) {\n result = this._emptyAggregates(this.aggregate());\n }\n return result;\n },\n _emptyAggregates: function (aggregates) {\n var result = {};\n if (!isEmptyObject(aggregates)) {\n var aggregate = {};\n if (!isArray(aggregates)) {\n aggregates = [aggregates];\n }\n for (var idx = 0; idx < aggregates.length; idx++) {\n aggregate[aggregates[idx].aggregate] = 0;\n result[aggregates[idx].field] = aggregate;\n }\n }\n return result;\n },\n _pageableQueryOptions: function (options) {\n return options;\n },\n _wrapInEmptyGroup: function (model) {\n var groups = this.group(), parent, group, idx, length;\n for (idx = groups.length - 1, length = 0; idx >= length; idx--) {\n group = groups[idx];\n parent = {\n value: model.get ? model.get(group.field) : model[group.field],\n field: group.field,\n items: parent ? [parent] : [model],\n hasSubgroups: !!parent,\n aggregates: this._emptyAggregates(group.aggregates)\n };\n }\n return parent;\n },\n totalPages: function () {\n var that = this, pageSize = that.pageSize() || that.total();\n return math.ceil((that.total() || 0) / pageSize);\n },\n inRange: function (skip, take) {\n var that = this, end = math.min(skip + take, that.total());\n if (!that.options.serverPaging && that._data.length > 0) {\n return true;\n }\n return that._findRange(skip, end).length > 0;\n },\n lastRange: function () {\n var ranges = this._ranges;\n return ranges[ranges.length - 1] || {\n start: 0,\n end: 0,\n data: []\n };\n },\n firstItemUid: function () {\n var ranges = this._ranges;\n return ranges.length && ranges[0].data.length && ranges[0].data[0].uid;\n },\n enableRequestsInProgress: function () {\n this._skipRequestsInProgress = false;\n },\n _timeStamp: function () {\n return new Date().getTime();\n },\n range: function (skip, take, callback) {\n this._currentRequestTimeStamp = this._timeStamp();\n this._skipRequestsInProgress = true;\n skip = math.min(skip || 0, this.total());\n callback = isFunction(callback) ? callback : noop;\n var that = this, pageSkip = math.max(math.floor(skip / take), 0) * take, size = math.min(pageSkip + take, that.total()), data;\n data = that._findRange(skip, math.min(skip + take, that.total()));\n if (data.length || that.total() === 0) {\n that._processRangeData(data, skip, take, pageSkip, size);\n callback();\n return;\n }\n if (take !== undefined) {\n if (!that._rangeExists(pageSkip, size)) {\n that.prefetch(pageSkip, take, function () {\n if (skip > pageSkip && size < that.total() && !that._rangeExists(size, math.min(size + take, that.total()))) {\n that.prefetch(size, take, function () {\n that.range(skip, take, callback);\n });\n } else {\n that.range(skip, take, callback);\n }\n });\n } else if (pageSkip < skip) {\n that.prefetch(size, take, function () {\n that.range(skip, take, callback);\n });\n }\n }\n },\n _findRange: function (start, end) {\n var that = this, ranges = that._ranges, range, data = [], skipIdx, takeIdx, startIndex, endIndex, rangeData, rangeEnd, processed, options = that.options, remote = options.serverSorting || options.serverPaging || options.serverFiltering || options.serverGrouping || options.serverAggregates, flatData, count, length;\n for (skipIdx = 0, length = ranges.length; skipIdx < length; skipIdx++) {\n range = ranges[skipIdx];\n if (start >= range.start && start <= range.end) {\n count = 0;\n for (takeIdx = skipIdx; takeIdx < length; takeIdx++) {\n range = ranges[takeIdx];\n flatData = that._flatData(range.data, true);\n if (flatData.length && start + count >= range.start) {\n rangeData = range.data;\n rangeEnd = range.end;\n if (!remote) {\n if (options.inPlaceSort) {\n processed = that._queryProcess(range.data, { filter: that.filter() });\n } else {\n var sort = normalizeGroupWithoutCompare(that.group() || []).concat(normalizeSort(that.sort() || []));\n processed = that._queryProcess(range.data, {\n sort: sort,\n filter: that.filter()\n });\n }\n flatData = rangeData = processed.data;\n if (processed.total !== undefined) {\n rangeEnd = processed.total;\n }\n }\n startIndex = 0;\n if (start + count > range.start) {\n startIndex = start + count - range.start;\n }\n endIndex = flatData.length;\n if (rangeEnd > end) {\n endIndex = endIndex - (rangeEnd - end);\n }\n count += endIndex - startIndex;\n data = that._mergeGroups(data, rangeData, startIndex, endIndex);\n if (end <= range.end && count == end - start) {\n return data;\n }\n }\n }\n break;\n }\n }\n return [];\n },\n _mergeGroups: function (data, range, skip, take) {\n if (this._isServerGrouped()) {\n var temp = range.toJSON(), prevGroup;\n if (data.length) {\n prevGroup = data[data.length - 1];\n }\n mergeGroups(prevGroup, temp, skip, take);\n return data.concat(temp);\n }\n return data.concat(range.slice(skip, take));\n },\n _processRangeData: function (data, skip, take, pageSkip, size) {\n var that = this;\n that._pending = undefined;\n that._skip = skip > that.skip() ? math.min(size, (that.totalPages() - 1) * that.take()) : pageSkip;\n that._currentRangeStart = skip;\n that._take = take;\n var paging = that.options.serverPaging;\n var sorting = that.options.serverSorting;\n var filtering = that.options.serverFiltering;\n var aggregates = that.options.serverAggregates;\n try {\n that.options.serverPaging = true;\n if (!that._isServerGrouped() && !(that.group() && that.group().length)) {\n that.options.serverSorting = true;\n }\n that.options.serverFiltering = true;\n that.options.serverPaging = true;\n that.options.serverAggregates = true;\n if (paging) {\n that._detachObservableParents();\n that._data = data = that._observe(data);\n }\n that._process(data);\n } finally {\n that.options.serverPaging = paging;\n that.options.serverSorting = sorting;\n that.options.serverFiltering = filtering;\n that.options.serverAggregates = aggregates;\n }\n },\n skip: function () {\n var that = this;\n if (that._skip === undefined) {\n return that._page !== undefined ? (that._page - 1) * (that.take() || 1) : undefined;\n }\n return that._skip;\n },\n currentRangeStart: function () {\n return this._currentRangeStart || 0;\n },\n take: function () {\n return this._take || this._pageSize;\n },\n _prefetchSuccessHandler: function (skip, size, callback, force) {\n var that = this;\n var timestamp = that._timeStamp();\n return function (data) {\n var found = false, range = {\n start: skip,\n end: size,\n data: [],\n timestamp: that._timeStamp()\n }, idx, length, temp;\n that._dequeueRequest();\n that.trigger(REQUESTEND, {\n response: data,\n type: 'read'\n });\n data = that.reader.parse(data);\n temp = that._readData(data);\n if (temp.length) {\n for (idx = 0, length = that._ranges.length; idx < length; idx++) {\n if (that._ranges[idx].start === skip) {\n found = true;\n range = that._ranges[idx];\n range.pristineData = temp;\n range.data = that._observe(temp);\n range.end = range.start + that._flatData(range.data, true).length;\n that._sortRanges();\n break;\n }\n }\n if (!found) {\n that._addRange(that._observe(temp), skip);\n }\n }\n that._total = that.reader.total(data);\n if (force || (timestamp >= that._currentRequestTimeStamp || !that._skipRequestsInProgress)) {\n if (callback && temp.length) {\n callback();\n } else {\n that.trigger(CHANGE, {});\n }\n }\n };\n },\n prefetch: function (skip, take, callback) {\n var that = this, size = math.min(skip + take, that.total()), options = {\n take: take,\n skip: skip,\n page: skip / take + 1,\n pageSize: take,\n sort: that._sort,\n filter: that._filter,\n group: that._group,\n aggregate: that._aggregate\n };\n if (!that._rangeExists(skip, size)) {\n clearTimeout(that._timeout);\n that._timeout = setTimeout(function () {\n that._queueRequest(options, function () {\n if (!that.trigger(REQUESTSTART, { type: 'read' })) {\n that.transport.read({\n data: that._params(options),\n success: that._prefetchSuccessHandler(skip, size, callback),\n error: function () {\n var args = slice.call(arguments);\n that.error.apply(that, args);\n }\n });\n } else {\n that._dequeueRequest();\n }\n });\n }, 100);\n } else if (callback) {\n callback();\n }\n },\n _multiplePrefetch: function (skip, take, callback) {\n var that = this, size = math.min(skip + take, that.total()), options = {\n take: take,\n skip: skip,\n page: skip / take + 1,\n pageSize: take,\n sort: that._sort,\n filter: that._filter,\n group: that._group,\n aggregate: that._aggregate\n };\n if (!that._rangeExists(skip, size)) {\n if (!that.trigger(REQUESTSTART, { type: 'read' })) {\n that.transport.read({\n data: that._params(options),\n success: that._prefetchSuccessHandler(skip, size, callback, true)\n });\n }\n } else if (callback) {\n callback();\n }\n },\n _rangeExists: function (start, end) {\n var that = this, ranges = that._ranges, idx, length;\n for (idx = 0, length = ranges.length; idx < length; idx++) {\n if (ranges[idx].start <= start && ranges[idx].end >= end) {\n return true;\n }\n }\n return false;\n },\n _getCurrentRangeSpan: function () {\n var that = this;\n var ranges = that._ranges;\n var start = that.currentRangeStart();\n var end = start + (that.take() || 0);\n var rangeSpan = [];\n var range;\n var idx;\n var length = ranges.length;\n for (idx = 0; idx < length; idx++) {\n range = ranges[idx];\n if (range.start <= start && range.end >= start || range.start >= start && range.start <= end) {\n rangeSpan.push(range);\n }\n }\n return rangeSpan;\n },\n _removeModelFromRanges: function (model) {\n var that = this;\n var range;\n for (var idx = 0, length = this._ranges.length; idx < length; idx++) {\n range = this._ranges[idx];\n that._removeModelFromRange(range, model);\n }\n that._updateRangesLength();\n },\n _removeModelFromRange: function (range, model) {\n this._eachItem(range.data, function (data) {\n for (var idx = 0; idx < data.length; idx++) {\n var dataItem = data[idx];\n if (dataItem.uid && dataItem.uid == model.uid) {\n [].splice.call(data, idx, 1);\n break;\n }\n }\n });\n },\n _insertModelInRange: function (index, model) {\n var that = this;\n var ranges = that._ranges || [];\n var rangesLength = ranges.length;\n var range;\n var i;\n for (i = 0; i < rangesLength; i++) {\n range = ranges[i];\n if (range.start <= index && range.end >= index) {\n if (!that._getByUid(model.uid, range.data)) {\n if (that._isServerGrouped()) {\n range.data.splice(index, 0, that._wrapInEmptyGroup(model));\n } else {\n range.data.splice(index, 0, model);\n }\n }\n break;\n }\n }\n that._updateRangesLength();\n },\n _updateRangesLength: function () {\n var that = this;\n var ranges = that._ranges || [];\n var rangesLength = ranges.length;\n var mismatchFound = false;\n var mismatchLength = 0;\n var lengthDifference = 0;\n var range;\n var i;\n for (i = 0; i < rangesLength; i++) {\n range = ranges[i];\n lengthDifference = that._flatData(range.data, true).length - math.abs(range.end - range.start);\n if (!mismatchFound && lengthDifference !== 0) {\n mismatchFound = true;\n mismatchLength = lengthDifference;\n range.end += mismatchLength;\n continue;\n }\n if (mismatchFound) {\n range.start += mismatchLength;\n range.end += mismatchLength;\n }\n }\n }\n });\n var Transport = {};\n Transport.create = function (options, data, dataSource) {\n var transport, transportOptions = options.transport ? $.extend({}, options.transport) : null;\n if (transportOptions) {\n transportOptions.read = typeof transportOptions.read === STRING ? { url: transportOptions.read } : transportOptions.read;\n if (options.type === 'jsdo') {\n transportOptions.dataSource = dataSource;\n }\n if (options.type) {\n kendo.data.transports = kendo.data.transports || {};\n kendo.data.schemas = kendo.data.schemas || {};\n if (!kendo.data.transports[options.type]) {\n kendo.logToConsole('Unknown DataSource transport type \\'' + options.type + '\\'.\\nVerify that registration scripts for this type are included after Kendo UI on the page.', 'warn');\n } else if (!isPlainObject(kendo.data.transports[options.type])) {\n transport = new kendo.data.transports[options.type](extend(transportOptions, { data: data }));\n } else {\n transportOptions = extend(true, {}, kendo.data.transports[options.type], transportOptions);\n }\n options.schema = extend(true, {}, kendo.data.schemas[options.type], options.schema);\n }\n if (!transport) {\n transport = isFunction(transportOptions.read) ? transportOptions : new RemoteTransport(transportOptions);\n }\n } else {\n transport = new LocalTransport({ data: options.data || [] });\n }\n return transport;\n };\n DataSource.create = function (options) {\n if (isArray(options) || options instanceof ObservableArray) {\n options = { data: options };\n }\n var dataSource = options || {}, data = dataSource.data, fields = dataSource.fields, table = dataSource.table, select = dataSource.select, idx, length, model = {}, field;\n if (!data && fields && !dataSource.transport) {\n if (table) {\n data = inferTable(table, fields);\n } else if (select) {\n data = inferSelect(select, fields);\n if (dataSource.group === undefined && data[0] && data[0].optgroup !== undefined) {\n dataSource.group = 'optgroup';\n }\n }\n }\n if (kendo.data.Model && fields && (!dataSource.schema || !dataSource.schema.model)) {\n for (idx = 0, length = fields.length; idx < length; idx++) {\n field = fields[idx];\n if (field.type) {\n model[field.field] = field;\n }\n }\n if (!isEmptyObject(model)) {\n dataSource.schema = extend(true, dataSource.schema, { model: { fields: model } });\n }\n }\n dataSource.data = data;\n select = null;\n dataSource.select = null;\n table = null;\n dataSource.table = null;\n return dataSource instanceof DataSource ? dataSource : new DataSource(dataSource);\n };\n function inferSelect(select, fields) {\n select = $(select)[0];\n var options = select.options;\n var firstField = fields[0];\n var secondField = fields[1];\n var data = [];\n var idx, length;\n var optgroup;\n var option;\n var record;\n var value;\n for (idx = 0, length = options.length; idx < length; idx++) {\n record = {};\n option = options[idx];\n optgroup = option.parentNode;\n if (optgroup === select) {\n optgroup = null;\n }\n if (option.disabled || optgroup && optgroup.disabled) {\n continue;\n }\n if (optgroup) {\n record.optgroup = optgroup.label;\n }\n record[firstField.field] = option.text;\n value = option.attributes.value;\n if (value && value.specified) {\n value = option.value;\n } else {\n value = option.text;\n }\n record[secondField.field] = value;\n data.push(record);\n }\n return data;\n }\n function inferTable(table, fields) {\n var tbody = $(table)[0].tBodies[0], rows = tbody ? tbody.rows : [], idx, length, fieldIndex, fieldCount = fields.length, data = [], cells, record, cell, empty;\n for (idx = 0, length = rows.length; idx < length; idx++) {\n record = {};\n empty = true;\n cells = rows[idx].cells;\n for (fieldIndex = 0; fieldIndex < fieldCount; fieldIndex++) {\n cell = cells[fieldIndex];\n if (cell.nodeName.toLowerCase() !== 'th') {\n empty = false;\n record[fields[fieldIndex].field] = cell.innerHTML;\n }\n }\n if (!empty) {\n data.push(record);\n }\n }\n return data;\n }\n var Node = Model.define({\n idField: 'id',\n init: function (value) {\n var that = this, hasChildren = that.hasChildren || value && value.hasChildren, childrenField = 'items', childrenOptions = {};\n kendo.data.Model.fn.init.call(that, value);\n if (typeof that.children === STRING) {\n childrenField = that.children;\n }\n childrenOptions = {\n schema: {\n data: childrenField,\n model: {\n hasChildren: hasChildren,\n id: that.idField,\n fields: that.fields\n }\n }\n };\n if (typeof that.children !== STRING) {\n extend(childrenOptions, that.children);\n }\n childrenOptions.data = value;\n if (!hasChildren) {\n hasChildren = childrenOptions.schema.data;\n }\n if (typeof hasChildren === STRING) {\n hasChildren = kendo.getter(hasChildren);\n }\n if (isFunction(hasChildren)) {\n var hasChildrenObject = hasChildren.call(that, that);\n if (hasChildrenObject && hasChildrenObject.length === 0) {\n that.hasChildren = false;\n } else {\n that.hasChildren = !!hasChildrenObject;\n }\n }\n that._childrenOptions = childrenOptions;\n if (that.hasChildren) {\n that._initChildren();\n }\n that._loaded = !!(value && value._loaded);\n },\n _initChildren: function () {\n var that = this;\n var children, transport, parameterMap;\n if (!(that.children instanceof HierarchicalDataSource)) {\n children = that.children = new HierarchicalDataSource(that._childrenOptions);\n transport = children.transport;\n parameterMap = transport.parameterMap;\n transport.parameterMap = function (data, type) {\n data[that.idField || 'id'] = that.id;\n if (parameterMap) {\n data = parameterMap(data, type);\n }\n return data;\n };\n children.parent = function () {\n return that;\n };\n children.bind(CHANGE, function (e) {\n e.node = e.node || that;\n that.trigger(CHANGE, e);\n });\n children.bind(ERROR, function (e) {\n var collection = that.parent();\n if (collection) {\n e.node = e.node || that;\n collection.trigger(ERROR, e);\n }\n });\n that._updateChildrenField();\n }\n },\n append: function (model) {\n this._initChildren();\n this.loaded(true);\n this.children.add(model);\n },\n hasChildren: false,\n level: function () {\n var parentNode = this.parentNode(), level = 0;\n while (parentNode && parentNode.parentNode) {\n level++;\n parentNode = parentNode.parentNode ? parentNode.parentNode() : null;\n }\n return level;\n },\n _updateChildrenField: function () {\n var fieldName = this._childrenOptions.schema.data;\n this[fieldName || 'items'] = this.children.data();\n },\n _childrenLoaded: function () {\n this._loaded = true;\n this._updateChildrenField();\n },\n load: function () {\n var options = {};\n var method = '_query';\n var children, promise;\n if (this.hasChildren) {\n this._initChildren();\n children = this.children;\n options[this.idField || 'id'] = this.id;\n if (!this._loaded) {\n children._data = undefined;\n method = 'read';\n }\n children.one(CHANGE, proxy(this._childrenLoaded, this));\n if (this._matchFilter) {\n options.filter = {\n field: '_matchFilter',\n operator: 'eq',\n value: true\n };\n }\n promise = children[method](options);\n } else {\n this.loaded(true);\n }\n return promise || $.Deferred().resolve().promise();\n },\n parentNode: function () {\n var array = this.parent();\n return array.parent();\n },\n loaded: function (value) {\n if (value !== undefined) {\n this._loaded = value;\n } else {\n return this._loaded;\n }\n },\n shouldSerialize: function (field) {\n return Model.fn.shouldSerialize.call(this, field) && field !== 'children' && field !== '_loaded' && field !== 'hasChildren' && field !== '_childrenOptions';\n }\n });\n function dataMethod(name) {\n return function () {\n var data = this._data, result = DataSource.fn[name].apply(this, slice.call(arguments));\n if (this._data != data) {\n this._attachBubbleHandlers();\n }\n return result;\n };\n }\n var HierarchicalDataSource = DataSource.extend({\n init: function (options) {\n var node = Node.define({ children: options });\n if (options.filter && !options.serverFiltering) {\n this._hierarchicalFilter = options.filter;\n options.filter = null;\n }\n DataSource.fn.init.call(this, extend(true, {}, {\n schema: {\n modelBase: node,\n model: node\n }\n }, options));\n this._attachBubbleHandlers();\n },\n _attachBubbleHandlers: function () {\n var that = this;\n that._data.bind(ERROR, function (e) {\n that.trigger(ERROR, e);\n });\n },\n read: function (data) {\n var result = DataSource.fn.read.call(this, data);\n if (this._hierarchicalFilter) {\n if (this._data && this._data.length > 0) {\n this.filter(this._hierarchicalFilter);\n } else {\n this.options.filter = this._hierarchicalFilter;\n this._filter = normalizeFilter(this.options.filter);\n this._hierarchicalFilter = null;\n }\n }\n return result;\n },\n remove: function (node) {\n var parentNode = node.parentNode(), dataSource = this, result;\n if (parentNode && parentNode._initChildren) {\n dataSource = parentNode.children;\n }\n result = DataSource.fn.remove.call(dataSource, node);\n if (parentNode && !dataSource.data().length) {\n parentNode.hasChildren = false;\n }\n return result;\n },\n success: dataMethod('success'),\n data: dataMethod('data'),\n insert: function (index, model) {\n var parentNode = this.parent();\n if (parentNode && parentNode._initChildren) {\n parentNode.hasChildren = true;\n parentNode._initChildren();\n }\n return DataSource.fn.insert.call(this, index, model);\n },\n filter: function (val) {\n if (val === undefined) {\n return this._filter;\n }\n if (!this.options.serverFiltering && this._markHierarchicalQuery(val)) {\n val = {\n logic: 'or',\n filters: [\n val,\n {\n field: '_matchFilter',\n operator: 'equals',\n value: true\n }\n ]\n };\n }\n this.trigger('reset');\n this._query({\n filter: val,\n page: 1\n });\n },\n _markHierarchicalQuery: function (expressions) {\n var compiled;\n var predicate;\n var fields;\n var operators;\n var filter;\n var accentFoldingFiltering = this.options.accentFoldingFiltering;\n expressions = accentFoldingFiltering ? $.extend({}, normalizeFilter(expressions), { accentFoldingFiltering: accentFoldingFiltering }) : normalizeFilter(expressions);\n if (!expressions || expressions.filters.length === 0) {\n this._updateHierarchicalFilter(function () {\n return true;\n });\n return false;\n }\n compiled = Query.filterExpr(expressions);\n fields = compiled.fields;\n operators = compiled.operators;\n predicate = filter = new Function('d, __f, __o', 'return ' + compiled.expression);\n if (fields.length || operators.length) {\n filter = function (d) {\n return predicate(d, fields, operators);\n };\n }\n this._updateHierarchicalFilter(filter);\n return true;\n },\n _updateHierarchicalFilter: function (filter) {\n var current;\n var data = this._data;\n var result = false;\n for (var idx = 0; idx < data.length; idx++) {\n current = data[idx];\n if (current.hasChildren) {\n current._matchFilter = current.children._updateHierarchicalFilter(filter);\n if (!current._matchFilter) {\n current._matchFilter = filter(current);\n }\n } else {\n current._matchFilter = filter(current);\n }\n if (current._matchFilter) {\n result = true;\n }\n }\n return result;\n },\n _find: function (method, value) {\n var idx, length, node, children;\n var data = this._data;\n if (!data) {\n return;\n }\n node = DataSource.fn[method].call(this, value);\n if (node) {\n return node;\n }\n data = this._flatData(this._data);\n for (idx = 0, length = data.length; idx < length; idx++) {\n children = data[idx].children;\n if (!(children instanceof HierarchicalDataSource)) {\n continue;\n }\n node = children[method](value);\n if (node) {\n return node;\n }\n }\n },\n get: function (id) {\n return this._find('get', id);\n },\n getByUid: function (uid) {\n return this._find('getByUid', uid);\n }\n });\n function inferList(list, fields) {\n var items = $(list).children(), idx, length, data = [], record, textField = fields[0].field, urlField = fields[1] && fields[1].field, spriteCssClassField = fields[2] && fields[2].field, imageUrlField = fields[3] && fields[3].field, item, id, textChild, className, children;\n function elements(collection, tagName) {\n return collection.filter(tagName).add(collection.find(tagName));\n }\n for (idx = 0, length = items.length; idx < length; idx++) {\n record = { _loaded: true };\n item = items.eq(idx);\n textChild = item[0].firstChild;\n children = item.children();\n list = children.filter('ul');\n children = children.filter(':not(ul)');\n id = item.attr('data-id');\n if (id) {\n record.id = id;\n }\n if (textChild) {\n record[textField] = textChild.nodeType == 3 ? textChild.nodeValue : children.text();\n }\n if (urlField) {\n record[urlField] = elements(children, 'a').attr('href');\n }\n if (imageUrlField) {\n record[imageUrlField] = elements(children, 'img').attr('src');\n }\n if (spriteCssClassField) {\n className = elements(children, '.k-sprite').prop('className');\n record[spriteCssClassField] = className && $.trim(className.replace('k-sprite', ''));\n }\n if (list.length) {\n record.items = inferList(list.eq(0), fields);\n }\n if (item.attr('data-hasChildren') == 'true') {\n record.hasChildren = true;\n }\n data.push(record);\n }\n return data;\n }\n HierarchicalDataSource.create = function (options) {\n options = options && options.push ? { data: options } : options;\n var dataSource = options || {}, data = dataSource.data, fields = dataSource.fields, list = dataSource.list;\n if (data && data._dataSource) {\n return data._dataSource;\n }\n if (!data && fields && !dataSource.transport) {\n if (list) {\n data = inferList(list, fields);\n }\n }\n dataSource.data = data;\n return dataSource instanceof HierarchicalDataSource ? dataSource : new HierarchicalDataSource(dataSource);\n };\n var Buffer = kendo.Observable.extend({\n init: function (dataSource, viewSize, disablePrefetch) {\n kendo.Observable.fn.init.call(this);\n this._prefetching = false;\n this.dataSource = dataSource;\n this.prefetch = !disablePrefetch;\n var buffer = this;\n dataSource.bind('change', function () {\n buffer._change();\n });\n dataSource.bind('reset', function () {\n buffer._reset();\n });\n this._syncWithDataSource();\n this.setViewSize(viewSize);\n },\n setViewSize: function (viewSize) {\n this.viewSize = viewSize;\n this._recalculate();\n },\n at: function (index) {\n var pageSize = this.pageSize, itemPresent = true;\n if (index >= this.total()) {\n this.trigger('endreached', { index: index });\n return null;\n }\n if (!this.useRanges) {\n return this.dataSource.view()[index];\n }\n if (this.useRanges) {\n if (index < this.dataOffset || index >= this.skip + pageSize) {\n itemPresent = this.range(Math.floor(index / pageSize) * pageSize);\n }\n if (index === this.prefetchThreshold) {\n this._prefetch();\n }\n if (index === this.midPageThreshold) {\n this.range(this.nextMidRange, true);\n } else if (index === this.nextPageThreshold) {\n this.range(this.nextFullRange);\n } else if (index === this.pullBackThreshold) {\n if (this.offset === this.skip) {\n this.range(this.previousMidRange);\n } else {\n this.range(this.previousFullRange);\n }\n }\n if (itemPresent) {\n return this.dataSource.at(index - this.dataOffset);\n } else {\n this.trigger('endreached', { index: index });\n return null;\n }\n }\n },\n indexOf: function (item) {\n return this.dataSource.data().indexOf(item) + this.dataOffset;\n },\n total: function () {\n return parseInt(this.dataSource.total(), 10);\n },\n next: function () {\n var buffer = this, pageSize = buffer.pageSize, offset = buffer.skip - buffer.viewSize + pageSize, pageSkip = math.max(math.floor(offset / pageSize), 0) * pageSize;\n this.offset = offset;\n this.dataSource.prefetch(pageSkip, pageSize, function () {\n buffer._goToRange(offset, true);\n });\n },\n range: function (offset, nextRange) {\n if (this.offset === offset) {\n return true;\n }\n var buffer = this, pageSize = this.pageSize, pageSkip = math.max(math.floor(offset / pageSize), 0) * pageSize, dataSource = this.dataSource;\n if (nextRange) {\n pageSkip += pageSize;\n }\n if (dataSource.inRange(offset, pageSize)) {\n this.offset = offset;\n this._recalculate();\n this._goToRange(offset);\n return true;\n } else if (this.prefetch) {\n dataSource.prefetch(pageSkip, pageSize, function () {\n buffer.offset = offset;\n buffer._recalculate();\n buffer._goToRange(offset, true);\n });\n return false;\n }\n return true;\n },\n syncDataSource: function () {\n var offset = this.offset;\n this.offset = null;\n this.range(offset);\n },\n destroy: function () {\n this.unbind();\n },\n _prefetch: function () {\n var buffer = this, pageSize = this.pageSize, prefetchOffset = this.skip + pageSize, dataSource = this.dataSource;\n if (!dataSource.inRange(prefetchOffset, pageSize) && !this._prefetching && this.prefetch) {\n this._prefetching = true;\n this.trigger('prefetching', {\n skip: prefetchOffset,\n take: pageSize\n });\n dataSource.prefetch(prefetchOffset, pageSize, function () {\n buffer._prefetching = false;\n buffer.trigger('prefetched', {\n skip: prefetchOffset,\n take: pageSize\n });\n });\n }\n },\n _goToRange: function (offset, expanding) {\n if (this.offset !== offset) {\n return;\n }\n this.dataOffset = offset;\n this._expanding = expanding;\n this.dataSource.range(offset, this.pageSize);\n this.dataSource.enableRequestsInProgress();\n },\n _reset: function () {\n this._syncPending = true;\n },\n _change: function () {\n var dataSource = this.dataSource;\n this.length = this.useRanges ? dataSource.lastRange().end : dataSource.view().length;\n if (this._syncPending) {\n this._syncWithDataSource();\n this._recalculate();\n this._syncPending = false;\n this.trigger('reset', { offset: this.offset });\n }\n this.trigger('resize');\n if (this._expanding) {\n this.trigger('expand');\n }\n delete this._expanding;\n },\n _syncWithDataSource: function () {\n var dataSource = this.dataSource;\n this._firstItemUid = dataSource.firstItemUid();\n this.dataOffset = this.offset = dataSource.skip() || 0;\n this.pageSize = dataSource.pageSize();\n this.useRanges = dataSource.options.serverPaging;\n },\n _recalculate: function () {\n var pageSize = this.pageSize, offset = this.offset, viewSize = this.viewSize, skip = Math.ceil(offset / pageSize) * pageSize;\n this.skip = skip;\n this.midPageThreshold = skip + pageSize - 1;\n this.nextPageThreshold = skip + viewSize - 1;\n this.prefetchThreshold = skip + Math.floor(pageSize / 3 * 2);\n this.pullBackThreshold = this.offset - 1;\n this.nextMidRange = skip + pageSize - viewSize;\n this.nextFullRange = skip;\n this.previousMidRange = offset - viewSize;\n this.previousFullRange = skip - pageSize;\n }\n });\n var BatchBuffer = kendo.Observable.extend({\n init: function (dataSource, batchSize) {\n var batchBuffer = this;\n kendo.Observable.fn.init.call(batchBuffer);\n this.dataSource = dataSource;\n this.batchSize = batchSize;\n this._total = 0;\n this.buffer = new Buffer(dataSource, batchSize * 3);\n this.buffer.bind({\n 'endreached': function (e) {\n batchBuffer.trigger('endreached', { index: e.index });\n },\n 'prefetching': function (e) {\n batchBuffer.trigger('prefetching', {\n skip: e.skip,\n take: e.take\n });\n },\n 'prefetched': function (e) {\n batchBuffer.trigger('prefetched', {\n skip: e.skip,\n take: e.take\n });\n },\n 'reset': function () {\n batchBuffer._total = 0;\n batchBuffer.trigger('reset');\n },\n 'resize': function () {\n batchBuffer._total = Math.ceil(this.length / batchBuffer.batchSize);\n batchBuffer.trigger('resize', {\n total: batchBuffer.total(),\n offset: this.offset\n });\n }\n });\n },\n syncDataSource: function () {\n this.buffer.syncDataSource();\n },\n at: function (index) {\n var buffer = this.buffer, skip = index * this.batchSize, take = this.batchSize, view = [], item;\n if (buffer.offset > skip) {\n buffer.at(buffer.offset - 1);\n }\n for (var i = 0; i < take; i++) {\n item = buffer.at(skip + i);\n if (item === null) {\n break;\n }\n view.push(item);\n }\n return view;\n },\n total: function () {\n return this._total;\n },\n destroy: function () {\n this.buffer.destroy();\n this.unbind();\n }\n });\n extend(true, kendo.data, {\n readers: { json: DataReader },\n Query: Query,\n DataSource: DataSource,\n HierarchicalDataSource: HierarchicalDataSource,\n Node: Node,\n ObservableObject: ObservableObject,\n ObservableArray: ObservableArray,\n LazyObservableArray: LazyObservableArray,\n LocalTransport: LocalTransport,\n RemoteTransport: RemoteTransport,\n Cache: Cache,\n DataReader: DataReader,\n Model: Model,\n Buffer: Buffer,\n BatchBuffer: BatchBuffer\n });\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('kendo.list', [\n 'kendo.data',\n 'kendo.popup'\n ], f);\n}(function () {\n var __meta__ = {\n id: 'list',\n name: 'List',\n category: 'framework',\n depends: [\n 'data',\n 'popup'\n ],\n hidden: true\n };\n (function ($, undefined) {\n var kendo = window.kendo, ui = kendo.ui, outerHeight = kendo._outerHeight, percentageUnitsRegex = /^\\d+(\\.\\d+)?%$/i, Widget = ui.Widget, keys = kendo.keys, support = kendo.support, htmlEncode = kendo.htmlEncode, activeElement = kendo._activeElement, outerWidth = kendo._outerWidth, ObservableArray = kendo.data.ObservableArray, ID = 'id', CHANGE = 'change', FOCUSED = 'k-state-focused', HOVER = 'k-state-hover', LOADING = 'k-i-loading', GROUPHEADER = '.k-group-header', ITEMSELECTOR = '.k-item', LABELIDPART = '_label', OPEN = 'open', CLOSE = 'close', CASCADE = 'cascade', SELECT = 'select', SELECTED = 'selected', REQUESTSTART = 'requestStart', REQUESTEND = 'requestEnd', BLUR = 'blur', FOCUS = 'focus', FOCUSOUT = 'focusout', extend = $.extend, proxy = $.proxy, isArray = $.isArray, browser = support.browser, HIDDENCLASS = 'k-hidden', WIDTH = 'width', isIE = browser.msie, isIE8 = isIE && browser.version < 9, quotRegExp = /\"/g, alternativeNames = {\n 'ComboBox': [\n 'DropDownList',\n 'MultiColumnComboBox'\n ],\n 'DropDownList': [\n 'ComboBox',\n 'MultiColumnComboBox'\n ],\n 'MultiColumnComboBox': [\n 'ComboBox',\n 'DropDownList'\n ]\n };\n var List = kendo.ui.DataBoundWidget.extend({\n init: function (element, options) {\n var that = this, ns = that.ns, id;\n Widget.fn.init.call(that, element, options);\n element = that.element;\n options = that.options;\n that._isSelect = element.is(SELECT);\n if (that._isSelect && that.element[0].length) {\n if (!options.dataSource) {\n options.dataTextField = options.dataTextField || 'text';\n options.dataValueField = options.dataValueField || 'value';\n }\n }\n that.ul = $('
    ').attr({\n tabIndex: -1,\n 'aria-hidden': true\n });\n that.list = $('
    ').append(that.ul).on('mousedown' + ns, proxy(that._listMousedown, that));\n id = element.attr(ID);\n if (!id) {\n id = kendo.guid();\n }\n that.list.attr(ID, id + '-list');\n that.ul.attr(ID, id + '_listbox');\n if (options.columns && options.columns.length) {\n that.ul.removeClass('k-list').addClass('k-grid-list');\n that._columnsHeader();\n }\n that._header();\n that._noData();\n that._footer();\n that._accessors();\n that._initValue();\n },\n options: {\n valuePrimitive: false,\n footerTemplate: '',\n headerTemplate: '',\n noDataTemplate: true,\n messages: {\n 'noData': 'No data found.',\n 'clear': 'clear'\n }\n },\n setOptions: function (options) {\n Widget.fn.setOptions.call(this, options);\n if (options && options.enable !== undefined) {\n options.enabled = options.enable;\n }\n if (options.columns && options.columns.length) {\n this._columnsHeader();\n }\n this._header();\n this._noData();\n this._footer();\n this._renderFooter();\n this._renderNoData();\n },\n focus: function () {\n this._focused.focus();\n },\n readonly: function (readonly) {\n this._editable({\n readonly: readonly === undefined ? true : readonly,\n disable: false\n });\n },\n enable: function (enable) {\n this._editable({\n readonly: false,\n disable: !(enable = enable === undefined ? true : enable)\n });\n },\n _header: function () {\n var list = this;\n var header = $(list.header);\n var template = list.options.headerTemplate;\n this._angularElement(header, 'cleanup');\n kendo.destroy(header);\n header.remove();\n if (!template) {\n list.header = null;\n return;\n }\n var headerTemplate = typeof template !== 'function' ? kendo.template(template) : template;\n header = $(headerTemplate({}));\n list.header = header[0] ? header : null;\n list.list.prepend(header);\n this._angularElement(list.header, 'compile');\n },\n _columnsHeader: function () {\n var list = this;\n var columnsHeader = $(list.columnsHeader);\n this._angularElement(columnsHeader, 'cleanup');\n kendo.destroy(columnsHeader);\n columnsHeader.remove();\n var header = '
    ';\n var colGroup = '';\n var row = '';\n for (var idx = 0; idx < this.options.columns.length; idx++) {\n var currentColumn = this.options.columns[idx];\n var title = currentColumn.title || currentColumn.field || '';\n var template = currentColumn.headerTemplate || title;\n var columnsHeaderTemplate = typeof template !== 'function' ? kendo.template(template) : template;\n var currentWidth = currentColumn.width;\n var currentWidthInt = parseInt(currentWidth, 10);\n var widthStyle = '';\n if (currentWidth && !isNaN(currentWidthInt)) {\n widthStyle += 'style=\\'width:';\n widthStyle += currentWidthInt;\n widthStyle += percentageUnitsRegex.test(currentWidth) ? '%' : 'px';\n widthStyle += ';\\'';\n }\n colGroup += '';\n row += '';\n }\n colGroup += '';\n row += '';\n header += colGroup;\n header += row;\n header += '
    ';\n row += columnsHeaderTemplate(currentColumn);\n row += '
    ';\n list.columnsHeader = columnsHeader = $(header);\n list.list.prepend(columnsHeader);\n this._angularElement(list.columnsHeader, 'compile');\n },\n _noData: function () {\n var list = this;\n var noData = $(list.noData);\n var template = list.options.noDataTemplate === true ? list.options.messages.noData : list.options.noDataTemplate;\n list.angular('cleanup', function () {\n return { elements: noData };\n });\n kendo.destroy(noData);\n noData.remove();\n if (!template) {\n list.noData = null;\n return;\n }\n list.noData = $('
    ').appendTo(list.list);\n list.noDataTemplate = typeof template !== 'function' ? kendo.template(template) : template;\n },\n _footer: function () {\n var list = this;\n var footer = $(list.footer);\n var template = list.options.footerTemplate;\n this._angularElement(footer, 'cleanup');\n kendo.destroy(footer);\n footer.remove();\n if (!template) {\n list.footer = null;\n return;\n }\n list.footer = $('
    ').appendTo(list.list);\n list.footerTemplate = typeof template !== 'function' ? kendo.template(template) : template;\n },\n _listOptions: function (options) {\n var that = this;\n var currentOptions = that.options;\n var virtual = currentOptions.virtual;\n var changeEventOption = { change: proxy(that._listChange, that) };\n var listBoundHandler = proxy(that._listBound, that);\n virtual = typeof virtual === 'object' ? virtual : {};\n options = $.extend({\n autoBind: false,\n selectable: true,\n dataSource: that.dataSource,\n click: proxy(that._click, that),\n activate: proxy(that._activateItem, that),\n columns: currentOptions.columns,\n deactivate: proxy(that._deactivateItem, that),\n dataBinding: function () {\n that.trigger('dataBinding');\n },\n dataBound: listBoundHandler,\n height: currentOptions.height,\n dataValueField: currentOptions.dataValueField,\n dataTextField: currentOptions.dataTextField,\n groupTemplate: currentOptions.groupTemplate,\n fixedGroupTemplate: currentOptions.fixedGroupTemplate,\n template: currentOptions.template\n }, options, virtual, changeEventOption);\n if (!options.template) {\n options.template = '#:' + kendo.expr(options.dataTextField, 'data') + '#';\n }\n if (currentOptions.$angular) {\n options.$angular = currentOptions.$angular;\n }\n return options;\n },\n _initList: function () {\n var that = this;\n var listOptions = that._listOptions({ selectedItemChange: proxy(that._listChange, that) });\n if (!that.options.virtual) {\n that.listView = new kendo.ui.StaticList(that.ul, listOptions);\n } else {\n that.listView = new kendo.ui.VirtualList(that.ul, listOptions);\n }\n that.listView.bind('listBound', proxy(that._listBound, that));\n that._setListValue();\n },\n _setListValue: function (value) {\n value = value || this.options.value;\n if (value !== undefined) {\n this.listView.value(value).done(proxy(this._updateSelectionState, this));\n }\n },\n _updateSelectionState: $.noop,\n _listMousedown: function (e) {\n if (!this.filterInput || this.filterInput[0] !== e.target) {\n e.preventDefault();\n }\n },\n _isFilterEnabled: function () {\n var filter = this.options.filter;\n return filter && filter !== 'none';\n },\n _hideClear: function () {\n var list = this;\n if (list._clear) {\n list._clear.addClass(HIDDENCLASS);\n }\n },\n _showClear: function () {\n if (this._clear) {\n this._clear.removeClass(HIDDENCLASS);\n }\n },\n _clearValue: function () {\n this._clearText();\n this._accessor('');\n this.listView.value([]);\n if (this._isSelect) {\n this._customOption = undefined;\n }\n if (this._isFilterEnabled() && !this.options.enforceMinLength) {\n this._filter({\n word: '',\n open: false\n });\n if (this.options.highlightFirst) {\n this.listView.focus(0);\n }\n }\n this._change();\n },\n _clearText: function () {\n this.text('');\n },\n _clearFilter: function () {\n if (!this.options.virtual) {\n this.listView.bound(false);\n }\n this._filterSource();\n },\n _filterSource: function (filter, force) {\n var that = this;\n var options = that.options;\n var isMultiColumnFiltering = options.filterFields && filter && filter.logic && filter.filters && filter.filters.length;\n var dataSource = that.dataSource;\n var expression = extend({}, dataSource.filter() || {});\n var resetPageSettings = filter || expression.filters && expression.filters.length && !filter;\n var removed = removeFiltersForField(expression, options.dataTextField);\n this._clearFilterExpressions(expression);\n if ((filter || removed) && that.trigger('filtering', { filter: filter })) {\n return;\n }\n var newExpression = {\n filters: [],\n logic: 'and'\n };\n if (isMultiColumnFiltering) {\n newExpression.filters.push(filter);\n } else {\n this._pushFilterExpression(newExpression, filter);\n }\n if (isValidFilterExpr(expression)) {\n if (newExpression.logic === expression.logic) {\n newExpression.filters = newExpression.filters.concat(expression.filters);\n } else {\n newExpression.filters.push(expression);\n }\n }\n if (that._cascading) {\n this.listView.setDSFilter(newExpression);\n }\n var dataSourceState = extend({}, {\n page: resetPageSettings ? 1 : dataSource.page(),\n pageSize: resetPageSettings ? dataSource.options.pageSize : dataSource.pageSize(),\n sort: dataSource.sort(),\n filter: dataSource.filter(),\n group: dataSource.group(),\n aggregate: dataSource.aggregate()\n }, { filter: newExpression });\n return dataSource[force ? 'read' : 'query'](dataSource._mergeState(dataSourceState));\n },\n _pushFilterExpression: function (newExpression, filter) {\n if (isValidFilterExpr(filter) && filter.value !== '') {\n newExpression.filters.push(filter);\n }\n },\n _clearFilterExpressions: function (expression) {\n if (!expression.filters) {\n return;\n }\n var filtersToRemove;\n for (var i = 0; i < expression.filters.length; i++) {\n if ('fromFilter' in expression.filters[i]) {\n filtersToRemove = i;\n }\n }\n if (!isNaN(filtersToRemove)) {\n expression.filters.splice(filtersToRemove, 1);\n }\n },\n _angularElement: function (element, action) {\n if (!element) {\n return;\n }\n this.angular(action, function () {\n return { elements: element };\n });\n },\n _renderNoData: function () {\n var list = this;\n var noData = list.noData;\n if (!noData) {\n return;\n }\n this._angularElement(noData, 'cleanup');\n noData.children(':first').html(list.noDataTemplate({ instance: list }));\n this._angularElement(noData, 'compile');\n },\n _toggleNoData: function (show) {\n $(this.noData).toggle(show);\n },\n _toggleHeader: function (show) {\n var groupHeader = this.listView.content.prev(GROUPHEADER);\n groupHeader.toggle(show);\n },\n _renderFooter: function () {\n var list = this;\n var footer = list.footer;\n if (!footer) {\n return;\n }\n this._angularElement(footer, 'cleanup');\n footer.html(list.footerTemplate({ instance: list }));\n this._angularElement(footer, 'compile');\n },\n _allowOpening: function () {\n return this.options.noDataTemplate || this.dataSource.flatView().length;\n },\n _initValue: function () {\n var that = this, value = that.options.value;\n if (value !== null) {\n that.element.val(value);\n } else {\n value = that._accessor();\n that.options.value = value;\n }\n that._old = value;\n },\n _ignoreCase: function () {\n var that = this, model = that.dataSource.reader.model, field;\n if (model && model.fields) {\n field = model.fields[that.options.dataTextField];\n if (field && field.type && field.type !== 'string') {\n that.options.ignoreCase = false;\n }\n }\n },\n _focus: function (candidate) {\n return this.listView.focus(candidate);\n },\n _filter: function (options) {\n var that = this;\n var widgetOptions = that.options;\n var word = options.word;\n var filterFields = widgetOptions.filterFields;\n var field = widgetOptions.dataTextField;\n var expression;\n if (filterFields && filterFields.length) {\n expression = {\n logic: 'or',\n filters: [],\n fromFilter: true\n };\n for (var i = 0; i < filterFields.length; i++) {\n this._pushFilterExpression(expression, that._buildExpression(word, filterFields[i]));\n }\n } else {\n expression = that._buildExpression(word, field);\n }\n that._open = options.open;\n that._filterSource(expression);\n },\n _buildExpression: function (value, field) {\n var that = this;\n var widgetOptions = that.options;\n var ignoreCase = widgetOptions.ignoreCase;\n var accentFoldingFiltering = that.dataSource.options.accentFoldingFiltering;\n return {\n value: ignoreCase ? accentFoldingFiltering ? value.toLocaleLowerCase(accentFoldingFiltering) : value.toLowerCase() : value,\n field: field,\n operator: widgetOptions.filter,\n ignoreCase: ignoreCase\n };\n },\n _clearButton: function () {\n var list = this;\n var clearTitle = list.options.messages.clear;\n if (!list._clear) {\n list._clear = $('').attr({\n 'role': 'button',\n 'tabIndex': -1\n });\n }\n if (!list.options.clearButton) {\n list._clear.remove();\n }\n this._hideClear();\n },\n search: function (word) {\n var options = this.options;\n word = typeof word === 'string' ? word : this._inputValue();\n clearTimeout(this._typingTimeout);\n if (!options.enforceMinLength && !word.length || word.length >= options.minLength) {\n this._state = 'filter';\n if (this.listView) {\n this.listView._emptySearch = !$.trim(word).length;\n }\n if (!this._isFilterEnabled()) {\n this._searchByWord(word);\n } else {\n this._filter({\n word: word,\n open: true\n });\n }\n }\n },\n current: function (candidate) {\n return this._focus(candidate);\n },\n items: function () {\n return this.ul[0].children;\n },\n destroy: function () {\n var that = this;\n var ns = that.ns;\n Widget.fn.destroy.call(that);\n that._unbindDataSource();\n that.listView.destroy();\n that.list.off(ns);\n that.popup.destroy();\n if (that._form) {\n that._form.off('reset', that._resetHandler);\n }\n },\n dataItem: function (index) {\n var that = this;\n if (index === undefined) {\n return that.listView.selectedDataItems()[0];\n }\n if (typeof index !== 'number') {\n if (that.options.virtual) {\n return that.dataSource.getByUid($(index).data('uid'));\n }\n index = $(that.items()).index(index);\n }\n return that.dataSource.flatView()[index];\n },\n _activateItem: function () {\n var current = this.listView.focus();\n if (current) {\n this._focused.add(this.filterInput).attr('aria-activedescendant', current.attr('id'));\n }\n },\n _deactivateItem: function () {\n this._focused.add(this.filterInput).removeAttr('aria-activedescendant');\n },\n _accessors: function () {\n var that = this;\n var element = that.element;\n var options = that.options;\n var getter = kendo.getter;\n var textField = element.attr(kendo.attr('text-field'));\n var valueField = element.attr(kendo.attr('value-field'));\n if (!options.dataTextField && textField) {\n options.dataTextField = textField;\n }\n if (!options.dataValueField && valueField) {\n options.dataValueField = valueField;\n }\n that._text = getter(options.dataTextField);\n that._value = getter(options.dataValueField);\n },\n _aria: function (id) {\n var that = this, options = that.options, element = that._focused.add(that.filterInput);\n if (options.suggest !== undefined) {\n element.attr('aria-autocomplete', options.suggest ? 'both' : 'list');\n }\n id = id ? id + ' ' + that.ul[0].id : that.ul[0].id;\n element.attr('aria-owns', id);\n that.ul.attr('aria-live', !that._isFilterEnabled() ? 'off' : 'polite');\n that._ariaLabel();\n },\n _ariaLabel: function () {\n var that = this;\n var focusedElm = that._focused;\n var inputElm = that.element;\n var inputId = inputElm.attr('id');\n var labelElm = $('label[for=\"' + inputId + '\"]');\n var ariaLabel = inputElm.attr('aria-label');\n var ariaLabelledBy = inputElm.attr('aria-labelledby');\n if (focusedElm === inputElm) {\n return;\n }\n if (ariaLabel) {\n focusedElm.attr('aria-label', ariaLabel);\n } else if (ariaLabelledBy) {\n focusedElm.attr('aria-labelledby', ariaLabelledBy);\n } else if (labelElm.length) {\n var labelId = labelElm.attr('id') || that._generateLabelId(labelElm, inputId || kendo.guid());\n focusedElm.attr('aria-labelledby', labelId);\n }\n },\n _generateLabelId: function (label, inputId) {\n var labelId = inputId + LABELIDPART;\n label.attr('id', labelId);\n return labelId;\n },\n _blur: function () {\n var that = this;\n that._change();\n that.close();\n that._userTriggered = false;\n },\n _change: function () {\n var that = this;\n var index = that.selectedIndex;\n var optionValue = that.options.value;\n var value = that.value();\n var trigger;\n if (that._isSelect && !that.listView.bound() && optionValue) {\n value = optionValue;\n }\n if (value !== unifyType(that._old, typeof value) && value !== unifyType(that._oldText, typeof value)) {\n trigger = true;\n } else if (that._valueBeforeCascade !== undefined && that._valueBeforeCascade !== unifyType(that._old, typeof that._valueBeforeCascade) && that._userTriggered) {\n trigger = true;\n } else if (index !== undefined && index !== that._oldIndex && !that.listView.isFiltered()) {\n trigger = true;\n }\n if (trigger) {\n if (that._old === null || that._old === '' || value === '') {\n that._valueBeforeCascade = that._old = value;\n } else {\n if (that.dataItem()) {\n that._valueBeforeCascade = that._old = that.options.dataValueField ? that.dataItem()[that.options.dataValueField] : that.dataItem();\n } else {\n that._valueBeforeCascade = that._old = null;\n }\n }\n that._oldIndex = index;\n that._oldText = that.text && that.text();\n if (!that._typing) {\n that.element.trigger(CHANGE);\n }\n that.trigger(CHANGE);\n }\n that.typing = false;\n },\n _data: function () {\n return this.dataSource.view();\n },\n _enable: function () {\n var that = this, options = that.options, disabled = that.element.is('[disabled]');\n if (options.enable !== undefined) {\n options.enabled = options.enable;\n }\n if (!options.enabled || disabled) {\n that.enable(false);\n } else {\n that.readonly(that.element.is('[readonly]'));\n }\n },\n _dataValue: function (dataItem) {\n var value = this._value(dataItem);\n if (value === undefined) {\n value = this._text(dataItem);\n }\n return value;\n },\n _offsetHeight: function () {\n var offsetHeight = 0;\n var siblings = this.listView.content.prevAll(':visible');\n siblings.each(function () {\n var element = $(this);\n offsetHeight += outerHeight(element, true);\n });\n return offsetHeight;\n },\n _height: function (length) {\n var that = this;\n var list = that.list;\n var height = that.options.height;\n var visible = that.popup.visible();\n var offsetTop;\n var popups;\n var footerHeight;\n if (length || that.options.noDataTemplate) {\n popups = list.add(list.parent('.k-animation-container')).show();\n if (!list.is(':visible')) {\n popups.hide();\n return;\n }\n height = that.listView.content[0].scrollHeight > height ? height : 'auto';\n popups.height(height);\n if (height !== 'auto') {\n offsetTop = that._offsetHeight();\n footerHeight = outerHeight($(that.footer)) || 0;\n height = height - offsetTop - footerHeight;\n }\n that.listView.content.height(height);\n if (!visible) {\n popups.hide();\n }\n }\n return height;\n },\n _openHandler: function (e) {\n this._adjustListWidth();\n if (this.trigger(OPEN)) {\n e.preventDefault();\n } else {\n this._focused.attr('aria-expanded', true);\n this.ul.attr('aria-hidden', false);\n }\n },\n _adjustListWidth: function () {\n var that = this, list = that.list, width = list[0].style.width, wrapper = that.wrapper, computedStyle, computedWidth;\n if (!list.data(WIDTH) && width) {\n return;\n }\n computedStyle = window.getComputedStyle ? window.getComputedStyle(wrapper[0], null) : 0;\n computedWidth = parseFloat(computedStyle && computedStyle.width) || outerWidth(wrapper);\n if (computedStyle && browser.msie) {\n computedWidth += parseFloat(computedStyle.paddingLeft) + parseFloat(computedStyle.paddingRight) + parseFloat(computedStyle.borderLeftWidth) + parseFloat(computedStyle.borderRightWidth);\n }\n if (list.css('box-sizing') !== 'border-box') {\n width = computedWidth - (outerWidth(list) - list.width());\n } else {\n width = computedWidth;\n }\n list.css({\n fontFamily: wrapper.css('font-family'),\n width: that.options.autoWidth ? 'auto' : width,\n minWidth: width,\n whiteSpace: that.options.autoWidth ? 'nowrap' : 'normal'\n }).data(WIDTH, width);\n return true;\n },\n _closeHandler: function (e) {\n if (this.trigger(CLOSE)) {\n e.preventDefault();\n } else {\n this._focused.attr('aria-expanded', false);\n this.ul.attr('aria-hidden', true);\n }\n },\n _focusItem: function () {\n var listView = this.listView;\n var noFocusedItem = !listView.focus();\n var index = last(listView.select());\n if (index === undefined && this.options.highlightFirst && noFocusedItem) {\n index = 0;\n }\n if (index !== undefined) {\n listView.focus(index);\n } else if (noFocusedItem) {\n listView.scrollToIndex(0);\n }\n },\n _calculateGroupPadding: function (height) {\n var li = this.ul.children('.k-first:first');\n var groupHeader = this.listView.content.prev(GROUPHEADER);\n var padding = 0;\n var direction = 'right';\n if (groupHeader[0] && groupHeader[0].style.display !== 'none') {\n if (height !== 'auto') {\n padding = kendo.support.scrollbar();\n }\n if (this.element.parents('.k-rtl').length) {\n direction = 'left';\n }\n padding += parseFloat(li.css('border-' + direction + '-width'), 10) + parseFloat(li.children('.k-group').css('padding-' + direction), 10);\n groupHeader.css('padding-' + direction, padding);\n }\n },\n _calculatePopupHeight: function (force) {\n var height = this._height(this.dataSource.flatView().length || force);\n this._calculateGroupPadding(height);\n this._calculateColumnsHeaderPadding(height);\n },\n _calculateColumnsHeaderPadding: function (height) {\n if (this.options.columns && this.options.columns.length) {\n var list = this;\n var isRtl = support.isRtl(list.wrapper);\n var scrollbar = kendo.support.scrollbar();\n list.columnsHeader.css(isRtl ? 'padding-left' : 'padding-right', height !== 'auto' ? scrollbar : 0);\n }\n },\n _refreshScroll: function () {\n var listView = this.listView;\n var enableYScroll = listView.element.height() > listView.content.height();\n if (this.options.autoWidth) {\n listView.content.css({\n overflowX: 'hidden',\n overflowY: enableYScroll ? 'scroll' : 'auto'\n });\n }\n },\n _resizePopup: function (force) {\n if (this.options.virtual) {\n return;\n }\n if (!this.popup.element.is(':visible')) {\n this.popup.one('open', function (force) {\n return proxy(function () {\n this._calculatePopupHeight(force);\n }, this);\n }.call(this, force));\n this.popup.one('activate', proxy(this._refreshScroll, this));\n } else {\n this._calculatePopupHeight(force);\n }\n },\n _popup: function () {\n var list = this;\n list.popup = new ui.Popup(list.list, extend({}, list.options.popup, {\n anchor: list.wrapper,\n open: proxy(list._openHandler, list),\n close: proxy(list._closeHandler, list),\n animation: list.options.animation,\n isRtl: support.isRtl(list.wrapper),\n autosize: list.options.autoWidth\n }));\n },\n _makeUnselectable: function () {\n if (isIE8) {\n this.list.find('*').not('.k-textbox').attr('unselectable', 'on');\n }\n },\n _toggleHover: function (e) {\n $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter');\n },\n _toggle: function (open, preventFocus) {\n var that = this;\n var touchEnabled = support.mobileOS && (support.touch || support.MSPointers || support.pointers);\n open = open !== undefined ? open : !that.popup.visible();\n if (!preventFocus && !touchEnabled && that._focused[0] !== activeElement()) {\n that._prevent = true;\n that._focused.focus();\n that._prevent = false;\n }\n that[open ? OPEN : CLOSE]();\n },\n _triggerCascade: function () {\n var that = this;\n if (!that._cascadeTriggered || that.value() !== unifyType(that._cascadedValue, typeof that.value())) {\n that._cascadedValue = that.value();\n that._cascadeTriggered = true;\n that.trigger(CASCADE, { userTriggered: that._userTriggered });\n }\n },\n _triggerChange: function () {\n if (this._valueBeforeCascade !== this.value()) {\n this.trigger(CHANGE);\n }\n },\n _unbindDataSource: function () {\n var that = this;\n that.dataSource.unbind(REQUESTSTART, that._requestStartHandler).unbind(REQUESTEND, that._requestEndHandler).unbind('error', that._errorHandler);\n },\n requireValueMapper: function (options, value) {\n var hasValue = (options.value instanceof Array ? options.value.length : options.value) || (value instanceof Array ? value.length : value);\n if (hasValue && options.virtual && typeof options.virtual.valueMapper !== 'function') {\n throw new Error('ValueMapper is not provided while the value is being set. See http://docs.telerik.com/kendo-ui/controls/editors/combobox/virtualization#the-valuemapper-function');\n }\n }\n });\n function unifyType(value, type) {\n if (value !== undefined && value !== '' && value !== null) {\n if (type === 'boolean') {\n if (typeof value !== 'boolean') {\n value = value.toLowerCase() === 'true';\n }\n value = Boolean(value);\n } else if (type === 'number') {\n value = Number(value);\n } else if (type === 'string') {\n value = value.toString();\n }\n }\n return value;\n }\n extend(List, {\n inArray: function (node, parentNode) {\n var idx, length, siblings = parentNode.children;\n if (!node || node.parentNode !== parentNode) {\n return -1;\n }\n for (idx = 0, length = siblings.length; idx < length; idx++) {\n if (node === siblings[idx]) {\n return idx;\n }\n }\n return -1;\n },\n unifyType: unifyType\n });\n kendo.ui.List = List;\n ui.Select = List.extend({\n init: function (element, options) {\n List.fn.init.call(this, element, options);\n this._initial = this.element.val();\n },\n setDataSource: function (dataSource) {\n var that = this;\n var parent;\n that.options.dataSource = dataSource;\n that._dataSource();\n if (that.listView.bound()) {\n that._initialIndex = null;\n that.listView._current = null;\n }\n that.listView.setDataSource(that.dataSource);\n if (that.options.autoBind) {\n that.dataSource.fetch();\n }\n parent = that._parentWidget();\n if (parent) {\n that._cascadeSelect(parent);\n }\n },\n close: function () {\n this.popup.close();\n },\n select: function (candidate) {\n var that = this;\n if (candidate === undefined) {\n return that.selectedIndex;\n } else {\n return that._select(candidate).done(function () {\n that._cascadeValue = that._old = that._accessor();\n that._oldIndex = that.selectedIndex;\n });\n }\n },\n _accessor: function (value, idx) {\n return this[this._isSelect ? '_accessorSelect' : '_accessorInput'](value, idx);\n },\n _accessorInput: function (value) {\n var element = this.element[0];\n if (value === undefined) {\n return element.value;\n } else {\n if (value === null) {\n value = '';\n }\n element.value = value;\n }\n },\n _accessorSelect: function (value, idx) {\n var element = this.element[0];\n var hasValue;\n if (value === undefined) {\n return getSelectedOption(element).value || '';\n }\n getSelectedOption(element).selected = false;\n if (idx === undefined) {\n idx = -1;\n }\n hasValue = value !== null && value !== '';\n if (hasValue && idx == -1) {\n this._custom(value);\n } else {\n if (value) {\n element.value = value;\n } else {\n element.selectedIndex = idx;\n }\n }\n },\n _syncValueAndText: function () {\n return true;\n },\n _custom: function (value) {\n var that = this;\n var element = that.element;\n var custom = that._customOption;\n if (!custom) {\n custom = $('
    ').parent();\n this.header = this.content.before('
    ').prev();\n this.bound(false);\n this._optionID = kendo.guid();\n this._selectedIndices = [];\n this._view = [];\n this._dataItems = [];\n this._values = [];\n var value = this.options.value;\n if (value) {\n this._values = $.isArray(value) ? value.slice(0) : [value];\n }\n this._getter();\n this._templates();\n this.setDataSource(this.options.dataSource);\n this._onScroll = proxy(function () {\n var that = this;\n clearTimeout(that._scrollId);\n that._scrollId = setTimeout(function () {\n that._renderHeader();\n }, 50);\n }, this);\n },\n options: {\n name: 'StaticList',\n dataValueField: null,\n valuePrimitive: false,\n selectable: true,\n template: null,\n groupTemplate: null,\n fixedGroupTemplate: null\n },\n events: [\n 'click',\n CHANGE,\n 'activate',\n 'deactivate',\n 'dataBinding',\n 'dataBound',\n 'selectedItemChange'\n ],\n setDataSource: function (source) {\n var that = this;\n var dataSource = source || {};\n var value;\n dataSource = $.isArray(dataSource) ? { data: dataSource } : dataSource;\n dataSource = kendo.data.DataSource.create(dataSource);\n if (that.dataSource) {\n that.dataSource.unbind(CHANGE, that._refreshHandler);\n value = that.value();\n that.value([]);\n that.bound(false);\n that.value(value);\n } else {\n that._refreshHandler = proxy(that.refresh, that);\n }\n that.setDSFilter(dataSource.filter());\n that.dataSource = dataSource.bind(CHANGE, that._refreshHandler);\n that._fixedHeader();\n },\n _touchHandlers: function () {\n var that = this;\n var startY;\n var endY;\n var tapPosition = function (event) {\n return (event.originalEvent || event).changedTouches[0].pageY;\n };\n that.element.on('touchstart' + STATIC_LIST_NS, function (e) {\n startY = tapPosition(e);\n });\n that.element.on('touchend' + STATIC_LIST_NS, function (e) {\n if (e.isDefaultPrevented()) {\n return;\n }\n endY = tapPosition(e);\n if (Math.abs(endY - startY) < 10) {\n that._touchTriggered = true;\n that._triggerClick($(e.target).closest(ITEMSELECTOR).get(0));\n }\n });\n },\n skip: function () {\n return this.dataSource.skip();\n },\n setOptions: function (options) {\n Widget.fn.setOptions.call(this, options);\n this._getter();\n this._templates();\n this._render();\n },\n destroy: function () {\n this.element.off(STATIC_LIST_NS);\n if (this._refreshHandler) {\n this.dataSource.unbind(CHANGE, this._refreshHandler);\n }\n clearTimeout(this._scrollId);\n Widget.fn.destroy.call(this);\n },\n dataItemByIndex: function (index) {\n return this.dataSource.flatView()[index];\n },\n screenHeight: function () {\n return this.content[0].clientHeight;\n },\n scrollToIndex: function (index) {\n var item = this.element[0].children[index];\n if (item) {\n this.scroll(item);\n }\n },\n scrollWith: function (value) {\n this.content.scrollTop(this.content.scrollTop() + value);\n },\n scroll: function (item) {\n if (!item) {\n return;\n }\n if (item[0]) {\n item = item[0];\n }\n var content = this.content[0], itemOffsetTop = item.offsetTop, itemOffsetHeight = item.offsetHeight, contentScrollTop = content.scrollTop, contentOffsetHeight = content.clientHeight, bottomDistance = itemOffsetTop + itemOffsetHeight;\n if (contentScrollTop > itemOffsetTop) {\n contentScrollTop = itemOffsetTop;\n } else if (bottomDistance > contentScrollTop + contentOffsetHeight) {\n contentScrollTop = bottomDistance - contentOffsetHeight;\n }\n content.scrollTop = contentScrollTop;\n },\n selectedDataItems: function (dataItems) {\n if (dataItems === undefined) {\n return this._dataItems.slice();\n }\n this._dataItems = dataItems;\n this._values = this._getValues(dataItems);\n },\n _getValues: function (dataItems) {\n var getter = this._valueGetter;\n return $.map(dataItems, function (dataItem) {\n return getter(dataItem);\n });\n },\n focusNext: function () {\n var current = this.focus();\n if (!current) {\n current = 0;\n } else {\n current = current.next();\n }\n this.focus(current);\n },\n focusPrev: function () {\n var current = this.focus();\n if (!current) {\n current = this.element[0].children.length - 1;\n } else {\n current = current.prev();\n }\n this.focus(current);\n },\n focusFirst: function () {\n this.focus(this.element[0].children[0]);\n },\n focusLast: function () {\n this.focus(last(this.element[0].children));\n },\n focus: function (candidate) {\n var that = this;\n var id = that._optionID;\n var hasCandidate;\n if (candidate === undefined) {\n return that._current;\n }\n candidate = last(that._get(candidate));\n candidate = $(this.element[0].children[candidate]);\n if (that._current) {\n that._current.removeClass(FOCUSED).removeAttr(ID);\n that.trigger('deactivate');\n }\n hasCandidate = !!candidate[0];\n if (hasCandidate) {\n candidate.addClass(FOCUSED);\n that.scroll(candidate);\n candidate.attr('id', id);\n }\n that._current = hasCandidate ? candidate : null;\n that.trigger('activate');\n },\n focusIndex: function () {\n return this.focus() ? this.focus().index() : undefined;\n },\n skipUpdate: function (skipUpdate) {\n this._skipUpdate = skipUpdate;\n },\n select: function (indices) {\n var that = this;\n var selectable = that.options.selectable;\n var singleSelection = selectable !== 'multiple' && selectable !== false;\n var selectedIndices = that._selectedIndices;\n var uiSelectedIndices = [this.element.find('.k-state-selected').index()];\n var added = [];\n var removed = [];\n var result;\n if (indices === undefined) {\n return selectedIndices.slice();\n }\n indices = that._get(indices);\n if (indices.length === 1 && indices[0] === -1) {\n indices = [];\n }\n var deferred = $.Deferred().resolve();\n var filtered = that.isFiltered();\n if (filtered && !singleSelection && that._deselectFiltered(indices)) {\n return deferred;\n }\n if (singleSelection && !filtered && $.inArray(last(indices), selectedIndices) !== -1 && $.inArray(last(indices), uiSelectedIndices) !== -1) {\n if (that._dataItems.length && that._view.length) {\n that._dataItems = [that._view[selectedIndices[0]].item];\n }\n return deferred;\n }\n result = that._deselect(indices);\n removed = result.removed;\n indices = result.indices;\n if (indices.length) {\n if (singleSelection) {\n indices = [last(indices)];\n }\n added = that._select(indices);\n }\n if (added.length || removed.length) {\n that._valueComparer = null;\n that.trigger(CHANGE, {\n added: added,\n removed: removed\n });\n }\n return deferred;\n },\n removeAt: function (position) {\n this._selectedIndices.splice(position, 1);\n this._values.splice(position, 1);\n this._valueComparer = null;\n return {\n position: position,\n dataItem: this._dataItems.splice(position, 1)[0]\n };\n },\n setValue: function (value) {\n value = $.isArray(value) || value instanceof ObservableArray ? value.slice(0) : [value];\n this._values = value;\n this._valueComparer = null;\n },\n value: function (value) {\n var that = this;\n var deferred = that._valueDeferred;\n var indices;\n if (value === undefined) {\n return that._values.slice();\n }\n that.setValue(value);\n if (!deferred || deferred.state() === 'resolved') {\n that._valueDeferred = deferred = $.Deferred();\n }\n if (that.bound()) {\n indices = that._valueIndices(that._values);\n if (that.options.selectable === 'multiple') {\n that.select(-1);\n }\n that.select(indices);\n deferred.resolve();\n }\n that._skipUpdate = false;\n return deferred;\n },\n items: function () {\n return this.element.children(ITEMSELECTOR);\n },\n _click: function (e) {\n if (this._touchTriggered) {\n this._touchTriggered = false;\n return;\n }\n if (!e.isDefaultPrevented()) {\n this._triggerClick(e.currentTarget);\n }\n },\n _triggerClick: function (item) {\n if (!this.trigger('click', { item: $(item) })) {\n this.select(item);\n }\n },\n _valueExpr: function (type, values) {\n var that = this;\n var idx = 0;\n var body;\n var comparer;\n var normalized = [];\n if (!that._valueComparer || that._valueType !== type) {\n that._valueType = type;\n for (; idx < values.length; idx++) {\n normalized.push(unifyType(values[idx], type));\n }\n body = 'for (var idx = 0; idx < ' + normalized.length + '; idx++) {' + ' if (current === values[idx]) {' + ' return idx;' + ' }' + '} ' + 'return -1;';\n comparer = new Function('current', 'values', body);\n that._valueComparer = function (current) {\n return comparer(current, normalized);\n };\n }\n return that._valueComparer;\n },\n _dataItemPosition: function (dataItem, values) {\n var value = this._valueGetter(dataItem);\n var valueExpr = this._valueExpr(typeof value, values);\n return valueExpr(value);\n },\n _getter: function () {\n this._valueGetter = kendo.getter(this.options.dataValueField);\n },\n _deselect: function (indices) {\n var that = this;\n var children = that.element[0].children;\n var selectable = that.options.selectable;\n var selectedIndices = that._selectedIndices;\n var dataItems = that._dataItems;\n var values = that._values;\n var removed = [];\n var i = 0;\n var j;\n var index, selectedIndex;\n var removedIndices = 0;\n indices = indices.slice();\n if (selectable === true || !indices.length) {\n for (; i < selectedIndices.length; i++) {\n $(children[selectedIndices[i]]).removeClass('k-state-selected').attr('aria-selected', false);\n removed.push({\n position: i,\n dataItem: dataItems[i]\n });\n }\n that._values = [];\n that._dataItems = [];\n that._selectedIndices = [];\n } else if (selectable === 'multiple') {\n for (; i < indices.length; i++) {\n index = indices[i];\n if (!$(children[index]).hasClass('k-state-selected')) {\n continue;\n }\n for (j = 0; j < selectedIndices.length; j++) {\n selectedIndex = selectedIndices[j];\n if (selectedIndex === index) {\n $(children[selectedIndex]).removeClass('k-state-selected').attr('aria-selected', false);\n removed.push({\n position: j + removedIndices,\n dataItem: dataItems.splice(j, 1)[0]\n });\n selectedIndices.splice(j, 1);\n indices.splice(i, 1);\n values.splice(j, 1);\n removedIndices += 1;\n i -= 1;\n j -= 1;\n break;\n }\n }\n }\n }\n return {\n indices: indices,\n removed: removed\n };\n },\n _deselectFiltered: function (indices) {\n var children = this.element[0].children;\n var dataItem, index, position;\n var removed = [];\n var idx = 0;\n for (; idx < indices.length; idx++) {\n index = indices[idx];\n dataItem = this._view[index].item;\n position = this._dataItemPosition(dataItem, this._values);\n if (position > -1) {\n removed.push(this.removeAt(position));\n $(children[index]).removeClass('k-state-selected');\n }\n }\n if (removed.length) {\n this.trigger(CHANGE, {\n added: [],\n removed: removed\n });\n return true;\n }\n return false;\n },\n _select: function (indices) {\n var that = this;\n var children = that.element[0].children;\n var data = that._view;\n var dataItem, index;\n var added = [];\n var idx = 0;\n if (last(indices) !== -1) {\n that.focus(indices);\n }\n for (; idx < indices.length; idx++) {\n index = indices[idx];\n dataItem = data[index];\n if (index === -1 || !dataItem) {\n continue;\n }\n dataItem = dataItem.item;\n that._selectedIndices.push(index);\n that._dataItems.push(dataItem);\n that._values.push(that._valueGetter(dataItem));\n $(children[index]).addClass('k-state-selected').attr('aria-selected', true);\n added.push({ dataItem: dataItem });\n }\n return added;\n },\n getElementIndex: function (element) {\n return $(element).data('offset-index');\n },\n _get: function (candidate) {\n if (typeof candidate === 'number') {\n candidate = [candidate];\n } else if (!isArray(candidate)) {\n candidate = this.getElementIndex(candidate);\n candidate = [candidate !== undefined ? candidate : -1];\n }\n return candidate;\n },\n _template: function () {\n var that = this;\n var options = that.options;\n var template = options.template;\n if (!template) {\n template = kendo.template('
  • ${' + kendo.expr(options.dataTextField, 'data') + '}
  • ', { useWithBlock: false });\n } else {\n template = kendo.template(template);\n template = function (data) {\n return '
  • ' + template(data) + '
  • ';\n };\n }\n return template;\n },\n _templates: function () {\n var template;\n var options = this.options;\n var templates = {\n template: options.template,\n groupTemplate: options.groupTemplate,\n fixedGroupTemplate: options.fixedGroupTemplate\n };\n if (options.columns) {\n for (var i = 0; i < options.columns.length; i++) {\n var currentColumn = options.columns[i];\n var templateText = currentColumn.field ? currentColumn.field.toString() : 'text';\n templates['column' + i] = currentColumn.template || '#: ' + templateText + '#';\n }\n }\n for (var key in templates) {\n template = templates[key];\n if (template && typeof template !== 'function') {\n templates[key] = kendo.template(template);\n }\n }\n this.templates = templates;\n },\n _normalizeIndices: function (indices) {\n var newIndices = [];\n var idx = 0;\n for (; idx < indices.length; idx++) {\n if (indices[idx] !== undefined) {\n newIndices.push(indices[idx]);\n }\n }\n return newIndices;\n },\n _valueIndices: function (values, indices) {\n var data = this._view;\n var idx = 0;\n var index;\n indices = indices ? indices.slice() : [];\n if (!values.length) {\n return [];\n }\n for (; idx < data.length; idx++) {\n index = this._dataItemPosition(data[idx].item, values);\n if (index !== -1) {\n indices[index] = idx;\n }\n }\n return this._normalizeIndices(indices);\n },\n _firstVisibleItem: function () {\n var element = this.element[0];\n var content = this.content[0];\n var scrollTop = content.scrollTop;\n var itemHeight = $(element.children[0]).height();\n var itemIndex = Math.floor(scrollTop / itemHeight) || 0;\n var item = element.children[itemIndex] || element.lastChild;\n var forward = item.offsetTop < scrollTop;\n while (item) {\n if (forward) {\n if (item.offsetTop + itemHeight > scrollTop || !item.nextSibling) {\n break;\n }\n item = item.nextSibling;\n } else {\n if (item.offsetTop <= scrollTop || !item.previousSibling) {\n break;\n }\n item = item.previousSibling;\n }\n }\n return this._view[$(item).data('offset-index')];\n },\n _fixedHeader: function () {\n if (this.isGrouped() && this.templates.fixedGroupTemplate) {\n this.header.show();\n this.content.scroll(this._onScroll);\n } else {\n this.header.hide();\n this.content.off('scroll', this._onScroll);\n }\n },\n _renderHeader: function () {\n var template = this.templates.fixedGroupTemplate;\n if (!template) {\n return;\n }\n var visibleItem = this._firstVisibleItem();\n if (visibleItem && visibleItem.group.toString().length) {\n this.header.html(template(visibleItem.group));\n }\n },\n _renderItem: function (context) {\n var item = '
  • ';\n if (hasColumns) {\n item += this._renderColumns(dataItem);\n } else {\n item += this.templates.template(dataItem);\n }\n if (notFirstItem && context.newGroup) {\n if (hasColumns) {\n item += '
    ' + this.templates.groupTemplate(context.group) + '
    ';\n } else {\n item += '
    ' + this.templates.groupTemplate(context.group) + '
    ';\n }\n } else if (isGrouped && hasColumns) {\n item += '
    ';\n }\n return item + '
  • ';\n },\n _renderColumns: function (dataItem) {\n var item = '';\n for (var i = 0; i < this.options.columns.length; i++) {\n var currentWidth = this.options.columns[i].width;\n var currentWidthInt = parseInt(currentWidth, 10);\n var widthStyle = '';\n if (currentWidth && !isNaN(currentWidthInt)) {\n widthStyle += 'style=\\'width:';\n widthStyle += currentWidthInt;\n widthStyle += percentageUnitsRegex.test(currentWidth) ? '%' : 'px';\n widthStyle += ';\\'';\n }\n item += '';\n item += this.templates['column' + i](dataItem);\n item += '';\n }\n return item;\n },\n _render: function () {\n var html = '';\n var i = 0;\n var idx = 0;\n var context;\n var dataContext = [];\n var view = this.dataSource.view();\n var values = this.value();\n var group, newGroup, j;\n var isGrouped = this.isGrouped();\n if (isGrouped) {\n for (i = 0; i < view.length; i++) {\n group = view[i];\n newGroup = true;\n for (j = 0; j < group.items.length; j++) {\n context = {\n selected: this._selected(group.items[j], values),\n item: group.items[j],\n group: group.value,\n newGroup: newGroup,\n isLastGroupedItem: j === group.items.length - 1,\n index: idx\n };\n dataContext[idx] = context;\n idx += 1;\n html += this._renderItem(context);\n newGroup = false;\n }\n }\n } else {\n for (i = 0; i < view.length; i++) {\n context = {\n selected: this._selected(view[i], values),\n item: view[i],\n index: i\n };\n dataContext[i] = context;\n html += this._renderItem(context);\n }\n }\n this._view = dataContext;\n this.element[0].innerHTML = html;\n if (isGrouped && dataContext.length) {\n this._renderHeader();\n }\n },\n _selected: function (dataItem, values) {\n var select = !this.isFiltered() || this.options.selectable === 'multiple';\n return select && this._dataItemPosition(dataItem, values) !== -1;\n },\n setDSFilter: function (filter) {\n this._lastDSFilter = extend({}, filter);\n },\n isFiltered: function () {\n if (!this._lastDSFilter) {\n this.setDSFilter(this.dataSource.filter());\n }\n return !kendo.data.Query.compareFilters(this.dataSource.filter(), this._lastDSFilter);\n },\n refresh: function (e) {\n var that = this;\n var action = e && e.action;\n var skipUpdateOnBind = that.options.skipUpdateOnBind;\n var isItemChange = action === 'itemchange';\n var result;\n that.trigger('dataBinding');\n that._angularItems('cleanup');\n that._fixedHeader();\n that._render();\n that.bound(true);\n if (isItemChange || action === 'remove') {\n result = mapChangedItems(that._dataItems, e.items);\n if (result.changed.length) {\n if (isItemChange) {\n that.trigger('selectedItemChange', { items: result.changed });\n } else {\n that.value(that._getValues(result.unchanged));\n }\n }\n } else if (that.isFiltered() || that._skipUpdate || that._emptySearch) {\n that.focus(0);\n if (that._skipUpdate) {\n that._skipUpdate = false;\n that._selectedIndices = that._valueIndices(that._values, that._selectedIndices);\n }\n } else if (!skipUpdateOnBind && (!action || action === 'add')) {\n that.value(that._values);\n }\n if (that._valueDeferred) {\n that._valueDeferred.resolve();\n }\n that._angularItems('compile');\n that.trigger('dataBound');\n },\n bound: function (bound) {\n if (bound === undefined) {\n return this._bound;\n }\n this._bound = bound;\n },\n isGrouped: function () {\n return (this.dataSource.group() || []).length;\n }\n });\n ui.plugin(StaticList);\n function last(list) {\n return list[list.length - 1];\n }\n function getSelectedOption(select) {\n var index = select.selectedIndex;\n return index > -1 ? select.options[index] : {};\n }\n function mapChangedItems(selected, itemsToMatch) {\n var itemsLength = itemsToMatch.length;\n var selectedLength = selected.length;\n var dataItem;\n var found;\n var i, j;\n var changed = [];\n var unchanged = [];\n if (selectedLength) {\n for (i = 0; i < selectedLength; i++) {\n dataItem = selected[i];\n found = false;\n for (j = 0; j < itemsLength; j++) {\n if (dataItem === itemsToMatch[j]) {\n found = true;\n changed.push({\n index: i,\n item: dataItem\n });\n break;\n }\n }\n if (!found) {\n unchanged.push(dataItem);\n }\n }\n }\n return {\n changed: changed,\n unchanged: unchanged\n };\n }\n function isValidFilterExpr(expression) {\n if (!expression || $.isEmptyObject(expression)) {\n return false;\n }\n if (expression.filters && !expression.filters.length) {\n return false;\n }\n return true;\n }\n function removeFiltersForField(expression, field) {\n var filters;\n var found = false;\n if (expression.filters) {\n filters = $.grep(expression.filters, function (filter) {\n found = removeFiltersForField(filter, field);\n if (filter.filters) {\n return filter.filters.length;\n } else {\n return filter.field != field;\n }\n });\n if (!found && expression.filters.length !== filters.length) {\n found = true;\n }\n expression.filters = filters;\n }\n return found;\n }\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('kendo.fx', ['kendo.core'], f);\n}(function () {\n var __meta__ = {\n id: 'fx',\n name: 'Effects',\n category: 'framework',\n description: 'Required for animation effects in all Kendo UI widgets.',\n depends: ['core']\n };\n (function ($, undefined) {\n var kendo = window.kendo, fx = kendo.effects, each = $.each, extend = $.extend, proxy = $.proxy, support = kendo.support, browser = support.browser, transforms = support.transforms, transitions = support.transitions, scaleProperties = {\n scale: 0,\n scalex: 0,\n scaley: 0,\n scale3d: 0\n }, translateProperties = {\n translate: 0,\n translatex: 0,\n translatey: 0,\n translate3d: 0\n }, hasZoom = typeof document.documentElement.style.zoom !== 'undefined' && !transforms, matrix3dRegExp = /matrix3?d?\\s*\\(.*,\\s*([\\d\\.\\-]+)\\w*?,\\s*([\\d\\.\\-]+)\\w*?,\\s*([\\d\\.\\-]+)\\w*?,\\s*([\\d\\.\\-]+)\\w*?/i, cssParamsRegExp = /^(-?[\\d\\.\\-]+)?[\\w\\s]*,?\\s*(-?[\\d\\.\\-]+)?[\\w\\s]*/i, translateXRegExp = /translatex?$/i, oldEffectsRegExp = /(zoom|fade|expand)(\\w+)/, singleEffectRegExp = /(zoom|fade|expand)/, unitRegExp = /[xy]$/i, transformProps = [\n 'perspective',\n 'rotate',\n 'rotatex',\n 'rotatey',\n 'rotatez',\n 'rotate3d',\n 'scale',\n 'scalex',\n 'scaley',\n 'scalez',\n 'scale3d',\n 'skew',\n 'skewx',\n 'skewy',\n 'translate',\n 'translatex',\n 'translatey',\n 'translatez',\n 'translate3d',\n 'matrix',\n 'matrix3d'\n ], transform2d = [\n 'rotate',\n 'scale',\n 'scalex',\n 'scaley',\n 'skew',\n 'skewx',\n 'skewy',\n 'translate',\n 'translatex',\n 'translatey',\n 'matrix'\n ], transform2units = {\n 'rotate': 'deg',\n scale: '',\n skew: 'px',\n translate: 'px'\n }, cssPrefix = transforms.css, round = Math.round, BLANK = '', PX = 'px', NONE = 'none', AUTO = 'auto', WIDTH = 'width', HEIGHT = 'height', HIDDEN = 'hidden', ORIGIN = 'origin', ABORT_ID = 'abortId', OVERFLOW = 'overflow', TRANSLATE = 'translate', POSITION = 'position', COMPLETE_CALLBACK = 'completeCallback', TRANSITION = cssPrefix + 'transition', TRANSFORM = cssPrefix + 'transform', BACKFACE = cssPrefix + 'backface-visibility', PERSPECTIVE = cssPrefix + 'perspective', DEFAULT_PERSPECTIVE = '1500px', TRANSFORM_PERSPECTIVE = 'perspective(' + DEFAULT_PERSPECTIVE + ')', directions = {\n left: {\n reverse: 'right',\n property: 'left',\n transition: 'translatex',\n vertical: false,\n modifier: -1\n },\n right: {\n reverse: 'left',\n property: 'left',\n transition: 'translatex',\n vertical: false,\n modifier: 1\n },\n down: {\n reverse: 'up',\n property: 'top',\n transition: 'translatey',\n vertical: true,\n modifier: 1\n },\n up: {\n reverse: 'down',\n property: 'top',\n transition: 'translatey',\n vertical: true,\n modifier: -1\n },\n top: { reverse: 'bottom' },\n bottom: { reverse: 'top' },\n 'in': {\n reverse: 'out',\n modifier: -1\n },\n out: {\n reverse: 'in',\n modifier: 1\n },\n vertical: { reverse: 'vertical' },\n horizontal: { reverse: 'horizontal' }\n };\n kendo.directions = directions;\n extend($.fn, {\n kendoStop: function (clearQueue, gotoEnd) {\n if (transitions) {\n return fx.stopQueue(this, clearQueue || false, gotoEnd || false);\n } else {\n return this.stop(clearQueue, gotoEnd);\n }\n }\n });\n if (transforms && !transitions) {\n each(transform2d, function (idx, value) {\n $.fn[value] = function (val) {\n if (typeof val == 'undefined') {\n return animationProperty(this, value);\n } else {\n var that = $(this)[0], transformValue = value + '(' + val + transform2units[value.replace(unitRegExp, '')] + ')';\n if (that.style.cssText.indexOf(TRANSFORM) == -1) {\n $(this).css(TRANSFORM, transformValue);\n } else {\n that.style.cssText = that.style.cssText.replace(new RegExp(value + '\\\\(.*?\\\\)', 'i'), transformValue);\n }\n }\n return this;\n };\n $.fx.step[value] = function (fx) {\n $(fx.elem)[value](fx.now);\n };\n });\n var curProxy = $.fx.prototype.cur;\n $.fx.prototype.cur = function () {\n if (transform2d.indexOf(this.prop) != -1) {\n return parseFloat($(this.elem)[this.prop]());\n }\n return curProxy.apply(this, arguments);\n };\n }\n kendo.toggleClass = function (element, classes, options, add) {\n if (classes) {\n classes = classes.split(' ');\n if (transitions) {\n options = extend({\n exclusive: 'all',\n duration: 400,\n ease: 'ease-out'\n }, options);\n element.css(TRANSITION, options.exclusive + ' ' + options.duration + 'ms ' + options.ease);\n setTimeout(function () {\n element.css(TRANSITION, '').css(HEIGHT);\n }, options.duration);\n }\n each(classes, function (idx, value) {\n element.toggleClass(value, add);\n });\n }\n return element;\n };\n kendo.parseEffects = function (input, mirror) {\n var effects = {};\n if (typeof input === 'string') {\n each(input.split(' '), function (idx, value) {\n var redirectedEffect = !singleEffectRegExp.test(value), resolved = value.replace(oldEffectsRegExp, function (match, $1, $2) {\n return $1 + ':' + $2.toLowerCase();\n }), effect = resolved.split(':'), direction = effect[1], effectBody = {};\n if (effect.length > 1) {\n effectBody.direction = mirror && redirectedEffect ? directions[direction].reverse : direction;\n }\n effects[effect[0]] = effectBody;\n });\n } else {\n each(input, function (idx) {\n var direction = this.direction;\n if (direction && mirror && !singleEffectRegExp.test(idx)) {\n this.direction = directions[direction].reverse;\n }\n effects[idx] = this;\n });\n }\n return effects;\n };\n function parseInteger(value) {\n return parseInt(value, 10);\n }\n function parseCSS(element, property) {\n return parseInteger(element.css(property));\n }\n function keys(obj) {\n var acc = [];\n for (var propertyName in obj) {\n acc.push(propertyName);\n }\n return acc;\n }\n function strip3DTransforms(properties) {\n for (var key in properties) {\n if (transformProps.indexOf(key) != -1 && transform2d.indexOf(key) == -1) {\n delete properties[key];\n }\n }\n return properties;\n }\n function normalizeCSS(element, properties) {\n var transformation = [], cssValues = {}, lowerKey, key, value, isTransformed;\n for (key in properties) {\n lowerKey = key.toLowerCase();\n isTransformed = transforms && transformProps.indexOf(lowerKey) != -1;\n if (!support.hasHW3D && isTransformed && transform2d.indexOf(lowerKey) == -1) {\n delete properties[key];\n } else {\n value = properties[key];\n if (isTransformed) {\n transformation.push(key + '(' + value + ')');\n } else {\n cssValues[key] = value;\n }\n }\n }\n if (transformation.length) {\n cssValues[TRANSFORM] = transformation.join(' ');\n }\n return cssValues;\n }\n if (transitions) {\n extend(fx, {\n transition: function (element, properties, options) {\n var css, delay = 0, oldKeys = element.data('keys') || [], timeoutID;\n options = extend({\n duration: 200,\n ease: 'ease-out',\n complete: null,\n exclusive: 'all'\n }, options);\n var stopTransitionCalled = false;\n var stopTransition = function () {\n if (!stopTransitionCalled) {\n stopTransitionCalled = true;\n if (timeoutID) {\n clearTimeout(timeoutID);\n timeoutID = null;\n }\n element.removeData(ABORT_ID).dequeue().css(TRANSITION, '').css(TRANSITION);\n options.complete.call(element);\n }\n };\n options.duration = $.fx ? $.fx.speeds[options.duration] || options.duration : options.duration;\n css = normalizeCSS(element, properties);\n $.merge(oldKeys, keys(css));\n if ($.hasOwnProperty('uniqueSort')) {\n element.data('keys', $.uniqueSort(oldKeys)).height();\n } else {\n element.data('keys', $.unique(oldKeys)).height();\n }\n element.css(TRANSITION, options.exclusive + ' ' + options.duration + 'ms ' + options.ease).css(TRANSITION);\n element.css(css).css(TRANSFORM);\n if (transitions.event) {\n element.one(transitions.event, stopTransition);\n if (options.duration !== 0) {\n delay = 500;\n }\n }\n timeoutID = setTimeout(stopTransition, options.duration + delay);\n element.data(ABORT_ID, timeoutID);\n element.data(COMPLETE_CALLBACK, stopTransition);\n },\n stopQueue: function (element, clearQueue, gotoEnd) {\n var cssValues, taskKeys = element.data('keys'), retainPosition = !gotoEnd && taskKeys, completeCallback = element.data(COMPLETE_CALLBACK);\n if (retainPosition) {\n cssValues = kendo.getComputedStyles(element[0], taskKeys);\n }\n if (completeCallback) {\n completeCallback();\n }\n if (retainPosition) {\n element.css(cssValues);\n }\n return element.removeData('keys').stop(clearQueue);\n }\n });\n }\n function animationProperty(element, property) {\n if (transforms) {\n var transform = element.css(TRANSFORM);\n if (transform == NONE) {\n return property == 'scale' ? 1 : 0;\n }\n var match = transform.match(new RegExp(property + '\\\\s*\\\\(([\\\\d\\\\w\\\\.]+)')), computed = 0;\n if (match) {\n computed = parseInteger(match[1]);\n } else {\n match = transform.match(matrix3dRegExp) || [\n 0,\n 0,\n 0,\n 0,\n 0\n ];\n property = property.toLowerCase();\n if (translateXRegExp.test(property)) {\n computed = parseFloat(match[3] / match[2]);\n } else if (property == 'translatey') {\n computed = parseFloat(match[4] / match[2]);\n } else if (property == 'scale') {\n computed = parseFloat(match[2]);\n } else if (property == 'rotate') {\n computed = parseFloat(Math.atan2(match[2], match[1]));\n }\n }\n return computed;\n } else {\n return parseFloat(element.css(property));\n }\n }\n var EffectSet = kendo.Class.extend({\n init: function (element, options) {\n var that = this;\n that.element = element;\n that.effects = [];\n that.options = options;\n that.restore = [];\n },\n run: function (effects) {\n var that = this, effect, idx, jdx, length = effects.length, element = that.element, options = that.options, deferred = $.Deferred(), start = {}, end = {}, target, children, childrenLength;\n that.effects = effects;\n deferred.done($.proxy(that, 'complete'));\n element.data('animating', true);\n for (idx = 0; idx < length; idx++) {\n effect = effects[idx];\n effect.setReverse(options.reverse);\n effect.setOptions(options);\n that.addRestoreProperties(effect.restore);\n effect.prepare(start, end);\n children = effect.children();\n for (jdx = 0, childrenLength = children.length; jdx < childrenLength; jdx++) {\n children[jdx].duration(options.duration).run();\n }\n }\n for (var effectName in options.effects) {\n extend(end, options.effects[effectName].properties);\n }\n if (!element.is(':visible')) {\n extend(start, { display: element.data('olddisplay') || 'block' });\n }\n if (transforms && !options.reset) {\n target = element.data('targetTransform');\n if (target) {\n start = extend(target, start);\n }\n }\n start = normalizeCSS(element, start);\n if (transforms && !transitions) {\n start = strip3DTransforms(start);\n }\n element.css(start).css(TRANSFORM);\n for (idx = 0; idx < length; idx++) {\n effects[idx].setup();\n }\n if (options.init) {\n options.init();\n }\n element.data('targetTransform', end);\n fx.animate(element, end, extend({}, options, { complete: deferred.resolve }));\n return deferred.promise();\n },\n stop: function () {\n $(this.element).kendoStop(true, true);\n },\n addRestoreProperties: function (restore) {\n var element = this.element, value, i = 0, length = restore.length;\n for (; i < length; i++) {\n value = restore[i];\n this.restore.push(value);\n if (!element.data(value)) {\n element.data(value, element.css(value));\n }\n }\n },\n restoreCallback: function () {\n var element = this.element;\n for (var i = 0, length = this.restore.length; i < length; i++) {\n var value = this.restore[i];\n element.css(value, element.data(value));\n }\n },\n complete: function () {\n var that = this, idx = 0, element = that.element, options = that.options, effects = that.effects, length = effects.length;\n element.removeData('animating').dequeue();\n if (options.hide) {\n element.data('olddisplay', element.css('display')).hide();\n }\n this.restoreCallback();\n if (hasZoom && !transforms) {\n setTimeout($.proxy(this, 'restoreCallback'), 0);\n }\n for (; idx < length; idx++) {\n effects[idx].teardown();\n }\n if (options.completeCallback) {\n options.completeCallback(element);\n }\n }\n });\n fx.promise = function (element, options) {\n var effects = [], effectClass, effectSet = new EffectSet(element, options), parsedEffects = kendo.parseEffects(options.effects), effect;\n options.effects = parsedEffects;\n for (var effectName in parsedEffects) {\n effectClass = fx[capitalize(effectName)];\n if (effectClass) {\n effect = new effectClass(element, parsedEffects[effectName].direction);\n effects.push(effect);\n }\n }\n if (effects[0]) {\n effectSet.run(effects);\n } else {\n if (!element.is(':visible')) {\n element.css({ display: element.data('olddisplay') || 'block' }).css('display');\n }\n if (options.init) {\n options.init();\n }\n element.dequeue();\n effectSet.complete();\n }\n };\n extend(fx, {\n animate: function (elements, properties, options) {\n var useTransition = options.transition !== false;\n delete options.transition;\n if (transitions && 'transition' in fx && useTransition) {\n fx.transition(elements, properties, options);\n } else {\n if (transforms) {\n elements.animate(strip3DTransforms(properties), {\n queue: false,\n show: false,\n hide: false,\n duration: options.duration,\n complete: options.complete\n });\n } else {\n elements.each(function () {\n var element = $(this), multiple = {};\n each(transformProps, function (idx, value) {\n var params, currentValue = properties ? properties[value] + ' ' : null;\n if (currentValue) {\n var single = properties;\n if (value in scaleProperties && properties[value] !== undefined) {\n params = currentValue.match(cssParamsRegExp);\n if (transforms) {\n extend(single, { scale: +params[0] });\n }\n } else {\n if (value in translateProperties && properties[value] !== undefined) {\n var position = element.css(POSITION), isFixed = position == 'absolute' || position == 'fixed';\n if (!element.data(TRANSLATE)) {\n if (isFixed) {\n element.data(TRANSLATE, {\n top: parseCSS(element, 'top') || 0,\n left: parseCSS(element, 'left') || 0,\n bottom: parseCSS(element, 'bottom'),\n right: parseCSS(element, 'right')\n });\n } else {\n element.data(TRANSLATE, {\n top: parseCSS(element, 'marginTop') || 0,\n left: parseCSS(element, 'marginLeft') || 0\n });\n }\n }\n var originalPosition = element.data(TRANSLATE);\n params = currentValue.match(cssParamsRegExp);\n if (params) {\n var dX = value == TRANSLATE + 'y' ? +null : +params[1], dY = value == TRANSLATE + 'y' ? +params[1] : +params[2];\n if (isFixed) {\n if (!isNaN(originalPosition.right)) {\n if (!isNaN(dX)) {\n extend(single, { right: originalPosition.right - dX });\n }\n } else {\n if (!isNaN(dX)) {\n extend(single, { left: originalPosition.left + dX });\n }\n }\n if (!isNaN(originalPosition.bottom)) {\n if (!isNaN(dY)) {\n extend(single, { bottom: originalPosition.bottom - dY });\n }\n } else {\n if (!isNaN(dY)) {\n extend(single, { top: originalPosition.top + dY });\n }\n }\n } else {\n if (!isNaN(dX)) {\n extend(single, { marginLeft: originalPosition.left + dX });\n }\n if (!isNaN(dY)) {\n extend(single, { marginTop: originalPosition.top + dY });\n }\n }\n }\n }\n }\n if (!transforms && value != 'scale' && value in single) {\n delete single[value];\n }\n if (single) {\n extend(multiple, single);\n }\n }\n });\n if (browser.msie) {\n delete multiple.scale;\n }\n element.animate(multiple, {\n queue: false,\n show: false,\n hide: false,\n duration: options.duration,\n complete: options.complete\n });\n });\n }\n }\n }\n });\n fx.animatedPromise = fx.promise;\n var Effect = kendo.Class.extend({\n init: function (element, direction) {\n var that = this;\n that.element = element;\n that._direction = direction;\n that.options = {};\n that._additionalEffects = [];\n if (!that.restore) {\n that.restore = [];\n }\n },\n reverse: function () {\n this._reverse = true;\n return this.run();\n },\n play: function () {\n this._reverse = false;\n return this.run();\n },\n add: function (additional) {\n this._additionalEffects.push(additional);\n return this;\n },\n direction: function (value) {\n this._direction = value;\n return this;\n },\n duration: function (duration) {\n this._duration = duration;\n return this;\n },\n compositeRun: function () {\n var that = this, effectSet = new EffectSet(that.element, {\n reverse: that._reverse,\n duration: that._duration\n }), effects = that._additionalEffects.concat([that]);\n return effectSet.run(effects);\n },\n run: function () {\n if (this._additionalEffects && this._additionalEffects[0]) {\n return this.compositeRun();\n }\n var that = this, element = that.element, idx = 0, restore = that.restore, length = restore.length, value, deferred = $.Deferred(), start = {}, end = {}, target, children = that.children(), childrenLength = children.length;\n deferred.done($.proxy(that, '_complete'));\n element.data('animating', true);\n for (idx = 0; idx < length; idx++) {\n value = restore[idx];\n if (!element.data(value)) {\n element.data(value, element.css(value));\n }\n }\n for (idx = 0; idx < childrenLength; idx++) {\n children[idx].duration(that._duration).run();\n }\n that.prepare(start, end);\n if (!element.is(':visible')) {\n extend(start, { display: element.data('olddisplay') || 'block' });\n }\n if (transforms) {\n target = element.data('targetTransform');\n if (target) {\n start = extend(target, start);\n }\n }\n start = normalizeCSS(element, start);\n if (transforms && !transitions) {\n start = strip3DTransforms(start);\n }\n element.css(start).css(TRANSFORM);\n that.setup();\n element.data('targetTransform', end);\n fx.animate(element, end, {\n duration: that._duration,\n complete: deferred.resolve\n });\n return deferred.promise();\n },\n stop: function () {\n var idx = 0, children = this.children(), childrenLength = children.length;\n for (idx = 0; idx < childrenLength; idx++) {\n children[idx].stop();\n }\n $(this.element).kendoStop(true, true);\n return this;\n },\n restoreCallback: function () {\n var element = this.element;\n for (var i = 0, length = this.restore.length; i < length; i++) {\n var value = this.restore[i];\n element.css(value, element.data(value));\n }\n },\n _complete: function () {\n var that = this, element = that.element;\n element.removeData('animating').dequeue();\n that.restoreCallback();\n if (that.shouldHide()) {\n element.data('olddisplay', element.css('display')).hide();\n }\n if (hasZoom && !transforms) {\n setTimeout($.proxy(that, 'restoreCallback'), 0);\n }\n that.teardown();\n },\n setOptions: function (options) {\n extend(true, this.options, options);\n },\n children: function () {\n return [];\n },\n shouldHide: $.noop,\n setup: $.noop,\n prepare: $.noop,\n teardown: $.noop,\n directions: [],\n setReverse: function (reverse) {\n this._reverse = reverse;\n return this;\n }\n });\n function capitalize(word) {\n return word.charAt(0).toUpperCase() + word.substring(1);\n }\n function createEffect(name, definition) {\n var effectClass = Effect.extend(definition), directions = effectClass.prototype.directions;\n fx[capitalize(name)] = effectClass;\n fx.Element.prototype[name] = function (direction, opt1, opt2, opt3) {\n return new effectClass(this.element, direction, opt1, opt2, opt3);\n };\n each(directions, function (idx, theDirection) {\n fx.Element.prototype[name + capitalize(theDirection)] = function (opt1, opt2, opt3) {\n return new effectClass(this.element, theDirection, opt1, opt2, opt3);\n };\n });\n }\n var FOUR_DIRECTIONS = [\n 'left',\n 'right',\n 'up',\n 'down'\n ], IN_OUT = [\n 'in',\n 'out'\n ];\n createEffect('slideIn', {\n directions: FOUR_DIRECTIONS,\n divisor: function (value) {\n this.options.divisor = value;\n return this;\n },\n prepare: function (start, end) {\n var that = this, tmp, element = that.element, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, direction = directions[that._direction], offset = -direction.modifier * (direction.vertical ? outerHeight(element) : outerWidth(element)), startValue = offset / (that.options && that.options.divisor || 1) + PX, endValue = '0px';\n if (that._reverse) {\n tmp = start;\n start = end;\n end = tmp;\n }\n if (transforms) {\n start[direction.transition] = startValue;\n end[direction.transition] = endValue;\n } else {\n start[direction.property] = startValue;\n end[direction.property] = endValue;\n }\n }\n });\n createEffect('tile', {\n directions: FOUR_DIRECTIONS,\n init: function (element, direction, previous) {\n Effect.prototype.init.call(this, element, direction);\n this.options = { previous: previous };\n },\n previousDivisor: function (value) {\n this.options.previousDivisor = value;\n return this;\n },\n children: function () {\n var that = this, reverse = that._reverse, previous = that.options.previous, divisor = that.options.previousDivisor || 1, dir = that._direction;\n var children = [kendo.fx(that.element).slideIn(dir).setReverse(reverse)];\n if (previous) {\n children.push(kendo.fx(previous).slideIn(directions[dir].reverse).divisor(divisor).setReverse(!reverse));\n }\n return children;\n }\n });\n function createToggleEffect(name, property, defaultStart, defaultEnd) {\n createEffect(name, {\n directions: IN_OUT,\n startValue: function (value) {\n this._startValue = value;\n return this;\n },\n endValue: function (value) {\n this._endValue = value;\n return this;\n },\n shouldHide: function () {\n return this._shouldHide;\n },\n prepare: function (start, end) {\n var that = this, startValue, endValue, out = this._direction === 'out', startDataValue = that.element.data(property), startDataValueIsSet = !(isNaN(startDataValue) || startDataValue == defaultStart);\n if (startDataValueIsSet) {\n startValue = startDataValue;\n } else if (typeof this._startValue !== 'undefined') {\n startValue = this._startValue;\n } else {\n startValue = out ? defaultStart : defaultEnd;\n }\n if (typeof this._endValue !== 'undefined') {\n endValue = this._endValue;\n } else {\n endValue = out ? defaultEnd : defaultStart;\n }\n if (this._reverse) {\n start[property] = endValue;\n end[property] = startValue;\n } else {\n start[property] = startValue;\n end[property] = endValue;\n }\n that._shouldHide = end[property] === defaultEnd;\n }\n });\n }\n createToggleEffect('fade', 'opacity', 1, 0);\n createToggleEffect('zoom', 'scale', 1, 0.01);\n createEffect('slideMargin', {\n prepare: function (start, end) {\n var that = this, element = that.element, options = that.options, origin = element.data(ORIGIN), offset = options.offset, margin, reverse = that._reverse;\n if (!reverse && origin === null) {\n element.data(ORIGIN, parseFloat(element.css('margin-' + options.axis)));\n }\n margin = element.data(ORIGIN) || 0;\n end['margin-' + options.axis] = !reverse ? margin + offset : margin;\n }\n });\n createEffect('slideTo', {\n prepare: function (start, end) {\n var that = this, element = that.element, options = that.options, offset = options.offset.split(','), reverse = that._reverse;\n if (transforms) {\n end.translatex = !reverse ? offset[0] : 0;\n end.translatey = !reverse ? offset[1] : 0;\n } else {\n end.left = !reverse ? offset[0] : 0;\n end.top = !reverse ? offset[1] : 0;\n }\n element.css('left');\n }\n });\n createEffect('expand', {\n directions: [\n 'horizontal',\n 'vertical'\n ],\n restore: [OVERFLOW],\n prepare: function (start, end) {\n var that = this, element = that.element, options = that.options, reverse = that._reverse, property = that._direction === 'vertical' ? HEIGHT : WIDTH, setLength = element[0].style[property], oldLength = element.data(property), length = parseFloat(oldLength || setLength), realLength = round(element.css(property, AUTO)[property]());\n start.overflow = HIDDEN;\n length = options && options.reset ? realLength || length : length || realLength;\n end[property] = (reverse ? 0 : length) + PX;\n start[property] = (reverse ? length : 0) + PX;\n if (oldLength === undefined) {\n element.data(property, setLength);\n }\n },\n shouldHide: function () {\n return this._reverse;\n },\n teardown: function () {\n var that = this, element = that.element, property = that._direction === 'vertical' ? HEIGHT : WIDTH, length = element.data(property);\n if (length == AUTO || length === BLANK) {\n setTimeout(function () {\n element.css(property, AUTO).css(property);\n }, 0);\n }\n }\n });\n var TRANSFER_START_STATE = {\n position: 'absolute',\n marginLeft: 0,\n marginTop: 0,\n scale: 1\n };\n createEffect('transfer', {\n init: function (element, target) {\n this.element = element;\n this.options = { target: target };\n this.restore = [];\n },\n setup: function () {\n this.element.appendTo(document.body);\n },\n prepare: function (start, end) {\n var that = this, element = that.element, outerBox = fx.box(element), innerBox = fx.box(that.options.target), currentScale = animationProperty(element, 'scale'), scale = fx.fillScale(innerBox, outerBox), transformOrigin = fx.transformOrigin(innerBox, outerBox);\n extend(start, TRANSFER_START_STATE);\n end.scale = 1;\n element.css(TRANSFORM, 'scale(1)').css(TRANSFORM);\n element.css(TRANSFORM, 'scale(' + currentScale + ')');\n start.top = outerBox.top;\n start.left = outerBox.left;\n start.transformOrigin = transformOrigin.x + PX + ' ' + transformOrigin.y + PX;\n if (that._reverse) {\n start.scale = scale;\n } else {\n end.scale = scale;\n }\n }\n });\n var CLIPS = {\n top: 'rect(auto auto $size auto)',\n bottom: 'rect($size auto auto auto)',\n left: 'rect(auto $size auto auto)',\n right: 'rect(auto auto auto $size)'\n };\n var ROTATIONS = {\n top: {\n start: 'rotatex(0deg)',\n end: 'rotatex(180deg)'\n },\n bottom: {\n start: 'rotatex(-180deg)',\n end: 'rotatex(0deg)'\n },\n left: {\n start: 'rotatey(0deg)',\n end: 'rotatey(-180deg)'\n },\n right: {\n start: 'rotatey(180deg)',\n end: 'rotatey(0deg)'\n }\n };\n function clipInHalf(container, direction) {\n var vertical = kendo.directions[direction].vertical, size = container[vertical ? HEIGHT : WIDTH]() / 2 + 'px';\n return CLIPS[direction].replace('$size', size);\n }\n createEffect('turningPage', {\n directions: FOUR_DIRECTIONS,\n init: function (element, direction, container) {\n Effect.prototype.init.call(this, element, direction);\n this._container = container;\n },\n prepare: function (start, end) {\n var that = this, reverse = that._reverse, direction = reverse ? directions[that._direction].reverse : that._direction, rotation = ROTATIONS[direction];\n start.zIndex = 1;\n if (that._clipInHalf) {\n start.clip = clipInHalf(that._container, kendo.directions[direction].reverse);\n }\n start[BACKFACE] = HIDDEN;\n end[TRANSFORM] = TRANSFORM_PERSPECTIVE + (reverse ? rotation.start : rotation.end);\n start[TRANSFORM] = TRANSFORM_PERSPECTIVE + (reverse ? rotation.end : rotation.start);\n },\n setup: function () {\n this._container.append(this.element);\n },\n face: function (value) {\n this._face = value;\n return this;\n },\n shouldHide: function () {\n var that = this, reverse = that._reverse, face = that._face;\n return reverse && !face || !reverse && face;\n },\n clipInHalf: function (value) {\n this._clipInHalf = value;\n return this;\n },\n temporary: function () {\n this.element.addClass('temp-page');\n return this;\n }\n });\n createEffect('staticPage', {\n directions: FOUR_DIRECTIONS,\n init: function (element, direction, container) {\n Effect.prototype.init.call(this, element, direction);\n this._container = container;\n },\n restore: ['clip'],\n prepare: function (start, end) {\n var that = this, direction = that._reverse ? directions[that._direction].reverse : that._direction;\n start.clip = clipInHalf(that._container, direction);\n start.opacity = 0.999;\n end.opacity = 1;\n },\n shouldHide: function () {\n var that = this, reverse = that._reverse, face = that._face;\n return reverse && !face || !reverse && face;\n },\n face: function (value) {\n this._face = value;\n return this;\n }\n });\n createEffect('pageturn', {\n directions: [\n 'horizontal',\n 'vertical'\n ],\n init: function (element, direction, face, back) {\n Effect.prototype.init.call(this, element, direction);\n this.options = {};\n this.options.face = face;\n this.options.back = back;\n },\n children: function () {\n var that = this, options = that.options, direction = that._direction === 'horizontal' ? 'left' : 'top', reverseDirection = kendo.directions[direction].reverse, reverse = that._reverse, temp, faceClone = options.face.clone(true).removeAttr('id'), backClone = options.back.clone(true).removeAttr('id'), element = that.element;\n if (reverse) {\n temp = direction;\n direction = reverseDirection;\n reverseDirection = temp;\n }\n return [\n kendo.fx(options.face).staticPage(direction, element).face(true).setReverse(reverse),\n kendo.fx(options.back).staticPage(reverseDirection, element).setReverse(reverse),\n kendo.fx(faceClone).turningPage(direction, element).face(true).clipInHalf(true).temporary().setReverse(reverse),\n kendo.fx(backClone).turningPage(reverseDirection, element).clipInHalf(true).temporary().setReverse(reverse)\n ];\n },\n prepare: function (start, end) {\n start[PERSPECTIVE] = DEFAULT_PERSPECTIVE;\n start.transformStyle = 'preserve-3d';\n start.opacity = 0.999;\n end.opacity = 1;\n },\n teardown: function () {\n this.element.find('.temp-page').remove();\n }\n });\n createEffect('flip', {\n directions: [\n 'horizontal',\n 'vertical'\n ],\n init: function (element, direction, face, back) {\n Effect.prototype.init.call(this, element, direction);\n this.options = {};\n this.options.face = face;\n this.options.back = back;\n },\n children: function () {\n var that = this, options = that.options, direction = that._direction === 'horizontal' ? 'left' : 'top', reverseDirection = kendo.directions[direction].reverse, reverse = that._reverse, temp, element = that.element;\n if (reverse) {\n temp = direction;\n direction = reverseDirection;\n reverseDirection = temp;\n }\n return [\n kendo.fx(options.face).turningPage(direction, element).face(true).setReverse(reverse),\n kendo.fx(options.back).turningPage(reverseDirection, element).setReverse(reverse)\n ];\n },\n prepare: function (start) {\n start[PERSPECTIVE] = DEFAULT_PERSPECTIVE;\n start.transformStyle = 'preserve-3d';\n }\n });\n var RESTORE_OVERFLOW = !support.mobileOS.android;\n var IGNORE_TRANSITION_EVENT_SELECTOR = '.km-touch-scrollbar, .km-actionsheet-wrapper';\n createEffect('replace', {\n _before: $.noop,\n _after: $.noop,\n init: function (element, previous, transitionClass) {\n Effect.prototype.init.call(this, element);\n this._previous = $(previous);\n this._transitionClass = transitionClass;\n },\n duration: function () {\n throw new Error('The replace effect does not support duration setting; the effect duration may be customized through the transition class rule');\n },\n beforeTransition: function (callback) {\n this._before = callback;\n return this;\n },\n afterTransition: function (callback) {\n this._after = callback;\n return this;\n },\n _both: function () {\n return $().add(this._element).add(this._previous);\n },\n _containerClass: function () {\n var direction = this._direction, containerClass = 'k-fx k-fx-start k-fx-' + this._transitionClass;\n if (direction) {\n containerClass += ' k-fx-' + direction;\n }\n if (this._reverse) {\n containerClass += ' k-fx-reverse';\n }\n return containerClass;\n },\n complete: function (e) {\n if (!this.deferred || e && $(e.target).is(IGNORE_TRANSITION_EVENT_SELECTOR)) {\n return;\n }\n var container = this.container;\n container.removeClass('k-fx-end').removeClass(this._containerClass()).off(transitions.event, this.completeProxy);\n this._previous.hide().removeClass('k-fx-current');\n this.element.removeClass('k-fx-next');\n if (RESTORE_OVERFLOW) {\n container.css(OVERFLOW, '');\n }\n if (!this.isAbsolute) {\n this._both().css(POSITION, '');\n }\n this.deferred.resolve();\n delete this.deferred;\n },\n run: function () {\n if (this._additionalEffects && this._additionalEffects[0]) {\n return this.compositeRun();\n }\n var that = this, element = that.element, previous = that._previous, container = element.parents().filter(previous.parents()).first(), both = that._both(), deferred = $.Deferred(), originalPosition = element.css(POSITION), originalOverflow;\n if (!container.length) {\n container = element.parent();\n }\n this.container = container;\n this.deferred = deferred;\n this.isAbsolute = originalPosition == 'absolute';\n if (!this.isAbsolute) {\n both.css(POSITION, 'absolute');\n }\n if (RESTORE_OVERFLOW) {\n originalOverflow = container.css(OVERFLOW);\n container.css(OVERFLOW, 'hidden');\n }\n if (!transitions) {\n this.complete();\n } else {\n element.addClass('k-fx-hidden');\n container.addClass(this._containerClass());\n this.completeProxy = $.proxy(this, 'complete');\n container.on(transitions.event, this.completeProxy);\n kendo.animationFrame(function () {\n element.removeClass('k-fx-hidden').addClass('k-fx-next');\n previous.css('display', '').addClass('k-fx-current');\n that._before(previous, element);\n kendo.animationFrame(function () {\n container.removeClass('k-fx-start').addClass('k-fx-end');\n that._after(previous, element);\n });\n });\n }\n return deferred.promise();\n },\n stop: function () {\n this.complete();\n }\n });\n var Animation = kendo.Class.extend({\n init: function () {\n var that = this;\n that._tickProxy = proxy(that._tick, that);\n that._started = false;\n },\n tick: $.noop,\n done: $.noop,\n onEnd: $.noop,\n onCancel: $.noop,\n start: function () {\n if (!this.enabled()) {\n return;\n }\n if (!this.done()) {\n this._started = true;\n kendo.animationFrame(this._tickProxy);\n } else {\n this.onEnd();\n }\n },\n enabled: function () {\n return true;\n },\n cancel: function () {\n this._started = false;\n this.onCancel();\n },\n _tick: function () {\n var that = this;\n if (!that._started) {\n return;\n }\n that.tick();\n if (!that.done()) {\n kendo.animationFrame(that._tickProxy);\n } else {\n that._started = false;\n that.onEnd();\n }\n }\n });\n var Transition = Animation.extend({\n init: function (options) {\n var that = this;\n extend(that, options);\n Animation.fn.init.call(that);\n },\n done: function () {\n return this.timePassed() >= this.duration;\n },\n timePassed: function () {\n return Math.min(this.duration, new Date() - this.startDate);\n },\n moveTo: function (options) {\n var that = this, movable = that.movable;\n that.initial = movable[that.axis];\n that.delta = options.location - that.initial;\n that.duration = typeof options.duration == 'number' ? options.duration : 300;\n that.tick = that._easeProxy(options.ease);\n that.startDate = new Date();\n that.start();\n },\n _easeProxy: function (ease) {\n var that = this;\n return function () {\n that.movable.moveAxis(that.axis, ease(that.timePassed(), that.initial, that.delta, that.duration));\n };\n }\n });\n extend(Transition, {\n easeOutExpo: function (t, b, c, d) {\n return t == d ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;\n },\n easeOutBack: function (t, b, c, d, s) {\n s = 1.70158;\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n }\n });\n fx.Animation = Animation;\n fx.Transition = Transition;\n fx.createEffect = createEffect;\n fx.box = function (element) {\n element = $(element);\n var result = element.offset();\n result.width = kendo._outerWidth(element);\n result.height = kendo._outerHeight(element);\n return result;\n };\n fx.transformOrigin = function (inner, outer) {\n var x = (inner.left - outer.left) * outer.width / (outer.width - inner.width), y = (inner.top - outer.top) * outer.height / (outer.height - inner.height);\n return {\n x: isNaN(x) ? 0 : x,\n y: isNaN(y) ? 0 : y\n };\n };\n fx.fillScale = function (inner, outer) {\n return Math.min(inner.width / outer.width, inner.height / outer.height);\n };\n fx.fitScale = function (inner, outer) {\n return Math.max(inner.width / outer.width, inner.height / outer.height);\n };\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('kendo.draganddrop', [\n 'kendo.core',\n 'kendo.userevents'\n ], f);\n}(function () {\n var __meta__ = {\n id: 'draganddrop',\n name: 'Drag & drop',\n category: 'framework',\n description: 'Drag & drop functionality for any DOM element.',\n depends: [\n 'core',\n 'userevents'\n ]\n };\n (function ($, undefined) {\n var kendo = window.kendo, support = kendo.support, document = window.document, $window = $(window), Class = kendo.Class, Widget = kendo.ui.Widget, Observable = kendo.Observable, UserEvents = kendo.UserEvents, proxy = $.proxy, extend = $.extend, getOffset = kendo.getOffset, draggables = {}, dropTargets = {}, dropAreas = {}, lastDropTarget, elementUnderCursor = kendo.elementUnderCursor, KEYUP = 'keyup', CHANGE = 'change', DRAGSTART = 'dragstart', HOLD = 'hold', DRAG = 'drag', DRAGEND = 'dragend', DRAGCANCEL = 'dragcancel', HINTDESTROYED = 'hintDestroyed', DRAGENTER = 'dragenter', DRAGLEAVE = 'dragleave', DROP = 'drop';\n function contains(parent, child) {\n try {\n return $.contains(parent, child) || parent == child;\n } catch (e) {\n return false;\n }\n }\n function numericCssPropery(element, property) {\n return parseInt(element.css(property), 10) || 0;\n }\n function within(value, range) {\n return Math.min(Math.max(value, range.min), range.max);\n }\n function containerBoundaries(container, element) {\n var offset = getOffset(container), outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, minX = offset.left + numericCssPropery(container, 'borderLeftWidth') + numericCssPropery(container, 'paddingLeft'), minY = offset.top + numericCssPropery(container, 'borderTopWidth') + numericCssPropery(container, 'paddingTop'), maxX = minX + container.width() - outerWidth(element, true), maxY = minY + container.height() - outerHeight(element, true);\n return {\n x: {\n min: minX,\n max: maxX\n },\n y: {\n min: minY,\n max: maxY\n }\n };\n }\n function checkTarget(target, targets, areas) {\n var theTarget, theFilter, i = 0, targetLen = targets && targets.length, areaLen = areas && areas.length;\n while (target && target.parentNode) {\n for (i = 0; i < targetLen; i++) {\n theTarget = targets[i];\n if (theTarget.element[0] === target) {\n return {\n target: theTarget,\n targetElement: target\n };\n }\n }\n for (i = 0; i < areaLen; i++) {\n theFilter = areas[i];\n if ($.contains(theFilter.element[0], target) && support.matchesSelector.call(target, theFilter.options.filter)) {\n return {\n target: theFilter,\n targetElement: target\n };\n }\n }\n target = target.parentNode;\n }\n return undefined;\n }\n var TapCapture = Observable.extend({\n init: function (element, options) {\n var that = this, domElement = element[0];\n that.capture = false;\n if (domElement.addEventListener) {\n $.each(kendo.eventMap.down.split(' '), function () {\n domElement.addEventListener(this, proxy(that._press, that), true);\n });\n $.each(kendo.eventMap.up.split(' '), function () {\n domElement.addEventListener(this, proxy(that._release, that), true);\n });\n } else {\n $.each(kendo.eventMap.down.split(' '), function () {\n domElement.attachEvent(this, proxy(that._press, that));\n });\n $.each(kendo.eventMap.up.split(' '), function () {\n domElement.attachEvent(this, proxy(that._release, that));\n });\n }\n Observable.fn.init.call(that);\n that.bind([\n 'press',\n 'release'\n ], options || {});\n },\n captureNext: function () {\n this.capture = true;\n },\n cancelCapture: function () {\n this.capture = false;\n },\n _press: function (e) {\n var that = this;\n that.trigger('press');\n if (that.capture) {\n e.preventDefault();\n }\n },\n _release: function (e) {\n var that = this;\n that.trigger('release');\n if (that.capture) {\n e.preventDefault();\n that.cancelCapture();\n }\n }\n });\n var PaneDimension = Observable.extend({\n init: function (options) {\n var that = this;\n Observable.fn.init.call(that);\n that.forcedEnabled = false;\n $.extend(that, options);\n that.scale = 1;\n if (that.horizontal) {\n that.measure = 'offsetWidth';\n that.scrollSize = 'scrollWidth';\n that.axis = 'x';\n } else {\n that.measure = 'offsetHeight';\n that.scrollSize = 'scrollHeight';\n that.axis = 'y';\n }\n },\n makeVirtual: function () {\n $.extend(this, {\n virtual: true,\n forcedEnabled: true,\n _virtualMin: 0,\n _virtualMax: 0\n });\n },\n virtualSize: function (min, max) {\n if (this._virtualMin !== min || this._virtualMax !== max) {\n this._virtualMin = min;\n this._virtualMax = max;\n this.update();\n }\n },\n outOfBounds: function (offset) {\n return offset > this.max || offset < this.min;\n },\n forceEnabled: function () {\n this.forcedEnabled = true;\n },\n getSize: function () {\n return this.container[0][this.measure];\n },\n getTotal: function () {\n return this.element[0][this.scrollSize];\n },\n rescale: function (scale) {\n this.scale = scale;\n },\n update: function (silent) {\n var that = this, total = that.virtual ? that._virtualMax : that.getTotal(), scaledTotal = total * that.scale, size = that.getSize();\n if (total === 0 && !that.forcedEnabled) {\n return;\n }\n that.max = that.virtual ? -that._virtualMin : 0;\n that.size = size;\n that.total = scaledTotal;\n that.min = Math.min(that.max, size - scaledTotal);\n that.minScale = size / total;\n that.centerOffset = (scaledTotal - size) / 2;\n that.enabled = that.forcedEnabled || scaledTotal > size;\n if (!silent) {\n that.trigger(CHANGE, that);\n }\n }\n });\n var PaneDimensions = Observable.extend({\n init: function (options) {\n var that = this;\n Observable.fn.init.call(that);\n that.x = new PaneDimension(extend({ horizontal: true }, options));\n that.y = new PaneDimension(extend({ horizontal: false }, options));\n that.container = options.container;\n that.forcedMinScale = options.minScale;\n that.maxScale = options.maxScale || 100;\n that.bind(CHANGE, options);\n },\n rescale: function (newScale) {\n this.x.rescale(newScale);\n this.y.rescale(newScale);\n this.refresh();\n },\n centerCoordinates: function () {\n return {\n x: Math.min(0, -this.x.centerOffset),\n y: Math.min(0, -this.y.centerOffset)\n };\n },\n refresh: function () {\n var that = this;\n that.x.update();\n that.y.update();\n that.enabled = that.x.enabled || that.y.enabled;\n that.minScale = that.forcedMinScale || Math.min(that.x.minScale, that.y.minScale);\n that.fitScale = Math.max(that.x.minScale, that.y.minScale);\n that.trigger(CHANGE);\n }\n });\n var PaneAxis = Observable.extend({\n init: function (options) {\n var that = this;\n extend(that, options);\n Observable.fn.init.call(that);\n },\n outOfBounds: function () {\n return this.dimension.outOfBounds(this.movable[this.axis]);\n },\n dragMove: function (delta) {\n var that = this, dimension = that.dimension, axis = that.axis, movable = that.movable, position = movable[axis] + delta;\n if (!dimension.enabled) {\n return;\n }\n if (position < dimension.min && delta < 0 || position > dimension.max && delta > 0) {\n delta *= that.resistance;\n }\n movable.translateAxis(axis, delta);\n that.trigger(CHANGE, that);\n }\n });\n var Pane = Class.extend({\n init: function (options) {\n var that = this, x, y, resistance, movable;\n extend(that, { elastic: true }, options);\n resistance = that.elastic ? 0.5 : 0;\n movable = that.movable;\n that.x = x = new PaneAxis({\n axis: 'x',\n dimension: that.dimensions.x,\n resistance: resistance,\n movable: movable\n });\n that.y = y = new PaneAxis({\n axis: 'y',\n dimension: that.dimensions.y,\n resistance: resistance,\n movable: movable\n });\n that.userEvents.bind([\n 'press',\n 'move',\n 'end',\n 'gesturestart',\n 'gesturechange'\n ], {\n gesturestart: function (e) {\n that.gesture = e;\n that.offset = that.dimensions.container.offset();\n },\n press: function (e) {\n if ($(e.event.target).closest('a').is('[data-navigate-on-press=true]')) {\n e.sender.cancel();\n }\n },\n gesturechange: function (e) {\n var previousGesture = that.gesture, previousCenter = previousGesture.center, center = e.center, scaleDelta = e.distance / previousGesture.distance, minScale = that.dimensions.minScale, maxScale = that.dimensions.maxScale, coordinates;\n if (movable.scale <= minScale && scaleDelta < 1) {\n scaleDelta += (1 - scaleDelta) * 0.8;\n }\n if (movable.scale * scaleDelta >= maxScale) {\n scaleDelta = maxScale / movable.scale;\n }\n var offsetX = movable.x + that.offset.left, offsetY = movable.y + that.offset.top;\n coordinates = {\n x: (offsetX - previousCenter.x) * scaleDelta + center.x - offsetX,\n y: (offsetY - previousCenter.y) * scaleDelta + center.y - offsetY\n };\n movable.scaleWith(scaleDelta);\n x.dragMove(coordinates.x);\n y.dragMove(coordinates.y);\n that.dimensions.rescale(movable.scale);\n that.gesture = e;\n e.preventDefault();\n },\n move: function (e) {\n if (e.event.target.tagName.match(/textarea|input/i)) {\n return;\n }\n if (x.dimension.enabled || y.dimension.enabled) {\n x.dragMove(e.x.delta);\n y.dragMove(e.y.delta);\n e.preventDefault();\n } else {\n e.touch.skip();\n }\n },\n end: function (e) {\n e.preventDefault();\n }\n });\n }\n });\n var TRANSFORM_STYLE = support.transitions.prefix + 'Transform', translate;\n if (support.hasHW3D) {\n translate = function (x, y, scale) {\n return 'translate3d(' + x + 'px,' + y + 'px,0) scale(' + scale + ')';\n };\n } else {\n translate = function (x, y, scale) {\n return 'translate(' + x + 'px,' + y + 'px) scale(' + scale + ')';\n };\n }\n var Movable = Observable.extend({\n init: function (element) {\n var that = this;\n Observable.fn.init.call(that);\n that.element = $(element);\n that.element[0].style.webkitTransformOrigin = 'left top';\n that.x = 0;\n that.y = 0;\n that.scale = 1;\n that._saveCoordinates(translate(that.x, that.y, that.scale));\n },\n translateAxis: function (axis, by) {\n this[axis] += by;\n this.refresh();\n },\n scaleTo: function (scale) {\n this.scale = scale;\n this.refresh();\n },\n scaleWith: function (scaleDelta) {\n this.scale *= scaleDelta;\n this.refresh();\n },\n translate: function (coordinates) {\n this.x += coordinates.x;\n this.y += coordinates.y;\n this.refresh();\n },\n moveAxis: function (axis, value) {\n this[axis] = value;\n this.refresh();\n },\n moveTo: function (coordinates) {\n extend(this, coordinates);\n this.refresh();\n },\n refresh: function () {\n var that = this, x = that.x, y = that.y, newCoordinates;\n if (that.round) {\n x = Math.round(x);\n y = Math.round(y);\n }\n newCoordinates = translate(x, y, that.scale);\n if (newCoordinates != that.coordinates) {\n if (kendo.support.browser.msie && kendo.support.browser.version < 10) {\n that.element[0].style.position = 'absolute';\n that.element[0].style.left = that.x + 'px';\n that.element[0].style.top = that.y + 'px';\n } else {\n that.element[0].style[TRANSFORM_STYLE] = newCoordinates;\n }\n that._saveCoordinates(newCoordinates);\n that.trigger(CHANGE);\n }\n },\n _saveCoordinates: function (coordinates) {\n this.coordinates = coordinates;\n }\n });\n function destroyDroppable(collection, widget) {\n var groupName = widget.options.group, droppables = collection[groupName], i;\n Widget.fn.destroy.call(widget);\n if (droppables.length > 1) {\n for (i = 0; i < droppables.length; i++) {\n if (droppables[i] == widget) {\n droppables.splice(i, 1);\n break;\n }\n }\n } else {\n droppables.length = 0;\n delete collection[groupName];\n }\n }\n var DropTarget = Widget.extend({\n init: function (element, options) {\n var that = this;\n Widget.fn.init.call(that, element, options);\n var group = that.options.group;\n if (!(group in dropTargets)) {\n dropTargets[group] = [that];\n } else {\n dropTargets[group].push(that);\n }\n },\n events: [\n DRAGENTER,\n DRAGLEAVE,\n DROP\n ],\n options: {\n name: 'DropTarget',\n group: 'default'\n },\n destroy: function () {\n destroyDroppable(dropTargets, this);\n },\n _trigger: function (eventName, e) {\n var that = this, draggable = draggables[that.options.group];\n if (draggable) {\n return that.trigger(eventName, extend({}, e.event, {\n draggable: draggable,\n dropTarget: e.dropTarget\n }));\n }\n },\n _over: function (e) {\n this._trigger(DRAGENTER, e);\n },\n _out: function (e) {\n this._trigger(DRAGLEAVE, e);\n },\n _drop: function (e) {\n var that = this, draggable = draggables[that.options.group];\n if (draggable) {\n draggable.dropped = !that._trigger(DROP, e);\n }\n }\n });\n DropTarget.destroyGroup = function (groupName) {\n var group = dropTargets[groupName] || dropAreas[groupName], i;\n if (group) {\n for (i = 0; i < group.length; i++) {\n Widget.fn.destroy.call(group[i]);\n }\n group.length = 0;\n delete dropTargets[groupName];\n delete dropAreas[groupName];\n }\n };\n DropTarget._cache = dropTargets;\n var DropTargetArea = DropTarget.extend({\n init: function (element, options) {\n var that = this;\n Widget.fn.init.call(that, element, options);\n var group = that.options.group;\n if (!(group in dropAreas)) {\n dropAreas[group] = [that];\n } else {\n dropAreas[group].push(that);\n }\n },\n destroy: function () {\n destroyDroppable(dropAreas, this);\n },\n options: {\n name: 'DropTargetArea',\n group: 'default',\n filter: null\n }\n });\n var Draggable = Widget.extend({\n init: function (element, options) {\n var that = this;\n Widget.fn.init.call(that, element, options);\n that._activated = false;\n that.userEvents = new UserEvents(that.element, {\n global: true,\n allowSelection: true,\n filter: that.options.filter,\n threshold: that.options.distance,\n start: proxy(that._start, that),\n hold: proxy(that._hold, that),\n move: proxy(that._drag, that),\n end: proxy(that._end, that),\n cancel: proxy(that._cancel, that),\n select: proxy(that._select, that)\n });\n if (kendo.support.touch) {\n that.element.find(that.options.filter).css('touch-action', 'none');\n }\n that._afterEndHandler = proxy(that._afterEnd, that);\n that._captureEscape = proxy(that._captureEscape, that);\n },\n events: [\n HOLD,\n DRAGSTART,\n DRAG,\n DRAGEND,\n DRAGCANCEL,\n HINTDESTROYED\n ],\n options: {\n name: 'Draggable',\n distance: kendo.support.touch ? 0 : 5,\n group: 'default',\n cursorOffset: null,\n axis: null,\n container: null,\n filter: null,\n ignore: null,\n holdToDrag: false,\n autoScroll: false,\n dropped: false\n },\n cancelHold: function () {\n this._activated = false;\n },\n _captureEscape: function (e) {\n var that = this;\n if (e.keyCode === kendo.keys.ESC) {\n that._trigger(DRAGCANCEL, { event: e });\n that.userEvents.cancel();\n }\n },\n _updateHint: function (e) {\n var that = this, coordinates, options = that.options, boundaries = that.boundaries, axis = options.axis, cursorOffset = that.options.cursorOffset;\n if (cursorOffset) {\n coordinates = {\n left: e.x.location + cursorOffset.left,\n top: e.y.location + cursorOffset.top\n };\n } else {\n that.hintOffset.left += e.x.delta;\n that.hintOffset.top += e.y.delta;\n coordinates = $.extend({}, that.hintOffset);\n }\n if (boundaries) {\n coordinates.top = within(coordinates.top, boundaries.y);\n coordinates.left = within(coordinates.left, boundaries.x);\n }\n if (axis === 'x') {\n delete coordinates.top;\n } else if (axis === 'y') {\n delete coordinates.left;\n }\n that.hint.css(coordinates);\n },\n _shouldIgnoreTarget: function (target) {\n var ignoreSelector = this.options.ignore;\n return ignoreSelector && $(target).is(ignoreSelector);\n },\n _select: function (e) {\n if (!this._shouldIgnoreTarget(e.event.target)) {\n e.preventDefault();\n }\n },\n _start: function (e) {\n var that = this, options = that.options, container = options.container ? $(options.container) : null, hint = options.hint;\n if (this._shouldIgnoreTarget(e.touch.initialTouch) || options.holdToDrag && !that._activated) {\n that.userEvents.cancel();\n return;\n }\n that.currentTarget = e.target;\n that.currentTargetOffset = getOffset(that.currentTarget);\n if (hint) {\n if (that.hint) {\n that.hint.stop(true, true).remove();\n }\n that.hint = kendo.isFunction(hint) ? $(hint.call(that, that.currentTarget)) : hint;\n var offset = getOffset(that.currentTarget);\n that.hintOffset = offset;\n that.hint.css({\n position: 'absolute',\n zIndex: 20000,\n left: offset.left,\n top: offset.top\n }).appendTo(document.body);\n that.angular('compile', function () {\n that.hint.removeAttr('ng-repeat');\n var scopeTarget = $(e.target);\n while (!scopeTarget.data('$$kendoScope') && scopeTarget.length) {\n scopeTarget = scopeTarget.parent();\n }\n return {\n elements: that.hint.get(),\n scopeFrom: scopeTarget.data('$$kendoScope')\n };\n });\n }\n draggables[options.group] = that;\n that.dropped = false;\n if (container) {\n that.boundaries = containerBoundaries(container, that.hint);\n }\n $(document).on(KEYUP, that._captureEscape);\n if (that._trigger(DRAGSTART, e)) {\n that.userEvents.cancel();\n that._afterEnd();\n }\n that.userEvents.capture();\n },\n _hold: function (e) {\n this.currentTarget = e.target;\n if (this._trigger(HOLD, e)) {\n this.userEvents.cancel();\n } else {\n this._activated = true;\n }\n },\n _drag: function (e) {\n e.preventDefault();\n var cursorElement = this._elementUnderCursor(e);\n if (this.options.autoScroll && this._cursorElement !== cursorElement) {\n this._scrollableParent = findScrollableParent(cursorElement);\n this._cursorElement = cursorElement;\n }\n this._lastEvent = e;\n this._processMovement(e, cursorElement);\n if (this.options.autoScroll) {\n if (this._scrollableParent[0]) {\n var velocity = autoScrollVelocity(e.x.location, e.y.location, scrollableViewPort(this._scrollableParent));\n this._scrollCompenstation = $.extend({}, this.hintOffset);\n this._scrollVelocity = velocity;\n if (velocity.y === 0 && velocity.x === 0) {\n clearInterval(this._scrollInterval);\n this._scrollInterval = null;\n } else if (!this._scrollInterval) {\n this._scrollInterval = setInterval($.proxy(this, '_autoScroll'), 50);\n }\n }\n }\n if (this.hint) {\n this._updateHint(e);\n }\n },\n _processMovement: function (e, cursorElement) {\n this._withDropTarget(cursorElement, function (target, targetElement) {\n if (!target) {\n if (lastDropTarget) {\n lastDropTarget._trigger(DRAGLEAVE, extend(e, { dropTarget: $(lastDropTarget.targetElement) }));\n lastDropTarget = null;\n }\n return;\n }\n if (lastDropTarget) {\n if (targetElement === lastDropTarget.targetElement) {\n return;\n }\n lastDropTarget._trigger(DRAGLEAVE, extend(e, { dropTarget: $(lastDropTarget.targetElement) }));\n }\n target._trigger(DRAGENTER, extend(e, { dropTarget: $(targetElement) }));\n lastDropTarget = extend(target, { targetElement: targetElement });\n });\n this._trigger(DRAG, extend(e, {\n dropTarget: lastDropTarget,\n elementUnderCursor: cursorElement\n }));\n },\n _autoScroll: function () {\n var parent = this._scrollableParent[0], velocity = this._scrollVelocity, compensation = this._scrollCompenstation;\n if (!parent) {\n return;\n }\n var cursorElement = this._elementUnderCursor(this._lastEvent);\n this._processMovement(this._lastEvent, cursorElement);\n var yIsScrollable, xIsScrollable;\n var isRootNode = parent === scrollableRoot()[0];\n if (isRootNode) {\n yIsScrollable = document.body.scrollHeight > $window.height();\n xIsScrollable = document.body.scrollWidth > $window.width();\n } else {\n yIsScrollable = parent.offsetHeight <= parent.scrollHeight;\n xIsScrollable = parent.offsetWidth <= parent.scrollWidth;\n }\n var yDelta = parent.scrollTop + velocity.y;\n var yInBounds = yIsScrollable && yDelta > 0 && yDelta < parent.scrollHeight;\n var xDelta = parent.scrollLeft + velocity.x;\n var xInBounds = xIsScrollable && xDelta > 0 && xDelta < parent.scrollWidth;\n if (yInBounds) {\n parent.scrollTop += velocity.y;\n }\n if (xInBounds) {\n parent.scrollLeft += velocity.x;\n }\n if (this.hint && isRootNode && (xInBounds || yInBounds)) {\n if (yInBounds) {\n compensation.top += velocity.y;\n }\n if (xInBounds) {\n compensation.left += velocity.x;\n }\n this.hint.css(compensation);\n }\n },\n _end: function (e) {\n this._withDropTarget(this._elementUnderCursor(e), function (target, targetElement) {\n if (target) {\n target._drop(extend({}, e, { dropTarget: $(targetElement) }));\n lastDropTarget = null;\n }\n });\n this._cancel(this._trigger(DRAGEND, e));\n },\n _cancel: function (isDefaultPrevented) {\n var that = this;\n that._scrollableParent = null;\n this._cursorElement = null;\n clearInterval(this._scrollInterval);\n that._activated = false;\n if (that.hint && !that.dropped) {\n setTimeout(function () {\n that.hint.stop(true, true);\n if (isDefaultPrevented) {\n that._afterEndHandler();\n } else {\n that.hint.animate(that.currentTargetOffset, 'fast', that._afterEndHandler);\n }\n }, 0);\n } else {\n that._afterEnd();\n }\n },\n _trigger: function (eventName, e) {\n var that = this;\n return that.trigger(eventName, extend({}, e.event, {\n x: e.x,\n y: e.y,\n currentTarget: that.currentTarget,\n initialTarget: e.touch ? e.touch.initialTouch : null,\n dropTarget: e.dropTarget,\n elementUnderCursor: e.elementUnderCursor\n }));\n },\n _elementUnderCursor: function (e) {\n var target = elementUnderCursor(e), hint = this.hint;\n if (hint && contains(hint[0], target)) {\n hint.hide();\n target = elementUnderCursor(e);\n if (!target) {\n target = elementUnderCursor(e);\n }\n hint.show();\n }\n return target;\n },\n _withDropTarget: function (element, callback) {\n var result, group = this.options.group, targets = dropTargets[group], areas = dropAreas[group];\n if (targets && targets.length || areas && areas.length) {\n result = checkTarget(element, targets, areas);\n if (result) {\n callback(result.target, result.targetElement);\n } else {\n callback();\n }\n }\n },\n destroy: function () {\n var that = this;\n Widget.fn.destroy.call(that);\n that._afterEnd();\n that.userEvents.destroy();\n this._scrollableParent = null;\n this._cursorElement = null;\n clearInterval(this._scrollInterval);\n that.currentTarget = null;\n },\n _afterEnd: function () {\n var that = this;\n if (that.hint) {\n that.hint.remove();\n }\n delete draggables[that.options.group];\n that.trigger('destroy');\n that.trigger(HINTDESTROYED);\n $(document).off(KEYUP, that._captureEscape);\n }\n });\n kendo.ui.plugin(DropTarget);\n kendo.ui.plugin(DropTargetArea);\n kendo.ui.plugin(Draggable);\n kendo.TapCapture = TapCapture;\n kendo.containerBoundaries = containerBoundaries;\n extend(kendo.ui, {\n Pane: Pane,\n PaneDimensions: PaneDimensions,\n Movable: Movable\n });\n function scrollableViewPort(element) {\n var root = scrollableRoot()[0], offset, top, left;\n if (element[0] === root) {\n top = root.scrollTop;\n left = root.scrollLeft;\n return {\n top: top,\n left: left,\n bottom: top + $window.height(),\n right: left + $window.width()\n };\n } else {\n offset = element.offset();\n offset.bottom = offset.top + element.height();\n offset.right = offset.left + element.width();\n return offset;\n }\n }\n function scrollableRoot() {\n return $(kendo.support.browser.edge || kendo.support.browser.safari ? document.body : document.documentElement);\n }\n function findScrollableParent(element) {\n var root = scrollableRoot();\n if (!element || element === document.body || element === document.documentElement) {\n return root;\n }\n var parent = $(element)[0];\n while (parent && !kendo.isScrollable(parent) && parent !== document.body) {\n parent = parent.parentNode;\n }\n if (parent === document.body) {\n return root;\n }\n return $(parent);\n }\n function autoScrollVelocity(mouseX, mouseY, rect) {\n var velocity = {\n x: 0,\n y: 0\n };\n var AUTO_SCROLL_AREA = 50;\n if (mouseX - rect.left < AUTO_SCROLL_AREA) {\n velocity.x = -(AUTO_SCROLL_AREA - (mouseX - rect.left));\n } else if (rect.right - mouseX < AUTO_SCROLL_AREA) {\n velocity.x = AUTO_SCROLL_AREA - (rect.right - mouseX);\n }\n if (mouseY - rect.top < AUTO_SCROLL_AREA) {\n velocity.y = -(AUTO_SCROLL_AREA - (mouseY - rect.top));\n } else if (rect.bottom - mouseY < AUTO_SCROLL_AREA) {\n velocity.y = AUTO_SCROLL_AREA - (rect.bottom - mouseY);\n }\n return velocity;\n }\n kendo.ui.Draggable.utils = {\n autoScrollVelocity: autoScrollVelocity,\n scrollableViewPort: scrollableViewPort,\n findScrollableParent: findScrollableParent\n };\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('kendo.mobile.scroller', [\n 'kendo.fx',\n 'kendo.draganddrop'\n ], f);\n}(function () {\n var __meta__ = {\n id: 'mobile.scroller',\n name: 'Scroller',\n category: 'mobile',\n description: 'The Kendo Mobile Scroller widget enables touch friendly kinetic scrolling for the contents of a given DOM element.',\n depends: [\n 'fx',\n 'draganddrop'\n ]\n };\n (function ($, undefined) {\n var kendo = window.kendo, mobile = kendo.mobile, fx = kendo.effects, ui = mobile.ui, proxy = $.proxy, extend = $.extend, Widget = ui.Widget, Class = kendo.Class, Movable = kendo.ui.Movable, Pane = kendo.ui.Pane, PaneDimensions = kendo.ui.PaneDimensions, Transition = fx.Transition, Animation = fx.Animation, abs = Math.abs, SNAPBACK_DURATION = 500, SCROLLBAR_OPACITY = 0.7, FRICTION = 0.96, VELOCITY_MULTIPLIER = 10, MAX_VELOCITY = 55, OUT_OF_BOUNDS_FRICTION = 0.5, ANIMATED_SCROLLER_PRECISION = 5, RELEASECLASS = 'km-scroller-release', REFRESHCLASS = 'km-scroller-refresh', PULL = 'pull', CHANGE = 'change', RESIZE = 'resize', SCROLL = 'scroll', MOUSE_WHEEL_ID = 2;\n var ZoomSnapBack = Animation.extend({\n init: function (options) {\n var that = this;\n Animation.fn.init.call(that);\n extend(that, options);\n that.userEvents.bind('gestureend', proxy(that.start, that));\n that.tapCapture.bind('press', proxy(that.cancel, that));\n },\n enabled: function () {\n return this.movable.scale < this.dimensions.minScale;\n },\n done: function () {\n return this.dimensions.minScale - this.movable.scale < 0.01;\n },\n tick: function () {\n var movable = this.movable;\n movable.scaleWith(1.1);\n this.dimensions.rescale(movable.scale);\n },\n onEnd: function () {\n var movable = this.movable;\n movable.scaleTo(this.dimensions.minScale);\n this.dimensions.rescale(movable.scale);\n }\n });\n var DragInertia = Animation.extend({\n init: function (options) {\n var that = this;\n Animation.fn.init.call(that);\n extend(that, options, {\n transition: new Transition({\n axis: options.axis,\n movable: options.movable,\n onEnd: function () {\n that._end();\n }\n })\n });\n that.tapCapture.bind('press', function () {\n that.cancel();\n });\n that.userEvents.bind('end', proxy(that.start, that));\n that.userEvents.bind('gestureend', proxy(that.start, that));\n that.userEvents.bind('tap', proxy(that.onEnd, that));\n },\n onCancel: function () {\n this.transition.cancel();\n },\n freeze: function (location) {\n var that = this;\n that.cancel();\n that._moveTo(location);\n },\n onEnd: function () {\n var that = this;\n if (that.paneAxis.outOfBounds()) {\n that._snapBack();\n } else {\n that._end();\n }\n },\n done: function () {\n return abs(this.velocity) < 1;\n },\n start: function (e) {\n var that = this, velocity;\n if (!that.dimension.enabled) {\n return;\n }\n if (that.paneAxis.outOfBounds()) {\n if (that.transition._started) {\n that.transition.cancel();\n that.velocity = Math.min(e.touch[that.axis].velocity * that.velocityMultiplier, MAX_VELOCITY);\n Animation.fn.start.call(that);\n } else {\n that._snapBack();\n }\n } else {\n velocity = e.touch.id === MOUSE_WHEEL_ID ? 0 : e.touch[that.axis].velocity;\n that.velocity = Math.max(Math.min(velocity * that.velocityMultiplier, MAX_VELOCITY), -MAX_VELOCITY);\n that.tapCapture.captureNext();\n Animation.fn.start.call(that);\n }\n },\n tick: function () {\n var that = this, dimension = that.dimension, friction = that.paneAxis.outOfBounds() ? OUT_OF_BOUNDS_FRICTION : that.friction, delta = that.velocity *= friction, location = that.movable[that.axis] + delta;\n if (!that.elastic && dimension.outOfBounds(location)) {\n location = Math.max(Math.min(location, dimension.max), dimension.min);\n that.velocity = 0;\n }\n that.movable.moveAxis(that.axis, location);\n },\n _end: function () {\n this.tapCapture.cancelCapture();\n this.end();\n },\n _snapBack: function () {\n var that = this, dimension = that.dimension, snapBack = that.movable[that.axis] > dimension.max ? dimension.max : dimension.min;\n that._moveTo(snapBack);\n },\n _moveTo: function (location) {\n this.transition.moveTo({\n location: location,\n duration: SNAPBACK_DURATION,\n ease: Transition.easeOutExpo\n });\n }\n });\n var AnimatedScroller = Animation.extend({\n init: function (options) {\n var that = this;\n kendo.effects.Animation.fn.init.call(this);\n extend(that, options, {\n origin: {},\n destination: {},\n offset: {}\n });\n },\n tick: function () {\n this._updateCoordinates();\n this.moveTo(this.origin);\n },\n done: function () {\n return abs(this.offset.y) < ANIMATED_SCROLLER_PRECISION && abs(this.offset.x) < ANIMATED_SCROLLER_PRECISION;\n },\n onEnd: function () {\n this.moveTo(this.destination);\n if (this.callback) {\n this.callback.call();\n }\n },\n setCoordinates: function (from, to) {\n this.offset = {};\n this.origin = from;\n this.destination = to;\n },\n setCallback: function (callback) {\n if (callback && kendo.isFunction(callback)) {\n this.callback = callback;\n } else {\n callback = undefined;\n }\n },\n _updateCoordinates: function () {\n this.offset = {\n x: (this.destination.x - this.origin.x) / 4,\n y: (this.destination.y - this.origin.y) / 4\n };\n this.origin = {\n y: this.origin.y + this.offset.y,\n x: this.origin.x + this.offset.x\n };\n }\n });\n var ScrollBar = Class.extend({\n init: function (options) {\n var that = this, horizontal = options.axis === 'x', element = $('
    ');\n extend(that, options, {\n element: element,\n elementSize: 0,\n movable: new Movable(element),\n scrollMovable: options.movable,\n alwaysVisible: options.alwaysVisible,\n size: horizontal ? 'width' : 'height'\n });\n that.scrollMovable.bind(CHANGE, proxy(that.refresh, that));\n that.container.append(element);\n if (options.alwaysVisible) {\n that.show();\n }\n },\n refresh: function () {\n var that = this, axis = that.axis, dimension = that.dimension, paneSize = dimension.size, scrollMovable = that.scrollMovable, sizeRatio = paneSize / dimension.total, position = Math.round(-scrollMovable[axis] * sizeRatio), size = Math.round(paneSize * sizeRatio);\n if (sizeRatio >= 1) {\n this.element.css('display', 'none');\n } else {\n this.element.css('display', '');\n }\n if (position + size > paneSize) {\n size = paneSize - position;\n } else if (position < 0) {\n size += position;\n position = 0;\n }\n if (that.elementSize != size) {\n that.element.css(that.size, size + 'px');\n that.elementSize = size;\n }\n that.movable.moveAxis(axis, position);\n },\n show: function () {\n this.element.css({\n opacity: SCROLLBAR_OPACITY,\n visibility: 'visible'\n });\n },\n hide: function () {\n if (!this.alwaysVisible) {\n this.element.css({ opacity: 0 });\n }\n }\n });\n var Scroller = Widget.extend({\n init: function (element, options) {\n var that = this;\n Widget.fn.init.call(that, element, options);\n element = that.element;\n that._native = that.options.useNative && kendo.support.hasNativeScrolling;\n if (that._native) {\n element.addClass('km-native-scroller').prepend('
    ');\n extend(that, {\n scrollElement: element,\n fixedContainer: element.children().first()\n });\n return;\n }\n element.css('overflow', 'hidden').addClass('km-scroll-wrapper').wrapInner('
    ').prepend('
    ');\n var inner = element.children().eq(1), tapCapture = new kendo.TapCapture(element), movable = new Movable(inner), dimensions = new PaneDimensions({\n element: inner,\n container: element,\n forcedEnabled: that.options.zoom\n }), avoidScrolling = this.options.avoidScrolling, userEvents = new kendo.UserEvents(element, {\n touchAction: 'pan-y',\n fastTap: true,\n allowSelection: true,\n preventDragEvent: true,\n captureUpIfMoved: true,\n multiTouch: that.options.zoom,\n supportDoubleTap: that.options.supportDoubleTap,\n start: function (e) {\n dimensions.refresh();\n var velocityX = abs(e.x.velocity), velocityY = abs(e.y.velocity), horizontalSwipe = velocityX * 2 >= velocityY, originatedFromFixedContainer = $.contains(that.fixedContainer[0], e.event.target), verticalSwipe = velocityY * 2 >= velocityX;\n if (!originatedFromFixedContainer && !avoidScrolling(e) && that.enabled && (dimensions.x.enabled && horizontalSwipe || dimensions.y.enabled && verticalSwipe)) {\n userEvents.capture();\n } else {\n userEvents.cancel();\n }\n }\n }), pane = new Pane({\n movable: movable,\n dimensions: dimensions,\n userEvents: userEvents,\n elastic: that.options.elastic\n }), zoomSnapBack = new ZoomSnapBack({\n movable: movable,\n dimensions: dimensions,\n userEvents: userEvents,\n tapCapture: tapCapture\n }), animatedScroller = new AnimatedScroller({\n moveTo: function (coordinates) {\n that.scrollTo(coordinates.x, coordinates.y);\n }\n });\n movable.bind(CHANGE, function () {\n that.scrollTop = -movable.y;\n that.scrollLeft = -movable.x;\n that.trigger(SCROLL, {\n scrollTop: that.scrollTop,\n scrollLeft: that.scrollLeft\n });\n });\n if (that.options.mousewheelScrolling) {\n element.on('DOMMouseScroll mousewheel', proxy(this, '_wheelScroll'));\n }\n extend(that, {\n movable: movable,\n dimensions: dimensions,\n zoomSnapBack: zoomSnapBack,\n animatedScroller: animatedScroller,\n userEvents: userEvents,\n pane: pane,\n tapCapture: tapCapture,\n pulled: false,\n enabled: true,\n scrollElement: inner,\n scrollTop: 0,\n scrollLeft: 0,\n fixedContainer: element.children().first()\n });\n that._initAxis('x');\n that._initAxis('y');\n that._wheelEnd = function () {\n that._wheel = false;\n that.userEvents.end(0, that._wheelY);\n };\n dimensions.refresh();\n if (that.options.pullToRefresh) {\n that._initPullToRefresh();\n }\n },\n _wheelScroll: function (e) {\n if (e.ctrlKey) {\n return;\n }\n if (!this._wheel) {\n this._wheel = true;\n this._wheelY = 0;\n this.userEvents.press(0, this._wheelY);\n }\n clearTimeout(this._wheelTimeout);\n this._wheelTimeout = setTimeout(this._wheelEnd, 50);\n var delta = kendo.wheelDeltaY(e);\n if (delta) {\n this._wheelY += delta;\n this.userEvents.move(0, this._wheelY);\n }\n e.preventDefault();\n },\n makeVirtual: function () {\n this.dimensions.y.makeVirtual();\n },\n virtualSize: function (min, max) {\n this.dimensions.y.virtualSize(min, max);\n },\n height: function () {\n return this.dimensions.y.size;\n },\n scrollHeight: function () {\n return this.scrollElement[0].scrollHeight;\n },\n scrollWidth: function () {\n return this.scrollElement[0].scrollWidth;\n },\n options: {\n name: 'Scroller',\n zoom: false,\n pullOffset: 140,\n visibleScrollHints: false,\n elastic: true,\n useNative: false,\n mousewheelScrolling: true,\n avoidScrolling: function () {\n return false;\n },\n pullToRefresh: false,\n messages: {\n pullTemplate: 'Pull to refresh',\n releaseTemplate: 'Release to refresh',\n refreshTemplate: 'Refreshing'\n }\n },\n events: [\n PULL,\n SCROLL,\n RESIZE\n ],\n _resize: function () {\n if (!this._native) {\n this.contentResized();\n }\n },\n setOptions: function (options) {\n var that = this;\n Widget.fn.setOptions.call(that, options);\n if (options.pullToRefresh) {\n that._initPullToRefresh();\n }\n },\n reset: function () {\n if (this._native) {\n this.scrollElement.scrollTop(0);\n } else {\n this.movable.moveTo({\n x: 0,\n y: 0\n });\n this._scale(1);\n }\n },\n contentResized: function () {\n this.dimensions.refresh();\n if (this.pane.x.outOfBounds()) {\n this.movable.moveAxis('x', this.dimensions.x.min);\n }\n if (this.pane.y.outOfBounds()) {\n this.movable.moveAxis('y', this.dimensions.y.min);\n }\n },\n zoomOut: function () {\n var dimensions = this.dimensions;\n dimensions.refresh();\n this._scale(dimensions.fitScale);\n this.movable.moveTo(dimensions.centerCoordinates());\n },\n enable: function () {\n this.enabled = true;\n },\n disable: function () {\n this.enabled = false;\n },\n scrollTo: function (x, y) {\n if (this._native) {\n this.scrollElement.scrollLeft(abs(x));\n this.scrollElement.scrollTop(abs(y));\n } else {\n this.dimensions.refresh();\n this.movable.moveTo({\n x: x,\n y: y\n });\n }\n },\n animatedScrollTo: function (x, y, callback) {\n var from, to;\n if (this._native) {\n this.scrollTo(x, y);\n } else {\n from = {\n x: this.movable.x,\n y: this.movable.y\n };\n to = {\n x: x,\n y: y\n };\n this.animatedScroller.setCoordinates(from, to);\n this.animatedScroller.setCallback(callback);\n this.animatedScroller.start();\n }\n },\n pullHandled: function () {\n var that = this;\n that.refreshHint.removeClass(REFRESHCLASS);\n that.hintContainer.html(that.pullTemplate({}));\n that.yinertia.onEnd();\n that.xinertia.onEnd();\n that.userEvents.cancel();\n },\n destroy: function () {\n Widget.fn.destroy.call(this);\n if (this.userEvents) {\n this.userEvents.destroy();\n }\n },\n _scale: function (scale) {\n this.dimensions.rescale(scale);\n this.movable.scaleTo(scale);\n },\n _initPullToRefresh: function () {\n var that = this;\n that.dimensions.y.forceEnabled();\n that.pullTemplate = kendo.template(that.options.messages.pullTemplate);\n that.releaseTemplate = kendo.template(that.options.messages.releaseTemplate);\n that.refreshTemplate = kendo.template(that.options.messages.refreshTemplate);\n that.scrollElement.prepend('' + that.pullTemplate({}) + '');\n that.refreshHint = that.scrollElement.children().first();\n that.hintContainer = that.refreshHint.children('.km-template');\n that.pane.y.bind('change', proxy(that._paneChange, that));\n that.userEvents.bind('end', proxy(that._dragEnd, that));\n },\n _dragEnd: function () {\n var that = this;\n if (!that.pulled) {\n return;\n }\n that.pulled = false;\n that.refreshHint.removeClass(RELEASECLASS).addClass(REFRESHCLASS);\n that.hintContainer.html(that.refreshTemplate({}));\n that.yinertia.freeze(that.options.pullOffset / 2);\n that.trigger('pull');\n },\n _paneChange: function () {\n var that = this;\n if (that.movable.y / OUT_OF_BOUNDS_FRICTION > that.options.pullOffset) {\n if (!that.pulled) {\n that.pulled = true;\n that.refreshHint.removeClass(REFRESHCLASS).addClass(RELEASECLASS);\n that.hintContainer.html(that.releaseTemplate({}));\n }\n } else if (that.pulled) {\n that.pulled = false;\n that.refreshHint.removeClass(RELEASECLASS);\n that.hintContainer.html(that.pullTemplate({}));\n }\n },\n _initAxis: function (axis) {\n var that = this, movable = that.movable, dimension = that.dimensions[axis], tapCapture = that.tapCapture, paneAxis = that.pane[axis], scrollBar = new ScrollBar({\n axis: axis,\n movable: movable,\n dimension: dimension,\n container: that.element,\n alwaysVisible: that.options.visibleScrollHints\n });\n dimension.bind(CHANGE, function () {\n scrollBar.refresh();\n });\n paneAxis.bind(CHANGE, function () {\n scrollBar.show();\n });\n that[axis + 'inertia'] = new DragInertia({\n axis: axis,\n paneAxis: paneAxis,\n movable: movable,\n tapCapture: tapCapture,\n userEvents: that.userEvents,\n dimension: dimension,\n elastic: that.options.elastic,\n friction: that.options.friction || FRICTION,\n velocityMultiplier: that.options.velocityMultiplier || VELOCITY_MULTIPLIER,\n end: function () {\n scrollBar.hide();\n that.trigger('scrollEnd', {\n axis: axis,\n scrollTop: that.scrollTop,\n scrollLeft: that.scrollLeft\n });\n }\n });\n }\n });\n ui.plugin(Scroller);\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('kendo.virtuallist', ['kendo.data'], f);\n}(function () {\n var __meta__ = {\n id: 'virtuallist',\n name: 'VirtualList',\n category: 'framework',\n depends: ['data'],\n hidden: true\n };\n (function ($, undefined) {\n var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, DataBoundWidget = ui.DataBoundWidget, proxy = $.proxy, percentageUnitsRegex = /^\\d+(\\.\\d+)?%$/i, WRAPPER = 'k-virtual-wrap', VIRTUALLIST = 'k-virtual-list', CONTENT = 'k-virtual-content', LIST = 'k-list', HEADER = 'k-group-header', VIRTUALITEM = 'k-virtual-item', ITEM = 'k-item', HEIGHTCONTAINER = 'k-height-container', GROUPITEM = 'k-group', SELECTED = 'k-state-selected', FOCUSED = 'k-state-focused', HOVER = 'k-state-hover', CHANGE = 'change', CLICK = 'click', LISTBOUND = 'listBound', ITEMCHANGE = 'itemChange', ACTIVATE = 'activate', DEACTIVATE = 'deactivate', VIRTUAL_LIST_NS = '.VirtualList';\n function lastFrom(array) {\n return array[array.length - 1];\n }\n function toArray(value) {\n return value instanceof Array ? value : [value];\n }\n function isPrimitive(dataItem) {\n return typeof dataItem === 'string' || typeof dataItem === 'number' || typeof dataItem === 'boolean';\n }\n function getItemCount(screenHeight, listScreens, itemHeight) {\n return Math.ceil(screenHeight * listScreens / itemHeight);\n }\n function appendChild(parent, className, tagName) {\n var element = document.createElement(tagName || 'div');\n if (className) {\n element.className = className;\n }\n parent.appendChild(element);\n return element;\n }\n function getDefaultItemHeight() {\n var mockList = $('
    '), lineHeight;\n mockList.css({\n position: 'absolute',\n left: '-200000px',\n visibility: 'hidden'\n });\n mockList.appendTo(document.body);\n lineHeight = parseFloat(kendo.getComputedStyles(mockList.find('.k-item')[0], ['line-height'])['line-height']);\n mockList.remove();\n return lineHeight;\n }\n function bufferSizes(screenHeight, listScreens, opposite) {\n return {\n down: screenHeight * opposite,\n up: screenHeight * (listScreens - 1 - opposite)\n };\n }\n function listValidator(options, screenHeight) {\n var downThreshold = (options.listScreens - 1 - options.threshold) * screenHeight;\n var upThreshold = options.threshold * screenHeight;\n return function (list, scrollTop, lastScrollTop) {\n if (scrollTop > lastScrollTop) {\n return scrollTop - list.top < downThreshold;\n } else {\n return list.top === 0 || scrollTop - list.top > upThreshold;\n }\n };\n }\n function scrollCallback(element, callback) {\n return function (force) {\n return callback(element.scrollTop, force);\n };\n }\n function syncList(reorder) {\n return function (list, force) {\n reorder(list.items, list.index, force);\n return list;\n };\n }\n function position(element, y) {\n if (kendo.support.browser.msie && kendo.support.browser.version < 10) {\n element.style.top = y + 'px';\n } else {\n element.style.webkitTransform = 'translateY(' + y + 'px)';\n element.style.transform = 'translateY(' + y + 'px)';\n }\n }\n function map2(callback, templates) {\n return function (arr1, arr2) {\n for (var i = 0, len = arr1.length; i < len; i++) {\n callback(arr1[i], arr2[i], templates);\n if (arr2[i].item) {\n this.trigger(ITEMCHANGE, {\n item: $(arr1[i]),\n data: arr2[i].item,\n ns: kendo.ui\n });\n }\n }\n };\n }\n function reshift(items, diff) {\n var range;\n if (diff > 0) {\n range = items.splice(0, diff);\n items.push.apply(items, range);\n } else {\n range = items.splice(diff, -diff);\n items.unshift.apply(items, range);\n }\n return range;\n }\n function render(element, data, templates) {\n var itemTemplate = templates.template;\n element = $(element);\n if (!data.item) {\n itemTemplate = templates.placeholderTemplate;\n }\n if (data.index === 0 && this.header && data.group) {\n this.header.html(templates.fixedGroupTemplate(data.group));\n }\n this.angular('cleanup', function () {\n return { elements: [element] };\n });\n element.attr('data-uid', data.item ? data.item.uid : '').attr('data-offset-index', data.index);\n if (this.options.columns && this.options.columns.length && data.item) {\n element.html(renderColumns(this.options, data.item, templates));\n } else {\n element.html(itemTemplate(data.item || {}));\n }\n element.toggleClass(FOCUSED, data.current);\n element.toggleClass(SELECTED, data.selected);\n element.toggleClass('k-first', data.newGroup);\n element.toggleClass('k-last', data.isLastGroupedItem);\n element.toggleClass('k-loading-item', !data.item);\n if (data.index !== 0 && data.newGroup) {\n $('
    ').appendTo(element).html(templates.groupTemplate(data.group));\n }\n if (data.top !== undefined) {\n position(element[0], data.top);\n }\n this.angular('compile', function () {\n return {\n elements: [element],\n data: [{\n dataItem: data.item,\n group: data.group,\n newGroup: data.newGroup\n }]\n };\n });\n }\n function renderColumns(options, dataItem, templates) {\n var item = '';\n for (var i = 0; i < options.columns.length; i++) {\n var currentWidth = options.columns[i].width;\n var currentWidthInt = parseInt(currentWidth, 10);\n var widthStyle = '';\n if (currentWidth) {\n widthStyle += 'style=\\'width:';\n widthStyle += currentWidthInt;\n widthStyle += percentageUnitsRegex.test(currentWidth) ? '%' : 'px';\n widthStyle += ';\\'';\n }\n item += '';\n item += templates['column' + i](dataItem);\n item += '';\n }\n return item;\n }\n function mapChangedItems(selected, itemsToMatch) {\n var itemsLength = itemsToMatch.length;\n var selectedLength = selected.length;\n var dataItem;\n var found;\n var i, j;\n var changed = [];\n var unchanged = [];\n if (selectedLength) {\n for (i = 0; i < selectedLength; i++) {\n dataItem = selected[i];\n found = false;\n for (j = 0; j < itemsLength; j++) {\n if (dataItem === itemsToMatch[j]) {\n found = true;\n changed.push({\n index: i,\n item: dataItem\n });\n break;\n }\n }\n if (!found) {\n unchanged.push(dataItem);\n }\n }\n }\n return {\n changed: changed,\n unchanged: unchanged\n };\n }\n function isActivePromise(promise) {\n return promise && promise.state() !== 'resolved';\n }\n var VirtualList = DataBoundWidget.extend({\n init: function (element, options) {\n var that = this;\n that.bound(false);\n that._fetching = false;\n Widget.fn.init.call(that, element, options);\n if (!that.options.itemHeight) {\n that.options.itemHeight = getDefaultItemHeight();\n }\n options = that.options;\n that.element.addClass(LIST + ' ' + VIRTUALLIST).attr('role', 'listbox');\n that.content = that.element.wrap('
    ').parent();\n that.wrapper = that.content.wrap('
    ').parent();\n that.header = that.content.before('
    ').prev();\n if (options.columns && options.columns.length) {\n that.element.removeClass(LIST);\n }\n that.element.on('mouseenter' + VIRTUAL_LIST_NS, 'li:not(.k-loading-item)', function () {\n $(this).addClass(HOVER);\n }).on('mouseleave' + VIRTUAL_LIST_NS, 'li', function () {\n $(this).removeClass(HOVER);\n });\n that._values = toArray(that.options.value);\n that._selectedDataItems = [];\n that._selectedIndexes = [];\n that._rangesList = {};\n that._promisesList = [];\n that._optionID = kendo.guid();\n that._templates();\n that.setDataSource(options.dataSource);\n that.content.on('scroll' + VIRTUAL_LIST_NS, kendo.throttle(function () {\n that._renderItems();\n that._triggerListBound();\n }, options.delay));\n that._selectable();\n },\n options: {\n name: 'VirtualList',\n autoBind: true,\n delay: 100,\n height: null,\n listScreens: 4,\n threshold: 0.5,\n itemHeight: null,\n oppositeBuffer: 1,\n type: 'flat',\n selectable: false,\n value: [],\n dataValueField: null,\n template: '#:data#',\n placeholderTemplate: 'loading...',\n groupTemplate: '#:data#',\n fixedGroupTemplate: '#:data#',\n mapValueTo: 'index',\n valueMapper: null\n },\n events: [\n CHANGE,\n CLICK,\n LISTBOUND,\n ITEMCHANGE,\n ACTIVATE,\n DEACTIVATE\n ],\n setOptions: function (options) {\n Widget.fn.setOptions.call(this, options);\n if (this._selectProxy && this.options.selectable === false) {\n this.element.off(CLICK, '.' + VIRTUALITEM, this._selectProxy);\n } else if (!this._selectProxy && this.options.selectable) {\n this._selectable();\n }\n this._templates();\n this.refresh();\n },\n items: function () {\n return $(this._items);\n },\n destroy: function () {\n this.wrapper.off(VIRTUAL_LIST_NS);\n this.dataSource.unbind(CHANGE, this._refreshHandler);\n Widget.fn.destroy.call(this);\n },\n setDataSource: function (source) {\n var that = this;\n var dataSource = source || {};\n var value;\n dataSource = $.isArray(dataSource) ? { data: dataSource } : dataSource;\n dataSource = kendo.data.DataSource.create(dataSource);\n if (that.dataSource) {\n that.dataSource.unbind(CHANGE, that._refreshHandler);\n that._clean();\n that.bound(false);\n that._deferValueSet = true;\n value = that.value();\n that.value([]);\n that.mute(function () {\n that.value(value);\n });\n } else {\n that._refreshHandler = $.proxy(that.refresh, that);\n }\n that.dataSource = dataSource.bind(CHANGE, that._refreshHandler);\n that.setDSFilter(dataSource.filter());\n if (dataSource.view().length !== 0) {\n that.refresh();\n } else if (that.options.autoBind) {\n dataSource.fetch();\n }\n },\n skip: function () {\n return this.dataSource.currentRangeStart();\n },\n _triggerListBound: function () {\n var that = this;\n var skip = that.skip();\n if (that.bound() && !that._selectingValue && that._skip !== skip) {\n that._skip = skip;\n that.trigger(LISTBOUND);\n }\n },\n _getValues: function (dataItems) {\n var getter = this._valueGetter;\n return $.map(dataItems, function (dataItem) {\n return getter(dataItem);\n });\n },\n _highlightSelectedItems: function () {\n for (var i = 0; i < this._selectedDataItems.length; i++) {\n var item = this._getElementByDataItem(this._selectedDataItems[i]);\n if (item.length) {\n item.addClass(SELECTED);\n }\n }\n },\n refresh: function (e) {\n var that = this;\n var action = e && e.action;\n var isItemChange = action === 'itemchange';\n var filtered = this.isFiltered();\n var result;\n if (that._mute) {\n return;\n }\n that._deferValueSet = false;\n if (!that._fetching) {\n if (filtered) {\n that.focus(0);\n }\n that._createList();\n if (!action && that._values.length && !filtered && !that.options.skipUpdateOnBind && !that._emptySearch) {\n that._selectingValue = true;\n that.bound(true);\n that.value(that._values, true).done(function () {\n that._selectingValue = false;\n that._triggerListBound();\n });\n } else {\n that.bound(true);\n that._highlightSelectedItems();\n that._triggerListBound();\n }\n } else {\n if (that._renderItems) {\n that._renderItems(true);\n }\n that._triggerListBound();\n }\n if (isItemChange || action === 'remove') {\n result = mapChangedItems(that._selectedDataItems, e.items);\n if (result.changed.length) {\n if (isItemChange) {\n that.trigger('selectedItemChange', { items: result.changed });\n } else {\n that.value(that._getValues(result.unchanged));\n }\n }\n }\n that._fetching = false;\n },\n removeAt: function (position) {\n this._selectedIndexes.splice(position, 1);\n this._values.splice(position, 1);\n return {\n position: position,\n dataItem: this._selectedDataItems.splice(position, 1)[0]\n };\n },\n setValue: function (value) {\n this._values = toArray(value);\n },\n value: function (value, _forcePrefetch) {\n var that = this;\n if (value === undefined) {\n return that._values.slice();\n }\n if (value === null) {\n value = [];\n }\n value = toArray(value);\n if (!that._valueDeferred || that._valueDeferred.state() === 'resolved') {\n that._valueDeferred = $.Deferred();\n }\n var shouldClear = that.options.selectable === 'multiple' && that.select().length && value.length;\n if (shouldClear || !value.length) {\n that.select(-1);\n }\n that._values = value;\n if (that.bound() && !that._mute && !that._deferValueSet || _forcePrefetch) {\n that._prefetchByValue(value);\n }\n return that._valueDeferred;\n },\n _checkValuesOrder: function (value) {\n if (this._removedAddedIndexes && this._removedAddedIndexes.length === value.length) {\n var newValue = this._removedAddedIndexes.slice();\n this._removedAddedIndexes = null;\n return newValue;\n }\n return value;\n },\n _prefetchByValue: function (value) {\n var that = this, dataView = that._dataView, valueGetter = that._valueGetter, mapValueTo = that.options.mapValueTo, item, match = false, forSelection = [];\n for (var i = 0; i < value.length; i++) {\n for (var idx = 0; idx < dataView.length; idx++) {\n item = dataView[idx].item;\n if (item) {\n match = isPrimitive(item) ? value[i] === item : value[i] === valueGetter(item);\n if (match) {\n forSelection.push(dataView[idx].index);\n }\n }\n }\n }\n if (forSelection.length === value.length) {\n that._values = [];\n that.select(forSelection);\n return;\n }\n if (typeof that.options.valueMapper === 'function') {\n that.options.valueMapper({\n value: this.options.selectable === 'multiple' ? value : value[0],\n success: function (response) {\n if (mapValueTo === 'index') {\n that.mapValueToIndex(response);\n } else if (mapValueTo === 'dataItem') {\n that.mapValueToDataItem(response);\n }\n }\n });\n } else {\n if (!that.value()[0]) {\n that.select([-1]);\n } else {\n that._selectingValue = false;\n that._triggerListBound();\n }\n }\n },\n mapValueToIndex: function (indexes) {\n if (indexes === undefined || indexes === -1 || indexes === null) {\n indexes = [];\n } else {\n indexes = toArray(indexes);\n }\n if (!indexes.length) {\n indexes = [-1];\n } else {\n var removed = this._deselect([]).removed;\n if (removed.length) {\n this._triggerChange(removed, []);\n }\n }\n this.select(indexes);\n },\n mapValueToDataItem: function (dataItems) {\n var removed, added;\n if (dataItems === undefined || dataItems === null) {\n dataItems = [];\n } else {\n dataItems = toArray(dataItems);\n }\n if (!dataItems.length) {\n this.select([-1]);\n } else {\n removed = $.map(this._selectedDataItems, function (item, index) {\n return {\n index: index,\n dataItem: item\n };\n });\n added = $.map(dataItems, function (item, index) {\n return {\n index: index,\n dataItem: item\n };\n });\n this._selectedDataItems = dataItems;\n this._selectedIndexes = [];\n for (var i = 0; i < this._selectedDataItems.length; i++) {\n var item = this._getElementByDataItem(this._selectedDataItems[i]);\n this._selectedIndexes.push(this._getIndecies(item)[0]);\n item.addClass(SELECTED);\n }\n this._triggerChange(removed, added);\n if (this._valueDeferred) {\n this._valueDeferred.resolve();\n }\n }\n },\n deferredRange: function (index) {\n var dataSource = this.dataSource;\n var take = this.itemCount;\n var ranges = this._rangesList;\n var result = $.Deferred();\n var defs = [];\n var low = Math.floor(index / take) * take;\n var high = Math.ceil(index / take) * take;\n var pages = high === low ? [high] : [\n low,\n high\n ];\n $.each(pages, function (_, skip) {\n var end = skip + take;\n var existingRange = ranges[skip];\n var deferred;\n if (!existingRange || existingRange.end !== end) {\n deferred = $.Deferred();\n ranges[skip] = {\n end: end,\n deferred: deferred\n };\n dataSource._multiplePrefetch(skip, take, function () {\n deferred.resolve();\n });\n } else {\n deferred = existingRange.deferred;\n }\n defs.push(deferred);\n });\n $.when.apply($, defs).then(function () {\n result.resolve();\n });\n return result;\n },\n prefetch: function (indexes) {\n var that = this, take = this.itemCount, isEmptyList = !that._promisesList.length;\n if (!isActivePromise(that._activeDeferred)) {\n that._activeDeferred = $.Deferred();\n that._promisesList = [];\n }\n $.each(indexes, function (_, index) {\n that._promisesList.push(that.deferredRange(that._getSkip(index, take)));\n });\n if (isEmptyList) {\n $.when.apply($, that._promisesList).done(function () {\n that._promisesList = [];\n that._activeDeferred.resolve();\n });\n }\n return that._activeDeferred;\n },\n _findDataItem: function (view, index) {\n var group;\n if (this.options.type === 'group') {\n for (var i = 0; i < view.length; i++) {\n group = view[i].items;\n if (group.length <= index) {\n index = index - group.length;\n } else {\n return group[index];\n }\n }\n }\n return view[index];\n },\n _getRange: function (skip, take) {\n return this.dataSource._findRange(skip, Math.min(skip + take, this.dataSource.total()));\n },\n dataItemByIndex: function (index) {\n var that = this;\n var take = that.itemCount;\n var skip = that._getSkip(index, take);\n var view = this._getRange(skip, take);\n if (!that._getRange(skip, take).length) {\n return null;\n }\n if (that.options.type === 'group') {\n kendo.ui.progress($(that.wrapper), true);\n that.mute(function () {\n that.dataSource.range(skip, take, function () {\n kendo.ui.progress($(that.wrapper), false);\n });\n view = that.dataSource.view();\n });\n }\n return that._findDataItem(view, [index - skip]);\n },\n selectedDataItems: function () {\n return this._selectedDataItems.slice();\n },\n scrollWith: function (value) {\n this.content.scrollTop(this.content.scrollTop() + value);\n },\n scrollTo: function (y) {\n this.content.scrollTop(y);\n },\n scrollToIndex: function (index) {\n this.scrollTo(index * this.options.itemHeight);\n },\n focus: function (candidate) {\n var element, index, data, current, itemHeight = this.options.itemHeight, id = this._optionID, triggerEvent = true;\n if (candidate === undefined) {\n current = this.element.find('.' + FOCUSED);\n return current.length ? current : null;\n }\n if (typeof candidate === 'function') {\n data = this.dataSource.flatView();\n for (var idx = 0; idx < data.length; idx++) {\n if (candidate(data[idx])) {\n candidate = idx;\n break;\n }\n }\n }\n if (candidate instanceof Array) {\n candidate = lastFrom(candidate);\n }\n if (isNaN(candidate)) {\n element = $(candidate);\n index = parseInt($(element).attr('data-offset-index'), 10);\n } else {\n index = candidate;\n element = this._getElementByIndex(index);\n }\n if (index === -1) {\n this.element.find('.' + FOCUSED).removeClass(FOCUSED);\n this._focusedIndex = undefined;\n return;\n }\n if (element.length) {\n if (element.hasClass(FOCUSED)) {\n triggerEvent = false;\n }\n if (this._focusedIndex !== undefined) {\n current = this._getElementByIndex(this._focusedIndex);\n current.removeClass(FOCUSED).removeAttr('id');\n if (triggerEvent) {\n this.trigger(DEACTIVATE);\n }\n }\n this._focusedIndex = index;\n element.addClass(FOCUSED).attr('id', id);\n var position = this._getElementLocation(index);\n if (position === 'top') {\n this.scrollTo(index * itemHeight);\n } else if (position === 'bottom') {\n this.scrollTo(index * itemHeight + itemHeight - this._screenHeight);\n } else if (position === 'outScreen') {\n this.scrollTo(index * itemHeight);\n }\n if (triggerEvent) {\n this.trigger(ACTIVATE);\n }\n } else {\n this._focusedIndex = index;\n this.items().removeClass(FOCUSED);\n this.scrollToIndex(index);\n }\n },\n focusIndex: function () {\n return this._focusedIndex;\n },\n focusFirst: function () {\n this.scrollTo(0);\n this.focus(0);\n },\n focusLast: function () {\n var lastIndex = this.dataSource.total();\n this.scrollTo(this.heightContainer.offsetHeight);\n this.focus(lastIndex - 1);\n },\n focusPrev: function () {\n var index = this._focusedIndex;\n var current;\n if (!isNaN(index) && index > 0) {\n index -= 1;\n this.focus(index);\n current = this.focus();\n if (current && current.hasClass('k-loading-item')) {\n index += 1;\n this.focus(index);\n }\n return index;\n } else {\n index = this.dataSource.total() - 1;\n this.focus(index);\n return index;\n }\n },\n focusNext: function () {\n var index = this._focusedIndex;\n var lastIndex = this.dataSource.total() - 1;\n var current;\n if (!isNaN(index) && index < lastIndex) {\n index += 1;\n this.focus(index);\n current = this.focus();\n if (current && current.hasClass('k-loading-item')) {\n index -= 1;\n this.focus(index);\n }\n return index;\n } else {\n index = 0;\n this.focus(index);\n return index;\n }\n },\n _triggerChange: function (removed, added) {\n removed = removed || [];\n added = added || [];\n if (removed.length || added.length) {\n this.trigger(CHANGE, {\n removed: removed,\n added: added\n });\n }\n },\n select: function (candidate) {\n var that = this, indices, initialIndices, singleSelection = that.options.selectable !== 'multiple', prefetchStarted = isActivePromise(that._activeDeferred), filtered = this.isFiltered(), isAlreadySelected, deferred, result, removed = [];\n if (candidate === undefined) {\n return that._selectedIndexes.slice();\n }\n if (!that._selectDeferred || that._selectDeferred.state() === 'resolved') {\n that._selectDeferred = $.Deferred();\n }\n indices = that._getIndecies(candidate);\n isAlreadySelected = singleSelection && !filtered && lastFrom(indices) === lastFrom(this._selectedIndexes);\n removed = that._deselectCurrentValues(indices);\n if (removed.length || !indices.length || isAlreadySelected) {\n that._triggerChange(removed);\n if (that._valueDeferred) {\n that._valueDeferred.resolve().promise();\n }\n return that._selectDeferred.resolve().promise();\n }\n if (indices.length === 1 && indices[0] === -1) {\n indices = [];\n }\n initialIndices = indices;\n result = that._deselect(indices);\n removed = result.removed;\n indices = result.indices;\n if (singleSelection) {\n prefetchStarted = false;\n if (indices.length) {\n indices = [lastFrom(indices)];\n }\n }\n var done = function () {\n var added = that._select(indices);\n if (initialIndices.length === indices.length || singleSelection) {\n that.focus(indices);\n }\n that._triggerChange(removed, added);\n if (that._valueDeferred) {\n that._valueDeferred.resolve();\n }\n that._selectDeferred.resolve();\n };\n deferred = that.prefetch(indices);\n if (!prefetchStarted) {\n if (deferred) {\n deferred.done(done);\n } else {\n done();\n }\n }\n return that._selectDeferred.promise();\n },\n bound: function (bound) {\n if (bound === undefined) {\n return this._listCreated;\n }\n this._listCreated = bound;\n },\n mute: function (callback) {\n this._mute = true;\n proxy(callback(), this);\n this._mute = false;\n },\n setDSFilter: function (filter) {\n this._lastDSFilter = $.extend({}, filter);\n },\n isFiltered: function () {\n if (!this._lastDSFilter) {\n this.setDSFilter(this.dataSource.filter());\n }\n return !kendo.data.Query.compareFilters(this.dataSource.filter(), this._lastDSFilter);\n },\n skipUpdate: $.noop,\n _getElementByIndex: function (index) {\n return this.items().filter(function (idx, element) {\n return index === parseInt($(element).attr('data-offset-index'), 10);\n });\n },\n _getElementByDataItem: function (dataItem) {\n var dataView = this._dataView, valueGetter = this._valueGetter, element, match;\n for (var i = 0; i < dataView.length; i++) {\n match = dataView[i].item && isPrimitive(dataView[i].item) ? dataView[i].item === dataItem : dataView[i].item && dataItem && valueGetter(dataView[i].item) == valueGetter(dataItem);\n if (match) {\n element = dataView[i];\n break;\n }\n }\n return element ? this._getElementByIndex(element.index) : $();\n },\n _clean: function () {\n this.result = undefined;\n this._lastScrollTop = undefined;\n this._skip = undefined;\n $(this.heightContainer).remove();\n this.heightContainer = undefined;\n this.element.empty();\n },\n _height: function () {\n var hasData = !!this.dataSource.view().length, height = this.options.height, itemHeight = this.options.itemHeight, total = this.dataSource.total();\n if (!hasData) {\n height = 0;\n } else if (height / itemHeight > total) {\n height = total * itemHeight;\n }\n return height;\n },\n setScreenHeight: function () {\n var height = this._height();\n this.content.height(height);\n this._screenHeight = height;\n },\n screenHeight: function () {\n return this._screenHeight;\n },\n _getElementLocation: function (index) {\n var scrollTop = this.content.scrollTop(), screenHeight = this._screenHeight, itemHeight = this.options.itemHeight, yPosition = index * itemHeight, yDownPostion = yPosition + itemHeight, screenEnd = scrollTop + screenHeight, position;\n if (yPosition === scrollTop - itemHeight || yDownPostion > scrollTop && yPosition < scrollTop) {\n position = 'top';\n } else if (yPosition === screenEnd || yPosition < screenEnd && screenEnd < yDownPostion) {\n position = 'bottom';\n } else if (yPosition >= scrollTop && yPosition <= scrollTop + (screenHeight - itemHeight)) {\n position = 'inScreen';\n } else {\n position = 'outScreen';\n }\n return position;\n },\n _templates: function () {\n var options = this.options;\n var templates = {\n template: options.template,\n placeholderTemplate: options.placeholderTemplate,\n groupTemplate: options.groupTemplate,\n fixedGroupTemplate: options.fixedGroupTemplate\n };\n if (options.columns) {\n for (var i = 0; i < options.columns.length; i++) {\n var currentColumn = options.columns[i];\n var templateText = currentColumn.field ? currentColumn.field.toString() : 'text';\n templates['column' + i] = currentColumn.template || '#: ' + templateText + '#';\n }\n }\n for (var key in templates) {\n if (typeof templates[key] !== 'function') {\n templates[key] = kendo.template(templates[key] || '');\n }\n }\n this.templates = templates;\n },\n _generateItems: function (element, count) {\n var items = [], item, itemHeight = this.options.itemHeight + 'px';\n while (count-- > 0) {\n item = document.createElement('li');\n item.tabIndex = -1;\n item.className = VIRTUALITEM + ' ' + ITEM;\n item.setAttribute('role', 'option');\n item.style.height = itemHeight;\n item.style.minHeight = itemHeight;\n element.appendChild(item);\n items.push(item);\n }\n return items;\n },\n _saveInitialRanges: function () {\n var ranges = this.dataSource._ranges;\n var deferred = $.Deferred();\n deferred.resolve();\n this._rangesList = {};\n for (var i = 0; i < ranges.length; i++) {\n this._rangesList[ranges[i].start] = {\n end: ranges[i].end,\n deferred: deferred\n };\n }\n },\n _createList: function () {\n var that = this, content = that.content.get(0), options = that.options, dataSource = that.dataSource;\n if (that.bound()) {\n that._clean();\n }\n that._saveInitialRanges();\n that._buildValueGetter();\n that.setScreenHeight();\n that.itemCount = getItemCount(that._screenHeight, options.listScreens, options.itemHeight);\n if (that.itemCount > dataSource.total()) {\n that.itemCount = dataSource.total();\n }\n that._items = that._generateItems(that.element[0], that.itemCount);\n that._setHeight(options.itemHeight * dataSource.total());\n that.options.type = (dataSource.group() || []).length ? 'group' : 'flat';\n if (that.options.type === 'flat') {\n that.header.hide();\n } else {\n that.header.show();\n }\n that.getter = that._getter(function () {\n that._renderItems(true);\n });\n that._onScroll = function (scrollTop, force) {\n var getList = that._listItems(that.getter);\n return that._fixedHeader(scrollTop, getList(scrollTop, force));\n };\n that._renderItems = that._whenChanged(scrollCallback(content, that._onScroll), syncList(that._reorderList(that._items, $.proxy(render, that))));\n that._renderItems();\n that._calculateGroupPadding(that._screenHeight);\n that._calculateColumnsHeaderPadding();\n },\n _setHeight: function (height) {\n var currentHeight, heightContainer = this.heightContainer;\n if (!heightContainer) {\n heightContainer = this.heightContainer = appendChild(this.content[0], HEIGHTCONTAINER);\n } else {\n currentHeight = heightContainer.offsetHeight;\n }\n if (height !== currentHeight) {\n heightContainer.innerHTML = '';\n while (height > 0) {\n var padHeight = Math.min(height, 250000);\n appendChild(heightContainer).style.height = padHeight + 'px';\n height -= padHeight;\n }\n }\n },\n _getter: function () {\n var lastRequestedRange = null, dataSource = this.dataSource, lastRangeStart = dataSource.skip(), type = this.options.type, pageSize = this.itemCount, flatGroups = {};\n if (dataSource.pageSize() < pageSize) {\n this.mute(function () {\n dataSource.pageSize(pageSize);\n });\n }\n return function (index, rangeStart) {\n var that = this;\n if (!dataSource.inRange(rangeStart, pageSize)) {\n if (lastRequestedRange !== rangeStart) {\n lastRequestedRange = rangeStart;\n lastRangeStart = rangeStart;\n if (that._getterDeferred) {\n that._getterDeferred.reject();\n }\n that._getterDeferred = that.deferredRange(rangeStart);\n that._getterDeferred.then(function () {\n var firstItemIndex = that._indexConstraint(that.content[0].scrollTop);\n that._getterDeferred = null;\n if (rangeStart <= firstItemIndex && firstItemIndex <= rangeStart + pageSize) {\n that._fetching = true;\n dataSource.range(rangeStart, pageSize);\n }\n });\n }\n return null;\n } else {\n if (lastRangeStart !== rangeStart) {\n this.mute(function () {\n dataSource.range(rangeStart, pageSize);\n lastRangeStart = rangeStart;\n });\n }\n var result;\n if (type === 'group') {\n if (!flatGroups[rangeStart]) {\n var flatGroup = flatGroups[rangeStart] = [];\n var groups = dataSource.view();\n for (var i = 0, len = groups.length; i < len; i++) {\n var group = groups[i];\n for (var j = 0, groupLength = group.items.length; j < groupLength; j++) {\n flatGroup.push({\n item: group.items[j],\n group: group.value\n });\n }\n }\n }\n result = flatGroups[rangeStart][index - rangeStart];\n } else {\n result = dataSource.view()[index - rangeStart];\n }\n return result;\n }\n };\n },\n _fixedHeader: function (scrollTop, list) {\n var group = this.currentVisibleGroup, itemHeight = this.options.itemHeight, firstVisibleDataItemIndex = Math.floor((scrollTop - list.top) / itemHeight), firstVisibleDataItem = list.items[firstVisibleDataItemIndex];\n if (firstVisibleDataItem && firstVisibleDataItem.item) {\n var firstVisibleGroup = firstVisibleDataItem.group;\n if (firstVisibleGroup !== group) {\n var fixedGroupText = firstVisibleGroup || '';\n this.header.html(this.templates.fixedGroupTemplate(fixedGroupText));\n this.currentVisibleGroup = firstVisibleGroup;\n }\n }\n return list;\n },\n _itemMapper: function (item, index, value) {\n var listType = this.options.type, itemHeight = this.options.itemHeight, currentIndex = this._focusedIndex, selected = false, current = false, newGroup = false, group = null, match = false, valueGetter = this._valueGetter;\n if (listType === 'group') {\n if (item) {\n newGroup = index === 0 || this._currentGroup !== false && this._currentGroup !== item.group;\n this._currentGroup = item.group;\n }\n group = item ? item.group : null;\n item = item ? item.item : null;\n }\n if (this.options.mapValueTo === 'dataItem' && this._selectedDataItems.length && item) {\n for (var i = 0; i < this._selectedDataItems.length; i++) {\n match = valueGetter(this._selectedDataItems[i]) === valueGetter(item);\n if (match) {\n selected = true;\n break;\n }\n }\n } else if (!this.isFiltered() && value.length && item) {\n for (var j = 0; j < value.length; j++) {\n match = isPrimitive(item) ? value[j] === item : value[j] === valueGetter(item);\n if (match) {\n value.splice(j, 1);\n selected = true;\n break;\n }\n }\n }\n if (currentIndex === index) {\n current = true;\n }\n return {\n item: item ? item : null,\n group: group,\n newGroup: newGroup,\n selected: selected,\n current: current,\n index: index,\n top: index * itemHeight\n };\n },\n _range: function (index) {\n var itemCount = this.itemCount, value = this._values.slice(), items = [], item;\n this._view = {};\n this._currentGroup = false;\n for (var i = index, length = index + itemCount; i < length; i++) {\n item = this._itemMapper(this.getter(i, index), i, value);\n if (items[items.length - 1]) {\n items[items.length - 1].isLastGroupedItem = item.newGroup;\n }\n items.push(item);\n this._view[item.index] = item;\n }\n this._dataView = items;\n return items;\n },\n _getDataItemsCollection: function (scrollTop, lastScrollTop) {\n var items = this._range(this._listIndex(scrollTop, lastScrollTop));\n return {\n index: items.length ? items[0].index : 0,\n top: items.length ? items[0].top : 0,\n items: items\n };\n },\n _listItems: function () {\n var screenHeight = this._screenHeight, options = this.options;\n var theValidator = listValidator(options, screenHeight);\n return $.proxy(function (value, force) {\n var result = this.result, lastScrollTop = this._lastScrollTop;\n if (force || !result || !theValidator(result, value, lastScrollTop)) {\n result = this._getDataItemsCollection(value, lastScrollTop);\n }\n this._lastScrollTop = value;\n this.result = result;\n return result;\n }, this);\n },\n _whenChanged: function (getter, callback) {\n var current;\n return function (force) {\n var theNew = getter(force);\n if (theNew !== current) {\n current = theNew;\n callback(theNew, force);\n }\n };\n },\n _reorderList: function (list, reorder) {\n var that = this;\n var length = list.length;\n var currentOffset = -Infinity;\n reorder = $.proxy(map2(reorder, this.templates), this);\n return function (list2, offset, force) {\n var diff = offset - currentOffset;\n var range, range2;\n if (force || Math.abs(diff) >= length) {\n range = list;\n range2 = list2;\n } else {\n range = reshift(list, diff);\n range2 = diff > 0 ? list2.slice(-diff) : list2.slice(0, -diff);\n }\n reorder(range, range2, that.bound());\n currentOffset = offset;\n };\n },\n _bufferSizes: function () {\n var options = this.options;\n return bufferSizes(this._screenHeight, options.listScreens, options.oppositeBuffer);\n },\n _indexConstraint: function (position) {\n var itemCount = this.itemCount, itemHeight = this.options.itemHeight, total = this.dataSource.total();\n return Math.min(Math.max(total - itemCount, 0), Math.max(0, Math.floor(position / itemHeight)));\n },\n _listIndex: function (scrollTop, lastScrollTop) {\n var buffers = this._bufferSizes(), position;\n position = scrollTop - (scrollTop > lastScrollTop ? buffers.down : buffers.up);\n return this._indexConstraint(position);\n },\n _selectable: function () {\n if (this.options.selectable) {\n this._selectProxy = $.proxy(this, '_clickHandler');\n this.element.on(CLICK + VIRTUAL_LIST_NS, '.' + VIRTUALITEM, this._selectProxy);\n }\n },\n getElementIndex: function (element) {\n if (!(element instanceof jQuery)) {\n return undefined;\n }\n return parseInt(element.attr('data-offset-index'), 10);\n },\n _getIndecies: function (candidate) {\n var result = [], data;\n if (typeof candidate === 'function') {\n data = this.dataSource.flatView();\n for (var idx = 0; idx < data.length; idx++) {\n if (candidate(data[idx])) {\n result.push(idx);\n break;\n }\n }\n }\n if (typeof candidate === 'number') {\n result.push(candidate);\n }\n var elementIndex = this.getElementIndex(candidate);\n if (!isNaN(elementIndex)) {\n result.push(elementIndex);\n }\n if (candidate instanceof Array) {\n result = candidate;\n }\n return result;\n },\n _deselect: function (indices) {\n var removed = [], selectedIndex, dataItem, selectedIndexes = this._selectedIndexes, selectedDataItems = this._selectedDataItems, position = 0, selectable = this.options.selectable, removedindexesCounter = 0, valueGetter = this._valueGetter, item, match, result = null;\n indices = indices.slice();\n if (selectable === true || !indices.length) {\n for (var idx = 0; idx < selectedIndexes.length; idx++) {\n if (selectedIndexes[idx] !== undefined) {\n this._getElementByIndex(selectedIndexes[idx]).removeClass(SELECTED);\n } else if (selectedDataItems[idx]) {\n this._getElementByDataItem(selectedDataItems[idx]).removeClass(SELECTED);\n }\n removed.push({\n index: selectedIndexes[idx],\n position: idx,\n dataItem: selectedDataItems[idx]\n });\n }\n this._values = [];\n this._selectedDataItems = [];\n this._selectedIndexes = [];\n } else if (selectable === 'multiple') {\n for (var i = 0; i < indices.length; i++) {\n result = null;\n position = $.inArray(indices[i], selectedIndexes);\n dataItem = this.dataItemByIndex(indices[i]);\n if (position === -1 && dataItem) {\n for (var j = 0; j < selectedDataItems.length; j++) {\n match = isPrimitive(dataItem) ? selectedDataItems[j] === dataItem : valueGetter(selectedDataItems[j]) === valueGetter(dataItem);\n if (match) {\n item = this._getElementByIndex(indices[i]);\n result = this._deselectSingleItem(item, j, indices[i], removedindexesCounter);\n }\n }\n } else {\n selectedIndex = selectedIndexes[position];\n if (selectedIndex !== undefined) {\n item = this._getElementByIndex(selectedIndex);\n result = this._deselectSingleItem(item, position, selectedIndex, removedindexesCounter);\n }\n }\n if (result) {\n indices.splice(i, 1);\n removed.push(result);\n removedindexesCounter++;\n i--;\n }\n }\n }\n return {\n indices: indices,\n removed: removed\n };\n },\n _deselectSingleItem: function (item, position, selectedIndex, removedindexesCounter) {\n var dataItem;\n if (!item.hasClass('k-state-selected')) {\n return;\n }\n item.removeClass(SELECTED);\n this._values.splice(position, 1);\n this._selectedIndexes.splice(position, 1);\n dataItem = this._selectedDataItems.splice(position, 1)[0];\n return {\n index: selectedIndex,\n position: position + removedindexesCounter,\n dataItem: dataItem\n };\n },\n _deselectCurrentValues: function (indices) {\n var children = this.element[0].children;\n var value, index, position;\n var values = this._values;\n var removed = [];\n var idx = 0;\n var j;\n if (this.options.selectable !== 'multiple' || !this.isFiltered()) {\n return [];\n }\n if (indices[0] === -1) {\n $(children).removeClass('k-state-selected');\n removed = $.map(this._selectedDataItems.slice(0), function (dataItem, idx) {\n return {\n dataItem: dataItem,\n position: idx\n };\n });\n this._selectedIndexes = [];\n this._selectedDataItems = [];\n this._values = [];\n return removed;\n }\n for (; idx < indices.length; idx++) {\n position = -1;\n index = indices[idx];\n if (this.dataItemByIndex(index)) {\n value = this._valueGetter(this.dataItemByIndex(index));\n }\n for (j = 0; j < values.length; j++) {\n if (value == values[j]) {\n position = j;\n break;\n }\n }\n if (position > -1) {\n removed.push(this.removeAt(position));\n $(children[index]).removeClass('k-state-selected');\n }\n }\n return removed;\n },\n _getSkip: function (index, take) {\n var page = index < take ? 1 : Math.floor(index / take) + 1;\n return (page - 1) * take;\n },\n _select: function (indexes) {\n var that = this, singleSelection = this.options.selectable !== 'multiple', dataSource = this.dataSource, dataItem, oldSkip, take = this.itemCount, valueGetter = this._valueGetter, added = [];\n if (singleSelection) {\n that._selectedIndexes = [];\n that._selectedDataItems = [];\n that._values = [];\n }\n oldSkip = dataSource.skip();\n $.each(indexes, function (_, index) {\n var skip = that._getSkip(index, take);\n that.mute(function () {\n dataSource.range(skip, take);\n dataItem = that._findDataItem(dataSource.view(), [index - skip]);\n that._selectedIndexes.push(index);\n that._selectedDataItems.push(dataItem);\n that._values.push(isPrimitive(dataItem) ? dataItem : valueGetter(dataItem));\n added.push({\n index: index,\n dataItem: dataItem\n });\n that._getElementByIndex(index).addClass(SELECTED);\n dataSource.range(oldSkip, take);\n });\n });\n that._values = that._checkValuesOrder(that._values);\n return added;\n },\n _clickHandler: function (e) {\n var item = $(e.currentTarget);\n if (!e.isDefaultPrevented() && item.attr('data-uid')) {\n this.trigger(CLICK, { item: item });\n }\n },\n _buildValueGetter: function () {\n this._valueGetter = kendo.getter(this.options.dataValueField);\n },\n _calculateGroupPadding: function (height) {\n var firstItem = this.items().first(), groupHeader = this.header, padding = 0;\n if (groupHeader[0] && groupHeader[0].style.display !== 'none') {\n if (height !== 'auto') {\n padding = kendo.support.scrollbar();\n }\n padding += parseFloat(firstItem.css('border-right-width'), 10) + parseFloat(firstItem.children('.k-group').css('right'), 10);\n groupHeader.css('padding-right', padding);\n }\n },\n _calculateColumnsHeaderPadding: function () {\n if (this.options.columns && this.options.columns.length) {\n var isRtl = kendo.support.isRtl(this.wrapper);\n var scrollbar = kendo.support.scrollbar();\n var columnsHeader = this.content.parent().parent().find('.k-grid-header');\n var total = this.dataSource.total();\n columnsHeader.css(isRtl ? 'padding-left' : 'padding-right', total ? scrollbar : 0);\n }\n }\n });\n kendo.ui.VirtualList = VirtualList;\n kendo.ui.plugin(VirtualList);\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('kendo.dropdownlist', [\n 'kendo.list',\n 'kendo.mobile.scroller',\n 'kendo.virtuallist'\n ], f);\n}(function () {\n var __meta__ = {\n id: 'dropdownlist',\n name: 'DropDownList',\n category: 'web',\n description: 'The DropDownList widget displays a list of values and allows the selection of a single value from the list.',\n depends: ['list'],\n features: [\n {\n id: 'mobile-scroller',\n name: 'Mobile scroller',\n description: 'Support for kinetic scrolling in mobile device',\n depends: ['mobile.scroller']\n },\n {\n id: 'virtualization',\n name: 'VirtualList',\n description: 'Support for virtualization',\n depends: ['virtuallist']\n }\n ]\n };\n (function ($, undefined) {\n var kendo = window.kendo, ui = kendo.ui, List = ui.List, Select = ui.Select, support = kendo.support, activeElement = kendo._activeElement, ObservableObject = kendo.data.ObservableObject, keys = kendo.keys, ns = '.kendoDropDownList', nsFocusEvent = ns + 'FocusEvent', DISABLED = 'disabled', READONLY = 'readonly', CHANGE = 'change', FOCUSED = 'k-state-focused', DEFAULT = 'k-state-default', STATEDISABLED = 'k-state-disabled', ARIA_DISABLED = 'aria-disabled', CLICKEVENTS = 'click' + ns + ' touchend' + ns, HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, TABINDEX = 'tabindex', STATE_FILTER = 'filter', STATE_ACCEPT = 'accept', MSG_INVALID_OPTION_LABEL = 'The `optionLabel` option is not valid due to missing fields. Define a custom optionLabel as shown here http://docs.telerik.com/kendo-ui/api/javascript/ui/dropdownlist#configuration-optionLabel', proxy = $.proxy;\n var DropDownList = Select.extend({\n init: function (element, options) {\n var that = this;\n var index = options && options.index;\n var optionLabel, text, disabled;\n that.ns = ns;\n options = $.isArray(options) ? { dataSource: options } : options;\n Select.fn.init.call(that, element, options);\n options = that.options;\n element = that.element.on('focus' + ns, proxy(that._focusHandler, that));\n that._focusInputHandler = $.proxy(that._focusInput, that);\n that.optionLabel = $();\n that._optionLabel();\n that._inputTemplate();\n that._reset();\n that._prev = '';\n that._word = '';\n that._wrapper();\n that._tabindex();\n that.wrapper.data(TABINDEX, that.wrapper.attr(TABINDEX));\n that._span();\n that._popup();\n that._mobile();\n that._dataSource();\n that._ignoreCase();\n that._filterHeader();\n that._aria();\n that.wrapper.attr('aria-live', 'polite');\n that._enable();\n that._attachFocusHandlers();\n that._oldIndex = that.selectedIndex = -1;\n if (index !== undefined) {\n options.index = index;\n }\n that._initialIndex = options.index;\n that.requireValueMapper(that.options);\n that._initList();\n that._cascade();\n that.one('set', function (e) {\n if (!e.sender.listView.bound() && that.hasOptionLabel()) {\n that._textAccessor(that._optionLabelText());\n }\n });\n if (options.autoBind) {\n that.dataSource.fetch();\n } else if (that.selectedIndex === -1) {\n text = options.text || '';\n if (!text) {\n optionLabel = options.optionLabel;\n if (optionLabel && options.index === 0) {\n text = optionLabel;\n } else if (that._isSelect) {\n text = element.children(':selected').text();\n }\n }\n that._textAccessor(text);\n }\n disabled = $(that.element).parents('fieldset').is(':disabled');\n if (disabled) {\n that.enable(false);\n }\n that.listView.bind('click', function (e) {\n e.preventDefault();\n });\n kendo.notify(that);\n },\n options: {\n name: 'DropDownList',\n enabled: true,\n autoBind: true,\n index: 0,\n text: null,\n value: null,\n delay: 500,\n height: 200,\n dataTextField: '',\n dataValueField: '',\n optionLabel: '',\n cascadeFrom: '',\n cascadeFromField: '',\n cascadeFromParentField: '',\n ignoreCase: true,\n animation: {},\n filter: 'none',\n minLength: 1,\n enforceMinLength: false,\n virtual: false,\n template: null,\n valueTemplate: null,\n optionLabelTemplate: null,\n groupTemplate: '#:data#',\n fixedGroupTemplate: '#:data#',\n autoWidth: false,\n popup: null\n },\n events: [\n 'open',\n 'close',\n CHANGE,\n 'select',\n 'filtering',\n 'dataBinding',\n 'dataBound',\n 'cascade',\n 'set',\n 'kendoKeydown'\n ],\n setOptions: function (options) {\n Select.fn.setOptions.call(this, options);\n this.listView.setOptions(this._listOptions(options));\n this._optionLabel();\n this._inputTemplate();\n this._accessors();\n this._filterHeader();\n this._enable();\n this._aria();\n if (!this.value() && this.hasOptionLabel()) {\n this.select(0);\n }\n },\n destroy: function () {\n var that = this;\n Select.fn.destroy.call(that);\n that.wrapper.off(ns);\n that.wrapper.off(nsFocusEvent);\n that.element.off(ns);\n that._inputWrapper.off(ns);\n that._arrow.off();\n that._arrow = null;\n that._arrowIcon = null;\n that.optionLabel.off();\n if (that.filterInput) {\n that.filterInput.off(nsFocusEvent);\n }\n },\n open: function () {\n var that = this;\n var isFiltered = that.dataSource.filter() ? that.dataSource.filter().filters.length > 0 : false;\n if (that.popup.visible()) {\n return;\n }\n if (!that.listView.bound() || that._state === STATE_ACCEPT) {\n that._open = true;\n that._state = 'rebind';\n if (that.filterInput) {\n that.filterInput.val('');\n that._prev = '';\n }\n if (that.filterInput && that.options.minLength !== 1 && !isFiltered) {\n that.refresh();\n that.popup.one('activate', that._focusInputHandler);\n that.popup.open();\n that._resizeFilterInput();\n } else {\n that._filterSource();\n }\n } else if (that._allowOpening()) {\n that._focusFilter = true;\n that.popup.one('activate', that._focusInputHandler);\n that.popup._hovered = true;\n that.popup.open();\n that._resizeFilterInput();\n that._focusItem();\n }\n },\n _focusInput: function () {\n this._focusElement(this.filterInput);\n },\n _resizeFilterInput: function () {\n var filterInput = this.filterInput;\n var originalPrevent = this._prevent;\n if (!filterInput) {\n return;\n }\n var isInputActive = this.filterInput[0] === activeElement();\n var caret = kendo.caret(this.filterInput[0])[0];\n this._prevent = true;\n filterInput.css('display', 'none').css('width', this.popup.element.css('width')).css('display', 'inline-block');\n if (isInputActive) {\n filterInput.focus();\n kendo.caret(filterInput[0], caret);\n }\n this._prevent = originalPrevent;\n },\n _allowOpening: function () {\n return this.hasOptionLabel() || this.filterInput || Select.fn._allowOpening.call(this);\n },\n toggle: function (toggle) {\n this._toggle(toggle, true);\n },\n current: function (candidate) {\n var current;\n if (candidate === undefined) {\n current = this.listView.focus();\n if (!current && this.selectedIndex === 0 && this.hasOptionLabel()) {\n return this.optionLabel;\n }\n return current;\n }\n this._focus(candidate);\n },\n dataItem: function (index) {\n var that = this;\n var dataItem = null;\n if (index === null) {\n return index;\n }\n if (index === undefined) {\n dataItem = that.listView.selectedDataItems()[0];\n } else {\n if (typeof index !== 'number') {\n if (that.options.virtual) {\n return that.dataSource.getByUid($(index).data('uid'));\n }\n if (index.hasClass('k-list-optionlabel')) {\n index = -1;\n } else {\n index = $(that.items()).index(index);\n }\n } else if (that.hasOptionLabel()) {\n index -= 1;\n }\n dataItem = that.dataSource.flatView()[index];\n }\n if (!dataItem) {\n dataItem = that._optionLabelDataItem();\n }\n return dataItem;\n },\n refresh: function () {\n this.listView.refresh();\n },\n text: function (text) {\n var that = this;\n var loweredText;\n var ignoreCase = that.options.ignoreCase;\n text = text === null ? '' : text;\n if (text !== undefined) {\n if (typeof text !== 'string') {\n that._textAccessor(text);\n return;\n }\n loweredText = ignoreCase ? text.toLowerCase() : text;\n that._select(function (data) {\n data = that._text(data);\n if (ignoreCase) {\n data = (data + '').toLowerCase();\n }\n return data === loweredText;\n }).done(function () {\n that._textAccessor(that.dataItem() || text);\n });\n } else {\n return that._textAccessor();\n }\n },\n _clearFilter: function () {\n $(this.filterInput).val('');\n Select.fn._clearFilter.call(this);\n },\n value: function (value) {\n var that = this;\n var listView = that.listView;\n var dataSource = that.dataSource;\n if (value === undefined) {\n value = that._accessor() || that.listView.value()[0];\n return value === undefined || value === null ? '' : value;\n }\n that.requireValueMapper(that.options, value);\n if (value || !that.hasOptionLabel()) {\n that._initialIndex = null;\n }\n this.trigger('set', { value: value });\n if (that._request && that.options.cascadeFrom && that.listView.bound()) {\n if (that._valueSetter) {\n dataSource.unbind(CHANGE, that._valueSetter);\n }\n that._valueSetter = proxy(function () {\n that.value(value);\n }, that);\n dataSource.one(CHANGE, that._valueSetter);\n return;\n }\n if (that._isFilterEnabled() && listView.bound() && listView.isFiltered()) {\n that._clearFilter();\n } else {\n that._fetchData();\n }\n listView.value(value).done(function () {\n that._old = that._valueBeforeCascade = that._accessor();\n that._oldIndex = that.selectedIndex;\n });\n },\n hasOptionLabel: function () {\n return this.optionLabel && !!this.optionLabel[0];\n },\n _optionLabel: function () {\n var that = this;\n var options = that.options;\n var optionLabel = options.optionLabel;\n var template = options.optionLabelTemplate;\n if (!optionLabel) {\n that.optionLabel.off().remove();\n that.optionLabel = $();\n return;\n }\n if (!template) {\n template = '#:';\n if (typeof optionLabel === 'string') {\n template += 'data';\n } else {\n template += kendo.expr(options.dataTextField, 'data');\n }\n template += '#';\n }\n if (typeof template !== 'function') {\n template = kendo.template(template);\n }\n that.optionLabelTemplate = template;\n if (!that.hasOptionLabel()) {\n that.optionLabel = $('
    ').prependTo(that.list);\n }\n that.optionLabel.html(template(optionLabel)).off().on(CLICKEVENTS, proxy(that._click, that)).on(HOVEREVENTS, that._toggleHover);\n that.angular('compile', function () {\n return {\n elements: that.optionLabel,\n data: [{ dataItem: that._optionLabelDataItem() }]\n };\n });\n },\n _optionLabelText: function () {\n var optionLabel = this.options.optionLabel;\n return typeof optionLabel === 'string' ? optionLabel : this._text(optionLabel);\n },\n _optionLabelDataItem: function () {\n var that = this;\n var optionLabel = that.options.optionLabel;\n if (that.hasOptionLabel()) {\n return $.isPlainObject(optionLabel) ? new ObservableObject(optionLabel) : that._assignInstance(that._optionLabelText(), '');\n }\n return undefined;\n },\n _buildOptions: function (data) {\n var that = this;\n if (!that._isSelect) {\n return;\n }\n var value = that.listView.value()[0];\n var optionLabel = that._optionLabelDataItem();\n var optionLabelValue = optionLabel && that._value(optionLabel);\n if (value === undefined || value === null) {\n value = '';\n }\n if (optionLabel) {\n if (optionLabelValue === undefined || optionLabelValue === null) {\n optionLabelValue = '';\n }\n optionLabel = '';\n }\n that._options(data, optionLabel, value);\n if (value !== List.unifyType(that._accessor(), typeof value)) {\n that._customOption = null;\n that._custom(value);\n }\n },\n _listBound: function () {\n var that = this;\n var initialIndex = that._initialIndex;\n var filtered = that._state === STATE_FILTER;\n var data = that.dataSource.flatView();\n var dataItem;\n that._presetValue = false;\n that._renderFooter();\n that._renderNoData();\n that._toggleNoData(!data.length);\n that._resizePopup(true);\n that.popup.position();\n that._buildOptions(data);\n that._makeUnselectable();\n if (!filtered) {\n if (that._open) {\n that.toggle(that._allowOpening());\n }\n that._open = false;\n if (!that._fetch) {\n if (data.length) {\n if (!that.listView.value().length && initialIndex > -1 && initialIndex !== null) {\n that.select(initialIndex);\n }\n that._initialIndex = null;\n dataItem = that.listView.selectedDataItems()[0];\n if (dataItem && that.text() !== that._text(dataItem)) {\n that._selectValue(dataItem);\n }\n } else if (that._textAccessor() !== that._optionLabelText()) {\n that.listView.value('');\n that._selectValue(null);\n that._oldIndex = that.selectedIndex;\n }\n }\n }\n that._hideBusy();\n that.trigger('dataBound');\n },\n _listChange: function () {\n this._selectValue(this.listView.selectedDataItems()[0]);\n if (this._presetValue || this._old && this._oldIndex === -1) {\n this._oldIndex = this.selectedIndex;\n }\n },\n _filterPaste: function () {\n this._search();\n },\n _attachFocusHandlers: function () {\n var that = this;\n var wrapper = that.wrapper;\n wrapper.on('focusin' + nsFocusEvent, proxy(that._focusinHandler, that)).on('focusout' + nsFocusEvent, proxy(that._focusoutHandler, that));\n if (that.filterInput) {\n that.filterInput.on('focusin' + nsFocusEvent, proxy(that._focusinHandler, that)).on('focusout' + nsFocusEvent, proxy(that._focusoutHandler, that));\n }\n },\n _focusHandler: function () {\n this.wrapper.focus();\n },\n _focusinHandler: function () {\n this._inputWrapper.addClass(FOCUSED);\n this._prevent = false;\n },\n _focusoutHandler: function () {\n var that = this;\n var isIFrame = window.self !== window.top;\n if (!that._prevent) {\n clearTimeout(that._typingTimeout);\n if (support.mobileOS.ios && isIFrame) {\n that._change();\n } else {\n that._blur();\n }\n that._inputWrapper.removeClass(FOCUSED);\n that._prevent = true;\n that._open = false;\n that.element.blur();\n }\n },\n _wrapperMousedown: function () {\n this._prevent = !!this.filterInput;\n },\n _wrapperClick: function (e) {\n e.preventDefault();\n this.popup.unbind('activate', this._focusInputHandler);\n this._focused = this.wrapper;\n this._prevent = false;\n this._toggle();\n },\n _editable: function (options) {\n var that = this;\n var element = that.element;\n var disable = options.disable;\n var readonly = options.readonly;\n var wrapper = that.wrapper.add(that.filterInput).off(ns);\n var dropDownWrapper = that._inputWrapper.off(HOVEREVENTS);\n if (!readonly && !disable) {\n element.removeAttr(DISABLED).removeAttr(READONLY);\n dropDownWrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n wrapper.attr(TABINDEX, wrapper.data(TABINDEX)).attr(ARIA_DISABLED, false).on('keydown' + ns, that, proxy(that._keydown, that)).on(kendo.support.mousedown + ns, proxy(that._wrapperMousedown, that)).on('paste' + ns, proxy(that._filterPaste, that));\n that.wrapper.on('click' + ns, proxy(that._wrapperClick, that));\n if (!that.filterInput) {\n wrapper.on('keypress' + ns, proxy(that._keypress, that));\n } else {\n wrapper.on('input' + ns, proxy(that._search, that));\n }\n } else if (disable) {\n wrapper.removeAttr(TABINDEX);\n dropDownWrapper.addClass(STATEDISABLED).removeClass(DEFAULT);\n } else {\n dropDownWrapper.addClass(DEFAULT).removeClass(STATEDISABLED);\n }\n element.attr(DISABLED, disable).attr(READONLY, readonly);\n wrapper.attr(ARIA_DISABLED, disable);\n },\n _keydown: function (e) {\n var that = this;\n var key = e.keyCode;\n var altKey = e.altKey;\n var isInputActive;\n var handled;\n var isPopupVisible = that.popup.visible();\n if (that.filterInput) {\n isInputActive = that.filterInput[0] === activeElement();\n }\n if (key === keys.LEFT) {\n key = keys.UP;\n handled = true;\n } else if (key === keys.RIGHT) {\n key = keys.DOWN;\n handled = true;\n }\n if (handled && isInputActive) {\n return;\n }\n e.keyCode = key;\n if (altKey && key === keys.UP || key === keys.ESC) {\n that._focusElement(that.wrapper);\n }\n if (that._state === STATE_FILTER && key === keys.ESC) {\n that._clearFilter();\n that._open = false;\n that._state = STATE_ACCEPT;\n }\n if (key === keys.ENTER && that._typingTimeout && that.filterInput && isPopupVisible) {\n e.preventDefault();\n return;\n }\n if (key === keys.SPACEBAR && !isInputActive) {\n that.toggle(!isPopupVisible);\n e.preventDefault();\n }\n handled = that._move(e);\n if (handled) {\n return;\n }\n if (!isPopupVisible || !that.filterInput) {\n var current = that._focus();\n if (key === keys.HOME) {\n handled = true;\n that._firstItem();\n } else if (key === keys.END) {\n handled = true;\n that._lastItem();\n }\n if (handled) {\n if (that.trigger('select', {\n dataItem: that._getElementDataItem(that._focus()),\n item: that._focus()\n })) {\n that._focus(current);\n return;\n }\n that._select(that._focus(), true).done(function () {\n if (!isPopupVisible) {\n that._blur();\n }\n });\n e.preventDefault();\n }\n }\n if (!altKey && !handled && that.filterInput) {\n that._search();\n }\n },\n _matchText: function (text, word) {\n var ignoreCase = this.options.ignoreCase;\n if (text === undefined || text === null) {\n return false;\n }\n text = text + '';\n if (ignoreCase) {\n text = text.toLowerCase();\n }\n return text.indexOf(word) === 0;\n },\n _shuffleData: function (data, splitIndex) {\n var optionDataItem = this._optionLabelDataItem();\n if (optionDataItem) {\n data = [optionDataItem].concat(data);\n }\n return data.slice(splitIndex).concat(data.slice(0, splitIndex));\n },\n _selectNext: function () {\n var that = this;\n var data = that.dataSource.flatView();\n var dataLength = data.length + (that.hasOptionLabel() ? 1 : 0);\n var isInLoop = sameCharsOnly(that._word, that._last);\n var startIndex = that.selectedIndex;\n var oldFocusedItem;\n var text;\n if (startIndex === -1) {\n startIndex = 0;\n } else {\n startIndex += isInLoop ? 1 : 0;\n startIndex = normalizeIndex(startIndex, dataLength);\n }\n data = data.toJSON ? data.toJSON() : data.slice();\n data = that._shuffleData(data, startIndex);\n for (var idx = 0; idx < dataLength; idx++) {\n text = that._text(data[idx]);\n if (isInLoop && that._matchText(text, that._last)) {\n break;\n } else if (that._matchText(text, that._word)) {\n break;\n }\n }\n if (idx !== dataLength) {\n oldFocusedItem = that._focus();\n that._select(normalizeIndex(startIndex + idx, dataLength)).done(function () {\n var done = function () {\n if (!that.popup.visible()) {\n that._change();\n }\n };\n if (that.trigger('select', {\n dataItem: that._getElementDataItem(that._focus()),\n item: that._focus()\n })) {\n that._select(oldFocusedItem).done(done);\n } else {\n done();\n }\n });\n }\n },\n _keypress: function (e) {\n var that = this;\n if (e.which === 0 || e.keyCode === kendo.keys.ENTER) {\n return;\n }\n var character = String.fromCharCode(e.charCode || e.keyCode);\n if (that.options.ignoreCase) {\n character = character.toLowerCase();\n }\n if (character === ' ') {\n e.preventDefault();\n }\n that._word += character;\n that._last = character;\n that._search();\n },\n _popupOpen: function () {\n var popup = this.popup;\n popup.wrapper = kendo.wrap(popup.element);\n if (popup.element.closest('.km-root')[0]) {\n popup.wrapper.addClass('km-popup km-widget');\n this.wrapper.addClass('km-widget');\n }\n },\n _popup: function () {\n Select.fn._popup.call(this);\n this.popup.one('open', proxy(this._popupOpen, this));\n },\n _getElementDataItem: function (element) {\n if (!element || !element[0]) {\n return null;\n }\n if (element[0] === this.optionLabel[0]) {\n return this._optionLabelDataItem();\n }\n return this.listView.dataItemByIndex(this.listView.getElementIndex(element));\n },\n _click: function (e) {\n var that = this;\n var item = e.item || $(e.currentTarget);\n e.preventDefault();\n if (that.trigger('select', {\n dataItem: that._getElementDataItem(item),\n item: item\n })) {\n that.close();\n return;\n }\n that._userTriggered = true;\n that._select(item).done(function () {\n that._blur();\n that._focusElement(that.wrapper);\n });\n },\n _focusElement: function (element) {\n var active = activeElement();\n var wrapper = this.wrapper;\n var filterInput = this.filterInput;\n var compareElement = element === filterInput ? wrapper : filterInput;\n var touchEnabled = support.mobileOS && (support.touch || support.MSPointers || support.pointers);\n if (filterInput && filterInput[0] === element[0] && touchEnabled) {\n return;\n }\n if (filterInput && (compareElement[0] === active || this._focusFilter)) {\n this._focusFilter = false;\n this._prevent = true;\n this._focused = element.focus();\n }\n },\n _searchByWord: function (word) {\n if (!word) {\n return;\n }\n var that = this;\n var ignoreCase = that.options.ignoreCase;\n if (ignoreCase) {\n word = word.toLowerCase();\n }\n that._select(function (dataItem) {\n return that._matchText(that._text(dataItem), word);\n });\n },\n _inputValue: function () {\n return this.text();\n },\n _search: function () {\n var that = this;\n var dataSource = that.dataSource;\n clearTimeout(that._typingTimeout);\n if (that._isFilterEnabled()) {\n that._typingTimeout = setTimeout(function () {\n var value = that.filterInput.val();\n if (that._prev !== value) {\n that._prev = value;\n that.search(value);\n that._resizeFilterInput();\n }\n that._typingTimeout = null;\n }, that.options.delay);\n } else {\n that._typingTimeout = setTimeout(function () {\n that._word = '';\n }, that.options.delay);\n if (!that.listView.bound()) {\n dataSource.fetch().done(function () {\n that._selectNext();\n });\n return;\n }\n that._selectNext();\n }\n },\n _get: function (candidate) {\n var data, found, idx;\n var isFunction = typeof candidate === 'function';\n var jQueryCandidate = !isFunction ? $(candidate) : $();\n if (this.hasOptionLabel()) {\n if (typeof candidate === 'number') {\n if (candidate > -1) {\n candidate -= 1;\n }\n } else if (jQueryCandidate.hasClass('k-list-optionlabel')) {\n candidate = -1;\n }\n }\n if (isFunction) {\n data = this.dataSource.flatView();\n for (idx = 0; idx < data.length; idx++) {\n if (candidate(data[idx])) {\n candidate = idx;\n found = true;\n break;\n }\n }\n if (!found) {\n candidate = -1;\n }\n }\n return candidate;\n },\n _firstItem: function () {\n if (this.hasOptionLabel()) {\n this._focus(this.optionLabel);\n } else {\n this.listView.focusFirst();\n }\n },\n _lastItem: function () {\n this._resetOptionLabel();\n this.listView.focusLast();\n },\n _nextItem: function () {\n var focusIndex;\n if (this.optionLabel.hasClass('k-state-focused')) {\n this._resetOptionLabel();\n this.listView.focusFirst();\n focusIndex = 1;\n } else {\n focusIndex = this.listView.focusNext();\n }\n return focusIndex;\n },\n _prevItem: function () {\n var focusIndex;\n if (this.optionLabel.hasClass('k-state-focused')) {\n return;\n }\n focusIndex = this.listView.focusPrev();\n if (!this.listView.focus() && !this.options.virtual) {\n this._focus(this.optionLabel);\n }\n return focusIndex;\n },\n _focusItem: function () {\n var options = this.options;\n var listView = this.listView;\n var focusedItem = listView.focus();\n var index = listView.select();\n index = index[index.length - 1];\n if (index === undefined && options.highlightFirst && !focusedItem) {\n index = 0;\n }\n if (index !== undefined) {\n listView.focus(index);\n } else {\n if (options.optionLabel && (!options.virtual || options.virtual.mapValueTo !== 'dataItem')) {\n this._focus(this.optionLabel);\n this._select(this.optionLabel);\n this.listView.content.scrollTop(0);\n } else {\n listView.scrollToIndex(0);\n }\n }\n },\n _resetOptionLabel: function (additionalClass) {\n this.optionLabel.removeClass('k-state-focused' + (additionalClass || '')).removeAttr('id');\n },\n _focus: function (candidate) {\n var listView = this.listView;\n var optionLabel = this.optionLabel;\n if (candidate === undefined) {\n candidate = listView.focus();\n if (!candidate && optionLabel.hasClass('k-state-focused')) {\n candidate = optionLabel;\n }\n return candidate;\n }\n this._resetOptionLabel();\n candidate = this._get(candidate);\n listView.focus(candidate);\n if (candidate === -1) {\n optionLabel.addClass('k-state-focused').attr('id', listView._optionID);\n this._focused.add(this.filterInput).removeAttr('aria-activedescendant').attr('aria-activedescendant', listView._optionID);\n }\n },\n _select: function (candidate, keepState) {\n var that = this;\n candidate = that._get(candidate);\n return that.listView.select(candidate).done(function () {\n if (!keepState && that._state === STATE_FILTER) {\n that._state = STATE_ACCEPT;\n }\n if (candidate === -1) {\n that._selectValue(null);\n }\n });\n },\n _selectValue: function (dataItem) {\n var that = this;\n var optionLabel = that.options.optionLabel;\n var idx = that.listView.select();\n var value = '';\n var text = '';\n idx = idx[idx.length - 1];\n if (idx === undefined) {\n idx = -1;\n }\n this._resetOptionLabel(' k-state-selected');\n if (dataItem || dataItem === 0) {\n text = dataItem;\n value = that._dataValue(dataItem);\n if (optionLabel) {\n idx += 1;\n }\n } else if (optionLabel) {\n that._focus(that.optionLabel.addClass('k-state-selected'));\n text = that._optionLabelText();\n if (typeof optionLabel === 'string') {\n value = '';\n } else {\n value = that._value(optionLabel);\n }\n idx = 0;\n }\n that.selectedIndex = idx;\n if (value === null) {\n value = '';\n }\n that._textAccessor(text);\n that._accessor(value, idx);\n that._triggerCascade();\n },\n _mobile: function () {\n var that = this, popup = that.popup, mobileOS = support.mobileOS, root = popup.element.parents('.km-root').eq(0);\n if (root.length && mobileOS) {\n popup.options.animation.open.effects = mobileOS.android || mobileOS.meego ? 'fadeIn' : mobileOS.ios || mobileOS.wp ? 'slideIn:up' : popup.options.animation.open.effects;\n }\n },\n _filterHeader: function () {\n var icon;\n if (this.filterInput) {\n this.filterInput.off(ns).parent().remove();\n this.filterInput = null;\n }\n if (this._isFilterEnabled()) {\n icon = '';\n this.filterInput = $('').attr({\n placeholder: this.element.attr('placeholder'),\n title: this.element.attr('title'),\n role: 'listbox',\n 'aria-haspopup': true,\n 'aria-expanded': false\n });\n this.list.prepend($('').append(this.filterInput.add(icon)));\n }\n },\n _span: function () {\n var that = this, wrapper = that.wrapper, SELECTOR = 'span.k-input', span;\n span = wrapper.find(SELECTOR);\n if (!span[0]) {\n wrapper.append(' ').append(that.element);\n span = wrapper.find(SELECTOR);\n }\n that.span = span;\n that._inputWrapper = $(wrapper[0].firstChild);\n that._arrow = wrapper.find('.k-select');\n that._arrowIcon = that._arrow.find('.k-icon');\n },\n _wrapper: function () {\n var that = this, element = that.element, DOMelement = element[0], wrapper;\n wrapper = element.parent();\n if (!wrapper.is('span.k-widget')) {\n wrapper = element.wrap('').parent();\n wrapper[0].style.cssText = DOMelement.style.cssText;\n wrapper[0].title = DOMelement.title;\n }\n that._focused = that.wrapper = wrapper.addClass('k-widget k-dropdown').addClass(DOMelement.className).removeClass('input-validation-error').css('display', '').attr({\n accesskey: element.attr('accesskey'),\n unselectable: 'on',\n role: 'listbox',\n 'aria-haspopup': true,\n 'aria-expanded': false\n });\n element.hide().removeAttr('accesskey');\n },\n _clearSelection: function (parent) {\n this.select(parent.value() ? 0 : -1);\n },\n _inputTemplate: function () {\n var that = this, template = that.options.valueTemplate;\n if (!template) {\n template = $.proxy(kendo.template('#:this._text(data)#', { useWithBlock: false }), that);\n } else {\n template = kendo.template(template);\n }\n that.valueTemplate = template;\n if (that.hasOptionLabel() && !that.options.optionLabelTemplate) {\n try {\n that.valueTemplate(that._optionLabelDataItem());\n } catch (e) {\n throw new Error(MSG_INVALID_OPTION_LABEL);\n }\n }\n },\n _textAccessor: function (text) {\n var dataItem = null;\n var template = this.valueTemplate;\n var optionLabelText = this._optionLabelText();\n var span = this.span;\n if (text === undefined) {\n return span.text();\n }\n if ($.isPlainObject(text) || text instanceof ObservableObject) {\n dataItem = text;\n } else if (optionLabelText && optionLabelText === text) {\n dataItem = this.options.optionLabel;\n }\n if (!dataItem) {\n dataItem = this._assignInstance(text, this._accessor());\n }\n if (this.hasOptionLabel()) {\n if (dataItem === optionLabelText || this._text(dataItem) === optionLabelText) {\n template = this.optionLabelTemplate;\n if (typeof this.options.optionLabel === 'string' && !this.options.optionLabelTemplate) {\n dataItem = optionLabelText;\n }\n }\n }\n var getElements = function () {\n return {\n elements: span.get(),\n data: [{ dataItem: dataItem }]\n };\n };\n this.angular('cleanup', getElements);\n try {\n span.html(template(dataItem));\n } catch (e) {\n span.html('');\n }\n this.angular('compile', getElements);\n },\n _preselect: function (value, text) {\n if (!value && !text) {\n text = this._optionLabelText();\n }\n this._accessor(value);\n this._textAccessor(text);\n this._old = this._accessor();\n this._oldIndex = this.selectedIndex;\n this.listView.setValue(value);\n this._initialIndex = null;\n this._presetValue = true;\n },\n _assignInstance: function (text, value) {\n var dataTextField = this.options.dataTextField;\n var dataItem = {};\n if (dataTextField) {\n assign(dataItem, dataTextField.split('.'), text);\n assign(dataItem, this.options.dataValueField.split('.'), value);\n dataItem = new ObservableObject(dataItem);\n } else {\n dataItem = text;\n }\n return dataItem;\n }\n });\n function assign(instance, fields, value) {\n var idx = 0, lastIndex = fields.length - 1, field;\n for (; idx < lastIndex; ++idx) {\n field = fields[idx];\n if (!(field in instance)) {\n instance[field] = {};\n }\n instance = instance[field];\n }\n instance[fields[lastIndex]] = value;\n }\n function normalizeIndex(index, length) {\n if (index >= length) {\n index -= length;\n }\n return index;\n }\n function sameCharsOnly(word, character) {\n for (var idx = 0; idx < word.length; idx++) {\n if (word.charAt(idx) !== character) {\n return false;\n }\n }\n return true;\n }\n ui.plugin(DropDownList);\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));"]}