{"version":3,"sources":["kendo.ui.core.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","wrapper","wrapperStyle","browser","outerWidth","_outerWidth","outerHeight","_outerHeight","parent","hasClass","style","is","display","position","percentRegExp","test","boxSizing","mozBoxSizing","webkitBoxSizing","addClass","msie","floor","version","zoom","children","deepExtend","destination","i","arguments","deepExtendOne","source","property","propValue","propType","propInit","destProp","ObservableArray","data","LazyObservableArray","DataSource","HierarchicalDataSource","OBJECT","constructor","Array","RegExp","Date","getTime","isFunction","clone","UNDEFINED","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","parseOption","option","dashRegExp","getAttribute","ns","numberRegExp","parseFloat","jsonRegExp","jsonFormatRegExp","Function","parseOptions","templateRegExp","template","html","containmentComparer","a","b","contains","resizableWidget","widget","inArray","attr","focusable","isTabIndexNotNaN","nodeName","disabled","href","visible","expr","filters","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","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","String","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","symbol","isCurrency","isPercent","customPrecision","formatAndPrecision","integer","fraction","integerLength","fractionLength","ch","hasGroup","hasNegativeFormat","decimalIndex","sharpIndex","zeroIndex","hasZero","hasSharp","percentIndex","currencyIndex","startZeroIndex","decimal","POINT","precision","decimals","pattern","literals","negative","replacement","EMPTY","start","name","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","parseInt","_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","_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","safari","opera","detectClipboardAccess","commands","copy","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","pushState","history","hashChange","customElements","MSPointerEvent","PointerEvent","kineticScrollNeeded","down","up","in","out","enabled","dequeue","disable","promiseShim","enable","animatedPromise","kendoStop","clearQueue","gotoEnd","stop","kendoAnimate","kendoAddClass","kendoRemoveClass","kendoToggleClass","toggle","target","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","webComponents","isLocalUrl","url","expression","safe","getter","setter","accessor","get","set","guid","random","id","roleSelector","role","directiveSelector","directives","selectors","triggeredByInput","tagName","onWidgetRegistered","len","logToConsole","message","console","suppressLog","log","dataSource","jQuery","angular","_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","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","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","decodeURIComponent","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","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","amd","a1","a2","a3","absoluteURL","path","pathPrefix","regEx","host","hashDelimiter","bang","locationHash","stripRoot","root","fixHash","fixBang","CHANGE","BACK","SAME","CHECK_URL_INTERVAL","BROKEN_BACK_NAV","hashStrip","HistoryAdapter","back","forward","replaceLocation","PushStateAdapter","navigate","title","replaceState","normalize","pathname","change","normalizeCurrent","fixedUrl","hash","hashBang","HashAdapter","_id","_interval","setInterval","clearInterval","History","_started","adapter","createAdapter","historyLength","locations","silent","_navigate","backCalled","decode","_checkUrl","newLength","navigatingInExisting","prev","backButtonPressed","namedParamReplace","optional","routeToRegExp","route","ignoreCase","escapeRegExp","optionalParam","namedParam","splatParam","stripUrl","INIT","ROUTE_MISSING","Route","_callback","queryStringParams","_back","worksWith","Router","routes","_urlChangedProxy","_sameProxy","_backProxy","initEventObject","sameProxy","_same","backProxy","urlChangedProxy","_urlChanged","same","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","DEFAULT_THRESHOLD","PRESS","HOLD","SELECT","START","MOVE","CANCEL","TAP","RELEASE","GESTURESTART","GESTURECHANGE","GESTUREEND","GESTURETAP","THRESHOLD","mouse","pointer","ENABLE_GLOBAL_SURFACE","TouchAxis","_updateLocationData","startLocation","velocity","timeStamp","timeDelta","initialDelta","Touch","userEvents","touchInfo","useClickAsTap","initialTouch","pressEvent","_moved","_finished","press","_holdTimeout","minHold","_trigger","_hold","_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","preventIfMoving","_isMoved","_destroyed","removeEventListener","_disposeAll","capture","_isMultiTouch","_apiCall","_maxTouchesReached","_select","which","_move","_eachTouch","_end","_click","pageX","pageY","methodName","matchingTouch","dict","defaultThreshold","MAX_DOUBLE_TAP_DISTANCE","eventProxy","_triggerTouch","gestureEventProxy","hold","tap","gesturestart","gesturechange","gestureend","enableSwipe","minXDelta","maxYDelta","maxDuration","doubleTapTimeout","_tap","lastTap","_dragstart","_swipestart","_swipemove","direction","toOdataFilter","useOdataFour","operator","logic","odataFilters","odataFiltersVersionFour","stripMetadata","hex16","createBoundary","createDelimeter","boundary","close","NEWLINE","createCommand","transport","item","httpVerb","command","transportUrl","commandPrefix","getOperationHeader","changeset","changeId","header","getOperationContent","content","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","parse","neq","gt","gte","lt","lte","doesnotcontain","endswith","startswith","isnull","isnotnull","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","error","isPlainObject","XmlDataReader","idField","xmlParse","model","errors","serialize","modelBase","Model","fields","xpathToMember","modelInstance","evaluate","record","_parse","xml","parseDOM","parsedNode","attribute","attributes","attributeCount","firstChild","nextSibling","intermediateResult","tree","parseXML","raw","readers","eventHandler","_notifyChange","equal","xtype","ytype","getFieldByName","fieldName","Query","normalizeSort","descriptor","descriptors","normalizeOperator","operatorMap","normalizeFilter","compareDescriptor","f1","f2","normalizeDescriptor","fieldComparer","compareFilters","expr1","expr2","filters1","filters2","normalizeAggregate","expressions","normalizeGroup","aggregates","groupValueComparer","calculateAggregate","accumulator","state","aggr","functionName","aggregate","functions","isNumber","val","isDate","serializeRecords","getters","originalFieldNames","fieldNames","originalName","setters","convertRecords","convertGroup","hasSubgroups","wrapDataAccess","originalFunction","converter","wrapDataAccessBase","fillLastGroup","originalGroup","newGroup","currOriginal","currentNew","mergeGroups","dest","group","flattenGroups","itemIndex","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","cells","cell","empty","tbody","tBodies","rows","fieldCount","dataMethod","_data","_attachBubbleHandlers","inferList","list","textChild","textField","urlField","spriteCssClassField","imageUrlField","_loaded","prop","hasChildren","ObservableObject","parsers","defaultValues","Comparer","StableComparer","operators","LocalTransport","RemoteTransport","Cache","DataReader","Transport","Node","Buffer","BatchBuffer","CREATE","READ","UPDATE","DESTROY","SYNC","GET","ERROR","REQUESTSTART","PROGRESS","REQUESTEND","crud","identity","o","wrapAll","json","object","howMany","thisArg","reduce","reduceRight","every","some","Symbol","_parent","_handlers","shouldSerialize","_set","paths","composite","isSetPrevented","isObservableArray","isDataSource","boolean","default","defaults","_initializers","dirtyFields","editable","initiator","accept","isNew","functionFields","nullable","defaultValue","compare","localeCompare","combine","comparers","asc","valueA","valueB","__position","desc","textOp","impl","ignore","op","getMatchRegexp","esc","doesnotstartwith","n","doesnotendwith","doesnotmatch","isnullorempty","isnotnullorempty","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","currentValue","_sortForGrouping","groupValue","sum","average","process","query","filterCallback","setup","parameters","operation","_store","clear","store","inmemory","schema","dataFunction","groupsFunction","serializeFunction","serializeGetters","_dataAccessFunction","groups","fromName","_wrapDataAccessBase","_map","_prefetch","_pristineData","_ranges","_view","_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","found","_eachItem","_removePristineForModel","hasGroups","_removeModelFromRanges","promises","_sendSubmit","_send","when","then","_accept","_change","cancelChanges","_cancelModel","_markOfflineUpdatesAsDirty","__state__","hasChanges","serverGroup","_handleCustomErrors","_executeOnPristineForModel","_eachPristineItem","_pristineForModel","_submit","reject","deferred","_promise","converted","_params","_queueRequest","isPrevented","_dequeueRequest","_readAggregates","itemIds","_aggregateResult","endless","_changeHandler","updatePristine","_skip","timestamp","_timeStamp","_sortRanges","xhr","errorThrown","_requestInProgress","_pending","_shouldWrap","arrayType","_updateTotalForAction","_calculateAggregates","_take","currentRangeStart","_queryProcess","_mergeState","_currentRangeStart","moreItemsCount","remote","fetch","_query","next","totalPages","_emptyAggregates","ceil","inRange","_findRange","lastRange","firstItemUid","enableRequestsInProgress","_skipRequestsInProgress","_currentRequestTimeStamp","pageSkip","_processRangeData","_rangeExists","prefetch","skipIdx","takeIdx","startIndex","endIndex","rangeData","rangeEnd","processed","flatData","_mergeGroups","prevGroup","temp","paging","sorting","filtering","_prefetchSuccessHandler","_timeout","_multiplePrefetch","_updateRangesLength","rangesLength","mismatchFound","mismatchLength","lengthDifference","transportOptions","hasChildrenObject","childrenField","childrenOptions","_childrenOptions","_initChildren","_updateChildrenField","append","loaded","level","_childrenLoaded","load","_matchFilter","_hierarchicalFilter","_markHierarchicalQuery","_updateHierarchicalFilter","_find","_dataSource","viewSize","disablePrefetch","_prefetching","_reset","_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","dataSourceBinding","bindingName","Binder","bindings","_dataBinding","dataBinding","_dataBound","dataBound","_itemChange","itemChange","bindElement","_ns","_parents","removedItems","unbindElementTree","all","addedItems","hds","addedDataItems","multiselect","dropdowntree","Select","MultiSelect","DropDownTree","treeview","retrievePrimitiveValues","dataValueField","bindingTargetForRole","WidgetBindingTarget","parseBindings","token","colonIndex","keyValueRegExp","createBindings","binding","childrenCopy","deep","unbindElement","whiteSpaceRegExp","valueField","valueUpdate","valuePrimitive","autoBind","BindingTarget","Binding","TemplateBinding","EventBinding","dom","destroyWidget","bindingTarget","deleteExpando","removeAttribute","destroyWidgets","unbindElementChildren","namespace","TypedBinder","arraySplice","binders","VALUE","SOURCE","EVENTS","CHECKED","CSS","dependencies","_access","dependency","currentSource","parsedValue","_parseValue","removeClass","readonly","dataFormat","invisible","_initChange","cloneNode","reference","insertBefore","checked","selectedIndex","selected","valueIndex","sourceValue","optionIndex","optionValue","check","_valueIsObservableObject","_valueIsObservableArray","_source","valueLength","sourceItem","dataTextField","isObservableObject","cascadeFrom","listView","bound","_preselect","j","old","removeIndex","newValue","oldValues","selectedNode","nonPrimitiveValues","_isMultipleSelection","_getAllChecked","newValues","selectedValue","gantt","_isBound","scheduler","arr","addLength","oldLength","shifted","shiftedLength","toDestroy","hasValue","hasSource","hasEvents","hasChecked","hasCss","widgetBinding","specificBinders","applyBinding","binder","observableHierarchy","recursiveRead","parseInteger","parseCSS","propertyName","acc","strip3DTransforms","transformProps","transform2d","normalizeCSS","lowerKey","isTransformed","transformation","cssValues","TRANSFORM","animationProperty","transform","computed","NONE","matrix3dRegExp","translateXRegExp","atan2","capitalize","word","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","vertical","HEIGHT","WIDTH","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","cssPrefix","BLANK","PX","AUTO","HIDDEN","ORIGIN","ABORT_ID","OVERFLOW","TRANSLATE","POSITION","COMPLETE_CALLBACK","TRANSITION","BACKFACE","PERSPECTIVE","DEFAULT_PERSPECTIVE","TRANSFORM_PERSPECTIVE","transition","modifier","horizontal","stopQueue","transformValue","step","elem","cur","exclusive","ease","mirror","redirectedEffect","resolved","$1","$2","effect","effectBody","timeoutID","stopTransitionCalled","stopTransition","oldKeys","speeds","merge","unique","taskKeys","retainPosition","restore","run","jdx","childrenLength","effectName","done","setReverse","addRestoreProperties","restoreCallback","effectSet","parsedEffects","useTransition","show","multiple","single","isFixed","originalPosition","dX","dY","marginLeft","marginTop","_additionalEffects","play","additional","_duration","compositeRun","_complete","divisor","tmp","previous","previousDivisor","slideIn","margin","origin","setLength","realLength","outerBox","box","innerBox","currentScale","fillScale","transformOrigin","_container","rotation","zIndex","_clipInHalf","clip","face","_face","temporary","reverseDirection","faceClone","backClone","staticPage","turningPage","transformStyle","_before","_after","transitionClass","_previous","_transitionClass","beforeTransition","afterTransition","_both","_element","_containerClass","containerClass","completeProxy","isAbsolute","originalOverflow","both","_tickProxy","_tick","tick","onEnd","onCancel","timePassed","startDate","moveTo","movable","initial","_easeProxy","moveAxis","easeOutExpo","pow","easeOutBack","inner","outer","fitScale","parseTransition","transitionRegExp","SCRIPT","SHOW","HIDE","TRANSITION_START","TRANSITION_END","ATTACH","DETACH","sizzleErrorRegExp","View","_wrap","_evalTemplate","evalTemplate","_fragments","notInitialized","_createElement","_eachFragment","ViewClone","triggerBeforeShow","triggerBeforeHide","showStart","showEnd","hideEnd","detach","fragments","getElementById","contents","replaceWith","Layout","containers","_createContainer","showIn","ViewContainer","Fragment","attach","running","after","locationID","previousEntry","theTransition","transitionData","isJQueryPromise","fail","isNativePromise","hub","signalr","callbacks","_crud","server","resolveRules","resolvers","validator","ruleResolvers","numberOfDecimalDigits","parseHtml","parseHTML","searchForMessageContainer","invalidMsgRegExp","Validator","NS","INVALIDMSG","INVALIDINPUT","VALIDINPUT","emailRegExp","urlRegExp","INPUTSELECTOR","CHECKBOXSELECTOR","NUMBERINPUTSELECTOR","BLUR","NAME","FORM","NOVALIDATE","VALIDATE","VALIDATE_INPUT","patternMatcher","matcher","hasAttribute","validateAttributeSelector","_errorTemplate","errorTemplate","_inputSelector","_checkboxSelector","_errors","_attachEvents","_isValidated","required","email","dateCompare","checkbox","raise","validateOnBlur","validate","stopImmediatePropagation","_checkElement","validateInput","inputs","invalid","isValid","valid","lbl","messageText","wasValid","messageLabel","lblId","_checkValidity","_findMessageContainer","_extractMessage","_decorateMessageContainer","insertAfter","hideMessages","locators","messageLocators","getElementsByTagName","locate","decorate","ruleKey","nonDefaultMessage","customMessage","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","virtual","_virtualMin","_virtualMax","virtualSize","outOfBounds","forceEnabled","getTotal","rescale","scaledTotal","minScale","centerOffset","PaneDimensions","forcedMinScale","maxScale","newScale","centerCoordinates","PaneAxis","dimension","dragMove","resistance","translateAxis","Pane","elastic","gesture","coordinates","offsetX","offsetY","previousGesture","previousCenter","scaleDelta","scaleWith","TRANSFORM_STYLE","webkitTransformOrigin","_saveCoordinates","by","scaleTo","newCoordinates","draggable","dropTarget","_over","_out","_drop","dropped","destroyGroup","_cache","_activated","_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","_scrollInterval","_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","SCROLL","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","prepend","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","HORIZONTAL","VERTICAL","RESIZEEND","Resizable","orientation","_positionMouse","_position","_sizingDom","draggableElement","drag","dragcancel","dragstart","dragend","_stop","_max","hintSize","_initialElementPosition","_min","_initialMousePosition","_maxPosition","_minPosition","maxPosition","minPosition","currentPosition","invalidClass","resizing","targetPosition","containsOrEqualTo","defaultHint","defaultPlaceholder","BEFORE_MOVE","ACTION_SORT","ACTION_REMOVE","ACTION_RECEIVE","DEFAULT_FILTER","MISSING_INDEX","Sortable","_createDraggable","connectWith","cursor","moveOnDragEnter","_dragcancel","_dragend","draggedElement","_placeholder","draggableEvent","before","_setCursor","_resetCursor","targetCenter","offsetDelta","sibling","getSibling","_findTarget","axisDelta","eventData","_movementByAxis","_getElementCenter","appendToBottom","_movePlaceholder","appendAfterHidden","_isFloating","connectedList","connectedListEventData","draggedIndex","placeholderIndex","oldIndex","newIndex","getKendoSortable","_findElementUnderCursor","has","sortable","_isEmpty","_isLastHidden","_searchConnectedTargets","sortableInstance","connected","_isCursorAfterLast","lastItemOffset","lastItem","cursorPosition","_originalCursorType","_cursorStylesheet","_items","not","collision","elementPosition","Selectable","ARIASELECTED","SELECTED","ACTIVE","SELECTABLE","UNSELECTING","supportEventDelegation","_marquee","_lastActive","aria","inputSelectors","_isElement","ctrlKey","metaKey","whichCode","buttonCode","button","_allowSelection","selectRange","_firstSelectee","_unselect","_notify","_downTarget","currentElement","useAllItems","_selectElement","_invalidateSelectables","toSelect","selectElement","preventNotify","resetTouchEvents","continuousItems","selectable","asLowerString","CLICK","KBUTTON","KBUTTONICON","KBUTTONICONTEXT","DISABLED","DISABLEDSTATE","FOCUSEDSTATE","SELECTEDSTATE","Button","_graphics","_focus","_blur","_keydown","_keyup","icon","spriteCssClass","imageUrl","_isNativeButton","span","img","isEmpty","err","numeric","wrapClassName","iconTemplate","FIRST","PREV","NEXT","LAST","KEYDOWN","MOUSEDOWN","DOCUMENT_ELEMENT","MAX_VALUE","Pager","pageSizes","pageItems","linkTemplate","selectTemplate","currentPageTemplate","_refreshHandler","downEvent","previousNext","of","allPages","itemsPerPage","DropDownList","kendoDropDownList","_refreshClick","_toggleActive","buttonCount","morePages","setDataSource","reminder","hasAll","selectAll","_hideList","tabKeyTrapNS","focusableNodesSelector","TabKeyTrap","OPEN","CLOSE","DEACTIVATE","ACTIVATE","CENTER","TOP","BOTTOM","ABSOLUTE","BODY","LOCATION","VISIBLE","EFFECTS","ACTIVEBORDER","ACTIVEBORDERREGEXP","ACTIVECHILDREN","WINDOW","Popup","parentPopup","collisions","anchor","_hovered","scrollArea","animation","open","_animationClose","_mousedownProxy","_mousedown","_resizeProxy","toggleTarget","toggleEvent","viewport","copyAnchorStyles","modal","adjustSize","_hideDirClass","_closing","_toggleResize","fixed","flipped","_openAnimation","_showDirClass","_location","dirClass","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","siblings","_align","offsetParent","appendToOffset","verticalOrigin","horizontalOrigin","verticalPosition","horizontalPosition","anchorOffset","anchorWidth","anchorHeight","trap","_keepInTrap","removeTrap","shouldTrap","sortedElements","_focusableElements","_sortFocusableElements","_nextFocusable","tabIndex","attrName","contentWindow","_haveSelectionRange","elementType","KNOTIFICATION","KICLOSE","KHIDING","INFO","SUCCESS","WARNING","WRAPPER","TEMPLATE","SAFE_TEMPLATE","Notification","_compileTemplates","templates","_guid","_isRtl","_compileStacking","stacking","pinned","hideOnClick","allowHideAfter","autoHideAfter","kendoTemplate","_compiled","templateId","_defaultCompiled","_safeCompiled","_getCompiled","defaultCompiled","paddings","paddingTop","paddingRight","paddingBottom","paddingLeft","horizontalAlignment","_popupOrigin","_popupPosition","_popupPaddings","_attachPopupEvents","attachClick","_hidePopup","closeIcon","attachDelay","_showPopup","openPopup","_triggerHide","deactivate","_togglePin","pin","win","_attachStaticEvents","_hideStatic","_showStatic","insertionMethod","defaultArgs","typeIcon","showText","warning","openedNotifications","getNotifications","guidElements","newOptions","restoreTitle","restoreTitleAttributeForElement","saveTitleAttributeForElement","saveTitleAttributes","DOCUMENT","ARIAIDSUFFIX","DESCRIBEDBY","CONTENTLOAD","KCONTENTFRAME","IFRAMETEMPLATE","POSITIONS","DIRCLASSES","DIMENSIONS","DEFAULTCONTENT","Tooltip","_documentKeyDownHandler","_documentKeyDown","showOn","_showOn","_isShownOnFocus","_mouseenter","autoHide","_mouseleave","showAfter","callout","_show","_appendContent","iframe","contentOptions","showIframe","src","_ajaxRequest","_initPopup","activate","ariaId","arrow","_closeButtonClick","_closePopup","toggleActive","STATE_ACTIVE","actionSheetWrap","preventClick","findFocusableSibling","candidate","components","Item","ToolBarButton","OverflowButton","ButtonGroup","ToolBarButtonGroup","OverflowButtonGroup","ToolBarSplitButton","OverflowSplitButton","ToolBarSeparator","OverflowSeparator","TemplateItem","OverflowTemplateItem","Group","ToolBar","TOOLBAR","BUTTON","OVERFLOW_BUTTON","TOGGLE_BUTTON","BUTTON_GROUP","SPLIT_BUTTON","SEPARATOR","POPUP","RESIZABLE_TOOLBAR","STATE_DISABLED","STATE_HIDDEN","GROUP_START","GROUP_END","PRIMARY","ICON","ICON_PREFIX","BUTTON_ICON","BUTTON_ICON_TEXT","LIST_CONTAINER","SPLIT_BUTTON_ARROW","OVERFLOW_ANCHOR","OVERFLOW_CONTAINER","FIRST_TOOLBAR_VISIBLE","LAST_TOOLBAR_VISIBLE","TOGGLE","OVERFLOW_OPEN","OVERFLOW_CLOSE","OVERFLOW_NEVER","OVERFLOW_AUTO","OVERFLOW_ALWAYS","OVERFLOW_HIDDEN","OPTION_LIST_SUFFIX","KENDO_UID_ATTR","toolbar","overflowAnchor","overflowContainer","registerComponent","addOverflowAttr","addUidAttr","addIdAttr","addOverflowIdAttr","hidden","overflowHidden","isEnabled","twin","splitContainerId","resizable","useButtonTag","primary","togglable","addToGroup","clickHandler","toggleHandler","propagate","getParentGroup","isChild","_addGraphics","align","hasIcon","showIcon","createButtons","buttonConstructor","buttons","buttonGroup","mainButton","arrowButton","popupElement","createMenuButtons","createPopup","_navigatable","main","splitButton","kendoPopup","li","altKey","menuButtons","rootUid","adjustPopupWidth","computedWidth","fontFamily","min-width","separator","_groups","isMobile","_renderOverflow","overflowUserEvents","_toggleOverflow","_resizeHandler","_shrink","_buttonClick","release","_toggleOverflowAnchor","tool","overflowTool","component","itemClasses","overflowTemplate","_getItem","toolbarItem","overflowItem","isResizable","getSelectedFromGroup","horizontalDirection","isComplexTool","hasVisibleChildren","splitContainer","urlTarget","isSplitButtonArrow","_toggle","lastHasFocus","firstHasFocus","isFirstTool","prevFocusable","isOverflowAnchor","_getPrevFocusable","_preventNextFocus","_getNextElement","parentElement","directionNumber","searchIndex","focusableItem","elementToFocus","prevElement","prevElements","prevAll","containerWidth","_stretch","_markVisibles","_childrenWidth","childrenWidth","commandElement","visibleCommands","_hideItem","hiddenCommands","_showItem","overflowItems","toolbarItems","visibleOverflowItems","visibleToolbarItems","unifyType","getSelectedOption","mapChangedItems","itemsToMatch","itemsLength","selectedLength","changed","unchanged","isValidFilterExpr","removeFiltersForField","STATIC_LIST_NS","StaticList","ID","FOCUSED","HOVER","LOADING","GROUPHEADER","LABELIDPART","CASCADE","HIDDENCLASS","isIE","isIE8","quotRegExp","alternativeNames","ComboBox","List","_isSelect","ul","aria-hidden","_listMousedown","_header","_noData","_footer","_accessors","_initValue","footerTemplate","headerTemplate","noDataTemplate","_renderFooter","_renderNoData","_focused","_editable","_angularElement","noData","footer","_listOptions","currentOptions","changeEventOption","_listChange","listBoundHandler","_listBound","_activateItem","_deactivateItem","groupTemplate","fixedGroupTemplate","$angular","_initList","listOptions","selectedItemChange","VirtualList","_setListValue","_updateSelectionState","filterInput","_isFilterEnabled","_hideClear","_clear","_showClear","_clearValue","_clearText","_accessor","enforceMinLength","_customOption","_clearFilter","_filterSource","newExpression","dataSourceState","resetPageSettings","removed","_cascading","setDSFilter","_toggleNoData","_toggleHeader","groupHeader","_allowOpening","_old","_ignoreCase","widgetOptions","_open","_clearButton","clearTitle","clearButton","_inputValue","_typingTimeout","minLength","_state","_emptySearch","_searchByWord","_unbindDataSource","_form","_resetHandler","selectedDataItems","_text","_value","_aria","suggest","_ariaLabel","labelId","focusedElm","inputElm","inputId","labelElm","ariaLabel","ariaLabelledBy","_generateLabelId","_valueBeforeCascade","_userTriggered","_oldIndex","isFiltered","_typing","typing","_enable","_dataValue","_offsetHeight","_height","offsetTop","popups","footerHeight","_openHandler","_adjustListWidth","borderLeftWidth","borderRightWidth","autoWidth","minWidth","whiteSpace","_closeHandler","_focusItem","noFocusedItem","highlightFirst","scrollToIndex","_calculateGroupPadding","padding","_calculatePopupHeight","_resizePopup","_popup","_makeUnselectable","_toggleHover","preventFocus","touchEnabled","MSPointers","_prevent","_triggerCascade","_cascadeTriggered","_cascadedValue","userTriggered","_triggerChange","_requestStartHandler","_requestEndHandler","_errorHandler","requireValueMapper","valueMapper","_initial","_initialIndex","_current","_parentWidget","_cascadeSelect","_cascadeValue","_accessorInput","_accessorSelect","_custom","_syncValueAndText","custom","_hideBusy","_busy","_arrowIcon","_showBusy","_request","_requestEnd","_firstItem","focusFirst","_lastItem","focusLast","_nextItem","focusNext","_prevItem","focusPrev","activeFilter","shouldTrigger","_fetch","dataItemByIndex","getElementIndex","_focusElement","focusout","scrollWith","_fetchData","hasItems","_options","optionLabel","dataText","dataValue","htmlElement","formId","_cascade","cascade","_cascadeHandlerProxy","_cascadeHandler","_cascadeFilterRequests","_selectedValue","_toggleCascadeOnFocus","valueBeforeCascade","_clearSelection","_cascadeChange","filterValue","cascadeFromField","currentHandler","_optionID","_selectedIndices","_dataItems","_values","_getter","_templates","_onScroll","_scrollId","_renderHeader","_fixedHeader","_render","scroll","itemOffsetTop","itemOffsetHeight","contentScrollTop","contentOffsetHeight","bottomDistance","_getValues","_valueGetter","hasCandidate","_get","focusIndex","skipUpdate","_skipUpdate","indices","filtered","singleSelection","selectedIndices","added","_deselectFiltered","_deselect","_valueComparer","removeAt","setValue","_valueDeferred","_valueIndices","_valueExpr","normalized","_valueType","_dataItemPosition","valueExpr","removedIndices","_template","_normalizeIndices","newIndices","_firstVisibleItem","itemHeight","lastChild","previousSibling","isGrouped","visibleItem","_renderItem","notFirstItem","dataContext","_selected","_lastDSFilter","skipUpdateOnBind","isItemChange","_bound","modular","minYear","maxYear","build","weekNumberBuild","isWeekColumnVisible","cellsPerRow","perRow","weekNumberTemplate","cellTemplate","emptyCellTemplate","createDate","disableDates","isInRange","date1","date2","year1","getToday","DATE","restrictValue","shiftArray","multiplier","daysBetweenTwoDates","endDate","fromDateUTC","endDateUTC","addDaysToArray","numberOfDays","fromDate","mousetoggle","MOUSEENTER","FOCUS","prevent","dateObject","getCalendarInfo","depth","extractFormat","MONTH","dates","makeUnselectable","addClassToViewContainer","currentView","isEqualDatePart","value1","value2","isEqualMonth","getDisabledExpr","createDisabledExpr","convertDatesArray","disabledDates","searchExpression","isEqualDate","oldValue","transitionOrigin","KEYDOWN_NS","MIN","SLIDE","CENTURY","NAVIGATE","OTHERMONTH","OTHERMONTHCLASS","TODAY","CELLSELECTOR","CELLSELECTORVALID","WEEKCOLUMNSELECTOR","FOCUS_WITH_NS","MOUSEENTER_WITH_NS","MOUSELEAVE","PREVARROW","NEXTARROW","ARIA_DISABLED","ARIA_SELECTED","ARIA_LABEL","decade","century","Calendar","unescape","_selectable","link","_toDateObject","_focusView","focusOnNav","_cellID","_class","_selectDates","_index","_addClassProxy","_active","_cell","todayString","toDateString","_cellByDate","_removeClassProxy","selectDates","weekColumnHeader","_today","_title","_destroySelectable","_table","_bindTable","_option","navigateToPast","navigateToFuture","navigateUp","navigateDown","future","_oldTable","_changeView","_animate","_visualizeSelectedDatesInView","validSelectedDates","datesUnique","_validateValue","selectedDates","selectableOptions","_onSelect","_onRelatedTarget","eventArgs","_toggleSelection","_cellsBySelector","_addSelectedCellsToArray","_rangeSelection","currentCell","toDateCell","daysDifference","toDate","currentDateIndex","_dateInView","firstDateInView","lastDateInView","focusedDate","isDisabled","_keyboardToggleSelection","_nextNavigatable","_keyboardRangeSelection","navigatableDate","active","_horizontal","viewWidth","float","margin-left","unwrap","_vertical","disabledDate","links","firstDayCurrentMonth","isBigger","isTodayDisabled","_todayClick","firstVisibleDay","calendarInfo","tzOffsetBefore","resultDATE","tzOffsetDiff","navigateUrl","hasUrl","currentCalendar","firstDayIdx","shortNames","linkClass","dateString","currentDate","month1","month2","year2","setMonth","viewsEnum","approximateStringMatching","oldText","oldFormat","newText","deletedSymbol","oldTextSeparator","knownSymbols","customDateTime","INPUT_EVENT_NAME","STATEDISABLED","STATEDEFAULT","STATEINVALID","READONLY","DateInput","insidePicker","weekday","hour","minute","second","dayperiod","_unbindInput","_bindInput","_updateElementValue","_formElement","_dateTime","getDateObject","_oldValue","stringAndFromat","toPair","_oldText","_format","_paste","_input","_mouseUp","_scroll","navigationOnly","difSym","newEvent","stateInvalid","blinkInvalid","parsePart","_selectSegment","_blinkInvalidTimeout","_selectNearestSegment","returnValue","keycode","modifyPart","begin","initDate","initFormat","initCulture","initMessages","generateMatcher","retFormat","returnsFormat","setExisting","typedMonthPart","typedDayPeriodPart","sampleFormat","placeholders","mins","formatResult","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","_initialOptions","_wrapper","dateView","_updateARIA","_icon","aria-expanded","aria-owns","_createDateInput","_update","ARIATemplate","dateInput","_dateInput","_dateIcon","_inputWrapper","eventType","dateChanged","valueUpdated","textFormatted","aria-controls","formattedValue","isSameType","_ariaTemplate","lastFrom","isPrimitive","getItemCount","listScreens","getDefaultItemHeight","lineHeight","mockList","bufferSizes","opposite","listValidator","downThreshold","upThreshold","lastScrollTop","scrollCallback","syncList","reorder","webkitTransform","map2","arr1","arr2","ITEMCHANGE","reshift","itemTemplate","placeholderTemplate","GROUPITEM","isActivePromise","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","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","flatGroups","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","indexOfWordAtCaret","caretIdx","wordAtCaret","replaceWordAtCaret","defaultSeparator","words","placeholderSupported","ARIA_READONLY","AutoComplete","_loader","_keypress","_search","_prev","autocomplete","aria-haspopup","_resetFocusItemHandler","_resetFocusItem","_toggleCloseVisibility","_progressHandler","_separator","_unifySeparators","_last","wordIndex","groupsLength","isActive","_touchScroller","_muted","_selectValue","_defaultSeparator","itemSelected","_loading","DOMelement","assign","normalizeIndex","sameCharsOnly","character","nsFocusEvent","STATE_FILTER","STATE_ACCEPT","MSG_INVALID_OPTION_LABEL","_focusHandler","_focusInputHandler","_focusInput","_optionLabel","_inputTemplate","_word","_span","_mobile","_filterHeader","_attachFocusHandlers","hasOptionLabel","_textAccessor","_optionLabelText","valueTemplate","optionLabelTemplate","_arrow","_focusFilter","_resizeFilterInput","isInputActive","originalPrevent","_optionLabelDataItem","loweredText","_valueSetter","_assignInstance","_buildOptions","optionLabelValue","initialIndex","_presetValue","_filterPaste","_focusinHandler","_focusoutHandler","isIFrame","self","_wrapperMousedown","_wrapperClick","dropDownWrapper","isPopupVisible","_getElementDataItem","_matchText","_shuffleData","splitIndex","optionDataItem","_selectNext","oldFocusedItem","dataLength","isInLoop","fromCharCode","charCode","_popupOpen","compareElement","jQueryCandidate","_resetOptionLabel","focusedItem","additionalClass","keepState","SELECTOR","accesskey","unselectable","getElements","optionLabelText","STATE_REBIND","newLineRegEx","_attachFocusEvents","_setText","syncValueAndText","_pasteTimeout","hasText","isCustom","_inputFocus","_inputFocusout","_arrowClick","_inputPaste","_openPopup","_scrollToFocusedItem","_updateSelection","hasInitialIndex","_updateItemFocus","isFirstPage","_setDomInputValue","caretStart","currentCaret","preventShow","maxLength","accessKey","A","LI","ACCEPT","FILTER","REBIND","DESELECT","FOCUSEDCLASS","SELECTEDCLASS","HOVERCLASS","_optionsMap","_customOptions","_tagList","_textContainer","_tagID","tagList","_initialOpen","_tagTemplate","tagMode","autoClose","maxSelectedItems","tagTemplate","persistTagList","currentTag","_currentTag","_selectedItemChange","_initialValues","optionsMap","tagTextTemplate","notInput","closeButton","_removeTag","tag","customIndex","_close","_tagListClick","_clearClick","_retrieveData","_activeItem","inputValue","clearFilters","_normalizeValues","_setOption","isEmptyArray","_getActiveItem","_getSelectedIndices","activeItemIdx","activeIndex","_selectRange","_showBusyHandler","skipCaret","caretPos","textWidth","wrapperWidth","selectedItems","_buildSelectedItems","_selectedItemIndex","_angularTagItems","updatePersistTagList","removedItem","addedItem","_maxTotal","maxTotal","currentTotal","isSelected","indicesToSelect","selectIndices","_innerWrapper","defaultTemplate","hasDataSource","isMultiple","computedStyles","hex","hue2rgb","p","q","parseColor","color","BaseColor","matchNamedColor","RGB","namedColors","Bytes","HSV","HSL","Color","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","regexp","colorNames","toHSV","toRGB","toHex","toBytes","toCss","toCssRgba","rgb","r","toDisplay","other","c1","c2","NaN","h","ref","toHSL","l","resolvedColor","formatRegex","processor","channels","this$1","resolveColor","re","normalizeByte","padDigit","brightness","percBrightness","fromBytes","fromRGB","fromHSV","fromHSL","createWrapper","isHorizontal","orientationCssClass","cssClasses","tickPlacementCssClass","tickPlacement","showButtons","createButton","buttonCssClass","createSliderItems","smallStep","createTrack","dragHandleCount","firstDragHandleTitle","leftDragHandleTitle","dragHandleTitle","rightDragHandleTitle","stepValue","formatValue","calculatePrecision","power","parseAttr","defined","removeFraction","RangeSlider","MOUSE_DOWN","TRACK_MOUSE_DOWN","MOUSE_UP","TRACK_MOUSE_UP","MOVE_SELECTION","KEY_DOWN","MOUSE_OVER","DRAG_HANDLE","TRACK_SELECTOR","TICK_SELECTOR","STATE_SELECTED","STATE_FOCUSED","STATE_DEFAULT","SliderBase","rtlDirectionSign","_isHorizontal","_sizeFn","_outerSize","tooltip","_createHtml","_trackDiv","_setTrackDivWidth","_maxSelection","_sliderItemsInit","_keyMap","37","40","39","38","35","36","33","largeStep","34","_distance","_refresh","sizeBetweenTicks","pixelWidths","_calculateItemsWidth","_setItemsWidth","_setItemsTitle","_calculateSteps","_setItemsLargeTick","trackDivPosition","bordersWidth","titleNumber","limit","increment","valueWithoutFraction","itemsCount","itemWidth","trackDivSize","pixelStep","_roundWidths","pixelWidthsArray","balance","_addAdditionalSize","additionalSize","_pixelSteps","_getValueFromPosition","mousePosition","dragableArea","halfStep","startPoint","_getFormattedValue","tooltipTemplate","_getDraggableArea","endPoint","_firstHandleDrag","_activeHandle","_lastHandleDrag","_activeHandleDrag","_updateTooltip","_focusWithMouse","_setTooltipTimeout","_removeTooltip","_tooltipTimeout","_clearTooltipTimeout","tooltipDiv","_formResetHandler","Slider","dragHandle","_selection","Selection","Drag","increaseButtonTitle","decreaseButtonTitle","mouseDownHandler","newVal","_nextValueByIndex","_valueIndex","_setValueInRange","timer","_clearTimer","_refreshAriaAttr","_tooltipDiv","moveSelection","selectionValue","selectionDiv","halfDragHanndle","rtlCorrection","owner","_activeDragHandle","_setZIndex","oldVal","_createTooltip","colloutCssClass","wnd","tooltipInnerDiv","_scrollOffset","moveTooltip","slideParams","constrainValue","noAnimation","fadeOut","dragHandles","sdhOffset","viewPortEnd","maxOverflow","firstInput","secondInput","warn","dragSelectionStart","dragSelectionEnd","activeHandleDrag","selectionStartValue","selectionEndValue","selectionStartIndex","selectionEndIndex","halfHandle","makeSelection","selectionPosition","relative","KEYS","BACKGROUNDCOLOR","ITEMSELECTEDCLASS","SIMPLEPALETTE","WEBPALETTE","WHITE","MESSAGES","noColor","clearColor","previewInput","CLICK_NS","ColorSelector","_tabIndex","_ariaId","_standalone","_triggerSelect","_updateUI","_onEnable","nohooks","_selectOnHide","ColorPalette","colors","tileSize","palette","columns","_selectedID","ex","FlatColorPicker","_hueElements","_selectedColor","_colorAsText","_sliders","_hsvArea","autoupdate","_clearedColor","_getHSV","_applyIEFilter","_hueSlider","_opacitySlider","_hsvRect","_hsvHandle","preview","track","backgroundImage","hueChange","opacityChange","hueSlider","opacitySlider","kendoSlider","slide","rw","rh","_svChange","hsvRect","hsvHandle","_hsvEvents","hue","handlePosition","dontChangeInput","ColorPicker","_selector","innerWrapper","toolIcon","_getPopup","selOptions","_noColorIcon","_isInputTypeColor","selectorType","kendoButton","selectorColor","buttonHtml","CLASS_ICON","truncate","INPUT","SPIN","TOUCHEND","STATE_INVALID","INTEGER_REGEXP","NumericTextBox","isStep","_focusout","_arrows","_validation","_toggleText","factor","restrictDecimals","spinners","upArrowText","downArrowText","_upArrowEventHandler","_downArrowEventHandler","_spin","_upArrow","_downArrow","_arrowsWrap","aria-valuemin","aria-valuemax","adjusted","_adjust","_focusin","arrows","_spinning","_validationIcon","_focusing","groupRegExp","extractRegExp","caretPosition","_culture","_removeInvalidState","CLASSNAME","_initialTitle","_key","_step","isNumPadDecimal","_numericRegex","_addInvalidState","fractionRule","_floatRegExp","originalValue","rounder","isNotNull","DOMElement","fieldType","convertToValueBinding","bindAttr","createAttributes","ruleName","validation","DATATYPE","BINDING","specialRules","convertItems","addValidationRules","modelField","oldIE","nameSpecialCharRegExp","ERRORTEMPLATE","EQUAL_SET","editors","kendoNumericTextBox","kendoDatePicker","Editable","_validateProxy","_validate","clearContainer","skipFocus","editor","isObject","isValuesEditor","isCustomEditor","preventChangeTrigger","_validationEventInProgress","bindAttribute","bindingRegex","validatable","modelFields","DATABOUND","DATABINDING","FOCUSSELECTOR","KEDITITEM","EDIT","REMOVE","SAVE","ListView","_itemId","_pageable","_crudHandlers","navigatable","altTemplate","editTemplate","_item","_progress","_error","_destroyEditable","pagerId","pageable","pager","multi","_scrollTo","scrollDirectionFunc","UseJQueryoffset","elementOffset","elementDimension","containerScrollAmount","containerDimension","clickCallback","focusAgain","canHandle","isTextBox","editItem","edit","clearSelection","_modelFromElement","_closeEditable","kendoEditable","clickNS","getSortedDomIndices","isUndefined","DRAGGEDCLASS","FOCUSED_CLASS","SELECTED_STATE_CLASS","RESET","DRAG_CLUE_CLASS","DROP_HINT_CLASS","CommandFactory","ListBoxCommand","RemoveItemsCommand","MoveItemsCommand","MoveUpItemsCommand","MoveDownItemsCommand","TransferItemsCommand","TransferItemsToCommand","TransferItemsFromCommand","TransferAllItemsToCommand","TransferAllItemsFromCommand","kendoAttr","DASH","DOT","SPACE","HASH","KENDO_LISTBOX","DISABLED_STATE_CLASS","ENABLED_ITEM_SELECTOR","ENABLED_ITEMS_SELECTOR","TOOLBAR_CLASS","TOOL_SELECTOR","LIST_CLASS","LIST_SELECTOR","ADD","REORDER","MOVE_UP","MOVE_DOWN","TRANSFER_TO","TRANSFER_FROM","TRANSFER_ALL_TO","TRANSFER_ALL_FROM","UNIQUE_ID","COMMAND","MOVE_UP_OFFSET","MOVE_DOWN_OFFSET","TOOLBAR_POSITION_CLASS_NAMES","ListBox","_list","_createToolbar","_createNavigatable","_listTabIndex","_getList","_destroyToolbar","_target","_draggable","dropSources","tools","moveUp","moveDown","transferTo","transferFrom","transferAllTo","transferAllFrom","_addItem","_bindDataSource","_syncElement","itemContent","_addItemAt","_insertElementAt","_keyDown","_getTabIndex","oldTarget","_getNavigatableItem","nextAll","_scrollIntoView","shouldPreventDefault","_shiftSelecting","_executeCommand","elementNode","listBox","_searchConnectedListBox","connectedListBox","closestContainer","originalElement","getKendoListBox","draggableOptions","draggedItem","_updateToolbar","_updateAllToolbars","dataItemAtIndex","itemAtIndex","listItem","_removeElement","listItems","_getItems","_removeItem","uniqueIdAttr","enabledItems","_enableItem","_dataChangeHandler","_setItemIds","viewLength","toolbarElement","toolbarOptions","toolbarInsertion","commandName","execute","_updateToolStates","listBoxElements","elementsLength","_commands","commandType","getItems","canExecute","moveItems","movedItem","indecesInDom","movedItems","itemComparer","moveAction","item1","item2","indexItem1","indexItem2","domIndices","sourceListBox","getSourceListBox","destinationListBox","getDestinationListBox","updatedSelection","getUpdatedSelection","updateSelection","itemFilter","lastEnabledItem","containsLastItem","itemToSelect","_initTemplates","_createTools","_attachEventHandlers","_detachEventHandlers","toolsLength","toolsMessages","toolList","_createToolList","defaultTools","_onToolClick","_executeToolCommand","_updateToolState","toolName","toolElement","iconClass","stringDiffStart","str1","str2","MOUSEUP","PASTE","MaskedTextBox","_rules","_tokenize","_togglePrompt","_emptyMask","_timeoutId","_maskLength","clearPromptChar","unmaskOnPost","promptChar","0","9","#","L","?","&","C","_submitHandler","unmasked","_unmask","emptyMask","_mask","_unmaskedValue","_trackChange","_inputHandler","_legacyIEInputHandler","__changing","inputChange","backward","contentStart","endContent","lengthDiff","__dropping","_trimStartPromptChars","_findCaretPosBackwards","__backward","__pasting","chr","chrIdx","tokenIdx","tokensLength","_blinkInvalidState","_invalidStateTimeout","maskChars","getEffectDirection","parseDirection","updateItemClasses","IMG","IMAGE","LINK","DEFAULTSTATE","LINK_SELECTOR","excludedNodesRegExp","updateArrow","updateFirstLast","arrowCssClass","getArrowCssClass","MENU","updateHasAriaPopup","parentLi","getParentLiItems","storeItemSelectEventHandler","selectHandler","getItemSelectEventHandler","setItemData","popupOpenerSelector","popupGroupSelector","getChildPopups","currentPopup","overflowWrapper","childPopupOpener","opener","popupId","POPUP_OPENER_ATTR","popupParentItem","POPUP_ID_ATTR","itemPopup","animationContainerSelector","overflowMenuParents","getParents","mousewheelDelta","parentsScroll","scrollDirection","isPointerTouch","allPointers","pointerType","touchPointerTypes","isTouch","removeSpacesBetweenItems","ContextMenu","DELAY","SCROLLSPEED","TIMER","ZINDEX","POINTERDOWN","MOUSEWHEEL","SCROLLWIDTH","SCROLLHEIGHT","OFFSETWIDTH","OFFSETHEIGHT","KENDOPOPUP","HOVERSTATE","menuSelector","groupSelector","popupSelector","allItemsSelector","disabledSelector","itemSelector","availableItemsSelector","linkSelector","exclusionSelector","nextSelector","lastSelector","templateSelector","scrollButtonSelector","itemWrapper","scrollButton","image","sprite","rendering","wrapperCssClass","firstLevel","itemCssAttributes","imageCssAttributes","imageAttr","contentCssAttributes","contentAttr","defaultClasses","textClass","textAttributes","arrowClass","encoded","groupAttributes","expanded","groupCssClass","Menu","_initData","_updateClasses","_animations","nextItemZIndex","_initOverflow","_attachMenuEventsHandlers","openOnClick","clicked","closeOnClick","hoverDelay","scrollable","popupCollision","_overflowWrapper","_preventClose","_removeHoverItem","_checkActiveElement","_mouseleavePopup","_mouseenterPopup","_documentClickHandler","_documentClick","_detachMenuEventsHandlers","backwardBtn","forwardBtn","initialWidth","initialCssWidth","_openedPopups","_scrollWrapper","_initScrolling","_setOverflowWrapperWidth","_toggleScrollButtons","_popupsWrapper","menuWidth","borders","wrapperCssWidth","_reinitOverflow","overflowChanged","_destroyOverflow","popupWrapper","popupParentLi","isNumeric","mouseWheelDistance","backwardDouble","forwardDouble","scrolling","touchEvents","scrollValue","finish","mouseenterHandler","mousedownHandler","scrollSpeed","_closeChildPopups","currentScroll","_toggleDisabled","referenceItem","inserted","_insert","plain","groupData","renderGroup","renderItem","parentItems","visiblePopups","closePopup","overflowPopup","windowHeight","setScrolling","nextZindex","parentHorizontal","_triggerEvent","maxHeight","_configurePopupOverflow","_initPopupScrolling","popupOpener","groupId","_wrapPopupElement","skipMouseEvents","_initPopupScrollButtons","scrollButtons","_closeParentPopups","_keyTriggered","_setPopupHeight","popupOuterHeight","popupOffsetTop","bottomScrollbar","canFit","_initialHeight","dontClearClose","hasChildPopupsHovered","isPopupMouseLeaved","_isRootItem","_forceClose","isEnter","_closurePrevented","hoverItem","_hoverItem","_findRootParent","hasFocus","oldHoverItem","_oldHoverItem","nonContentGroupsSelector","_itemHasChildren","pointerTouch","delegateTarget","rootMenuItems","subMenuItems","toElement","_closePopups","rootPopup","groupParent","innerPopup","_innerPopup","openHandle","childGroup","childGroupVisible","shouldCloseTheRootItem","childPopupId","formNode","itemElement","targetHref","sampleHref","isLink","isLocalLink","isTargetLink","_parentsUntil","enterKey","itemSelectEventData","isSelectItemDefaultPrevented","isSelectDefaultPrevented","_getEventData","_moveHover","belongsToVertical","_itemBelongsToVertival","_itemDown","_itemUp","_itemEsc","_childPopupElement","menuIsVertical","nextItem","_scrollToItem","_itemRight","parentItem","_itemLeft","scrollDir","currentScrollOffset","itemSize","itemOffset","ulSize","scrollButtonSize","itemPosition","menu","renderContent","subGroup","renderItems","_marker","_wire","_initialWidth","alignToAnchor","_showProxy","_closeProxy","_configurePopupScrolling","_setPopupWidth","windowWidth","popupOuterWidth","popupOffsetLeft","maxWidth","_closeTimeoutProxy","_showHandler","_eventOrigin","_targetChild","normalClick","sameTarget","containment","_triggerProxy","updateItemHtml","toggleButton","HREF","LINKSELECTOR","GROUP","VISIBLEGROUP","EXPAND","COLLAPSE","ACTIVECLASS","GROUPS","CONTENTS","DISABLEDCLASS","SELECTEDSELECTOR","HIGHLIGHTCLASS","ACTIVEITEMSELECTOR","clickableItems","disabledItems","selectableItems","defaultState","SINGLE","contentUrl","ariaHidden","contentAttributes","itemIcon","PanelBar","_retryRequest","_first","expand","_angularCompile","requestFailed","retry","loadOnDemand","expandMode","_angularCompileElements","_angularCleanup","fieldAccessor","_fieldAccessor","useAnimation","animBackup","_animating","_addGroupElement","_collapseAllExpanded","_toggleItem","showProgress","loadingText","_refreshRoot","rootItemsHtml","_refreshChildren","_toggleGroup","findByUid","uidAttr","tempItem","_updateItems","_appendItems","_hasChildItems","retryHtml","_expanded","fieldBindings","itemsHtml","nodeWrapper","currentNode","panelBar","skipChange","_updateSelected","reload","focused","isReferenceItem","_updateItemsClasses","panels","panelsParent","_updateItemClasses","wrapElement","contentUrls","isAnchor","isVisible","notVisible","animationSettings","hasCollapseAnimation","_animationCallback","stopExpand","contentElement","statusIcon","loadingIconTimeout","DEFAULTMIN","DEFAULTMAX","DEFAULTVALUE","DEFAULTCHUNKCOUNT","KPROGRESSBAR","KPROGRESSBARREVERSE","KPROGRESSBARINDETERMINATE","KPROGRESSBARCOMPLETE","KPROGRESSWRAPPER","KPROGRESSSTATUS","KCOMPLETEDCHUNK","KUPCOMINGCHUNK","KSTATEDISABLED","PROGRESSTYPE","PERCENT","CHUNK","COMPLETE","HUNDREDPERCENT","DEFAULTANIMATIONDURATION","PRECISION","progressStatus","ProgressBar","_progressProperty","_fields","_validateType","_progressAnimation","_updateProgress","chunkCount","showStatus","_isStarted","progressWrapper","currentType","initialStatusValue","_addChunkProgressWrapper","_calculatePercentage","validated","_roundValue","_updateChunks","_onProgressUpdateAlways","_updateProgressWrapper","completedChunks","percentagesPerChunk","percentageParsed","completedChunksCount","animationDuration","_animation","animationCssOptions","_addRegularProgressWrapper","_onProgressAnimateStart","_onProgressAnimate","_onProgressAnimateComplete","always","progressStatusWrapSize","progressInPercent","progressValue","progressWrapperSize","chunkSize","_normalizeChunkSize","lastChunk","_calculateChunkSize","chunkContainer","_onePercent","ACTIVATE_EVENTS","ResponsivePanel","_toggleHandler","_toggleButtonClick","_registerBreakpoint","_mediaQuery","_registerStyle","breakpoint","head","styleSheet","createTextNode","prevented","updateTabClasses","tabs","ACTIVESTATE","TABONTOP","tabGroup","scrollButtonHtml","buttonClass","CONTENTURL","NAVIGATABLEITEMS","KEYBOARDNAVIGATABLEITEMS","HOVERABLEITEMS","DEFAULTDISTANCE","TabStrip","_contentUrls","_tabPosition","_scrollable","_keyDownProxy","wr","contentHolder","activateTab","_endItem","endItem","rtl","tabPosition","tab","dataEncodedField","dataContentField","dataContentUrlField","dataImageUrlField","dataUrlField","dataSpriteCssClass","collapsible","scrollWrap","_scrollableModeActive","_scrollPrevButton","_scrollNextButton","ajaxRequest","_create","_updateContentElements","_appendUrlItem","_moveUrlItem","_removeUrlItem","referenceTab","referenceContent","fromIndex","newTabsCreated","activeItem","activeTab","contentElements","_elementId","tabStripID","elementId","wrapperId","isInitialUpdate","currentContent","contentAnimators","tabsHeight","_setContentElementsDimensions","contentDivs","activeDiv","marginStyleProperty","_sizeScrollWrap","neighbours","oldFocusedTab","_scrollTabsToItem","deactivateTab","wrapperOffsetWidth","tabGroupScrollWidth","scrollPrevButton","scrollNextButton","mouseDown","mouseUp","_scrollableAllowed","_nowScrollingTabs","marginRight","_scrollTabsByDelta","tabGroupWidth","tabGroupPadding","scrLeft","hasCloseAnimation","oldTab","isAnimationEnabled","visibleContents","isAjaxContent","showContentElement","showContent","inRequest","abort","scrollContainer","halfWidth","fakeProgress","endState","oldProgressAnimation","ajaxOptions","ajaxSettings","request","progressUpload","upload","evt","noProgress","XMLHttpRequest","lengthComputable","stopProgress","statusText","tabStrip","offsetDiff","dst","midnight","noon","lastTimeOption","interval","TimeView","TimePicker","ARIA_ACTIVEDESCENDANT","_dates","_timeViewID","_heightHandler","dataBind","_html","msStart","lastIdx","msLastTime","msInterval","innerText","_distinctSelection","selectionIndex","timeView","timeFormat","ARIA_OWNS","dateViewParams","timeViewParams","DateTimePicker","_views","_icons","_midnight","_calculateMidnight","dateButtonText","timeButtonText","dateIcon","timeIcon","_timeIcon","secondView","minDateEqual","maxDateEqual","timeViewOptions","rebind","isDateViewVisible","adjustedDate","_timeSelected","icons","isPercentageSize","percentageUnitsRegex","isPixelSize","pxUnitsRegex","isFluid","calculateSize","panePropertyAccessor","triggersResize","splitter","paneConfig","PANE","PaneResizing","horizontalDefaults","verticalDefaults","_resizable","_createHint","resizeend","LAYOUTCHANGE","KPANE","PANECLASS","Splitter","_dimension","_keys","decrease","increase","_resizeStep","_initPanes","triggerHandler","_addOverlays","_panes","_removeOverlays","_togglePane","_detachEvents","panes","navigationKeys","isResizing","_triggerAction","panesConfig","_initPane","config","arrowType","_updateSplitBar","splitbar","previousPane","nextPane","catIconIf","iconType","condition","prevCollapsible","prevCollapsed","collapsed","nextCollapsible","nextCollapsed","_updateSplitBars","_removeSplitBars","sizedPanesWidth","sizedPanesCount","freeSizedPanes","freeSizePanesCount","freeSizePaneWidth","alternateSizingProperty","positioningProperty","sizingDomProperty","lastNonCollapsedPane","splitBars","splitBarsCount","sizingProperty","totalSize","collapsedSize","_addPane","paneElement","referencePane","mousePositioningProperty","previousPaneConfig","nextPaneConfig","prevBoundary","nextBoundary","toPx","prevMinSize","prevMaxSize","nextMinSize","nextMaxSize","ghostPosition","previousPaneNewSize","nextPaneNewSize","fluidPanesCount","constrain","buttonKeyTrigger","PopupBox","Alert","kendoAlert","Confirm","kendoConfirm","Prompt","kendoPrompt","KDIALOG","KWINDOW","KICONCLOSE","KCONTENTCLASS","KCONTENT","KSCROLL","KTITLELESS","KDIALOGTITLE","KDIALOGTITLEBAR","KBUTTONGROUP","KALERT","KCONFIRM","KPROMPT","KTEXTBOX","KOVERLAY","INITOPEN","okText","promptInput","overlaySelector","DialogBase","_init","_centerCallback","_center","wrapperTemplate","_createDialog","_defaultFocus","_dimensions","_tabKeyTrap","_triggerOpen","actions","_createActionbar","_closable","_setElementMaxHeight","_setElementHeight","paddingBox","elementMaxHeight","_paddingBox","_uiHeight","_applyScrollClassName","hasScroll","actionbar","actionbarHeight","titlebar","titlebarHeight","_overlay","overlay","_waiAriaOverlay","_removeWaiAriaOverlay","_overlayedNodes","jthis","hiddenValue","_closeClick","_closeKeyHandler","closable","titleId","titlebarActions","closeAction","isStretchedLayout","buttonLayout","_addButtons","_normalizeButtonSize","btn","actionClick","_actionClick","actionKeyHandler","_actionKeyHandler","buttonSize","_mergeTextWithOptions","lastButton","closeBtn","actionButtons","_runActionBtn","preventClose","toFront","_triggerInitOpen","_focusDialog","otherModalsVisible","overlayFx","showOptions","_animationOptions","_modals","Fade","fadeIn","_openAnimationEnd","basicAnimation","_initOpenTriggered","originalZIndex","windowObject","zIndexNew","_stopCenterOnResize","systemTriggered","hideOptions","_removeOverlay","_closeAnimationEnd","_centerOnResize","documentWindow","newLeft","newTop","_trackResize","modals","hideOverlay","_object","lastModal","zStack","encodedHtml","Dialog","alertWrapper","_ensureContentId","_ariaDescribedBy","_initFocus","_chooseEntryFocus","alert","confirmDialog","confirm","_createPrompt","promptContainer","promptInputContainer","promptDialog","prompt","executableScript","WindowResizing","_preventDragging","KWINDOWRESIZEHANDLES","addOverlay","removeOverlay","getPosition","parentOverflowX","parentOverflowY","offsetLeft","WindowDragging","KWINDOWTITLE","KWINDOWTITLEBAR","KWINDOWCONTENT","KDIALOGCONTENT","KHOVERSTATE","KFOCUSEDSTATE","MAXIMIZEDSTATE","CURSOR","REFRESH","MINIMIZE","MAXIMIZE","RESIZESTART","DATADOCOVERFLOWRULE","MINIMIZE_MAXIMIZE","KPIN","KUNPIN","PIN_UNPIN","TITLEBAR_BUTTONS","REFRESHICON","WINDOWEVENTSHANDLED","zero","Window","windowContent","windowFrame","globalWindow","suppressActions","_createWindow","_buttonEnter","_buttonLeave","_windowActionHandler","windowInstance","aria-labelledby","_onDocumentResize","toggleMaximization","resizeHandle","dragging","_actions","windowSpecificCommands","cachedOptions","fade","autoFocus","isMaximized","isMinimized","newWidth","newHeight","w","unpin","maximize","minimize","_actionForIcon","k-i-close","k-i-window-maximize","k-i-window-minimize","k-i-window-restore","k-i-refresh","k-i-pin","k-i-unpin","_isPinned","titleBarHeight","titleBar","doc","_activate","_documentScrollTop","_documentScrollLeft","_stopDocumentScrolling","suppressAnimation","defaultPrevented","_deactivate","_enableDocumentScrolling","_actionable","_shouldFocus","windowTop","currentWindow","restoreOptions","_sizingAction","actionId","$html","$body","_storeOverflowRule","_restoreOverflowRule","$element","_isOverflowStored","overflowRule","lrBorderWidth","tbBorderWidth","initOptions","contentFrame","_triggerRefresh","_ajaxComplete","_loadingIconTimeout","_ajaxError","_ajaxSuccess","contentTemplate","_showLoading","iframeSrcAttributes","contentHtml","hasMargin","wrapperPosition","relativeElMarginLeft","relativeElMarginTop","elementPadding","initialPosition","resizeDirection","initialSize","containerOffset","_relativeElMarginLeft","_relativeElMarginTop","windowBottom","windowRight","newWindowTop","initialWindowPosition","initialPointerPosition","startPosition","minLeftPosition","minTopPosition","_finishDrag","initPopOvers","popovers","preventScrollIfNotInput","initWidgets","UI_OVERLAY","BEFORE_SHOW","AFTER_SHOW","BEFORE_HIDE","defaultTransition","_layout","_scroller","_model","layout","getLayout","stretch","modelScope","scroller","$destroy","purge","inited","_invokeNgController","_padIfNativeScrolling","isAndroid","skin","isAndroidForced","hasPlatformIndependentSkin","topContainer","bottomContainer","scrollerContent","idAttrValue","contentSelector","controller","$apply","_callController","$scope","_locate","platform","previousView","bodyRegExp","LOAD_START","LOAD_COMPLETE","SHOW_START","SAME_VIEW_REQUESTED","VIEW_SHOW","VIEW_TYPE_DETERMINED","AFTER","ViewEngine","errorMessage","sandbox","_hideViews","rootView","rootNeeded","layouts","viewContainer","getLayoutProxy","_setupLayouts","viewOptions","loader","showView","remoteViewURLPrefix","showClosure","_findViewElement","_createView","serverNavigation","_loadView","modalViews","urlPath","_getLayout","_xhr","_xhrComplete","CAPTURE_EVENTS","Loader","captureEvents","_attachCapture","changeMessage","transitionDone","EXTERNAL","DUMMY_HREF","SKIP_TRANSITION_ON_BACK_BUTTON","WIDGET_RELS","historyCallback","viewEngine","_historyNavigate","_historyReplace","closeActiveDialogs","viewShow","loadStart","loadComplete","sameViewRequested","viewTypeDetermined","_setPortraitWidth","_setupAppLinks","dialogs","navigateToInitial","portraitWidth","bindToRouter","router","attrUrl","hideLoading","showLoading","changeLoadingMessage","linkRoles","pressedButtonSelector","buttonSelectors","_mouseup","_appLinkClick","rel","delayedTouchEnd","openFor","paneContainer","ARROW","OVERLAY","DIRECTION_CLASSES","DIRECTIONS","ANIMATION","REVERSE","popupOptions","containerPopup","offsetAmount","PopOver","initialOpen","SHIM","Shim","app","osname","ioswp","bb","shim","_hide","BEFORE_OPEN","WRAP","ModalView","_shim","AXIS","SWIPE_TO_OPEN","AFTER_HIDE","NULL_VIEW","Drawer","drawer","_viewShow","_attachTransition","swipeToOpen","leftPositioned","swipeToOpenViews","_moveViewTo","visibleOnCurrentView","_currentViewIncludedIn","_setAsCurrent","canMoveLeft","canMoveRight","leftSwipe","limitedPosition","newPosition","shouldShow","pastHalf","velocityThreshold","EXPANED_PANE_SHIM","SplitView","_style","_paramsHistory","expandedPaneShim","_shimUserEvents","collapsePanes","expandPanes","osCssClass","variant","setDefaultPlatform","statusBarStyle","wp8Background","noVariantSet","isOrientationHorizontal","getOrientationClass","setMinimumHeight","applyViewportHeight","HEAD","viewportTemplate","DEFAULT_OS","BERRYPHONEGAP","FONT_SIZE_COEF","CHROME","BROKEN_WEBVIEW_RESIZE","INITIALLY_HORIZONTAL","MOBILE_PLATFORMS","ios7","usedWithBlock","systemMeta","clipTemplate","ENABLE_CLIP","iconMeta","HIDEBAR","SUPPORT_SWIPE_TO_GO_BACK","HISTORY_TRANSITION","BARCOMPENSATION","STATUS_BAR_HEIGHT","SCREEN","Application","bootstrap","paneOptions","startHistory","_setupPlatform","_attachMeta","_setupElementClass","_attachHideBarHandlers","updateDocumentTitle","_setupDocumentTitle","_startHistory","hideAddressBar","browserHistory","historyTransition","retina","refreshBackgroundColorProxy","_resizeToScreenHeight","includeStatusBar","_clearExistingMeta","hideBar","defaultTitle","_hideBar","BUTTONS","CONTEXT_DATA","cancelTemplate","ActionSheet","ShimClass","_shimHideProxy","actionData","_shimHide","highlightButton","highlight","ANDROID3UP","deactivateTimeoutID","createBadge","useTap","clickOn","_userEvents","_timeoutDeactivate","badge","badgeElement","iconSpan","iconElement","BackButton","DetailButton","DISABLE","_button","selectOn","buttongroup","COLLAPSIBLE","INSET","HEADER_WRAPPER","CONTENT_WRAPPER","COLLAPSED","EXPANDED","ANIMATED","EXAPND","Collapsible","_buildHeader","inset","collapseIcon","expandIcon","iconPosition","instant","_getContentHeight","isCollapsed","whitespace","TEXT_NODE","whitespaceRegExp","addIcon","querySelector","enhanceItem","ICON_SELECTOR","enhanceLinkItem","itemAndDetailButtons","otherNodes","enhanceCheckBoxItem","putAt","VirtualListViewItem","LOAD_ICON","VirtualListViewLoadingIndicator","VirtualListViewPressToLoadMore","VirtualListViewItemBinder","ListViewItemBinder","ListViewFilter","ITEM_SELECTOR","HIGHLIGHT_SELECTOR","GROUP_CLASS","ACTIVE_CLASS","GROUP_WRAPPER","GROUP_TEMPLATE","SEARCH_TEMPLATE","STYLED","ITEM_CHANGE","buttonRegExp","HeaderFixer","headerFixer","cacheHeaders","_shouldFixHeaders","_cacheHeaders","_scrollHandler","_fixHeader","fixedHeaders","headerPair","currentHeader","DEFAULT_PULL_PARAMETERS","RefreshHandler","pullParameters","pull","_pulled","itemConstructor","prevItem","endReached","below","totalHeight","averageItemHeight","remainingItemsCount","batchUpdate","nextIndex","initialOffset","lastDirection","above","lastTop","topBorder","bottomBorder","setDataItem","_loadIcon","_loadButton","loadMoreText","loadMore","kendoMobileButton","_hideShowButton","_showLoadButton","chromeHeight","_scrollEnd","pressToLoadMore","virtualViewSize","updateScrollerSize","updateSize","itemBinder","adding","removing","prependOnRefresh","appendOnRefresh","groupedMode","findByDataItem","_shouldShowLoading","replaceGrouped","insertAt","endlessScroll","filterable","autoFilter","searchInput","_oldFilter","_filterChange","_dataSourceChange","_refreshInput","appliedFilters","_applyFilter","scrollTreshold","scrollThreshold","_headerFixer","_itemsCache","_itemBinder","_pullToRefreshHandler","_enhanceItems","emptyDataSource","_scrollerInstance","triggerChange","replaceItem","newItem","_dim","_highlight","plainItem","dataIDAttribute","templateProxy","groupTemplateProxy","_headerTemplate","buttonElement","_styleGroups","rootItems","grouped","enhanced","createContainer","toggleTitle","centerElement","noTitle","showTitle","NavBar","leftElement","rightElement","DRAG_START","DRAG_END","ElasticPane","ScrollViewContent","VirtualScrollViewContent","Page","ScrollView","CHANGING","CURRENT_PAGE_CLASS","VIRTUAL_PAGE_CLASS","CLEANUP","VIRTUAL_PAGE_COUNT","LEFT_PAGE","CETER_PAGE","RIGHT_PAGE","LEFT_SWIPE","NUDGE","RIGHT_SWIPE","scrollView","_changeProxy","_refreshProxy","pageHTML","pageCount","ScrollViewPager","updateDimension","transitionTo","ScrollViewElasticPane","_getPages","contentHeight","enablePager","pagerOverlay","paneMoved","swipeType","bounce","snap","nextPage","approx","minSnap","maxSnap","currentPage","updatePage","forcePageUpdate","resizeTo","containerHeight","pageElements","_paged","_initPages","_buffer","_pendingPageRefresh","_pendingWidgetRefresh","_resetPages","_resetProxy","_endReachedProxy","emptyTemplate","emptyTemplateProxy","setWidth","_repositionPages","_updatePagesContent","thresholdPassed","isEndReached","_cancelMove","_moveBackward","_moveForward","setPageContent","_resetMovable","_onResize","_onReset","_onEndReached","theContent","VirtualPage","mobileContainer","transitionEnd","dragStart","dragEnd","_syncWithContent","_content","viewInit","bounceVelocityThreshold","prevPage","_dragStart","_transitionEnd","limitValue","minLimit","maxLimit","SWITCHON","SWITCHOFF","MARGINLEFT","ACTIVE_STATE","DISABLED_STATE","RESOLVEDPREFIX","TRANSFORMSTYLE","SWITCH_MARKUP","Switch","onLabel","offLabel","background","snapPoint","_animateBackground","handleWidth","ACTIVE_STATE_CLASS","_buildButton","switchTo","_setActiveItem","switchByFullUrl","currentItem","tabstrip","withoutTimeout","$timeout","createWidget","attrs","origAttr","controllers","createIt","destroyRegister","kNgDisabled","kNgReadonly","isReadonly","kRebind","ctor","OPTIONS_NOW","exposeWidget","$emit","destroyWidgetOnScopeDestroy","setupRebind","$eval","bindToKNgDisabled","bindToKNgReadonly","kNgModel","bindToKNgModel","ngModel","bindToNgModel","ngForm","propagateClassToWidgetWrapper","kNgDelay","delayValue","parsed","unresolved","unwatch","$watch","$root","unregister","$attr","addOption","scopeValue","widgetEvents","optionsPath","kOptions","optionsValue","defaultOptions","dataName","eventKey","optionName","ignoredOwnProperties","ignoredAttributes","kDataSource","createDataSource","$log","kendoWidget","$parse","formValue","isForm","formRegExp","haveChangeOnElement","viewRender","onChange","currentVal","$viewValue","$modelValue","$render","formPristine","$pristine","$setViewValue","$setPristine","digest","$isEmpty","updating","valueIsCollection","currentValueLength","watchHandler","changeHandler","$angular_setLogicValue","$watchCollection","$setDirty","$angular_getLogicValue","deregister","$on","suspend","mo","disconnect","resume","observe","prevClassList","MutationObserver","classList","changes","chg","currClassList","attributeName","cls","rebindAttr","templateOptions","isUpload","_cleanUp","WIDGET_TEMPLATE_OPTIONS","templateContents","replaceChild","setTemplate","createDirectives","klass","make","directiveName","widgetName","module","directive","directiveFactory","shortcut","dashed","SKIP_SHORTCUTS","restrict","TAGNAMES","scopeField","kScopeField","MANUAL_DIRECTIVES","kendoWidgetInstance","isDigesting","destroyScope","defadvice","origMethod","pendingPatches","$injector","$defaultCompile","TreeList","TreeView","Scheduler","PivotGrid","PivotConfigurator","toDataSource","ds","mew","factory","kendoRenderedTimeout","RENDERED","require","$attrs","roleattr","Editor","Upload","MobileButton","MobileBackButton","MobileDetailButton","MobileListView","entry","arg","$angular_scope","$angular_init","itemScope","$$kendoScope","vars","$new","$angular_makeEventHandler","kendoEvent","elems","colIdx","locals","isString","_checkBoxSelection","angularDataItem","templateSettings","col","terminal","pre","_instance","post","kAttr","priority","TreeMap","MobileScrollView","Grid","templateDirectives","templateName","outerHTML"],"mappings":"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ACpB,IAAItjF,GAAW4wK,EAAS,GAAG8rB,SAC3B,OAAO,UAAUvpK,EAAO99B,EAAS08L,EAAOE,GAEpC,IADA,GAAIld,IACIA,GAAckd,EAAY/8L,QAC9B6/K,EAAakd,EAAY5iL,OAExB0lK,IAGDA,EAAW/0K,SAASy8L,EAAcz8L,GAClC3K,EAAQuwB,UAHRkvK,EAAKt0D,KAAKl9C,EAAW,4EAA8EpiF,EAAQ1M,KAAK,oBAW9IP,OAAOuB,MAAM8sB,OAAQruB,OAAOsuB,SACvBtuB,OAAOuB,OACE,kBAAVzB,SAAwBA,OAAO4iC,IAAM5iC,OAAS,SAAU6iC,EAAIC,EAAIC;CACrEA,GAAMD,OAEV,SAAU/iC,EAAGC,QACVA,OAAO,iBACH,aACA,eACA,cACA,aACA,WACA,mBACA,iBACA,aACA,qBACA,eACA,kBACA,mBACA,oBACA,wBACA,kBACA,iBACA,mBACA,eACA,cACA,cACA,qBACA,gBACA,gBACA,aACA,iBACA,kBACA,mBACA,qBACA,qBACA,iBACA,oBACA,oBACA,iBACA,gBACA,uBACA,sBACA,aACA,iBACA,iBACA,oBACA,wBACA,iBACA,mBACA,uBACA,eACA,iBACA,eACA,eACA,oBACA,uBACA,sBACA,wBACA,oBACA,oBACA,yBACA,sBACA,yBACA,oBACA,2BACA,2BACA,sBACA,2BACA,2BACA,wBACA,sBACA,0BACA,sBACA,wBACA,iBACDD,IACL,WACE,YACA,OAAOG,QAAOuB,OACE,kBAAVzB,SAAwBA,OAAO4iC,IAAM5iC,OAAS,SAAU6iC,EAAIC,EAAIC,IACrEA,GAAMD","file":"kendo.ui.core.min.js","sourcesContent":["/*!\n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n\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;\n        kendo.version = '2018.2.620'.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                        return customPrecision ? number.toExponential(precision) : number.toExponential();\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) {\n                    format = format[2] || format[0];\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                            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 patterns = culture.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;\n            if (!element.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);\n                percentage = percentWidth || percentHeight;\n                if (!percentWidth && (!autosize || autosize && width)) {\n                    width = autosize ? outerWidth(element) + 1 : outerWidth(element);\n                }\n                if (!percentHeight && (!autosize || autosize && height)) {\n                    height = outerHeight(element);\n                }\n                element.wrap($('<div/>').addClass('k-animation-container').css({\n                    width: width,\n                    height: height\n                }));\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                var 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            if (browser.msie && math.floor(browser.version) <= 7) {\n                element.css({ zoom: 1 });\n                element.children('.k-menu').width(element.width());\n            }\n            return element.parent();\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) {\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 = '&nbsp;';\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 = '<tr><td></td></tr>';\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].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.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, mozilla = support.browser.mozilla;\n            support.msPointers = !chrome && window.MSPointerEvent;\n            support.pointers = !chrome && !mozilla && 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, quoteRegExp = /\"/g, aposRegExp = /'/g, gtRegExp = />/g;\n        function htmlEncode(value) {\n            return ('' + value).replace(ampRegExp, '&amp;').replace(ltRegExp, '&lt;').replace(gtRegExp, '&gt;').replace(quoteRegExp, '&quot;').replace(aposRegExp, '&#39;');\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            webComponents: kendo.webComponents || [],\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            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, 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                    }\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;\n            for (option in options) {\n                value = parseOption(element, option);\n                if (value !== undefined) {\n                    if (templateRegExp.test(option)) {\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            ]) > -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('<div class=\\'{0}\\'><span class=\\'k-loading-text\\'>{1}</span><div class=\\'k-loading-image\\'/><div class=\\'k-loading-color\\'/></div>', 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;\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 (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.filters.visible(element) && !$(element).parents().addBack().filter(function () {\n                return $.css(this, 'visibility') === 'hidden';\n            }).length;\n        }\n        $.extend($.expr[':'], {\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        var on = $.fn.on;\n        function kendoJQuery(selector, context) {\n            return new kendoJQuery.fn.init(selector, context);\n        }\n        extend(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 (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                }\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(kendo.date.getDate(date).getTime() + kendo.date.getMilliseconds(time));\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        (function () {\n            function postToProxy(dataURI, fileName, proxyURL, proxyTarget) {\n                var form = $('<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                        $('<input>').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    }(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.router', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'router',\n        name: 'Router',\n        category: 'framework',\n        description: 'The Router class is responsible for tracking the application state and navigating between the application states.',\n        depends: ['core'],\n        hidden: false\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, CHANGE = 'change', BACK = 'back', SAME = 'same', support = kendo.support, location = window.location, history = window.history, CHECK_URL_INTERVAL = 50, BROKEN_BACK_NAV = kendo.support.browser.msie, hashStrip = /^#*/, document = window.document;\n        function absoluteURL(path, pathPrefix) {\n            if (!pathPrefix) {\n                return path;\n            }\n            if (path + '/' === pathPrefix) {\n                path = pathPrefix;\n            }\n            var regEx = new RegExp('^' + pathPrefix, 'i');\n            if (!regEx.test(path)) {\n                path = pathPrefix + '/' + path;\n            }\n            return location.protocol + '//' + (location.host + '/' + path).replace(/\\/\\/+/g, '/');\n        }\n        function hashDelimiter(bang) {\n            return bang ? '#!' : '#';\n        }\n        function locationHash(hashDelimiter) {\n            var href = location.href;\n            if (hashDelimiter === '#!' && href.indexOf('#') > -1 && href.indexOf('#!') < 0) {\n                return null;\n            }\n            return href.split(hashDelimiter)[1] || '';\n        }\n        function stripRoot(root, url) {\n            if (url.indexOf(root) === 0) {\n                return url.substr(root.length).replace(/\\/\\//g, '/');\n            } else {\n                return url;\n            }\n        }\n        var HistoryAdapter = kendo.Class.extend({\n            back: function () {\n                if (BROKEN_BACK_NAV) {\n                    setTimeout(function () {\n                        history.back();\n                    });\n                } else {\n                    history.back();\n                }\n            },\n            forward: function () {\n                if (BROKEN_BACK_NAV) {\n                    setTimeout(function () {\n                        history.forward();\n                    });\n                } else {\n                    history.forward();\n                }\n            },\n            length: function () {\n                return history.length;\n            },\n            replaceLocation: function (url) {\n                location.replace(url);\n            }\n        });\n        var PushStateAdapter = HistoryAdapter.extend({\n            init: function (root) {\n                this.root = root;\n            },\n            navigate: function (to) {\n                history.pushState({}, document.title, absoluteURL(to, this.root));\n            },\n            replace: function (to) {\n                history.replaceState({}, document.title, absoluteURL(to, this.root));\n            },\n            normalize: function (url) {\n                return stripRoot(this.root, url);\n            },\n            current: function () {\n                var current = location.pathname;\n                if (location.search) {\n                    current += location.search;\n                }\n                return stripRoot(this.root, current);\n            },\n            change: function (callback) {\n                $(window).bind('popstate.kendo', callback);\n            },\n            stop: function () {\n                $(window).unbind('popstate.kendo');\n            },\n            normalizeCurrent: function (options) {\n                var fixedUrl, root = options.root, pathname = location.pathname, hash = locationHash(hashDelimiter(options.hashBang));\n                if (root === pathname + '/') {\n                    fixedUrl = root;\n                }\n                if (root === pathname && hash) {\n                    fixedUrl = absoluteURL(hash.replace(hashStrip, ''), root);\n                }\n                if (fixedUrl) {\n                    history.pushState({}, document.title, fixedUrl);\n                }\n            }\n        });\n        function fixHash(url) {\n            return url.replace(/^(#)?/, '#');\n        }\n        function fixBang(url) {\n            return url.replace(/^(#(!)?)?/, '#!');\n        }\n        var HashAdapter = HistoryAdapter.extend({\n            init: function (bang) {\n                this._id = kendo.guid();\n                this.prefix = hashDelimiter(bang);\n                this.fix = bang ? fixBang : fixHash;\n            },\n            navigate: function (to) {\n                location.hash = this.fix(to);\n            },\n            replace: function (to) {\n                this.replaceLocation(this.fix(to));\n            },\n            normalize: function (url) {\n                if (url.indexOf(this.prefix) < 0) {\n                    return url;\n                } else {\n                    return url.split(this.prefix)[1];\n                }\n            },\n            change: function (callback) {\n                if (support.hashChange) {\n                    $(window).on('hashchange.' + this._id, callback);\n                } else {\n                    this._interval = setInterval(callback, CHECK_URL_INTERVAL);\n                }\n            },\n            stop: function () {\n                $(window).off('hashchange.' + this._id);\n                clearInterval(this._interval);\n            },\n            current: function () {\n                return locationHash(this.prefix);\n            },\n            normalizeCurrent: function (options) {\n                var pathname = location.pathname, root = options.root;\n                if (options.pushState && root !== pathname) {\n                    this.replaceLocation(root + this.prefix + stripRoot(root, pathname));\n                    return true;\n                }\n                return false;\n            }\n        });\n        var History = kendo.Observable.extend({\n            start: function (options) {\n                options = options || {};\n                this.bind([\n                    CHANGE,\n                    BACK,\n                    SAME\n                ], options);\n                if (this._started) {\n                    return;\n                }\n                this._started = true;\n                options.root = options.root || '/';\n                var adapter = this.createAdapter(options), current;\n                if (adapter.normalizeCurrent(options)) {\n                    return;\n                }\n                current = adapter.current();\n                $.extend(this, {\n                    adapter: adapter,\n                    root: options.root,\n                    historyLength: adapter.length(),\n                    current: current,\n                    locations: [current]\n                });\n                adapter.change($.proxy(this, '_checkUrl'));\n            },\n            createAdapter: function (options) {\n                return support.pushState && options.pushState ? new PushStateAdapter(options.root) : new HashAdapter(options.hashBang);\n            },\n            stop: function () {\n                if (!this._started) {\n                    return;\n                }\n                this.adapter.stop();\n                this.unbind(CHANGE);\n                this._started = false;\n            },\n            change: function (callback) {\n                this.bind(CHANGE, callback);\n            },\n            replace: function (to, silent) {\n                this._navigate(to, silent, function (adapter) {\n                    adapter.replace(to);\n                    this.locations[this.locations.length - 1] = this.current;\n                });\n            },\n            navigate: function (to, silent) {\n                if (to === '#:back') {\n                    this.backCalled = true;\n                    this.adapter.back();\n                    return;\n                }\n                this._navigate(to, silent, function (adapter) {\n                    adapter.navigate(to);\n                    this.locations.push(this.current);\n                });\n            },\n            _navigate: function (to, silent, callback) {\n                var adapter = this.adapter;\n                to = adapter.normalize(to);\n                if (this.current === to || this.current === decodeURIComponent(to)) {\n                    this.trigger(SAME);\n                    return;\n                }\n                if (!silent) {\n                    if (this.trigger(CHANGE, {\n                            url: to,\n                            decode: false\n                        })) {\n                        return;\n                    }\n                }\n                this.current = to;\n                callback.call(this, adapter);\n                this.historyLength = adapter.length();\n            },\n            _checkUrl: function () {\n                var adapter = this.adapter, current = adapter.current(), newLength = adapter.length(), navigatingInExisting = this.historyLength === newLength, back = current === this.locations[this.locations.length - 2] && navigatingInExisting, backCalled = this.backCalled, prev = this.current;\n                if (current === null || this.current === current || this.current === decodeURIComponent(current)) {\n                    return true;\n                }\n                this.historyLength = newLength;\n                this.backCalled = false;\n                this.current = current;\n                if (back && this.trigger('back', {\n                        url: prev,\n                        to: current\n                    })) {\n                    adapter.forward();\n                    this.current = prev;\n                    return;\n                }\n                if (this.trigger(CHANGE, {\n                        url: current,\n                        backButtonPressed: !backCalled\n                    })) {\n                    if (back) {\n                        adapter.forward();\n                    } else {\n                        adapter.back();\n                        this.historyLength--;\n                    }\n                    this.current = prev;\n                    return;\n                }\n                if (back) {\n                    this.locations.pop();\n                } else {\n                    this.locations.push(current);\n                }\n            }\n        });\n        kendo.History = History;\n        kendo.History.HistoryAdapter = HistoryAdapter;\n        kendo.History.HashAdapter = HashAdapter;\n        kendo.History.PushStateAdapter = PushStateAdapter;\n        kendo.absoluteURL = absoluteURL;\n        kendo.history = new History();\n    }(window.kendo.jQuery));\n    (function () {\n        var kendo = window.kendo, history = kendo.history, Observable = kendo.Observable, INIT = 'init', ROUTE_MISSING = 'routeMissing', CHANGE = 'change', BACK = 'back', SAME = 'same', optionalParam = /\\((.*?)\\)/g, namedParam = /(\\(\\?)?:\\w+/g, splatParam = /\\*\\w+/g, escapeRegExp = /[\\-{}\\[\\]+?.,\\\\\\^$|#\\s]/g;\n        function namedParamReplace(match, optional) {\n            return optional ? match : '([^/]+)';\n        }\n        function routeToRegExp(route, ignoreCase) {\n            return new RegExp('^' + route.replace(escapeRegExp, '\\\\$&').replace(optionalParam, '(?:$1)?').replace(namedParam, namedParamReplace).replace(splatParam, '(.*?)') + '$', ignoreCase ? 'i' : '');\n        }\n        function stripUrl(url) {\n            return url.replace(/(\\?.*)|(#.*)/g, '');\n        }\n        var Route = kendo.Class.extend({\n            init: function (route, callback, ignoreCase) {\n                if (!(route instanceof RegExp)) {\n                    route = routeToRegExp(route, ignoreCase);\n                }\n                this.route = route;\n                this._callback = callback;\n            },\n            callback: function (url, back, decode) {\n                var params, idx = 0, length, queryStringParams = kendo.parseQueryStringParams(url);\n                queryStringParams._back = back;\n                url = stripUrl(url);\n                params = this.route.exec(url).slice(1);\n                length = params.length;\n                if (decode) {\n                    for (; idx < length; idx++) {\n                        if (typeof params[idx] !== 'undefined') {\n                            params[idx] = decodeURIComponent(params[idx]);\n                        }\n                    }\n                }\n                params.push(queryStringParams);\n                this._callback.apply(null, params);\n            },\n            worksWith: function (url, back, decode) {\n                if (this.route.test(stripUrl(url))) {\n                    this.callback(url, back, decode);\n                    return true;\n                } else {\n                    return false;\n                }\n            }\n        });\n        var Router = Observable.extend({\n            init: function (options) {\n                if (!options) {\n                    options = {};\n                }\n                Observable.fn.init.call(this);\n                this.routes = [];\n                this.pushState = options.pushState;\n                this.hashBang = options.hashBang;\n                this.root = options.root;\n                this.ignoreCase = options.ignoreCase !== false;\n                this.bind([\n                    INIT,\n                    ROUTE_MISSING,\n                    CHANGE,\n                    SAME\n                ], options);\n            },\n            destroy: function () {\n                history.unbind(CHANGE, this._urlChangedProxy);\n                history.unbind(SAME, this._sameProxy);\n                history.unbind(BACK, this._backProxy);\n                this.unbind();\n            },\n            start: function () {\n                var that = this, sameProxy = function () {\n                        that._same();\n                    }, backProxy = function (e) {\n                        that._back(e);\n                    }, urlChangedProxy = function (e) {\n                        that._urlChanged(e);\n                    };\n                history.start({\n                    same: sameProxy,\n                    change: urlChangedProxy,\n                    back: backProxy,\n                    pushState: that.pushState,\n                    hashBang: that.hashBang,\n                    root: that.root\n                });\n                var initEventObject = {\n                    url: history.current || '/',\n                    preventDefault: $.noop\n                };\n                if (!that.trigger(INIT, initEventObject)) {\n                    that._urlChanged(initEventObject);\n                }\n                this._urlChangedProxy = urlChangedProxy;\n                this._backProxy = backProxy;\n            },\n            route: function (route, callback) {\n                this.routes.push(new Route(route, callback, this.ignoreCase));\n            },\n            navigate: function (url, silent) {\n                kendo.history.navigate(url, silent);\n            },\n            replace: function (url, silent) {\n                kendo.history.replace(url, silent);\n            },\n            _back: function (e) {\n                if (this.trigger(BACK, {\n                        url: e.url,\n                        to: e.to\n                    })) {\n                    e.preventDefault();\n                }\n            },\n            _same: function () {\n                this.trigger(SAME);\n            },\n            _urlChanged: function (e) {\n                var url = e.url;\n                var decode = !!e.decode;\n                var back = e.backButtonPressed;\n                if (!url) {\n                    url = '/';\n                }\n                if (this.trigger(CHANGE, {\n                        url: e.url,\n                        params: kendo.parseQueryStringParams(e.url),\n                        backButtonPressed: back\n                    })) {\n                    e.preventDefault();\n                    return;\n                }\n                var idx = 0, routes = this.routes, route, length = routes.length;\n                for (; idx < length; idx++) {\n                    route = routes[idx];\n                    if (route.worksWith(url, back, decode)) {\n                        return;\n                    }\n                }\n                if (this.trigger(ROUTE_MISSING, {\n                        url: url,\n                        params: kendo.parseQueryStringParams(url),\n                        backButtonPressed: back\n                    })) {\n                    e.preventDefault();\n                }\n            }\n        });\n        kendo.Router = Router;\n    }());\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, DEFAULT_THRESHOLD = support.browser.msie ? 5 : 0, PRESS = 'press', HOLD = 'hold', SELECT = 'select', START = 'start', MOVE = 'move', END = 'end', CANCEL = 'cancel', TAP = 'tap', 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                    _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            _hold: function () {\n                this._trigger(HOLD, this.pressEvent);\n            },\n            move: function (touchInfo) {\n                var that = this;\n                if (that._finished) {\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                        this._trigger(TAP, touchInfo);\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                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                    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.touch', [\n        'kendo.core',\n        'kendo.userevents'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'touch',\n        name: 'Touch',\n        category: 'mobile',\n        description: 'The kendo Touch widget provides a cross-platform compatible API for handling user-initiated touch events, multi-touch gestures and event sequences (drag, swipe, etc.). ',\n        depends: [\n            'core',\n            'userevents'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, proxy = $.proxy, abs = Math.abs, MAX_DOUBLE_TAP_DISTANCE = 20;\n        var Touch = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.element;\n                that.wrapper = element;\n                function eventProxy(name) {\n                    return function (e) {\n                        that._triggerTouch(name, e);\n                    };\n                }\n                function gestureEventProxy(name) {\n                    return function (e) {\n                        that.trigger(name, {\n                            touches: e.touches,\n                            distance: e.distance,\n                            center: e.center,\n                            event: e.event\n                        });\n                    };\n                }\n                that.events = new kendo.UserEvents(element, {\n                    filter: options.filter,\n                    surface: options.surface,\n                    minHold: options.minHold,\n                    multiTouch: options.multiTouch,\n                    allowSelection: true,\n                    fastTap: options.fastTap,\n                    press: eventProxy('touchstart'),\n                    hold: eventProxy('hold'),\n                    tap: proxy(that, '_tap'),\n                    gesturestart: gestureEventProxy('gesturestart'),\n                    gesturechange: gestureEventProxy('gesturechange'),\n                    gestureend: gestureEventProxy('gestureend')\n                });\n                if (options.enableSwipe) {\n                    that.events.bind('start', proxy(that, '_swipestart'));\n                    that.events.bind('move', proxy(that, '_swipemove'));\n                } else {\n                    that.events.bind('start', proxy(that, '_dragstart'));\n                    that.events.bind('move', eventProxy('drag'));\n                    that.events.bind('end', eventProxy('dragend'));\n                }\n                kendo.notify(that);\n            },\n            events: [\n                'touchstart',\n                'dragstart',\n                'drag',\n                'dragend',\n                'tap',\n                'doubletap',\n                'hold',\n                'swipe',\n                'gesturestart',\n                'gesturechange',\n                'gestureend'\n            ],\n            options: {\n                name: 'Touch',\n                surface: null,\n                global: false,\n                fastTap: false,\n                filter: null,\n                multiTouch: false,\n                enableSwipe: false,\n                minXDelta: 30,\n                maxYDelta: 20,\n                maxDuration: 1000,\n                minHold: 800,\n                doubleTapTimeout: 800\n            },\n            cancel: function () {\n                this.events.cancel();\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.events.destroy();\n            },\n            _triggerTouch: function (type, e) {\n                if (this.trigger(type, {\n                        touch: e.touch,\n                        event: e.event\n                    })) {\n                    e.preventDefault();\n                }\n            },\n            _tap: function (e) {\n                var that = this, lastTap = that.lastTap, touch = e.touch;\n                if (lastTap && touch.endTime - lastTap.endTime < that.options.doubleTapTimeout && kendo.touchDelta(touch, lastTap).distance < MAX_DOUBLE_TAP_DISTANCE) {\n                    that._triggerTouch('doubletap', e);\n                    that.lastTap = null;\n                } else {\n                    that._triggerTouch('tap', e);\n                    that.lastTap = touch;\n                }\n            },\n            _dragstart: function (e) {\n                this._triggerTouch('dragstart', e);\n            },\n            _swipestart: function (e) {\n                if (abs(e.x.velocity) * 2 >= abs(e.y.velocity)) {\n                    e.sender.capture();\n                }\n            },\n            _swipemove: function (e) {\n                var that = this, options = that.options, touch = e.touch, duration = e.event.timeStamp - touch.startTime, direction = touch.x.initialDelta > 0 ? 'right' : 'left';\n                if (abs(touch.x.initialDelta) >= options.minXDelta && abs(touch.y.initialDelta) < options.maxYDelta && duration < options.maxDuration) {\n                    that.trigger('swipe', {\n                        direction: direction,\n                        touch: e.touch\n                    });\n                    touch.cancel();\n                }\n            }\n        });\n        kendo.ui.plugin(Touch);\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                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 === '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', 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 () {\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();\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) {\n                Observable.fn.init.call(this);\n                this.type = type || ObservableObject;\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) {\n                return this.hasOwnProperty(field) && field !== '_handlers' && field !== '_events' && 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 () {\n                var result = {}, value, field;\n                for (field in this) {\n                    if (this.shouldSerialize(field)) {\n                        value = this[field];\n                        if (value instanceof ObservableObject || value instanceof ObservableArray) {\n                            value = value.toJSON();\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, initiator) {\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, initiator) && !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) {\n                    b += '';\n                    if (ignore) {\n                        a = '(' + a + ' || \\'\\').toLowerCase()';\n                        b = b.toLowerCase();\n                    }\n                    return impl(a, quote(b), ignore);\n                };\n            }\n            function operator(op, a, b, ignore) {\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(b.toLowerCase());\n                            a = '((' + a + ' || \\'\\')+\\'\\').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) {\n                    return operator('==', a, b, ignore);\n                },\n                neq: function (a, b, ignore) {\n                    return operator('!=', a, b, ignore);\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);\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        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) {\n            var descriptor = typeof field === STRING ? {\n                    field: field,\n                    dir: dir\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                };\n            });\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                if (isEmptyObject(descriptor) || !this.data.length) {\n                    return new Query([]);\n                }\n                var field = descriptor.field, sorted = 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                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            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.process = function (data, options, inPlace) {\n            options = options || {};\n            var query = new Query(data), group = options.group, sort = normalizeGroup(group || []).concat(normalizeSort(options.sort || [])), 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 && !inPlace) {\n                query = query.sort(sort);\n                if (group) {\n                    data = query.toArray();\n                }\n            }\n            if (skip !== undefined && take !== undefined) {\n                query = query.range(skip, take);\n            }\n            if (group) {\n                query = query.group(group, data);\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 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);\n                    }\n                }\n            }\n        }\n        function eachGroupItems(data, func) {\n            for (var idx = 0, length = data.length; idx < 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) {\n                if (!isArray(items)) {\n                    items = [items];\n                }\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) {\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._change({ action: 'sync' });\n                        that.trigger(SYNC);\n                    });\n                } else {\n                    that._storeData(true);\n                    that._change({ action: 'sync' });\n                }\n                return promise;\n            },\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._change();\n                    that._markOfflineUpdatesAsDirty();\n                }\n            },\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]) : 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                            items.splice(idx, 1);\n                            that._removeModelFromRanges(model);\n                        }\n                    }\n                });\n            },\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;\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                    var 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                that._pristineData = data.slice(0);\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                    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._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) {\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                    that._aggregateResult = that._calculateAggregates(data, options);\n                }\n                result = that._queryProcess(data, options);\n                that.view(result.data);\n                if (result.total !== undefined && !that.options.serverFiltering) {\n                    that._total = result.total;\n                }\n                e = e || {};\n                e.items = e.items || that._view;\n                that.trigger(CHANGE, e);\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                    }\n                    if (options.filter) {\n                        that._filter = options.filter = 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                    if (!this.options.serverFiltering) {\n                        if (result.total !== undefined) {\n                            this._total = result.total;\n                        } else {\n                            this._total = this._data.length;\n                        }\n                    }\n                    this._aggregateResult = this._calculateAggregates(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            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().then(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({ 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({\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._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            _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(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 = normalizeGroup(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 result, range;\n                for (var idx = 0, length = this._ranges.length; idx < length; idx++) {\n                    range = this._ranges[idx];\n                    this._eachItem(range.data, function (items) {\n                        result = removeModel(items, model);\n                    });\n                    if (result) {\n                        break;\n                    }\n                }\n                that._updateRangesLength();\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                expressions = 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.binder', [\n        'kendo.core',\n        'kendo.data'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'binder',\n        name: 'MVVM',\n        category: 'framework',\n        description: 'Model View ViewModel (MVVM) is a design pattern which helps developers separate the Model (the data) from the View (the UI).',\n        depends: [\n            'core',\n            'data'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Observable = kendo.Observable, ObservableObject = kendo.data.ObservableObject, ObservableArray = kendo.data.ObservableArray, toString = {}.toString, binders = {}, Class = kendo.Class, proxy = $.proxy, VALUE = 'value', SOURCE = 'source', EVENTS = 'events', CHECKED = 'checked', CSS = 'css', deleteExpando = true, FUNCTION = 'function', CHANGE = 'change';\n        (function () {\n            var a = document.createElement('a');\n            try {\n                delete a.test;\n            } catch (e) {\n                deleteExpando = false;\n            }\n        }());\n        var Binding = Observable.extend({\n            init: function (parents, path) {\n                var that = this;\n                Observable.fn.init.call(that);\n                that.source = parents[0];\n                that.parents = parents;\n                that.path = path;\n                that.dependencies = {};\n                that.dependencies[path] = true;\n                that.observable = that.source instanceof Observable;\n                that._access = function (e) {\n                    that.dependencies[e.field] = true;\n                };\n                if (that.observable) {\n                    that._change = function (e) {\n                        that.change(e);\n                    };\n                    that.source.bind(CHANGE, that._change);\n                }\n            },\n            _parents: function () {\n                var parents = this.parents;\n                var value = this.get();\n                if (value && typeof value.parent == 'function') {\n                    var parent = value.parent();\n                    if ($.inArray(parent, parents) < 0) {\n                        parents = [parent].concat(parents);\n                    }\n                }\n                return parents;\n            },\n            change: function (e) {\n                var dependency, ch, field = e.field, that = this;\n                if (that.path === 'this') {\n                    that.trigger(CHANGE, e);\n                } else {\n                    for (dependency in that.dependencies) {\n                        if (dependency.indexOf(field) === 0) {\n                            ch = dependency.charAt(field.length);\n                            if (!ch || ch === '.' || ch === '[') {\n                                that.trigger(CHANGE, e);\n                                break;\n                            }\n                        }\n                    }\n                }\n            },\n            start: function (source) {\n                source.bind('get', this._access);\n            },\n            stop: function (source) {\n                source.unbind('get', this._access);\n            },\n            get: function () {\n                var that = this, source = that.source, index = 0, path = that.path, result = source;\n                if (!that.observable) {\n                    return result;\n                }\n                that.start(that.source);\n                result = source.get(path);\n                while (result === undefined && source) {\n                    source = that.parents[++index];\n                    if (source instanceof ObservableObject) {\n                        result = source.get(path);\n                    }\n                }\n                if (result === undefined) {\n                    source = that.source;\n                    while (result === undefined && source) {\n                        source = source.parent();\n                        if (source instanceof ObservableObject) {\n                            result = source.get(path);\n                        }\n                    }\n                }\n                if (typeof result === 'function') {\n                    index = path.lastIndexOf('.');\n                    if (index > 0) {\n                        source = source.get(path.substring(0, index));\n                    }\n                    that.start(source);\n                    if (source !== that.source) {\n                        result = result.call(source, that.source);\n                    } else {\n                        result = result.call(source);\n                    }\n                    that.stop(source);\n                }\n                if (source && source !== that.source) {\n                    that.currentSource = source;\n                    source.unbind(CHANGE, that._change).bind(CHANGE, that._change);\n                }\n                that.stop(that.source);\n                return result;\n            },\n            set: function (value) {\n                var source = this.currentSource || this.source;\n                var field = kendo.getter(this.path)(source);\n                if (typeof field === 'function') {\n                    if (source !== this.source) {\n                        field.call(source, this.source, value);\n                    } else {\n                        field.call(source, value);\n                    }\n                } else {\n                    source.set(this.path, value);\n                }\n            },\n            destroy: function () {\n                if (this.observable) {\n                    this.source.unbind(CHANGE, this._change);\n                    if (this.currentSource) {\n                        this.currentSource.unbind(CHANGE, this._change);\n                    }\n                }\n                this.unbind();\n            }\n        });\n        var EventBinding = Binding.extend({\n            get: function () {\n                var source = this.source, path = this.path, index = 0, handler;\n                handler = source.get(path);\n                while (!handler && source) {\n                    source = this.parents[++index];\n                    if (source instanceof ObservableObject) {\n                        handler = source.get(path);\n                    }\n                }\n                return proxy(handler, source);\n            }\n        });\n        var TemplateBinding = Binding.extend({\n            init: function (source, path, template) {\n                var that = this;\n                Binding.fn.init.call(that, source, path);\n                that.template = template;\n            },\n            render: function (value) {\n                var html;\n                this.start(this.source);\n                html = kendo.render(this.template, value);\n                this.stop(this.source);\n                return html;\n            }\n        });\n        var Binder = Class.extend({\n            init: function (element, bindings, options) {\n                this.element = element;\n                this.bindings = bindings;\n                this.options = options;\n            },\n            bind: function (binding, attribute) {\n                var that = this;\n                binding = attribute ? binding[attribute] : binding;\n                binding.bind(CHANGE, function (e) {\n                    that.refresh(attribute || e);\n                });\n                that.refresh(attribute);\n            },\n            destroy: function () {\n            }\n        });\n        var TypedBinder = Binder.extend({\n            dataType: function () {\n                var dataType = this.element.getAttribute('data-type') || this.element.type || 'text';\n                return dataType.toLowerCase();\n            },\n            parsedValue: function () {\n                return this._parseValue(this.element.value, this.dataType());\n            },\n            _parseValue: function (value, dataType) {\n                if (dataType == 'date') {\n                    value = kendo.parseDate(value, 'yyyy-MM-dd');\n                } else if (dataType == 'datetime-local') {\n                    value = kendo.parseDate(value, [\n                        'yyyy-MM-ddTHH:mm:ss',\n                        'yyyy-MM-ddTHH:mm'\n                    ]);\n                } else if (dataType == 'number') {\n                    value = kendo.parseFloat(value);\n                } else if (dataType == 'boolean') {\n                    value = value.toLowerCase();\n                    if (kendo.parseFloat(value) !== null) {\n                        value = Boolean(kendo.parseFloat(value));\n                    } else {\n                        value = value.toLowerCase() === 'true';\n                    }\n                }\n                return value;\n            }\n        });\n        binders.attr = Binder.extend({\n            refresh: function (key) {\n                this.element.setAttribute(key, this.bindings.attr[key].get());\n            }\n        });\n        binders.css = Binder.extend({\n            init: function (element, bindings, options) {\n                Binder.fn.init.call(this, element, bindings, options);\n                this.classes = {};\n            },\n            refresh: function (className) {\n                var element = $(this.element), binding = this.bindings.css[className], hasClass = this.classes[className] = binding.get();\n                if (hasClass) {\n                    element.addClass(className);\n                } else {\n                    element.removeClass(className);\n                }\n            }\n        });\n        binders.style = Binder.extend({\n            refresh: function (key) {\n                this.element.style[key] = this.bindings.style[key].get() || '';\n            }\n        });\n        binders.enabled = Binder.extend({\n            refresh: function () {\n                if (this.bindings.enabled.get()) {\n                    this.element.removeAttribute('disabled');\n                } else {\n                    this.element.setAttribute('disabled', 'disabled');\n                }\n            }\n        });\n        binders.readonly = Binder.extend({\n            refresh: function () {\n                if (this.bindings.readonly.get()) {\n                    this.element.setAttribute('readonly', 'readonly');\n                } else {\n                    this.element.removeAttribute('readonly');\n                }\n            }\n        });\n        binders.disabled = Binder.extend({\n            refresh: function () {\n                if (this.bindings.disabled.get()) {\n                    this.element.setAttribute('disabled', 'disabled');\n                } else {\n                    this.element.removeAttribute('disabled');\n                }\n            }\n        });\n        binders.events = Binder.extend({\n            init: function (element, bindings, options) {\n                Binder.fn.init.call(this, element, bindings, options);\n                this.handlers = {};\n            },\n            refresh: function (key) {\n                var element = $(this.element), binding = this.bindings.events[key], handler = this.handlers[key];\n                if (handler) {\n                    element.off(key, handler);\n                }\n                handler = this.handlers[key] = binding.get();\n                element.on(key, binding.source, handler);\n            },\n            destroy: function () {\n                var element = $(this.element), handler;\n                for (handler in this.handlers) {\n                    element.off(handler, this.handlers[handler]);\n                }\n            }\n        });\n        binders.text = Binder.extend({\n            refresh: function () {\n                var text = this.bindings.text.get();\n                var dataFormat = this.element.getAttribute('data-format') || '';\n                if (text == null) {\n                    text = '';\n                }\n                $(this.element).text(kendo.toString(text, dataFormat));\n            }\n        });\n        binders.visible = Binder.extend({\n            refresh: function () {\n                if (this.bindings.visible.get()) {\n                    this.element.style.display = '';\n                } else {\n                    this.element.style.display = 'none';\n                }\n            }\n        });\n        binders.invisible = Binder.extend({\n            refresh: function () {\n                if (!this.bindings.invisible.get()) {\n                    this.element.style.display = '';\n                } else {\n                    this.element.style.display = 'none';\n                }\n            }\n        });\n        binders.html = Binder.extend({\n            refresh: function () {\n                this.element.innerHTML = this.bindings.html.get();\n            }\n        });\n        binders.value = TypedBinder.extend({\n            init: function (element, bindings, options) {\n                TypedBinder.fn.init.call(this, element, bindings, options);\n                this._change = proxy(this.change, this);\n                this.eventName = options.valueUpdate || CHANGE;\n                $(this.element).on(this.eventName, this._change);\n                this._initChange = false;\n            },\n            change: function () {\n                this._initChange = this.eventName != CHANGE;\n                this.bindings[VALUE].set(this.parsedValue());\n                this._initChange = false;\n            },\n            refresh: function () {\n                if (!this._initChange) {\n                    var value = this.bindings[VALUE].get();\n                    if (value == null) {\n                        value = '';\n                    }\n                    var type = this.dataType();\n                    if (type == 'date') {\n                        value = kendo.toString(value, 'yyyy-MM-dd');\n                    } else if (type == 'datetime-local') {\n                        value = kendo.toString(value, 'yyyy-MM-ddTHH:mm:ss');\n                    }\n                    this.element.value = value;\n                }\n                this._initChange = false;\n            },\n            destroy: function () {\n                $(this.element).off(this.eventName, this._change);\n            }\n        });\n        binders.source = Binder.extend({\n            init: function (element, bindings, options) {\n                Binder.fn.init.call(this, element, bindings, options);\n                var source = this.bindings.source.get();\n                if (source instanceof kendo.data.DataSource && options.autoBind !== false) {\n                    source.fetch();\n                }\n            },\n            refresh: function (e) {\n                var that = this, source = that.bindings.source.get();\n                if (source instanceof ObservableArray || source instanceof kendo.data.DataSource) {\n                    e = e || {};\n                    if (e.action == 'add') {\n                        that.add(e.index, e.items);\n                    } else if (e.action == 'remove') {\n                        that.remove(e.index, e.items);\n                    } else if (e.action != 'itemchange') {\n                        that.render();\n                    }\n                } else {\n                    that.render();\n                }\n            },\n            container: function () {\n                var element = this.element;\n                if (element.nodeName.toLowerCase() == 'table') {\n                    if (!element.tBodies[0]) {\n                        element.appendChild(document.createElement('tbody'));\n                    }\n                    element = element.tBodies[0];\n                }\n                return element;\n            },\n            template: function () {\n                var options = this.options, template = options.template, nodeName = this.container().nodeName.toLowerCase();\n                if (!template) {\n                    if (nodeName == 'select') {\n                        if (options.valueField || options.textField) {\n                            template = kendo.format('<option value=\"#:{0}#\">#:{1}#</option>', options.valueField || options.textField, options.textField || options.valueField);\n                        } else {\n                            template = '<option>#:data#</option>';\n                        }\n                    } else if (nodeName == 'tbody') {\n                        template = '<tr><td>#:data#</td></tr>';\n                    } else if (nodeName == 'ul' || nodeName == 'ol') {\n                        template = '<li>#:data#</li>';\n                    } else {\n                        template = '#:data#';\n                    }\n                    template = kendo.template(template);\n                }\n                return template;\n            },\n            add: function (index, items) {\n                var element = this.container(), parents, idx, length, child, clone = element.cloneNode(false), reference = element.children[index];\n                $(clone).html(kendo.render(this.template(), items));\n                if (clone.children.length) {\n                    parents = this.bindings.source._parents();\n                    for (idx = 0, length = items.length; idx < length; idx++) {\n                        child = clone.children[0];\n                        element.insertBefore(child, reference || null);\n                        bindElement(child, items[idx], this.options.roles, [items[idx]].concat(parents));\n                    }\n                }\n            },\n            remove: function (index, items) {\n                var idx, element = this.container();\n                for (idx = 0; idx < items.length; idx++) {\n                    var child = element.children[index];\n                    unbindElementTree(child, true);\n                    if (child.parentNode == element) {\n                        element.removeChild(child);\n                    }\n                }\n            },\n            render: function () {\n                var source = this.bindings.source.get(), parents, idx, length, element = this.container(), template = this.template();\n                if (source == null) {\n                    return;\n                }\n                if (source instanceof kendo.data.DataSource) {\n                    source = source.view();\n                }\n                if (!(source instanceof ObservableArray) && toString.call(source) !== '[object Array]') {\n                    source = [source];\n                }\n                if (this.bindings.template) {\n                    unbindElementChildren(element, true);\n                    $(element).html(this.bindings.template.render(source));\n                    if (element.children.length) {\n                        parents = this.bindings.source._parents();\n                        for (idx = 0, length = source.length; idx < length; idx++) {\n                            bindElement(element.children[idx], source[idx], this.options.roles, [source[idx]].concat(parents));\n                        }\n                    }\n                } else {\n                    $(element).html(kendo.render(template, source));\n                }\n            }\n        });\n        binders.input = {\n            checked: TypedBinder.extend({\n                init: function (element, bindings, options) {\n                    TypedBinder.fn.init.call(this, element, bindings, options);\n                    this._change = proxy(this.change, this);\n                    $(this.element).change(this._change);\n                },\n                change: function () {\n                    var element = this.element;\n                    var value = this.value();\n                    if (element.type == 'radio') {\n                        value = this.parsedValue();\n                        this.bindings[CHECKED].set(value);\n                    } else if (element.type == 'checkbox') {\n                        var source = this.bindings[CHECKED].get();\n                        var index;\n                        if (source instanceof ObservableArray) {\n                            value = this.parsedValue();\n                            if (value instanceof Date) {\n                                for (var i = 0; i < source.length; i++) {\n                                    if (source[i] instanceof Date && +source[i] === +value) {\n                                        index = i;\n                                        break;\n                                    }\n                                }\n                            } else {\n                                index = source.indexOf(value);\n                            }\n                            if (index > -1) {\n                                source.splice(index, 1);\n                            } else {\n                                source.push(value);\n                            }\n                        } else {\n                            this.bindings[CHECKED].set(value);\n                        }\n                    }\n                },\n                refresh: function () {\n                    var value = this.bindings[CHECKED].get(), source = value, type = this.dataType(), element = this.element;\n                    if (element.type == 'checkbox') {\n                        if (source instanceof ObservableArray) {\n                            var index = -1;\n                            value = this.parsedValue();\n                            if (value instanceof Date) {\n                                for (var i = 0; i < source.length; i++) {\n                                    if (source[i] instanceof Date && +source[i] === +value) {\n                                        index = i;\n                                        break;\n                                    }\n                                }\n                            } else {\n                                index = source.indexOf(value);\n                            }\n                            element.checked = index >= 0;\n                        } else {\n                            element.checked = source;\n                        }\n                    } else if (element.type == 'radio') {\n                        if (type == 'date') {\n                            value = kendo.toString(value, 'yyyy-MM-dd');\n                        } else if (type == 'datetime-local') {\n                            value = kendo.toString(value, 'yyyy-MM-ddTHH:mm:ss');\n                        }\n                        if (value !== null && typeof value !== 'undefined' && element.value === value.toString()) {\n                            element.checked = true;\n                        } else {\n                            element.checked = false;\n                        }\n                    }\n                },\n                value: function () {\n                    var element = this.element, value = element.value;\n                    if (element.type == 'checkbox') {\n                        value = element.checked;\n                    }\n                    return value;\n                },\n                destroy: function () {\n                    $(this.element).off(CHANGE, this._change);\n                }\n            })\n        };\n        binders.select = {\n            source: binders.source.extend({\n                refresh: function (e) {\n                    var that = this, source = that.bindings.source.get();\n                    if (source instanceof ObservableArray || source instanceof kendo.data.DataSource) {\n                        e = e || {};\n                        if (e.action == 'add') {\n                            that.add(e.index, e.items);\n                        } else if (e.action == 'remove') {\n                            that.remove(e.index, e.items);\n                        } else if (e.action == 'itemchange' || e.action === undefined) {\n                            that.render();\n                            if (that.bindings.value) {\n                                if (that.bindings.value) {\n                                    var val = retrievePrimitiveValues(that.bindings.value.get(), $(that.element).data('valueField'));\n                                    if (val === null) {\n                                        that.element.selectedIndex = -1;\n                                    } else {\n                                        that.element.value = val;\n                                    }\n                                }\n                            }\n                        }\n                    } else {\n                        that.render();\n                    }\n                }\n            }),\n            value: TypedBinder.extend({\n                init: function (target, bindings, options) {\n                    TypedBinder.fn.init.call(this, target, bindings, options);\n                    this._change = proxy(this.change, this);\n                    $(this.element).change(this._change);\n                },\n                parsedValue: function () {\n                    var dataType = this.dataType();\n                    var values = [];\n                    var value, option, idx, length;\n                    for (idx = 0, length = this.element.options.length; idx < length; idx++) {\n                        option = this.element.options[idx];\n                        if (option.selected) {\n                            value = option.attributes.value;\n                            if (value && value.specified) {\n                                value = option.value;\n                            } else {\n                                value = option.text;\n                            }\n                            values.push(this._parseValue(value, dataType));\n                        }\n                    }\n                    return values;\n                },\n                change: function () {\n                    var values = [], element = this.element, source, field = this.options.valueField || this.options.textField, valuePrimitive = this.options.valuePrimitive, option, valueIndex, value, idx, length;\n                    for (idx = 0, length = element.options.length; idx < length; idx++) {\n                        option = element.options[idx];\n                        if (option.selected) {\n                            value = option.attributes.value;\n                            if (value && value.specified) {\n                                value = option.value;\n                            } else {\n                                value = option.text;\n                            }\n                            if (field) {\n                                values.push(value);\n                            } else {\n                                values.push(this._parseValue(value, this.dataType()));\n                            }\n                        }\n                    }\n                    if (field) {\n                        source = this.bindings.source.get();\n                        if (source instanceof kendo.data.DataSource) {\n                            source = source.view();\n                        }\n                        for (valueIndex = 0; valueIndex < values.length; valueIndex++) {\n                            for (idx = 0, length = source.length; idx < length; idx++) {\n                                var sourceValue = source[idx].get(field);\n                                var match = String(sourceValue) === values[valueIndex];\n                                if (match) {\n                                    values[valueIndex] = source[idx];\n                                    break;\n                                }\n                            }\n                        }\n                    }\n                    value = this.bindings[VALUE].get();\n                    if (value instanceof ObservableArray) {\n                        value.splice.apply(value, [\n                            0,\n                            value.length\n                        ].concat(values));\n                    } else if (!valuePrimitive && (value instanceof ObservableObject || value === null || value === undefined || !field)) {\n                        this.bindings[VALUE].set(values[0]);\n                    } else {\n                        this.bindings[VALUE].set(values[0].get(field));\n                    }\n                },\n                refresh: function () {\n                    var optionIndex, element = this.element, options = element.options, value = this.bindings[VALUE].get(), values = value, field = this.options.valueField || this.options.textField, found = false, type = this.dataType(), optionValue;\n                    if (!(values instanceof ObservableArray)) {\n                        values = new ObservableArray([value]);\n                    }\n                    element.selectedIndex = -1;\n                    for (var valueIndex = 0; valueIndex < values.length; valueIndex++) {\n                        value = values[valueIndex];\n                        if (field && value instanceof ObservableObject) {\n                            value = value.get(field);\n                        }\n                        if (type == 'date') {\n                            value = kendo.toString(values[valueIndex], 'yyyy-MM-dd');\n                        } else if (type == 'datetime-local') {\n                            value = kendo.toString(values[valueIndex], 'yyyy-MM-ddTHH:mm:ss');\n                        }\n                        for (optionIndex = 0; optionIndex < options.length; optionIndex++) {\n                            optionValue = options[optionIndex].value;\n                            if (optionValue === '' && value !== '') {\n                                optionValue = options[optionIndex].text;\n                            }\n                            if (value != null && optionValue == value.toString()) {\n                                options[optionIndex].selected = true;\n                                found = true;\n                            }\n                        }\n                    }\n                },\n                destroy: function () {\n                    $(this.element).off(CHANGE, this._change);\n                }\n            })\n        };\n        function dataSourceBinding(bindingName, fieldName, setter) {\n            return Binder.extend({\n                init: function (widget, bindings, options) {\n                    var that = this;\n                    Binder.fn.init.call(that, widget.element[0], bindings, options);\n                    that.widget = widget;\n                    that._dataBinding = proxy(that.dataBinding, that);\n                    that._dataBound = proxy(that.dataBound, that);\n                    that._itemChange = proxy(that.itemChange, that);\n                },\n                itemChange: function (e) {\n                    bindElement(e.item[0], e.data, this._ns(e.ns), [e.data].concat(this.bindings[bindingName]._parents()));\n                },\n                dataBinding: function (e) {\n                    var idx, length, widget = this.widget, items = e.removedItems || widget.items();\n                    for (idx = 0, length = items.length; idx < length; idx++) {\n                        unbindElementTree(items[idx], false);\n                    }\n                },\n                _ns: function (ns) {\n                    ns = ns || kendo.ui;\n                    var all = [\n                        kendo.ui,\n                        kendo.dataviz.ui,\n                        kendo.mobile.ui\n                    ];\n                    all.splice($.inArray(ns, all), 1);\n                    all.unshift(ns);\n                    return kendo.rolesFromNamespaces(all);\n                },\n                dataBound: function (e) {\n                    var idx, length, widget = this.widget, items = e.addedItems || widget.items(), dataSource = widget[fieldName], view, parents, hds = kendo.data.HierarchicalDataSource;\n                    if (hds && dataSource instanceof hds) {\n                        return;\n                    }\n                    if (items.length) {\n                        view = e.addedDataItems || dataSource.flatView();\n                        parents = this.bindings[bindingName]._parents();\n                        for (idx = 0, length = view.length; idx < length; idx++) {\n                            if (items[idx]) {\n                                bindElement(items[idx], view[idx], this._ns(e.ns), [view[idx]].concat(parents));\n                            }\n                        }\n                    }\n                },\n                refresh: function (e) {\n                    var that = this, source, widget = that.widget, select, multiselect, dropdowntree;\n                    e = e || {};\n                    if (!e.action) {\n                        that.destroy();\n                        widget.bind('dataBinding', that._dataBinding);\n                        widget.bind('dataBound', that._dataBound);\n                        widget.bind('itemChange', that._itemChange);\n                        source = that.bindings[bindingName].get();\n                        if (widget[fieldName] instanceof kendo.data.DataSource && widget[fieldName] != source) {\n                            if (source instanceof kendo.data.DataSource) {\n                                widget[setter](source);\n                            } else if (source && source._dataSource) {\n                                widget[setter](source._dataSource);\n                            } else {\n                                select = kendo.ui.Select && widget instanceof kendo.ui.Select;\n                                multiselect = kendo.ui.MultiSelect && widget instanceof kendo.ui.MultiSelect;\n                                dropdowntree = kendo.ui.DropDownTree && widget instanceof kendo.ui.DropDownTree;\n                                if (!dropdowntree) {\n                                    widget[fieldName].data(source);\n                                } else {\n                                    widget.treeview[fieldName].data(source);\n                                }\n                                if (that.bindings.value && (select || multiselect)) {\n                                    widget.value(retrievePrimitiveValues(that.bindings.value.get(), widget.options.dataValueField));\n                                }\n                            }\n                        }\n                    }\n                },\n                destroy: function () {\n                    var widget = this.widget;\n                    widget.unbind('dataBinding', this._dataBinding);\n                    widget.unbind('dataBound', this._dataBound);\n                    widget.unbind('itemChange', this._itemChange);\n                }\n            });\n        }\n        binders.widget = {\n            events: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                    this.handlers = {};\n                },\n                refresh: function (key) {\n                    var binding = this.bindings.events[key], handler = this.handlers[key];\n                    if (handler) {\n                        this.widget.unbind(key, handler);\n                    }\n                    handler = binding.get();\n                    this.handlers[key] = function (e) {\n                        e.data = binding.source;\n                        handler(e);\n                        if (e.data === binding.source) {\n                            delete e.data;\n                        }\n                    };\n                    this.widget.bind(key, this.handlers[key]);\n                },\n                destroy: function () {\n                    var handler;\n                    for (handler in this.handlers) {\n                        this.widget.unbind(handler, this.handlers[handler]);\n                    }\n                }\n            }),\n            checked: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                    this._change = proxy(this.change, this);\n                    this.widget.bind(CHANGE, this._change);\n                },\n                change: function () {\n                    this.bindings[CHECKED].set(this.value());\n                },\n                refresh: function () {\n                    this.widget.check(this.bindings[CHECKED].get() === true);\n                },\n                value: function () {\n                    var element = this.element, value = element.value;\n                    if (value == 'on' || value == 'off') {\n                        value = element.checked;\n                    }\n                    return value;\n                },\n                destroy: function () {\n                    this.widget.unbind(CHANGE, this._change);\n                }\n            }),\n            visible: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                },\n                refresh: function () {\n                    var visible = this.bindings.visible.get();\n                    this.widget.wrapper[0].style.display = visible ? '' : 'none';\n                }\n            }),\n            invisible: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                },\n                refresh: function () {\n                    var invisible = this.bindings.invisible.get();\n                    this.widget.wrapper[0].style.display = invisible ? 'none' : '';\n                }\n            }),\n            enabled: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                },\n                refresh: function () {\n                    if (this.widget.enable) {\n                        this.widget.enable(this.bindings.enabled.get());\n                    }\n                }\n            }),\n            disabled: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                },\n                refresh: function () {\n                    if (this.widget.enable) {\n                        this.widget.enable(!this.bindings.disabled.get());\n                    }\n                }\n            }),\n            source: dataSourceBinding('source', 'dataSource', 'setDataSource'),\n            value: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                    this._change = $.proxy(this.change, this);\n                    this.widget.first(CHANGE, this._change);\n                    var value = this.bindings.value.get();\n                    this._valueIsObservableObject = !options.valuePrimitive && (value == null || value instanceof ObservableObject);\n                    this._valueIsObservableArray = value instanceof ObservableArray;\n                    this._initChange = false;\n                },\n                _source: function () {\n                    var source;\n                    if (this.widget.dataItem) {\n                        source = this.widget.dataItem();\n                        if (source && source instanceof ObservableObject) {\n                            return [source];\n                        }\n                    }\n                    if (this.bindings.source) {\n                        source = this.bindings.source.get();\n                    }\n                    if (!source || source instanceof kendo.data.DataSource) {\n                        source = this.widget.dataSource.flatView();\n                    }\n                    return source;\n                },\n                change: function () {\n                    var value = this.widget.value(), field = this.options.dataValueField || this.options.dataTextField, isArray = toString.call(value) === '[object Array]', isObservableObject = this._valueIsObservableObject, valueIndex, valueLength, values = [], sourceItem, sourceValue, idx, length, source;\n                    this._initChange = true;\n                    if (field) {\n                        if (value === '' && (isObservableObject || this.options.valuePrimitive)) {\n                            value = null;\n                        } else {\n                            source = this._source();\n                            if (isArray) {\n                                valueLength = value.length;\n                                values = value.slice(0);\n                            }\n                            for (idx = 0, length = source.length; idx < length; idx++) {\n                                sourceItem = source[idx];\n                                sourceValue = sourceItem.get(field);\n                                if (isArray) {\n                                    for (valueIndex = 0; valueIndex < valueLength; valueIndex++) {\n                                        if (sourceValue == values[valueIndex]) {\n                                            values[valueIndex] = sourceItem;\n                                            break;\n                                        }\n                                    }\n                                } else if (sourceValue == value) {\n                                    value = isObservableObject ? sourceItem : sourceValue;\n                                    break;\n                                }\n                            }\n                            if (values[0]) {\n                                if (this._valueIsObservableArray) {\n                                    value = values;\n                                } else if (isObservableObject || !field) {\n                                    value = values[0];\n                                } else {\n                                    value = values[0].get(field);\n                                }\n                            }\n                        }\n                    }\n                    this.bindings.value.set(value);\n                    this._initChange = false;\n                },\n                refresh: function () {\n                    if (!this._initChange) {\n                        var widget = this.widget;\n                        var options = widget.options;\n                        var textField = options.dataTextField;\n                        var valueField = options.dataValueField || textField;\n                        var value = this.bindings.value.get();\n                        var text = options.text || '';\n                        var idx = 0, length;\n                        var values = [];\n                        if (value === undefined) {\n                            value = null;\n                        }\n                        if (valueField) {\n                            if (value instanceof ObservableArray) {\n                                for (length = value.length; idx < length; idx++) {\n                                    values[idx] = value[idx].get(valueField);\n                                }\n                                value = values;\n                            } else if (value instanceof ObservableObject) {\n                                text = value.get(textField);\n                                value = value.get(valueField);\n                            }\n                        }\n                        if (options.autoBind === false && !options.cascadeFrom && widget.listView && !widget.listView.bound()) {\n                            if (textField === valueField && !text) {\n                                text = value;\n                            }\n                            if (!text && (value || value === 0) && options.valuePrimitive) {\n                                widget.value(value);\n                            } else {\n                                widget._preselect(value, text);\n                            }\n                        } else {\n                            widget.value(value);\n                        }\n                    }\n                    this._initChange = false;\n                },\n                destroy: function () {\n                    this.widget.unbind(CHANGE, this._change);\n                }\n            }),\n            dropdowntree: {\n                value: Binder.extend({\n                    init: function (widget, bindings, options) {\n                        Binder.fn.init.call(this, widget.element[0], bindings, options);\n                        this.widget = widget;\n                        this._change = $.proxy(this.change, this);\n                        this.widget.first(CHANGE, this._change);\n                        this._initChange = false;\n                    },\n                    change: function () {\n                        var that = this, oldValues = that.bindings[VALUE].get(), valuePrimitive = that.options.valuePrimitive, selectedNode = that.widget.treeview.select(), nonPrimitiveValues = that.widget._isMultipleSelection() ? that.widget._getAllChecked() : that.widget.treeview.dataItem(selectedNode) || that.widget.value(), newValues = valuePrimitive || that.widget.options.autoBind === false ? that.widget.value() : nonPrimitiveValues;\n                        var field = this.options.dataValueField || this.options.dataTextField;\n                        newValues = newValues.slice ? newValues.slice(0) : newValues;\n                        that._initChange = true;\n                        if (oldValues instanceof ObservableArray) {\n                            var remove = [];\n                            var newLength = newValues.length;\n                            var i = 0, j = 0;\n                            var old = oldValues[i];\n                            var same = false;\n                            var removeIndex;\n                            var newValue;\n                            var found;\n                            while (old !== undefined) {\n                                found = false;\n                                for (j = 0; j < newLength; j++) {\n                                    if (valuePrimitive) {\n                                        same = newValues[j] == old;\n                                    } else {\n                                        newValue = newValues[j];\n                                        newValue = newValue.get ? newValue.get(field) : newValue;\n                                        same = newValue == (old.get ? old.get(field) : old);\n                                    }\n                                    if (same) {\n                                        newValues.splice(j, 1);\n                                        newLength -= 1;\n                                        found = true;\n                                        break;\n                                    }\n                                }\n                                if (!found) {\n                                    remove.push(old);\n                                    arraySplice(oldValues, i, 1);\n                                    removeIndex = i;\n                                } else {\n                                    i += 1;\n                                }\n                                old = oldValues[i];\n                            }\n                            arraySplice(oldValues, oldValues.length, 0, newValues);\n                            if (remove.length) {\n                                oldValues.trigger('change', {\n                                    action: 'remove',\n                                    items: remove,\n                                    index: removeIndex\n                                });\n                            }\n                            if (newValues.length) {\n                                oldValues.trigger('change', {\n                                    action: 'add',\n                                    items: newValues,\n                                    index: oldValues.length - 1\n                                });\n                            }\n                        } else {\n                            that.bindings[VALUE].set(newValues);\n                        }\n                        that._initChange = false;\n                    },\n                    refresh: function () {\n                        if (!this._initChange) {\n                            var options = this.options, widget = this.widget, field = options.dataValueField || options.dataTextField, value = this.bindings.value.get(), data = value, idx = 0, length, values = [], selectedValue;\n                            if (field) {\n                                if (value instanceof ObservableArray) {\n                                    for (length = value.length; idx < length; idx++) {\n                                        selectedValue = value[idx];\n                                        values[idx] = selectedValue.get ? selectedValue.get(field) : selectedValue;\n                                    }\n                                    value = values;\n                                } else if (value instanceof ObservableObject) {\n                                    value = value.get(field);\n                                }\n                            }\n                            if (options.autoBind === false && options.valuePrimitive !== true) {\n                                widget._preselect(data, value);\n                            } else {\n                                widget.value(value);\n                            }\n                        }\n                    },\n                    destroy: function () {\n                        this.widget.unbind(CHANGE, this._change);\n                    }\n                })\n            },\n            gantt: { dependencies: dataSourceBinding('dependencies', 'dependencies', 'setDependenciesDataSource') },\n            multiselect: {\n                value: Binder.extend({\n                    init: function (widget, bindings, options) {\n                        Binder.fn.init.call(this, widget.element[0], bindings, options);\n                        this.widget = widget;\n                        this._change = $.proxy(this.change, this);\n                        this.widget.first(CHANGE, this._change);\n                        this._initChange = false;\n                    },\n                    change: function () {\n                        var that = this, oldValues = that.bindings[VALUE].get(), valuePrimitive = that.options.valuePrimitive, newValues = valuePrimitive ? that.widget.value() : that.widget.dataItems();\n                        var field = this.options.dataValueField || this.options.dataTextField;\n                        newValues = newValues.slice(0);\n                        that._initChange = true;\n                        if (oldValues instanceof ObservableArray) {\n                            var remove = [];\n                            var newLength = newValues.length;\n                            var i = 0, j = 0;\n                            var old = oldValues[i];\n                            var same = false;\n                            var removeIndex;\n                            var newValue;\n                            var found;\n                            while (old !== undefined) {\n                                found = false;\n                                for (j = 0; j < newLength; j++) {\n                                    if (valuePrimitive) {\n                                        same = newValues[j] == old;\n                                    } else {\n                                        newValue = newValues[j];\n                                        newValue = newValue.get ? newValue.get(field) : newValue;\n                                        same = newValue == (old.get ? old.get(field) : old);\n                                    }\n                                    if (same) {\n                                        newValues.splice(j, 1);\n                                        newLength -= 1;\n                                        found = true;\n                                        break;\n                                    }\n                                }\n                                if (!found) {\n                                    remove.push(old);\n                                    arraySplice(oldValues, i, 1);\n                                    removeIndex = i;\n                                } else {\n                                    i += 1;\n                                }\n                                old = oldValues[i];\n                            }\n                            arraySplice(oldValues, oldValues.length, 0, newValues);\n                            if (remove.length) {\n                                oldValues.trigger('change', {\n                                    action: 'remove',\n                                    items: remove,\n                                    index: removeIndex\n                                });\n                            }\n                            if (newValues.length) {\n                                oldValues.trigger('change', {\n                                    action: 'add',\n                                    items: newValues,\n                                    index: oldValues.length - 1\n                                });\n                            }\n                        } else {\n                            that.bindings[VALUE].set(newValues);\n                        }\n                        that._initChange = false;\n                    },\n                    refresh: function () {\n                        if (!this._initChange) {\n                            var options = this.options, widget = this.widget, field = options.dataValueField || options.dataTextField, value = this.bindings.value.get(), data = value, idx = 0, length, values = [], selectedValue;\n                            if (value === undefined) {\n                                value = null;\n                            }\n                            if (field) {\n                                if (value instanceof ObservableArray) {\n                                    for (length = value.length; idx < length; idx++) {\n                                        selectedValue = value[idx];\n                                        values[idx] = selectedValue.get ? selectedValue.get(field) : selectedValue;\n                                    }\n                                    value = values;\n                                } else if (value instanceof ObservableObject) {\n                                    value = value.get(field);\n                                }\n                            }\n                            if (options.autoBind === false && options.valuePrimitive !== true && !widget._isBound()) {\n                                widget._preselect(data, value);\n                            } else {\n                                widget.value(value);\n                            }\n                        }\n                    },\n                    destroy: function () {\n                        this.widget.unbind(CHANGE, this._change);\n                    }\n                })\n            },\n            scheduler: {\n                source: dataSourceBinding('source', 'dataSource', 'setDataSource').extend({\n                    dataBound: function (e) {\n                        var idx;\n                        var length;\n                        var widget = this.widget;\n                        var elements = e.addedItems || widget.items();\n                        var data, parents;\n                        if (elements.length) {\n                            data = e.addedDataItems || widget.dataItems();\n                            parents = this.bindings.source._parents();\n                            for (idx = 0, length = data.length; idx < length; idx++) {\n                                bindElement(elements[idx], data[idx], this._ns(e.ns), [data[idx]].concat(parents));\n                            }\n                        }\n                    }\n                })\n            }\n        };\n        var arraySplice = function (arr, idx, remove, add) {\n            add = add || [];\n            remove = remove || 0;\n            var addLength = add.length;\n            var oldLength = arr.length;\n            var shifted = [].slice.call(arr, idx + remove);\n            var shiftedLength = shifted.length;\n            var index;\n            if (addLength) {\n                addLength = idx + addLength;\n                index = 0;\n                for (; idx < addLength; idx++) {\n                    arr[idx] = add[index];\n                    index++;\n                }\n                arr.length = addLength;\n            } else if (remove) {\n                arr.length = idx;\n                remove += idx;\n                while (idx < remove) {\n                    delete arr[--remove];\n                }\n            }\n            if (shiftedLength) {\n                shiftedLength = idx + shiftedLength;\n                index = 0;\n                for (; idx < shiftedLength; idx++) {\n                    arr[idx] = shifted[index];\n                    index++;\n                }\n                arr.length = shiftedLength;\n            }\n            idx = arr.length;\n            while (idx < oldLength) {\n                delete arr[idx];\n                idx++;\n            }\n        };\n        var BindingTarget = Class.extend({\n            init: function (target, options) {\n                this.target = target;\n                this.options = options;\n                this.toDestroy = [];\n            },\n            bind: function (bindings) {\n                var key, hasValue, hasSource, hasEvents, hasChecked, hasCss, widgetBinding = this instanceof WidgetBindingTarget, specificBinders = this.binders();\n                for (key in bindings) {\n                    if (key == VALUE) {\n                        hasValue = true;\n                    } else if (key == SOURCE) {\n                        hasSource = true;\n                    } else if (key == EVENTS && !widgetBinding) {\n                        hasEvents = true;\n                    } else if (key == CHECKED) {\n                        hasChecked = true;\n                    } else if (key == CSS) {\n                        hasCss = true;\n                    } else {\n                        this.applyBinding(key, bindings, specificBinders);\n                    }\n                }\n                if (hasSource) {\n                    this.applyBinding(SOURCE, bindings, specificBinders);\n                }\n                if (hasValue) {\n                    this.applyBinding(VALUE, bindings, specificBinders);\n                }\n                if (hasChecked) {\n                    this.applyBinding(CHECKED, bindings, specificBinders);\n                }\n                if (hasEvents && !widgetBinding) {\n                    this.applyBinding(EVENTS, bindings, specificBinders);\n                }\n                if (hasCss && !widgetBinding) {\n                    this.applyBinding(CSS, bindings, specificBinders);\n                }\n            },\n            binders: function () {\n                return binders[this.target.nodeName.toLowerCase()] || {};\n            },\n            applyBinding: function (name, bindings, specificBinders) {\n                var binder = specificBinders[name] || binders[name], toDestroy = this.toDestroy, attribute, binding = bindings[name];\n                if (binder) {\n                    binder = new binder(this.target, bindings, this.options);\n                    toDestroy.push(binder);\n                    if (binding instanceof Binding) {\n                        binder.bind(binding);\n                        toDestroy.push(binding);\n                    } else {\n                        for (attribute in binding) {\n                            binder.bind(binding, attribute);\n                            toDestroy.push(binding[attribute]);\n                        }\n                    }\n                } else if (name !== 'template') {\n                    throw new Error('The ' + name + ' binding is not supported by the ' + this.target.nodeName.toLowerCase() + ' element');\n                }\n            },\n            destroy: function () {\n                var idx, length, toDestroy = this.toDestroy;\n                for (idx = 0, length = toDestroy.length; idx < length; idx++) {\n                    toDestroy[idx].destroy();\n                }\n            }\n        });\n        var WidgetBindingTarget = BindingTarget.extend({\n            binders: function () {\n                return binders.widget[this.target.options.name.toLowerCase()] || {};\n            },\n            applyBinding: function (name, bindings, specificBinders) {\n                var binder = specificBinders[name] || binders.widget[name], toDestroy = this.toDestroy, attribute, binding = bindings[name];\n                if (binder) {\n                    binder = new binder(this.target, bindings, this.target.options);\n                    toDestroy.push(binder);\n                    if (binding instanceof Binding) {\n                        binder.bind(binding);\n                        toDestroy.push(binding);\n                    } else {\n                        for (attribute in binding) {\n                            binder.bind(binding, attribute);\n                            toDestroy.push(binding[attribute]);\n                        }\n                    }\n                } else {\n                    throw new Error('The ' + name + ' binding is not supported by the ' + this.target.options.name + ' widget');\n                }\n            }\n        });\n        function bindingTargetForRole(element, roles) {\n            var widget = kendo.initWidget(element, {}, roles);\n            if (widget) {\n                return new WidgetBindingTarget(widget);\n            }\n        }\n        var keyValueRegExp = /[A-Za-z0-9_\\-]+:(\\{([^}]*)\\}|[^,}]+)/g, whiteSpaceRegExp = /\\s/g;\n        function parseBindings(bind) {\n            var result = {}, idx, length, token, colonIndex, key, value, tokens;\n            tokens = bind.match(keyValueRegExp);\n            for (idx = 0, length = tokens.length; idx < length; idx++) {\n                token = tokens[idx];\n                colonIndex = token.indexOf(':');\n                key = token.substring(0, colonIndex);\n                value = token.substring(colonIndex + 1);\n                if (value.charAt(0) == '{') {\n                    value = parseBindings(value);\n                }\n                result[key] = value;\n            }\n            return result;\n        }\n        function createBindings(bindings, source, type) {\n            var binding, result = {};\n            for (binding in bindings) {\n                result[binding] = new type(source, bindings[binding]);\n            }\n            return result;\n        }\n        function bindElement(element, source, roles, parents) {\n            if (!element || element.getAttribute('data-' + kendo.ns + 'stop')) {\n                return;\n            }\n            var role = element.getAttribute('data-' + kendo.ns + 'role'), idx, bind = element.getAttribute('data-' + kendo.ns + 'bind'), childrenCopy = [], deep = true, bindings, options = {}, target;\n            parents = parents || [source];\n            if (role || bind) {\n                unbindElement(element, false);\n            }\n            if (role) {\n                target = bindingTargetForRole(element, roles);\n            }\n            if (bind) {\n                bind = parseBindings(bind.replace(whiteSpaceRegExp, ''));\n                if (!target) {\n                    options = kendo.parseOptions(element, {\n                        textField: '',\n                        valueField: '',\n                        template: '',\n                        valueUpdate: CHANGE,\n                        valuePrimitive: false,\n                        autoBind: true\n                    }, source);\n                    options.roles = roles;\n                    target = new BindingTarget(element, options);\n                }\n                target.source = source;\n                bindings = createBindings(bind, parents, Binding);\n                if (options.template) {\n                    bindings.template = new TemplateBinding(parents, '', options.template);\n                }\n                if (bindings.click) {\n                    bind.events = bind.events || {};\n                    bind.events.click = bind.click;\n                    bindings.click.destroy();\n                    delete bindings.click;\n                }\n                if (bindings.source) {\n                    deep = false;\n                }\n                if (bind.attr) {\n                    bindings.attr = createBindings(bind.attr, parents, Binding);\n                }\n                if (bind.style) {\n                    bindings.style = createBindings(bind.style, parents, Binding);\n                }\n                if (bind.events) {\n                    bindings.events = createBindings(bind.events, parents, EventBinding);\n                }\n                if (bind.css) {\n                    bindings.css = createBindings(bind.css, parents, Binding);\n                }\n                target.bind(bindings);\n            }\n            if (target) {\n                element.kendoBindingTarget = target;\n            }\n            var children = element.children;\n            if (deep && children) {\n                for (idx = 0; idx < children.length; idx++) {\n                    childrenCopy[idx] = children[idx];\n                }\n                for (idx = 0; idx < childrenCopy.length; idx++) {\n                    bindElement(childrenCopy[idx], source, roles, parents);\n                }\n            }\n        }\n        function bind(dom, object) {\n            var idx, length, node, roles = kendo.rolesFromNamespaces([].slice.call(arguments, 2));\n            object = kendo.observable(object);\n            dom = $(dom);\n            for (idx = 0, length = dom.length; idx < length; idx++) {\n                node = dom[idx];\n                if (node.nodeType === 1) {\n                    bindElement(node, object, roles);\n                }\n            }\n        }\n        function unbindElement(element, destroyWidget) {\n            var bindingTarget = element.kendoBindingTarget;\n            if (bindingTarget) {\n                bindingTarget.destroy();\n                if (deleteExpando) {\n                    delete element.kendoBindingTarget;\n                } else if (element.removeAttribute) {\n                    element.removeAttribute('kendoBindingTarget');\n                } else {\n                    element.kendoBindingTarget = null;\n                }\n            }\n            if (destroyWidget) {\n                var widget = kendo.widgetInstance($(element));\n                if (widget && typeof widget.destroy === FUNCTION) {\n                    widget.destroy();\n                }\n            }\n        }\n        function unbindElementTree(element, destroyWidgets) {\n            unbindElement(element, destroyWidgets);\n            unbindElementChildren(element, destroyWidgets);\n        }\n        function unbindElementChildren(element, destroyWidgets) {\n            var children = element.children;\n            if (children) {\n                for (var idx = 0, length = children.length; idx < length; idx++) {\n                    unbindElementTree(children[idx], destroyWidgets);\n                }\n            }\n        }\n        function unbind(dom) {\n            var idx, length;\n            dom = $(dom);\n            for (idx = 0, length = dom.length; idx < length; idx++) {\n                unbindElementTree(dom[idx], false);\n            }\n        }\n        function notify(widget, namespace) {\n            var element = widget.element, bindingTarget = element[0].kendoBindingTarget;\n            if (bindingTarget) {\n                bind(element, bindingTarget.source, namespace);\n            }\n        }\n        function retrievePrimitiveValues(value, valueField) {\n            var values = [];\n            var idx = 0;\n            var length;\n            var item;\n            if (!valueField) {\n                return value;\n            }\n            if (value instanceof ObservableArray) {\n                for (length = value.length; idx < length; idx++) {\n                    item = value[idx];\n                    values[idx] = item.get ? item.get(valueField) : item[valueField];\n                }\n                value = values;\n            } else if (value instanceof ObservableObject) {\n                value = value.get(valueField);\n            }\n            return value;\n        }\n        kendo.unbind = unbind;\n        kendo.bind = bind;\n        kendo.data.binders = binders;\n        kendo.data.Binder = Binder;\n        kendo.notify = notify;\n        kendo.observable = function (object) {\n            if (!(object instanceof ObservableObject)) {\n                object = new ObservableObject(object);\n            }\n            return object;\n        };\n        kendo.observableHierarchy = function (array) {\n            var dataSource = kendo.data.HierarchicalDataSource.create(array);\n            function recursiveRead(data) {\n                var i, children;\n                for (i = 0; i < data.length; i++) {\n                    data[i]._initChildren();\n                    children = data[i].children;\n                    children.fetch();\n                    data[i].items = children.data();\n                    recursiveRead(data[i].items);\n                }\n            }\n            dataSource.fetch();\n            recursiveRead(dataSource.data());\n            dataSource._data._dataSource = dataSource;\n            return dataSource._data;\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                    element.data('keys', $.unique(oldKeys)).height();\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.view', [\n        'kendo.core',\n        'kendo.binder',\n        'kendo.fx'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'view',\n        name: 'View',\n        category: 'framework',\n        description: 'The View class instantiates and handles the events of a certain screen from the application.',\n        depends: [\n            'core',\n            'binder',\n            'fx'\n        ],\n        hidden: false\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Observable = kendo.Observable, SCRIPT = 'SCRIPT', INIT = 'init', SHOW = 'show', HIDE = 'hide', TRANSITION_START = 'transitionStart', TRANSITION_END = 'transitionEnd', ATTACH = 'attach', DETACH = 'detach', sizzleErrorRegExp = /unrecognized expression/;\n        var View = Observable.extend({\n            init: function (content, options) {\n                var that = this;\n                options = options || {};\n                Observable.fn.init.call(that);\n                that.content = content;\n                that.id = kendo.guid();\n                that.tagName = options.tagName || 'div';\n                that.model = options.model;\n                that._wrap = options.wrap !== false;\n                this._evalTemplate = options.evalTemplate || false;\n                that._fragments = {};\n                that.bind([\n                    INIT,\n                    SHOW,\n                    HIDE,\n                    TRANSITION_START,\n                    TRANSITION_END\n                ], options);\n            },\n            render: function (container) {\n                var that = this, notInitialized = !that.element;\n                if (notInitialized) {\n                    that.element = that._createElement();\n                }\n                if (container) {\n                    $(container).append(that.element);\n                }\n                if (notInitialized) {\n                    kendo.bind(that.element, that.model);\n                    that.trigger(INIT);\n                }\n                if (container) {\n                    that._eachFragment(ATTACH);\n                    that.trigger(SHOW);\n                }\n                return that.element;\n            },\n            clone: function () {\n                return new ViewClone(this);\n            },\n            triggerBeforeShow: function () {\n                return true;\n            },\n            triggerBeforeHide: function () {\n                return true;\n            },\n            showStart: function () {\n                this.element.css('display', '');\n            },\n            showEnd: function () {\n            },\n            hideEnd: function () {\n                this.hide();\n            },\n            beforeTransition: function (type) {\n                this.trigger(TRANSITION_START, { type: type });\n            },\n            afterTransition: function (type) {\n                this.trigger(TRANSITION_END, { type: type });\n            },\n            hide: function () {\n                this._eachFragment(DETACH);\n                this.element.detach();\n                this.trigger(HIDE);\n            },\n            destroy: function () {\n                var element = this.element;\n                if (element) {\n                    kendo.unbind(element);\n                    kendo.destroy(element);\n                    element.remove();\n                }\n            },\n            fragments: function (fragments) {\n                $.extend(this._fragments, fragments);\n            },\n            _eachFragment: function (methodName) {\n                for (var placeholder in this._fragments) {\n                    this._fragments[placeholder][methodName](this, placeholder);\n                }\n            },\n            _createElement: function () {\n                var that = this, wrapper = '<' + that.tagName + ' />', element, content;\n                try {\n                    content = $(document.getElementById(that.content) || that.content);\n                    if (content[0].tagName === SCRIPT) {\n                        content = content.html();\n                    }\n                } catch (e) {\n                    if (sizzleErrorRegExp.test(e.message)) {\n                        content = that.content;\n                    }\n                }\n                if (typeof content === 'string') {\n                    content = content.replace(/^\\s+|\\s+$/g, '');\n                    if (that._evalTemplate) {\n                        content = kendo.template(content)(that.model || {});\n                    }\n                    element = $(wrapper).append(content);\n                    if (!that._wrap) {\n                        element = element.contents();\n                    }\n                } else {\n                    element = content;\n                    if (that._evalTemplate) {\n                        var result = $(kendo.template($('<div />').append(element.clone(true)).html())(that.model || {}));\n                        if ($.contains(document, element[0])) {\n                            element.replaceWith(result);\n                        }\n                        element = result;\n                    }\n                    if (that._wrap) {\n                        element = element.wrapAll(wrapper).parent();\n                    }\n                }\n                return element;\n            }\n        });\n        var ViewClone = kendo.Class.extend({\n            init: function (view) {\n                $.extend(this, {\n                    element: view.element.clone(true),\n                    transition: view.transition,\n                    id: view.id\n                });\n                view.element.parent().append(this.element);\n            },\n            hideEnd: function () {\n                this.element.remove();\n            },\n            beforeTransition: $.noop,\n            afterTransition: $.noop\n        });\n        var Layout = View.extend({\n            init: function (content, options) {\n                View.fn.init.call(this, content, options);\n                this.containers = {};\n            },\n            container: function (selector) {\n                var container = this.containers[selector];\n                if (!container) {\n                    container = this._createContainer(selector);\n                    this.containers[selector] = container;\n                }\n                return container;\n            },\n            showIn: function (selector, view, transition) {\n                this.container(selector).show(view, transition);\n            },\n            _createContainer: function (selector) {\n                var root = this.render(), element = root.find(selector), container;\n                if (!element.length && root.is(selector)) {\n                    if (root.is(selector)) {\n                        element = root;\n                    } else {\n                        throw new Error('can\\'t find a container with the specified ' + selector + ' selector');\n                    }\n                }\n                container = new ViewContainer(element);\n                container.bind('accepted', function (e) {\n                    e.view.render(element);\n                });\n                return container;\n            }\n        });\n        var Fragment = View.extend({\n            attach: function (view, placeholder) {\n                view.element.find(placeholder).replaceWith(this.render());\n            },\n            detach: function () {\n            }\n        });\n        var transitionRegExp = /^(\\w+)(:(\\w+))?( (\\w+))?$/;\n        function parseTransition(transition) {\n            if (!transition) {\n                return {};\n            }\n            var matches = transition.match(transitionRegExp) || [];\n            return {\n                type: matches[1],\n                direction: matches[3],\n                reverse: matches[5] === 'reverse'\n            };\n        }\n        var ViewContainer = Observable.extend({\n            init: function (container) {\n                Observable.fn.init.call(this);\n                this.container = container;\n                this.history = [];\n                this.view = null;\n                this.running = false;\n            },\n            after: function () {\n                this.running = false;\n                this.trigger('complete', { view: this.view });\n                this.trigger('after');\n            },\n            end: function () {\n                this.view.showEnd();\n                this.previous.hideEnd();\n                this.after();\n            },\n            show: function (view, transition, locationID) {\n                if (!view.triggerBeforeShow() || this.view && !this.view.triggerBeforeHide()) {\n                    this.trigger('after');\n                    return false;\n                }\n                locationID = locationID || view.id;\n                var that = this, current = view === that.view ? view.clone() : that.view, history = that.history, previousEntry = history[history.length - 2] || {}, back = previousEntry.id === locationID, theTransition = transition || (back ? history[history.length - 1].transition : view.transition), transitionData = parseTransition(theTransition);\n                if (that.running) {\n                    that.effect.stop();\n                }\n                if (theTransition === 'none') {\n                    theTransition = null;\n                }\n                that.trigger('accepted', { view: view });\n                that.view = view;\n                that.previous = current;\n                that.running = true;\n                if (!back) {\n                    history.push({\n                        id: locationID,\n                        transition: theTransition\n                    });\n                } else {\n                    history.pop();\n                }\n                if (!current) {\n                    view.showStart();\n                    view.showEnd();\n                    that.after();\n                    return true;\n                }\n                if (!theTransition || !kendo.effects.enabled) {\n                    view.showStart();\n                    that.end();\n                } else {\n                    view.element.addClass('k-fx-hidden');\n                    view.showStart();\n                    if (back && !transition) {\n                        transitionData.reverse = !transitionData.reverse;\n                    }\n                    that.effect = kendo.fx(view.element).replace(current.element, transitionData.type).beforeTransition(function () {\n                        view.beforeTransition('show');\n                        current.beforeTransition('hide');\n                    }).afterTransition(function () {\n                        view.afterTransition('show');\n                        current.afterTransition('hide');\n                    }).direction(transitionData.direction).setReverse(transitionData.reverse);\n                    that.effect.run().then(function () {\n                        that.end();\n                    });\n                }\n                return true;\n            }\n        });\n        kendo.ViewContainer = ViewContainer;\n        kendo.Fragment = Fragment;\n        kendo.Layout = Layout;\n        kendo.View = View;\n        kendo.ViewClone = ViewClone;\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.signalr', ['kendo.data'], f);\n}(function () {\n    var __meta__ = {\n        id: 'data.signalr',\n        name: 'SignalR',\n        category: 'framework',\n        depends: ['data'],\n        hidden: true\n    };\n    (function ($) {\n        var kendo = window.kendo;\n        var isFunction = kendo.isFunction;\n        function isJQueryPromise(promise) {\n            return promise && isFunction(promise.done) && isFunction(promise.fail);\n        }\n        function isNativePromise(promise) {\n            return promise && isFunction(promise.then) && isFunction(promise.catch);\n        }\n        var transport = kendo.data.RemoteTransport.extend({\n            init: function (options) {\n                var signalr = options && options.signalr ? options.signalr : {};\n                var promise = signalr.promise;\n                if (!promise) {\n                    throw new Error('The \"promise\" option must be set.');\n                }\n                if (!isJQueryPromise(promise) && !isNativePromise(promise)) {\n                    throw new Error('The \"promise\" option must be a Promise.');\n                }\n                this.promise = promise;\n                var hub = signalr.hub;\n                if (!hub) {\n                    throw new Error('The \"hub\" option must be set.');\n                }\n                if (typeof hub.on != 'function' || typeof hub.invoke != 'function') {\n                    throw new Error('The \"hub\" option is not a valid SignalR hub proxy.');\n                }\n                this.hub = hub;\n                kendo.data.RemoteTransport.fn.init.call(this, options);\n            },\n            push: function (callbacks) {\n                var client = this.options.signalr.client || {};\n                if (client.create) {\n                    this.hub.on(client.create, callbacks.pushCreate);\n                }\n                if (client.update) {\n                    this.hub.on(client.update, callbacks.pushUpdate);\n                }\n                if (client.destroy) {\n                    this.hub.on(client.destroy, callbacks.pushDestroy);\n                }\n            },\n            _crud: function (options, type) {\n                var hub = this.hub;\n                var promise = this.promise;\n                var server = this.options.signalr.server;\n                if (!server || !server[type]) {\n                    throw new Error(kendo.format('The \"server.{0}\" option must be set.', type));\n                }\n                var args = [server[type]];\n                var data = this.parameterMap(options.data, type);\n                if (!$.isEmptyObject(data)) {\n                    args.push(data);\n                }\n                if (isJQueryPromise(promise)) {\n                    promise.done(function () {\n                        hub.invoke.apply(hub, args).done(options.success).fail(options.error);\n                    });\n                } else if (isNativePromise(promise)) {\n                    promise.then(function () {\n                        hub.invoke.apply(hub, args).then(options.success).catch(options.error);\n                    });\n                }\n            },\n            read: function (options) {\n                this._crud(options, 'read');\n            },\n            create: function (options) {\n                this._crud(options, 'create');\n            },\n            update: function (options) {\n                this._crud(options, 'update');\n            },\n            destroy: function (options) {\n                this._crud(options, 'destroy');\n            }\n        });\n        $.extend(true, kendo.data, { transports: { signalr: transport } });\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.validator', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'validator',\n        name: 'Validator',\n        category: 'web',\n        description: 'The Validator offers an easy way to do a client-side form validation.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, NS = '.kendoValidator', INVALIDMSG = 'k-invalid-msg', invalidMsgRegExp = new RegExp(INVALIDMSG, 'i'), INVALIDINPUT = 'k-invalid', VALIDINPUT = 'k-valid', emailRegExp = /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/i, urlRegExp = /^(https?|ftp):\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(\\#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i, INPUTSELECTOR = ':input:not(:button,[type=submit],[type=reset],[disabled],[readonly])', CHECKBOXSELECTOR = ':checkbox:not([disabled],[readonly])', NUMBERINPUTSELECTOR = '[type=number],[type=range]', BLUR = 'blur', NAME = 'name', FORM = 'form', NOVALIDATE = 'novalidate', VALIDATE = 'validate', CHANGE = 'change', VALIDATE_INPUT = 'validateInput', proxy = $.proxy, patternMatcher = function (value, pattern) {\n                if (typeof pattern === 'string') {\n                    pattern = new RegExp('^(?:' + pattern + ')$');\n                }\n                return pattern.test(value);\n            }, matcher = function (input, selector, pattern) {\n                var value = input.val();\n                if (input.filter(selector).length && value !== '') {\n                    return patternMatcher(value, pattern);\n                }\n                return true;\n            }, hasAttribute = function (input, name) {\n                if (input.length) {\n                    return input[0].attributes[name] != null;\n                }\n                return false;\n            };\n        if (!kendo.ui.validator) {\n            kendo.ui.validator = {\n                rules: {},\n                messages: {}\n            };\n        }\n        function resolveRules(element) {\n            var resolvers = kendo.ui.validator.ruleResolvers || {}, rules = {}, name;\n            for (name in resolvers) {\n                $.extend(true, rules, resolvers[name].resolve(element));\n            }\n            return rules;\n        }\n        function decode(value) {\n            return value.replace(/&amp/g, '&amp;').replace(/&quot;/g, '\"').replace(/&#39;/g, '\\'').replace(/&lt;/g, '<').replace(/&gt;/g, '>');\n        }\n        function numberOfDecimalDigits(value) {\n            value = (value + '').split('.');\n            if (value.length > 1) {\n                return value[1].length;\n            }\n            return 0;\n        }\n        function parseHtml(text) {\n            if ($.parseHTML) {\n                return $($.parseHTML(text));\n            }\n            return $(text);\n        }\n        function searchForMessageContainer(elements, fieldName) {\n            var containers = $(), element, attr;\n            for (var idx = 0, length = elements.length; idx < length; idx++) {\n                element = elements[idx];\n                if (invalidMsgRegExp.test(element.className)) {\n                    attr = element.getAttribute(kendo.attr('for'));\n                    if (attr === fieldName) {\n                        containers = containers.add(element);\n                    }\n                }\n            }\n            return containers;\n        }\n        var Validator = Widget.extend({\n            init: function (element, options) {\n                var that = this, resolved = resolveRules(element), validateAttributeSelector = '[' + kendo.attr('validate') + '!=false]';\n                options = options || {};\n                options.rules = $.extend({}, kendo.ui.validator.rules, resolved.rules, options.rules);\n                options.messages = $.extend({}, kendo.ui.validator.messages, resolved.messages, options.messages);\n                Widget.fn.init.call(that, element, options);\n                that._errorTemplate = kendo.template(that.options.errorTemplate);\n                if (that.element.is(FORM)) {\n                    that.element.attr(NOVALIDATE, NOVALIDATE);\n                }\n                that._inputSelector = INPUTSELECTOR + validateAttributeSelector;\n                that._checkboxSelector = CHECKBOXSELECTOR + validateAttributeSelector;\n                that._errors = {};\n                that._attachEvents();\n                that._isValidated = false;\n            },\n            events: [\n                VALIDATE,\n                CHANGE,\n                VALIDATE_INPUT\n            ],\n            options: {\n                name: 'Validator',\n                errorTemplate: '<span class=\"k-widget k-tooltip k-tooltip-validation\">' + '<span class=\"k-icon k-i-warning\"> </span> #=message#</span>',\n                messages: {\n                    required: '{0} is required',\n                    pattern: '{0} is not valid',\n                    min: '{0} should be greater than or equal to {1}',\n                    max: '{0} should be smaller than or equal to {1}',\n                    step: '{0} is not valid',\n                    email: '{0} is not valid email',\n                    url: '{0} is not valid URL',\n                    date: '{0} is not valid date',\n                    dateCompare: 'End date should be greater than or equal to the start date'\n                },\n                rules: {\n                    required: function (input) {\n                        var checkbox = input.filter('[type=checkbox]').length && !input.is(':checked'), value = input.val();\n                        return !(hasAttribute(input, 'required') && (!value || value === '' || value.length === 0 || checkbox));\n                    },\n                    pattern: function (input) {\n                        if (input.filter('[type=text],[type=email],[type=url],[type=tel],[type=search],[type=password]').filter('[pattern]').length && input.val() !== '') {\n                            return patternMatcher(input.val(), input.attr('pattern'));\n                        }\n                        return true;\n                    },\n                    min: function (input) {\n                        if (input.filter(NUMBERINPUTSELECTOR + ',[' + kendo.attr('type') + '=number]').filter('[min]').length && input.val() !== '') {\n                            var min = parseFloat(input.attr('min')) || 0, val = kendo.parseFloat(input.val());\n                            return min <= val;\n                        }\n                        return true;\n                    },\n                    max: function (input) {\n                        if (input.filter(NUMBERINPUTSELECTOR + ',[' + kendo.attr('type') + '=number]').filter('[max]').length && input.val() !== '') {\n                            var max = parseFloat(input.attr('max')) || 0, val = kendo.parseFloat(input.val());\n                            return max >= val;\n                        }\n                        return true;\n                    },\n                    step: function (input) {\n                        if (input.filter(NUMBERINPUTSELECTOR + ',[' + kendo.attr('type') + '=number]').filter('[step]').length && input.val() !== '') {\n                            var min = parseFloat(input.attr('min')) || 0, step = parseFloat(input.attr('step')) || 1, val = parseFloat(input.val()), decimals = numberOfDecimalDigits(step), raise;\n                            if (decimals) {\n                                raise = Math.pow(10, decimals);\n                                return Math.floor((val - min) * raise) % (step * raise) / Math.pow(100, decimals) === 0;\n                            }\n                            return (val - min) % step === 0;\n                        }\n                        return true;\n                    },\n                    email: function (input) {\n                        return matcher(input, '[type=email],[' + kendo.attr('type') + '=email]', emailRegExp);\n                    },\n                    url: function (input) {\n                        return matcher(input, '[type=url],[' + kendo.attr('type') + '=url]', urlRegExp);\n                    },\n                    date: function (input) {\n                        if (input.filter('[type^=date],[' + kendo.attr('type') + '=date]').length && input.val() !== '') {\n                            return kendo.parseDate(input.val(), input.attr(kendo.attr('format'))) !== null;\n                        }\n                        return true;\n                    }\n                },\n                validateOnBlur: true\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.element.off(NS);\n            },\n            value: function () {\n                if (!this._isValidated) {\n                    return false;\n                }\n                return this.errors().length === 0;\n            },\n            _submit: function (e) {\n                if (!this.validate()) {\n                    e.stopPropagation();\n                    e.stopImmediatePropagation();\n                    e.preventDefault();\n                    return false;\n                }\n                return true;\n            },\n            _checkElement: function (element) {\n                var state = this.value();\n                this.validateInput(element);\n                if (this.value() !== state) {\n                    this.trigger(CHANGE);\n                }\n            },\n            _attachEvents: function () {\n                var that = this;\n                if (that.element.is(FORM)) {\n                    that.element.on('submit' + NS, proxy(that._submit, that));\n                }\n                if (that.options.validateOnBlur) {\n                    if (!that.element.is(INPUTSELECTOR)) {\n                        that.element.on(BLUR + NS, that._inputSelector, function () {\n                            that._checkElement($(this));\n                        });\n                        that.element.on('click' + NS, that._checkboxSelector, function () {\n                            that._checkElement($(this));\n                        });\n                    } else {\n                        that.element.on(BLUR + NS, function () {\n                            that._checkElement(that.element);\n                        });\n                        if (that.element.is(CHECKBOXSELECTOR)) {\n                            that.element.on('click' + NS, function () {\n                                that._checkElement(that.element);\n                            });\n                        }\n                    }\n                }\n            },\n            validate: function () {\n                var inputs;\n                var idx;\n                var result = false;\n                var length;\n                var isValid = this.value();\n                this._errors = {};\n                if (!this.element.is(INPUTSELECTOR)) {\n                    var invalid = false;\n                    inputs = this.element.find(this._inputSelector);\n                    for (idx = 0, length = inputs.length; idx < length; idx++) {\n                        if (!this.validateInput(inputs.eq(idx))) {\n                            invalid = true;\n                        }\n                    }\n                    result = !invalid;\n                } else {\n                    result = this.validateInput(this.element);\n                }\n                this.trigger(VALIDATE, { valid: result });\n                if (isValid !== result) {\n                    this.trigger(CHANGE);\n                }\n                return result;\n            },\n            validateInput: function (input) {\n                input = $(input);\n                this._isValidated = true;\n                var that = this, template = that._errorTemplate, result = that._checkValidity(input), valid = result.valid, className = '.' + INVALIDMSG, fieldName = input.attr(NAME) || '', lbl = that._findMessageContainer(fieldName).add(input.next(className).filter(function () {\n                        var element = $(this);\n                        if (element.filter('[' + kendo.attr('for') + ']').length) {\n                            return element.attr(kendo.attr('for')) === fieldName;\n                        }\n                        return true;\n                    })).hide(), messageText, wasValid = !input.attr('aria-invalid');\n                input.removeAttr('aria-invalid');\n                if (!valid) {\n                    messageText = that._extractMessage(input, result.key);\n                    that._errors[fieldName] = messageText;\n                    var messageLabel = parseHtml(template({ message: decode(messageText) }));\n                    var lblId = lbl.attr('id');\n                    that._decorateMessageContainer(messageLabel, fieldName);\n                    if (lblId) {\n                        messageLabel.attr('id', lblId);\n                    }\n                    if (!lbl.replaceWith(messageLabel).length) {\n                        messageLabel.insertAfter(input);\n                    }\n                    messageLabel.show();\n                    input.attr('aria-invalid', true);\n                } else {\n                    delete that._errors[fieldName];\n                }\n                if (wasValid !== valid) {\n                    this.trigger(VALIDATE_INPUT, {\n                        valid: valid,\n                        input: input\n                    });\n                }\n                input.toggleClass(INVALIDINPUT, !valid);\n                input.toggleClass(VALIDINPUT, valid);\n                return valid;\n            },\n            hideMessages: function () {\n                var that = this, className = '.' + INVALIDMSG, element = that.element;\n                if (!element.is(INPUTSELECTOR)) {\n                    element.find(className).hide();\n                } else {\n                    element.next(className).hide();\n                }\n            },\n            _findMessageContainer: function (fieldName) {\n                var locators = kendo.ui.validator.messageLocators, name, containers = $();\n                for (var idx = 0, length = this.element.length; idx < length; idx++) {\n                    containers = containers.add(searchForMessageContainer(this.element[idx].getElementsByTagName('*'), fieldName));\n                }\n                for (name in locators) {\n                    containers = containers.add(locators[name].locate(this.element, fieldName));\n                }\n                return containers;\n            },\n            _decorateMessageContainer: function (container, fieldName) {\n                var locators = kendo.ui.validator.messageLocators, name;\n                container.addClass(INVALIDMSG).attr(kendo.attr('for'), fieldName || '');\n                for (name in locators) {\n                    locators[name].decorate(container, fieldName);\n                }\n                container.attr('role', 'alert');\n            },\n            _extractMessage: function (input, ruleKey) {\n                var that = this, customMessage = that.options.messages[ruleKey], fieldName = input.attr(NAME), nonDefaultMessage;\n                if (!kendo.ui.Validator.prototype.options.messages[ruleKey]) {\n                    nonDefaultMessage = kendo.isFunction(customMessage) ? customMessage(input) : customMessage;\n                }\n                customMessage = kendo.isFunction(customMessage) ? customMessage(input) : customMessage;\n                return kendo.format(input.attr(kendo.attr(ruleKey + '-msg')) || input.attr('validationMessage') || nonDefaultMessage || input.attr('title') || customMessage || '', fieldName, input.attr(ruleKey) || input.attr(kendo.attr(ruleKey)));\n            },\n            _checkValidity: function (input) {\n                var rules = this.options.rules, rule;\n                for (rule in rules) {\n                    if (!rules[rule].call(this, input)) {\n                        return {\n                            valid: false,\n                            key: rule\n                        };\n                    }\n                }\n                return { valid: true };\n            },\n            errors: function () {\n                var results = [], errors = this._errors, error;\n                for (error in errors) {\n                    results.push(errors[error]);\n                }\n                return results;\n            }\n        });\n        kendo.ui.plugin(Validator);\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                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                    that._snapBack();\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 = $('<div class=\"km-touch-scrollbar km-' + (horizontal ? 'horizontal' : 'vertical') + '-scrollbar\" />');\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('<div class=\"km-scroll-header\"/>');\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('<div class=\"km-scroll-container\"/>').prepend('<div class=\"km-scroll-header\"/>');\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                        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 (!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('<span class=\"km-scroller-pull\"><span class=\"km-icon\"></span><span class=\"km-loading-left\"></span><span class=\"km-loading-right\"></span><span class=\"km-template\">' + that.pullTemplate({}) + '</span></span>');\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.resizable', [\n        'kendo.core',\n        'kendo.draganddrop'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'resizable',\n        name: 'Resizable',\n        category: 'framework',\n        depends: [\n            'core',\n            'draganddrop'\n        ],\n        advanced: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, proxy = $.proxy, isFunction = kendo.isFunction, extend = $.extend, HORIZONTAL = 'horizontal', VERTICAL = 'vertical', START = 'start', RESIZE = 'resize', RESIZEEND = 'resizeend';\n        var Resizable = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that.orientation = that.options.orientation.toLowerCase() != VERTICAL ? HORIZONTAL : VERTICAL;\n                that._positionMouse = that.orientation == HORIZONTAL ? 'x' : 'y';\n                that._position = that.orientation == HORIZONTAL ? 'left' : 'top';\n                that._sizingDom = that.orientation == HORIZONTAL ? 'outerWidth' : 'outerHeight';\n                that.draggable = new ui.Draggable(options.draggableElement || element, {\n                    distance: 1,\n                    filter: options.handle,\n                    drag: proxy(that._resize, that),\n                    dragcancel: proxy(that._cancel, that),\n                    dragstart: proxy(that._start, that),\n                    dragend: proxy(that._stop, that)\n                });\n                that.userEvents = that.draggable.userEvents;\n            },\n            events: [\n                RESIZE,\n                RESIZEEND,\n                START\n            ],\n            options: {\n                name: 'Resizable',\n                orientation: HORIZONTAL\n            },\n            resize: function () {\n            },\n            _max: function (e) {\n                var that = this, hintSize = that.hint ? that.hint[that._sizingDom]() : 0, size = that.options.max;\n                return isFunction(size) ? size(e) : size !== undefined ? that._initialElementPosition + size - hintSize : size;\n            },\n            _min: function (e) {\n                var that = this, size = that.options.min;\n                return isFunction(size) ? size(e) : size !== undefined ? that._initialElementPosition + size : size;\n            },\n            _start: function (e) {\n                var that = this, hint = that.options.hint, el = $(e.currentTarget);\n                that._initialElementPosition = el.position()[that._position];\n                that._initialMousePosition = e[that._positionMouse].startLocation;\n                if (hint) {\n                    that.hint = isFunction(hint) ? $(hint(el)) : hint;\n                    that.hint.css({ position: 'absolute' }).css(that._position, that._initialElementPosition).appendTo(that.element);\n                }\n                that.trigger(START, e);\n                that._maxPosition = that._max(e);\n                that._minPosition = that._min(e);\n                $(document.body).css('cursor', el.css('cursor'));\n            },\n            _resize: function (e) {\n                var that = this, maxPosition = that._maxPosition, minPosition = that._minPosition, currentPosition = that._initialElementPosition + (e[that._positionMouse].location - that._initialMousePosition), position;\n                position = minPosition !== undefined ? Math.max(minPosition, currentPosition) : currentPosition;\n                that.position = position = maxPosition !== undefined ? Math.min(maxPosition, position) : position;\n                if (that.hint) {\n                    that.hint.toggleClass(that.options.invalidClass || '', position == maxPosition || position == minPosition).css(that._position, position);\n                }\n                that.resizing = true;\n                that.trigger(RESIZE, extend(e, { position: position }));\n            },\n            _stop: function (e) {\n                var that = this;\n                if (that.hint) {\n                    that.hint.remove();\n                }\n                that.resizing = false;\n                that.trigger(RESIZEEND, extend(e, { position: that.position }));\n                $(document.body).css('cursor', '');\n            },\n            _cancel: function (e) {\n                var that = this;\n                if (that.hint) {\n                    that.position = undefined;\n                    that.hint.css(that._position, that._initialElementPosition);\n                    that._stop(e);\n                }\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                if (that.draggable) {\n                    that.draggable.destroy();\n                }\n            },\n            press: function (target) {\n                if (!target) {\n                    return;\n                }\n                var position = target.position(), that = this;\n                that.userEvents.press(position.left, position.top, target[0]);\n                that.targetPosition = position;\n                that.target = target;\n            },\n            move: function (delta) {\n                var that = this, orientation = that._position, position = that.targetPosition, current = that.position;\n                if (current === undefined) {\n                    current = position[orientation];\n                }\n                position[orientation] = current + delta;\n                that.userEvents.move(position.left, position.top);\n            },\n            end: function () {\n                this.userEvents.end();\n                this.target = this.position = undefined;\n            }\n        });\n        kendo.ui.plugin(Resizable);\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.sortable', ['kendo.draganddrop'], f);\n}(function () {\n    var __meta__ = {\n        id: 'sortable',\n        name: 'Sortable',\n        category: 'framework',\n        depends: ['draganddrop']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, START = 'start', BEFORE_MOVE = 'beforeMove', MOVE = 'move', END = 'end', CHANGE = 'change', CANCEL = 'cancel', ACTION_SORT = 'sort', ACTION_REMOVE = 'remove', ACTION_RECEIVE = 'receive', DEFAULT_FILTER = '>*', MISSING_INDEX = -1;\n        function containsOrEqualTo(parent, child) {\n            try {\n                return $.contains(parent, child) || parent == child;\n            } catch (e) {\n                return false;\n            }\n        }\n        function defaultHint(element) {\n            return element.clone();\n        }\n        function defaultPlaceholder(element) {\n            return element.clone().removeAttr('id').css('visibility', 'hidden');\n        }\n        var Sortable = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                if (!that.options.placeholder) {\n                    that.options.placeholder = defaultPlaceholder;\n                }\n                if (!that.options.hint) {\n                    that.options.hint = defaultHint;\n                }\n                that.draggable = that._createDraggable();\n            },\n            events: [\n                START,\n                BEFORE_MOVE,\n                MOVE,\n                END,\n                CHANGE,\n                CANCEL\n            ],\n            options: {\n                name: 'Sortable',\n                hint: null,\n                placeholder: null,\n                filter: DEFAULT_FILTER,\n                holdToDrag: false,\n                disabled: null,\n                container: null,\n                connectWith: null,\n                handler: null,\n                cursorOffset: null,\n                axis: null,\n                ignore: null,\n                autoScroll: false,\n                cursor: 'auto',\n                moveOnDragEnter: false\n            },\n            destroy: function () {\n                this.draggable.destroy();\n                Widget.fn.destroy.call(this);\n            },\n            _createDraggable: function () {\n                var that = this, element = that.element, options = that.options;\n                return new kendo.ui.Draggable(element, {\n                    filter: options.filter,\n                    hint: kendo.isFunction(options.hint) ? options.hint : $(options.hint),\n                    holdToDrag: options.holdToDrag,\n                    container: options.container ? $(options.container) : null,\n                    cursorOffset: options.cursorOffset,\n                    axis: options.axis,\n                    ignore: options.ignore,\n                    autoScroll: options.autoScroll,\n                    dragstart: $.proxy(that._dragstart, that),\n                    dragcancel: $.proxy(that._dragcancel, that),\n                    drag: $.proxy(that._drag, that),\n                    dragend: $.proxy(that._dragend, that)\n                });\n            },\n            _dragstart: function (e) {\n                var draggedElement = this.draggedElement = e.currentTarget, disabled = this.options.disabled, handler = this.options.handler, _placeholder = this.options.placeholder, placeholder = this.placeholder = kendo.isFunction(_placeholder) ? $(_placeholder.call(this, draggedElement)) : $(_placeholder);\n                if (disabled && draggedElement.is(disabled)) {\n                    e.preventDefault();\n                } else if (handler && !$(e.initialTarget).is(handler)) {\n                    e.preventDefault();\n                } else {\n                    if (this.trigger(START, {\n                            item: draggedElement,\n                            draggableEvent: e\n                        })) {\n                        e.preventDefault();\n                    } else {\n                        draggedElement.css('display', 'none');\n                        draggedElement.before(placeholder);\n                        this._setCursor();\n                    }\n                }\n            },\n            _dragcancel: function () {\n                this._cancel();\n                this.trigger(CANCEL, { item: this.draggedElement });\n                this._resetCursor();\n            },\n            _drag: function (e) {\n                var draggedElement = this.draggedElement, target = this._findTarget(e), targetCenter, cursorOffset = {\n                        left: e.x.location,\n                        top: e.y.location\n                    }, offsetDelta, axisDelta = {\n                        x: e.x.delta,\n                        y: e.y.delta\n                    }, direction, sibling, getSibling, axis = this.options.axis, moveOnDragEnter = this.options.moveOnDragEnter, eventData = {\n                        item: draggedElement,\n                        list: this,\n                        draggableEvent: e\n                    };\n                if (axis === 'x' || axis === 'y') {\n                    this._movementByAxis(axis, cursorOffset, axisDelta[axis], eventData);\n                    return;\n                }\n                if (target) {\n                    targetCenter = this._getElementCenter(target.element);\n                    offsetDelta = {\n                        left: Math.round(cursorOffset.left - targetCenter.left),\n                        top: Math.round(cursorOffset.top - targetCenter.top)\n                    };\n                    $.extend(eventData, { target: target.element });\n                    if (target.appendToBottom) {\n                        this._movePlaceholder(target, null, eventData);\n                        return;\n                    }\n                    if (target.appendAfterHidden) {\n                        this._movePlaceholder(target, 'next', eventData);\n                    }\n                    if (this._isFloating(target.element)) {\n                        if (axisDelta.x < 0 && moveOnDragEnter || !moveOnDragEnter && offsetDelta.left < 0) {\n                            direction = 'prev';\n                        } else if (axisDelta.x > 0 && moveOnDragEnter || !moveOnDragEnter && offsetDelta.left > 0) {\n                            direction = 'next';\n                        }\n                    } else {\n                        if (axisDelta.y < 0 && moveOnDragEnter || !moveOnDragEnter && offsetDelta.top < 0) {\n                            direction = 'prev';\n                        } else if (axisDelta.y > 0 && moveOnDragEnter || !moveOnDragEnter && offsetDelta.top > 0) {\n                            direction = 'next';\n                        }\n                    }\n                    if (direction) {\n                        getSibling = direction === 'prev' ? jQuery.fn.prev : jQuery.fn.next;\n                        sibling = getSibling.call(target.element);\n                        while (sibling.length && !sibling.is(':visible')) {\n                            sibling = getSibling.call(sibling);\n                        }\n                        if (sibling[0] != this.placeholder[0]) {\n                            this._movePlaceholder(target, direction, eventData);\n                        }\n                    }\n                }\n            },\n            _dragend: function (e) {\n                var placeholder = this.placeholder, draggedElement = this.draggedElement, draggedIndex = this.indexOf(draggedElement), placeholderIndex = this.indexOf(placeholder), connectWith = this.options.connectWith, connectedList, isDefaultPrevented, eventData, connectedListEventData;\n                this._resetCursor();\n                eventData = {\n                    action: ACTION_SORT,\n                    item: draggedElement,\n                    oldIndex: draggedIndex,\n                    newIndex: placeholderIndex,\n                    draggableEvent: e\n                };\n                if (placeholderIndex >= 0) {\n                    isDefaultPrevented = this.trigger(END, eventData);\n                } else {\n                    connectedList = placeholder.parents(connectWith).getKendoSortable();\n                    eventData.action = ACTION_REMOVE;\n                    connectedListEventData = $.extend({}, eventData, {\n                        action: ACTION_RECEIVE,\n                        oldIndex: MISSING_INDEX,\n                        newIndex: connectedList.indexOf(placeholder)\n                    });\n                    isDefaultPrevented = !(!this.trigger(END, eventData) && !connectedList.trigger(END, connectedListEventData));\n                }\n                if (isDefaultPrevented || placeholderIndex === draggedIndex) {\n                    this._cancel();\n                    return;\n                }\n                placeholder.replaceWith(draggedElement);\n                draggedElement.show();\n                this.draggable.dropped = true;\n                eventData = {\n                    action: this.indexOf(draggedElement) != MISSING_INDEX ? ACTION_SORT : ACTION_REMOVE,\n                    item: draggedElement,\n                    oldIndex: draggedIndex,\n                    newIndex: this.indexOf(draggedElement),\n                    draggableEvent: e\n                };\n                this.trigger(CHANGE, eventData);\n                if (connectedList) {\n                    connectedListEventData = $.extend({}, eventData, {\n                        action: ACTION_RECEIVE,\n                        oldIndex: MISSING_INDEX,\n                        newIndex: connectedList.indexOf(draggedElement)\n                    });\n                    connectedList.trigger(CHANGE, connectedListEventData);\n                }\n            },\n            _findTarget: function (e) {\n                var element = this._findElementUnderCursor(e), items, connectWith = this.options.connectWith, node;\n                if ($.contains(this.element[0], element)) {\n                    items = this.items();\n                    node = items.filter(element)[0] || items.has(element)[0];\n                    return node ? {\n                        element: $(node),\n                        sortable: this\n                    } : null;\n                } else if (this.element[0] == element && this._isEmpty()) {\n                    return {\n                        element: this.element,\n                        sortable: this,\n                        appendToBottom: true\n                    };\n                } else if (this.element[0] == element && this._isLastHidden()) {\n                    node = this.items().eq(0);\n                    return {\n                        element: node,\n                        sortable: this,\n                        appendAfterHidden: true\n                    };\n                } else if (connectWith) {\n                    return this._searchConnectedTargets(element, e);\n                }\n            },\n            _findElementUnderCursor: function (e) {\n                var elementUnderCursor = kendo.elementUnderCursor(e), draggable = e.sender;\n                if (containsOrEqualTo(draggable.hint[0], elementUnderCursor)) {\n                    draggable.hint.hide();\n                    elementUnderCursor = kendo.elementUnderCursor(e);\n                    if (!elementUnderCursor) {\n                        elementUnderCursor = kendo.elementUnderCursor(e);\n                    }\n                    draggable.hint.show();\n                }\n                return elementUnderCursor;\n            },\n            _searchConnectedTargets: function (element, e) {\n                var connected = $(this.options.connectWith), sortableInstance, items, node;\n                for (var i = 0; i < connected.length; i++) {\n                    sortableInstance = connected.eq(i).getKendoSortable();\n                    if ($.contains(connected[i], element)) {\n                        if (sortableInstance) {\n                            items = sortableInstance.items();\n                            node = items.filter(element)[0] || items.has(element)[0];\n                            if (node) {\n                                sortableInstance.placeholder = this.placeholder;\n                                return {\n                                    element: $(node),\n                                    sortable: sortableInstance\n                                };\n                            } else {\n                                return null;\n                            }\n                        }\n                    } else if (connected[i] == element) {\n                        if (sortableInstance && sortableInstance._isEmpty()) {\n                            return {\n                                element: connected.eq(i),\n                                sortable: sortableInstance,\n                                appendToBottom: true\n                            };\n                        } else if (this._isCursorAfterLast(sortableInstance, e)) {\n                            node = sortableInstance.items().last();\n                            return {\n                                element: node,\n                                sortable: sortableInstance\n                            };\n                        }\n                    }\n                }\n            },\n            _isCursorAfterLast: function (sortable, e) {\n                var lastItem = sortable.items().last(), cursorOffset = {\n                        left: e.x.location,\n                        top: e.y.location\n                    }, lastItemOffset, delta;\n                lastItemOffset = kendo.getOffset(lastItem);\n                lastItemOffset.top += outerHeight(lastItem);\n                lastItemOffset.left += outerWidth(lastItem);\n                if (this._isFloating(lastItem)) {\n                    delta = lastItemOffset.left - cursorOffset.left;\n                } else {\n                    delta = lastItemOffset.top - cursorOffset.top;\n                }\n                return delta < 0 ? true : false;\n            },\n            _movementByAxis: function (axis, cursorOffset, delta, eventData) {\n                var cursorPosition = axis === 'x' ? cursorOffset.left : cursorOffset.top, target = delta < 0 ? this.placeholder.prev() : this.placeholder.next(), targetCenter;\n                if (target.length && !target.is(':visible')) {\n                    target = delta < 0 ? target.prev() : target.next();\n                }\n                $.extend(eventData, { target: target });\n                targetCenter = this._getElementCenter(target);\n                if (targetCenter) {\n                    targetCenter = axis === 'x' ? targetCenter.left : targetCenter.top;\n                }\n                if (target.length && delta < 0 && cursorPosition - targetCenter < 0) {\n                    this._movePlaceholder({\n                        element: target,\n                        sortable: this\n                    }, 'prev', eventData);\n                } else if (target.length && delta > 0 && cursorPosition - targetCenter > 0) {\n                    this._movePlaceholder({\n                        element: target,\n                        sortable: this\n                    }, 'next', eventData);\n                }\n            },\n            _movePlaceholder: function (target, direction, eventData) {\n                var placeholder = this.placeholder;\n                if (!target.sortable.trigger(BEFORE_MOVE, eventData)) {\n                    if (!direction) {\n                        target.element.append(placeholder);\n                    } else if (direction === 'prev') {\n                        target.element.before(placeholder);\n                    } else if (direction === 'next') {\n                        target.element.after(placeholder);\n                    }\n                    target.sortable.trigger(MOVE, eventData);\n                }\n            },\n            _setCursor: function () {\n                var cursor = this.options.cursor, body;\n                if (cursor && cursor !== 'auto') {\n                    body = $(document.body);\n                    this._originalCursorType = body.css('cursor');\n                    body.css({ 'cursor': cursor });\n                    if (!this._cursorStylesheet) {\n                        this._cursorStylesheet = $('<style>* { cursor: ' + cursor + ' !important; }</style>');\n                    }\n                    this._cursorStylesheet.appendTo(body);\n                }\n            },\n            _resetCursor: function () {\n                if (this._originalCursorType) {\n                    $(document.body).css('cursor', this._originalCursorType);\n                    this._originalCursorType = null;\n                    this._cursorStylesheet.remove();\n                }\n            },\n            _getElementCenter: function (element) {\n                var center = element.length ? kendo.getOffset(element) : null;\n                if (center) {\n                    center.top += outerHeight(element) / 2;\n                    center.left += outerWidth(element) / 2;\n                }\n                return center;\n            },\n            _isFloating: function (item) {\n                return /left|right/.test(item.css('float')) || /inline|table-cell/.test(item.css('display'));\n            },\n            _cancel: function () {\n                this.draggedElement.show();\n                this.placeholder.remove();\n            },\n            _items: function () {\n                var filter = this.options.filter, items;\n                if (filter) {\n                    items = this.element.find(filter);\n                } else {\n                    items = this.element.children();\n                }\n                return items;\n            },\n            indexOf: function (element) {\n                var items = this._items(), placeholder = this.placeholder, draggedElement = this.draggedElement;\n                if (placeholder && element[0] == placeholder[0]) {\n                    return items.not(draggedElement).index(element);\n                } else {\n                    return items.not(placeholder).index(element);\n                }\n            },\n            items: function () {\n                var placeholder = this.placeholder, items = this._items();\n                if (placeholder) {\n                    items = items.not(placeholder);\n                }\n                return items;\n            },\n            _isEmpty: function () {\n                return !this.items().length;\n            },\n            _isLastHidden: function () {\n                return this.items().length === 1 && this.items().is(':hidden');\n            }\n        });\n        kendo.ui.plugin(Sortable);\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', 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', msie = kendo.support.browser.msie, supportEventDelegation = false;\n        (function ($) {\n            (function () {\n                $('<div class=\"parent\"><span /></div>').on('click', '>*', function () {\n                    supportEventDelegation = true;\n                }).find('span').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 = $('<div class=\\'k-marquee\\'><div class=\\'k-marquee-color\\'></div></div>');\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: [CHANGE],\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                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.button', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'button',\n        name: 'Button',\n        category: 'web',\n        description: 'The Button widget displays styled buttons.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, proxy = $.proxy, keys = kendo.keys, CLICK = 'click', KBUTTON = 'k-button', KBUTTONICON = 'k-button-icon', KBUTTONICONTEXT = 'k-button-icontext', NS = '.kendoButton', DISABLED = 'disabled', DISABLEDSTATE = 'k-state-disabled', FOCUSEDSTATE = 'k-state-focused', SELECTEDSTATE = 'k-state-active';\n        var Button = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                element = that.wrapper = that.element;\n                options = that.options;\n                element.addClass(KBUTTON).attr('role', 'button');\n                options.enable = options.enable && !element.attr(DISABLED);\n                that.enable(options.enable);\n                if (options.enable) {\n                    that._tabindex();\n                }\n                that._graphics();\n                element.on(CLICK + NS, proxy(that._click, that)).on('focus' + NS, proxy(that._focus, that)).on('blur' + NS, proxy(that._blur, that)).on('keydown' + NS, proxy(that._keydown, that)).on('keyup' + NS, proxy(that._keyup, that));\n                kendo.notify(that);\n            },\n            destroy: function () {\n                var that = this;\n                that.wrapper.off(NS);\n                Widget.fn.destroy.call(that);\n            },\n            events: [CLICK],\n            options: {\n                name: 'Button',\n                icon: '',\n                spriteCssClass: '',\n                imageUrl: '',\n                enable: true\n            },\n            _isNativeButton: function () {\n                return this.element.prop('tagName').toLowerCase() == 'button';\n            },\n            _click: function (e) {\n                if (this.options.enable) {\n                    if (this.trigger(CLICK, { event: e })) {\n                        e.preventDefault();\n                    }\n                }\n            },\n            _focus: function () {\n                if (this.options.enable) {\n                    this.element.addClass(FOCUSEDSTATE);\n                }\n            },\n            _blur: function () {\n                var that = this;\n                that.element.removeClass(FOCUSEDSTATE);\n                setTimeout(function () {\n                    that.element.removeClass(SELECTEDSTATE);\n                });\n            },\n            _keydown: function (e) {\n                var that = this;\n                if (e.keyCode == keys.ENTER || e.keyCode == keys.SPACEBAR) {\n                    if (that.options.enable) {\n                        that.element.addClass(SELECTEDSTATE);\n                    }\n                    if (!that._isNativeButton()) {\n                        if (e.keyCode == keys.SPACEBAR) {\n                            e.preventDefault();\n                        }\n                        that._click(e);\n                    }\n                }\n            },\n            _keyup: function () {\n                this.element.removeClass(SELECTEDSTATE);\n            },\n            _graphics: function () {\n                var that = this, element = that.element, options = that.options, icon = options.icon, spriteCssClass = options.spriteCssClass, imageUrl = options.imageUrl, span, img, isEmpty;\n                if (spriteCssClass || imageUrl || icon) {\n                    isEmpty = true;\n                    element.contents().filter(function () {\n                        return !$(this).hasClass('k-sprite') && !$(this).hasClass('k-icon') && !$(this).hasClass('k-image');\n                    }).each(function (idx, el) {\n                        if (el.nodeType == 1 || el.nodeType == 3 && $.trim(el.nodeValue).length > 0) {\n                            isEmpty = false;\n                        }\n                    });\n                    if (isEmpty) {\n                        element.addClass(KBUTTONICON);\n                    } else {\n                        element.addClass(KBUTTONICONTEXT);\n                    }\n                }\n                if (icon) {\n                    span = element.children('span.k-icon').first();\n                    if (!span[0]) {\n                        span = $('<span class=\"k-icon\"></span>').prependTo(element);\n                    }\n                    span.addClass('k-i-' + icon);\n                } else if (spriteCssClass) {\n                    span = element.children('span.k-sprite').first();\n                    if (!span[0]) {\n                        span = $('<span class=\"k-sprite\"></span>').prependTo(element);\n                    }\n                    span.addClass(spriteCssClass);\n                } else if (imageUrl) {\n                    img = element.children('img.k-image').first();\n                    if (!img[0]) {\n                        img = $('<img alt=\"icon\" class=\"k-image\" />').prependTo(element);\n                    }\n                    img.attr('src', imageUrl);\n                }\n            },\n            enable: function (enable) {\n                var that = this, element = that.element;\n                if (enable === undefined) {\n                    enable = true;\n                }\n                enable = !!enable;\n                that.options.enable = enable;\n                element.toggleClass(DISABLEDSTATE, !enable).attr('aria-disabled', !enable).attr(DISABLED, !enable);\n                if (enable) {\n                    that._tabindex();\n                }\n                try {\n                    element.blur();\n                } catch (err) {\n                }\n            }\n        });\n        kendo.ui.plugin(Button);\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.pager', ['kendo.data'], f);\n}(function () {\n    var __meta__ = {\n        id: 'pager',\n        name: 'Pager',\n        category: 'framework',\n        depends: ['data'],\n        advanced: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, proxy = $.proxy, FIRST = '.k-i-arrow-end-left', LAST = '.k-i-arrow-end-right', PREV = '.k-i-arrow-60-left', NEXT = '.k-i-arrow-60-right', CHANGE = 'change', NS = '.kendoPager', CLICK = 'click', KEYDOWN = 'keydown', DISABLED = 'disabled', MOUSEDOWN = 'down', DOCUMENT_ELEMENT = $(document.documentElement), MAX_VALUE = Number.MAX_VALUE, iconTemplate = kendo.template('<a href=\"\\\\#\" aria-label=\"#=text#\" title=\"#=text#\" class=\"k-link k-pager-nav #= wrapClassName #\"><span class=\"k-icon #= className #\"></span></a>');\n        function button(template, idx, text, numeric, title) {\n            return template({\n                idx: idx,\n                text: text,\n                ns: kendo.ns,\n                numeric: numeric,\n                title: title || ''\n            });\n        }\n        function icon(className, text, wrapClassName) {\n            return iconTemplate({\n                className: className.substring(1),\n                text: text,\n                wrapClassName: wrapClassName || ''\n            });\n        }\n        function update(element, selector, page, disabled) {\n            element.find(selector).parent().attr(kendo.attr('page'), page).attr('tabindex', -1).toggleClass('k-state-disabled', disabled);\n        }\n        function first(element, page) {\n            update(element, FIRST, 1, page <= 1);\n        }\n        function prev(element, page) {\n            update(element, PREV, Math.max(1, page - 1), page <= 1);\n        }\n        function next(element, page, totalPages) {\n            update(element, NEXT, Math.min(totalPages, page + 1), page >= totalPages);\n        }\n        function last(element, page, totalPages) {\n            update(element, LAST, totalPages, page >= totalPages);\n        }\n        var Pager = Widget.extend({\n            init: function (element, options) {\n                var that = this, page, totalPages;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                that.dataSource = kendo.data.DataSource.create(options.dataSource);\n                that.linkTemplate = kendo.template(that.options.linkTemplate);\n                that.selectTemplate = kendo.template(that.options.selectTemplate);\n                that.currentPageTemplate = kendo.template(that.options.currentPageTemplate);\n                page = that.page();\n                totalPages = that.totalPages();\n                that._refreshHandler = proxy(that.refresh, that);\n                that.dataSource.bind(CHANGE, that._refreshHandler);\n                that.downEvent = kendo.applyEventMap(MOUSEDOWN, kendo.guid());\n                if (options.previousNext) {\n                    if (!that.element.find(FIRST).length) {\n                        that.element.append(icon(FIRST, options.messages.first, 'k-pager-first'));\n                        first(that.element, page, totalPages);\n                    }\n                    if (!that.element.find(PREV).length) {\n                        that.element.append(icon(PREV, options.messages.previous));\n                        prev(that.element, page, totalPages);\n                    }\n                }\n                if (options.numeric) {\n                    that.list = that.element.find('.k-pager-numbers');\n                    if (!that.list.length) {\n                        that.list = $('<ul class=\"k-pager-numbers k-reset\" />').appendTo(that.element);\n                    }\n                }\n                if (options.input) {\n                    if (!that.element.find('.k-pager-input').length) {\n                        that.element.append('<span class=\"k-pager-input k-label\">' + options.messages.page + '<input class=\"k-textbox\">' + kendo.format(options.messages.of, totalPages) + '</span>');\n                    }\n                    that.element.on(KEYDOWN + NS, '.k-pager-input input', proxy(that._keydown, that));\n                }\n                if (options.previousNext) {\n                    if (!that.element.find(NEXT).length) {\n                        that.element.append(icon(NEXT, options.messages.next));\n                        next(that.element, page, totalPages);\n                    }\n                    if (!that.element.find(LAST).length) {\n                        that.element.append(icon(LAST, options.messages.last, 'k-pager-last'));\n                        last(that.element, page, totalPages);\n                    }\n                }\n                if (options.pageSizes) {\n                    if (!that.element.find('.k-pager-sizes').length) {\n                        var pageSizes = options.pageSizes.length ? options.pageSizes : [\n                            'all',\n                            5,\n                            10,\n                            20\n                        ];\n                        var pageItems = $.map(pageSizes, function (size) {\n                            if (size.toLowerCase && size.toLowerCase() === 'all') {\n                                return '<option value=\\'all\\'>' + options.messages.allPages + '</option>';\n                            }\n                            return '<option>' + size + '</option>';\n                        });\n                        $('<span class=\"k-pager-sizes k-label\"><select/>' + options.messages.itemsPerPage + '</span>').appendTo(that.element).find('select').html(pageItems.join('')).end().appendTo(that.element);\n                    }\n                    that.element.find('.k-pager-sizes select').val(that.pageSize());\n                    if (kendo.ui.DropDownList) {\n                        that.element.find('.k-pager-sizes select').show().kendoDropDownList();\n                    }\n                    that.element.on(CHANGE + NS, '.k-pager-sizes select', proxy(that._change, that));\n                }\n                if (options.refresh) {\n                    if (!that.element.find('.k-pager-refresh').length) {\n                        that.element.append('<a href=\"#\" class=\"k-pager-refresh k-link\" title=\"' + options.messages.refresh + '\" aria-label=\"' + options.messages.refresh + '\"><span class=\"k-icon k-i-reload\"></span></a>');\n                    }\n                    that.element.on(CLICK + NS, '.k-pager-refresh', proxy(that._refreshClick, that));\n                }\n                if (options.info) {\n                    if (!that.element.find('.k-pager-info').length) {\n                        that.element.append('<span class=\"k-pager-info k-label\" />');\n                    }\n                }\n                that.element.on(CLICK + NS, 'a', proxy(that._click, that)).addClass('k-pager-wrap k-widget k-floatwrap');\n                that.element.on(CLICK + NS, '.k-current-page', proxy(that._toggleActive, that));\n                if (options.autoBind) {\n                    that.refresh();\n                }\n                kendo.notify(that);\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that.element.off(NS);\n                that.dataSource.unbind(CHANGE, that._refreshHandler);\n                that._refreshHandler = null;\n                kendo.destroy(that.element);\n                that.element = that.list = null;\n            },\n            events: [CHANGE],\n            options: {\n                name: 'Pager',\n                selectTemplate: '<li><span class=\"k-state-selected\">#=text#</span></li>',\n                currentPageTemplate: '<li class=\"k-current-page\"><span class=\"k-link k-pager-nav\">#=text#</span></li>',\n                linkTemplate: '<li><a tabindex=\"-1\" href=\"\\\\#\" class=\"k-link\" data-#=ns#page=\"#=idx#\" #if (title !== \"\") {# title=\"#=title#\" #}#>#=text#</a></li>',\n                buttonCount: 10,\n                autoBind: true,\n                numeric: true,\n                info: true,\n                input: false,\n                previousNext: true,\n                pageSizes: false,\n                refresh: false,\n                messages: {\n                    allPages: 'All',\n                    display: '{0} - {1} of {2} items',\n                    empty: 'No items to display',\n                    page: 'Page',\n                    of: 'of {0}',\n                    itemsPerPage: 'items per page',\n                    first: 'Go to the first page',\n                    previous: 'Go to the previous page',\n                    next: 'Go to the next page',\n                    last: 'Go to the last page',\n                    refresh: 'Refresh',\n                    morePages: 'More pages'\n                }\n            },\n            setDataSource: function (dataSource) {\n                var that = this;\n                that.dataSource.unbind(CHANGE, that._refreshHandler);\n                that.dataSource = that.options.dataSource = dataSource;\n                dataSource.bind(CHANGE, that._refreshHandler);\n                if (that.options.autoBind) {\n                    dataSource.fetch();\n                }\n            },\n            refresh: function (e) {\n                var that = this, idx, end, start = 1, reminder, page = that.page(), html = '', options = that.options, pageSize = that.pageSize(), total = that.dataSource.total(), totalPages = that.totalPages(), linkTemplate = that.linkTemplate, buttonCount = options.buttonCount;\n                DOCUMENT_ELEMENT.unbind(that.downEvent, $.proxy(that._hideList, that));\n                if (e && e.action == 'itemchange') {\n                    return;\n                }\n                if (options.numeric) {\n                    if (page > buttonCount) {\n                        reminder = page % buttonCount;\n                        start = reminder === 0 ? page - buttonCount + 1 : page - reminder + 1;\n                    }\n                    end = Math.min(start + buttonCount - 1, totalPages);\n                    if (start > 1) {\n                        html += button(linkTemplate, start - 1, '...', false, options.messages.morePages);\n                    }\n                    for (idx = start; idx <= end; idx++) {\n                        html += button(idx == page ? that.selectTemplate : linkTemplate, idx, idx, true);\n                    }\n                    if (end < totalPages) {\n                        html += button(linkTemplate, idx, '...', false, options.messages.morePages);\n                    }\n                    if (html === '') {\n                        html = that.selectTemplate({ text: 0 });\n                    }\n                    html = this.currentPageTemplate({ text: page }) + html;\n                    that.list.removeClass('k-state-expanded').html(html);\n                }\n                if (options.info) {\n                    if (total > 0) {\n                        html = kendo.format(options.messages.display, that.dataSource.options.endless ? 1 : Math.min((page - 1) * pageSize + 1, total), Math.min(page * pageSize, total), total);\n                    } else {\n                        html = options.messages.empty;\n                    }\n                    that.element.find('.k-pager-info').html(html);\n                }\n                if (options.input) {\n                    that.element.find('.k-pager-input').html(that.options.messages.page + '<input class=\"k-textbox\" aria-label=\"' + page + '\">' + kendo.format(options.messages.of, totalPages)).find('input').val(page).attr(DISABLED, total < 1).toggleClass('k-state-disabled', total < 1);\n                }\n                if (options.previousNext) {\n                    first(that.element, page, totalPages);\n                    prev(that.element, page, totalPages);\n                    next(that.element, page, totalPages);\n                    last(that.element, page, totalPages);\n                }\n                if (options.pageSizes) {\n                    var hasAll = that.element.find('.k-pager-sizes option[value=\\'all\\']').length > 0;\n                    var selectAll = hasAll && (pageSize === this.dataSource.total() || pageSize == MAX_VALUE);\n                    var text = pageSize;\n                    if (selectAll) {\n                        pageSize = 'all';\n                        text = options.messages.allPages;\n                    }\n                    that.element.find('.k-pager-sizes select').val(pageSize).attr('aria-label', pageSize).filter('[' + kendo.attr('role') + '=dropdownlist]').kendoDropDownList('value', pageSize).kendoDropDownList('text', text);\n                }\n            },\n            _keydown: function (e) {\n                if (e.keyCode === kendo.keys.ENTER) {\n                    var input = this.element.find('.k-pager-input').find('input'), page = parseInt(input.val(), 10);\n                    if (isNaN(page) || page < 1 || page > this.totalPages()) {\n                        page = this.page();\n                    }\n                    input.val(page);\n                    this.page(page);\n                }\n            },\n            _refreshClick: function (e) {\n                e.preventDefault();\n                this.dataSource.read();\n            },\n            _change: function (e) {\n                var value = e.currentTarget.value;\n                var pageSize = parseInt(value, 10);\n                var dataSource = this.dataSource;\n                if (!isNaN(pageSize)) {\n                    dataSource.pageSize(pageSize);\n                } else if ((value + '').toLowerCase() == 'all') {\n                    dataSource._pageSize = undefined;\n                    dataSource._take = undefined;\n                    dataSource.fetch();\n                }\n            },\n            _toggleActive: function () {\n                var that = this;\n                if (that.list.hasClass('k-state-expanded')) {\n                    DOCUMENT_ELEMENT.unbind(that.downEvent, $.proxy(that._hideList, that));\n                } else {\n                    DOCUMENT_ELEMENT.bind(that.downEvent, $.proxy(that._hideList, that));\n                }\n                that.list.toggleClass('k-state-expanded');\n            },\n            _hideList: function (e) {\n                var that = this, target = kendo.eventTarget(e);\n                if (!$.contains(that.list[0], target)) {\n                    DOCUMENT_ELEMENT.unbind(that.downEvent, $.proxy(that._hideList, that));\n                    that.list.removeClass('k-state-expanded');\n                }\n            },\n            _click: function (e) {\n                var target = $(e.currentTarget);\n                e.preventDefault();\n                if (!target.is('.k-state-disabled')) {\n                    this.page(target.attr(kendo.attr('page')));\n                }\n            },\n            totalPages: function () {\n                return Math.ceil((this.dataSource.total() || 0) / (this.pageSize() || 1));\n            },\n            pageSize: function () {\n                return this.dataSource.pageSize() || this.dataSource.total();\n            },\n            page: function (page) {\n                if (page !== undefined) {\n                    if (this.trigger('pageChange', { index: page })) {\n                        return;\n                    }\n                    this.dataSource.page(page);\n                    this.trigger(CHANGE, { index: page });\n                } else {\n                    if (this.dataSource.total() > 0) {\n                        return this.dataSource.page();\n                    } else {\n                        return 0;\n                    }\n                }\n            }\n        });\n        ui.plugin(Pager);\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.unbind(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.unbind(that.downEvent, that._mousedownProxy).bind(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.unbind(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)) {\n                    eventNames += ' ' + SCROLL;\n                }\n                this._scrollableParents()[method](SCROLL, this._resizeProxy);\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.notification', [\n        'kendo.core',\n        'kendo.popup'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'notification',\n        name: 'Notification',\n        category: 'web',\n        description: 'The Notification widget displays user alerts.',\n        depends: [\n            'core',\n            'popup'\n        ],\n        features: [{\n                id: 'notification-fx',\n                name: 'Animation',\n                description: 'Support for animation',\n                depends: ['fx']\n            }]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, proxy = $.proxy, extend = $.extend, setTimeout = window.setTimeout, CLICK = 'click', SHOW = 'show', HIDE = 'hide', KNOTIFICATION = 'k-notification', KICLOSE = '.k-notification-wrap .k-i-close', KHIDING = 'k-hiding', INFO = 'info', SUCCESS = 'success', WARNING = 'warning', ERROR = 'error', TOP = 'top', LEFT = 'left', BOTTOM = 'bottom', RIGHT = 'right', UP = 'up', NS = '.kendoNotification', WRAPPER = '<div class=\"k-widget k-popup k-notification\"></div>', TEMPLATE = '<div class=\"k-notification-wrap\">' + '<span class=\"k-icon k-i-#=typeIcon#\" title=\"#=typeIcon#\"></span>' + '#=content#' + '<span class=\"k-icon k-i-close\" title=\"Hide\"></span>' + '</div>', SAFE_TEMPLATE = TEMPLATE.replace('#=content#', '#:content#');\n        var Notification = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                if (!options.appendTo || !$(options.appendTo).is(element)) {\n                    that.element.hide();\n                }\n                that._compileTemplates(options.templates);\n                that._guid = '_' + kendo.guid();\n                that._isRtl = kendo.support.isRtl(element);\n                that._compileStacking(options.stacking, options.position.top, options.position.left);\n                kendo.notify(that);\n            },\n            events: [\n                SHOW,\n                HIDE\n            ],\n            options: {\n                name: 'Notification',\n                position: {\n                    pinned: true,\n                    top: null,\n                    left: null,\n                    bottom: 20,\n                    right: 20\n                },\n                stacking: 'default',\n                hideOnClick: true,\n                button: false,\n                allowHideAfter: 0,\n                autoHideAfter: 5000,\n                appendTo: null,\n                width: null,\n                height: null,\n                templates: [],\n                animation: {\n                    open: {\n                        effects: 'fade:in',\n                        duration: 300\n                    },\n                    close: {\n                        effects: 'fade:out',\n                        duration: 600,\n                        hide: true\n                    }\n                }\n            },\n            _compileTemplates: function (templates) {\n                var that = this;\n                var kendoTemplate = kendo.template;\n                that._compiled = {};\n                $.each(templates, function (key, value) {\n                    that._compiled[value.type] = kendoTemplate(value.template || $('#' + value.templateId).html());\n                });\n                that._defaultCompiled = kendoTemplate(TEMPLATE);\n                that._safeCompiled = kendoTemplate(SAFE_TEMPLATE);\n            },\n            _getCompiled: function (type, safe) {\n                var defaultCompiled = safe ? this._safeCompiled : this._defaultCompiled;\n                return type ? this._compiled[type] || defaultCompiled : defaultCompiled;\n            },\n            _compileStacking: function (stacking, top, left) {\n                var that = this, paddings = {\n                        paddingTop: 0,\n                        paddingRight: 0,\n                        paddingBottom: 0,\n                        paddingLeft: 0\n                    }, horizontalAlignment = left !== null ? LEFT : RIGHT, origin, position;\n                switch (stacking) {\n                case 'down':\n                    origin = BOTTOM + ' ' + horizontalAlignment;\n                    position = TOP + ' ' + horizontalAlignment;\n                    delete paddings.paddingBottom;\n                    break;\n                case RIGHT:\n                    origin = TOP + ' ' + RIGHT;\n                    position = TOP + ' ' + LEFT;\n                    delete paddings.paddingRight;\n                    break;\n                case LEFT:\n                    origin = TOP + ' ' + LEFT;\n                    position = TOP + ' ' + RIGHT;\n                    delete paddings.paddingLeft;\n                    break;\n                case UP:\n                    origin = TOP + ' ' + horizontalAlignment;\n                    position = BOTTOM + ' ' + horizontalAlignment;\n                    delete paddings.paddingTop;\n                    break;\n                default:\n                    if (top !== null) {\n                        origin = BOTTOM + ' ' + horizontalAlignment;\n                        position = TOP + ' ' + horizontalAlignment;\n                        delete paddings.paddingBottom;\n                    } else {\n                        origin = TOP + ' ' + horizontalAlignment;\n                        position = BOTTOM + ' ' + horizontalAlignment;\n                        delete paddings.paddingTop;\n                    }\n                    break;\n                }\n                that._popupOrigin = origin;\n                that._popupPosition = position;\n                that._popupPaddings = paddings;\n            },\n            _attachPopupEvents: function (options, popup) {\n                var that = this, allowHideAfter = options.allowHideAfter, attachDelay = !isNaN(allowHideAfter) && allowHideAfter > 0, closeIcon;\n                function attachClick(target) {\n                    target.on(CLICK + NS, function () {\n                        that._hidePopup(popup);\n                    });\n                }\n                if (options.hideOnClick) {\n                    popup.bind('activate', function () {\n                        if (attachDelay) {\n                            setTimeout(function () {\n                                attachClick(popup.element);\n                            }, allowHideAfter);\n                        } else {\n                            attachClick(popup.element);\n                        }\n                    });\n                } else if (options.button) {\n                    closeIcon = popup.element.find(KICLOSE);\n                    if (attachDelay) {\n                        setTimeout(function () {\n                            attachClick(closeIcon);\n                        }, allowHideAfter);\n                    } else {\n                        attachClick(closeIcon);\n                    }\n                }\n            },\n            _showPopup: function (wrapper, options) {\n                var that = this, autoHideAfter = options.autoHideAfter, x = options.position.left, y = options.position.top, popup, openPopup;\n                openPopup = $('.' + that._guid + ':not(.' + KHIDING + ')').last();\n                popup = new kendo.ui.Popup(wrapper, {\n                    anchor: openPopup[0] ? openPopup : document.body,\n                    origin: that._popupOrigin,\n                    position: that._popupPosition,\n                    animation: options.animation,\n                    modal: true,\n                    collision: '',\n                    isRtl: that._isRtl,\n                    close: function () {\n                        that._triggerHide(this.element);\n                    },\n                    deactivate: function (e) {\n                        e.sender.element.off(NS);\n                        e.sender.element.find(KICLOSE).off(NS);\n                        e.sender.destroy();\n                    }\n                });\n                that._attachPopupEvents(options, popup);\n                wrapper.removeClass('k-group k-reset');\n                if (openPopup[0]) {\n                    popup.open();\n                } else {\n                    if (x === null) {\n                        x = $(window).width() - wrapper.width() - options.position.right;\n                    }\n                    if (y === null) {\n                        y = $(window).height() - wrapper.height() - options.position.bottom;\n                    }\n                    popup.open(x, y);\n                }\n                popup.wrapper.addClass(that._guid).css(extend({\n                    margin: 0,\n                    zIndex: 10050\n                }, that._popupPaddings));\n                if (options.position.pinned) {\n                    popup.wrapper.css('position', 'fixed');\n                    if (openPopup[0]) {\n                        that._togglePin(popup.wrapper, true);\n                    }\n                } else if (!openPopup[0]) {\n                    that._togglePin(popup.wrapper, false);\n                }\n                if (autoHideAfter > 0) {\n                    setTimeout(function () {\n                        that._hidePopup(popup);\n                    }, autoHideAfter);\n                }\n            },\n            _hidePopup: function (popup) {\n                popup.wrapper.addClass(KHIDING);\n                popup.close();\n            },\n            _togglePin: function (wrapper, pin) {\n                var win = $(window), sign = pin ? -1 : 1;\n                wrapper.css({\n                    top: parseInt(wrapper.css(TOP), 10) + sign * win.scrollTop(),\n                    left: parseInt(wrapper.css(LEFT), 10) + sign * win.scrollLeft()\n                });\n            },\n            _attachStaticEvents: function (options, wrapper) {\n                var that = this, allowHideAfter = options.allowHideAfter, attachDelay = !isNaN(allowHideAfter) && allowHideAfter > 0;\n                function attachClick(target) {\n                    target.on(CLICK + NS, proxy(that._hideStatic, that, wrapper));\n                }\n                if (options.hideOnClick) {\n                    if (attachDelay) {\n                        setTimeout(function () {\n                            attachClick(wrapper);\n                        }, allowHideAfter);\n                    } else {\n                        attachClick(wrapper);\n                    }\n                } else if (options.button) {\n                    if (attachDelay) {\n                        setTimeout(function () {\n                            attachClick(wrapper.find(KICLOSE));\n                        }, allowHideAfter);\n                    } else {\n                        attachClick(wrapper.find(KICLOSE));\n                    }\n                }\n            },\n            _showStatic: function (wrapper, options) {\n                var that = this, autoHideAfter = options.autoHideAfter, animation = options.animation, insertionMethod = options.stacking == UP || options.stacking == LEFT ? 'prependTo' : 'appendTo';\n                wrapper.removeClass('k-popup').addClass(that._guid)[insertionMethod](options.appendTo).hide().kendoAnimate(animation.open || false);\n                that._attachStaticEvents(options, wrapper);\n                if (autoHideAfter > 0) {\n                    setTimeout(function () {\n                        that._hideStatic(wrapper);\n                    }, autoHideAfter);\n                }\n            },\n            _hideStatic: function (wrapper) {\n                wrapper.kendoAnimate(extend(this.options.animation.close || false, {\n                    complete: function () {\n                        wrapper.off(NS).find(KICLOSE).off(NS);\n                        wrapper.remove();\n                    }\n                }));\n                this._triggerHide(wrapper);\n            },\n            _triggerHide: function (element) {\n                this.trigger(HIDE, { element: element });\n                this.angular('cleanup', function () {\n                    return { elements: element };\n                });\n            },\n            show: function (content, type, safe) {\n                var that = this, options = that.options, wrapper = $(WRAPPER), args, defaultArgs;\n                if (!type) {\n                    type = INFO;\n                }\n                if (content !== null && content !== undefined && content !== '') {\n                    if (kendo.isFunction(content)) {\n                        content = content();\n                    }\n                    defaultArgs = {\n                        typeIcon: type,\n                        content: ''\n                    };\n                    if ($.isPlainObject(content)) {\n                        args = extend(defaultArgs, content);\n                    } else {\n                        args = extend(defaultArgs, { content: content });\n                    }\n                    wrapper.addClass(KNOTIFICATION + '-' + type).toggleClass(KNOTIFICATION + '-button', options.button).attr('data-role', 'alert').css({\n                        width: options.width,\n                        height: options.height\n                    }).append(that._getCompiled(type, safe)(args));\n                    that.angular('compile', function () {\n                        return {\n                            elements: wrapper,\n                            data: [{ dataItem: args }]\n                        };\n                    });\n                    if ($(options.appendTo)[0]) {\n                        that._showStatic(wrapper, options);\n                    } else {\n                        that._showPopup(wrapper, options);\n                    }\n                    that.trigger(SHOW, { element: wrapper });\n                }\n                return that;\n            },\n            showText: function (content, type) {\n                this.show(content, type, true);\n            },\n            info: function (content) {\n                return this.show(content, INFO);\n            },\n            success: function (content) {\n                return this.show(content, SUCCESS);\n            },\n            warning: function (content) {\n                return this.show(content, WARNING);\n            },\n            error: function (content) {\n                return this.show(content, ERROR);\n            },\n            hide: function () {\n                var that = this, openedNotifications = that.getNotifications();\n                if (that.options.appendTo) {\n                    openedNotifications.each(function (idx, element) {\n                        that._hideStatic($(element));\n                    });\n                } else {\n                    openedNotifications.each(function (idx, element) {\n                        var popup = $(element).data('kendoPopup');\n                        if (popup) {\n                            that._hidePopup(popup);\n                        }\n                    });\n                }\n                return that;\n            },\n            getNotifications: function () {\n                var that = this, guidElements = $('.' + that._guid + ':not(.' + KHIDING + ')');\n                if (that.options.appendTo) {\n                    return guidElements;\n                } else {\n                    return guidElements.children('.' + KNOTIFICATION);\n                }\n            },\n            setOptions: function (newOptions) {\n                var that = this, options;\n                Widget.fn.setOptions.call(that, newOptions);\n                options = that.options;\n                if (newOptions.templates !== undefined) {\n                    that._compileTemplates(options.templates);\n                }\n                if (newOptions.stacking !== undefined || newOptions.position !== undefined) {\n                    that._compileStacking(options.stacking, options.position.top, options.position.left);\n                }\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.getNotifications().off(NS).find(KICLOSE).off(NS);\n            }\n        });\n        kendo.ui.plugin(Notification);\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.tooltip', [\n        'kendo.core',\n        'kendo.popup'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'tooltip',\n        name: 'Tooltip',\n        category: 'web',\n        description: 'The Tooltip widget displays a popup hint for a given html element.',\n        depends: [\n            'core',\n            'popup'\n        ],\n        features: [{\n                id: 'tooltip-fx',\n                name: 'Animation',\n                description: 'Support for animation',\n                depends: ['fx']\n            }]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, Popup = kendo.ui.Popup, isFunction = kendo.isFunction, isPlainObject = $.isPlainObject, extend = $.extend, proxy = $.proxy, DOCUMENT = $(document), isLocalUrl = kendo.isLocalUrl, ARIAIDSUFFIX = '_tt_active', DESCRIBEDBY = 'aria-describedby', SHOW = 'show', HIDE = 'hide', ERROR = 'error', CONTENTLOAD = 'contentLoad', REQUESTSTART = 'requestStart', KCONTENTFRAME = 'k-content-frame', TEMPLATE = '<div role=\"tooltip\" class=\"k-widget k-tooltip#if (!autoHide) {# k-tooltip-closable#}#\">#if (!autoHide) {# <div class=\"k-tooltip-button\"><a href=\"\\\\#\" class=\"k-icon k-i-close\" title=\"Close\"></a></div> #}#' + '<div class=\"k-tooltip-content\"></div>' + '#if (callout){ #<div class=\"k-callout k-callout-#=dir#\"></div>#}#' + '</div>', IFRAMETEMPLATE = kendo.template('<iframe frameborder=\\'0\\' class=\\'' + KCONTENTFRAME + '\\' ' + 'src=\\'#= content.url #\\'>' + 'This page requires frames in order to show content' + '</iframe>'), NS = '.kendoTooltip', POSITIONS = {\n                bottom: {\n                    origin: 'bottom center',\n                    position: 'top center'\n                },\n                top: {\n                    origin: 'top center',\n                    position: 'bottom center'\n                },\n                left: {\n                    origin: 'center left',\n                    position: 'center right',\n                    collision: 'fit flip'\n                },\n                right: {\n                    origin: 'center right',\n                    position: 'center left',\n                    collision: 'fit flip'\n                },\n                center: {\n                    position: 'center center',\n                    origin: 'center center'\n                }\n            }, DIRCLASSES = {\n                bottom: 'n',\n                top: 's',\n                left: 'e',\n                right: 'w',\n                center: 'n'\n            }, DIMENSIONS = {\n                'horizontal': {\n                    offset: 'top',\n                    size: 'outerHeight'\n                },\n                'vertical': {\n                    offset: 'left',\n                    size: 'outerWidth'\n                }\n            }, DEFAULTCONTENT = function (e) {\n                return e.target.data(kendo.ns + 'title');\n            };\n        function restoreTitle(element) {\n            while (element.length) {\n                if (restoreTitleAttributeForElement(element)) {\n                    break;\n                }\n                element = element.parent();\n            }\n        }\n        function restoreTitleAttributeForElement(element) {\n            var title = element.data(kendo.ns + 'title');\n            if (title) {\n                element.attr('title', title);\n                element.removeData(kendo.ns + 'title');\n                return true;\n            }\n        }\n        function saveTitleAttributeForElement(element) {\n            var title = element.attr('title');\n            if (title) {\n                element.data(kendo.ns + 'title', title);\n                element.attr('title', '');\n                return true;\n            }\n        }\n        function saveTitleAttributes(element) {\n            while (element.length && !element.is('body')) {\n                if (saveTitleAttributeForElement(element)) {\n                    break;\n                }\n                element = element.parent();\n            }\n        }\n        var Tooltip = Widget.extend({\n            init: function (element, options) {\n                var that = this, axis;\n                Widget.fn.init.call(that, element, options);\n                axis = that.options.position.match(/left|right/) ? 'horizontal' : 'vertical';\n                that.dimensions = DIMENSIONS[axis];\n                that._documentKeyDownHandler = proxy(that._documentKeyDown, that);\n                that.element.on(that.options.showOn + NS, that.options.filter, proxy(that._showOn, that));\n                if (!this._isShownOnFocus()) {\n                    that.element.on('mouseenter' + NS, that.options.filter, proxy(that._mouseenter, that));\n                }\n                if (this.options.autoHide && !this._isShownOnFocus()) {\n                    that.element.on('mouseleave' + NS, that.options.filter, proxy(that._mouseleave, that));\n                }\n                if (this.options.autoHide && this._isShownOnFocus()) {\n                    that.element.on('blur' + NS, that.options.filter, proxy(that._blur, that));\n                }\n            },\n            options: {\n                name: 'Tooltip',\n                filter: '',\n                content: DEFAULTCONTENT,\n                showAfter: 100,\n                callout: true,\n                position: 'bottom',\n                showOn: 'mouseenter',\n                autoHide: true,\n                width: null,\n                height: null,\n                animation: {\n                    open: {\n                        effects: 'fade:in',\n                        duration: 0\n                    },\n                    close: {\n                        duration: 40,\n                        hide: true\n                    }\n                }\n            },\n            events: [\n                SHOW,\n                HIDE,\n                CONTENTLOAD,\n                ERROR,\n                REQUESTSTART\n            ],\n            _isShownOnFocus: function () {\n                return this.options.showOn && this.options.showOn.match(/focus/);\n            },\n            _mouseenter: function (e) {\n                saveTitleAttributes($(e.currentTarget));\n            },\n            _showOn: function (e) {\n                var that = this;\n                var currentTarget = $(e.currentTarget);\n                if (that.options.showOn && that.options.showOn.match(/click/)) {\n                    that._show(currentTarget);\n                } else if (that._isShownOnFocus()) {\n                    saveTitleAttributes(currentTarget);\n                    that._show(currentTarget);\n                } else {\n                    clearTimeout(that.timeout);\n                    that.timeout = setTimeout(function () {\n                        that._show(currentTarget);\n                    }, that.options.showAfter);\n                }\n            },\n            _appendContent: function (target) {\n                var that = this, contentOptions = that.options.content, element = that.content, showIframe = that.options.iframe, iframe;\n                if (isPlainObject(contentOptions) && contentOptions.url) {\n                    if (!('iframe' in that.options)) {\n                        showIframe = !isLocalUrl(contentOptions.url);\n                    }\n                    that.trigger(REQUESTSTART, {\n                        options: contentOptions,\n                        target: target\n                    });\n                    if (!showIframe) {\n                        element.empty();\n                        kendo.ui.progress(element, true);\n                        that._ajaxRequest(contentOptions);\n                    } else {\n                        element.hide();\n                        iframe = element.find('.' + KCONTENTFRAME)[0];\n                        if (iframe) {\n                            iframe.src = contentOptions.url || iframe.src;\n                        } else {\n                            element.html(IFRAMETEMPLATE({ content: contentOptions }));\n                        }\n                        element.find('.' + KCONTENTFRAME).off('load' + NS).on('load' + NS, function () {\n                            that.trigger(CONTENTLOAD);\n                            element.show();\n                        });\n                    }\n                } else if (contentOptions && isFunction(contentOptions)) {\n                    contentOptions = contentOptions({\n                        sender: this,\n                        target: target\n                    });\n                    element.html(contentOptions || '');\n                } else {\n                    element.html(contentOptions);\n                }\n                that.angular('compile', function () {\n                    return { elements: element };\n                });\n            },\n            _ajaxRequest: function (options) {\n                var that = this;\n                jQuery.ajax(extend({\n                    type: 'GET',\n                    dataType: 'html',\n                    cache: false,\n                    error: function (xhr, status) {\n                        kendo.ui.progress(that.content, false);\n                        that.trigger(ERROR, {\n                            status: status,\n                            xhr: xhr\n                        });\n                    },\n                    success: proxy(function (data) {\n                        kendo.ui.progress(that.content, false);\n                        that.content.html(data);\n                        that.trigger(CONTENTLOAD);\n                    }, that)\n                }, options));\n            },\n            _documentKeyDown: function (e) {\n                if (e.keyCode === kendo.keys.ESC) {\n                    this.hide();\n                }\n            },\n            refresh: function () {\n                var that = this, popup = that.popup;\n                if (popup && popup.options.anchor) {\n                    that._appendContent(popup.options.anchor);\n                }\n            },\n            hide: function () {\n                if (this.popup) {\n                    this.popup.close();\n                }\n            },\n            show: function (target) {\n                target = target || this.element;\n                saveTitleAttributes(target);\n                this._show(target);\n            },\n            _show: function (target) {\n                var that = this, current = that.target();\n                if (!that.popup) {\n                    that._initPopup();\n                }\n                if (current && current[0] != target[0]) {\n                    that.popup.close();\n                    that.popup.element.kendoStop(true, true);\n                }\n                if (!current || current[0] != target[0]) {\n                    that._appendContent(target);\n                    that.popup.options.anchor = target;\n                }\n                that.popup.one('deactivate', function () {\n                    restoreTitle(target);\n                    target.removeAttr(DESCRIBEDBY);\n                    this.element.removeAttr('id').attr('aria-hidden', true);\n                    DOCUMENT.off('keydown' + NS, that._documentKeyDownHandler);\n                });\n                that.popup.open();\n            },\n            _initPopup: function () {\n                var that = this, options = that.options, wrapper = $(kendo.template(TEMPLATE)({\n                        callout: options.callout && options.position !== 'center',\n                        dir: DIRCLASSES[options.position],\n                        autoHide: options.autoHide\n                    }));\n                that.popup = new Popup(wrapper, extend({\n                    activate: function () {\n                        var anchor = this.options.anchor, ariaId = anchor[0].id || that.element[0].id;\n                        if (ariaId) {\n                            anchor.attr(DESCRIBEDBY, ariaId + ARIAIDSUFFIX);\n                            this.element.attr('id', ariaId + ARIAIDSUFFIX);\n                        }\n                        this.element.removeAttr('aria-hidden');\n                        DOCUMENT.on('keydown' + NS, that._documentKeyDownHandler);\n                        that.trigger(SHOW);\n                    },\n                    close: function () {\n                        that.trigger(HIDE);\n                    },\n                    copyAnchorStyles: false,\n                    animation: options.animation\n                }, POSITIONS[options.position]));\n                wrapper.css({\n                    width: options.width,\n                    height: options.height\n                });\n                that.content = wrapper.find('.k-tooltip-content');\n                that.arrow = wrapper.find('.k-callout');\n                if (options.autoHide && !this._isShownOnFocus()) {\n                    wrapper.on('mouseleave' + NS, proxy(that._mouseleave, that));\n                } else {\n                    wrapper.on('click' + NS, '.k-tooltip-button', proxy(that._closeButtonClick, that));\n                }\n            },\n            _closeButtonClick: function (e) {\n                e.preventDefault();\n                this.hide();\n            },\n            _mouseleave: function (e) {\n                this._closePopup(e.currentTarget);\n                clearTimeout(this.timeout);\n            },\n            _blur: function (e) {\n                this._closePopup(e.currentTarget);\n            },\n            _closePopup: function (target) {\n                if (this.popup) {\n                    this.popup.close();\n                } else {\n                    restoreTitle($(target));\n                }\n            },\n            target: function () {\n                if (this.popup) {\n                    return this.popup.options.anchor;\n                }\n                return null;\n            },\n            destroy: function () {\n                var popup = this.popup;\n                if (popup) {\n                    popup.element.off(NS);\n                    popup.destroy();\n                }\n                clearTimeout(this.timeout);\n                this.element.off(NS);\n                DOCUMENT.off('keydown' + NS, this._documentKeyDownHandler);\n                Widget.fn.destroy.call(this);\n            }\n        });\n        kendo.ui.plugin(Tooltip);\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.toolbar', [\n        'kendo.core',\n        'kendo.userevents',\n        'kendo.popup'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'toolbar',\n        name: 'ToolBar',\n        category: 'web',\n        description: 'The ToolBar widget displays one or more command buttons divided into groups.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Class = kendo.Class, Widget = kendo.ui.Widget, proxy = $.proxy, isFunction = kendo.isFunction, keys = kendo.keys, outerWidth = kendo._outerWidth, TOOLBAR = 'k-toolbar', BUTTON = 'k-button', OVERFLOW_BUTTON = 'k-overflow-button', TOGGLE_BUTTON = 'k-toggle-button', BUTTON_GROUP = 'k-button-group', SPLIT_BUTTON = 'k-split-button', SEPARATOR = 'k-separator', POPUP = 'k-popup', RESIZABLE_TOOLBAR = 'k-toolbar-resizable', STATE_ACTIVE = 'k-state-active', STATE_DISABLED = 'k-state-disabled', STATE_HIDDEN = 'k-state-hidden', GROUP_START = 'k-group-start', GROUP_END = 'k-group-end', PRIMARY = 'k-primary', ICON = 'k-icon', ICON_PREFIX = 'k-i-', BUTTON_ICON = 'k-button-icon', BUTTON_ICON_TEXT = 'k-button-icontext', LIST_CONTAINER = 'k-list-container k-split-container', SPLIT_BUTTON_ARROW = 'k-split-button-arrow', OVERFLOW_ANCHOR = 'k-overflow-anchor', OVERFLOW_CONTAINER = 'k-overflow-container', FIRST_TOOLBAR_VISIBLE = 'k-toolbar-first-visible', LAST_TOOLBAR_VISIBLE = 'k-toolbar-last-visible', CLICK = 'click', TOGGLE = 'toggle', OPEN = 'open', CLOSE = 'close', OVERFLOW_OPEN = 'overflowOpen', OVERFLOW_CLOSE = 'overflowClose', OVERFLOW_NEVER = 'never', OVERFLOW_AUTO = 'auto', OVERFLOW_ALWAYS = 'always', OVERFLOW_HIDDEN = 'k-overflow-hidden', OPTION_LIST_SUFFIX = '_optionlist', KENDO_UID_ATTR = kendo.attr('uid');\n        kendo.toolbar = {};\n        var components = {\n            overflowAnchor: '<div tabindex=\"0\" class=\"k-overflow-anchor\"></div>',\n            overflowContainer: '<ul class=\"k-overflow-container k-list-container\"></ul>'\n        };\n        kendo.toolbar.registerComponent = function (name, toolbar, overflow) {\n            components[name] = {\n                toolbar: toolbar,\n                overflow: overflow\n            };\n        };\n        var Item = kendo.Class.extend({\n            addOverflowAttr: function () {\n                this.element.attr(kendo.attr('overflow'), this.options.overflow || OVERFLOW_AUTO);\n            },\n            addUidAttr: function () {\n                this.element.attr(KENDO_UID_ATTR, this.options.uid);\n            },\n            addIdAttr: function () {\n                if (this.options.id) {\n                    this.element.attr('id', this.options.id);\n                }\n            },\n            addOverflowIdAttr: function () {\n                if (this.options.id) {\n                    this.element.attr('id', this.options.id + '_overflow');\n                }\n            },\n            attributes: function () {\n                if (this.options.attributes) {\n                    this.element.attr(this.options.attributes);\n                }\n            },\n            show: function () {\n                this.element.removeClass(STATE_HIDDEN).show();\n                this.options.hidden = false;\n            },\n            hide: function () {\n                this.element.addClass(STATE_HIDDEN).hide();\n                if (this.overflow && this.overflowHidden) {\n                    this.overflowHidden();\n                }\n                this.options.hidden = true;\n            },\n            remove: function () {\n                this.element.remove();\n            },\n            enable: function (isEnabled) {\n                if (isEnabled === undefined) {\n                    isEnabled = true;\n                }\n                this.element.toggleClass(STATE_DISABLED, !isEnabled);\n                this.options.enable = isEnabled;\n            },\n            twin: function () {\n                var uid = this.element.attr(KENDO_UID_ATTR);\n                if (this.overflow && this.options.splitContainerId) {\n                    return $('#' + this.options.splitContainerId).find('[' + KENDO_UID_ATTR + '=\\'' + uid + '\\']').data(this.options.type);\n                } else if (this.overflow) {\n                    return this.toolbar.element.find('[' + KENDO_UID_ATTR + '=\\'' + uid + '\\']').data(this.options.type);\n                } else if (this.toolbar.options.resizable) {\n                    return this.toolbar.popup.element.find('[' + KENDO_UID_ATTR + '=\\'' + uid + '\\']').data(this.options.type);\n                }\n            }\n        });\n        kendo.toolbar.Item = Item;\n        var Button = Item.extend({\n            init: function (options, toolbar) {\n                var element = options.useButtonTag ? $('<button tabindex=\"0\"></button>') : $('<a href tabindex=\"0\"></a>');\n                this.element = element;\n                this.options = options;\n                this.toolbar = toolbar;\n                this.attributes();\n                if (options.primary) {\n                    element.addClass(PRIMARY);\n                }\n                if (options.togglable) {\n                    element.addClass(TOGGLE_BUTTON);\n                    this.toggle(options.selected);\n                }\n                if (options.url !== undefined && !options.useButtonTag) {\n                    element.attr('href', options.url);\n                    if (options.mobile) {\n                        element.attr(kendo.attr('role'), 'button');\n                    }\n                }\n                if (options.group) {\n                    element.attr(kendo.attr('group'), options.group);\n                    this.group = this.toolbar.addToGroup(this, options.group);\n                }\n                if (!options.togglable && options.click && isFunction(options.click)) {\n                    this.clickHandler = options.click;\n                }\n                if (options.togglable && options.toggle && isFunction(options.toggle)) {\n                    this.toggleHandler = options.toggle;\n                }\n            },\n            toggle: function (state, propagate) {\n                state = !!state;\n                if (this.group && state) {\n                    this.group.select(this);\n                } else if (!this.group) {\n                    this.select(state);\n                }\n                if (propagate && this.twin()) {\n                    this.twin().toggle(state);\n                }\n            },\n            getParentGroup: function () {\n                if (this.options.isChild) {\n                    return this.element.closest('.' + BUTTON_GROUP).data('buttonGroup');\n                }\n            },\n            _addGraphics: function () {\n                var element = this.element, icon = this.options.icon, spriteCssClass = this.options.spriteCssClass, imageUrl = this.options.imageUrl, isEmpty, span, img;\n                if (spriteCssClass || imageUrl || icon) {\n                    isEmpty = true;\n                    element.contents().filter(function () {\n                        return !$(this).hasClass('k-sprite') && !$(this).hasClass(ICON) && !$(this).hasClass('k-image');\n                    }).each(function (idx, el) {\n                        if (el.nodeType == 1 || el.nodeType == 3 && $.trim(el.nodeValue).length > 0) {\n                            isEmpty = false;\n                        }\n                    });\n                    if (isEmpty) {\n                        element.addClass(BUTTON_ICON);\n                    } else {\n                        element.addClass(BUTTON_ICON_TEXT);\n                    }\n                }\n                if (icon) {\n                    span = element.children('span.' + ICON).first();\n                    if (!span[0]) {\n                        span = $('<span class=\"' + ICON + '\"></span>').prependTo(element);\n                    }\n                    span.addClass(ICON_PREFIX + icon);\n                } else if (spriteCssClass) {\n                    span = element.children('span.k-sprite').first();\n                    if (!span[0]) {\n                        span = $('<span class=\"k-sprite ' + ICON + '\"></span>').prependTo(element);\n                    }\n                    span.addClass(spriteCssClass);\n                } else if (imageUrl) {\n                    img = element.children('img.k-image').first();\n                    if (!img[0]) {\n                        img = $('<img alt=\"icon\" class=\"k-image\" />').prependTo(element);\n                    }\n                    img.attr('src', imageUrl);\n                }\n            }\n        });\n        kendo.toolbar.Button = Button;\n        var ToolBarButton = Button.extend({\n            init: function (options, toolbar) {\n                Button.fn.init.call(this, options, toolbar);\n                var element = this.element;\n                element.addClass(BUTTON);\n                this.addIdAttr();\n                if (options.align) {\n                    element.addClass('k-align-' + options.align);\n                }\n                if (options.showText != 'overflow' && options.text) {\n                    if (options.mobile) {\n                        element.html('<span class=\"km-text\">' + options.text + '</span>');\n                    } else {\n                        element.html(options.text);\n                    }\n                }\n                options.hasIcon = options.showIcon != 'overflow' && (options.icon || options.spriteCssClass || options.imageUrl);\n                if (options.hasIcon) {\n                    this._addGraphics();\n                }\n                this.addUidAttr();\n                this.addOverflowAttr();\n                this.enable(options.enable);\n                if (options.hidden) {\n                    this.hide();\n                }\n                this.element.data({\n                    type: 'button',\n                    button: this\n                });\n            },\n            select: function (selected) {\n                if (selected === undefined) {\n                    selected = false;\n                }\n                this.element.toggleClass(STATE_ACTIVE, selected);\n                this.options.selected = selected;\n            }\n        });\n        kendo.toolbar.ToolBarButton = ToolBarButton;\n        var OverflowButton = Button.extend({\n            init: function (options, toolbar) {\n                this.overflow = true;\n                Button.fn.init.call(this, $.extend({}, options), toolbar);\n                var element = this.element;\n                if (options.showText != 'toolbar' && options.text) {\n                    if (options.mobile) {\n                        element.html('<span class=\"km-text\">' + options.text + '</span>');\n                    } else {\n                        element.html('<span class=\"k-text\">' + options.text + '</span>');\n                    }\n                }\n                options.hasIcon = options.showIcon != 'toolbar' && (options.icon || options.spriteCssClass || options.imageUrl);\n                if (options.hasIcon) {\n                    this._addGraphics();\n                }\n                if (!options.isChild) {\n                    this._wrap();\n                }\n                this.addOverflowIdAttr();\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowAttr();\n                this.enable(options.enable);\n                element.addClass(OVERFLOW_BUTTON + ' ' + BUTTON);\n                if (options.hidden) {\n                    this.hide();\n                }\n                if (options.togglable) {\n                    this.toggle(options.selected);\n                }\n                this.element.data({\n                    type: 'button',\n                    button: this\n                });\n            },\n            _wrap: function () {\n                this.element = this.element.wrap('<li></li>').parent();\n            },\n            overflowHidden: function () {\n                this.element.addClass(OVERFLOW_HIDDEN);\n            },\n            select: function (selected) {\n                if (selected === undefined) {\n                    selected = false;\n                }\n                if (this.options.isChild) {\n                    this.element.toggleClass(STATE_ACTIVE, selected);\n                } else {\n                    this.element.find('.k-button').toggleClass(STATE_ACTIVE, selected);\n                }\n                this.options.selected = selected;\n            }\n        });\n        kendo.toolbar.OverflowButton = OverflowButton;\n        kendo.toolbar.registerComponent('button', ToolBarButton, OverflowButton);\n        var ButtonGroup = Item.extend({\n            createButtons: function (buttonConstructor) {\n                var options = this.options;\n                var items = options.buttons || [];\n                var item;\n                for (var i = 0; i < items.length; i++) {\n                    if (!items[i].uid) {\n                        items[i].uid = kendo.guid();\n                    }\n                    item = new buttonConstructor($.extend({\n                        mobile: options.mobile,\n                        isChild: true,\n                        type: 'button'\n                    }, items[i]), this.toolbar);\n                    item.element.appendTo(this.element);\n                }\n            },\n            refresh: function () {\n                this.element.children().filter(':not(\\'.' + STATE_HIDDEN + '\\'):first').addClass(GROUP_START);\n                this.element.children().filter(':not(\\'.' + STATE_HIDDEN + '\\'):last').addClass(GROUP_END);\n            }\n        });\n        kendo.toolbar.ButtonGroup = ButtonGroup;\n        var ToolBarButtonGroup = ButtonGroup.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<div></div>');\n                this.options = options;\n                this.toolbar = toolbar;\n                this.addIdAttr();\n                if (options.align) {\n                    element.addClass('k-align-' + options.align);\n                }\n                this.createButtons(ToolBarButton);\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowAttr();\n                this.refresh();\n                element.addClass(BUTTON_GROUP);\n                this.element.data({\n                    type: 'buttonGroup',\n                    buttonGroup: this\n                });\n            }\n        });\n        kendo.toolbar.ToolBarButtonGroup = ToolBarButtonGroup;\n        var OverflowButtonGroup = ButtonGroup.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<li></li>');\n                this.options = options;\n                this.toolbar = toolbar;\n                this.overflow = true;\n                this.addOverflowIdAttr();\n                this.createButtons(OverflowButton);\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowAttr();\n                this.refresh();\n                element.addClass((options.mobile ? '' : BUTTON_GROUP) + ' k-overflow-group');\n                this.element.data({\n                    type: 'buttonGroup',\n                    buttonGroup: this\n                });\n            },\n            overflowHidden: function () {\n                this.element.addClass(OVERFLOW_HIDDEN);\n            }\n        });\n        kendo.toolbar.OverflowButtonGroup = OverflowButtonGroup;\n        kendo.toolbar.registerComponent('buttonGroup', ToolBarButtonGroup, OverflowButtonGroup);\n        var ToolBarSplitButton = Item.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<div class=\"' + SPLIT_BUTTON + '\" tabindex=\"0\"></div>');\n                this.options = options;\n                this.toolbar = toolbar;\n                this.mainButton = new ToolBarButton($.extend({}, options, { hidden: false }), toolbar);\n                this.arrowButton = $('<a class=\"' + BUTTON + ' ' + SPLIT_BUTTON_ARROW + '\"><span class=\"' + (options.mobile ? 'km-icon km-arrowdown' : 'k-icon k-i-arrow-60-down') + '\"></span></a>');\n                this.popupElement = $('<ul class=\"' + LIST_CONTAINER + '\"></ul>');\n                this.mainButton.element.removeAttr('href tabindex').appendTo(element);\n                this.arrowButton.appendTo(element);\n                this.popupElement.appendTo(element);\n                if (options.align) {\n                    element.addClass('k-align-' + options.align);\n                }\n                if (!options.id) {\n                    options.id = options.uid;\n                }\n                element.attr('id', options.id + '_wrapper');\n                this.addOverflowAttr();\n                this.addUidAttr();\n                this.createMenuButtons();\n                this.createPopup();\n                this._navigatable();\n                this.mainButton.main = true;\n                this.enable(options.enable);\n                if (options.hidden) {\n                    this.hide();\n                }\n                element.data({\n                    type: 'splitButton',\n                    splitButton: this,\n                    kendoPopup: this.popup\n                });\n            },\n            _navigatable: function () {\n                var that = this;\n                that.popupElement.on('keydown', '.' + BUTTON, function (e) {\n                    var li = $(e.target).parent();\n                    e.preventDefault();\n                    if (e.keyCode === keys.ESC || e.keyCode === keys.TAB || e.altKey && e.keyCode === keys.UP) {\n                        that.toggle();\n                        that.focus();\n                    } else if (e.keyCode === keys.DOWN) {\n                        findFocusableSibling(li, 'next').focus();\n                    } else if (e.keyCode === keys.UP) {\n                        findFocusableSibling(li, 'prev').focus();\n                    } else if (e.keyCode === keys.SPACEBAR || e.keyCode === keys.ENTER) {\n                        that.toolbar.userEvents.trigger('tap', { target: $(e.target) });\n                    } else if (e.keyCode === keys.HOME) {\n                        li.parent().find(':kendoFocusable').first().focus();\n                    } else if (e.keyCode === keys.END) {\n                        li.parent().find(':kendoFocusable').last().focus();\n                    }\n                });\n            },\n            createMenuButtons: function () {\n                var options = this.options;\n                var items = options.menuButtons;\n                var item;\n                for (var i = 0; i < items.length; i++) {\n                    item = new ToolBarButton($.extend({\n                        mobile: options.mobile,\n                        type: 'button',\n                        click: options.click\n                    }, items[i]), this.toolbar);\n                    item.element.wrap('<li></li>').parent().appendTo(this.popupElement);\n                }\n            },\n            createPopup: function () {\n                var that = this;\n                var options = this.options;\n                var element = this.element;\n                this.popupElement.attr('id', options.id + OPTION_LIST_SUFFIX).attr(KENDO_UID_ATTR, options.rootUid);\n                if (options.mobile) {\n                    this.popupElement = actionSheetWrap(this.popupElement);\n                }\n                this.popup = this.popupElement.kendoPopup({\n                    appendTo: options.mobile ? $(options.mobile).children('.km-pane') : null,\n                    anchor: element,\n                    isRtl: this.toolbar._isRtl,\n                    copyAnchorStyles: false,\n                    animation: options.animation,\n                    open: function (e) {\n                        var isDefaultPrevented = that.toolbar.trigger(OPEN, { target: element });\n                        if (isDefaultPrevented) {\n                            e.preventDefault();\n                            return;\n                        }\n                        that.adjustPopupWidth(e.sender);\n                    },\n                    activate: function () {\n                        this.element.find(':kendoFocusable').first().focus();\n                    },\n                    close: function (e) {\n                        var isDefaultPrevented = that.toolbar.trigger(CLOSE, { target: element });\n                        if (isDefaultPrevented) {\n                            e.preventDefault();\n                        }\n                        element.focus();\n                    }\n                }).data('kendoPopup');\n                this.popup.element.on(CLICK, 'a.k-button', preventClick);\n            },\n            adjustPopupWidth: function (popup) {\n                var anchor = popup.options.anchor, computedWidth = outerWidth(anchor), width;\n                kendo.wrap(popup.element).addClass('k-split-wrapper');\n                if (popup.element.css('box-sizing') !== 'border-box') {\n                    width = computedWidth - (outerWidth(popup.element) - popup.element.width());\n                } else {\n                    width = computedWidth;\n                }\n                popup.element.css({\n                    fontFamily: anchor.css('font-family'),\n                    'min-width': width\n                });\n            },\n            remove: function () {\n                this.popup.element.off(CLICK, 'a.k-button');\n                this.popup.destroy();\n                this.element.remove();\n            },\n            toggle: function () {\n                if (this.options.enable || this.popup.visible()) {\n                    this.popup.toggle();\n                }\n            },\n            enable: function (isEnabled) {\n                if (isEnabled === undefined) {\n                    isEnabled = true;\n                }\n                this.mainButton.enable(isEnabled);\n                this.element.toggleClass(STATE_DISABLED, !isEnabled);\n                this.options.enable = isEnabled;\n            },\n            focus: function () {\n                this.element.focus();\n            },\n            hide: function () {\n                if (this.popup) {\n                    this.popup.close();\n                }\n                this.element.addClass(STATE_HIDDEN).hide();\n                this.options.hidden = true;\n            },\n            show: function () {\n                this.element.removeClass(STATE_HIDDEN).hide();\n                this.options.hidden = false;\n            }\n        });\n        kendo.toolbar.ToolBarSplitButton = ToolBarSplitButton;\n        var OverflowSplitButton = Item.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<li class=\"' + SPLIT_BUTTON + '\"></li>'), items = options.menuButtons, item, splitContainerId;\n                this.options = options;\n                this.toolbar = toolbar;\n                this.overflow = true;\n                splitContainerId = (options.id || options.uid) + OPTION_LIST_SUFFIX;\n                this.mainButton = new OverflowButton($.extend({}, options));\n                this.mainButton.element.appendTo(element);\n                for (var i = 0; i < items.length; i++) {\n                    item = new OverflowButton($.extend({\n                        mobile: options.mobile,\n                        type: 'button',\n                        splitContainerId: splitContainerId\n                    }, items[i]), this.toolbar);\n                    item.element.appendTo(element);\n                }\n                this.addUidAttr();\n                this.addOverflowAttr();\n                this.mainButton.main = true;\n                element.data({\n                    type: 'splitButton',\n                    splitButton: this\n                });\n            },\n            overflowHidden: function () {\n                this.element.addClass(OVERFLOW_HIDDEN);\n            }\n        });\n        kendo.toolbar.OverflowSplitButton = OverflowSplitButton;\n        kendo.toolbar.registerComponent('splitButton', ToolBarSplitButton, OverflowSplitButton);\n        var ToolBarSeparator = Item.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<div>&nbsp;</div>');\n                this.element = element;\n                this.options = options;\n                this.toolbar = toolbar;\n                this.attributes();\n                this.addIdAttr();\n                this.addUidAttr();\n                this.addOverflowAttr();\n                element.addClass(SEPARATOR);\n                element.data({\n                    type: 'separator',\n                    separator: this\n                });\n            }\n        });\n        var OverflowSeparator = Item.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<li>&nbsp;</li>');\n                this.element = element;\n                this.options = options;\n                this.toolbar = toolbar;\n                this.overflow = true;\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowIdAttr();\n                element.addClass(SEPARATOR);\n                element.data({\n                    type: 'separator',\n                    separator: this\n                });\n            },\n            overflowHidden: function () {\n                this.element.addClass(OVERFLOW_HIDDEN);\n            }\n        });\n        kendo.toolbar.registerComponent('separator', ToolBarSeparator, OverflowSeparator);\n        var TemplateItem = Item.extend({\n            init: function (template, options, toolbar) {\n                var element = isFunction(template) ? template(options) : template;\n                if (!(element instanceof jQuery)) {\n                    element = $('<div></div>').html(element);\n                } else {\n                    element = element.wrap('<div></div>').parent();\n                }\n                this.element = element;\n                this.options = options;\n                this.options.type = 'template';\n                this.toolbar = toolbar;\n                this.attributes();\n                this.addUidAttr();\n                this.addIdAttr();\n                this.addOverflowAttr();\n                element.data({\n                    type: 'template',\n                    template: this\n                });\n            }\n        });\n        kendo.toolbar.TemplateItem = TemplateItem;\n        var OverflowTemplateItem = Item.extend({\n            init: function (template, options, toolbar) {\n                var element = isFunction(template) ? $(template(options)) : $(template);\n                if (!(element instanceof jQuery)) {\n                    element = $('<li></li>').html(element);\n                } else {\n                    element = element.wrap('<li></li>').parent();\n                }\n                this.element = element;\n                this.options = options;\n                this.options.type = 'template';\n                this.toolbar = toolbar;\n                this.overflow = true;\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowIdAttr();\n                this.addOverflowAttr();\n                element.data({\n                    type: 'template',\n                    template: this\n                });\n            },\n            overflowHidden: function () {\n                this.element.addClass(OVERFLOW_HIDDEN);\n            }\n        });\n        kendo.toolbar.OverflowTemplateItem = OverflowTemplateItem;\n        function toggleActive(e) {\n            if (!e.target.is('.k-toggle-button')) {\n                e.target.toggleClass(STATE_ACTIVE, e.type == 'press');\n            }\n        }\n        function actionSheetWrap(element) {\n            element = $(element);\n            return element.hasClass('km-actionsheet') ? element.closest('.km-popup-wrapper') : element.addClass('km-widget km-actionsheet').wrap('<div class=\"km-actionsheet-wrapper km-actionsheet-tablet km-widget km-popup\"></div>').parent().wrap('<div class=\"km-popup-wrapper k-popup\"></div>').parent();\n        }\n        function preventClick(e) {\n            if ($(e.target).closest('a.k-button').length) {\n                e.preventDefault();\n            }\n        }\n        function findFocusableSibling(element, dir) {\n            var getSibling = dir === 'next' ? $.fn.next : $.fn.prev;\n            var getter = dir === 'next' ? $.fn.first : $.fn.last;\n            var candidate = getSibling.call(element);\n            if (candidate.is(':kendoFocusable') || !candidate.length) {\n                return candidate;\n            }\n            if (candidate.find(':kendoFocusable').length) {\n                return getter.call(candidate.find(':kendoFocusable'));\n            }\n            return findFocusableSibling(candidate, dir);\n        }\n        var Group = Class.extend({\n            init: function (name) {\n                this.name = name;\n                this.buttons = [];\n            },\n            add: function (button) {\n                this.buttons[this.buttons.length] = button;\n            },\n            remove: function (button) {\n                var index = $.inArray(button, this.buttons);\n                this.buttons.splice(index, 1);\n            },\n            select: function (button) {\n                var tmp;\n                for (var i = 0; i < this.buttons.length; i++) {\n                    tmp = this.buttons[i];\n                    tmp.select(false);\n                }\n                button.select(true);\n                if (button.twin()) {\n                    button.twin().select(true);\n                }\n            }\n        });\n        var ToolBar = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.wrapper = that.element;\n                element.addClass(TOOLBAR + ' k-widget');\n                this.uid = kendo.guid();\n                this._isRtl = kendo.support.isRtl(element);\n                this._groups = {};\n                element.attr(KENDO_UID_ATTR, this.uid);\n                that.isMobile = typeof options.mobile === 'boolean' ? options.mobile : that.element.closest('.km-root')[0];\n                that.animation = that.isMobile ? { open: { effects: 'fade' } } : {};\n                if (that.isMobile) {\n                    element.addClass('km-widget');\n                    ICON = 'km-icon';\n                    ICON_PREFIX = 'km-';\n                    BUTTON = 'km-button';\n                    BUTTON_GROUP = 'km-buttongroup km-widget';\n                    STATE_ACTIVE = 'km-state-active';\n                    STATE_DISABLED = 'km-state-disabled';\n                }\n                if (options.resizable) {\n                    that._renderOverflow();\n                    element.addClass(RESIZABLE_TOOLBAR);\n                    that.overflowUserEvents = new kendo.UserEvents(that.element, {\n                        threshold: 5,\n                        allowSelection: true,\n                        filter: '.' + OVERFLOW_ANCHOR,\n                        tap: proxy(that._toggleOverflow, that)\n                    });\n                    that._resizeHandler = kendo.onResize(function () {\n                        that.resize();\n                    });\n                } else {\n                    that.popup = { element: $([]) };\n                }\n                if (options.items && options.items.length) {\n                    for (var i = 0; i < options.items.length; i++) {\n                        that.add(options.items[i]);\n                    }\n                    if (options.resizable) {\n                        that._shrink(that.element.innerWidth());\n                    }\n                }\n                that.userEvents = new kendo.UserEvents(document, {\n                    threshold: 5,\n                    allowSelection: true,\n                    filter: '[' + KENDO_UID_ATTR + '=' + this.uid + '] a.' + BUTTON + ', ' + '[' + KENDO_UID_ATTR + '=' + this.uid + '] .' + OVERFLOW_BUTTON,\n                    tap: proxy(that._buttonClick, that),\n                    press: toggleActive,\n                    release: toggleActive\n                });\n                that.element.on(CLICK, 'a.k-button', preventClick);\n                that._navigatable();\n                if (options.resizable) {\n                    that.popup.element.on(CLICK, +'a.k-button', preventClick);\n                }\n                if (options.resizable) {\n                    this._toggleOverflowAnchor();\n                }\n                kendo.notify(that);\n            },\n            events: [\n                CLICK,\n                TOGGLE,\n                OPEN,\n                CLOSE,\n                OVERFLOW_OPEN,\n                OVERFLOW_CLOSE\n            ],\n            options: {\n                name: 'ToolBar',\n                items: [],\n                resizable: true,\n                mobile: null\n            },\n            addToGroup: function (button, groupName) {\n                var group;\n                if (!this._groups[groupName]) {\n                    group = this._groups[groupName] = new Group();\n                } else {\n                    group = this._groups[groupName];\n                }\n                group.add(button);\n                return group;\n            },\n            destroy: function () {\n                var that = this;\n                that.element.find('.' + SPLIT_BUTTON).each(function (idx, element) {\n                    $(element).data('kendoPopup').destroy();\n                });\n                that.element.off(CLICK, 'a.k-button');\n                that.userEvents.destroy();\n                if (that.options.resizable) {\n                    kendo.unbindResize(that._resizeHandler);\n                    that.overflowUserEvents.destroy();\n                    that.popup.element.off(CLICK, 'a.k-button');\n                    that.popup.destroy();\n                }\n                Widget.fn.destroy.call(that);\n            },\n            add: function (options) {\n                var component = components[options.type], template = options.template, tool, that = this, itemClasses = that.isMobile ? '' : 'k-item k-state-default', overflowTemplate = options.overflowTemplate, overflowTool;\n                $.extend(options, {\n                    uid: kendo.guid(),\n                    animation: that.animation,\n                    mobile: that.isMobile,\n                    rootUid: that.uid\n                });\n                if (options.menuButtons) {\n                    for (var i = 0; i < options.menuButtons.length; i++) {\n                        $.extend(options.menuButtons[i], { uid: kendo.guid() });\n                    }\n                }\n                if (template && !overflowTemplate) {\n                    options.overflow = OVERFLOW_NEVER;\n                } else if (!options.overflow) {\n                    options.overflow = OVERFLOW_AUTO;\n                }\n                if (options.overflow !== OVERFLOW_NEVER && that.options.resizable) {\n                    if (overflowTemplate) {\n                        overflowTool = new OverflowTemplateItem(overflowTemplate, options, that);\n                    } else if (component) {\n                        overflowTool = new component.overflow(options, that);\n                        overflowTool.element.addClass(itemClasses);\n                    }\n                    if (overflowTool) {\n                        if (options.overflow === OVERFLOW_AUTO) {\n                            overflowTool.overflowHidden();\n                        }\n                        overflowTool.element.appendTo(that.popup.container);\n                        that.angular('compile', function () {\n                            return { elements: overflowTool.element.get() };\n                        });\n                    }\n                }\n                if (options.overflow !== OVERFLOW_ALWAYS) {\n                    if (template) {\n                        tool = new TemplateItem(template, options, that);\n                    } else if (component) {\n                        tool = new component.toolbar(options, that);\n                    }\n                    if (tool) {\n                        tool.element.appendTo(that.element);\n                        that.angular('compile', function () {\n                            return { elements: tool.element.get() };\n                        });\n                    }\n                }\n            },\n            _getItem: function (candidate) {\n                var element, toolbarItem, overflowItem, isResizable = this.options.resizable, type;\n                element = this.element.find(candidate);\n                if (!element.length) {\n                    element = $('.k-split-container[data-uid=' + this.uid + ']').find(candidate);\n                }\n                type = element.length ? element.data('type') : '';\n                toolbarItem = element.data(type);\n                if (toolbarItem) {\n                    if (toolbarItem.main) {\n                        element = element.parent('.' + SPLIT_BUTTON);\n                        type = 'splitButton';\n                        toolbarItem = element.data(type);\n                    }\n                    if (isResizable) {\n                        overflowItem = toolbarItem.twin();\n                    }\n                } else if (isResizable) {\n                    element = this.popup.element.find(candidate);\n                    type = element.length ? element.data('type') : '';\n                    overflowItem = element.data(type);\n                    if (overflowItem && overflowItem.main) {\n                        element = element.parent('.' + SPLIT_BUTTON);\n                        type = 'splitButton';\n                        overflowItem = element.data(type);\n                    }\n                }\n                return {\n                    type: type,\n                    toolbar: toolbarItem,\n                    overflow: overflowItem\n                };\n            },\n            remove: function (candidate) {\n                var item = this._getItem(candidate);\n                if (item.toolbar) {\n                    item.toolbar.remove();\n                }\n                if (item.overflow) {\n                    item.overflow.remove();\n                }\n                this.resize(true);\n            },\n            hide: function (candidate) {\n                var item = this._getItem(candidate);\n                if (item.toolbar) {\n                    if (item.toolbar.options.type === 'button' && item.toolbar.options.isChild) {\n                        item.toolbar.hide();\n                        item.toolbar.getParentGroup().refresh();\n                    } else if (!item.toolbar.options.hidden) {\n                        item.toolbar.hide();\n                    }\n                }\n                if (item.overflow) {\n                    if (item.overflow.options.type === 'button' && item.overflow.options.isChild) {\n                        item.overflow.hide();\n                        item.overflow.getParentGroup().refresh();\n                    } else if (!item.overflow.options.hidden) {\n                        item.overflow.hide();\n                    }\n                }\n                this.resize(true);\n            },\n            show: function (candidate) {\n                var item = this._getItem(candidate);\n                if (item.toolbar) {\n                    if (item.toolbar.options.type === 'button' && item.toolbar.options.isChild) {\n                        item.toolbar.show();\n                        item.toolbar.getParentGroup().refresh();\n                    } else if (item.toolbar.options.hidden) {\n                        item.toolbar.show();\n                    }\n                }\n                if (item.overflow) {\n                    if (item.overflow.options.type === 'button' && item.overflow.options.isChild) {\n                        item.toolbar.show();\n                        item.overflow.getParentGroup().refresh();\n                    } else if (item.overflow.options.hidden) {\n                        item.overflow.show();\n                    }\n                }\n                this.resize(true);\n            },\n            enable: function (element, enable) {\n                var item = this._getItem(element);\n                if (typeof enable == 'undefined') {\n                    enable = true;\n                }\n                if (item.toolbar) {\n                    item.toolbar.enable(enable);\n                }\n                if (item.overflow) {\n                    item.overflow.enable(enable);\n                }\n            },\n            getSelectedFromGroup: function (groupName) {\n                return this.element.find('.' + TOGGLE_BUTTON + '[data-group=\\'' + groupName + '\\']').filter('.' + STATE_ACTIVE);\n            },\n            toggle: function (button, checked) {\n                var element = $(button), item = element.data('button');\n                if (item.options.togglable) {\n                    if (checked === undefined) {\n                        checked = true;\n                    }\n                    item.toggle(checked, true);\n                }\n            },\n            _renderOverflow: function () {\n                var that = this, overflowContainer = components.overflowContainer, isRtl = that._isRtl, horizontalDirection = isRtl ? 'left' : 'right';\n                that.overflowAnchor = $(components.overflowAnchor).addClass(BUTTON);\n                that.element.append(that.overflowAnchor);\n                if (that.isMobile) {\n                    that.overflowAnchor.append('<span class=\"km-icon km-more\"></span>');\n                    overflowContainer = actionSheetWrap(overflowContainer);\n                } else {\n                    that.overflowAnchor.append('<span class=\"k-icon k-i-more-vertical\"></span>');\n                }\n                that.popup = new kendo.ui.Popup(overflowContainer, {\n                    origin: 'bottom ' + horizontalDirection,\n                    position: 'top ' + horizontalDirection,\n                    anchor: that.overflowAnchor,\n                    isRtl: isRtl,\n                    animation: that.animation,\n                    appendTo: that.isMobile ? $(that.isMobile).children('.km-pane') : null,\n                    copyAnchorStyles: false,\n                    open: function (e) {\n                        var wrapper = kendo.wrap(that.popup.element).addClass('k-overflow-wrapper');\n                        if (!that.isMobile) {\n                            wrapper.css('margin-left', (isRtl ? -1 : 1) * ((outerWidth(wrapper) - wrapper.width()) / 2 + 1));\n                        } else {\n                            that.popup.container.css('max-height', parseFloat($('.km-content:visible').innerHeight()) - 15 + 'px');\n                        }\n                        if (that.trigger(OVERFLOW_OPEN)) {\n                            e.preventDefault();\n                        }\n                    },\n                    activate: function () {\n                        this.element.find(':kendoFocusable').first().focus();\n                    },\n                    close: function (e) {\n                        if (that.trigger(OVERFLOW_CLOSE)) {\n                            e.preventDefault();\n                        }\n                        this.element.focus();\n                    }\n                });\n                that.popup.element.on('keydown', '.' + BUTTON, function (e) {\n                    var target = $(e.target), li = target.parent(), isComplexTool = li.is('.' + BUTTON_GROUP) || li.is('.' + SPLIT_BUTTON), element;\n                    e.preventDefault();\n                    if (e.keyCode === keys.ESC || e.keyCode === keys.TAB || e.altKey && e.keyCode === keys.UP) {\n                        that._toggleOverflow();\n                        that.overflowAnchor.focus();\n                    } else if (e.keyCode === keys.DOWN) {\n                        element = !isComplexTool || isComplexTool && target.is(':last-child') ? li : target;\n                        findFocusableSibling(element, 'next').focus();\n                    } else if (e.keyCode === keys.UP) {\n                        element = !isComplexTool || isComplexTool && target.is(':first-child') ? li : target;\n                        findFocusableSibling(element, 'prev').focus();\n                    } else if (e.keyCode === keys.SPACEBAR || e.keyCode === keys.ENTER) {\n                        that.userEvents.trigger('tap', { target: $(e.target) });\n                        that.overflowAnchor.focus();\n                    } else if (e.keyCode === keys.HOME) {\n                        li.parent().find(':kendoFocusable').first().focus();\n                    } else if (e.keyCode === keys.END) {\n                        li.parent().find(':kendoFocusable').last().focus();\n                    }\n                });\n                if (that.isMobile) {\n                    that.popup.container = that.popup.element.find('.' + OVERFLOW_CONTAINER);\n                } else {\n                    that.popup.container = that.popup.element;\n                }\n                that.popup.container.attr(KENDO_UID_ATTR, this.uid);\n            },\n            _toggleOverflowAnchor: function () {\n                var hasVisibleChildren = false;\n                if (this.options.mobile) {\n                    hasVisibleChildren = this.popup.element.find('.' + OVERFLOW_CONTAINER).children(':not(.' + OVERFLOW_HIDDEN + ', .' + POPUP + ')').length > 0;\n                } else {\n                    hasVisibleChildren = this.popup.element.children(':not(.' + OVERFLOW_HIDDEN + ', .' + POPUP + ')').length > 0;\n                }\n                if (hasVisibleChildren) {\n                    this.overflowAnchor.css({\n                        visibility: 'visible',\n                        width: ''\n                    });\n                } else {\n                    this.overflowAnchor.css({\n                        visibility: 'hidden',\n                        width: '1px'\n                    });\n                }\n            },\n            _buttonClick: function (e) {\n                var that = this, popup, target, item, splitContainer, isSplitButtonArrow = e.target.closest('.' + SPLIT_BUTTON_ARROW).length, handler, eventData, urlTarget;\n                e.preventDefault();\n                if (isSplitButtonArrow) {\n                    that._toggle(e);\n                    return;\n                }\n                target = $(e.target).closest('.' + BUTTON, that.element);\n                if (target.hasClass(OVERFLOW_ANCHOR)) {\n                    return;\n                }\n                item = target.data('button');\n                if (!item && that.popup) {\n                    target = $(e.target).closest('.' + OVERFLOW_BUTTON, that.popup.container);\n                    item = target.parent('li').data('button');\n                }\n                if (!item || !item.options.enable) {\n                    return;\n                }\n                if (item.options.togglable) {\n                    handler = isFunction(item.toggleHandler) ? item.toggleHandler : null;\n                    item.toggle(!item.options.selected, true);\n                    eventData = {\n                        target: target,\n                        group: item.options.group,\n                        checked: item.options.selected,\n                        id: item.options.id\n                    };\n                    if (handler) {\n                        handler.call(that, eventData);\n                    }\n                    that.trigger(TOGGLE, eventData);\n                } else {\n                    handler = isFunction(item.clickHandler) ? item.clickHandler : null;\n                    eventData = {\n                        sender: that,\n                        target: target,\n                        id: item.options.id\n                    };\n                    if (handler) {\n                        handler.call(that, eventData);\n                    }\n                    that.trigger(CLICK, eventData);\n                }\n                if (item.options.url) {\n                    if (item.options.attributes && item.options.attributes.target) {\n                        urlTarget = item.options.attributes.target;\n                    }\n                    window.open(item.options.url, urlTarget || '_self');\n                }\n                if (target.hasClass(OVERFLOW_BUTTON)) {\n                    that.popup.close();\n                }\n                splitContainer = target.closest('.k-split-container');\n                if (splitContainer[0]) {\n                    popup = splitContainer.data('kendoPopup');\n                    (popup ? popup : splitContainer.parents('.km-popup-wrapper').data('kendoPopup')).close();\n                }\n            },\n            _navigatable: function () {\n                var that = this;\n                that.element.attr('tabindex', 0).on('focusin', function (ev) {\n                    var target = $(ev.target);\n                    var element = $(this).find(':kendoFocusable:first');\n                    if (!target.is('.' + TOOLBAR) || element.length === 0) {\n                        return;\n                    }\n                    if (element.is('.' + OVERFLOW_ANCHOR)) {\n                        element = findFocusableSibling(element, 'next');\n                    }\n                    element[0].focus();\n                }).on('keydown', proxy(that._keydown, that));\n            },\n            _keydown: function (e) {\n                var target = $(e.target), keyCode = e.keyCode, items = this.element.children(':not(.k-separator):visible'), direction = this._isRtl ? -1 : 1;\n                if (keyCode === keys.TAB) {\n                    var element = target.parentsUntil(this.element).last(), lastHasFocus = false, firstHasFocus = false;\n                    if (!element.length) {\n                        element = target;\n                    }\n                    if (element.is('.' + OVERFLOW_ANCHOR)) {\n                        if (e.shiftKey) {\n                            e.preventDefault();\n                        }\n                        if (items.last().is(':kendoFocusable')) {\n                            items.last().focus();\n                        } else {\n                            items.last().find(':kendoFocusable').last().focus();\n                        }\n                    }\n                    if (!e.shiftKey && items.index(element) === items.length - 1) {\n                        if (element.is('.' + BUTTON_GROUP)) {\n                            lastHasFocus = target.is(':last-child');\n                        } else {\n                            lastHasFocus = true;\n                        }\n                    }\n                    var isFirstTool = items.index(element) === items.not('.k-overflow-anchor').first().index();\n                    if (e.shiftKey && isFirstTool) {\n                        if (element.is('.' + BUTTON_GROUP)) {\n                            firstHasFocus = target.is(':first-child');\n                        } else {\n                            firstHasFocus = true;\n                        }\n                    }\n                    if (lastHasFocus && this.overflowAnchor && this.overflowAnchor.css('visibility') !== 'hidden') {\n                        e.preventDefault();\n                        this.overflowAnchor.focus();\n                    }\n                    if (firstHasFocus) {\n                        e.preventDefault();\n                        var prevFocusable = this._getPrevFocusable(this.wrapper);\n                        if (prevFocusable) {\n                            prevFocusable.focus();\n                        }\n                    }\n                    this._preventNextFocus = false;\n                }\n                if (e.altKey && keyCode === keys.DOWN) {\n                    var splitButton = $(document.activeElement).data('splitButton');\n                    var isOverflowAnchor = $(document.activeElement).is('.' + OVERFLOW_ANCHOR);\n                    if (splitButton) {\n                        splitButton.toggle();\n                    } else if (isOverflowAnchor) {\n                        this._toggleOverflow();\n                    }\n                    return;\n                }\n                if ((keyCode === keys.SPACEBAR || keyCode === keys.ENTER) && !target.is('input, checkbox')) {\n                    if (keyCode === keys.SPACEBAR) {\n                        e.preventDefault();\n                    }\n                    if (target.is('.' + SPLIT_BUTTON)) {\n                        target = target.children().first();\n                        this.userEvents.trigger('tap', { target: target });\n                    } else if (keyCode === keys.SPACEBAR) {\n                        this.userEvents.trigger('tap', { target: target });\n                    }\n                    return;\n                }\n                if (keyCode === keys.HOME) {\n                    if (target.is('.k-dropdown') || target.is('input')) {\n                        return;\n                    }\n                    if (this.overflowAnchor) {\n                        items.eq(1).focus();\n                    } else {\n                        items.first().focus();\n                    }\n                    e.preventDefault();\n                } else if (keyCode === keys.END) {\n                    if (target.is('.k-dropdown') || target.is('input')) {\n                        return;\n                    }\n                    if (this.overflowAnchor && $(this.overflowAnchor).css('visibility') != 'hidden') {\n                        this.overflowAnchor.focus();\n                    } else {\n                        items.last().focus();\n                    }\n                    e.preventDefault();\n                } else if (keyCode === keys.RIGHT && !this._preventNextFocus && !target.is('input, select, .k-dropdown, .k-colorpicker') && this._getNextElement(e.target, 1 * direction)) {\n                    this._getNextElement(e.target, 1 * direction).focus();\n                    e.preventDefault();\n                } else if (keyCode === keys.LEFT && !this._preventNextFocus && !target.is('input, select, .k-dropdown, .k-colorpicker') && this._getNextElement(e.target, -1 * direction)) {\n                    this._getNextElement(e.target, -1 * direction).focus();\n                    e.preventDefault();\n                }\n            },\n            _getNextElement: function (item, direction) {\n                var items = this.element.children(':not(.k-separator):visible');\n                var itemIndex = items.index(item) === -1 ? items.index(item.parentElement) : items.index(item);\n                var startIndex = this.overflowAnchor ? 1 : 0;\n                var directionNumber = direction;\n                var searchIndex = direction === 1 ? items.length - 1 : startIndex;\n                var index = direction === 1 ? startIndex : items.length - 1;\n                var focusableItem = items[itemIndex + direction];\n                this._preventNextFocus = false;\n                if ($(item).closest('.' + BUTTON_GROUP).length && !$(item).is(direction === 1 ? ':last-child' : ':first-child')) {\n                    return $(item).closest('.' + BUTTON_GROUP).children()[$(item).closest('.' + BUTTON_GROUP).children().index(item) + direction];\n                }\n                if (this.overflowAnchor && item === this.overflowAnchor[0] && direction === -1) {\n                    focusableItem = items[items.length - 1];\n                }\n                if (itemIndex === searchIndex) {\n                    focusableItem = !this.overflowAnchor || this.overflowAnchor && $(this.overflowAnchor).css('visibility') === 'hidden' ? items[index] : this.overflowAnchor;\n                }\n                while (!$(focusableItem).is(':kendoFocusable')) {\n                    if (direction === -1 && $(focusableItem).closest('.' + BUTTON_GROUP).length) {\n                        focusableItem = $(focusableItem).children(':not(label, div)').last();\n                    } else {\n                        focusableItem = $(focusableItem).children(':not(label, div)').first();\n                    }\n                    if (!focusableItem.length) {\n                        directionNumber = directionNumber + direction;\n                        focusableItem = items[itemIndex + directionNumber];\n                        if (!focusableItem) {\n                            return this.overflowAnchor;\n                        }\n                    }\n                    this._preventNextFocus = $(focusableItem).closest('.' + BUTTON_GROUP).length ? false : true;\n                }\n                return focusableItem;\n            },\n            _getPrevFocusable: function (element) {\n                if (element.is('html')) {\n                    return element;\n                }\n                var elementToFocus, prevElement, prevElements = element.prevAll();\n                prevElements.each(function () {\n                    prevElement = $(this);\n                    if (prevElement.is(':kendoFocusable')) {\n                        elementToFocus = prevElement;\n                        return false;\n                    } else if (prevElement.find(':kendoFocusable').length > 0) {\n                        elementToFocus = prevElement.find(':kendoFocusable').last();\n                        return false;\n                    }\n                });\n                if (elementToFocus) {\n                    return elementToFocus;\n                } else {\n                    return this._getPrevFocusable(element.parent());\n                }\n            },\n            _toggle: function (e) {\n                var splitButton = $(e.target).closest('.' + SPLIT_BUTTON).data('splitButton');\n                e.preventDefault();\n                if (!splitButton.options.enable) {\n                    return;\n                }\n                splitButton.toggle();\n            },\n            _toggleOverflow: function () {\n                this.popup.toggle();\n            },\n            _resize: function (e) {\n                var containerWidth = e.width;\n                if (!this.options.resizable) {\n                    return;\n                }\n                this.popup.close();\n                this._shrink(containerWidth);\n                this._stretch(containerWidth);\n                this._markVisibles();\n                this._toggleOverflowAnchor();\n            },\n            _childrenWidth: function () {\n                var childrenWidth = 0;\n                this.element.children(':visible:not(\\'.' + STATE_HIDDEN + '\\')').each(function () {\n                    childrenWidth += outerWidth($(this), true);\n                });\n                return Math.ceil(childrenWidth);\n            },\n            _shrink: function (containerWidth) {\n                var commandElement, visibleCommands;\n                if (containerWidth < this._childrenWidth()) {\n                    visibleCommands = this.element.children(':visible:not([data-overflow=\\'never\\'], .' + OVERFLOW_ANCHOR + ')');\n                    for (var i = visibleCommands.length - 1; i >= 0; i--) {\n                        commandElement = visibleCommands.eq(i);\n                        if (containerWidth > this._childrenWidth()) {\n                            break;\n                        } else {\n                            this._hideItem(commandElement);\n                        }\n                    }\n                }\n            },\n            _stretch: function (containerWidth) {\n                var commandElement, hiddenCommands;\n                if (containerWidth > this._childrenWidth()) {\n                    hiddenCommands = this.element.children(':hidden:not(\\'.' + STATE_HIDDEN + '\\')');\n                    for (var i = 0; i < hiddenCommands.length; i++) {\n                        commandElement = hiddenCommands.eq(i);\n                        if (containerWidth < this._childrenWidth() || !this._showItem(commandElement, containerWidth)) {\n                            break;\n                        }\n                    }\n                }\n            },\n            _hideItem: function (item) {\n                item.hide();\n                if (this.popup) {\n                    this.popup.container.find('>li[data-uid=\\'' + item.data('uid') + '\\']').removeClass(OVERFLOW_HIDDEN);\n                }\n            },\n            _showItem: function (item, containerWidth) {\n                if (item.length && containerWidth > this._childrenWidth() + outerWidth(item, true)) {\n                    item.show();\n                    if (this.popup) {\n                        this.popup.container.find('>li[data-uid=\\'' + item.data('uid') + '\\']').addClass(OVERFLOW_HIDDEN);\n                    }\n                    return true;\n                }\n                return false;\n            },\n            _markVisibles: function () {\n                var overflowItems = this.popup.container.children(), toolbarItems = this.element.children(':not(.k-overflow-anchor)'), visibleOverflowItems = overflowItems.filter(':not(.k-overflow-hidden)'), visibleToolbarItems = toolbarItems.filter(':visible');\n                overflowItems.add(toolbarItems).removeClass(FIRST_TOOLBAR_VISIBLE + ' ' + LAST_TOOLBAR_VISIBLE);\n                visibleOverflowItems.first().add(visibleToolbarItems.first()).addClass(FIRST_TOOLBAR_VISIBLE);\n                visibleOverflowItems.last().add(visibleToolbarItems.last()).addClass(LAST_TOOLBAR_VISIBLE);\n            }\n        });\n        kendo.ui.plugin(ToolBar);\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, 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', LABELIDPART = '_label', OPEN = 'open', CLOSE = 'close', CASCADE = 'cascade', SELECT = 'select', SELECTED = 'selected', REQUESTSTART = 'requestStart', REQUESTEND = 'requestEnd', 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': 'DropDownList',\n                'DropDownList': 'ComboBox'\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 = $('<ul unselectable=\"on\" class=\"k-list k-reset\"/>').attr({\n                    tabIndex: -1,\n                    'aria-hidden': true\n                });\n                that.list = $('<div class=\\'k-list-container\\'/>').append(that.ul).on('mousedown' + ns, proxy(that._listMousedown, that));\n                id = element.attr(ID);\n                if (id) {\n                    that.list.attr(ID, id + '-list');\n                    that.ul.attr(ID, id + '_listbox');\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: 'No data found.'\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                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            _noData: function () {\n                var list = this;\n                var noData = $(list.noData);\n                var template = 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 = $('<div class=\"k-nodata\" style=\"display:none\"><div></div></div>').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 = $('<div class=\"k-footer\"></div>').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                    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._isFilterEnabled() && !this.options.enforceMinLength) {\n                    if (this._isSelect) {\n                        this._customOption = undefined;\n                    }\n                    this._filter({\n                        word: '',\n                        open: false\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 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                if ((filter || removed) && that.trigger('filtering', { filter: filter })) {\n                    return;\n                }\n                var newExpression = {\n                    filters: [],\n                    logic: 'and'\n                };\n                if (isValidFilterExpr(filter) && $.trim(filter.value).length) {\n                    newExpression.filters.push(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            _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 ignoreCase = widgetOptions.ignoreCase;\n                var field = widgetOptions.dataTextField;\n                var expression = {\n                    value: ignoreCase ? options.word.toLowerCase() : options.word,\n                    field: field,\n                    operator: widgetOptions.filter,\n                    ignoreCase: ignoreCase\n                };\n                that._open = options.open;\n                that._filterSource(expression);\n            },\n            _clearButton: function () {\n                var list = this;\n                var clearTitle = list.options.messages && list.options.messages.clear ? list.options.messages.clear : 'clear';\n                if (!list._clear) {\n                    list._clear = $('<span unselectable=\"on\" class=\"k-icon k-clear-value k-i-close\" title=\"' + clearTitle + '\"></span>').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._isFilterEnabled()) {\n                        this._searchByWord(word);\n                    } else {\n                        if ($.trim(word).length && this.listView) {\n                            this.listView._emptySearch = false;\n                        } else {\n                            this.listView._emptySearch = true;\n                        }\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);\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            },\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)) {\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 || value === '') {\n                        that._valueBeforeCascade = that._old = value;\n                    } else {\n                        that._valueBeforeCascade = that._old = that.dataItem() ? that.dataItem()[that.options.dataValueField] || that.dataItem() : null;\n                    }\n                    that._oldIndex = index;\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                if (groupHeader[0] && groupHeader[0].style.display !== 'none') {\n                    if (height !== 'auto') {\n                        padding = kendo.support.scrollbar();\n                    }\n                    padding += parseFloat(li.css('border-right-width'), 10) + parseFloat(li.children('.k-group').css('padding-right'), 10);\n                    groupHeader.css('padding-right', padding);\n                }\n            },\n            _calculatePopupHeight: function (force) {\n                var height = this._height(this.dataSource.flatView().length || force);\n                this._calculateGroupPadding(height);\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                } 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                    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 = $('<option/>');\n                    that._customOption = custom;\n                    element.append(custom);\n                }\n                custom.text(value);\n                custom[0].selected = true;\n            },\n            _hideBusy: function () {\n                var that = this;\n                clearTimeout(that._busy);\n                that._arrowIcon.removeClass(LOADING);\n                that._focused.attr('aria-busy', false);\n                that._busy = null;\n                that._showClear();\n            },\n            _showBusy: function (e) {\n                var that = this;\n                if (e.isDefaultPrevented()) {\n                    return;\n                }\n                that._request = true;\n                if (that._busy) {\n                    return;\n                }\n                that._busy = setTimeout(function () {\n                    if (that._arrowIcon) {\n                        that._focused.attr('aria-busy', true);\n                        that._arrowIcon.addClass(LOADING);\n                        that._hideClear();\n                    }\n                }, 100);\n            },\n            _requestEnd: function () {\n                this._request = false;\n                this._hideBusy();\n            },\n            _dataSource: function () {\n                var that = this, element = that.element, options = that.options, dataSource = options.dataSource || {}, idx;\n                dataSource = $.isArray(dataSource) ? { data: dataSource } : dataSource;\n                if (that._isSelect) {\n                    idx = element[0].selectedIndex;\n                    if (idx > -1) {\n                        options.index = idx;\n                    }\n                    dataSource.select = element;\n                    dataSource.fields = [\n                        { field: options.dataTextField },\n                        { field: options.dataValueField }\n                    ];\n                }\n                if (that.dataSource) {\n                    that._unbindDataSource();\n                } else {\n                    that._requestStartHandler = proxy(that._showBusy, that);\n                    that._requestEndHandler = proxy(that._requestEnd, that);\n                    that._errorHandler = proxy(that._hideBusy, that);\n                }\n                that.dataSource = kendo.data.DataSource.create(dataSource).bind(REQUESTSTART, that._requestStartHandler).bind(REQUESTEND, that._requestEndHandler).bind('error', that._errorHandler);\n            },\n            _firstItem: function () {\n                this.listView.focusFirst();\n            },\n            _lastItem: function () {\n                this.listView.focusLast();\n            },\n            _nextItem: function () {\n                this.listView.focusNext();\n            },\n            _prevItem: function () {\n                this.listView.focusPrev();\n            },\n            _move: function (e) {\n                var that = this;\n                var listView = that.listView;\n                var key = e.keyCode;\n                var down = key === keys.DOWN;\n                var dataItem;\n                var pressed;\n                var current;\n                if (key === keys.UP || down) {\n                    if (e.altKey) {\n                        that.toggle(down);\n                    } else {\n                        if (!listView.bound() && !that.ul[0].firstChild) {\n                            if (!that._fetch) {\n                                that.dataSource.one(CHANGE, function () {\n                                    that._fetch = false;\n                                    that._move(e);\n                                });\n                                that._fetch = true;\n                                that._filterSource();\n                            }\n                            e.preventDefault();\n                            return true;\n                        }\n                        current = that._focus();\n                        if (!that._fetch && (!current || current.hasClass('k-state-selected'))) {\n                            if (down) {\n                                that._nextItem();\n                                if (!that._focus()) {\n                                    that._lastItem();\n                                }\n                            } else {\n                                that._prevItem();\n                                if (!that._focus()) {\n                                    that._firstItem();\n                                }\n                            }\n                        }\n                        dataItem = listView.dataItemByIndex(listView.getElementIndex(that._focus()));\n                        if (that.trigger(SELECT, {\n                                dataItem: dataItem,\n                                item: that._focus()\n                            })) {\n                            that._focus(current);\n                            return;\n                        }\n                        that._select(that._focus(), true).done(function () {\n                            if (!that.popup.visible()) {\n                                that._blur();\n                            }\n                            if (that._cascadedValue === null) {\n                                that._cascadedValue = that.value();\n                            } else {\n                                that._cascadedValue = that.dataItem() ? that.dataItem()[that.options.dataValueField] || that.dataItem() : null;\n                            }\n                        });\n                    }\n                    e.preventDefault();\n                    pressed = true;\n                } else if (key === keys.ENTER || key === keys.TAB) {\n                    if (that.popup.visible()) {\n                        e.preventDefault();\n                    }\n                    current = that._focus();\n                    dataItem = that.dataItem();\n                    if (!that.popup.visible() && (!dataItem || that.text() !== that._text(dataItem))) {\n                        current = null;\n                    }\n                    var activeFilter = that.filterInput && that.filterInput[0] === activeElement();\n                    if (current) {\n                        dataItem = listView.dataItemByIndex(listView.getElementIndex(current));\n                        var shouldTrigger = true;\n                        if (dataItem) {\n                            shouldTrigger = that._value(dataItem) !== List.unifyType(that.value(), typeof that._value(dataItem));\n                        }\n                        if (shouldTrigger && that.trigger(SELECT, {\n                                dataItem: dataItem,\n                                item: current\n                            })) {\n                            return;\n                        }\n                        that._select(current);\n                    } else if (that.input) {\n                        if (that._syncValueAndText() || that._isSelect) {\n                            that._accessor(that.input.val());\n                        }\n                        that.listView.value(that.input.val());\n                    }\n                    if (that._focusElement) {\n                        that._focusElement(that.wrapper);\n                    }\n                    if (activeFilter && key === keys.TAB) {\n                        that.wrapper.focusout();\n                    } else {\n                        that._blur();\n                    }\n                    that.close();\n                    pressed = true;\n                } else if (key === keys.ESC) {\n                    if (that.popup.visible()) {\n                        e.preventDefault();\n                    }\n                    that.close();\n                    pressed = true;\n                } else if (that.popup.visible() && (key === keys.PAGEDOWN || key === keys.PAGEUP)) {\n                    e.preventDefault();\n                    var direction = key === keys.PAGEDOWN ? 1 : -1;\n                    listView.scrollWith(direction * listView.screenHeight());\n                    pressed = true;\n                }\n                return pressed;\n            },\n            _fetchData: function () {\n                var that = this;\n                var hasItems = !!that.dataSource.view().length;\n                if (that._request || that.options.cascadeFrom) {\n                    return;\n                }\n                if (!that.listView.bound() && !that._fetch && !hasItems) {\n                    that._fetch = true;\n                    that.dataSource.fetch().done(function () {\n                        that._fetch = false;\n                    });\n                }\n            },\n            _options: function (data, optionLabel, value) {\n                var that = this, element = that.element, htmlElement = element[0], length = data.length, options = '', option, dataItem, dataText, dataValue, idx = 0;\n                if (optionLabel) {\n                    options = optionLabel;\n                }\n                for (; idx < length; idx++) {\n                    option = '<option';\n                    dataItem = data[idx];\n                    dataText = that._text(dataItem);\n                    dataValue = that._value(dataItem);\n                    if (dataValue !== undefined) {\n                        dataValue += '';\n                        if (dataValue.indexOf('\"') !== -1) {\n                            dataValue = dataValue.replace(quotRegExp, '&quot;');\n                        }\n                        option += ' value=\"' + dataValue + '\"';\n                    }\n                    option += '>';\n                    if (dataText !== undefined) {\n                        option += htmlEncode(dataText);\n                    }\n                    option += '</option>';\n                    options += option;\n                }\n                element.html(options);\n                if (value !== undefined) {\n                    htmlElement.value = value;\n                    if (htmlElement.value && !value) {\n                        htmlElement.selectedIndex = -1;\n                    }\n                }\n                if (htmlElement.selectedIndex !== -1) {\n                    option = getSelectedOption(htmlElement);\n                    if (option) {\n                        option.setAttribute(SELECTED, SELECTED);\n                    }\n                }\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        setTimeout(function () {\n                            that.value(that._initial);\n                        });\n                    };\n                    that._form = form.on('reset', that._resetHandler);\n                }\n            },\n            _parentWidget: function () {\n                var name = this.options.name;\n                if (!this.options.cascadeFrom) {\n                    return;\n                }\n                var parentElement = $('#' + this.options.cascadeFrom);\n                var parent = parentElement.data('kendo' + name);\n                if (!parent) {\n                    parent = parentElement.data('kendo' + alternativeNames[name]);\n                }\n                return parent;\n            },\n            _cascade: function () {\n                var that = this;\n                var options = that.options;\n                var cascade = options.cascadeFrom;\n                var parent;\n                if (cascade) {\n                    parent = that._parentWidget();\n                    if (!parent) {\n                        return;\n                    }\n                    that._cascadeHandlerProxy = proxy(that._cascadeHandler, that);\n                    that._cascadeFilterRequests = [];\n                    options.autoBind = false;\n                    parent.bind('set', function () {\n                        that.one('set', function (e) {\n                            that._selectedValue = e.value || that._accessor();\n                        });\n                    });\n                    parent.first(CASCADE, that._cascadeHandlerProxy);\n                    if (parent.listView.bound()) {\n                        that._toggleCascadeOnFocus();\n                        that._cascadeSelect(parent);\n                    } else {\n                        parent.one('dataBound', function () {\n                            that._toggleCascadeOnFocus();\n                            if (parent.popup.visible()) {\n                                parent._focused.focus();\n                            }\n                        });\n                        if (!parent.value()) {\n                            that.enable(false);\n                        }\n                    }\n                }\n            },\n            _toggleCascadeOnFocus: function () {\n                var that = this;\n                var parent = that._parentWidget();\n                var focusout = isIE ? 'blur' : 'focusout';\n                parent._focused.add(parent.filterInput).bind('focus', function () {\n                    parent.unbind(CASCADE, that._cascadeHandlerProxy);\n                    parent.first(CHANGE, that._cascadeHandlerProxy);\n                });\n                parent._focused.add(parent.filterInput).bind(focusout, function () {\n                    parent.unbind(CHANGE, that._cascadeHandlerProxy);\n                    parent.first(CASCADE, that._cascadeHandlerProxy);\n                });\n            },\n            _cascadeHandler: function (e) {\n                var parent = this._parentWidget();\n                var valueBeforeCascade = this.value();\n                this._userTriggered = e.userTriggered;\n                if (this.listView.bound()) {\n                    this._clearSelection(parent, true);\n                }\n                this._cascadeSelect(parent, valueBeforeCascade);\n            },\n            _cascadeChange: function (parent) {\n                var that = this;\n                var value = that._accessor() || that._selectedValue;\n                if (!that._cascadeFilterRequests.length) {\n                    that._selectedValue = null;\n                }\n                if (that._userTriggered) {\n                    that._clearSelection(parent, true);\n                } else if (value) {\n                    if (value !== that.listView.value()[0]) {\n                        that.value(value);\n                    }\n                    if (!that.dataSource.view()[0] || that.selectedIndex === -1) {\n                        that._clearSelection(parent, true);\n                    }\n                } else if (that.dataSource.flatView().length) {\n                    that.select(that.options.index);\n                }\n                that.enable();\n                that._triggerCascade();\n                that._triggerChange();\n                that._userTriggered = false;\n            },\n            _cascadeSelect: function (parent, valueBeforeCascade) {\n                var that = this;\n                var dataItem = parent.dataItem();\n                var filterValue = dataItem ? parent._value(dataItem) : null;\n                var valueField = that.options.cascadeFromField || parent.options.dataValueField;\n                var expressions;\n                that._valueBeforeCascade = valueBeforeCascade !== undefined ? valueBeforeCascade : that.value();\n                if (filterValue || filterValue === 0) {\n                    expressions = that.dataSource.filter() || {};\n                    removeFiltersForField(expressions, valueField);\n                    var handler = function () {\n                        var currentHandler = that._cascadeFilterRequests.shift();\n                        if (currentHandler) {\n                            that.unbind('dataBound', currentHandler);\n                        }\n                        currentHandler = that._cascadeFilterRequests[0];\n                        if (currentHandler) {\n                            that.first('dataBound', currentHandler);\n                        }\n                        that._cascadeChange(parent);\n                    };\n                    that._cascadeFilterRequests.push(handler);\n                    if (that._cascadeFilterRequests.length === 1) {\n                        that.first('dataBound', handler);\n                    }\n                    that._cascading = true;\n                    that._filterSource({\n                        field: valueField,\n                        operator: 'eq',\n                        value: filterValue\n                    });\n                    that._cascading = false;\n                } else {\n                    that.enable(false);\n                    that._clearSelection(parent);\n                    that._triggerCascade();\n                    that._triggerChange();\n                    that._userTriggered = false;\n                }\n            }\n        });\n        var STATIC_LIST_NS = '.StaticList';\n        var StaticList = kendo.ui.DataBoundWidget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this.element.attr('role', 'listbox').on('click' + STATIC_LIST_NS, 'li', proxy(this._click, this)).on('mouseenter' + STATIC_LIST_NS, 'li', function () {\n                    $(this).addClass(HOVER);\n                }).on('mouseleave' + STATIC_LIST_NS, 'li', function () {\n                    $(this).removeClass(HOVER);\n                });\n                if (this.options.selectable === 'multiple') {\n                    this.element.attr('aria-multiselectable', true);\n                }\n                this.content = this.element.wrap('<div class=\\'k-list-scroller\\' unselectable=\\'on\\'></div>').parent();\n                this.header = this.content.before('<div class=\"k-group-header\" style=\"display:none\"></div>').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            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 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) {\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('.k-item');\n            },\n            _click: function (e) {\n                if (!e.isDefaultPrevented()) {\n                    if (!this.trigger('click', { item: $(e.currentTarget) })) {\n                        this.select(e.currentTarget);\n                    }\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('<li tabindex=\"-1\" role=\"option\" unselectable=\"on\" class=\"k-item\">${' + kendo.expr(options.dataTextField, 'data') + '}</li>', { useWithBlock: false });\n                } else {\n                    template = kendo.template(template);\n                    template = function (data) {\n                        return '<li tabindex=\"-1\" role=\"option\" unselectable=\"on\" class=\"k-item\">' + template(data) + '</li>';\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                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) {\n                    this.header.html(template(visibleItem.group));\n                }\n            },\n            _renderItem: function (context) {\n                var item = '<li tabindex=\"-1\" role=\"option\" unselectable=\"on\" class=\"k-item';\n                var dataItem = context.item;\n                var notFirstItem = context.index !== 0;\n                var selected = context.selected;\n                if (notFirstItem && context.newGroup) {\n                    item += ' k-first';\n                }\n                if (selected) {\n                    item += ' k-state-selected';\n                }\n                item += '\" aria-selected=\"' + (selected ? 'true' : 'false') + '\" data-offset-index=\"' + context.index + '\">';\n                item += this.templates.template(dataItem);\n                if (notFirstItem && context.newGroup) {\n                    item += '<div class=\"k-group\">' + this.templates.groupTemplate(context.group) + '</div>';\n                }\n                return item + '</li>';\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                                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.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('<td#=data.cssClass# role=\"gridcell\"><a tabindex=\"-1\" class=\"k-link\" href=\"\\\\#\" data-#=data.ns#value=\"#=data.dateString#\">#=data.value#</a></td>', { useWithBlock: false }), emptyCellTemplate = template('<td role=\"gridcell\">&nbsp;</td>', { useWithBlock: false }), weekNumberTemplate = template('<td class=\"k-alt\">#= data.weekNumber #</td>', { useWithBlock: false }), browser = kendo.support.browser, isIE8 = browser.msie && browser.version < 9, outerHeight = kendo._outerHeight, 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 + '\"', TODAY = 'k-nav-today', CELLSELECTOR = 'td:has(.k-link)', CELLSELECTORVALID = 'td:has(.k-link):not(.' + DISABLED + ')', 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 = window.unescape(options.url);\n                that.options.disableDates = getDisabledExpr(that.options.disableDates);\n                that._templates();\n                that._selectable();\n                that._header();\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, CELLSELECTOR, function (e) {\n                    var link = e.currentTarget.firstChild, value = that._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 = that._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                Widget.fn.setOptions.call(that, options);\n                that._templates();\n                that._selectable();\n                that._footer(that.footer);\n                that._index = views[that.options.start];\n                that.navigate();\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.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                        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 = that._toDateObject(target.find('a'));\n                    that._class(FOCUSED, that._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 = that._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(that._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 = that._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 || that._toDateObject(that.selectable.value().first().find('a')), toDate = that._toDateObject(toDateCell.find('a')), daysDifference;\n                if (that.selectable._lastActive || that._value) {\n                    fromDate = that.selectable._lastActive ? that._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 = that._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 = that._toDateObject(that._cellsBySelector(CELLSELECTOR + ':first').find('a')), lastDateInView = that._toDateObject(that._cellsBySelector(CELLSELECTOR + ':last').find('a'));\n                return +date <= +lastDateInView && +date >= +firstDateInView;\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 = that._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 (isDisabled(currentValue)) {\n                            currentValue = that._nextNavigatable(currentValue, value);\n                        }\n                        min = createDate(min.getFullYear(), min.getMonth(), min.getDate());\n                        if (isInRange(currentValue, min, max)) {\n                            if (that._isMultipleSelection()) {\n                                that._keyboardRangeSelection(e, currentValue);\n                            } else {\n                                that._focus(restrictValue(currentValue, options.min, options.max));\n                            }\n                        }\n                    }\n                } else {\n                    if (key == keys.ENTER || key == keys.SPACEBAR) {\n                        if (view.name == 'month' && that._isMultipleSelection()) {\n                            that.value(that._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                        if (isDisabled(currentValue)) {\n                            currentValue = that._nextNavigatable(currentValue, value);\n                        }\n                        min = createDate(min.getFullYear(), min.getMonth(), min.getDate());\n                        if (isInRange(currentValue, min, max)) {\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(restrictValue(currentValue, options.min, options.max));\n                            }\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 ? that._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, from = options.from, to = options.to, active = that._active;\n                if (!from) {\n                    to.insertAfter(that.element[0].firstChild);\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                    to.insertAfter(that.element[0].firstChild);\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('<div/>');\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.css({\n                        position: 'absolute',\n                        top: outerHeight(from.prev()),\n                        left: 0\n                    }).insertBefore(from);\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                            to.css({\n                                position: 'static',\n                                top: 0,\n                                left: 0\n                            });\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) {\n                    cell.removeAttr(ARIA_SELECTED).removeAttr(ARIA_LABEL).removeAttr(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.removeAttr('aria-activedescendant').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 = that._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            _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 = $('<div class=\"k-footer\"><a href=\"#\" class=\"k-link k-nav-today\"></a></div>').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('<div class=\"k-header\">' + '<a href=\"#\" role=\"button\" class=\"k-link k-nav-prev\" ' + ARIA_LABEL + '=\"Previous\"><span class=\"k-icon k-i-arrow-60-left\"></span></a>' + '<a href=\"#\" role=\"button\" aria-live=\"assertive\" aria-atomic=\"true\" class=\"k-link k-nav-fast\"></a>' + '<a href=\"#\" role=\"button\" class=\"k-link k-nav-next\" ' + ARIA_LABEL + '=\"Next\"><span class=\"k-icon k-i-arrow-60-right\"></span></a>' + '</div>');\n                }\n                links = element.find('.k-link').on(MOUSEENTER_WITH_NS + ' ' + MOUSELEAVE + ' ' + FOCUS_WITH_NS + ' ' + BLUR, mousetoggle).click(false);\n                that._title = links.eq(1).on(CLICK, function () {\n                    that._active = that.options.focusOnNav !== false;\n                    that.navigateUp();\n                });\n                that[PREVARROW] = links.eq(0).on(CLICK, function () {\n                    that._active = that.options.focusOnNav !== false;\n                    that.navigateToPast();\n                });\n                that[NEXTARROW] = links.eq(2).on(CLICK, 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)').has('.k-link').first();\n                    currentValue = that._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            _toDateObject: function (link) {\n                var value = $(link).attr(kendo.attr(VALUE)).split('/');\n                value = createDate(value[0], value[1], value[2]);\n                return value;\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;\n                that.month = {\n                    content: template('<td#=data.cssClass# role=\"gridcell\"><a tabindex=\"-1\" class=\"k-link#=data.linkClass#\" href=\"#=data.url#\" ' + kendo.attr(VALUE) + '=\"#=data.dateString#\" title=\"#=data.title#\">' + (content || '#=data.value#') + '</a></td>', { useWithBlock: !!content }),\n                    empty: template('<td role=\"gridcell\">' + (empty || '&nbsp;') + '</td>', { useWithBlock: !!empty }),\n                    weekNumber: template('<td class=\"k-alt\">' + (weekNumber || '#= data.weekNumber #') + '</td>', { useWithBlock: !!weekNumber })\n                };\n                that.footer = footer !== false ? template(footer || '#= kendo.toString(data,\"D\",\"' + options.culture + '\") #', { 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, 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 = '<table tabindex=\"0\" role=\"grid\" class=\"k-content\" cellspacing=\"0\" data-start=\"' + toDateString(start) + '\"><thead><tr role=\"row\">';\n                        if (isWeekColumnVisible) {\n                            html += '<th scope=\"col\" class=\"k-alt\">' + options.messages.weekColumnHeader + '</th>';\n                        }\n                        for (; idx < 7; idx++) {\n                            html += '<th scope=\"col\" title=\"' + names[idx] + '\">' + shortNames[idx] + '</th>';\n                        }\n                        adjustDST(today, 0);\n                        today = +today;\n                        return view({\n                            cells: 42,\n                            perRow: 7,\n                            html: html += '</tr></thead><tbody><tr role=\"row\">',\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                            content: options.content,\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;\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                            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;\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                            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;\n                        minYear = minYear - minYear % 10;\n                        maxYear = maxYear - maxYear % 10;\n                        if (maxYear - minYear < 10) {\n                            maxYear = minYear + 9;\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                            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, weekNumber = options.weekNumber || weekNumberTemplate, content = options.content || cellTemplate, empty = options.empty || emptyCellTemplate, html = options.html || '<table tabindex=\"0\" role=\"grid\" class=\"k-content k-meta-view\" cellspacing=\"0\"><tbody><tr role=\"row\">';\n            if (isWeekColumnVisible) {\n                html += weekNumber(weekNumberBuild(start));\n            }\n            for (; idx < length; idx++) {\n                if (idx > 0 && idx % cellsPerRow === 0) {\n                    html += '</tr><tr role=\"row\">';\n                    if (isWeekColumnVisible) {\n                        html += weekNumber(weekNumberBuild(start));\n                    }\n                }\n                start = createDate(start.getFullYear(), start.getMonth(), start.getDate());\n                adjustDST(start, 0);\n                data = build(start, idx, options.disableDates);\n                html += isInRange(start, min, max) ? content(data) : empty(data);\n                setter(start, 1);\n            }\n            return html + '</tr></tbody></table>';\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        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        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.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('<span class=\\'k-widget k-dateinput\\'></span>').parent();\n                    that.wrapper.addClass(element[0].className);\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                $('<span class=\\'k-icon k-i-warning\\'></span>').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('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(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                    element.removeAttr(DISABLED).removeAttr(READONLY);\n                    that._bindInput();\n                } else {\n                    if (disable) {\n                        wrapper.addClass(STATEDISABLED).removeClass(STATEDEFAULT);\n                        element.attr(DISABLED, disable);\n                        element.removeAttr(READONLY);\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                if (form[0]) {\n                    that._resetHandler = function () {\n                        setTimeout(function () {\n                            that.value(element[0].value);\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                        this._dateTime.modifyPart(symbol, key == 38 ? 1 : -1);\n                        this._updateElementValue();\n                        this._selectSegment(symbol);\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 = '<div />', SPAN = '<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                this.calendar._focus(date);\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.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                });\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                    element.removeAttr(DISABLED).removeAttr(READONLY).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            },\n            enable: function (enable) {\n                this._editable({\n                    readonly: false,\n                    disable: !(enable = enable === undefined ? true : enable)\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                }\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.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 = $('<span unselectable=\"on\" class=\"k-select\" aria-label=\"select\"><span class=\"k-icon k-i-calendar\"></span></span>').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 k-header').addClass(element[0].className);\n                that._inputWrapper = $(wrapper[0].firstChild);\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        that.value(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                that.element.removeAttr('aria-activedescendant');\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.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, 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 = $('<div class=\"k-popup\"><ul class=\"k-list\"><li class=\"k-item\"><li></ul></div>'), 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).html(itemTemplate(data.item || {}));\n            element.toggleClass(FOCUSED, data.current);\n            element.toggleClass(SELECTED, data.selected);\n            element.toggleClass('k-first', data.newGroup);\n            element.toggleClass('k-loading-item', !data.item);\n            if (data.index !== 0 && data.newGroup) {\n                $('<div class=' + GROUPITEM + '></div>').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 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('<div unselectable=\\'on\\' class=\\'' + CONTENT + '\\'></div>').parent();\n                that.wrapper = that.content.wrap('<div class=\\'' + WRAPPER + '\\'></div>').parent();\n                that.header = that.content.before('<div class=\\'' + HEADER + '\\'></div>').prev();\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) {\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            _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                    that.select([-1]);\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);\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                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            },\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 && 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.isFiltered() && value.length && item) {\n                    for (var i = 0; i < value.length; i++) {\n                        match = isPrimitive(item) ? value[i] === item : value[i] === valueGetter(item);\n                        if (match) {\n                            value.splice(i, 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 = null;\n                for (var i = index, length = index + itemCount; i < length; i++) {\n                    item = this._itemMapper(this.getter(i, index), i, value);\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                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        });\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.autocomplete', [\n        'kendo.list',\n        'kendo.mobile.scroller',\n        'kendo.virtuallist'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'autocomplete',\n        name: 'AutoComplete',\n        category: 'web',\n        description: 'The AutoComplete widget provides suggestions depending on the typed text.It also allows multiple value entries.',\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, support = kendo.support, caret = kendo.caret, activeElement = kendo._activeElement, placeholderSupported = support.placeholder, ui = kendo.ui, List = ui.List, keys = kendo.keys, DataSource = kendo.data.DataSource, ARIA_DISABLED = 'aria-disabled', ARIA_READONLY = 'aria-readonly', CHANGE = 'change', DEFAULT = 'k-state-default', DISABLED = 'disabled', READONLY = 'readonly', FOCUSED = 'k-state-focused', SELECTED = 'k-state-selected', STATEDISABLED = 'k-state-disabled', HOVER = 'k-state-hover', ns = '.kendoAutoComplete', HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, proxy = $.proxy;\n        function indexOfWordAtCaret(caretIdx, text, separator) {\n            return separator ? text.substring(0, caretIdx).split(separator).length - 1 : 0;\n        }\n        function wordAtCaret(caretIdx, text, separator) {\n            return text.split(separator)[indexOfWordAtCaret(caretIdx, text, separator)];\n        }\n        function replaceWordAtCaret(caretIdx, text, word, separator, defaultSeparator) {\n            var words = text.split(separator);\n            words.splice(indexOfWordAtCaret(caretIdx, text, separator), 1, word);\n            if (separator && words[words.length - 1] !== '') {\n                words.push('');\n            }\n            return words.join(defaultSeparator);\n        }\n        var AutoComplete = List.extend({\n            init: function (element, options) {\n                var that = this, wrapper, disabled;\n                that.ns = ns;\n                options = $.isArray(options) ? { dataSource: options } : options;\n                List.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                options.placeholder = options.placeholder || element.attr('placeholder');\n                if (placeholderSupported) {\n                    element.attr('placeholder', options.placeholder);\n                }\n                that._wrapper();\n                that._loader();\n                that._clearButton();\n                that._dataSource();\n                that._ignoreCase();\n                element[0].type = 'text';\n                wrapper = that.wrapper;\n                that._popup();\n                element.addClass('k-input').on('keydown' + ns, proxy(that._keydown, that)).on('keypress' + ns, proxy(that._keypress, that)).on('input' + ns, proxy(that._search, that)).on('paste' + ns, proxy(that._search, that)).on('focus' + ns, function () {\n                    that._prev = that._accessor();\n                    that._oldText = that._prev;\n                    that._placeholder(false);\n                    wrapper.addClass(FOCUSED);\n                }).on('focusout' + ns, function () {\n                    that._change();\n                    that._placeholder();\n                    that.close();\n                    wrapper.removeClass(FOCUSED);\n                }).attr({\n                    autocomplete: 'off',\n                    role: 'textbox',\n                    'aria-haspopup': true\n                });\n                that._clear.on('click' + ns, proxy(that._clearValue, that));\n                that._enable();\n                that._old = that._accessor();\n                if (element[0].id) {\n                    element.attr('aria-owns', that.ul[0].id);\n                }\n                that._aria();\n                that._placeholder();\n                that._initList();\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                that._resetFocusItemHandler = $.proxy(that._resetFocusItem, that);\n                kendo.notify(that);\n                that._toggleCloseVisibility();\n            },\n            options: {\n                name: 'AutoComplete',\n                enabled: true,\n                suggest: false,\n                template: '',\n                groupTemplate: '#:data#',\n                fixedGroupTemplate: '#:data#',\n                dataTextField: '',\n                minLength: 1,\n                enforceMinLength: false,\n                delay: 200,\n                height: 200,\n                filter: 'startswith',\n                ignoreCase: true,\n                highlightFirst: false,\n                separator: null,\n                placeholder: '',\n                animation: {},\n                virtual: false,\n                value: null,\n                clearButton: true,\n                autoWidth: false\n            },\n            _dataSource: function () {\n                var that = this;\n                if (that.dataSource && that._refreshHandler) {\n                    that._unbindDataSource();\n                } else {\n                    that._progressHandler = proxy(that._showBusy, that);\n                    that._errorHandler = proxy(that._hideBusy, that);\n                }\n                that.dataSource = DataSource.create(that.options.dataSource).bind('progress', that._progressHandler).bind('error', that._errorHandler);\n            },\n            setDataSource: function (dataSource) {\n                this.options.dataSource = dataSource;\n                this._dataSource();\n                this.listView.setDataSource(this.dataSource);\n            },\n            events: [\n                'open',\n                'close',\n                CHANGE,\n                'select',\n                'filtering',\n                'dataBinding',\n                'dataBound'\n            ],\n            setOptions: function (options) {\n                var listOptions = this._listOptions(options);\n                List.fn.setOptions.call(this, options);\n                this.listView.setOptions(listOptions);\n                this._accessors();\n                this._aria();\n                this._clearButton();\n            },\n            _listOptions: function (options) {\n                var listOptions = List.fn._listOptions.call(this, $.extend(options, { skipUpdateOnBind: true }));\n                listOptions.dataValueField = listOptions.dataTextField;\n                listOptions.selectedItemChange = null;\n                return listOptions;\n            },\n            _editable: function (options) {\n                var that = this, element = that.element, wrapper = that.wrapper.off(ns), readonly = options.readonly, disable = options.disable;\n                if (!readonly && !disable) {\n                    wrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n                    element.removeAttr(DISABLED).removeAttr(READONLY).attr(ARIA_DISABLED, false).attr(ARIA_READONLY, false);\n                } else {\n                    wrapper.addClass(disable ? STATEDISABLED : DEFAULT).removeClass(disable ? DEFAULT : STATEDISABLED);\n                    element.attr(DISABLED, disable).attr(READONLY, readonly).attr(ARIA_DISABLED, disable).attr(ARIA_READONLY, readonly);\n                }\n            },\n            close: function () {\n                var that = this;\n                var current = that.listView.focus();\n                if (current) {\n                    current.removeClass(SELECTED);\n                }\n                that.popup.close();\n            },\n            destroy: function () {\n                var that = this;\n                that.element.off(ns);\n                that._clear.off(ns);\n                that.wrapper.off(ns);\n                List.fn.destroy.call(that);\n            },\n            refresh: function () {\n                this.listView.refresh();\n            },\n            select: function (li) {\n                this._select(li);\n            },\n            search: function (word) {\n                var that = this, options = that.options, ignoreCase = options.ignoreCase, separator = that._separator(), length;\n                word = word || that._accessor();\n                clearTimeout(that._typingTimeout);\n                if (separator) {\n                    word = wordAtCaret(caret(that.element)[0], word, separator);\n                }\n                length = word.length;\n                if (!options.enforceMinLength && !length || length >= options.minLength) {\n                    that._open = true;\n                    that._mute(function () {\n                        this.listView.value([]);\n                    });\n                    that._filterSource({\n                        value: ignoreCase ? word.toLowerCase() : word,\n                        operator: options.filter,\n                        field: options.dataTextField,\n                        ignoreCase: ignoreCase\n                    });\n                    that.one('close', $.proxy(that._unifySeparators, that));\n                }\n                that._toggleCloseVisibility();\n            },\n            suggest: function (word) {\n                var that = this, key = that._last, value = that._accessor(), element = that.element[0], caretIdx = caret(element)[0], separator = that._separator(), words = value.split(separator), wordIndex = indexOfWordAtCaret(caretIdx, value, separator), selectionEnd = caretIdx, idx;\n                if (key == keys.BACKSPACE || key == keys.DELETE) {\n                    that._last = undefined;\n                    return;\n                }\n                word = word || '';\n                if (typeof word !== 'string') {\n                    if (word[0]) {\n                        word = that.dataSource.view()[List.inArray(word[0], that.ul[0])];\n                    }\n                    word = word ? that._text(word) : '';\n                }\n                if (caretIdx <= 0) {\n                    caretIdx = value.toLowerCase().indexOf(word.toLowerCase()) + 1;\n                }\n                idx = value.substring(0, caretIdx).lastIndexOf(separator);\n                idx = idx > -1 ? caretIdx - (idx + separator.length) : caretIdx;\n                value = words[wordIndex].substring(0, idx);\n                if (word) {\n                    word = word.toString();\n                    idx = word.toLowerCase().indexOf(value.toLowerCase());\n                    if (idx > -1) {\n                        word = word.substring(idx + value.length);\n                        selectionEnd = caretIdx + word.length;\n                        value += word;\n                    }\n                    if (separator && words[words.length - 1] !== '') {\n                        words.push('');\n                    }\n                }\n                words[wordIndex] = value;\n                that._accessor(words.join(separator || ''));\n                if (element === activeElement()) {\n                    caret(element, caretIdx, selectionEnd);\n                }\n            },\n            value: function (value) {\n                if (value !== undefined) {\n                    this.listView.value(value);\n                    this._accessor(value);\n                    this._old = this._accessor();\n                    this._oldText = this._accessor();\n                } else {\n                    return this._accessor();\n                }\n                this._toggleCloseVisibility();\n            },\n            _click: function (e) {\n                var item = e.item;\n                var that = this;\n                var element = that.element;\n                var dataItem = that.listView.dataItemByIndex(that.listView.getElementIndex(item));\n                e.preventDefault();\n                that._active = true;\n                if (that.trigger('select', {\n                        dataItem: dataItem,\n                        item: item\n                    })) {\n                    that.close();\n                    return;\n                }\n                that._oldText = element.val();\n                that._select(item).done(function () {\n                    that._blur();\n                    caret(element, element.val().length);\n                });\n            },\n            _clearText: $.noop,\n            _resetFocusItem: function () {\n                var index = this.options.highlightFirst ? 0 : -1;\n                if (this.options.virtual) {\n                    this.listView.scrollTo(0);\n                }\n                this.listView.focus(index);\n            },\n            _listBound: function () {\n                var that = this;\n                var popup = that.popup;\n                var options = that.options;\n                var data = that.dataSource.flatView();\n                var length = data.length;\n                var groupsLength = that.dataSource._group.length;\n                var isActive = that.element[0] === activeElement();\n                var action;\n                that._renderFooter();\n                that._renderNoData();\n                that._toggleNoData(!length);\n                that._toggleHeader(!!groupsLength && !!length);\n                that._resizePopup();\n                popup.position();\n                if (length) {\n                    if (options.suggest && isActive) {\n                        that.suggest(data[0]);\n                    }\n                }\n                if (that._open) {\n                    that._open = false;\n                    action = that._allowOpening() ? 'open' : 'close';\n                    if (that._typingTimeout && !isActive) {\n                        action = 'close';\n                    }\n                    if (length) {\n                        that._resetFocusItem();\n                        if (options.virtual) {\n                            that.popup.unbind('activate', that._resetFocusItemHandler).one('activate', that._resetFocusItemHandler);\n                        }\n                    }\n                    popup[action]();\n                    that._typingTimeout = undefined;\n                }\n                if (that._touchScroller) {\n                    that._touchScroller.reset();\n                }\n                that._hideBusy();\n                that._makeUnselectable();\n                that.trigger('dataBound');\n            },\n            _mute: function (callback) {\n                this._muted = true;\n                callback.call(this);\n                this._muted = false;\n            },\n            _listChange: function () {\n                var isActive = this._active || this.element[0] === activeElement();\n                if (isActive && !this._muted) {\n                    this._selectValue(this.listView.selectedDataItems()[0]);\n                }\n            },\n            _selectValue: function (dataItem) {\n                var separator = this._separator();\n                var text = '';\n                if (dataItem) {\n                    text = this._text(dataItem);\n                }\n                if (text === null) {\n                    text = '';\n                }\n                if (separator) {\n                    text = replaceWordAtCaret(caret(this.element)[0], this._accessor(), text, separator, this._defaultSeparator());\n                }\n                this._prev = text;\n                this._accessor(text);\n                this._placeholder();\n            },\n            _unifySeparators: function () {\n                this._accessor(this.value().split(this._separator()).join(this._defaultSeparator()));\n                return this;\n            },\n            _preselect: function (value, text) {\n                this._inputValue(text);\n                this._accessor(value);\n                this._old = this.oldText = this._accessor();\n                this.listView.setValue(value);\n                this._placeholder();\n            },\n            _change: function () {\n                var that = this;\n                var value = that._unifySeparators().value();\n                var trigger = value !== List.unifyType(that._old, typeof value);\n                var valueUpdated = trigger && !that._typing;\n                var itemSelected = that._oldText !== value;\n                that._old = value;\n                that._oldText = value;\n                if (valueUpdated || itemSelected) {\n                    that.element.trigger(CHANGE);\n                }\n                if (trigger) {\n                    that.trigger(CHANGE);\n                }\n                that.typing = false;\n                that._toggleCloseVisibility();\n            },\n            _accessor: function (value) {\n                var that = this, element = that.element[0];\n                if (value !== undefined) {\n                    element.value = value === null ? '' : value;\n                    that._placeholder();\n                } else {\n                    value = element.value;\n                    if (element.className.indexOf('k-readonly') > -1) {\n                        if (value === that.options.placeholder) {\n                            return '';\n                        } else {\n                            return value;\n                        }\n                    }\n                    return value;\n                }\n            },\n            _keydown: function (e) {\n                var that = this;\n                var key = e.keyCode;\n                var listView = that.listView;\n                var visible = that.popup.visible();\n                var current = listView.focus();\n                that._last = key;\n                if (key === keys.DOWN) {\n                    if (visible) {\n                        this._move(current ? 'focusNext' : 'focusFirst');\n                    } else if (that.value()) {\n                        that._filterSource({\n                            value: that.ignoreCase ? that.value().toLowerCase() : that.value(),\n                            operator: that.options.filter,\n                            field: that.options.dataTextField,\n                            ignoreCase: that.ignoreCase\n                        }).done(function () {\n                            that._resetFocusItem();\n                            that.popup.open();\n                        });\n                    }\n                    e.preventDefault();\n                } else if (key === keys.UP) {\n                    if (visible) {\n                        this._move(current ? 'focusPrev' : 'focusLast');\n                    }\n                    e.preventDefault();\n                } else if (key === keys.HOME) {\n                    this._move('focusFirst');\n                } else if (key === keys.END) {\n                    this._move('focusLast');\n                } else if (key === keys.ENTER || key === keys.TAB) {\n                    if (key === keys.ENTER && visible) {\n                        e.preventDefault();\n                    }\n                    if (visible && current) {\n                        var dataItem = listView.dataItemByIndex(listView.getElementIndex(current));\n                        if (that.trigger('select', {\n                                dataItem: dataItem,\n                                item: current\n                            })) {\n                            return;\n                        }\n                        this._select(current);\n                    }\n                    this._blur();\n                } else if (key === keys.ESC) {\n                    if (visible) {\n                        e.preventDefault();\n                    } else {\n                        that._clearValue();\n                    }\n                    that.close();\n                } else if (that.popup.visible() && (key === keys.PAGEDOWN || key === keys.PAGEUP)) {\n                    e.preventDefault();\n                    var direction = key === keys.PAGEDOWN ? 1 : -1;\n                    listView.scrollWith(direction * listView.screenHeight());\n                } else {\n                    that.popup._hovered = true;\n                    that._search();\n                }\n            },\n            _keypress: function () {\n                this._oldText = this.element.val();\n                this._typing = true;\n            },\n            _move: function (action) {\n                this.listView[action]();\n                if (this.options.suggest) {\n                    this.suggest(this.listView.focus());\n                }\n            },\n            _hideBusy: function () {\n                var that = this;\n                clearTimeout(that._busy);\n                that._loading.hide();\n                that.element.attr('aria-busy', false);\n                that._busy = null;\n                that._showClear();\n            },\n            _showBusy: function () {\n                var that = this;\n                if (that._busy) {\n                    return;\n                }\n                that._busy = setTimeout(function () {\n                    that.element.attr('aria-busy', true);\n                    that._loading.show();\n                    that._hideClear();\n                }, 100);\n            },\n            _placeholder: function (show) {\n                if (placeholderSupported) {\n                    return;\n                }\n                var that = this, element = that.element, placeholder = that.options.placeholder, value;\n                if (placeholder) {\n                    value = element.val();\n                    if (show === undefined) {\n                        show = !value;\n                    }\n                    if (!show) {\n                        if (value !== placeholder) {\n                            placeholder = value;\n                        } else {\n                            placeholder = '';\n                        }\n                    }\n                    if (value === that._old && !show) {\n                        return;\n                    }\n                    element.toggleClass('k-readonly', show).val(placeholder);\n                    if (!placeholder && element[0] === document.activeElement) {\n                        caret(element[0], 0, 0);\n                    }\n                }\n            },\n            _separator: function () {\n                var separator = this.options.separator;\n                if (separator instanceof Array) {\n                    return new RegExp(separator.join('|'), 'gi');\n                }\n                return separator;\n            },\n            _defaultSeparator: function () {\n                var separator = this.options.separator;\n                if (separator instanceof Array) {\n                    return separator[0];\n                }\n                return separator;\n            },\n            _inputValue: function () {\n                return this.element.val();\n            },\n            _search: function () {\n                var that = this;\n                clearTimeout(that._typingTimeout);\n                that._typingTimeout = setTimeout(function () {\n                    if (that._prev !== that._accessor()) {\n                        that._prev = that._accessor();\n                        that.search();\n                    }\n                }, that.options.delay);\n            },\n            _select: function (candidate) {\n                var that = this;\n                that._active = true;\n                return that.listView.select(candidate).done(function () {\n                    that._active = false;\n                });\n            },\n            _loader: function () {\n                this._loading = $('<span class=\"k-icon k-i-loading\" style=\"display:none\"></span>').insertAfter(this.element);\n            },\n            _clearButton: function () {\n                List.fn._clearButton.call(this);\n                if (this.options.clearButton) {\n                    this._clear.insertAfter(this.element);\n                    this.wrapper.addClass('k-autocomplete-clearable');\n                }\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter');\n            },\n            _toggleCloseVisibility: function () {\n                if (this.value()) {\n                    this._showClear();\n                } else {\n                    this._hideClear();\n                }\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('<span />').parent();\n                }\n                wrapper.attr('tabindex', -1);\n                wrapper.attr('role', 'presentation');\n                wrapper[0].style.cssText = DOMelement.style.cssText;\n                element.css({\n                    width: '',\n                    height: DOMelement.style.height\n                });\n                that._focused = that.element;\n                that.wrapper = wrapper.addClass('k-widget k-autocomplete k-header').addClass(DOMelement.className);\n            }\n        });\n        ui.plugin(AutoComplete);\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', 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                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            },\n            events: [\n                'open',\n                'close',\n                CHANGE,\n                'select',\n                'filtering',\n                'dataBinding',\n                'dataBound',\n                'cascade',\n                'set'\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            },\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._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 = $('<div class=\"k-list-optionlabel\"></div>').prependTo(that.list);\n                }\n                that.optionLabel.html(template(optionLabel)).off().click(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 = '<option value=\"' + optionLabelValue + '\">' + that._text(optionLabel) + '</option>';\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            },\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, proxy(that._keydown, that)).on('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._focusElement(that.wrapper);\n                    that._blur();\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                if (this.optionLabel.hasClass('k-state-focused')) {\n                    this._resetOptionLabel();\n                    this.listView.focusFirst();\n                } else {\n                    this.listView.focusNext();\n                }\n            },\n            _prevItem: function () {\n                if (this.optionLabel.hasClass('k-state-focused')) {\n                    return;\n                }\n                this.listView.focusPrev();\n                if (!this.listView.focus()) {\n                    this._focus(this.optionLabel);\n                }\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 = '<span class=\"k-icon k-i-zoom\"></span>';\n                    this.filterInput = $('<input class=\"k-textbox\"/>').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($('<span class=\"k-list-filter\" />').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('<span unselectable=\"on\" class=\"k-dropdown-wrap k-state-default\"><span unselectable=\"on\" class=\"k-input\">&nbsp;</span><span unselectable=\"on\" class=\"k-select\" aria-label=\"select\"><span class=\"k-icon k-i-arrow-60-down\"></span></span></span>').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('<span />').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 k-header').addClass(DOMelement.className).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}));\n(function (f, define) {\n    define('kendo.combobox', [\n        'kendo.list',\n        'kendo.mobile.scroller',\n        'kendo.virtuallist'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'combobox',\n        name: 'ComboBox',\n        category: 'web',\n        description: 'The ComboBox widget allows the selection from pre-defined values or entering a new value.',\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, caret = kendo.caret, support = kendo.support, placeholderSupported = support.placeholder, activeElement = kendo._activeElement, keys = kendo.keys, ns = '.kendoComboBox', nsFocusEvent = ns + 'FocusEvent', CLICK = 'click' + ns, MOUSEDOWN = 'mousedown' + ns, DISABLED = 'disabled', READONLY = 'readonly', CHANGE = 'change', LOADING = 'k-i-loading', DEFAULT = 'k-state-default', FOCUSED = 'k-state-focused', STATEDISABLED = 'k-state-disabled', ARIA_DISABLED = 'aria-disabled', STATE_FILTER = 'filter', STATE_ACCEPT = 'accept', STATE_REBIND = 'rebind', HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, proxy = $.proxy, newLineRegEx = /(\\r\\n|\\n|\\r)/gm;\n        var ComboBox = Select.extend({\n            init: function (element, options) {\n                var that = this, 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                options.placeholder = options.placeholder || element.attr('placeholder');\n                that._reset();\n                that._wrapper();\n                that._input();\n                that._clearButton();\n                that._tabindex(that.input);\n                that._popup();\n                that._dataSource();\n                that._ignoreCase();\n                that._enable();\n                that._attachFocusEvents();\n                that._oldIndex = that.selectedIndex = -1;\n                that._aria();\n                that._initialIndex = options.index;\n                that.requireValueMapper(that.options);\n                that._initList();\n                that._cascade();\n                if (options.autoBind) {\n                    that._filterSource();\n                } else {\n                    text = options.text;\n                    if (!text && that._isSelect) {\n                        text = element.children(':selected').text();\n                    }\n                    if (text) {\n                        that._setText(text);\n                    }\n                }\n                if (!text) {\n                    that._placeholder();\n                }\n                disabled = $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                }\n                kendo.notify(that);\n                that._toggleCloseVisibility();\n            },\n            options: {\n                name: 'ComboBox',\n                enabled: true,\n                index: -1,\n                text: null,\n                value: null,\n                autoBind: true,\n                delay: 200,\n                dataTextField: '',\n                dataValueField: '',\n                minLength: 1,\n                enforceMinLength: false,\n                height: 200,\n                highlightFirst: true,\n                filter: 'none',\n                placeholder: '',\n                suggest: false,\n                cascadeFrom: '',\n                cascadeFromField: '',\n                ignoreCase: true,\n                animation: {},\n                virtual: false,\n                template: null,\n                groupTemplate: '#:data#',\n                fixedGroupTemplate: '#:data#',\n                clearButton: true,\n                syncValueAndText: true,\n                autoWidth: false\n            },\n            events: [\n                'open',\n                'close',\n                CHANGE,\n                'select',\n                'filtering',\n                'dataBinding',\n                'dataBound',\n                'cascade',\n                'set'\n            ],\n            setOptions: function (options) {\n                var listOptions = this._listOptions(options);\n                Select.fn.setOptions.call(this, options);\n                this.listView.setOptions(listOptions);\n                this._accessors();\n                this._aria();\n                this._clearButton();\n            },\n            destroy: function () {\n                var that = this;\n                that.input.off(ns);\n                that.input.off(nsFocusEvent);\n                that.element.off(ns);\n                that._inputWrapper.off(ns);\n                clearTimeout(that._pasteTimeout);\n                that._arrow.off(CLICK + ' ' + MOUSEDOWN);\n                that._clear.off(CLICK + ' ' + MOUSEDOWN);\n                Select.fn.destroy.call(that);\n            },\n            _change: function () {\n                var that = this;\n                var text = that.text();\n                var hasText = text && text !== that._oldText && text !== that.options.placeholder;\n                var index = that.selectedIndex;\n                var isCustom = index === -1;\n                if (!that.options.syncValueAndText && !that.value() && isCustom && hasText) {\n                    that._old = '';\n                    that._oldIndex = index;\n                    that._oldText = text;\n                    if (!that._typing) {\n                        that.element.trigger(CHANGE);\n                    }\n                    that.trigger(CHANGE);\n                    that._typing = false;\n                    return;\n                }\n                Select.fn._change.call(that);\n                that._toggleCloseVisibility();\n            },\n            _attachFocusEvents: function () {\n                var that = this;\n                that.input.on('focus' + nsFocusEvent, proxy(that._inputFocus, that)).on('focusout' + nsFocusEvent, proxy(that._inputFocusout, that));\n            },\n            _focusHandler: function () {\n                this.input.focus();\n            },\n            _arrowClick: function () {\n                this._toggle();\n            },\n            _inputFocus: function () {\n                this._inputWrapper.addClass(FOCUSED);\n                this._placeholder(false);\n            },\n            _inputFocusout: function () {\n                var that = this;\n                var value = that.value();\n                that._userTriggered = true;\n                that._inputWrapper.removeClass(FOCUSED);\n                clearTimeout(that._typingTimeout);\n                that._typingTimeout = null;\n                that.text(that.text());\n                var item = that._focus();\n                var dataItem = this.listView.dataItemByIndex(this.listView.getElementIndex(item));\n                if (value !== that.value() && that.trigger('select', {\n                        dataItem: dataItem,\n                        item: item\n                    })) {\n                    that.value(value);\n                    return;\n                }\n                that._placeholder();\n                that._blur();\n                that.element.blur();\n            },\n            _inputPaste: function () {\n                var that = this;\n                clearTimeout(that._pasteTimeout);\n                that._pasteTimeout = null;\n                that._pasteTimeout = setTimeout(function () {\n                    that.search();\n                });\n            },\n            _editable: function (options) {\n                var that = this, disable = options.disable, readonly = options.readonly, wrapper = that._inputWrapper.off(ns), input = that.element.add(that.input.off(ns)), arrow = that._arrow.off(CLICK + ' ' + MOUSEDOWN), clear = that._clear;\n                if (!readonly && !disable) {\n                    wrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n                    input.removeAttr(DISABLED).removeAttr(READONLY).attr(ARIA_DISABLED, false);\n                    arrow.on(CLICK, proxy(that._arrowClick, that)).on(MOUSEDOWN, function (e) {\n                        e.preventDefault();\n                    });\n                    clear.on(CLICK, proxy(that._clearValue, that)).on(MOUSEDOWN, function (e) {\n                        e.preventDefault();\n                    });\n                    that.input.on('keydown' + ns, proxy(that._keydown, that)).on('input' + ns, proxy(that._search, that)).on('paste' + ns, proxy(that._inputPaste, that));\n                } else {\n                    wrapper.addClass(disable ? STATEDISABLED : DEFAULT).removeClass(disable ? DEFAULT : STATEDISABLED);\n                    input.attr(DISABLED, disable).attr(READONLY, readonly).attr(ARIA_DISABLED, disable);\n                }\n                that._toggleCloseVisibility();\n            },\n            open: function () {\n                var that = this;\n                var state = that._state;\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() && state !== STATE_FILTER || state === STATE_ACCEPT) {\n                    that._open = true;\n                    that._state = STATE_REBIND;\n                    if (that.options.minLength !== 1 && !isFiltered || isFiltered && that.value() && that.selectedIndex === -1) {\n                        that.refresh();\n                        that._openPopup();\n                        if (!this.options.virtual) {\n                            that.listView.bound(false);\n                        }\n                    } else {\n                        that._filterSource();\n                    }\n                } else if (that._allowOpening()) {\n                    that.popup._hovered = true;\n                    that._openPopup();\n                    if (that.options.virtual) {\n                        that._focusItem();\n                    }\n                }\n            },\n            _scrollToFocusedItem: function () {\n                var listView = this.listView;\n                listView.scrollToIndex(listView.getElementIndex(listView.focus()));\n            },\n            _openPopup: function () {\n                this.popup.one('activate', proxy(this._scrollToFocusedItem, this));\n                this.popup.open();\n            },\n            _updateSelectionState: function () {\n                var that = this;\n                var text = that.options.text;\n                var value = that.options.value;\n                if (that.listView.isFiltered()) {\n                    return;\n                }\n                if (that.selectedIndex === -1) {\n                    if (text === undefined || text === null) {\n                        text = value;\n                    }\n                    that._accessor(value);\n                    that.input.val(text || that.input.val());\n                    that._placeholder();\n                } else if (that._oldIndex === -1) {\n                    that._oldIndex = that.selectedIndex;\n                }\n            },\n            _buildOptions: function (data) {\n                var that = this;\n                if (!that._isSelect) {\n                    return;\n                }\n                var custom = that._customOption;\n                if (that._state === STATE_REBIND) {\n                    that._state = '';\n                }\n                that._customOption = undefined;\n                that._options(data, '', that.value());\n                if (custom && custom[0].selected) {\n                    that._custom(custom.val());\n                }\n            },\n            _updateSelection: function () {\n                var that = this;\n                var listView = that.listView;\n                var initialIndex = that._initialIndex;\n                var hasInitialIndex = initialIndex !== null && initialIndex > -1;\n                var filtered = that._state === STATE_FILTER;\n                if (filtered) {\n                    $(listView.focus()).removeClass('k-state-selected');\n                    return;\n                }\n                if (that._fetch) {\n                    return;\n                }\n                if (!listView.value().length) {\n                    if (hasInitialIndex) {\n                        that.select(initialIndex);\n                    } else if (that._accessor()) {\n                        listView.value(that._accessor());\n                    }\n                }\n                that._initialIndex = null;\n                var dataItem = listView.selectedDataItems()[0];\n                if (!dataItem) {\n                    return;\n                }\n                if (that._value(dataItem) !== that.value()) {\n                    that._custom(that._value(dataItem));\n                }\n                if (that.text() && that.text() !== that._text(dataItem)) {\n                    that._selectValue(dataItem);\n                }\n            },\n            _updateItemFocus: function () {\n                var listView = this.listView;\n                if (!this.options.highlightFirst) {\n                    listView.focus(-1);\n                } else if (!listView.focus() && !listView.focusIndex()) {\n                    listView.focus(0);\n                }\n            },\n            _listBound: function () {\n                var that = this;\n                var isActive = that.input[0] === activeElement();\n                var data = that.dataSource.flatView();\n                var skip = that.listView.skip();\n                var length = data.length;\n                var groupsLength = that.dataSource._group ? that.dataSource._group.length : 0;\n                var isFirstPage = skip === undefined || skip === 0;\n                that._presetValue = false;\n                that._renderFooter();\n                that._renderNoData();\n                that._toggleNoData(!length);\n                that._toggleHeader(!!groupsLength && !!length);\n                that._resizePopup();\n                that.popup.position();\n                that._buildOptions(data);\n                that._makeUnselectable();\n                that._updateSelection();\n                if (data.length && isFirstPage) {\n                    that._updateItemFocus();\n                    if (that.options.suggest && isActive && that.input.val()) {\n                        that.suggest(data[0]);\n                    }\n                }\n                if (that._open) {\n                    that._open = false;\n                    if (that._typingTimeout && !isActive) {\n                        that.popup.close();\n                    } else {\n                        that.toggle(that._allowOpening());\n                    }\n                    that._typingTimeout = null;\n                }\n                that._hideBusy();\n                that.trigger('dataBound');\n            },\n            _listChange: function () {\n                this._selectValue(this.listView.selectedDataItems()[0]);\n                if (this._presetValue) {\n                    this._oldIndex = this.selectedIndex;\n                }\n            },\n            _get: function (candidate) {\n                var data, found, idx;\n                if (typeof candidate === 'function') {\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            _select: function (candidate, keepState) {\n                var that = this;\n                candidate = that._get(candidate);\n                if (candidate === -1) {\n                    that.input[0].value = '';\n                    that._accessor('');\n                }\n                return that.listView.select(candidate).done(function () {\n                    if (!keepState && that._state === STATE_FILTER) {\n                        that._state = STATE_ACCEPT;\n                    }\n                    that._toggleCloseVisibility();\n                });\n            },\n            _selectValue: function (dataItem) {\n                var idx = this.listView.select();\n                var value = '';\n                var text = '';\n                idx = idx[idx.length - 1];\n                if (idx === undefined) {\n                    idx = -1;\n                }\n                this.selectedIndex = idx;\n                if (this.listView.isFiltered() && idx !== -1) {\n                    this._valueBeforeCascade = this._old;\n                }\n                if (idx === -1 && !dataItem) {\n                    if (this.options.syncValueAndText) {\n                        if (this.options.dataTextField === this.options.dataValueField) {\n                            text = this._accessor();\n                        } else {\n                            text = this.input[0].value;\n                        }\n                        value = text;\n                    } else {\n                        text = this.text();\n                    }\n                    this.listView.focus(-1);\n                } else {\n                    if (dataItem || dataItem === 0) {\n                        value = this._dataValue(dataItem);\n                        text = this._text(dataItem);\n                    }\n                    if (value === null) {\n                        value = '';\n                    }\n                }\n                this._setDomInputValue(text);\n                this._accessor(value !== undefined ? value : text, idx);\n                this._placeholder();\n                this._triggerCascade();\n            },\n            _setDomInputValue: function (text) {\n                var that = this;\n                var currentCaret = caret(this.input);\n                var caretStart;\n                if (currentCaret && currentCaret.length) {\n                    caretStart = currentCaret[0];\n                }\n                this._prev = this.input[0].value = text;\n                if (caretStart && this.selectedIndex === -1) {\n                    var mobile = support.mobileOS;\n                    if (mobile.wp || mobile.android) {\n                        setTimeout(function () {\n                            that.input[0].setSelectionRange(caretStart, caretStart);\n                        }, 0);\n                    } else {\n                        this.input[0].setSelectionRange(caretStart, caretStart);\n                    }\n                }\n            },\n            refresh: function () {\n                this.listView.refresh();\n            },\n            _toggleCloseVisibility: function () {\n                var preventShow = this.element.is(':disabled') || this.element.is('[readonly]');\n                if (this.text() && !preventShow) {\n                    this._showClear();\n                } else {\n                    this._hideClear();\n                }\n            },\n            suggest: function (word) {\n                var that = this;\n                var element = that.input[0];\n                var value = that.text();\n                var caretIdx = caret(element)[0];\n                var key = that._last;\n                var idx;\n                if (key == keys.BACKSPACE || key == keys.DELETE) {\n                    that._last = undefined;\n                    return;\n                }\n                word = word || '';\n                if (typeof word !== 'string') {\n                    if (word[0]) {\n                        word = that.dataSource.view()[List.inArray(word[0], that.ul[0])];\n                    }\n                    word = word ? that._text(word) : '';\n                }\n                if (caretIdx <= 0) {\n                    caretIdx = value.toLowerCase().indexOf(word.toLowerCase()) + 1;\n                }\n                if (word) {\n                    word = word.toString();\n                    idx = word.toLowerCase().indexOf(value.toLowerCase());\n                    if (idx > -1) {\n                        value += word.substring(idx + value.length);\n                    }\n                } else {\n                    value = value.substring(0, caretIdx);\n                }\n                if (value.length !== caretIdx || !word) {\n                    element.value = value;\n                    if (element === activeElement()) {\n                        caret(element, caretIdx, value.length);\n                    }\n                }\n            },\n            text: function (text) {\n                text = text === null ? '' : text;\n                var that = this;\n                var input = that.input[0];\n                var ignoreCase = that.options.ignoreCase;\n                var loweredText = text;\n                var dataItem;\n                var value;\n                if (text === undefined) {\n                    return input.value;\n                }\n                if (that.options.autoBind === false && !that.listView.bound()) {\n                    that._setText(text);\n                    return;\n                }\n                dataItem = that.dataItem();\n                if (dataItem && that._text(dataItem).replace && that._text(dataItem).replace(newLineRegEx, '') === text) {\n                    value = that._value(dataItem);\n                    if (value === List.unifyType(that._old, typeof value)) {\n                        that._triggerCascade();\n                        return;\n                    }\n                }\n                if (ignoreCase) {\n                    loweredText = loweredText.toLowerCase();\n                }\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                    if (that.selectedIndex < 0) {\n                        input.value = text;\n                        if (that.options.syncValueAndText) {\n                            that._accessor(text);\n                        }\n                        that._cascadeTriggered = true;\n                        that._triggerCascade();\n                    }\n                    that._prev = input.value;\n                });\n            },\n            toggle: function (toggle) {\n                this._toggle(toggle, true);\n            },\n            value: function (value) {\n                var that = this;\n                var options = that.options;\n                var listView = that.listView;\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                that.trigger('set', { value: value });\n                if (value === options.value && that.input.val() === options.text) {\n                    return;\n                }\n                that._accessor(value);\n                if (that._isFilterEnabled() && listView.bound() && listView.isFiltered()) {\n                    that._clearFilter();\n                } else {\n                    that._fetchData();\n                }\n                listView.value(value).done(function () {\n                    if (that.selectedIndex === -1) {\n                        that._accessor(value);\n                        that.input.val(value);\n                        that._placeholder(true);\n                    }\n                    that._old = that._accessor();\n                    that._oldIndex = that.selectedIndex;\n                    that._prev = that.input.val();\n                    if (that._state === STATE_FILTER) {\n                        that._state = STATE_ACCEPT;\n                    }\n                    that._toggleCloseVisibility();\n                });\n            },\n            _hideBusy: function () {\n                var that = this;\n                clearTimeout(that._busy);\n                that._arrowIcon.removeClass(LOADING);\n                that._focused.attr('aria-busy', false);\n                that._busy = null;\n                that._toggleCloseVisibility();\n            },\n            _click: function (e) {\n                var that = this;\n                var item = e.item;\n                var dataItem = that.listView.dataItemByIndex(that.listView.getElementIndex(item));\n                e.preventDefault();\n                if (that.trigger('select', {\n                        dataItem: dataItem,\n                        item: item\n                    })) {\n                    that.close();\n                    return;\n                }\n                that._userTriggered = true;\n                that._select(item).done(function () {\n                    that._blur();\n                });\n            },\n            _syncValueAndText: function () {\n                return this.options.syncValueAndText;\n            },\n            _inputValue: function () {\n                return this.text();\n            },\n            _searchByWord: function (word) {\n                var that = this;\n                var options = that.options;\n                var dataSource = that.dataSource;\n                var ignoreCase = options.ignoreCase;\n                var predicate = function (dataItem) {\n                    var text = that._text(dataItem);\n                    if (text !== undefined) {\n                        text = text + '';\n                        if (text !== '' && word === '') {\n                            return false;\n                        }\n                        if (ignoreCase) {\n                            text = text.toLowerCase();\n                        }\n                        return text.indexOf(word) === 0;\n                    }\n                };\n                if (ignoreCase) {\n                    word = word.toLowerCase();\n                }\n                if (!that.ul[0].firstChild) {\n                    dataSource.one(CHANGE, function () {\n                        if (dataSource.view()[0]) {\n                            that.search(word);\n                        }\n                    }).fetch();\n                    return;\n                }\n                this.listView.focus(this._get(predicate));\n                var current = this.listView.focus();\n                if (current) {\n                    if (options.suggest) {\n                        that.suggest(current);\n                    }\n                    this.open();\n                }\n                if (this.options.highlightFirst && !word) {\n                    this.listView.focusFirst();\n                }\n            },\n            _input: function () {\n                var that = this, element = that.element.removeClass('k-input')[0], accessKey = element.accessKey, wrapper = that.wrapper, SELECTOR = 'input.k-input', name = element.name || '', input, maxLength;\n                if (name) {\n                    name = 'name=\"' + name + '_input\" ';\n                }\n                input = wrapper.find(SELECTOR);\n                if (!input[0]) {\n                    wrapper.append('<span tabindex=\"-1\" unselectable=\"on\" class=\"k-dropdown-wrap k-state-default\"><input ' + name + 'class=\"k-input\" type=\"text\" autocomplete=\"off\"/><span unselectable=\"on\" class=\"k-select\" aria-label=\"select\"><span class=\"k-icon k-i-arrow-60-down\"></span></span></span>').append(that.element);\n                    input = wrapper.find(SELECTOR);\n                }\n                input[0].style.cssText = element.style.cssText;\n                input[0].title = element.title;\n                maxLength = parseInt(this.element.prop('maxlength') || this.element.attr('maxlength'), 10);\n                if (maxLength > -1) {\n                    input[0].maxLength = maxLength;\n                }\n                input.addClass(element.className).css({\n                    width: '',\n                    height: element.style.height\n                }).attr({\n                    'role': 'combobox',\n                    'aria-expanded': false\n                }).show();\n                if (placeholderSupported) {\n                    input.attr('placeholder', that.options.placeholder);\n                }\n                if (accessKey) {\n                    element.accessKey = '';\n                    input[0].accessKey = accessKey;\n                }\n                that._focused = that.input = input;\n                that._inputWrapper = $(wrapper[0].firstChild);\n                that._arrow = wrapper.find('.k-select').attr({\n                    'role': 'button',\n                    'tabIndex': -1\n                });\n                that._arrowIcon = that._arrow.find('.k-icon');\n                if (element.id) {\n                    that._arrow.attr('aria-controls', that.ul[0].id);\n                }\n            },\n            _clearButton: function () {\n                List.fn._clearButton.call(this);\n                if (this.options.clearButton) {\n                    this._clear.insertAfter(this.input);\n                    this.wrapper.addClass('k-combobox-clearable');\n                }\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode;\n                that._last = key;\n                clearTimeout(that._typingTimeout);\n                that._typingTimeout = null;\n                if (key === keys.HOME) {\n                    that._firstItem();\n                } else if (key === keys.END) {\n                    that._lastItem();\n                } else if (key === keys.ENTER || key === keys.TAB) {\n                    var current = that.listView.focus();\n                    var dataItem = that.dataItem();\n                    var shouldTrigger = true;\n                    if (!that.popup.visible() && (!dataItem || that.text() !== that._text(dataItem))) {\n                        current = null;\n                    }\n                    if (current) {\n                        if (that.popup.visible()) {\n                            e.preventDefault();\n                        }\n                        dataItem = that.listView.dataItemByIndex(that.listView.getElementIndex(current));\n                        if (dataItem) {\n                            shouldTrigger = that._value(dataItem) !== List.unifyType(that.value(), typeof that._value(dataItem));\n                        }\n                        if (shouldTrigger && that.trigger('select', {\n                                dataItem: dataItem,\n                                item: current\n                            })) {\n                            return;\n                        }\n                        that._userTriggered = true;\n                        that._select(current).done(function () {\n                            that._blur();\n                            that._valueBeforeCascade = that._old = that.value();\n                        });\n                    } else {\n                        if (that._syncValueAndText() || that._isSelect) {\n                            that._accessor(that.input.val());\n                        }\n                        that.listView.value(that.input.val());\n                        that._blur();\n                    }\n                } else if (key != keys.TAB && !that._move(e)) {\n                    that._search();\n                } else if (key === keys.ESC && !that.popup.visible()) {\n                    that._clearValue();\n                }\n            },\n            _placeholder: function (show) {\n                if (placeholderSupported) {\n                    return;\n                }\n                var that = this, input = that.input, placeholder = that.options.placeholder, value;\n                if (placeholder) {\n                    value = that.value();\n                    if (show === undefined) {\n                        show = !value;\n                    }\n                    input.toggleClass('k-readonly', show);\n                    if (!show) {\n                        if (!value) {\n                            placeholder = '';\n                        } else {\n                            return;\n                        }\n                    }\n                    input.val(placeholder);\n                    if (!placeholder && input[0] === activeElement()) {\n                        caret(input[0], 0, 0);\n                    }\n                }\n            },\n            _search: function () {\n                var that = this;\n                that._typingTimeout = setTimeout(function () {\n                    var value = that.text();\n                    if (that._prev !== value) {\n                        that._prev = value;\n                        if (that.options.filter === 'none' && that.options.virtual) {\n                            that.listView.select(-1);\n                        }\n                        that.search(value);\n                        that._toggleCloseVisibility();\n                    }\n                    that._typingTimeout = null;\n                }, that.options.delay);\n            },\n            _setText: function (text) {\n                this.input.val(text);\n                this._prev = text;\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, wrapper = element.parent();\n                if (!wrapper.is('span.k-widget')) {\n                    wrapper = element.hide().wrap('<span />').parent();\n                    wrapper[0].style.cssText = element[0].style.cssText;\n                }\n                that.wrapper = wrapper.addClass('k-widget k-combobox k-header').addClass(element[0].className).css('display', '');\n            },\n            _clearSelection: function (parent, isFiltered) {\n                var that = this;\n                var hasValue = parent.value();\n                var custom = hasValue && parent.selectedIndex === -1;\n                if (this.selectedIndex == -1 && this.value()) {\n                    return;\n                }\n                if (isFiltered || !hasValue || custom) {\n                    that.options.value = '';\n                    that.value('');\n                    that._selectedValue = null;\n                }\n            },\n            _preselect: function (value, text) {\n                this.input.val(text);\n                this._accessor(value);\n                this._old = this._accessor();\n                this._oldIndex = this.selectedIndex;\n                this.listView.setValue(value);\n                this._placeholder();\n                this._initialIndex = null;\n                this._presetValue = true;\n                this._toggleCloseVisibility();\n            }\n        });\n        ui.plugin(ComboBox);\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.multiselect', [\n        'kendo.list',\n        'kendo.mobile.scroller',\n        'kendo.virtuallist'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'multiselect',\n        name: 'MultiSelect',\n        category: 'web',\n        description: 'The MultiSelect widget allows the selection from pre-defined values.',\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, keys = $.extend({ A: 65 }, kendo.keys), activeElement = kendo._activeElement, ObservableArray = kendo.data.ObservableArray, proxy = $.proxy, ID = 'id', LI = 'li', ACCEPT = 'accept', FILTER = 'filter', REBIND = 'rebind', OPEN = 'open', CLOSE = 'close', CHANGE = 'change', PROGRESS = 'progress', SELECT = 'select', DESELECT = 'deselect', ARIA_DISABLED = 'aria-disabled', FOCUSEDCLASS = 'k-state-focused', SELECTEDCLASS = 'k-state-selected', HIDDENCLASS = 'k-hidden', HOVERCLASS = 'k-state-hover', STATEDISABLED = 'k-state-disabled', DISABLED = 'disabled', READONLY = 'readonly', ns = '.kendoMultiSelect', CLICK = 'click' + ns, KEYDOWN = 'keydown' + ns, MOUSEENTER = 'mouseenter' + ns, MOUSELEAVE = 'mouseleave' + ns, HOVEREVENTS = MOUSEENTER + ' ' + MOUSELEAVE, quotRegExp = /\"/g, isArray = $.isArray, styles = [\n                'font-family',\n                'font-size',\n                'font-stretch',\n                'font-style',\n                'font-weight',\n                'letter-spacing',\n                'text-transform',\n                'line-height'\n            ];\n        var MultiSelect = List.extend({\n            init: function (element, options) {\n                var that = this, id, disabled;\n                that.ns = ns;\n                List.fn.init.call(that, element, options);\n                that._optionsMap = {};\n                that._customOptions = {};\n                that._wrapper();\n                that._tagList();\n                that._input();\n                that._textContainer();\n                that._loader();\n                that._clearButton();\n                that._tabindex(that.input);\n                element = that.element.attr('multiple', 'multiple').hide();\n                options = that.options;\n                if (!options.placeholder) {\n                    options.placeholder = element.data('placeholder');\n                }\n                id = element.attr(ID);\n                if (id) {\n                    that._tagID = id + '_tag_active';\n                    id = id + '_taglist';\n                    that.tagList.attr(ID, id);\n                    that.input.attr('aria-describedby', id);\n                }\n                that._initialOpen = true;\n                that._aria(id);\n                that._dataSource();\n                that._ignoreCase();\n                that._popup();\n                that._tagTemplate();\n                that.requireValueMapper(that.options);\n                that._initList();\n                that._reset();\n                that._enable();\n                that._placeholder();\n                if (options.autoBind) {\n                    that.dataSource.fetch();\n                } else if (options.value) {\n                    that._preselect(options.value);\n                }\n                disabled = $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                }\n                kendo.notify(that);\n                that._toggleCloseVisibility();\n            },\n            options: {\n                name: 'MultiSelect',\n                tagMode: 'multiple',\n                enabled: true,\n                autoBind: true,\n                autoClose: true,\n                highlightFirst: true,\n                dataTextField: '',\n                dataValueField: '',\n                filter: 'startswith',\n                ignoreCase: true,\n                minLength: 1,\n                enforceMinLength: false,\n                delay: 100,\n                value: null,\n                maxSelectedItems: null,\n                placeholder: '',\n                height: 200,\n                animation: {},\n                virtual: false,\n                itemTemplate: '',\n                tagTemplate: '',\n                groupTemplate: '#:data#',\n                fixedGroupTemplate: '#:data#',\n                clearButton: true,\n                autoWidth: false\n            },\n            events: [\n                OPEN,\n                CLOSE,\n                CHANGE,\n                SELECT,\n                DESELECT,\n                'filtering',\n                'dataBinding',\n                'dataBound'\n            ],\n            setDataSource: function (dataSource) {\n                this.options.dataSource = dataSource;\n                this._state = '';\n                this._dataSource();\n                this.persistTagList = false;\n                this.listView.setDataSource(this.dataSource);\n                if (this.options.autoBind) {\n                    this.dataSource.fetch();\n                }\n            },\n            setOptions: function (options) {\n                var listOptions = this._listOptions(options);\n                List.fn.setOptions.call(this, options);\n                this.listView.setOptions(listOptions);\n                this._accessors();\n                this._aria(this.tagList.attr(ID));\n                this._tagTemplate();\n                this._placeholder();\n                this._clearButton();\n            },\n            currentTag: function (candidate) {\n                var that = this;\n                if (candidate !== undefined) {\n                    if (that._currentTag) {\n                        that._currentTag.removeClass(FOCUSEDCLASS).removeAttr(ID);\n                        that.input.removeAttr('aria-activedescendant');\n                    }\n                    if (candidate) {\n                        candidate.addClass(FOCUSEDCLASS).attr(ID, that._tagID);\n                        that.input.attr('aria-activedescendant', that._tagID);\n                    }\n                    that._currentTag = candidate;\n                } else {\n                    return that._currentTag;\n                }\n            },\n            dataItems: function () {\n                return this.listView.selectedDataItems();\n            },\n            destroy: function () {\n                var that = this, ns = that.ns;\n                clearTimeout(that._busy);\n                clearTimeout(that._typingTimeout);\n                that.wrapper.off(ns);\n                that.tagList.off(ns);\n                that.input.off(ns);\n                that._clear.off(ns);\n                List.fn.destroy.call(that);\n            },\n            _activateItem: function () {\n                if (this.popup.visible()) {\n                    List.fn._activateItem.call(this);\n                }\n                this.currentTag(null);\n            },\n            _listOptions: function (options) {\n                var that = this;\n                var listOptions = List.fn._listOptions.call(that, $.extend(options, {\n                    selectedItemChange: proxy(that._selectedItemChange, that),\n                    selectable: 'multiple'\n                }));\n                var itemTemplate = this.options.itemTemplate || this.options.template;\n                var template = listOptions.itemTemplate || itemTemplate || listOptions.template;\n                if (!template) {\n                    template = '#:' + kendo.expr(listOptions.dataTextField, 'data') + '#';\n                }\n                listOptions.template = template;\n                return listOptions;\n            },\n            _setListValue: function () {\n                List.fn._setListValue.call(this, this._initialValues.slice(0));\n            },\n            _listChange: function (e) {\n                var data = this.dataSource.flatView();\n                var optionsMap = this._optionsMap;\n                var valueGetter = this._value;\n                if (this._state === REBIND) {\n                    this._state = '';\n                }\n                for (var i = 0; i < e.added.length; i++) {\n                    if (optionsMap[valueGetter(e.added[i].dataItem)] === undefined) {\n                        this._render(data);\n                        break;\n                    }\n                }\n                this._selectValue(e.added, e.removed);\n            },\n            _selectedItemChange: function (e) {\n                var items = e.items;\n                var context;\n                var idx;\n                for (idx = 0; idx < items.length; idx++) {\n                    context = items[idx];\n                    this.tagList.children().eq(context.index).children('span:first').html(this.tagTextTemplate(context.item));\n                }\n            },\n            _wrapperMousedown: function (e) {\n                var that = this;\n                var notInput = e.target.nodeName.toLowerCase() !== 'input';\n                var target = $(e.target);\n                var closeButton = target.hasClass('k-select') || target.hasClass('k-icon');\n                if (closeButton) {\n                    closeButton = !target.closest('.k-select').children('.k-i-arrow-60-down').length;\n                }\n                if (notInput && !(closeButton && kendo.support.mobileOS)) {\n                    e.preventDefault();\n                }\n                if (!closeButton) {\n                    if (that.input[0] !== activeElement() && notInput) {\n                        that.input.focus();\n                    }\n                    if (that.options.minLength === 1) {\n                        that.open();\n                    }\n                }\n            },\n            _inputFocus: function () {\n                this._placeholder(false);\n                this.wrapper.addClass(FOCUSEDCLASS);\n            },\n            _inputFocusout: function () {\n                var that = this;\n                clearTimeout(that._typingTimeout);\n                that.wrapper.removeClass(FOCUSEDCLASS);\n                that._placeholder(!that.listView.selectedDataItems()[0], true);\n                that.close();\n                if (that._state === FILTER) {\n                    that._state = ACCEPT;\n                    that.listView.skipUpdate(true);\n                }\n                if (that.listView.bound() && that.listView.isFiltered()) {\n                    that.persistTagList = true;\n                    that._clearFilter();\n                }\n                that.element.blur();\n            },\n            _removeTag: function (tag, shouldTrigger) {\n                var that = this;\n                var state = that._state;\n                var position = tag.index();\n                var listView = that.listView;\n                var value = listView.value()[position];\n                var dataItem = that.listView.selectedDataItems()[position];\n                var customIndex = that._customOptions[value];\n                var option;\n                if (that.trigger(DESELECT, {\n                        dataItem: dataItem,\n                        item: tag\n                    })) {\n                    that._close();\n                    return;\n                }\n                if (customIndex === undefined && (state === ACCEPT || state === FILTER)) {\n                    customIndex = that._optionsMap[value];\n                }\n                var done = function () {\n                    that.currentTag(null);\n                    if (shouldTrigger) {\n                        that._change();\n                    }\n                    that._close();\n                };\n                if (customIndex === undefined) {\n                    that.persistTagList = false;\n                    listView.select(listView.select()[position]).done(done);\n                } else {\n                    option = that.element[0].children[customIndex];\n                    option.selected = false;\n                    listView.removeAt(position);\n                    tag.remove();\n                    done();\n                }\n            },\n            _tagListClick: function (e) {\n                var target = $(e.currentTarget);\n                if (!target.children('.k-i-arrow-60-down').length) {\n                    this._removeTag(target.closest(LI), true);\n                }\n            },\n            _clearClick: function () {\n                var that = this;\n                if (that.options.tagMode === 'single') {\n                    that.value([]);\n                } else {\n                    that.tagList.children().each(function (index, tag) {\n                        that._removeTag($(tag), false);\n                    });\n                }\n                that.input.val('');\n                that._search();\n                that.trigger(CHANGE);\n                that.focus();\n                that._hideClear();\n                if (that._state === FILTER) {\n                    that._state = ACCEPT;\n                }\n            },\n            _editable: function (options) {\n                var that = this, disable = options.disable, readonly = options.readonly, wrapper = that.wrapper.off(ns), tagList = that.tagList.off(ns), input = that.element.add(that.input.off(ns));\n                if (!readonly && !disable) {\n                    wrapper.removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover).on('mousedown' + ns + ' touchend' + ns, proxy(that._wrapperMousedown, that));\n                    that.input.on(KEYDOWN, proxy(that._keydown, that)).on('paste' + ns, proxy(that._search, that)).on('input' + ns, proxy(that._search, that)).on('focus' + ns, proxy(that._inputFocus, that)).on('focusout' + ns, proxy(that._inputFocusout, that));\n                    that._clear.on('click' + ns, proxy(that._clearClick, that));\n                    input.removeAttr(DISABLED).removeAttr(READONLY).attr(ARIA_DISABLED, false);\n                    tagList.on(MOUSEENTER, LI, function () {\n                        $(this).addClass(HOVERCLASS);\n                    }).on(MOUSELEAVE, LI, function () {\n                        $(this).removeClass(HOVERCLASS);\n                    }).on(CLICK, 'li.k-button .k-select', proxy(that._tagListClick, that));\n                } else {\n                    if (disable) {\n                        wrapper.addClass(STATEDISABLED);\n                    } else {\n                        wrapper.removeClass(STATEDISABLED);\n                    }\n                    input.attr(DISABLED, disable).attr(READONLY, readonly).attr(ARIA_DISABLED, disable);\n                }\n            },\n            _close: function () {\n                var that = this;\n                if (that.options.autoClose) {\n                    that.close();\n                } else {\n                    that.popup.position();\n                }\n            },\n            _filterSource: function (filter, force) {\n                if (!force) {\n                    force = this._retrieveData;\n                }\n                this._retrieveData = false;\n                List.fn._filterSource.call(this, filter, force);\n            },\n            close: function () {\n                this._activeItem = null;\n                this.input.removeAttr('aria-activedescendant');\n                this.popup.close();\n            },\n            open: function () {\n                var that = this;\n                if (that._request) {\n                    that._retrieveData = false;\n                }\n                if (that._retrieveData || !that.listView.bound() || that._state === ACCEPT) {\n                    that._open = true;\n                    that._state = REBIND;\n                    that.listView.skipUpdate(true);\n                    that.persistTagList = that._initialOpen && !that.listView.bound() ? false : true;\n                    that._filterSource();\n                    that._focusItem();\n                } else if (that._allowOpening()) {\n                    if (that._initialOpen && !that.options.autoBind && !that.options.virtual && that.options.value && !$.isPlainObject(that.options.value[0])) {\n                        that.value(that._initialValues);\n                    }\n                    that.popup._hovered = true;\n                    that._initialOpen = false;\n                    that.popup.open();\n                    that._focusItem();\n                }\n            },\n            toggle: function (toggle) {\n                toggle = toggle !== undefined ? toggle : !this.popup.visible();\n                this[toggle ? OPEN : CLOSE]();\n            },\n            refresh: function () {\n                this.listView.refresh();\n            },\n            _listBound: function () {\n                var that = this;\n                var data = that.dataSource.flatView();\n                var skip = that.listView.skip();\n                that._render(data);\n                that._renderFooter();\n                that._renderNoData();\n                that._toggleNoData(!data.length);\n                that._resizePopup();\n                if (that._open) {\n                    that._open = false;\n                    that.toggle(that._allowOpening());\n                }\n                that.popup.position();\n                if (that.options.highlightFirst && (skip === undefined || skip === 0)) {\n                    that.listView.focusFirst();\n                }\n                if (that._touchScroller) {\n                    that._touchScroller.reset();\n                }\n                that._hideBusy();\n                that._makeUnselectable();\n                that.trigger('dataBound');\n            },\n            _inputValue: function () {\n                var that = this;\n                var inputValue = that.input.val();\n                if (that.options.placeholder === inputValue) {\n                    inputValue = '';\n                }\n                return inputValue;\n            },\n            value: function (value) {\n                var that = this;\n                var listView = that.listView;\n                var oldValue = listView.value().slice();\n                var maxSelectedItems = that.options.maxSelectedItems;\n                var clearFilters = listView.bound() && listView.isFiltered();\n                if (value === undefined) {\n                    return oldValue;\n                }\n                that.persistTagList = false;\n                that.requireValueMapper(that.options, value);\n                value = that._normalizeValues(value);\n                if (maxSelectedItems !== null && value.length > maxSelectedItems) {\n                    value = value.slice(0, maxSelectedItems);\n                }\n                if (clearFilters) {\n                    that._clearFilter();\n                }\n                listView.value(value);\n                that._old = listView.value();\n                if (!clearFilters) {\n                    that._fetchData();\n                }\n                that._toggleCloseVisibility();\n            },\n            _preselect: function (data, value) {\n                var that = this;\n                if (!isArray(data) && !(data instanceof kendo.data.ObservableArray)) {\n                    data = [data];\n                }\n                if ($.isPlainObject(data[0]) || data[0] instanceof kendo.data.ObservableObject || !that.options.dataValueField) {\n                    that.dataSource.data(data);\n                    that.value(value || that._initialValues);\n                    that._retrieveData = true;\n                }\n            },\n            _setOption: function (value, selected) {\n                var option = this.element[0].children[this._optionsMap[value]];\n                if (option) {\n                    option.selected = selected;\n                }\n            },\n            _fetchData: function () {\n                var that = this;\n                var hasItems = !!that.dataSource.view().length;\n                var isEmptyArray = that.listView.value().length === 0;\n                if (isEmptyArray || that._request) {\n                    return;\n                }\n                if (that._retrieveData || !that._fetch && !hasItems) {\n                    that._fetch = true;\n                    that._retrieveData = false;\n                    that.dataSource.read().done(function () {\n                        that._fetch = false;\n                    });\n                }\n            },\n            _isBound: function () {\n                return this.listView.bound() && !this._retrieveData;\n            },\n            _dataSource: function () {\n                var that = this, element = that.element, options = that.options, dataSource = options.dataSource || {};\n                dataSource = isArray(dataSource) ? { data: dataSource } : dataSource;\n                dataSource.select = element;\n                dataSource.fields = [\n                    { field: options.dataTextField },\n                    { field: options.dataValueField }\n                ];\n                if (that.dataSource && that._refreshHandler) {\n                    that._unbindDataSource();\n                } else {\n                    that._progressHandler = proxy(that._showBusy, that);\n                    that._errorHandler = proxy(that._hideBusy, that);\n                }\n                that.dataSource = kendo.data.DataSource.create(dataSource).bind(PROGRESS, that._progressHandler).bind('error', that._errorHandler);\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        setTimeout(function () {\n                            that.value(that._initialValues);\n                            that._placeholder();\n                        });\n                    };\n                    that._form = form.on('reset', that._resetHandler);\n                }\n            },\n            _initValue: function () {\n                var value = this.options.value || this.element.val();\n                this._old = this._initialValues = this._normalizeValues(value);\n            },\n            _normalizeValues: function (value) {\n                var that = this;\n                if (value === null) {\n                    value = [];\n                } else if (value && $.isPlainObject(value)) {\n                    value = [that._value(value)];\n                } else if (value && $.isPlainObject(value[0])) {\n                    value = $.map(value, function (dataItem) {\n                        return that._value(dataItem);\n                    });\n                } else if (!isArray(value) && !(value instanceof ObservableArray)) {\n                    value = [value];\n                } else if (isArray(value)) {\n                    value = value.slice();\n                }\n                return value;\n            },\n            _change: function () {\n                var that = this, value = that.value();\n                if (!compare(value, that._old)) {\n                    that._old = value.slice();\n                    that.trigger(CHANGE);\n                    that.element.trigger(CHANGE);\n                }\n                that._toggleCloseVisibility();\n            },\n            _click: function (e) {\n                var that = this;\n                var item = e.item;\n                e.preventDefault();\n                that._select(item).done(function () {\n                    that._activeItem = item;\n                    that._change();\n                    that._close();\n                });\n            },\n            _getActiveItem: function () {\n                return this._activeItem || $(this.listView.items()[this._getSelectedIndices().length - 1]) || this.listView.focus();\n            },\n            _getSelectedIndices: function () {\n                return this.listView._selectedIndices || this.listView._selectedIndexes;\n            },\n            _keydown: function (e) {\n                var that = this;\n                var key = e.keyCode;\n                var tag = that._currentTag;\n                var listView = that.listView;\n                var hasValue = that.input.val();\n                var isRtl = kendo.support.isRtl(that.wrapper);\n                var visible = that.popup.visible();\n                var dir = 0;\n                var activeItemIdx;\n                if (key === keys.DOWN) {\n                    e.preventDefault();\n                    if (!visible) {\n                        that.open();\n                        if (!listView.focus()) {\n                            listView.focusFirst();\n                        }\n                        return;\n                    }\n                    if (listView.focus()) {\n                        if (!that._activeItem && e.shiftKey) {\n                            that._activeItem = listView.focus();\n                            dir = -1;\n                        }\n                        activeItemIdx = listView.getElementIndex(that._getActiveItem()[0]);\n                        listView.focusNext();\n                        if (!listView.focus()) {\n                            listView.focusLast();\n                        } else {\n                            if (e.shiftKey) {\n                                that._selectRange(activeItemIdx, listView.getElementIndex(listView.focus()[0]) + dir);\n                            }\n                        }\n                    } else {\n                        listView.focusFirst();\n                    }\n                } else if (key === keys.UP) {\n                    if (visible) {\n                        if (!that._activeItem && e.shiftKey) {\n                            that._activeItem = listView.focus();\n                            dir = 1;\n                        }\n                        activeItemIdx = listView.getElementIndex(that._getActiveItem()[0]);\n                        listView.focusPrev();\n                        if (!listView.focus()) {\n                            that.close();\n                        } else {\n                            if (e.shiftKey) {\n                                that._selectRange(activeItemIdx, listView.getElementIndex(listView.focus()[0]) + dir);\n                            }\n                        }\n                    }\n                    e.preventDefault();\n                } else if (key === keys.LEFT && !isRtl || key === keys.RIGHT && isRtl) {\n                    if (!hasValue) {\n                        tag = tag ? tag.prev() : $(that.tagList[0].lastChild);\n                        if (tag[0]) {\n                            that.currentTag(tag);\n                        }\n                    }\n                } else if (key === keys.RIGHT && !isRtl || key === keys.LEFT && isRtl) {\n                    if (!hasValue && tag) {\n                        tag = tag.next();\n                        that.currentTag(tag[0] ? tag : null);\n                    }\n                } else if (e.ctrlKey && !e.altKey && key === keys.A && visible) {\n                    if (this._getSelectedIndices().length === listView.items().length) {\n                        that._activeItem = null;\n                    }\n                    if (listView.items().length) {\n                        that._selectRange(0, listView.items().length - 1);\n                    }\n                } else if (key === keys.ENTER && visible) {\n                    if (!listView.focus()) {\n                        return;\n                    }\n                    e.preventDefault();\n                    if (listView.focus().hasClass(SELECTEDCLASS)) {\n                        that._close();\n                        return;\n                    }\n                    that._select(listView.focus()).done(function () {\n                        that._change();\n                        that._close();\n                    });\n                } else if (key === keys.SPACEBAR && e.ctrlKey && visible) {\n                    if (that._activeItem && listView.focus() && listView.focus()[0] === that._activeItem[0]) {\n                        that._activeItem = null;\n                    }\n                    if (!$(listView.focus()).hasClass(SELECTEDCLASS)) {\n                        that._activeItem = listView.focus();\n                    }\n                    that._select(listView.focus()).done(function () {\n                        that._change();\n                    });\n                    e.preventDefault();\n                } else if (key === keys.SPACEBAR && e.shiftKey && visible) {\n                    var activeIndex = listView.getElementIndex(that._getActiveItem());\n                    var currentIndex = listView.getElementIndex(listView.focus());\n                    if (activeIndex !== undefined && currentIndex !== undefined) {\n                        that._selectRange(activeIndex, currentIndex);\n                    }\n                    e.preventDefault();\n                } else if (key === keys.ESC) {\n                    if (visible) {\n                        e.preventDefault();\n                    } else {\n                        that.tagList.children().each(function (index, tag) {\n                            that._removeTag($(tag), false);\n                        });\n                        that.trigger(CHANGE);\n                    }\n                    that.close();\n                } else if (key === keys.HOME) {\n                    if (visible) {\n                        if (!listView.focus()) {\n                            that.close();\n                        } else {\n                            if (e.ctrlKey && e.shiftKey) {\n                                that._selectRange(listView.getElementIndex(listView.focus()[0]), 0);\n                            }\n                            listView.focusFirst();\n                        }\n                    } else if (!hasValue) {\n                        tag = that.tagList[0].firstChild;\n                        if (tag) {\n                            that.currentTag($(tag));\n                        }\n                    }\n                } else if (key === keys.END) {\n                    if (visible) {\n                        if (!listView.focus()) {\n                            that.close();\n                        } else {\n                            if (e.ctrlKey && e.shiftKey) {\n                                that._selectRange(listView.getElementIndex(listView.focus()[0]), listView.element.children().length - 1);\n                            }\n                            listView.focusLast();\n                        }\n                    } else if (!hasValue) {\n                        tag = that.tagList[0].lastChild;\n                        if (tag) {\n                            that.currentTag($(tag));\n                        }\n                    }\n                } else if ((key === keys.DELETE || key === keys.BACKSPACE) && !hasValue) {\n                    that._state = ACCEPT;\n                    if (that.options.tagMode === 'single') {\n                        listView.value([]);\n                        that._change();\n                        that._close();\n                        return;\n                    }\n                    if (key === keys.BACKSPACE && !tag) {\n                        tag = $(that.tagList[0].lastChild);\n                    }\n                    if (tag && tag[0]) {\n                        that._removeTag(tag, true);\n                    }\n                } else if (that.popup.visible() && (key === keys.PAGEDOWN || key === keys.PAGEUP)) {\n                    e.preventDefault();\n                    var direction = key === keys.PAGEDOWN ? 1 : -1;\n                    listView.scrollWith(direction * listView.screenHeight());\n                } else {\n                    clearTimeout(that._typingTimeout);\n                    setTimeout(function () {\n                        that._scale();\n                    });\n                    that._search();\n                }\n            },\n            _hideBusy: function () {\n                var that = this;\n                clearTimeout(that._busy);\n                that.input.attr('aria-busy', false);\n                that._loading.addClass(HIDDENCLASS);\n                that._request = false;\n                that._busy = null;\n                that._toggleCloseVisibility();\n            },\n            _showBusyHandler: function () {\n                this.input.attr('aria-busy', true);\n                this._loading.removeClass(HIDDENCLASS);\n                this._hideClear();\n            },\n            _showBusy: function () {\n                var that = this;\n                that._request = true;\n                if (that._busy) {\n                    return;\n                }\n                that._busy = setTimeout(proxy(that._showBusyHandler, that), 100);\n            },\n            _placeholder: function (show, skipCaret) {\n                var that = this;\n                var input = that.input;\n                var active = activeElement();\n                var placeholder = that.options.placeholder;\n                var inputValue = input.val();\n                var isActive = input[0] === active;\n                var caretPos = inputValue.length;\n                if (!isActive || that.options.autoClose || inputValue === placeholder) {\n                    caretPos = 0;\n                    inputValue = '';\n                }\n                if (show === undefined) {\n                    show = false;\n                    if (input[0] !== active) {\n                        show = !that.listView.selectedDataItems()[0];\n                    }\n                }\n                that._prev = inputValue;\n                input.toggleClass('k-readonly', show).val(show ? placeholder : inputValue);\n                if (isActive && !skipCaret) {\n                    kendo.caret(input[0], caretPos, caretPos);\n                }\n                that._scale();\n            },\n            _scale: function () {\n                var that = this, wrapper = that.wrapper.find('.k-multiselect-wrap'), wrapperWidth = wrapper.width(), span = that._span.text(that.input.val()), textWidth;\n                if (!wrapper.is(':visible')) {\n                    span.appendTo(document.documentElement);\n                    wrapperWidth = textWidth = span.width() + 25;\n                    span.appendTo(wrapper);\n                } else {\n                    textWidth = span.width() + 25;\n                }\n                that.input.width(textWidth > wrapperWidth ? wrapperWidth : textWidth);\n            },\n            _option: function (dataValue, dataText, selected) {\n                var option = '<option';\n                if (dataValue !== undefined) {\n                    dataValue += '';\n                    if (dataValue.indexOf('\"') !== -1) {\n                        dataValue = dataValue.replace(quotRegExp, '&quot;');\n                    }\n                    option += ' value=\"' + dataValue + '\"';\n                }\n                if (selected) {\n                    option += ' selected';\n                }\n                option += '>';\n                if (dataText !== undefined) {\n                    option += kendo.htmlEncode(dataText);\n                }\n                return option += '</option>';\n            },\n            _render: function (data) {\n                var selectedItems = this.listView.selectedDataItems();\n                var values = this.listView.value();\n                var length = data.length;\n                var selectedIndex;\n                var options = '';\n                var dataItem;\n                var value;\n                var idx;\n                if (values.length !== selectedItems.length) {\n                    selectedItems = this._buildSelectedItems(values);\n                }\n                var custom = {};\n                var optionsMap = {};\n                for (idx = 0; idx < length; idx++) {\n                    dataItem = data[idx];\n                    value = this._value(dataItem);\n                    selectedIndex = this._selectedItemIndex(value, selectedItems);\n                    if (selectedIndex !== -1) {\n                        selectedItems.splice(selectedIndex, 1);\n                    }\n                    optionsMap[value] = idx;\n                    options += this._option(value, this._text(dataItem), selectedIndex !== -1);\n                }\n                if (selectedItems.length) {\n                    for (idx = 0; idx < selectedItems.length; idx++) {\n                        dataItem = selectedItems[idx];\n                        value = this._value(dataItem);\n                        custom[value] = length;\n                        optionsMap[value] = length;\n                        length += 1;\n                        options += this._option(value, this._text(dataItem), true);\n                    }\n                }\n                this._customOptions = custom;\n                this._optionsMap = optionsMap;\n                this.element.html(options);\n            },\n            _buildSelectedItems: function (values) {\n                var valueField = this.options.dataValueField;\n                var textField = this.options.dataTextField;\n                var result = [];\n                var item;\n                for (var idx = 0; idx < values.length; idx++) {\n                    item = {};\n                    item[valueField] = values[idx];\n                    item[textField] = values[idx];\n                    result.push(item);\n                }\n                return result;\n            },\n            _selectedItemIndex: function (value, selectedItems) {\n                var valueGetter = this._value;\n                var idx = 0;\n                for (; idx < selectedItems.length; idx++) {\n                    if (value === valueGetter(selectedItems[idx])) {\n                        return idx;\n                    }\n                }\n                return -1;\n            },\n            _search: function () {\n                var that = this;\n                that._typingTimeout = setTimeout(function () {\n                    var value = that._inputValue();\n                    if (that._prev !== value) {\n                        that._prev = value;\n                        that.search(value);\n                        that._toggleCloseVisibility();\n                    }\n                }, that.options.delay);\n            },\n            _toggleCloseVisibility: function () {\n                if (this.value().length || this.input.val() && this.input.val() !== this.options.placeholder) {\n                    this._showClear();\n                } else {\n                    this._hideClear();\n                }\n            },\n            _allowOpening: function () {\n                return this._allowSelection() && List.fn._allowOpening.call(this);\n            },\n            _allowSelection: function () {\n                var max = this.options.maxSelectedItems;\n                return max === null || max > this.listView.value().length;\n            },\n            _angularTagItems: function (cmd) {\n                var that = this;\n                that.angular(cmd, function () {\n                    return {\n                        elements: that.tagList[0].children,\n                        data: $.map(that.dataItems(), function (dataItem) {\n                            return { dataItem: dataItem };\n                        })\n                    };\n                });\n            },\n            updatePersistTagList: function (added, removed) {\n                if (this.persistTagList.added && this.persistTagList.added.length === removed.length && this.persistTagList.removed && this.persistTagList.removed.length === added.length) {\n                    this.persistTagList = false;\n                } else {\n                    this.persistTagList = {\n                        added: added,\n                        removed: removed\n                    };\n                }\n            },\n            _selectValue: function (added, removed) {\n                var that = this;\n                var values = that.value();\n                var total = that.dataSource.total();\n                var tagList = that.tagList;\n                var getter = that._value;\n                var removedItem;\n                var addedItem;\n                var idx;\n                if (this.persistTagList) {\n                    this.updatePersistTagList(added, removed);\n                    return;\n                }\n                that._angularTagItems('cleanup');\n                if (that.options.tagMode === 'multiple') {\n                    for (idx = removed.length - 1; idx > -1; idx--) {\n                        removedItem = removed[idx];\n                        if (tagList.children().length) {\n                            tagList[0].removeChild(tagList[0].children[removedItem.position]);\n                            that._setOption(getter(removedItem.dataItem), false);\n                        }\n                    }\n                    for (idx = 0; idx < added.length; idx++) {\n                        addedItem = added[idx];\n                        tagList.append(that.tagTemplate(addedItem.dataItem));\n                        that._setOption(getter(addedItem.dataItem), true);\n                    }\n                } else {\n                    if (!that._maxTotal || that._maxTotal < total) {\n                        that._maxTotal = total;\n                    }\n                    tagList.html('');\n                    if (values.length) {\n                        tagList.append(that.tagTemplate({\n                            values: values,\n                            dataItems: that.dataItems(),\n                            maxTotal: that._maxTotal,\n                            currentTotal: total\n                        }));\n                    }\n                    for (idx = removed.length - 1; idx > -1; idx--) {\n                        that._setOption(getter(removed[idx].dataItem), false);\n                    }\n                    for (idx = 0; idx < added.length; idx++) {\n                        that._setOption(getter(added[idx].dataItem), true);\n                    }\n                }\n                that._angularTagItems('compile');\n                that._placeholder();\n            },\n            _select: function (candidate) {\n                var resolved = $.Deferred().resolve();\n                if (!candidate) {\n                    return resolved;\n                }\n                var that = this;\n                var listView = that.listView;\n                var dataItem = listView.dataItemByIndex(listView.getElementIndex(candidate));\n                var isSelected = candidate.hasClass('k-state-selected');\n                if (that._state === REBIND) {\n                    that._state = '';\n                }\n                if (!that._allowSelection() && !isSelected) {\n                    return resolved;\n                }\n                if (that.trigger(isSelected ? DESELECT : SELECT, {\n                        dataItem: dataItem,\n                        item: candidate\n                    })) {\n                    that._close();\n                    return resolved;\n                }\n                that.persistTagList = false;\n                return listView.select(candidate).done(function () {\n                    that._placeholder();\n                    if (that._state === FILTER) {\n                        that._state = ACCEPT;\n                        listView.skipUpdate(true);\n                    }\n                });\n            },\n            _selectRange: function (startIndex, endIndex) {\n                var that = this;\n                var listView = this.listView;\n                var maxSelectedItems = this.options.maxSelectedItems;\n                var indices = this._getSelectedIndices().slice();\n                var indicesToSelect = [];\n                var i;\n                var selectIndices = function (indices) {\n                    listView.select(indices).done(function () {\n                        indices.forEach(function (index) {\n                            var dataItem = listView.dataItemByIndex(index);\n                            var candidate = listView.element.children()[index];\n                            var isSelected = $(candidate).hasClass('k-state-selected');\n                            that.trigger(isSelected ? SELECT : DESELECT, {\n                                dataItem: dataItem,\n                                item: $(candidate)\n                            });\n                        });\n                        that._change();\n                    });\n                };\n                if (indices.length - 1 === endIndex - startIndex) {\n                    return selectIndices(indices);\n                }\n                if (startIndex < endIndex) {\n                    for (i = startIndex; i <= endIndex; i++) {\n                        indicesToSelect.push(i);\n                    }\n                } else {\n                    for (i = startIndex; i >= endIndex; i--) {\n                        indicesToSelect.push(i);\n                    }\n                }\n                if (maxSelectedItems !== null && indicesToSelect.length > maxSelectedItems) {\n                    indicesToSelect = indicesToSelect.slice(0, maxSelectedItems);\n                }\n                for (i = 0; i < indicesToSelect.length; i++) {\n                    var index = indicesToSelect[i];\n                    if (this._getSelectedIndices().indexOf(index) == -1) {\n                        indices.push(index);\n                    } else {\n                        indices.splice(indices.indexOf(index), 1);\n                    }\n                }\n                if (!indices.length) {\n                    return;\n                }\n                that.persistTagList = false;\n                return selectIndices(indices);\n            },\n            _input: function () {\n                var that = this;\n                var element = that.element;\n                var accessKey = element[0].accessKey;\n                var input = that._innerWrapper.children('input.k-input');\n                if (!input[0]) {\n                    input = $('<input class=\"k-input\" style=\"width: 25px\" />').appendTo(that._innerWrapper);\n                }\n                element.removeAttr('accesskey');\n                that._focused = that.input = input.attr({\n                    'accesskey': accessKey,\n                    'autocomplete': 'off',\n                    'role': 'listbox',\n                    'title': element[0].title,\n                    'aria-expanded': false\n                });\n            },\n            _tagList: function () {\n                var that = this, tagList = that._innerWrapper.children('ul');\n                if (!tagList[0]) {\n                    tagList = $('<ul role=\"listbox\" unselectable=\"on\" class=\"k-reset\"/>').appendTo(that._innerWrapper);\n                }\n                that.tagList = tagList;\n            },\n            _tagTemplate: function () {\n                var that = this;\n                var options = that.options;\n                var tagTemplate = options.tagTemplate;\n                var hasDataSource = options.dataSource;\n                var isMultiple = options.tagMode === 'multiple';\n                var defaultTemplate;\n                if (that.element[0].length && !hasDataSource) {\n                    options.dataTextField = options.dataTextField || 'text';\n                    options.dataValueField = options.dataValueField || 'value';\n                }\n                defaultTemplate = isMultiple ? kendo.template('#:' + kendo.expr(options.dataTextField, 'data') + '#', { useWithBlock: false }) : kendo.template('#:values.length# item(s) selected');\n                that.tagTextTemplate = tagTemplate = tagTemplate ? kendo.template(tagTemplate) : defaultTemplate;\n                that.tagTemplate = function (data) {\n                    return '<li class=\"k-button\" unselectable=\"on\"><span unselectable=\"on\">' + tagTemplate(data) + '</span><span unselectable=\"on\" aria-label=\"' + (isMultiple ? 'delete' : 'open') + '\" class=\"k-select\"><span class=\"k-icon ' + (isMultiple ? 'k-i-close' : 'k-i-arrow-60-down') + '\">' + '</span></span></li>';\n                };\n            },\n            _loader: function () {\n                this._loading = $('<span class=\"k-icon k-i-loading ' + HIDDENCLASS + '\"></span>').insertAfter(this.input);\n            },\n            _clearButton: function () {\n                List.fn._clearButton.call(this);\n                if (this.options.clearButton) {\n                    this._clear.insertAfter(this.input);\n                    this.wrapper.addClass('k-multiselect-clearable');\n                }\n            },\n            _textContainer: function () {\n                var computedStyles = kendo.getComputedStyles(this.input[0], styles);\n                computedStyles.position = 'absolute';\n                computedStyles.visibility = 'hidden';\n                computedStyles.top = -3333;\n                computedStyles.left = -3333;\n                this._span = $('<span/>').css(computedStyles).appendTo(this.wrapper);\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, wrapper = element.parent('span.k-multiselect');\n                if (!wrapper[0]) {\n                    wrapper = element.wrap('<div class=\"k-widget k-multiselect\" unselectable=\"on\" />').parent();\n                    wrapper[0].style.cssText = element[0].style.cssText;\n                    wrapper[0].title = element[0].title;\n                    $('<div class=\"k-multiselect-wrap k-floatwrap\" unselectable=\"on\" />').insertBefore(element);\n                }\n                that.wrapper = wrapper.addClass(element[0].className).css('display', '');\n                that._innerWrapper = $(wrapper[0].firstChild);\n            }\n        });\n        function compare(a, b) {\n            var length;\n            if (a === null && b !== null || a !== null && b === null) {\n                return false;\n            }\n            length = a.length;\n            if (length !== b.length) {\n                return false;\n            }\n            while (length--) {\n                if (a[length] !== b[length]) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        ui.plugin(MultiSelect);\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.color', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'color',\n        name: 'Color utils',\n        category: 'framework',\n        advanced: true,\n        description: 'Color utilities used across components',\n        depends: ['core']\n    };\n    window.kendo = window.kendo || {};\n    var Class = kendo.Class;\n    var support = kendo.support;\n    var namedColors = {\n        aliceblue: 'f0f8ff',\n        antiquewhite: 'faebd7',\n        aqua: '00ffff',\n        aquamarine: '7fffd4',\n        azure: 'f0ffff',\n        beige: 'f5f5dc',\n        bisque: 'ffe4c4',\n        black: '000000',\n        blanchedalmond: 'ffebcd',\n        blue: '0000ff',\n        blueviolet: '8a2be2',\n        brown: 'a52a2a',\n        burlywood: 'deb887',\n        cadetblue: '5f9ea0',\n        chartreuse: '7fff00',\n        chocolate: 'd2691e',\n        coral: 'ff7f50',\n        cornflowerblue: '6495ed',\n        cornsilk: 'fff8dc',\n        crimson: 'dc143c',\n        cyan: '00ffff',\n        darkblue: '00008b',\n        darkcyan: '008b8b',\n        darkgoldenrod: 'b8860b',\n        darkgray: 'a9a9a9',\n        darkgrey: 'a9a9a9',\n        darkgreen: '006400',\n        darkkhaki: 'bdb76b',\n        darkmagenta: '8b008b',\n        darkolivegreen: '556b2f',\n        darkorange: 'ff8c00',\n        darkorchid: '9932cc',\n        darkred: '8b0000',\n        darksalmon: 'e9967a',\n        darkseagreen: '8fbc8f',\n        darkslateblue: '483d8b',\n        darkslategray: '2f4f4f',\n        darkslategrey: '2f4f4f',\n        darkturquoise: '00ced1',\n        darkviolet: '9400d3',\n        deeppink: 'ff1493',\n        deepskyblue: '00bfff',\n        dimgray: '696969',\n        dimgrey: '696969',\n        dodgerblue: '1e90ff',\n        firebrick: 'b22222',\n        floralwhite: 'fffaf0',\n        forestgreen: '228b22',\n        fuchsia: 'ff00ff',\n        gainsboro: 'dcdcdc',\n        ghostwhite: 'f8f8ff',\n        gold: 'ffd700',\n        goldenrod: 'daa520',\n        gray: '808080',\n        grey: '808080',\n        green: '008000',\n        greenyellow: 'adff2f',\n        honeydew: 'f0fff0',\n        hotpink: 'ff69b4',\n        indianred: 'cd5c5c',\n        indigo: '4b0082',\n        ivory: 'fffff0',\n        khaki: 'f0e68c',\n        lavender: 'e6e6fa',\n        lavenderblush: 'fff0f5',\n        lawngreen: '7cfc00',\n        lemonchiffon: 'fffacd',\n        lightblue: 'add8e6',\n        lightcoral: 'f08080',\n        lightcyan: 'e0ffff',\n        lightgoldenrodyellow: 'fafad2',\n        lightgray: 'd3d3d3',\n        lightgrey: 'd3d3d3',\n        lightgreen: '90ee90',\n        lightpink: 'ffb6c1',\n        lightsalmon: 'ffa07a',\n        lightseagreen: '20b2aa',\n        lightskyblue: '87cefa',\n        lightslategray: '778899',\n        lightslategrey: '778899',\n        lightsteelblue: 'b0c4de',\n        lightyellow: 'ffffe0',\n        lime: '00ff00',\n        limegreen: '32cd32',\n        linen: 'faf0e6',\n        magenta: 'ff00ff',\n        maroon: '800000',\n        mediumaquamarine: '66cdaa',\n        mediumblue: '0000cd',\n        mediumorchid: 'ba55d3',\n        mediumpurple: '9370d8',\n        mediumseagreen: '3cb371',\n        mediumslateblue: '7b68ee',\n        mediumspringgreen: '00fa9a',\n        mediumturquoise: '48d1cc',\n        mediumvioletred: 'c71585',\n        midnightblue: '191970',\n        mintcream: 'f5fffa',\n        mistyrose: 'ffe4e1',\n        moccasin: 'ffe4b5',\n        navajowhite: 'ffdead',\n        navy: '000080',\n        oldlace: 'fdf5e6',\n        olive: '808000',\n        olivedrab: '6b8e23',\n        orange: 'ffa500',\n        orangered: 'ff4500',\n        orchid: 'da70d6',\n        palegoldenrod: 'eee8aa',\n        palegreen: '98fb98',\n        paleturquoise: 'afeeee',\n        palevioletred: 'd87093',\n        papayawhip: 'ffefd5',\n        peachpuff: 'ffdab9',\n        peru: 'cd853f',\n        pink: 'ffc0cb',\n        plum: 'dda0dd',\n        powderblue: 'b0e0e6',\n        purple: '800080',\n        red: 'ff0000',\n        rosybrown: 'bc8f8f',\n        royalblue: '4169e1',\n        saddlebrown: '8b4513',\n        salmon: 'fa8072',\n        sandybrown: 'f4a460',\n        seagreen: '2e8b57',\n        seashell: 'fff5ee',\n        sienna: 'a0522d',\n        silver: 'c0c0c0',\n        skyblue: '87ceeb',\n        slateblue: '6a5acd',\n        slategray: '708090',\n        slategrey: '708090',\n        snow: 'fffafa',\n        springgreen: '00ff7f',\n        steelblue: '4682b4',\n        tan: 'd2b48c',\n        teal: '008080',\n        thistle: 'd8bfd8',\n        tomato: 'ff6347',\n        turquoise: '40e0d0',\n        violet: 'ee82ee',\n        wheat: 'f5deb3',\n        white: 'ffffff',\n        whitesmoke: 'f5f5f5',\n        yellow: 'ffff00',\n        yellowgreen: '9acd32'\n    };\n    var browser = support.browser;\n    var matchNamedColor = function (color) {\n        var colorNames = Object.keys(namedColors);\n        colorNames.push('transparent');\n        var regexp = new RegExp('^(' + colorNames.join('|') + ')(\\\\W|$)', 'i');\n        matchNamedColor = function (color) {\n            return regexp.exec(color);\n        };\n        return regexp.exec(color);\n    };\n    var BaseColor = Class.extend({\n        init: function () {\n        },\n        toHSV: function () {\n            return this;\n        },\n        toRGB: function () {\n            return this;\n        },\n        toHex: function () {\n            return this.toBytes().toHex();\n        },\n        toBytes: function () {\n            return this;\n        },\n        toCss: function () {\n            return '#' + this.toHex();\n        },\n        toCssRgba: function () {\n            var rgb = this.toBytes();\n            return 'rgba(' + rgb.r + ', ' + rgb.g + ', ' + rgb.b + ', ' + parseFloat(Number(this.a).toFixed(3)) + ')';\n        },\n        toDisplay: function () {\n            if (browser.msie && browser.version < 9) {\n                return this.toCss();\n            }\n            return this.toCssRgba();\n        },\n        equals: function (c) {\n            return c === this || c !== null && this.toCssRgba() === parseColor(c).toCssRgba();\n        },\n        diff: function (other) {\n            if (other === null) {\n                return NaN;\n            }\n            var c1 = this.toBytes();\n            var c2 = other.toBytes();\n            return Math.sqrt(Math.pow((c1.r - c2.r) * 0.3, 2) + Math.pow((c1.g - c2.g) * 0.59, 2) + Math.pow((c1.b - c2.b) * 0.11, 2));\n        },\n        clone: function () {\n            var c = this.toBytes();\n            if (c === this) {\n                c = new Bytes(c.r, c.g, c.b, c.a);\n            }\n            return c;\n        }\n    });\n    var RGB = BaseColor.extend({\n        init: function (r, g, b, a) {\n            BaseColor.fn.init.call(this);\n            this.r = r;\n            this.g = g;\n            this.b = b;\n            this.a = a;\n        },\n        toHSV: function () {\n            var ref = this;\n            var r = ref.r;\n            var g = ref.g;\n            var b = ref.b;\n            var min = Math.min(r, g, b);\n            var max = Math.max(r, g, b);\n            var delta = max - min;\n            var v = max;\n            var h, s;\n            if (delta === 0) {\n                return new HSV(0, 0, v, this.a);\n            }\n            if (max !== 0) {\n                s = delta / max;\n                if (r === max) {\n                    h = (g - b) / delta;\n                } else if (g === max) {\n                    h = 2 + (b - r) / delta;\n                } else {\n                    h = 4 + (r - g) / delta;\n                }\n                h *= 60;\n                if (h < 0) {\n                    h += 360;\n                }\n            } else {\n                s = 0;\n                h = -1;\n            }\n            return new HSV(h, s, v, this.a);\n        },\n        toHSL: function () {\n            var ref = this;\n            var r = ref.r;\n            var g = ref.g;\n            var b = ref.b;\n            var max = Math.max(r, g, b);\n            var min = Math.min(r, g, b);\n            var h, s, l = (max + min) / 2;\n            if (max === min) {\n                h = s = 0;\n            } else {\n                var d = max - min;\n                s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n                switch (max) {\n                case r:\n                    h = (g - b) / d + (g < b ? 6 : 0);\n                    break;\n                case g:\n                    h = (b - r) / d + 2;\n                    break;\n                case b:\n                    h = (r - g) / d + 4;\n                    break;\n                default:\n                    break;\n                }\n                h *= 60;\n                s *= 100;\n                l *= 100;\n            }\n            return new HSL(h, s, l, this.a);\n        },\n        toBytes: function () {\n            return new Bytes(this.r * 255, this.g * 255, this.b * 255, this.a);\n        }\n    });\n    var Bytes = RGB.extend({\n        init: function (r, g, b, a) {\n            RGB.fn.init.call(this, Math.round(r), Math.round(g), Math.round(b), a);\n        },\n        toRGB: function () {\n            return new RGB(this.r / 255, this.g / 255, this.b / 255, this.a);\n        },\n        toHSV: function () {\n            return this.toRGB().toHSV();\n        },\n        toHSL: function () {\n            return this.toRGB().toHSL();\n        },\n        toHex: function () {\n            return hex(this.r, 2) + hex(this.g, 2) + hex(this.b, 2);\n        },\n        toBytes: function () {\n            return this;\n        }\n    });\n    function hex(n, width, pad) {\n        if (pad === void 0) {\n            pad = '0';\n        }\n        var result = n.toString(16);\n        while (width > result.length) {\n            result = pad + result;\n        }\n        return result;\n    }\n    var HSV = BaseColor.extend({\n        init: function (h, s, v, a) {\n            BaseColor.fn.init.call(this);\n            this.h = h;\n            this.s = s;\n            this.v = v;\n            this.a = a;\n        },\n        toRGB: function () {\n            var ref = this;\n            var h = ref.h;\n            var s = ref.s;\n            var v = ref.v;\n            var r, g, b;\n            if (s === 0) {\n                r = g = b = v;\n            } else {\n                h /= 60;\n                var i = Math.floor(h);\n                var f = h - i;\n                var p = v * (1 - s);\n                var q = v * (1 - s * f);\n                var t = v * (1 - s * (1 - f));\n                switch (i) {\n                case 0:\n                    r = v;\n                    g = t;\n                    b = p;\n                    break;\n                case 1:\n                    r = q;\n                    g = v;\n                    b = p;\n                    break;\n                case 2:\n                    r = p;\n                    g = v;\n                    b = t;\n                    break;\n                case 3:\n                    r = p;\n                    g = q;\n                    b = v;\n                    break;\n                case 4:\n                    r = t;\n                    g = p;\n                    b = v;\n                    break;\n                default:\n                    r = v;\n                    g = p;\n                    b = q;\n                    break;\n                }\n            }\n            return new RGB(r, g, b, this.a);\n        },\n        toHSL: function () {\n            return this.toRGB().toHSL();\n        },\n        toBytes: function () {\n            return this.toRGB().toBytes();\n        }\n    });\n    var HSL = BaseColor.extend({\n        init: function (h, s, l, a) {\n            BaseColor.fn.init.call(this);\n            this.h = h;\n            this.s = s;\n            this.l = l;\n            this.a = a;\n        },\n        toRGB: function () {\n            var ref = this;\n            var h = ref.h;\n            var s = ref.s;\n            var l = ref.l;\n            var r, g, b;\n            if (s === 0) {\n                r = g = b = l;\n            } else {\n                h /= 360;\n                s /= 100;\n                l /= 100;\n                var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n                var p = 2 * l - q;\n                r = hue2rgb(p, q, h + 1 / 3);\n                g = hue2rgb(p, q, h);\n                b = hue2rgb(p, q, h - 1 / 3);\n            }\n            return new RGB(r, g, b, this.a);\n        },\n        toHSV: function () {\n            return this.toRGB().toHSV();\n        },\n        toBytes: function () {\n            return this.toRGB().toBytes();\n        }\n    });\n    function hue2rgb(p, q, s) {\n        var t = s;\n        if (t < 0) {\n            t += 1;\n        }\n        if (t > 1) {\n            t -= 1;\n        }\n        if (t < 1 / 6) {\n            return p + (q - p) * 6 * t;\n        }\n        if (t < 1 / 2) {\n            return q;\n        }\n        if (t < 2 / 3) {\n            return p + (q - p) * (2 / 3 - t) * 6;\n        }\n        return p;\n    }\n    function parseColor(value, safe) {\n        var m, ret;\n        if (value == null || value === 'none') {\n            return null;\n        }\n        if (value instanceof BaseColor) {\n            return value;\n        }\n        var color = value.toLowerCase();\n        if (m = matchNamedColor(color)) {\n            if (m[1] === 'transparent') {\n                color = new RGB(1, 1, 1, 0);\n            } else {\n                color = parseColor(namedColors[m[1]], safe);\n            }\n            color.match = [m[1]];\n            return color;\n        }\n        if (m = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})\\b/i.exec(color)) {\n            ret = new Bytes(parseInt(m[1], 16), parseInt(m[2], 16), parseInt(m[3], 16), 1);\n        } else if (m = /^#?([0-9a-f])([0-9a-f])([0-9a-f])\\b/i.exec(color)) {\n            ret = new Bytes(parseInt(m[1] + m[1], 16), parseInt(m[2] + m[2], 16), parseInt(m[3] + m[3], 16), 1);\n        } else if (m = /^rgb\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*\\)/.exec(color)) {\n            ret = new Bytes(parseInt(m[1], 10), parseInt(m[2], 10), parseInt(m[3], 10), 1);\n        } else if (m = /^rgba\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9.]+)\\s*\\)/.exec(color)) {\n            ret = new Bytes(parseInt(m[1], 10), parseInt(m[2], 10), parseInt(m[3], 10), parseFloat(m[4]));\n        } else if (m = /^rgb\\(\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*\\)/.exec(color)) {\n            ret = new RGB(parseFloat(m[1]) / 100, parseFloat(m[2]) / 100, parseFloat(m[3]) / 100, 1);\n        } else if (m = /^rgba\\(\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9.]+)\\s*\\)/.exec(color)) {\n            ret = new RGB(parseFloat(m[1]) / 100, parseFloat(m[2]) / 100, parseFloat(m[3]) / 100, parseFloat(m[4]));\n        }\n        if (ret) {\n            ret.match = m;\n        } else if (!safe) {\n            throw new Error('Cannot parse color: ' + color);\n        }\n        return ret;\n    }\n    var Color = Class.extend({\n        init: function (value) {\n            var this$1 = this;\n            if (arguments.length === 1) {\n                var formats = Color.formats;\n                var resolvedColor = this.resolveColor(value);\n                for (var idx = 0; idx < formats.length; idx++) {\n                    var formatRegex = formats[idx].re;\n                    var processor = formats[idx].process;\n                    var parts = formatRegex.exec(resolvedColor);\n                    if (parts) {\n                        var channels = processor(parts);\n                        this$1.r = channels[0];\n                        this$1.g = channels[1];\n                        this$1.b = channels[2];\n                    }\n                }\n            } else {\n                this.r = arguments[0];\n                this.g = arguments[1];\n                this.b = arguments[2];\n            }\n            this.r = this.normalizeByte(this.r);\n            this.g = this.normalizeByte(this.g);\n            this.b = this.normalizeByte(this.b);\n        },\n        toHex: function () {\n            var pad = this.padDigit;\n            var r = this.r.toString(16);\n            var g = this.g.toString(16);\n            var b = this.b.toString(16);\n            return '#' + pad(r) + pad(g) + pad(b);\n        },\n        resolveColor: function (value) {\n            var color = value || 'black';\n            if (color.charAt(0) === '#') {\n                color = color.substr(1, 6);\n            }\n            color = color.replace(/ /g, '');\n            color = color.toLowerCase();\n            color = Color.namedColors[color] || color;\n            return color;\n        },\n        normalizeByte: function (value) {\n            if (value < 0 || isNaN(value)) {\n                return 0;\n            }\n            return value > 255 ? 255 : value;\n        },\n        padDigit: function (value) {\n            return value.length === 1 ? '0' + value : value;\n        },\n        brightness: function (value) {\n            var round = Math.round;\n            this.r = round(this.normalizeByte(this.r * value));\n            this.g = round(this.normalizeByte(this.g * value));\n            this.b = round(this.normalizeByte(this.b * value));\n            return this;\n        },\n        percBrightness: function () {\n            return Math.sqrt(0.241 * this.r * this.r + 0.691 * this.g * this.g + 0.068 * this.b * this.b);\n        }\n    });\n    Color.fromBytes = function (r, g, b, a) {\n        return new Bytes(r, g, b, a != null ? a : 1);\n    };\n    Color.fromRGB = function (r, g, b, a) {\n        return new RGB(r, g, b, a != null ? a : 1);\n    };\n    Color.fromHSV = function (h, s, v, a) {\n        return new HSV(h, s, v, a != null ? a : 1);\n    };\n    Color.fromHSL = function (h, s, l, a) {\n        return new HSL(h, s, l, a != null ? a : 1);\n    };\n    Color.formats = [\n        {\n            re: /^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/,\n            process: function (parts) {\n                return [\n                    parseInt(parts[1], 10),\n                    parseInt(parts[2], 10),\n                    parseInt(parts[3], 10)\n                ];\n            }\n        },\n        {\n            re: /^(\\w{2})(\\w{2})(\\w{2})$/,\n            process: function (parts) {\n                return [\n                    parseInt(parts[1], 16),\n                    parseInt(parts[2], 16),\n                    parseInt(parts[3], 16)\n                ];\n            }\n        },\n        {\n            re: /^(\\w{1})(\\w{1})(\\w{1})$/,\n            process: function (parts) {\n                return [\n                    parseInt(parts[1] + parts[1], 16),\n                    parseInt(parts[2] + parts[2], 16),\n                    parseInt(parts[3] + parts[3], 16)\n                ];\n            }\n        }\n    ];\n    Color.namedColors = namedColors;\n    kendo.deepExtend(kendo, {\n        parseColor: parseColor,\n        Color: Color\n    });\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.slider', ['kendo.draganddrop'], f);\n}(function () {\n    var __meta__ = {\n        id: 'slider',\n        name: 'Slider',\n        category: 'web',\n        description: 'The Slider widget provides a rich input for selecting values or ranges of values.',\n        depends: ['draganddrop']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, Draggable = kendo.ui.Draggable, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, extend = $.extend, format = kendo.format, parse = kendo.parseFloat, proxy = $.proxy, isArray = $.isArray, math = Math, support = kendo.support, pointers = support.pointers, msPointers = support.msPointers, CHANGE = 'change', SLIDE = 'slide', NS = '.slider', MOUSE_DOWN = 'touchstart' + NS + ' mousedown' + NS, TRACK_MOUSE_DOWN = pointers ? 'pointerdown' + NS : msPointers ? 'MSPointerDown' + NS : MOUSE_DOWN, MOUSE_UP = 'touchend' + NS + ' mouseup' + NS, TRACK_MOUSE_UP = pointers ? 'pointerup' : msPointers ? 'MSPointerUp' + NS : MOUSE_UP, MOVE_SELECTION = 'moveSelection', KEY_DOWN = 'keydown' + NS, CLICK = 'click' + NS, MOUSE_OVER = 'mouseover' + NS, FOCUS = 'focus' + NS, BLUR = 'blur' + NS, DRAG_HANDLE = '.k-draghandle', TRACK_SELECTOR = '.k-slider-track', TICK_SELECTOR = '.k-tick', STATE_SELECTED = 'k-state-selected', STATE_FOCUSED = 'k-state-focused', STATE_DEFAULT = 'k-state-default', STATE_DISABLED = 'k-state-disabled', DISABLED = 'disabled', UNDEFINED = 'undefined', TABINDEX = 'tabindex', getTouches = kendo.getTouches;\n        var SliderBase = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                that._isHorizontal = options.orientation == 'horizontal';\n                that._isRtl = that._isHorizontal && kendo.support.isRtl(element);\n                that._position = that._isHorizontal ? 'left' : 'bottom';\n                that._sizeFn = that._isHorizontal ? 'width' : 'height';\n                that._outerSize = that._isHorizontal ? outerWidth : outerHeight;\n                options.tooltip.format = options.tooltip.enabled ? options.tooltip.format || '{0}' : '{0}';\n                if (options.smallStep <= 0) {\n                    throw new Error('Kendo UI Slider smallStep must be a positive number.');\n                }\n                that._createHtml();\n                that.wrapper = that.element.closest('.k-slider');\n                that._trackDiv = that.wrapper.find(TRACK_SELECTOR);\n                that._setTrackDivWidth();\n                that._maxSelection = that._trackDiv[that._sizeFn]();\n                that._sliderItemsInit();\n                that._reset();\n                that._tabindex(that.wrapper.find(DRAG_HANDLE));\n                that[options.enabled ? 'enable' : 'disable']();\n                var rtlDirectionSign = kendo.support.isRtl(that.wrapper) ? -1 : 1;\n                that._keyMap = {\n                    37: step(-1 * rtlDirectionSign * options.smallStep),\n                    40: step(-options.smallStep),\n                    39: step(+1 * rtlDirectionSign * options.smallStep),\n                    38: step(+options.smallStep),\n                    35: setValue(options.max),\n                    36: setValue(options.min),\n                    33: step(+options.largeStep),\n                    34: step(-options.largeStep)\n                };\n                kendo.notify(that);\n            },\n            events: [\n                CHANGE,\n                SLIDE\n            ],\n            options: {\n                enabled: true,\n                min: 0,\n                max: 10,\n                smallStep: 1,\n                largeStep: 5,\n                orientation: 'horizontal',\n                tickPlacement: 'both',\n                tooltip: {\n                    enabled: true,\n                    format: '{0}'\n                }\n            },\n            _distance: function () {\n                return round(this.options.max - this.options.min);\n            },\n            _resize: function () {\n                this._setTrackDivWidth();\n                this.wrapper.find('.k-slider-items').remove();\n                this._maxSelection = this._trackDiv[this._sizeFn]();\n                this._sliderItemsInit();\n                this._refresh();\n                if (this.options.enabled) {\n                    this.enable(true);\n                }\n            },\n            _sliderItemsInit: function () {\n                var that = this, options = that.options;\n                var sizeBetweenTicks = that._maxSelection / ((options.max - options.min) / options.smallStep);\n                var pixelWidths = that._calculateItemsWidth(math.floor(that._distance() / options.smallStep));\n                if (options.tickPlacement != 'none' && sizeBetweenTicks >= 2) {\n                    $(this.element).parent().find('.k-slider-items').remove();\n                    that._trackDiv.before(createSliderItems(options, that._distance()));\n                    that._setItemsWidth(pixelWidths);\n                    that._setItemsTitle();\n                }\n                that._calculateSteps(pixelWidths);\n                if (options.tickPlacement != 'none' && sizeBetweenTicks >= 2 && options.largeStep >= options.smallStep) {\n                    that._setItemsLargeTick();\n                }\n            },\n            getSize: function () {\n                return kendo.dimensions(this.wrapper);\n            },\n            _setTrackDivWidth: function () {\n                var that = this, trackDivPosition = parseFloat(that._trackDiv.css(that._isRtl ? 'right' : that._position), 10) * 2;\n                that._trackDiv[that._sizeFn](that.wrapper[that._sizeFn]() - 2 - trackDivPosition);\n            },\n            _setItemsWidth: function (pixelWidths) {\n                var that = this, options = that.options, first = 0, last = pixelWidths.length - 1, items = that.wrapper.find(TICK_SELECTOR), i, paddingTop = 0, bordersWidth = 2, count = items.length, selection = 0;\n                for (i = 0; i < count - 2; i++) {\n                    $(items[i + 1])[that._sizeFn](pixelWidths[i]);\n                }\n                if (that._isHorizontal) {\n                    $(items[first]).addClass('k-first')[that._sizeFn](pixelWidths[last - 1]);\n                    $(items[last]).addClass('k-last')[that._sizeFn](pixelWidths[last]);\n                } else {\n                    $(items[last]).addClass('k-first')[that._sizeFn](pixelWidths[last]);\n                    $(items[first]).addClass('k-last')[that._sizeFn](pixelWidths[last - 1]);\n                }\n                if (that._distance() % options.smallStep !== 0 && !that._isHorizontal) {\n                    for (i = 0; i < pixelWidths.length; i++) {\n                        selection += pixelWidths[i];\n                    }\n                    paddingTop = that._maxSelection - selection;\n                    paddingTop += parseFloat(that._trackDiv.css(that._position), 10) + bordersWidth;\n                    that.wrapper.find('.k-slider-items').css('padding-top', paddingTop);\n                }\n            },\n            _setItemsTitle: function () {\n                var that = this, options = that.options, items = that.wrapper.find(TICK_SELECTOR), titleNumber = options.min, count = items.length, i = that._isHorizontal && !that._isRtl ? 0 : count - 1, limit = that._isHorizontal && !that._isRtl ? count : -1, increment = that._isHorizontal && !that._isRtl ? 1 : -1;\n                for (; i - limit !== 0; i += increment) {\n                    $(items[i]).attr('title', format(options.tooltip.format, round(titleNumber)));\n                    titleNumber += options.smallStep;\n                }\n            },\n            _setItemsLargeTick: function () {\n                var that = this, options = that.options, items = that.wrapper.find(TICK_SELECTOR), i = 0, item, value;\n                if (removeFraction(options.largeStep) % removeFraction(options.smallStep) === 0 || that._distance() / options.largeStep >= 3) {\n                    if (!that._isHorizontal && !that._isRtl) {\n                        items = $.makeArray(items).reverse();\n                    }\n                    for (i = 0; i < items.length; i++) {\n                        item = $(items[i]);\n                        value = that._values[i];\n                        var valueWithoutFraction = round(removeFraction(value - this.options.min));\n                        if (valueWithoutFraction % removeFraction(options.smallStep) === 0 && valueWithoutFraction % removeFraction(options.largeStep) === 0) {\n                            item.addClass('k-tick-large').html('<span class=\\'k-label\\'>' + item.attr('title') + '</span>');\n                            if (i !== 0 && i !== items.length - 1) {\n                                item.css('line-height', item[that._sizeFn]() + 'px');\n                            }\n                        }\n                    }\n                }\n            },\n            _calculateItemsWidth: function (itemsCount) {\n                var that = this, options = that.options, trackDivSize = parseFloat(that._trackDiv.css(that._sizeFn)) + 1, distance = that._distance(), pixelStep = trackDivSize / distance, itemWidth, pixelWidths, i;\n                if (distance / options.smallStep - math.floor(distance / options.smallStep) > 0) {\n                    trackDivSize -= distance % options.smallStep * pixelStep;\n                }\n                itemWidth = trackDivSize / itemsCount;\n                pixelWidths = [];\n                for (i = 0; i < itemsCount - 1; i++) {\n                    pixelWidths[i] = itemWidth;\n                }\n                pixelWidths[itemsCount - 1] = pixelWidths[itemsCount] = itemWidth / 2;\n                return that._roundWidths(pixelWidths);\n            },\n            _roundWidths: function (pixelWidthsArray) {\n                var balance = 0, count = pixelWidthsArray.length, i;\n                for (i = 0; i < count; i++) {\n                    balance += pixelWidthsArray[i] - math.floor(pixelWidthsArray[i]);\n                    pixelWidthsArray[i] = math.floor(pixelWidthsArray[i]);\n                }\n                balance = math.round(balance);\n                return this._addAdditionalSize(balance, pixelWidthsArray);\n            },\n            _addAdditionalSize: function (additionalSize, pixelWidthsArray) {\n                if (additionalSize === 0) {\n                    return pixelWidthsArray;\n                }\n                var step = parseFloat(pixelWidthsArray.length - 1) / parseFloat(additionalSize == 1 ? additionalSize : additionalSize - 1), i;\n                for (i = 0; i < additionalSize; i++) {\n                    pixelWidthsArray[parseInt(math.round(step * i), 10)] += 1;\n                }\n                return pixelWidthsArray;\n            },\n            _calculateSteps: function (pixelWidths) {\n                var that = this, options = that.options, val = options.min, selection = 0, distance = that._distance(), itemsCount = math.ceil(distance / options.smallStep), i = 1, lastItem;\n                itemsCount += distance / options.smallStep % 1 === 0 ? 1 : 0;\n                pixelWidths.splice(0, 0, pixelWidths[itemsCount - 2] * 2);\n                pixelWidths.splice(itemsCount - 1, 1, pixelWidths.pop() * 2);\n                that._pixelSteps = [selection];\n                that._values = [val];\n                if (itemsCount === 0) {\n                    return;\n                }\n                while (i < itemsCount) {\n                    selection += (pixelWidths[i - 1] + pixelWidths[i]) / 2;\n                    that._pixelSteps[i] = selection;\n                    val += options.smallStep;\n                    that._values[i] = round(val);\n                    i++;\n                }\n                lastItem = distance % options.smallStep === 0 ? itemsCount - 1 : itemsCount;\n                that._pixelSteps[lastItem] = that._maxSelection;\n                that._values[lastItem] = options.max;\n                if (that._isRtl) {\n                    that._pixelSteps.reverse();\n                    that._values.reverse();\n                }\n            },\n            _getValueFromPosition: function (mousePosition, dragableArea) {\n                var that = this, options = that.options, step = math.max(options.smallStep * (that._maxSelection / that._distance()), 0), position = 0, halfStep = step / 2, i;\n                if (that._isHorizontal) {\n                    position = mousePosition - dragableArea.startPoint;\n                    if (that._isRtl) {\n                        position = that._maxSelection - position;\n                    }\n                } else {\n                    position = dragableArea.startPoint - mousePosition;\n                }\n                if (that._maxSelection - (parseInt(that._maxSelection % step, 10) - 3) / 2 < position) {\n                    return options.max;\n                }\n                for (i = 0; i < that._pixelSteps.length; i++) {\n                    if (math.abs(that._pixelSteps[i] - position) - 1 <= halfStep) {\n                        return round(that._values[i]);\n                    }\n                }\n            },\n            _getFormattedValue: function (val, drag) {\n                var that = this, html = '', tooltip = that.options.tooltip, tooltipTemplate, selectionStart, selectionEnd;\n                if (isArray(val)) {\n                    selectionStart = val[0];\n                    selectionEnd = val[1];\n                } else if (drag && drag.type) {\n                    selectionStart = drag.selectionStart;\n                    selectionEnd = drag.selectionEnd;\n                }\n                if (drag) {\n                    tooltipTemplate = drag.tooltipTemplate;\n                }\n                if (!tooltipTemplate && tooltip.template) {\n                    tooltipTemplate = kendo.template(tooltip.template);\n                }\n                if (isArray(val) || drag && drag.type) {\n                    if (tooltipTemplate) {\n                        html = tooltipTemplate({\n                            selectionStart: selectionStart,\n                            selectionEnd: selectionEnd\n                        });\n                    } else {\n                        selectionStart = format(tooltip.format, selectionStart);\n                        selectionEnd = format(tooltip.format, selectionEnd);\n                        html = selectionStart + ' - ' + selectionEnd;\n                    }\n                } else {\n                    if (drag) {\n                        drag.val = val;\n                    }\n                    if (tooltipTemplate) {\n                        html = tooltipTemplate({ value: val });\n                    } else {\n                        html = format(tooltip.format, val);\n                    }\n                }\n                return html;\n            },\n            _getDraggableArea: function () {\n                var that = this, offset = kendo.getOffset(that._trackDiv);\n                return {\n                    startPoint: that._isHorizontal ? offset.left : offset.top + that._maxSelection,\n                    endPoint: that._isHorizontal ? offset.left + that._maxSelection : offset.top\n                };\n            },\n            _createHtml: function () {\n                var that = this, element = that.element, options = that.options, inputs = element.find('input');\n                if (inputs.length == 2) {\n                    inputs.eq(0).prop('value', formatValue(options.selectionStart));\n                    inputs.eq(1).prop('value', formatValue(options.selectionEnd));\n                } else {\n                    element.prop('value', formatValue(options.value));\n                }\n                element.wrap(createWrapper(options, element, that._isHorizontal)).hide();\n                if (options.showButtons) {\n                    element.before(createButton(options, 'increase', that._isHorizontal, that._isRtl)).before(createButton(options, 'decrease', that._isHorizontal, that._isRtl));\n                }\n                element.before(createTrack(options, element));\n            },\n            _focus: function (e) {\n                var that = this, target = e.target, val = that.value(), drag = that._drag;\n                if (!drag) {\n                    if (target == that.wrapper.find(DRAG_HANDLE).eq(0)[0]) {\n                        drag = that._firstHandleDrag;\n                        that._activeHandle = 0;\n                    } else {\n                        drag = that._lastHandleDrag;\n                        that._activeHandle = 1;\n                    }\n                    val = val[that._activeHandle];\n                }\n                $(target).addClass(STATE_FOCUSED + ' ' + STATE_SELECTED);\n                if (drag) {\n                    that._activeHandleDrag = drag;\n                    drag.selectionStart = that.options.selectionStart;\n                    drag.selectionEnd = that.options.selectionEnd;\n                    drag._updateTooltip(val);\n                }\n            },\n            _focusWithMouse: function (target) {\n                target = $(target);\n                var that = this, idx = target.is(DRAG_HANDLE) ? target.index() : 0;\n                window.setTimeout(function () {\n                    that.wrapper.find(DRAG_HANDLE)[idx == 2 ? 1 : 0].focus();\n                }, 1);\n                that._setTooltipTimeout();\n            },\n            _blur: function (e) {\n                var that = this, drag = that._activeHandleDrag;\n                $(e.target).removeClass(STATE_FOCUSED + ' ' + STATE_SELECTED);\n                if (drag) {\n                    drag._removeTooltip();\n                    delete that._activeHandleDrag;\n                    delete that._activeHandle;\n                }\n            },\n            _setTooltipTimeout: function () {\n                var that = this;\n                that._tooltipTimeout = window.setTimeout(function () {\n                    var drag = that._drag || that._activeHandleDrag;\n                    if (drag) {\n                        drag._removeTooltip();\n                    }\n                }, 300);\n            },\n            _clearTooltipTimeout: function () {\n                var that = this;\n                window.clearTimeout(this._tooltipTimeout);\n                var drag = that._drag || that._activeHandleDrag;\n                if (drag && drag.tooltipDiv) {\n                    drag.tooltipDiv.stop(true, false).css('opacity', 1);\n                }\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._form = form.on('reset', proxy(that._formResetHandler, that));\n                }\n            },\n            min: function (value) {\n                if (!value) {\n                    return this.options.min;\n                }\n                this.setOptions({ 'min': value });\n            },\n            max: function (value) {\n                if (!value) {\n                    return this.options.max;\n                }\n                this.setOptions({ 'max': value });\n            },\n            setOptions: function (options) {\n                Widget.fn.setOptions.call(this, options);\n                this._sliderItemsInit();\n                this._refresh();\n            },\n            destroy: function () {\n                if (this._form) {\n                    this._form.off('reset', this._formResetHandler);\n                }\n                Widget.fn.destroy.call(this);\n            }\n        });\n        function createWrapper(options, element, isHorizontal) {\n            var orientationCssClass = isHorizontal ? ' k-slider-horizontal' : ' k-slider-vertical', style = options.style ? options.style : element.attr('style'), cssClasses = element.attr('class') ? ' ' + element.attr('class') : '', tickPlacementCssClass = '';\n            if (options.tickPlacement == 'bottomRight') {\n                tickPlacementCssClass = ' k-slider-bottomright';\n            } else if (options.tickPlacement == 'topLeft') {\n                tickPlacementCssClass = ' k-slider-topleft';\n            }\n            style = style ? ' style=\\'' + style + '\\'' : '';\n            return '<div class=\\'k-widget k-slider' + orientationCssClass + cssClasses + '\\'' + style + '>' + '<div class=\\'k-slider-wrap' + (options.showButtons ? ' k-slider-buttons' : '') + tickPlacementCssClass + '\\'></div></div>';\n        }\n        function createButton(options, type, isHorizontal, isRtl) {\n            var buttonCssClass = '';\n            if (isHorizontal) {\n                if (!isRtl && type == 'increase' || isRtl && type != 'increase') {\n                    buttonCssClass = 'k-i-arrow-60-right';\n                } else {\n                    buttonCssClass = 'k-i-arrow-60-left';\n                }\n            } else {\n                if (type == 'increase') {\n                    buttonCssClass = 'k-i-arrow-60-up';\n                } else {\n                    buttonCssClass = 'k-i-arrow-60-down';\n                }\n            }\n            return '<a class=\\'k-button k-button-' + type + '\\' ' + 'title=\\'' + options[type + 'ButtonTitle'] + '\\' ' + 'aria-label=\\'' + options[type + 'ButtonTitle'] + '\\'>' + '<span class=\\'k-icon ' + buttonCssClass + '\\'></span></a>';\n        }\n        function createSliderItems(options, distance) {\n            var result = '<ul class=\\'k-reset k-slider-items\\'>', count = math.floor(round(distance / options.smallStep)) + 1, i;\n            for (i = 0; i < count; i++) {\n                result += '<li class=\\'k-tick\\' role=\\'presentation\\'>&nbsp;</li>';\n            }\n            result += '</ul>';\n            return result;\n        }\n        function createTrack(options, element) {\n            var dragHandleCount = element.is('input') ? 1 : 2, firstDragHandleTitle = dragHandleCount == 2 ? options.leftDragHandleTitle : options.dragHandleTitle;\n            return '<div class=\\'k-slider-track\\'><div class=\\'k-slider-selection\\'><!-- --></div>' + '<a href=\\'#\\' class=\\'k-draghandle\\' title=\\'' + firstDragHandleTitle + '\\' role=\\'slider\\' aria-valuemin=\\'' + options.min + '\\' aria-valuemax=\\'' + options.max + '\\' aria-valuenow=\\'' + (dragHandleCount > 1 ? options.selectionStart || options.min : options.value || options.min) + '\\'>Drag</a>' + (dragHandleCount > 1 ? '<a href=\\'#\\' class=\\'k-draghandle\\' title=\\'' + options.rightDragHandleTitle + '\\'role=\\'slider\\' aria-valuemin=\\'' + options.min + '\\' aria-valuemax=\\'' + options.max + '\\' aria-valuenow=\\'' + (options.selectionEnd || options.max) + '\\'>Drag</a>' : '') + '</div>';\n        }\n        function step(stepValue) {\n            return function (value) {\n                return value + stepValue;\n            };\n        }\n        function setValue(value) {\n            return function () {\n                return value;\n            };\n        }\n        function formatValue(value) {\n            return (value + '').replace('.', kendo.cultures.current.numberFormat['.']);\n        }\n        function calculatePrecision(value) {\n            var number = value.toString();\n            var precision = 0;\n            number = number.split('.');\n            if (number[1]) {\n                precision = number[1].length;\n            }\n            precision = precision > 10 ? 10 : precision;\n            return precision;\n        }\n        function round(value) {\n            var precision, power;\n            value = parseFloat(value, 10);\n            precision = calculatePrecision(value);\n            power = math.pow(10, precision || 0);\n            return math.round(value * power) / power;\n        }\n        function parseAttr(element, name) {\n            var value = parse(element.getAttribute(name));\n            if (value === null) {\n                value = undefined;\n            }\n            return value;\n        }\n        function defined(value) {\n            return typeof value !== UNDEFINED;\n        }\n        function removeFraction(value) {\n            return value * 10000;\n        }\n        var Slider = SliderBase.extend({\n            init: function (element, options) {\n                var that = this, dragHandle;\n                element.type = 'text';\n                options = extend({}, {\n                    value: parseAttr(element, 'value'),\n                    min: parseAttr(element, 'min'),\n                    max: parseAttr(element, 'max'),\n                    smallStep: parseAttr(element, 'step')\n                }, options);\n                element = $(element);\n                if (options && options.enabled === undefined) {\n                    options.enabled = !element.is('[disabled]');\n                }\n                SliderBase.fn.init.call(that, element, options);\n                options = that.options;\n                if (!defined(options.value) || options.value === null) {\n                    options.value = options.min;\n                    element.prop('value', formatValue(options.min));\n                }\n                options.value = math.max(math.min(options.value, options.max), options.min);\n                dragHandle = that.wrapper.find(DRAG_HANDLE);\n                this._selection = new Slider.Selection(dragHandle, that, options);\n                that._drag = new Slider.Drag(dragHandle, '', that, options);\n            },\n            options: {\n                name: 'Slider',\n                showButtons: true,\n                increaseButtonTitle: 'Increase',\n                decreaseButtonTitle: 'Decrease',\n                dragHandleTitle: 'drag',\n                tooltip: { format: '{0:#,#.##}' },\n                value: null\n            },\n            enable: function (enable) {\n                var that = this, options = that.options, clickHandler, move;\n                that.disable();\n                if (enable === false) {\n                    return;\n                }\n                that.wrapper.removeClass(STATE_DISABLED).addClass(STATE_DEFAULT);\n                that.wrapper.find('input').removeAttr(DISABLED);\n                clickHandler = function (e) {\n                    var touch = getTouches(e)[0];\n                    if (!touch) {\n                        return;\n                    }\n                    var mousePosition = that._isHorizontal ? touch.location.pageX : touch.location.pageY, dragableArea = that._getDraggableArea(), target = $(e.target);\n                    if (target.hasClass('k-draghandle')) {\n                        target.addClass(STATE_FOCUSED + ' ' + STATE_SELECTED);\n                        return;\n                    }\n                    that._update(that._getValueFromPosition(mousePosition, dragableArea));\n                    that._focusWithMouse(e.target);\n                    that._drag.dragstart(e);\n                    e.preventDefault();\n                };\n                that.wrapper.find(TICK_SELECTOR + ', ' + TRACK_SELECTOR).on(TRACK_MOUSE_DOWN, clickHandler).end().on(TRACK_MOUSE_DOWN, function () {\n                    $(document.documentElement).one('selectstart', kendo.preventDefault);\n                }).on(TRACK_MOUSE_UP, function () {\n                    that._drag._end();\n                });\n                that.wrapper.find(DRAG_HANDLE).attr(TABINDEX, 0).on(MOUSE_UP, function () {\n                    that._setTooltipTimeout();\n                }).on(CLICK, function (e) {\n                    that._focusWithMouse(e.target);\n                    e.preventDefault();\n                }).on(FOCUS, proxy(that._focus, that)).on(BLUR, proxy(that._blur, that));\n                move = proxy(function (sign) {\n                    var newVal = that._nextValueByIndex(that._valueIndex + sign * 1);\n                    that._setValueInRange(newVal);\n                    that._drag._updateTooltip(newVal);\n                }, that);\n                if (options.showButtons) {\n                    var mouseDownHandler = proxy(function (e, sign) {\n                        this._clearTooltipTimeout();\n                        if (e.which === 1 || support.touch && e.which === 0) {\n                            move(sign);\n                            this.timeout = setTimeout(proxy(function () {\n                                this.timer = setInterval(function () {\n                                    move(sign);\n                                }, 60);\n                            }, this), 200);\n                        }\n                    }, that);\n                    that.wrapper.find('.k-button').on(MOUSE_UP, proxy(function (e) {\n                        this._clearTimer();\n                        that._focusWithMouse(e.target);\n                    }, that)).on(MOUSE_OVER, function (e) {\n                        $(e.currentTarget).addClass('k-state-hover');\n                    }).on('mouseout' + NS, proxy(function (e) {\n                        $(e.currentTarget).removeClass('k-state-hover');\n                        this._clearTimer();\n                    }, that)).eq(0).on(MOUSE_DOWN, proxy(function (e) {\n                        mouseDownHandler(e, 1);\n                    }, that)).click(false).end().eq(1).on(MOUSE_DOWN, proxy(function (e) {\n                        mouseDownHandler(e, -1);\n                    }, that)).click(kendo.preventDefault);\n                }\n                that.wrapper.find(DRAG_HANDLE).off(KEY_DOWN, false).on(KEY_DOWN, proxy(this._keydown, that));\n                options.enabled = true;\n            },\n            disable: function () {\n                var that = this;\n                that.wrapper.removeClass(STATE_DEFAULT).addClass(STATE_DISABLED);\n                $(that.element).prop(DISABLED, DISABLED);\n                that.wrapper.find('.k-button').off(MOUSE_DOWN).on(MOUSE_DOWN, function (e) {\n                    e.preventDefault();\n                    $(this).addClass('k-state-active');\n                }).off(MOUSE_UP).on(MOUSE_UP, function (e) {\n                    e.preventDefault();\n                    $(this).removeClass('k-state-active');\n                }).off('mouseleave' + NS).on('mouseleave' + NS, kendo.preventDefault).off(MOUSE_OVER).on(MOUSE_OVER, kendo.preventDefault);\n                that.wrapper.find(TICK_SELECTOR + ', ' + TRACK_SELECTOR).off(TRACK_MOUSE_DOWN).off(TRACK_MOUSE_UP);\n                that.wrapper.find(DRAG_HANDLE).attr(TABINDEX, -1).off(MOUSE_UP).off(KEY_DOWN).off(CLICK).off(FOCUS).off(BLUR);\n                that.options.enabled = false;\n            },\n            _update: function (val) {\n                var that = this, change = that.value() != val;\n                that.value(val);\n                if (change) {\n                    that.trigger(CHANGE, { value: that.options.value });\n                }\n            },\n            value: function (value) {\n                var that = this, options = that.options;\n                value = round(value);\n                if (isNaN(value)) {\n                    return options.value;\n                }\n                if (value >= options.min && value <= options.max) {\n                    if (options.value != value) {\n                        that.element.prop('value', formatValue(value));\n                        options.value = value;\n                        that._refreshAriaAttr(value);\n                        that._refresh();\n                    }\n                }\n            },\n            _refresh: function () {\n                this.trigger(MOVE_SELECTION, { value: this.options.value });\n            },\n            _refreshAriaAttr: function (value) {\n                var that = this, drag = that._drag, formattedValue;\n                if (drag && drag._tooltipDiv) {\n                    formattedValue = drag._tooltipDiv.text();\n                } else {\n                    formattedValue = that._getFormattedValue(value, null);\n                }\n                this.wrapper.find(DRAG_HANDLE).attr('aria-valuenow', value).attr('aria-valuetext', formattedValue);\n            },\n            _clearTimer: function () {\n                clearTimeout(this.timeout);\n                clearInterval(this.timer);\n            },\n            _keydown: function (e) {\n                var that = this;\n                if (e.keyCode in that._keyMap) {\n                    that._clearTooltipTimeout();\n                    that._setValueInRange(that._keyMap[e.keyCode](that.options.value));\n                    that._drag._updateTooltip(that.value());\n                    e.preventDefault();\n                }\n            },\n            _setValueInRange: function (val) {\n                var that = this, options = that.options;\n                val = round(val);\n                if (isNaN(val)) {\n                    that._update(options.min);\n                    return;\n                }\n                val = math.max(math.min(val, options.max), options.min);\n                that._update(val);\n            },\n            _nextValueByIndex: function (index) {\n                var count = this._values.length;\n                if (this._isRtl) {\n                    index = count - 1 - index;\n                }\n                return this._values[math.max(0, math.min(index, count - 1))];\n            },\n            _formResetHandler: function () {\n                var that = this, min = that.options.min;\n                setTimeout(function () {\n                    var value = that.element[0].value;\n                    that.value(value === '' || isNaN(value) ? min : value);\n                });\n            },\n            destroy: function () {\n                var that = this;\n                SliderBase.fn.destroy.call(that);\n                that.wrapper.off(NS).find('.k-button').off(NS).end().find(DRAG_HANDLE).off(NS).end().find(TICK_SELECTOR + ', ' + TRACK_SELECTOR).off(NS).end();\n                that._drag.draggable.destroy();\n                that._drag._removeTooltip(true);\n            }\n        });\n        Slider.Selection = function (dragHandle, that, options) {\n            function moveSelection(val) {\n                var selectionValue = val - options.min, index = that._valueIndex = math.ceil(round(selectionValue / options.smallStep)), selection = parseInt(that._pixelSteps[index], 10), selectionDiv = that._trackDiv.find('.k-slider-selection'), halfDragHanndle = parseInt(that._outerSize(dragHandle) / 2, 10), rtlCorrection = that._isRtl ? 2 : 0;\n                selectionDiv[that._sizeFn](that._isRtl ? that._maxSelection - selection : selection);\n                dragHandle.css(that._position, selection - halfDragHanndle - rtlCorrection);\n            }\n            moveSelection(options.value);\n            that.bind([\n                SLIDE,\n                MOVE_SELECTION\n            ], function (e) {\n                moveSelection(parseFloat(e.value, 10));\n            });\n            that.bind(CHANGE, function (e) {\n                moveSelection(parseFloat(e.sender.value(), 10));\n            });\n        };\n        Slider.Drag = function (element, type, owner, options) {\n            var that = this;\n            that.owner = owner;\n            that.options = options;\n            that.element = element;\n            that.type = type;\n            that.draggable = new Draggable(element, {\n                distance: 0,\n                dragstart: proxy(that._dragstart, that),\n                drag: proxy(that.drag, that),\n                dragend: proxy(that.dragend, that),\n                dragcancel: proxy(that.dragcancel, that)\n            });\n            element.click(false);\n            element.on('dragstart', function (e) {\n                e.preventDefault();\n            });\n        };\n        Slider.Drag.prototype = {\n            dragstart: function (e) {\n                this.owner._activeDragHandle = this;\n                this.draggable.userEvents.cancel();\n                this._dragstart(e);\n                this.dragend();\n            },\n            _dragstart: function (e) {\n                var that = this, owner = that.owner, options = that.options;\n                if (!options.enabled) {\n                    e.preventDefault();\n                    return;\n                }\n                this.owner._activeDragHandle = this;\n                owner.element.off(MOUSE_OVER);\n                owner.wrapper.find('.' + STATE_FOCUSED).removeClass(STATE_FOCUSED + ' ' + STATE_SELECTED);\n                that.element.addClass(STATE_FOCUSED + ' ' + STATE_SELECTED);\n                $(document.documentElement).css('cursor', 'pointer');\n                that.dragableArea = owner._getDraggableArea();\n                that.step = math.max(options.smallStep * (owner._maxSelection / owner._distance()), 0);\n                if (that.type) {\n                    that.selectionStart = options.selectionStart;\n                    that.selectionEnd = options.selectionEnd;\n                    owner._setZIndex(that.type);\n                } else {\n                    that.oldVal = that.val = options.value;\n                }\n                that._removeTooltip(true);\n                that._createTooltip();\n            },\n            _createTooltip: function () {\n                var that = this, owner = that.owner, tooltip = that.options.tooltip, html = '', wnd = $(window), tooltipTemplate, colloutCssClass;\n                if (!tooltip.enabled) {\n                    return;\n                }\n                if (tooltip.template) {\n                    tooltipTemplate = that.tooltipTemplate = kendo.template(tooltip.template);\n                }\n                $('.k-slider-tooltip').remove();\n                that.tooltipDiv = $('<div class=\\'k-widget k-tooltip k-slider-tooltip\\'><!-- --></div>').appendTo(document.body);\n                html = owner._getFormattedValue(that.val || owner.value(), that);\n                if (!that.type) {\n                    colloutCssClass = 'k-callout-' + (owner._isHorizontal ? 's' : 'e');\n                    that.tooltipInnerDiv = '<div class=\\'k-callout ' + colloutCssClass + '\\'><!-- --></div>';\n                    html += that.tooltipInnerDiv;\n                }\n                that.tooltipDiv.html(html);\n                that._scrollOffset = {\n                    top: wnd.scrollTop(),\n                    left: wnd.scrollLeft()\n                };\n                that.moveTooltip();\n            },\n            drag: function (e) {\n                var that = this, owner = that.owner, x = e.x.location, y = e.y.location, startPoint = that.dragableArea.startPoint, endPoint = that.dragableArea.endPoint, slideParams;\n                e.preventDefault();\n                if (owner._isHorizontal) {\n                    if (owner._isRtl) {\n                        that.val = that.constrainValue(x, startPoint, endPoint, x < endPoint);\n                    } else {\n                        that.val = that.constrainValue(x, startPoint, endPoint, x >= endPoint);\n                    }\n                } else {\n                    that.val = that.constrainValue(y, endPoint, startPoint, y <= endPoint);\n                }\n                if (that.oldVal != that.val) {\n                    that.oldVal = that.val;\n                    if (that.type) {\n                        if (that.type == 'firstHandle') {\n                            if (that.val < that.selectionEnd) {\n                                that.selectionStart = that.val;\n                            } else {\n                                that.selectionStart = that.selectionEnd = that.val;\n                            }\n                        } else {\n                            if (that.val > that.selectionStart) {\n                                that.selectionEnd = that.val;\n                            } else {\n                                that.selectionStart = that.selectionEnd = that.val;\n                            }\n                        }\n                        slideParams = {\n                            values: [\n                                that.selectionStart,\n                                that.selectionEnd\n                            ],\n                            value: [\n                                that.selectionStart,\n                                that.selectionEnd\n                            ]\n                        };\n                    } else {\n                        slideParams = { value: that.val };\n                    }\n                    owner.trigger(SLIDE, slideParams);\n                }\n                that._updateTooltip(that.val);\n            },\n            _updateTooltip: function (val) {\n                var that = this, options = that.options, tooltip = options.tooltip, html = '';\n                if (!tooltip.enabled) {\n                    return;\n                }\n                if (!that.tooltipDiv) {\n                    that._createTooltip();\n                }\n                html = that.owner._getFormattedValue(round(val), that);\n                if (!that.type) {\n                    html += that.tooltipInnerDiv;\n                }\n                that.tooltipDiv.html(html);\n                that.moveTooltip();\n            },\n            dragcancel: function () {\n                this.owner._refresh();\n                $(document.documentElement).css('cursor', '');\n                return this._end();\n            },\n            dragend: function () {\n                var that = this, owner = that.owner;\n                $(document.documentElement).css('cursor', '');\n                if (that.type) {\n                    owner._update(that.selectionStart, that.selectionEnd);\n                } else {\n                    owner._update(that.val);\n                    that.draggable.userEvents._disposeAll();\n                }\n                that.draggable.userEvents.cancel();\n                return that._end();\n            },\n            _end: function () {\n                var that = this, owner = that.owner;\n                owner._focusWithMouse(that.element);\n                owner.element.on(MOUSE_OVER);\n                return false;\n            },\n            _removeTooltip: function (noAnimation) {\n                var that = this, owner = that.owner;\n                if (that.tooltipDiv && owner.options.tooltip.enabled && owner.options.enabled) {\n                    if (noAnimation) {\n                        that.tooltipDiv.remove();\n                        that.tooltipDiv = null;\n                    } else {\n                        that.tooltipDiv.fadeOut('slow', function () {\n                            $(this).remove();\n                            that.tooltipDiv = null;\n                        });\n                    }\n                }\n            },\n            moveTooltip: function () {\n                var that = this, owner = that.owner, top = 0, left = 0, element = that.element, offset = kendo.getOffset(element), margin = 8, viewport = $(window), callout = that.tooltipDiv.find('.k-callout'), width = outerWidth(that.tooltipDiv), height = outerHeight(that.tooltipDiv), dragHandles, sdhOffset, diff, anchorSize;\n                if (that.type) {\n                    dragHandles = owner.wrapper.find(DRAG_HANDLE);\n                    offset = kendo.getOffset(dragHandles.eq(0));\n                    sdhOffset = kendo.getOffset(dragHandles.eq(1));\n                    if (owner._isHorizontal) {\n                        top = sdhOffset.top;\n                        left = offset.left + (sdhOffset.left - offset.left) / 2;\n                    } else {\n                        top = offset.top + (sdhOffset.top - offset.top) / 2;\n                        left = sdhOffset.left;\n                    }\n                    anchorSize = outerWidth(dragHandles.eq(0)) + 2 * margin;\n                } else {\n                    top = offset.top;\n                    left = offset.left;\n                    anchorSize = outerWidth(element) + 2 * margin;\n                }\n                if (owner._isHorizontal) {\n                    left -= parseInt((width - owner._outerSize(element)) / 2, 10);\n                    top -= height + margin + (callout.length ? callout.height() : 0);\n                } else {\n                    top -= parseInt((height - owner._outerSize(element)) / 2, 10);\n                    left -= width + margin + (callout.length ? callout.width() : 0);\n                }\n                if (owner._isHorizontal) {\n                    diff = that._flip(top, height, anchorSize, outerHeight(viewport) + that._scrollOffset.top);\n                    top += diff;\n                    left += that._fit(left, width, outerWidth(viewport) + that._scrollOffset.left);\n                } else {\n                    diff = that._flip(left, width, anchorSize, outerWidth(viewport) + that._scrollOffset.left);\n                    top += that._fit(top, height, outerHeight(viewport) + that._scrollOffset.top);\n                    left += diff;\n                }\n                if (diff > 0 && callout) {\n                    callout.removeClass();\n                    callout.addClass('k-callout k-callout-' + (owner._isHorizontal ? 'n' : 'w'));\n                }\n                that.tooltipDiv.css({\n                    top: top,\n                    left: left\n                });\n            },\n            _fit: function (position, size, viewPortEnd) {\n                var output = 0;\n                if (position + size > viewPortEnd) {\n                    output = viewPortEnd - (position + size);\n                }\n                if (position < 0) {\n                    output = -position;\n                }\n                return output;\n            },\n            _flip: function (offset, size, anchorSize, viewPortEnd) {\n                var output = 0;\n                if (offset + size > viewPortEnd) {\n                    output += -(anchorSize + size);\n                }\n                if (offset + output < 0) {\n                    output += anchorSize + size;\n                }\n                return output;\n            },\n            constrainValue: function (position, min, max, maxOverflow) {\n                var that = this, val = 0;\n                if (min < position && position < max) {\n                    val = that.owner._getValueFromPosition(position, that.dragableArea);\n                } else {\n                    if (maxOverflow) {\n                        val = that.options.max;\n                    } else {\n                        val = that.options.min;\n                    }\n                }\n                return val;\n            }\n        };\n        kendo.ui.plugin(Slider);\n        var RangeSlider = SliderBase.extend({\n            init: function (element, options) {\n                var that = this, inputs = $(element).find('input'), firstInput = inputs.eq(0)[0], secondInput = inputs.eq(1)[0];\n                firstInput.type = 'text';\n                secondInput.type = 'text';\n                if (options && options.showButtons) {\n                    if (window.console) {\n                        window.console.warn('showbuttons option is not supported for the range slider, ignoring');\n                    }\n                    options.showButtons = false;\n                }\n                options = extend({}, {\n                    selectionStart: parseAttr(firstInput, 'value'),\n                    min: parseAttr(firstInput, 'min'),\n                    max: parseAttr(firstInput, 'max'),\n                    smallStep: parseAttr(firstInput, 'step')\n                }, {\n                    selectionEnd: parseAttr(secondInput, 'value'),\n                    min: parseAttr(secondInput, 'min'),\n                    max: parseAttr(secondInput, 'max'),\n                    smallStep: parseAttr(secondInput, 'step')\n                }, options);\n                if (options && options.enabled === undefined) {\n                    options.enabled = !inputs.is('[disabled]');\n                }\n                SliderBase.fn.init.call(that, element, options);\n                options = that.options;\n                if (!defined(options.selectionStart) || options.selectionStart === null) {\n                    options.selectionStart = options.min;\n                    inputs.eq(0).prop('value', formatValue(options.min));\n                }\n                if (!defined(options.selectionEnd) || options.selectionEnd === null) {\n                    options.selectionEnd = options.max;\n                    inputs.eq(1).prop('value', formatValue(options.max));\n                }\n                var dragHandles = that.wrapper.find(DRAG_HANDLE);\n                this._selection = new RangeSlider.Selection(dragHandles, that, options);\n                that._firstHandleDrag = new Slider.Drag(dragHandles.eq(0), 'firstHandle', that, options);\n                that._lastHandleDrag = new Slider.Drag(dragHandles.eq(1), 'lastHandle', that, options);\n            },\n            options: {\n                name: 'RangeSlider',\n                leftDragHandleTitle: 'drag',\n                rightDragHandleTitle: 'drag',\n                tooltip: { format: '{0:#,#.##}' },\n                selectionStart: null,\n                selectionEnd: null\n            },\n            enable: function (enable) {\n                var that = this, options = that.options, clickHandler;\n                that.disable();\n                if (enable === false) {\n                    return;\n                }\n                that.wrapper.removeClass(STATE_DISABLED).addClass(STATE_DEFAULT);\n                that.wrapper.find('input').removeAttr(DISABLED);\n                clickHandler = function (e) {\n                    var touch = getTouches(e)[0];\n                    if (!touch) {\n                        return;\n                    }\n                    var mousePosition = that._isHorizontal ? touch.location.pageX : touch.location.pageY, dragableArea = that._getDraggableArea(), val = that._getValueFromPosition(mousePosition, dragableArea), target = $(e.target), from, to, drag;\n                    if (target.hasClass('k-draghandle')) {\n                        that.wrapper.find('.' + STATE_FOCUSED).removeClass(STATE_FOCUSED + ' ' + STATE_SELECTED);\n                        target.addClass(STATE_FOCUSED + ' ' + STATE_SELECTED);\n                        return;\n                    }\n                    if (val < options.selectionStart) {\n                        from = val;\n                        to = options.selectionEnd;\n                        drag = that._firstHandleDrag;\n                    } else if (val > that.selectionEnd) {\n                        from = options.selectionStart;\n                        to = val;\n                        drag = that._lastHandleDrag;\n                    } else {\n                        if (val - options.selectionStart <= options.selectionEnd - val) {\n                            from = val;\n                            to = options.selectionEnd;\n                            drag = that._firstHandleDrag;\n                        } else {\n                            from = options.selectionStart;\n                            to = val;\n                            drag = that._lastHandleDrag;\n                        }\n                    }\n                    drag.dragstart(e);\n                    that._setValueInRange(from, to);\n                    that._focusWithMouse(drag.element);\n                };\n                that.wrapper.find(TICK_SELECTOR + ', ' + TRACK_SELECTOR).on(TRACK_MOUSE_DOWN, clickHandler).end().on(TRACK_MOUSE_DOWN, function () {\n                    $(document.documentElement).one('selectstart', kendo.preventDefault);\n                }).on(TRACK_MOUSE_UP, function () {\n                    if (that._activeDragHandle) {\n                        that._activeDragHandle._end();\n                    }\n                });\n                that.wrapper.find(DRAG_HANDLE).attr(TABINDEX, 0).on(MOUSE_UP, function () {\n                    that._setTooltipTimeout();\n                }).on(CLICK, function (e) {\n                    that._focusWithMouse(e.target);\n                    e.preventDefault();\n                }).on(FOCUS, proxy(that._focus, that)).on(BLUR, proxy(that._blur, that));\n                that.wrapper.find(DRAG_HANDLE).off(KEY_DOWN, kendo.preventDefault).eq(0).on(KEY_DOWN, proxy(function (e) {\n                    this._keydown(e, 'firstHandle');\n                }, that)).end().eq(1).on(KEY_DOWN, proxy(function (e) {\n                    this._keydown(e, 'lastHandle');\n                }, that));\n                that.options.enabled = true;\n            },\n            disable: function () {\n                var that = this;\n                that.wrapper.removeClass(STATE_DEFAULT).addClass(STATE_DISABLED);\n                that.wrapper.find('input').prop(DISABLED, DISABLED);\n                that.wrapper.find(TICK_SELECTOR + ', ' + TRACK_SELECTOR).off(TRACK_MOUSE_DOWN).off(TRACK_MOUSE_UP);\n                that.wrapper.find(DRAG_HANDLE).attr(TABINDEX, -1).off(MOUSE_UP).off(KEY_DOWN).off(CLICK).off(FOCUS).off(BLUR);\n                that.options.enabled = false;\n            },\n            _keydown: function (e, handle) {\n                var that = this, selectionStartValue = that.options.selectionStart, selectionEndValue = that.options.selectionEnd, dragSelectionStart, dragSelectionEnd, activeHandleDrag;\n                if (e.keyCode in that._keyMap) {\n                    that._clearTooltipTimeout();\n                    if (handle == 'firstHandle') {\n                        activeHandleDrag = that._activeHandleDrag = that._firstHandleDrag;\n                        selectionStartValue = that._keyMap[e.keyCode](selectionStartValue);\n                        if (selectionStartValue > selectionEndValue) {\n                            selectionEndValue = selectionStartValue;\n                        }\n                    } else {\n                        activeHandleDrag = that._activeHandleDrag = that._lastHandleDrag;\n                        selectionEndValue = that._keyMap[e.keyCode](selectionEndValue);\n                        if (selectionStartValue > selectionEndValue) {\n                            selectionStartValue = selectionEndValue;\n                        }\n                    }\n                    that._setValueInRange(round(selectionStartValue), round(selectionEndValue));\n                    dragSelectionStart = Math.max(selectionStartValue, that.options.selectionStart);\n                    dragSelectionEnd = Math.min(selectionEndValue, that.options.selectionEnd);\n                    activeHandleDrag.selectionEnd = Math.max(dragSelectionEnd, that.options.selectionStart);\n                    activeHandleDrag.selectionStart = Math.min(dragSelectionStart, that.options.selectionEnd);\n                    activeHandleDrag._updateTooltip(that.value()[that._activeHandle]);\n                    e.preventDefault();\n                }\n            },\n            _update: function (selectionStart, selectionEnd) {\n                var that = this, values = that.value();\n                var change = values[0] != selectionStart || values[1] != selectionEnd;\n                that.value([\n                    selectionStart,\n                    selectionEnd\n                ]);\n                if (change) {\n                    that.trigger(CHANGE, {\n                        values: [\n                            selectionStart,\n                            selectionEnd\n                        ],\n                        value: [\n                            selectionStart,\n                            selectionEnd\n                        ]\n                    });\n                }\n            },\n            value: function (value) {\n                if (value && value.length) {\n                    return this._value(value[0], value[1]);\n                } else {\n                    return this._value();\n                }\n            },\n            _value: function (start, end) {\n                var that = this, options = that.options, selectionStart = options.selectionStart, selectionEnd = options.selectionEnd;\n                if (isNaN(start) && isNaN(end)) {\n                    return [\n                        selectionStart,\n                        selectionEnd\n                    ];\n                } else {\n                    start = round(start);\n                    end = round(end);\n                }\n                if (start >= options.min && start <= options.max && end >= options.min && end <= options.max && start <= end) {\n                    if (selectionStart != start || selectionEnd != end) {\n                        that.element.find('input').eq(0).prop('value', formatValue(start)).end().eq(1).prop('value', formatValue(end));\n                        options.selectionStart = start;\n                        options.selectionEnd = end;\n                        that._refresh();\n                        that._refreshAriaAttr(start, end);\n                    }\n                }\n            },\n            values: function (start, end) {\n                if (isArray(start)) {\n                    return this._value(start[0], start[1]);\n                } else {\n                    return this._value(start, end);\n                }\n            },\n            _refresh: function () {\n                var that = this, options = that.options;\n                that.trigger(MOVE_SELECTION, {\n                    values: [\n                        options.selectionStart,\n                        options.selectionEnd\n                    ],\n                    value: [\n                        options.selectionStart,\n                        options.selectionEnd\n                    ]\n                });\n                if (options.selectionStart == options.max && options.selectionEnd == options.max) {\n                    that._setZIndex('firstHandle');\n                }\n            },\n            _refreshAriaAttr: function (start, end) {\n                var that = this, dragHandles = that.wrapper.find(DRAG_HANDLE), drag = that._activeHandleDrag, formattedValue;\n                formattedValue = that._getFormattedValue([\n                    start,\n                    end\n                ], drag);\n                dragHandles.eq(0).attr('aria-valuenow', start);\n                dragHandles.eq(1).attr('aria-valuenow', end);\n                dragHandles.attr('aria-valuetext', formattedValue);\n            },\n            _setValueInRange: function (selectionStart, selectionEnd) {\n                var options = this.options;\n                selectionStart = math.max(math.min(selectionStart, options.max), options.min);\n                selectionEnd = math.max(math.min(selectionEnd, options.max), options.min);\n                if (selectionStart == options.max && selectionEnd == options.max) {\n                    this._setZIndex('firstHandle');\n                }\n                this._update(math.min(selectionStart, selectionEnd), math.max(selectionStart, selectionEnd));\n            },\n            _setZIndex: function (type) {\n                this.wrapper.find(DRAG_HANDLE).each(function (index) {\n                    $(this).css('z-index', type == 'firstHandle' ? 1 - index : index);\n                });\n            },\n            _formResetHandler: function () {\n                var that = this, options = that.options;\n                setTimeout(function () {\n                    var inputs = that.element.find('input');\n                    var start = inputs[0].value;\n                    var end = inputs[1].value;\n                    that.values(start === '' || isNaN(start) ? options.min : start, end === '' || isNaN(end) ? options.max : end);\n                });\n            },\n            destroy: function () {\n                var that = this;\n                SliderBase.fn.destroy.call(that);\n                that.wrapper.off(NS).find(TICK_SELECTOR + ', ' + TRACK_SELECTOR).off(NS).end().find(DRAG_HANDLE).off(NS);\n                that._firstHandleDrag.draggable.destroy();\n                that._lastHandleDrag.draggable.destroy();\n            }\n        });\n        RangeSlider.Selection = function (dragHandles, that, options) {\n            function moveSelection(value) {\n                value = value || [];\n                var selectionStartValue = value[0] - options.min, selectionEndValue = value[1] - options.min, selectionStartIndex = math.ceil(round(selectionStartValue / options.smallStep)), selectionEndIndex = math.ceil(round(selectionEndValue / options.smallStep)), selectionStart = that._pixelSteps[selectionStartIndex], selectionEnd = that._pixelSteps[selectionEndIndex], halfHandle = parseInt(that._outerSize(dragHandles.eq(0)) / 2, 10), rtlCorrection = that._isRtl ? 2 : 0;\n                dragHandles.eq(0).css(that._position, selectionStart - halfHandle - rtlCorrection).end().eq(1).css(that._position, selectionEnd - halfHandle - rtlCorrection);\n                makeSelection(selectionStart, selectionEnd);\n            }\n            function makeSelection(selectionStart, selectionEnd) {\n                var selection, selectionPosition, selectionDiv = that._trackDiv.find('.k-slider-selection');\n                selection = math.abs(selectionStart - selectionEnd);\n                selectionDiv[that._sizeFn](selection);\n                if (that._isRtl) {\n                    selectionPosition = math.max(selectionStart, selectionEnd);\n                    selectionDiv.css('right', that._maxSelection - selectionPosition - 1);\n                } else {\n                    selectionPosition = math.min(selectionStart, selectionEnd);\n                    selectionDiv.css(that._position, selectionPosition - 1);\n                }\n            }\n            moveSelection(that.value());\n            that.bind([\n                CHANGE,\n                SLIDE,\n                MOVE_SELECTION\n            ], function (e) {\n                moveSelection(e.values);\n            });\n        };\n        kendo.ui.plugin(RangeSlider);\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.colorpicker', [\n        'kendo.core',\n        'kendo.color',\n        'kendo.popup',\n        'kendo.slider',\n        'kendo.userevents',\n        'kendo.button'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'colorpicker',\n        name: 'Color tools',\n        category: 'web',\n        description: 'Color selection widgets',\n        depends: [\n            'core',\n            'color',\n            'popup',\n            'slider',\n            'userevents',\n            'button'\n        ]\n    };\n    (function ($, parseInt, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, parseColor = kendo.parseColor, Color = kendo.Color, KEYS = kendo.keys, BACKGROUNDCOLOR = 'background-color', ITEMSELECTEDCLASS = 'k-state-selected', SIMPLEPALETTE = '000000,7f7f7f,880015,ed1c24,ff7f27,fff200,22b14c,00a2e8,3f48cc,a349a4,ffffff,c3c3c3,b97a57,ffaec9,ffc90e,efe4b0,b5e61d,99d9ea,7092be,c8bfe7', WEBPALETTE = 'FFFFFF,FFCCFF,FF99FF,FF66FF,FF33FF,FF00FF,CCFFFF,CCCCFF,CC99FF,CC66FF,CC33FF,CC00FF,99FFFF,99CCFF,9999FF,9966FF,9933FF,9900FF,FFFFCC,FFCCCC,FF99CC,FF66CC,FF33CC,FF00CC,CCFFCC,CCCCCC,CC99CC,CC66CC,CC33CC,CC00CC,99FFCC,99CCCC,9999CC,9966CC,9933CC,9900CC,FFFF99,FFCC99,FF9999,FF6699,FF3399,FF0099,CCFF99,CCCC99,CC9999,CC6699,CC3399,CC0099,99FF99,99CC99,999999,996699,993399,990099,FFFF66,FFCC66,FF9966,FF6666,FF3366,FF0066,CCFF66,CCCC66,CC9966,CC6666,CC3366,CC0066,99FF66,99CC66,999966,996666,993366,990066,FFFF33,FFCC33,FF9933,FF6633,FF3333,FF0033,CCFF33,CCCC33,CC9933,CC6633,CC3333,CC0033,99FF33,99CC33,999933,996633,993333,990033,FFFF00,FFCC00,FF9900,FF6600,FF3300,FF0000,CCFF00,CCCC00,CC9900,CC6600,CC3300,CC0000,99FF00,99CC00,999900,996600,993300,990000,66FFFF,66CCFF,6699FF,6666FF,6633FF,6600FF,33FFFF,33CCFF,3399FF,3366FF,3333FF,3300FF,00FFFF,00CCFF,0099FF,0066FF,0033FF,0000FF,66FFCC,66CCCC,6699CC,6666CC,6633CC,6600CC,33FFCC,33CCCC,3399CC,3366CC,3333CC,3300CC,00FFCC,00CCCC,0099CC,0066CC,0033CC,0000CC,66FF99,66CC99,669999,666699,663399,660099,33FF99,33CC99,339999,336699,333399,330099,00FF99,00CC99,009999,006699,003399,000099,66FF66,66CC66,669966,666666,663366,660066,33FF66,33CC66,339966,336666,333366,330066,00FF66,00CC66,009966,006666,003366,000066,66FF33,66CC33,669933,666633,663333,660033,33FF33,33CC33,339933,336633,333333,330033,00FF33,00CC33,009933,006633,003333,000033,66FF00,66CC00,669900,666600,663300,660000,33FF00,33CC00,339900,336600,333300,330000,00FF00,00CC00,009900,006600,003300,000000', WHITE = '#ffffff', MESSAGES = {\n                apply: 'Apply',\n                cancel: 'Cancel',\n                noColor: 'no color',\n                clearColor: 'Clear color',\n                previewInput: 'Color Hexadecimal Code'\n            }, NS = '.kendoColorTools', CLICK_NS = 'click' + NS, KEYDOWN_NS = 'keydown' + NS, browser = kendo.support.browser, isIE8 = browser.msie && browser.version < 9;\n        var ColorSelector = Widget.extend({\n            init: function (element, options) {\n                var that = this, ariaId;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                that._value = options.value = parseColor(options.value);\n                that._tabIndex = element.attr('tabIndex') || 0;\n                ariaId = that._ariaId = options.ariaId;\n                if (ariaId) {\n                    element.attr('aria-labelledby', ariaId);\n                }\n                if (options._standalone) {\n                    that._triggerSelect = that._triggerChange;\n                }\n            },\n            options: {\n                name: 'ColorSelector',\n                value: null,\n                _standalone: true\n            },\n            events: [\n                'change',\n                'select',\n                'cancel'\n            ],\n            color: function (value) {\n                if (value !== undefined) {\n                    this._value = parseColor(value);\n                    this._updateUI(this._value);\n                }\n                return this._value;\n            },\n            value: function (color) {\n                color = this.color(color);\n                if (color) {\n                    if (this.options.opacity) {\n                        color = color.toCssRgba();\n                    } else {\n                        color = color.toCss();\n                    }\n                }\n                return color || null;\n            },\n            enable: function (enable) {\n                if (arguments.length === 0) {\n                    enable = true;\n                }\n                $('.k-disabled-overlay', this.wrapper).remove();\n                if (!enable) {\n                    this.wrapper.append('<div class=\\'k-disabled-overlay\\'></div>');\n                }\n                this._onEnable(enable);\n            },\n            _select: function (color, nohooks) {\n                var prev = this._value;\n                color = this.color(color);\n                if (!nohooks) {\n                    this.element.trigger('change');\n                    if (!color.equals(prev)) {\n                        this.trigger('change', { value: this.value() });\n                    } else if (!this._standalone) {\n                        this.trigger('cancel');\n                    }\n                }\n            },\n            _triggerSelect: function (color) {\n                triggerEvent(this, 'select', color);\n            },\n            _triggerChange: function (color) {\n                triggerEvent(this, 'change', color);\n            },\n            destroy: function () {\n                if (this.element) {\n                    this.element.off(NS);\n                }\n                if (this.wrapper) {\n                    this.wrapper.off(NS).find('*').off(NS);\n                }\n                this.wrapper = null;\n                Widget.fn.destroy.call(this);\n            },\n            _updateUI: $.noop,\n            _selectOnHide: function () {\n                return null;\n            },\n            _cancel: function () {\n                this.trigger('cancel');\n            }\n        });\n        function triggerEvent(self, type, color) {\n            color = parseColor(color);\n            if (color && !color.equals(self.color())) {\n                if (type == 'change') {\n                    self._value = color;\n                }\n                if (color.a != 1) {\n                    color = color.toCssRgba();\n                } else {\n                    color = color.toCss();\n                }\n                self.trigger(type, { value: color });\n            }\n        }\n        var ColorPalette = ColorSelector.extend({\n            init: function (element, options) {\n                var that = this;\n                ColorSelector.fn.init.call(that, element, options);\n                element = that.wrapper = that.element;\n                options = that.options;\n                var colors = options.palette;\n                if (colors == 'websafe') {\n                    colors = WEBPALETTE;\n                    options.columns = 18;\n                } else if (colors == 'basic') {\n                    colors = SIMPLEPALETTE;\n                }\n                if (typeof colors == 'string') {\n                    colors = colors.split(',');\n                }\n                if ($.isArray(colors)) {\n                    colors = $.map(colors, function (x) {\n                        return parseColor(x);\n                    });\n                }\n                that._selectedID = (options.ariaId || kendo.guid()) + '_selected';\n                element.addClass('k-widget k-colorpalette').attr('role', 'grid').attr('aria-readonly', 'true').append($(that._template({\n                    colors: colors,\n                    columns: options.columns,\n                    tileSize: options.tileSize,\n                    value: that._value,\n                    id: options.ariaId\n                }))).on(CLICK_NS, '.k-item', function (ev) {\n                    that._select($(ev.currentTarget).css(BACKGROUNDCOLOR));\n                }).attr('tabIndex', that._tabIndex).on(KEYDOWN_NS, bind(that._keydown, that));\n                var tileSize = options.tileSize, width, height;\n                if (tileSize) {\n                    if (/number|string/.test(typeof tileSize)) {\n                        width = height = parseFloat(tileSize);\n                    } else if (typeof tileSize == 'object') {\n                        width = parseFloat(tileSize.width);\n                        height = parseFloat(tileSize.height);\n                    } else {\n                        throw new Error('Unsupported value for the \\'tileSize\\' argument');\n                    }\n                    element.find('.k-item').css({\n                        width: width,\n                        height: height\n                    });\n                }\n            },\n            focus: function () {\n                if (this.wrapper && !this.wrapper.is('[unselectable=\\'on\\']')) {\n                    this.wrapper.focus();\n                }\n            },\n            options: {\n                name: 'ColorPalette',\n                columns: 10,\n                tileSize: null,\n                palette: 'basic'\n            },\n            _onEnable: function (enable) {\n                if (enable) {\n                    this.wrapper.attr('tabIndex', this._tabIndex);\n                } else {\n                    this.wrapper.removeAttr('tabIndex');\n                }\n            },\n            _keydown: function (e) {\n                var selected, wrapper = this.wrapper, items = wrapper.find('.k-item'), current = items.filter('.' + ITEMSELECTEDCLASS).get(0), keyCode = e.keyCode;\n                if (keyCode == KEYS.LEFT) {\n                    selected = relative(items, current, -1);\n                } else if (keyCode == KEYS.RIGHT) {\n                    selected = relative(items, current, 1);\n                } else if (keyCode == KEYS.DOWN) {\n                    selected = relative(items, current, this.options.columns);\n                } else if (keyCode == KEYS.UP) {\n                    selected = relative(items, current, -this.options.columns);\n                } else if (keyCode == KEYS.ENTER) {\n                    preventDefault(e);\n                    if (current) {\n                        this._select($(current).css(BACKGROUNDCOLOR));\n                    }\n                } else if (keyCode == KEYS.ESC) {\n                    this._cancel();\n                }\n                if (selected) {\n                    preventDefault(e);\n                    this._current(selected);\n                    try {\n                        var color = parseColor(selected.css(BACKGROUNDCOLOR));\n                        this._triggerSelect(color);\n                    } catch (ex) {\n                    }\n                }\n            },\n            _current: function (item) {\n                this.wrapper.find('.' + ITEMSELECTEDCLASS).removeClass(ITEMSELECTEDCLASS).attr('aria-selected', false).removeAttr('id');\n                $(item).addClass(ITEMSELECTEDCLASS).attr('aria-selected', true).attr('id', this._selectedID);\n                this.element.removeAttr('aria-activedescendant').attr('aria-activedescendant', this._selectedID);\n            },\n            _updateUI: function (color) {\n                var item = null;\n                this.wrapper.find('.k-item').each(function () {\n                    var c = parseColor($(this).css(BACKGROUNDCOLOR));\n                    if (c && c.equals(color)) {\n                        item = this;\n                        return false;\n                    }\n                });\n                this._current(item);\n            },\n            _template: kendo.template('<table class=\"k-palette k-reset\" role=\"presentation\"><tr role=\"row\">' + '# for (var i = 0; i < colors.length; ++i) { #' + '# var selected = colors[i].equals(value); #' + '# if (i && i % columns == 0) { # </tr><tr role=\"row\"> # } #' + '<td role=\"gridcell\" unselectable=\"on\" style=\"background-color:#= colors[i].toCss() #\"' + '#= selected ? \" aria-selected=true\" : \"\" # ' + '#=(id && i === 0) ? \"id=\\\\\"\"+id+\"\\\\\" \" : \"\" # ' + 'class=\"k-item#= selected ? \" ' + ITEMSELECTEDCLASS + '\" : \"\" #\" ' + 'aria-label=\"#= colors[i].toCss() #\"></td>' + '# } #' + '</tr></table>')\n        });\n        var FlatColorPicker = ColorSelector.extend({\n            init: function (element, options) {\n                var that = this;\n                ColorSelector.fn.init.call(that, element, options);\n                options = that.options;\n                options.messages = options.options ? $.extend(that.options.messages, options.options.messages) : that.options.messages;\n                element = that.element;\n                that.wrapper = element.addClass('k-widget k-flatcolorpicker').append(that._template(options));\n                that._hueElements = $('.k-hsv-rectangle, .k-transparency-slider .k-slider-track', element);\n                that._selectedColor = $('.k-selected-color-display', element);\n                that._colorAsText = $('input.k-color-value', element);\n                that._sliders();\n                that._hsvArea();\n                that._updateUI(that._value || parseColor('#f00'));\n                element.find('input.k-color-value').on(KEYDOWN_NS, function (ev) {\n                    var input = this;\n                    if (ev.keyCode == KEYS.ENTER) {\n                        try {\n                            var color = parseColor(input.value);\n                            var val = that.color();\n                            that._select(color, color.equals(val));\n                        } catch (ex) {\n                            $(input).addClass('k-state-error');\n                        }\n                    } else if (that.options.autoupdate) {\n                        setTimeout(function () {\n                            var color = parseColor(input.value, true);\n                            if (color) {\n                                that._updateUI(color, true);\n                            }\n                        }, 10);\n                    }\n                }).end().on(CLICK_NS, '.k-controls button.apply', function () {\n                    if (that.options._clearedColor) {\n                        that.trigger('change');\n                    } else {\n                        that._select(that._getHSV());\n                    }\n                }).on(CLICK_NS, '.k-controls button.cancel', function () {\n                    that._updateUI(that.color());\n                    that._cancel();\n                });\n                if (isIE8) {\n                    that._applyIEFilter();\n                }\n            },\n            destroy: function () {\n                this._hueSlider.destroy();\n                if (this._opacitySlider) {\n                    this._opacitySlider.destroy();\n                }\n                this._hueSlider = this._opacitySlider = this._hsvRect = this._hsvHandle = this._hueElements = this._selectedColor = this._colorAsText = null;\n                ColorSelector.fn.destroy.call(this);\n            },\n            options: {\n                name: 'FlatColorPicker',\n                opacity: false,\n                buttons: false,\n                input: true,\n                preview: true,\n                clearButton: false,\n                autoupdate: true,\n                messages: MESSAGES\n            },\n            _applyIEFilter: function () {\n                var track = this.element.find('.k-hue-slider .k-slider-track')[0], url = track.currentStyle.backgroundImage;\n                url = url.replace(/^url\\([\\'\\\"]?|[\\'\\\"]?\\)$/g, '');\n                track.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\\'' + url + '\\', sizingMethod=\\'scale\\')';\n            },\n            _sliders: function () {\n                var that = this, element = that.element, hueSlider = element.find('.k-hue-slider'), opacitySlider = element.find('.k-transparency-slider');\n                function hueChange(e) {\n                    that._updateUI(that._getHSV(e.value, null, null, null));\n                }\n                hueSlider.attr('aria-label', 'hue saturation');\n                that._hueSlider = hueSlider.kendoSlider({\n                    min: 0,\n                    max: 360,\n                    tickPlacement: 'none',\n                    showButtons: false,\n                    slide: hueChange,\n                    change: hueChange\n                }).data('kendoSlider');\n                function opacityChange(e) {\n                    that._updateUI(that._getHSV(null, null, null, e.value / 100));\n                }\n                opacitySlider.attr('aria-label', 'opacity');\n                that._opacitySlider = opacitySlider.kendoSlider({\n                    min: 0,\n                    max: 100,\n                    tickPlacement: 'none',\n                    showButtons: false,\n                    slide: opacityChange,\n                    change: opacityChange\n                }).data('kendoSlider');\n            },\n            _hsvArea: function () {\n                var that = this, element = that.element, hsvRect = element.find('.k-hsv-rectangle'), hsvHandle = hsvRect.find('.k-draghandle').attr('tabIndex', 0).on(KEYDOWN_NS, bind(that._keydown, that));\n                function update(x, y) {\n                    var offset = this.offset, dx = x - offset.left, dy = y - offset.top, rw = this.width, rh = this.height;\n                    dx = dx < 0 ? 0 : dx > rw ? rw : dx;\n                    dy = dy < 0 ? 0 : dy > rh ? rh : dy;\n                    that._svChange(dx / rw, 1 - dy / rh);\n                }\n                that._hsvEvents = new kendo.UserEvents(hsvRect, {\n                    global: true,\n                    press: function (e) {\n                        this.offset = kendo.getOffset(hsvRect);\n                        this.width = hsvRect.width();\n                        this.height = hsvRect.height();\n                        hsvHandle.focus();\n                        update.call(this, e.x.location, e.y.location);\n                    },\n                    start: function () {\n                        hsvRect.addClass('k-dragging');\n                        hsvHandle.focus();\n                    },\n                    move: function (e) {\n                        e.preventDefault();\n                        update.call(this, e.x.location, e.y.location);\n                    },\n                    end: function () {\n                        hsvRect.removeClass('k-dragging');\n                    }\n                });\n                that._hsvRect = hsvRect;\n                that._hsvHandle = hsvHandle;\n            },\n            _onEnable: function (enable) {\n                this._hueSlider.enable(enable);\n                if (this._opacitySlider) {\n                    this._opacitySlider.enable(enable);\n                }\n                this.wrapper.find('input').attr('disabled', !enable);\n                var handle = this._hsvRect.find('.k-draghandle');\n                if (enable) {\n                    handle.attr('tabIndex', this._tabIndex);\n                } else {\n                    handle.removeAttr('tabIndex');\n                }\n            },\n            _keydown: function (ev) {\n                var that = this;\n                function move(prop, d) {\n                    var c = that._getHSV();\n                    c[prop] += d * (ev.shiftKey ? 0.01 : 0.05);\n                    if (c[prop] < 0) {\n                        c[prop] = 0;\n                    }\n                    if (c[prop] > 1) {\n                        c[prop] = 1;\n                    }\n                    that._updateUI(c);\n                    preventDefault(ev);\n                }\n                function hue(d) {\n                    var c = that._getHSV();\n                    c.h += d * (ev.shiftKey ? 1 : 5);\n                    if (c.h < 0) {\n                        c.h = 0;\n                    }\n                    if (c.h > 359) {\n                        c.h = 359;\n                    }\n                    that._updateUI(c);\n                    preventDefault(ev);\n                }\n                switch (ev.keyCode) {\n                case KEYS.LEFT:\n                    if (ev.ctrlKey) {\n                        hue(-1);\n                    } else {\n                        move('s', -1);\n                    }\n                    break;\n                case KEYS.RIGHT:\n                    if (ev.ctrlKey) {\n                        hue(1);\n                    } else {\n                        move('s', 1);\n                    }\n                    break;\n                case KEYS.UP:\n                    move(ev.ctrlKey && that._opacitySlider ? 'a' : 'v', 1);\n                    break;\n                case KEYS.DOWN:\n                    move(ev.ctrlKey && that._opacitySlider ? 'a' : 'v', -1);\n                    break;\n                case KEYS.ENTER:\n                    that._select(that._getHSV());\n                    break;\n                case KEYS.F2:\n                    that.wrapper.find('input.k-color-value').focus().select();\n                    break;\n                case KEYS.ESC:\n                    that._cancel();\n                    break;\n                }\n            },\n            focus: function () {\n                this._hsvHandle.focus();\n            },\n            _getHSV: function (h, s, v, a) {\n                var rect = this._hsvRect, width = rect.width(), height = rect.height(), handlePosition = this._hsvHandle.position();\n                if (h == null) {\n                    h = this._hueSlider.value();\n                }\n                if (s == null) {\n                    s = handlePosition.left / width;\n                }\n                if (v == null) {\n                    v = 1 - handlePosition.top / height;\n                }\n                if (a == null) {\n                    a = this._opacitySlider ? this._opacitySlider.value() / 100 : 1;\n                }\n                return Color.fromHSV(h, s, v, a);\n            },\n            _svChange: function (s, v) {\n                var color = this._getHSV(null, s, v, null);\n                this._updateUI(color);\n            },\n            _updateUI: function (color, dontChangeInput) {\n                var that = this, rect = that._hsvRect;\n                if (!color) {\n                    return;\n                }\n                this._colorAsText.attr('title', that.options.messages.previewInput);\n                this._colorAsText.removeClass('k-state-error');\n                that._selectedColor.css(BACKGROUNDCOLOR, color.toDisplay());\n                if (!dontChangeInput) {\n                    that._colorAsText.val(that._opacitySlider ? color.toCssRgba() : color.toCss());\n                }\n                that._triggerSelect(color);\n                color = color.toHSV();\n                that._hsvHandle.css({\n                    left: color.s * rect.width() + 'px',\n                    top: (1 - color.v) * rect.height() + 'px'\n                });\n                that._hueElements.css(BACKGROUNDCOLOR, Color.fromHSV(color.h, 1, 1, 1).toCss());\n                that._hueSlider.value(color.h);\n                if (that._opacitySlider) {\n                    that._opacitySlider.value(100 * color.a);\n                }\n            },\n            _selectOnHide: function () {\n                return this.options.buttons ? null : this._getHSV();\n            },\n            _template: kendo.template('# if (preview) { #' + '<div class=\"k-selected-color\"><div class=\"k-selected-color-display\"><div class=\"k-color-input\"><input class=\"k-color-value\" ' + '# if (clearButton && !_standalone) { #' + 'placeholder=\"#: messages.noColor #\" ' + '# } #' + '#= !data.input ? \\'style=\"visibility: hidden;\"\\' : \"\" #>' + '# if (clearButton && !_standalone) { #' + '<span class=\"k-clear-color k-button k-bare\" title=\"#: messages.clearColor #\"></span>' + '# } #' + '</div></div></div>' + '# } #' + '# if (clearButton && !_standalone && !preview) { #' + '<div class=\"k-clear-color-container\"><span class=\"k-clear-color k-button k-bare\">#: messages.clearColor #</span></div>' + '# } #' + '<div class=\"k-hsv-rectangle\"><div class=\"k-hsv-gradient\"></div><div class=\"k-draghandle\"></div></div>' + '<input class=\"k-hue-slider\" />' + '# if (opacity) { #' + '<input class=\"k-transparency-slider\" />' + '# } #' + '# if (buttons) { #' + '<div unselectable=\"on\" class=\"k-controls\"><button class=\"k-button k-primary apply\">#: messages.apply #</button> <button class=\"k-button cancel\">#: messages.cancel #</button></div>' + '# } #')\n        });\n        function relative(array, element, delta) {\n            array = Array.prototype.slice.call(array);\n            var n = array.length;\n            var pos = array.indexOf(element);\n            if (pos < 0) {\n                return delta < 0 ? array[n - 1] : array[0];\n            }\n            pos += delta;\n            if (pos < 0) {\n                pos += n;\n            } else {\n                pos %= n;\n            }\n            return array[pos];\n        }\n        var ColorPicker = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.element;\n                var value = element.attr('value') || element.val();\n                if (value) {\n                    value = parseColor(value, true);\n                } else {\n                    value = parseColor(options.value, true);\n                }\n                that._value = options.value = value;\n                var content = that.wrapper = $(that._template(options));\n                element.hide().after(content);\n                if (element.is('input')) {\n                    element.appendTo(content);\n                    var label = element.closest('label');\n                    var id = element.attr('id');\n                    if (id) {\n                        label = label.add('label[for=\"' + id + '\"]');\n                    }\n                    label.click(function (ev) {\n                        that.open();\n                        ev.preventDefault();\n                    });\n                }\n                that._tabIndex = element.attr('tabIndex') || 0;\n                that.enable(!element.attr('disabled'));\n                var accesskey = element.attr('accesskey');\n                if (accesskey) {\n                    element.attr('accesskey', null);\n                    content.attr('accesskey', accesskey);\n                }\n                that.bind('activate', function (ev) {\n                    if (!ev.isDefaultPrevented()) {\n                        that.toggle();\n                    }\n                });\n                that._updateUI(value);\n            },\n            destroy: function () {\n                this.wrapper.off(NS).find('*').off(NS);\n                if (this._popup) {\n                    this._selector.destroy();\n                    this._popup.destroy();\n                }\n                this._selector = this._popup = this.wrapper = null;\n                Widget.fn.destroy.call(this);\n            },\n            enable: function (enable) {\n                var that = this, wrapper = that.wrapper, innerWrapper = wrapper.children('.k-picker-wrap'), arrow = innerWrapper.find('.k-select');\n                if (arguments.length === 0) {\n                    enable = true;\n                }\n                that.element.attr('disabled', !enable);\n                wrapper.attr('aria-disabled', !enable);\n                arrow.off(NS).on('mousedown' + NS, preventDefault);\n                wrapper.addClass('k-state-disabled').removeAttr('tabIndex').add('*', wrapper).off(NS);\n                if (enable) {\n                    wrapper.removeClass('k-state-disabled').attr('tabIndex', that._tabIndex).on('mouseenter' + NS, function () {\n                        innerWrapper.addClass('k-state-hover');\n                    }).on('mouseleave' + NS, function () {\n                        innerWrapper.removeClass('k-state-hover');\n                    }).on('focus' + NS, function () {\n                        innerWrapper.addClass('k-state-focused');\n                    }).on('blur' + NS, function () {\n                        innerWrapper.removeClass('k-state-focused');\n                    }).on(KEYDOWN_NS, bind(that._keydown, that)).on(CLICK_NS, '.k-select', bind(that.toggle, that)).on(CLICK_NS, that.options.toolIcon ? '.k-tool-icon' : '.k-selected-color', function () {\n                        that.trigger('activate');\n                    });\n                } else {\n                    that.close();\n                }\n            },\n            _template: kendo.template('<span role=\"textbox\" aria-haspopup=\"true\" class=\"k-widget k-colorpicker k-header\">' + '<span class=\"k-picker-wrap k-state-default\">' + '# if (toolIcon) { #' + '<span class=\"k-icon k-tool-icon #= toolIcon #\">' + '<span class=\"k-selected-color\"></span>' + '</span>' + '# } else { #' + '<span class=\"k-selected-color\"><span class=\"k-icon k-i-line\" style=\"display: none;\"></span></span>' + '# } #' + '<span class=\"k-select\" unselectable=\"on\" aria-label=\"select\">' + '<span class=\"k-icon k-i-arrow-60-down\"></span>' + '</span>' + '</span>' + '</span>'),\n            options: {\n                name: 'ColorPicker',\n                palette: null,\n                columns: 10,\n                toolIcon: null,\n                value: null,\n                messages: MESSAGES,\n                opacity: false,\n                buttons: true,\n                preview: true,\n                clearButton: false,\n                ARIATemplate: 'Current selected color is #=data || \"\"#'\n            },\n            events: [\n                'activate',\n                'change',\n                'select',\n                'open',\n                'close'\n            ],\n            open: function () {\n                if (!this.element.prop('disabled')) {\n                    this._getPopup().open();\n                }\n            },\n            close: function () {\n                var selOptions = this._selector && this._selector.options || {};\n                selOptions._closing = true;\n                this._getPopup().close();\n                delete selOptions._closing;\n            },\n            toggle: function () {\n                if (!this.element.prop('disabled')) {\n                    this._getPopup().toggle();\n                }\n            },\n            _noColorIcon: function () {\n                return this.wrapper.find('.k-picker-wrap > .k-selected-color > .k-icon.k-i-line');\n            },\n            color: ColorSelector.fn.color,\n            value: ColorSelector.fn.value,\n            _select: ColorSelector.fn._select,\n            _triggerSelect: ColorSelector.fn._triggerSelect,\n            _isInputTypeColor: function () {\n                var el = this.element[0];\n                return /^input$/i.test(el.tagName) && /^color$/i.test(el.type);\n            },\n            _updateUI: function (value) {\n                var formattedValue = '';\n                if (value) {\n                    if (this._isInputTypeColor() || value.a == 1) {\n                        formattedValue = value.toCss();\n                    } else {\n                        formattedValue = value.toCssRgba();\n                    }\n                    this.element.val(formattedValue);\n                }\n                if (!this._ariaTemplate) {\n                    this._ariaTemplate = kendo.template(this.options.ARIATemplate);\n                }\n                this.wrapper.attr('aria-label', this._ariaTemplate(formattedValue));\n                this._triggerSelect(value);\n                this.wrapper.find('.k-selected-color').css(BACKGROUNDCOLOR, value ? value.toDisplay() : WHITE);\n                this._noColorIcon()[formattedValue ? 'hide' : 'show']();\n            },\n            _keydown: function (ev) {\n                var key = ev.keyCode;\n                if (this._getPopup().visible()) {\n                    if (key == KEYS.ESC) {\n                        this._selector._cancel();\n                    } else {\n                        this._selector._keydown(ev);\n                    }\n                    preventDefault(ev);\n                } else if (key == KEYS.ENTER || key == KEYS.DOWN) {\n                    this.open();\n                    preventDefault(ev);\n                }\n            },\n            _getPopup: function () {\n                var that = this, popup = that._popup;\n                if (!popup) {\n                    var options = that.options;\n                    var selectorType;\n                    if (options.palette) {\n                        selectorType = ColorPalette;\n                    } else {\n                        selectorType = FlatColorPicker;\n                    }\n                    options._standalone = false;\n                    delete options.select;\n                    delete options.change;\n                    delete options.cancel;\n                    var id = kendo.guid();\n                    var selector = that._selector = new selectorType($('<div id=\"' + id + '\"/>').appendTo(document.body), options);\n                    that.wrapper.attr('aria-owns', id);\n                    that._popup = popup = selector.wrapper.kendoPopup({\n                        anchor: that.wrapper,\n                        adjustSize: {\n                            width: 5,\n                            height: 0\n                        }\n                    }).data('kendoPopup');\n                    selector.element.find('.k-clear-color').kendoButton({\n                        icon: 'reset-color',\n                        click: function (e) {\n                            selector.options._clearedColor = true;\n                            that.value(null);\n                            that.element.val(null);\n                            that._updateUI(null);\n                            selector._colorAsText.val('');\n                            selector._hsvHandle.css({\n                                top: '0px',\n                                left: '0px'\n                            });\n                            selector._selectedColor.css(BACKGROUNDCOLOR, WHITE);\n                            that.trigger('change', { value: that.value() });\n                            e.preventDefault();\n                        }\n                    });\n                    selector.bind({\n                        select: function (ev) {\n                            that._updateUI(parseColor(ev.value));\n                            delete selector.options._clearedColor;\n                        },\n                        change: function () {\n                            if (!selector.options._clearedColor) {\n                                that._select(selector.color());\n                            }\n                            that.close();\n                        },\n                        cancel: function () {\n                            if (selector.options._clearedColor && !that.value() && selector.value()) {\n                                that._select(selector.color(), true);\n                            }\n                            that.close();\n                        }\n                    });\n                    popup.bind({\n                        close: function (ev) {\n                            if (that.trigger('close')) {\n                                ev.preventDefault();\n                                return;\n                            }\n                            that.wrapper.children('.k-picker-wrap').removeClass('k-state-focused');\n                            var color = selector._selectOnHide();\n                            var selectorColor = selector.value();\n                            var value = that.value();\n                            var options = selector.options;\n                            if (!color) {\n                                setTimeout(function () {\n                                    if (that.wrapper && !that.wrapper.is('[unselectable=\\'on\\']')) {\n                                        that.wrapper.focus();\n                                    }\n                                });\n                                if (!options._closing && options._clearedColor && !value && selectorColor) {\n                                    that._select(selectorColor, true);\n                                } else {\n                                    that._updateUI(that.color());\n                                }\n                            } else if (!(options._clearedColor && !value)) {\n                                that._select(color);\n                            }\n                        },\n                        open: function (ev) {\n                            if (that.trigger('open')) {\n                                ev.preventDefault();\n                            } else {\n                                that.wrapper.children('.k-picker-wrap').addClass('k-state-focused');\n                            }\n                        },\n                        activate: function () {\n                            selector._select(that.color(), true);\n                            selector.focus();\n                            that.wrapper.children('.k-picker-wrap').addClass('k-state-focused');\n                        }\n                    });\n                }\n                return popup;\n            }\n        });\n        function preventDefault(ev) {\n            ev.preventDefault();\n        }\n        function bind(callback, obj) {\n            return function () {\n                return callback.apply(obj, arguments);\n            };\n        }\n        ui.plugin(ColorPalette);\n        ui.plugin(FlatColorPicker);\n        ui.plugin(ColorPicker);\n    }(jQuery, parseInt));\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.numerictextbox', [\n        'kendo.core',\n        'kendo.userevents'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'numerictextbox',\n        name: 'NumericTextBox',\n        category: 'web',\n        description: 'The NumericTextBox widget can format and display numeric, percentage or currency textbox.',\n        depends: [\n            'core',\n            'userevents'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, caret = kendo.caret, keys = kendo.keys, ui = kendo.ui, Widget = ui.Widget, activeElement = kendo._activeElement, extractFormat = kendo._extractFormat, parse = kendo.parseFloat, placeholderSupported = kendo.support.placeholder, getCulture = kendo.getCulture, CHANGE = 'change', DISABLED = 'disabled', READONLY = 'readonly', INPUT = 'k-input', SPIN = 'spin', ns = '.kendoNumericTextBox', TOUCHEND = 'touchend', MOUSELEAVE = 'mouseleave' + ns, HOVEREVENTS = 'mouseenter' + ns + ' ' + MOUSELEAVE, DEFAULT = 'k-state-default', FOCUSED = 'k-state-focused', HOVER = 'k-state-hover', FOCUS = 'focus', POINT = '.', CLASS_ICON = 'k-icon', SELECTED = 'k-state-selected', STATEDISABLED = 'k-state-disabled', STATE_INVALID = 'k-state-invalid', ARIA_DISABLED = 'aria-disabled', INTEGER_REGEXP = /^(-)?(\\d*)$/, NULL = null, proxy = $.proxy, extend = $.extend;\n        var NumericTextBox = Widget.extend({\n            init: function (element, options) {\n                var that = this, isStep = options && options.step !== undefined, min, max, step, value, disabled;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.element.on('focusout' + ns, proxy(that._focusout, that)).attr('role', 'spinbutton');\n                options.placeholder = options.placeholder || element.attr('placeholder');\n                min = that.min(element.attr('min'));\n                max = that.max(element.attr('max'));\n                step = that._parse(element.attr('step'));\n                if (options.min === NULL && min !== NULL) {\n                    options.min = min;\n                }\n                if (options.max === NULL && max !== NULL) {\n                    options.max = max;\n                }\n                if (!isStep && step !== NULL) {\n                    options.step = step;\n                }\n                that._initialOptions = extend({}, options);\n                that._reset();\n                that._wrapper();\n                that._arrows();\n                that._validation();\n                that._input();\n                if (!kendo.support.mobileOS) {\n                    that._text.on(FOCUS + ns, proxy(that._click, that));\n                } else {\n                    that._text.on(TOUCHEND + ns + ' ' + FOCUS + ns, function () {\n                        if (kendo.support.browser.edge) {\n                            that._text.one(FOCUS + ns, function () {\n                                that._toggleText(false);\n                                element.focus();\n                            });\n                        } else {\n                            that._toggleText(false);\n                            element.focus();\n                        }\n                    });\n                }\n                element.attr('aria-valuemin', options.min !== NULL ? options.min * options.factor : options.min).attr('aria-valuemax', options.max !== NULL ? options.max * options.factor : options.max);\n                options.format = extractFormat(options.format);\n                value = options.value;\n                that.value(value !== NULL ? value : element.val());\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                kendo.notify(that);\n            },\n            options: {\n                name: 'NumericTextBox',\n                decimals: NULL,\n                restrictDecimals: false,\n                min: NULL,\n                max: NULL,\n                value: NULL,\n                step: 1,\n                round: true,\n                culture: '',\n                format: 'n',\n                spinners: true,\n                placeholder: '',\n                factor: 1,\n                upArrowText: 'Increase value',\n                downArrowText: 'Decrease value'\n            },\n            events: [\n                CHANGE,\n                SPIN\n            ],\n            _editable: function (options) {\n                var that = this, element = that.element, disable = options.disable, readonly = options.readonly, text = that._text.add(element), wrapper = that._inputWrapper.off(HOVEREVENTS);\n                that._toggleText(true);\n                that._upArrowEventHandler.unbind('press');\n                that._downArrowEventHandler.unbind('press');\n                element.off('keydown' + ns).off('keypress' + ns).off('keyup' + ns).off('paste' + ns);\n                if (!readonly && !disable) {\n                    wrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n                    text.removeAttr(DISABLED).removeAttr(READONLY).attr(ARIA_DISABLED, false);\n                    that._upArrowEventHandler.bind('press', function (e) {\n                        e.preventDefault();\n                        that._spin(1);\n                        that._upArrow.addClass(SELECTED);\n                    });\n                    that._downArrowEventHandler.bind('press', function (e) {\n                        e.preventDefault();\n                        that._spin(-1);\n                        that._downArrow.addClass(SELECTED);\n                    });\n                    that.element.on('keydown' + ns, proxy(that._keydown, that)).on('keypress' + ns, proxy(that._keypress, that)).on('keyup' + ns, proxy(that._keyup, that)).on('paste' + ns, proxy(that._paste, that));\n                } else {\n                    wrapper.addClass(disable ? STATEDISABLED : DEFAULT).removeClass(disable ? DEFAULT : STATEDISABLED);\n                    text.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            },\n            enable: function (enable) {\n                this._editable({\n                    readonly: false,\n                    disable: !(enable = enable === undefined ? true : enable)\n                });\n            },\n            setOptions: function (options) {\n                var that = this;\n                Widget.fn.setOptions.call(that, options);\n                that._arrowsWrap.toggle(that.options.spinners);\n                that._inputWrapper.toggleClass('k-expand-padding', !that.options.spinners);\n                that._text.prop('placeholder', that.options.placeholder);\n                that._placeholder(that.options.placeholder);\n                that.element.attr({\n                    'aria-valuemin': that.options.min !== NULL ? that.options.min * that.options.factor : that.options.min,\n                    'aria-valuemax': that.options.max !== NULL ? that.options.max * that.options.factor : that.options.max\n                });\n                that.options.format = extractFormat(that.options.format);\n                if (options.value !== undefined) {\n                    that.value(options.value);\n                }\n            },\n            destroy: function () {\n                var that = this;\n                that.element.add(that._text).add(that._upArrow).add(that._downArrow).add(that._inputWrapper).off(ns);\n                that._upArrowEventHandler.destroy();\n                that._downArrowEventHandler.destroy();\n                if (that._form) {\n                    that._form.off('reset', that._resetHandler);\n                }\n                Widget.fn.destroy.call(that);\n            },\n            min: function (value) {\n                return this._option('min', value);\n            },\n            max: function (value) {\n                return this._option('max', value);\n            },\n            step: function (value) {\n                return this._option('step', value);\n            },\n            value: function (value) {\n                var that = this, adjusted;\n                if (value === undefined) {\n                    return that._value;\n                }\n                value = that._parse(value);\n                adjusted = that._adjust(value);\n                if (value !== adjusted) {\n                    return;\n                }\n                that._update(value);\n                that._old = that._value;\n            },\n            focus: function () {\n                this._focusin();\n            },\n            _adjust: function (value) {\n                var that = this, options = that.options, min = options.min, max = options.max;\n                if (value === NULL) {\n                    return value;\n                }\n                if (min !== NULL && value < min) {\n                    value = min;\n                } else if (max !== NULL && value > max) {\n                    value = max;\n                }\n                return value;\n            },\n            _arrows: function () {\n                var that = this, arrows, _release = function () {\n                        clearTimeout(that._spinning);\n                        arrows.removeClass(SELECTED);\n                    }, options = that.options, spinners = options.spinners, element = that.element;\n                arrows = element.siblings('.' + CLASS_ICON);\n                if (!arrows[0]) {\n                    arrows = $(buttonHtml('increase', options.upArrowText) + buttonHtml('decrease', options.downArrowText)).insertAfter(element);\n                    that._arrowsWrap = arrows.wrapAll('<span class=\"k-select\"/>').parent();\n                }\n                if (!spinners) {\n                    arrows.parent().toggle(spinners);\n                    that._inputWrapper.addClass('k-expand-padding');\n                }\n                that._upArrow = arrows.eq(0);\n                that._upArrowEventHandler = new kendo.UserEvents(that._upArrow, { release: _release });\n                that._downArrow = arrows.eq(1);\n                that._downArrowEventHandler = new kendo.UserEvents(that._downArrow, { release: _release });\n            },\n            _validation: function () {\n                var that = this;\n                var element = that.element;\n                that._validationIcon = $('<span class=\\'' + CLASS_ICON + ' k-i-warning\\'></span>').hide().insertAfter(element);\n            },\n            _blur: function () {\n                var that = this;\n                that._toggleText(true);\n                that._change(that.element.val());\n            },\n            _click: function (e) {\n                var that = this;\n                clearTimeout(that._focusing);\n                that._focusing = setTimeout(function () {\n                    var input = e.target, idx = caret(input)[0], value = input.value.substring(0, idx), format = that._format(that.options.format), group = format[','], result, groupRegExp, extractRegExp, caretPosition = 0;\n                    if (group) {\n                        groupRegExp = new RegExp('\\\\' + group, 'g');\n                        extractRegExp = new RegExp('([\\\\d\\\\' + group + ']+)(\\\\' + format[POINT] + ')?(\\\\d+)?');\n                    }\n                    if (extractRegExp) {\n                        result = extractRegExp.exec(value);\n                    }\n                    if (result) {\n                        caretPosition = result[0].replace(groupRegExp, '').length;\n                        if (value.indexOf('(') != -1 && that._value < 0) {\n                            caretPosition++;\n                        }\n                    }\n                    that._focusin();\n                    caret(that.element[0], caretPosition);\n                });\n            },\n            _change: function (value) {\n                var that = this, factor = that.options.factor;\n                if (factor && factor !== 1) {\n                    value = kendo.parseFloat(value);\n                    if (value !== null) {\n                        value = value / factor;\n                    }\n                }\n                that._update(value);\n                value = that._value;\n                if (that._old != value) {\n                    that._old = value;\n                    if (!that._typing) {\n                        that.element.trigger(CHANGE);\n                    }\n                    that.trigger(CHANGE);\n                }\n                that._typing = false;\n            },\n            _culture: function (culture) {\n                return culture || getCulture(this.options.culture);\n            },\n            _focusin: function () {\n                var that = this;\n                that._inputWrapper.addClass(FOCUSED);\n                that._toggleText(false);\n                that.element[0].focus();\n            },\n            _focusout: function () {\n                var that = this;\n                clearTimeout(that._focusing);\n                that._inputWrapper.removeClass(FOCUSED).removeClass(HOVER);\n                that._blur();\n                that._removeInvalidState();\n            },\n            _format: function (format, culture) {\n                var numberFormat = this._culture(culture).numberFormat;\n                format = format.toLowerCase();\n                if (format.indexOf('c') > -1) {\n                    numberFormat = numberFormat.currency;\n                } else if (format.indexOf('p') > -1) {\n                    numberFormat = numberFormat.percent;\n                }\n                return numberFormat;\n            },\n            _input: function () {\n                var that = this, options = that.options, CLASSNAME = 'k-formatted-value', element = that.element.addClass(INPUT).show()[0], accessKey = element.accessKey, wrapper = that.wrapper, text;\n                text = wrapper.find(POINT + CLASSNAME);\n                if (!text[0]) {\n                    text = $('<input type=\"text\"/>').insertBefore(element).addClass(CLASSNAME);\n                }\n                try {\n                    element.setAttribute('type', 'text');\n                } catch (e) {\n                    element.type = 'text';\n                }\n                that._initialTitle = element.title;\n                text[0].title = element.title;\n                text[0].tabIndex = element.tabIndex;\n                text[0].style.cssText = element.style.cssText;\n                text.prop('placeholder', options.placeholder);\n                if (accessKey) {\n                    text.attr('accesskey', accessKey);\n                    element.accessKey = '';\n                }\n                that._text = text.addClass(element.className).attr({\n                    'role': 'spinbutton',\n                    'aria-valuemin': options.min !== NULL ? options.min * options.factor : options.min,\n                    'aria-valuemax': options.max !== NULL ? options.max * options.factor : options.max\n                });\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode;\n                that._key = key;\n                if (key == keys.DOWN) {\n                    that._step(-1);\n                } else if (key == keys.UP) {\n                    that._step(1);\n                } else if (key == keys.ENTER) {\n                    that._change(that.element.val());\n                } else if (key != keys.TAB) {\n                    that._typing = true;\n                }\n            },\n            _keypress: function (e) {\n                if (e.which === 0 || e.metaKey || e.ctrlKey || e.keyCode === keys.BACKSPACE || e.keyCode === keys.ENTER) {\n                    return;\n                }\n                var that = this;\n                var min = that.options.min;\n                var element = that.element;\n                var selection = caret(element);\n                var selectionStart = selection[0];\n                var selectionEnd = selection[1];\n                var character = String.fromCharCode(e.which);\n                var numberFormat = that._format(that.options.format);\n                var isNumPadDecimal = that._key === keys.NUMPAD_DOT;\n                var value = element.val();\n                var isValid;\n                if (isNumPadDecimal) {\n                    character = numberFormat[POINT];\n                }\n                value = value.substring(0, selectionStart) + character + value.substring(selectionEnd);\n                isValid = that._numericRegex(numberFormat).test(value);\n                if (isValid && isNumPadDecimal) {\n                    element.val(value);\n                    caret(element, selectionStart + character.length);\n                    e.preventDefault();\n                } else if (min !== null && min >= 0 && value.charAt(0) === '-' || !isValid) {\n                    that._addInvalidState();\n                    e.preventDefault();\n                }\n                that._key = 0;\n            },\n            _keyup: function () {\n                this._removeInvalidState();\n            },\n            _addInvalidState: function () {\n                var that = this;\n                that._inputWrapper.addClass(STATE_INVALID);\n                that._validationIcon.show();\n            },\n            _removeInvalidState: function () {\n                var that = this;\n                that._inputWrapper.removeClass(STATE_INVALID);\n                that._validationIcon.hide();\n            },\n            _numericRegex: function (numberFormat) {\n                var that = this;\n                var separator = numberFormat[POINT];\n                var precision = that.options.decimals;\n                var fractionRule = '*';\n                if (separator === POINT) {\n                    separator = '\\\\' + separator;\n                }\n                if (precision === NULL) {\n                    precision = numberFormat.decimals;\n                }\n                if (precision === 0 && that.options.restrictDecimals) {\n                    return INTEGER_REGEXP;\n                }\n                if (that.options.restrictDecimals) {\n                    fractionRule = '{0,' + precision + '}';\n                }\n                if (that._separator !== separator) {\n                    that._separator = separator;\n                    that._floatRegExp = new RegExp('^(-)?(((\\\\d+(' + separator + '\\\\d' + fractionRule + ')?)|(' + separator + '\\\\d' + fractionRule + ')))?$');\n                }\n                return that._floatRegExp;\n            },\n            _paste: function (e) {\n                var that = this;\n                var element = e.target;\n                var value = element.value;\n                var numberFormat = that._format(that.options.format);\n                setTimeout(function () {\n                    var result = that._parse(element.value);\n                    if (result === NULL) {\n                        that._update(value);\n                    } else {\n                        element.value = result.toString().replace(POINT, numberFormat[POINT]);\n                        if (that._adjust(result) !== result || !that._numericRegex(numberFormat).test(element.value)) {\n                            that._update(value);\n                        }\n                    }\n                });\n            },\n            _option: function (option, value) {\n                var that = this, element = that.element, options = that.options;\n                if (value === undefined) {\n                    return options[option];\n                }\n                value = that._parse(value);\n                if (!value && option === 'step') {\n                    return;\n                }\n                options[option] = value;\n                element.add(that._text).attr('aria-value' + option, value);\n                element.attr(option, value);\n            },\n            _spin: function (step, timeout) {\n                var that = this;\n                timeout = timeout || 500;\n                clearTimeout(that._spinning);\n                that._spinning = setTimeout(function () {\n                    that._spin(step, 50);\n                }, timeout);\n                that._step(step);\n            },\n            _step: function (step) {\n                var that = this, element = that.element, originalValue = that._value, value = that._parse(element.val()) || 0, precision = that.options.decimals || 2;\n                if (activeElement() != element[0]) {\n                    that._focusin();\n                }\n                if (that.options.factor && value) {\n                    value = value / that.options.factor;\n                }\n                value = +(value + that.options.step * step).toFixed(precision);\n                value = that._adjust(value);\n                that._update(value);\n                that._typing = false;\n                if (originalValue !== value) {\n                    that.trigger(SPIN);\n                }\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter');\n            },\n            _toggleText: function (toggle) {\n                var that = this;\n                that._text.toggle(toggle);\n                that.element.toggle(!toggle);\n            },\n            _parse: function (value, culture) {\n                return parse(value, this._culture(culture), this.options.format);\n            },\n            _round: function (value, precision) {\n                var rounder = this.options.round ? kendo._round : truncate;\n                return rounder(value, precision);\n            },\n            _update: function (value) {\n                var that = this, options = that.options, factor = options.factor, format = options.format, decimals = options.decimals, culture = that._culture(), numberFormat = that._format(format, culture), isNotNull;\n                if (decimals === NULL) {\n                    decimals = numberFormat.decimals;\n                }\n                value = that._parse(value, culture);\n                isNotNull = value !== NULL;\n                if (isNotNull) {\n                    value = parseFloat(that._round(value, decimals), 10);\n                }\n                that._value = value = that._adjust(value);\n                that._placeholder(kendo.toString(value, format, culture));\n                if (isNotNull) {\n                    if (factor) {\n                        value = parseFloat(that._round(value * factor, decimals), 10);\n                    }\n                    value = value.toString();\n                    if (value.indexOf('e') !== -1) {\n                        value = that._round(+value, decimals);\n                    }\n                    value = value.replace(POINT, numberFormat[POINT]);\n                } else {\n                    value = null;\n                }\n                that.element.val(value);\n                that.element.add(that._text).attr('aria-valuenow', value);\n            },\n            _placeholder: function (value) {\n                var input = this._text;\n                input.val(value);\n                if (!placeholderSupported && !value) {\n                    input.val(this.options.placeholder);\n                }\n                input.attr('title', this._initialTitle || input.val());\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, DOMElement = element[0], wrapper;\n                wrapper = element.parents('.k-numerictextbox');\n                if (!wrapper.is('span.k-numerictextbox')) {\n                    wrapper = element.hide().wrap('<span class=\"k-numeric-wrap k-state-default\" />').parent();\n                    wrapper = wrapper.wrap('<span/>').parent();\n                }\n                wrapper[0].style.cssText = DOMElement.style.cssText;\n                DOMElement.style.width = '';\n                that.wrapper = wrapper.addClass('k-widget k-numerictextbox').addClass(DOMElement.className).css('display', '');\n                that._inputWrapper = $(wrapper[0].firstChild);\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        setTimeout(function () {\n                            that.value(element[0].value);\n                            that.max(that._initialOptions.max);\n                            that.min(that._initialOptions.min);\n                        });\n                    };\n                    that._form = form.on('reset', that._resetHandler);\n                }\n            }\n        });\n        function buttonHtml(direction, text) {\n            var className = 'k-i-arrow-' + (direction === 'increase' ? '60-up' : '60-down');\n            return '<span unselectable=\"on\" class=\"k-link k-link-' + direction + '\" aria-label=\"' + text + '\" title=\"' + text + '\">' + '<span unselectable=\"on\" class=\"' + CLASS_ICON + ' ' + className + '\"></span>' + '</span>';\n        }\n        function truncate(value, precision) {\n            var parts = parseFloat(value, 10).toString().split(POINT);\n            if (parts[1]) {\n                parts[1] = parts[1].substring(0, precision);\n            }\n            return parts.join(POINT);\n        }\n        ui.plugin(NumericTextBox);\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.editable', [\n        'kendo.datepicker',\n        'kendo.numerictextbox',\n        'kendo.validator',\n        'kendo.binder'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'editable',\n        name: 'Editable',\n        category: 'framework',\n        depends: [\n            'datepicker',\n            'numerictextbox',\n            'validator',\n            'binder'\n        ],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, extend = $.extend, oldIE = kendo.support.browser.msie && kendo.support.browser.version < 9, isFunction = kendo.isFunction, isPlainObject = $.isPlainObject, inArray = $.inArray, nameSpecialCharRegExp = /(\"|\\%|'|\\[|\\]|\\$|\\.|\\,|\\:|\\;|\\+|\\*|\\&|\\!|\\#|\\(|\\)|<|>|\\=|\\?|\\@|\\^|\\{|\\}|\\~|\\/|\\||`)/g, ERRORTEMPLATE = '<div class=\"k-widget k-tooltip k-tooltip-validation\" style=\"margin:0.5em\"><span class=\"k-icon k-i-warning\"> </span>' + '#=message#<div class=\"k-callout k-callout-n\"></div></div>', CHANGE = 'change';\n        var EQUAL_SET = 'equalSet';\n        var specialRules = [\n            'url',\n            'email',\n            'number',\n            'date',\n            'boolean'\n        ];\n        function fieldType(field) {\n            field = field != null ? field : '';\n            return field.type || $.type(field) || 'string';\n        }\n        function convertToValueBinding(container) {\n            container.find(':input:not(:button, .k-combobox .k-input, [' + kendo.attr('role') + '=listbox], [' + kendo.attr('role') + '=upload], [' + kendo.attr('skip') + '], [type=file])').each(function () {\n                var bindAttr = kendo.attr('bind'), binding = this.getAttribute(bindAttr) || '', bindingName = this.type === 'checkbox' || this.type === 'radio' ? 'checked:' : 'value:', fieldName = this.name;\n                if (binding.indexOf(bindingName) === -1 && fieldName) {\n                    binding += (binding.length ? ',' : '') + bindingName + fieldName;\n                    $(this).attr(bindAttr, binding);\n                }\n            });\n        }\n        function createAttributes(options) {\n            var field = (options.model.fields || options.model)[options.field], type = fieldType(field), validation = field ? field.validation : {}, ruleName, DATATYPE = kendo.attr('type'), BINDING = kendo.attr('bind'), rule, attr = {\n                    name: options.field,\n                    title: options.title\n                };\n            for (ruleName in validation) {\n                rule = validation[ruleName];\n                if (inArray(ruleName, specialRules) >= 0) {\n                    attr[DATATYPE] = ruleName;\n                } else if (!isFunction(rule)) {\n                    attr[ruleName] = isPlainObject(rule) ? rule.value || ruleName : rule;\n                }\n                attr[kendo.attr(ruleName + '-msg')] = rule.message;\n            }\n            if (inArray(type, specialRules) >= 0) {\n                attr[DATATYPE] = type;\n            }\n            attr[BINDING] = (type === 'boolean' ? 'checked:' : 'value:') + options.field;\n            return attr;\n        }\n        function convertItems(items) {\n            var idx, length, item, value, text, result;\n            if (items && items.length) {\n                result = [];\n                for (idx = 0, length = items.length; idx < length; idx++) {\n                    item = items[idx];\n                    text = item.text || item.value || item;\n                    value = item.value == null ? item.text || item : item.value;\n                    result[idx] = {\n                        text: text,\n                        value: value\n                    };\n                }\n            }\n            return result;\n        }\n        var editors = {\n            'number': function (container, options) {\n                var attr = createAttributes(options);\n                $('<input type=\"text\"/>').attr(attr).appendTo(container).kendoNumericTextBox({ format: options.format });\n                $('<span ' + kendo.attr('for') + '=\"' + options.field + '\" class=\"k-invalid-msg\"/>').hide().appendTo(container);\n            },\n            'date': function (container, options) {\n                var attr = createAttributes(options), format = options.format;\n                if (format) {\n                    format = kendo._extractFormat(format);\n                }\n                attr[kendo.attr('format')] = format;\n                $('<input type=\"text\"/>').attr(attr).appendTo(container).kendoDatePicker({ format: options.format });\n                $('<span ' + kendo.attr('for') + '=\"' + options.field + '\" class=\"k-invalid-msg\"/>').hide().appendTo(container);\n            },\n            'string': function (container, options) {\n                var attr = createAttributes(options);\n                $('<input type=\"text\" class=\"k-input k-textbox\"/>').attr(attr).appendTo(container);\n            },\n            'boolean': function (container, options) {\n                var attr = createAttributes(options);\n                $('<input type=\"checkbox\" />').attr(attr).appendTo(container);\n            },\n            'values': function (container, options) {\n                var attr = createAttributes(options);\n                var items = kendo.stringify(convertItems(options.values));\n                $('<select ' + kendo.attr('text-field') + '=\"text\"' + kendo.attr('value-field') + '=\"value\"' + kendo.attr('source') + '=\\'' + (items ? items.replace(/\\'/g, '&apos;') : items) + '\\'' + kendo.attr('role') + '=\"dropdownlist\"/>').attr(attr).appendTo(container);\n                $('<span ' + kendo.attr('for') + '=\"' + options.field + '\" class=\"k-invalid-msg\"/>').hide().appendTo(container);\n            }\n        };\n        function addValidationRules(modelField, rules) {\n            var validation = modelField ? modelField.validation || {} : {}, rule, descriptor;\n            for (rule in validation) {\n                descriptor = validation[rule];\n                if (isPlainObject(descriptor) && descriptor.value) {\n                    descriptor = descriptor.value;\n                }\n                if (isFunction(descriptor)) {\n                    rules[rule] = descriptor;\n                }\n            }\n        }\n        var Editable = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                if (options.target) {\n                    options.$angular = options.target.options.$angular;\n                }\n                Widget.fn.init.call(that, element, options);\n                that._validateProxy = $.proxy(that._validate, that);\n                that.refresh();\n            },\n            events: [CHANGE],\n            options: {\n                name: 'Editable',\n                editors: editors,\n                clearContainer: true,\n                errorTemplate: ERRORTEMPLATE,\n                skipFocus: false\n            },\n            editor: function (field, modelField) {\n                var that = this, editors = that.options.editors, isObject = isPlainObject(field), fieldName = isObject ? field.field : field, model = that.options.model || {}, isValuesEditor = isObject && field.values, type = isValuesEditor ? 'values' : fieldType(modelField), isCustomEditor = isObject && field.editor, editor = isCustomEditor ? field.editor : editors[type], container = that.element.find('[' + kendo.attr('container-for') + '=' + fieldName.replace(nameSpecialCharRegExp, '\\\\$1') + ']');\n                editor = editor ? editor : editors.string;\n                if (isCustomEditor && typeof field.editor === 'string') {\n                    editor = function (container) {\n                        container.append(field.editor);\n                    };\n                }\n                container = container.length ? container : that.element;\n                editor(container, extend(true, {}, isObject ? field : { field: fieldName }, { model: model }));\n            },\n            _validate: function (e) {\n                var that = this, input, value = e.value, preventChangeTrigger = that._validationEventInProgress, values = {}, bindAttribute = kendo.attr('bind'), fieldName = e.field.replace(nameSpecialCharRegExp, '\\\\$1'), bindingRegex = new RegExp('(value|checked)\\\\s*:\\\\s*' + fieldName + '\\\\s*(,|$)');\n                values[e.field] = e.value;\n                input = $(':input[' + bindAttribute + '*=\"' + fieldName + '\"]', that.element).filter('[' + kendo.attr('validate') + '!=\\'false\\']').filter(function () {\n                    return bindingRegex.test($(this).attr(bindAttribute));\n                });\n                if (input.length > 1) {\n                    input = input.filter(function () {\n                        var element = $(this);\n                        return !element.is(':radio') || element.val() == value;\n                    });\n                }\n                try {\n                    that._validationEventInProgress = true;\n                    if (!that.validatable.validateInput(input) || !preventChangeTrigger && that.trigger(CHANGE, { values: values })) {\n                        e.preventDefault();\n                    }\n                } finally {\n                    that._validationEventInProgress = false;\n                }\n            },\n            end: function () {\n                return this.validatable.validate();\n            },\n            destroy: function () {\n                var that = this;\n                that.angular('cleanup', function () {\n                    return { elements: that.element };\n                });\n                Widget.fn.destroy.call(that);\n                that.options.model.unbind('set', that._validateProxy);\n                that.options.model.unbind(EQUAL_SET, that._validateProxy);\n                kendo.unbind(that.element);\n                if (that.validatable) {\n                    that.validatable.destroy();\n                }\n                kendo.destroy(that.element);\n                that.element.removeData('kendoValidator');\n                if (that.element.is('[' + kendo.attr('role') + '=editable]')) {\n                    that.element.removeAttr(kendo.attr('role'));\n                }\n            },\n            refresh: function () {\n                var that = this, idx, length, fields = that.options.fields || [], container = that.options.clearContainer ? that.element.empty() : that.element, model = that.options.model || {}, rules = {}, field, isObject, fieldName, modelField, modelFields;\n                if (!$.isArray(fields)) {\n                    fields = [fields];\n                }\n                for (idx = 0, length = fields.length; idx < length; idx++) {\n                    field = fields[idx];\n                    isObject = isPlainObject(field);\n                    fieldName = isObject ? field.field : field;\n                    modelField = (model.fields || model)[fieldName];\n                    addValidationRules(modelField, rules);\n                    that.editor(field, modelField);\n                }\n                if (that.options.target) {\n                    that.angular('compile', function () {\n                        return {\n                            elements: container,\n                            data: container.map(function () {\n                                return { dataItem: model };\n                            })\n                        };\n                    });\n                }\n                if (!length) {\n                    modelFields = model.fields || model;\n                    for (fieldName in modelFields) {\n                        addValidationRules(modelFields[fieldName], rules);\n                    }\n                }\n                convertToValueBinding(container);\n                if (that.validatable) {\n                    that.validatable.destroy();\n                }\n                kendo.bind(container, that.options.model);\n                that.options.model.unbind('set', that._validateProxy);\n                that.options.model.bind('set', that._validateProxy);\n                that.options.model.unbind(EQUAL_SET, that._validateProxy);\n                that.options.model.bind(EQUAL_SET, that._validateProxy);\n                that.validatable = new kendo.ui.Validator(container, {\n                    validateOnBlur: false,\n                    errorTemplate: that.options.errorTemplate || undefined,\n                    rules: rules\n                });\n                if (!that.options.skipFocus) {\n                    var focusable = container.find(':kendoFocusable').eq(0).focus();\n                    if (oldIE) {\n                        focusable.focus();\n                    }\n                }\n            }\n        });\n        ui.plugin(Editable);\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.listview', [\n        'kendo.data',\n        'kendo.editable',\n        'kendo.selectable'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'listview',\n        name: 'ListView',\n        category: 'web',\n        description: 'The ListView widget offers rich support for interacting with data.',\n        depends: ['data'],\n        features: [\n            {\n                id: 'listview-editing',\n                name: 'Editing',\n                description: 'Support for record editing',\n                depends: ['editable']\n            },\n            {\n                id: 'listview-selection',\n                name: 'Selection',\n                description: 'Support for selection',\n                depends: ['selectable']\n            }\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, CHANGE = 'change', CANCEL = 'cancel', DATABOUND = 'dataBound', DATABINDING = 'dataBinding', Widget = kendo.ui.Widget, keys = kendo.keys, FOCUSSELECTOR = '>*:not(.k-loading-mask)', PROGRESS = 'progress', ERROR = 'error', FOCUSED = 'k-state-focused', SELECTED = 'k-state-selected', KEDITITEM = 'k-edit-item', EDIT = 'edit', REMOVE = 'remove', SAVE = 'save', CLICK = 'click', NS = '.kendoListView', proxy = $.proxy, activeElement = kendo._activeElement, progress = kendo.ui.progress, DataSource = kendo.data.DataSource;\n        var ListView = kendo.ui.DataBoundWidget.extend({\n            init: function (element, options) {\n                var that = this;\n                options = $.isArray(options) ? { dataSource: options } : options;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                that.wrapper = element = that.element;\n                if (element[0].id) {\n                    that._itemId = element[0].id + '_lv_active';\n                }\n                that._element();\n                that._dataSource();\n                that._templates();\n                that._navigatable();\n                that._selectable();\n                that._pageable();\n                that._crudHandlers();\n                if (that.options.autoBind) {\n                    that.dataSource.fetch();\n                }\n                kendo.notify(that);\n            },\n            events: [\n                CHANGE,\n                CANCEL,\n                DATABINDING,\n                DATABOUND,\n                EDIT,\n                REMOVE,\n                SAVE\n            ],\n            options: {\n                name: 'ListView',\n                autoBind: true,\n                selectable: false,\n                navigatable: false,\n                template: '',\n                altTemplate: '',\n                editTemplate: ''\n            },\n            setOptions: function (options) {\n                Widget.fn.setOptions.call(this, options);\n                this._templates();\n                if (this.selectable) {\n                    this.selectable.destroy();\n                    this.selectable = null;\n                }\n                this._selectable();\n            },\n            _templates: function () {\n                var options = this.options;\n                this.template = kendo.template(options.template || '');\n                this.altTemplate = kendo.template(options.altTemplate || options.template);\n                this.editTemplate = kendo.template(options.editTemplate || '');\n            },\n            _item: function (action) {\n                return this.element.children()[action]();\n            },\n            items: function () {\n                return this.element.children();\n            },\n            dataItem: function (element) {\n                var attr = kendo.attr('uid');\n                var uid = $(element).closest('[' + attr + ']').attr(attr);\n                return this.dataSource.getByUid(uid);\n            },\n            setDataSource: function (dataSource) {\n                this.options.dataSource = dataSource;\n                this._dataSource();\n                if (this.options.autoBind) {\n                    dataSource.fetch();\n                }\n            },\n            _unbindDataSource: function () {\n                var that = this;\n                that.dataSource.unbind(CHANGE, that._refreshHandler).unbind(PROGRESS, that._progressHandler).unbind(ERROR, that._errorHandler);\n            },\n            _dataSource: function () {\n                var that = this;\n                if (that.dataSource && that._refreshHandler) {\n                    that._unbindDataSource();\n                } else {\n                    that._refreshHandler = proxy(that.refresh, that);\n                    that._progressHandler = proxy(that._progress, that);\n                    that._errorHandler = proxy(that._error, that);\n                }\n                that.dataSource = DataSource.create(that.options.dataSource).bind(CHANGE, that._refreshHandler).bind(PROGRESS, that._progressHandler).bind(ERROR, that._errorHandler);\n            },\n            _progress: function () {\n                progress(this.element, true);\n            },\n            _error: function () {\n                progress(this.element, false);\n            },\n            _element: function () {\n                this.element.addClass('k-widget k-listview').attr('role', 'listbox');\n            },\n            refresh: function (e) {\n                var that = this, view = that.dataSource.view(), data, items, item, html = '', idx, length, template = that.template, altTemplate = that.altTemplate, active = activeElement();\n                e = e || {};\n                if (e.action === 'itemchange') {\n                    if (!that._hasBindingTarget() && !that.editable) {\n                        data = e.items[0];\n                        item = that.items().filter('[' + kendo.attr('uid') + '=' + data.uid + ']');\n                        if (item.length > 0) {\n                            idx = item.index();\n                            that.angular('cleanup', function () {\n                                return { elements: [item] };\n                            });\n                            item.replaceWith(template(data));\n                            item = that.items().eq(idx);\n                            item.attr(kendo.attr('uid'), data.uid);\n                            that.angular('compile', function () {\n                                return {\n                                    elements: [item],\n                                    data: [{ dataItem: data }]\n                                };\n                            });\n                            that.trigger('itemChange', {\n                                item: item,\n                                data: data\n                            });\n                        }\n                    }\n                    return;\n                }\n                if (that.trigger(DATABINDING, {\n                        action: e.action || 'rebind',\n                        items: e.items,\n                        index: e.index\n                    })) {\n                    return;\n                }\n                that._angularItems('cleanup');\n                that._destroyEditable();\n                for (idx = 0, length = view.length; idx < length; idx++) {\n                    if (idx % 2) {\n                        html += altTemplate(view[idx]);\n                    } else {\n                        html += template(view[idx]);\n                    }\n                }\n                that.element.html(html);\n                items = that.items();\n                for (idx = 0, length = view.length; idx < length; idx++) {\n                    items.eq(idx).attr(kendo.attr('uid'), view[idx].uid).attr('role', 'option').attr('aria-selected', 'false');\n                }\n                if (that.element[0] === active && that.options.navigatable) {\n                    that.current(items.eq(0));\n                }\n                that._angularItems('compile');\n                that.trigger(DATABOUND, {\n                    action: e.action || 'rebind',\n                    items: e.items,\n                    index: e.index\n                });\n            },\n            _pageable: function () {\n                var that = this, pageable = that.options.pageable, settings, pagerId;\n                if ($.isPlainObject(pageable)) {\n                    pagerId = pageable.pagerId;\n                    settings = $.extend({}, pageable, {\n                        dataSource: that.dataSource,\n                        pagerId: null\n                    });\n                    that.pager = new kendo.ui.Pager($('#' + pagerId), settings);\n                }\n            },\n            _selectable: function () {\n                var that = this, multi, current, selectable = that.options.selectable, navigatable = that.options.navigatable;\n                if (selectable) {\n                    multi = kendo.ui.Selectable.parseOptions(selectable).multiple;\n                    that.selectable = new kendo.ui.Selectable(that.element, {\n                        aria: true,\n                        multiple: multi,\n                        filter: FOCUSSELECTOR,\n                        change: function () {\n                            that.trigger(CHANGE);\n                        }\n                    });\n                    if (navigatable) {\n                        that.element.on('keydown' + NS, function (e) {\n                            if (e.keyCode === keys.SPACEBAR) {\n                                current = that.current();\n                                if (e.target == e.currentTarget) {\n                                    e.preventDefault();\n                                }\n                                if (multi) {\n                                    if (!e.ctrlKey) {\n                                        that.selectable.clear();\n                                    } else {\n                                        if (current && current.hasClass(SELECTED)) {\n                                            current.removeClass(SELECTED);\n                                            return;\n                                        }\n                                    }\n                                } else {\n                                    that.selectable.clear();\n                                }\n                                that.selectable.value(current);\n                            }\n                        });\n                    }\n                }\n            },\n            current: function (candidate) {\n                var that = this, element = that.element, current = that._current, id = that._itemId;\n                if (candidate === undefined) {\n                    return current;\n                }\n                if (current && current[0]) {\n                    if (current[0].id === id) {\n                        current.removeAttr('id');\n                    }\n                    current.removeClass(FOCUSED);\n                    element.removeAttr('aria-activedescendant');\n                }\n                if (candidate && candidate[0]) {\n                    id = candidate[0].id || id;\n                    that._scrollTo(candidate[0]);\n                    element.attr('aria-activedescendant', id);\n                    candidate.addClass(FOCUSED).attr('id', id);\n                }\n                that._current = candidate;\n            },\n            _scrollTo: function (element) {\n                var that = this, container, UseJQueryoffset = false, SCROLL = 'scroll';\n                if (that.wrapper.css('overflow') == 'auto' || that.wrapper.css('overflow') == SCROLL) {\n                    container = that.wrapper[0];\n                } else {\n                    container = window;\n                    UseJQueryoffset = true;\n                }\n                var scrollDirectionFunc = function (direction, dimension) {\n                    var elementOffset = UseJQueryoffset ? $(element).offset()[direction.toLowerCase()] : element['offset' + direction], elementDimension = element['client' + dimension], containerScrollAmount = $(container)[SCROLL + direction](), containerDimension = $(container)[dimension.toLowerCase()]();\n                    if (elementOffset + elementDimension > containerScrollAmount + containerDimension) {\n                        $(container)[SCROLL + direction](elementOffset + elementDimension - containerDimension);\n                    } else if (elementOffset < containerScrollAmount) {\n                        $(container)[SCROLL + direction](elementOffset);\n                    }\n                };\n                scrollDirectionFunc('Top', 'Height');\n                scrollDirectionFunc('Left', 'Width');\n            },\n            _navigatable: function () {\n                var that = this, navigatable = that.options.navigatable, element = that.element, clickCallback = function (e) {\n                        that.current($(e.currentTarget));\n                        if (!$(e.target).is(':button,a,:input,a>.k-icon,textarea')) {\n                            kendo.focusElement(element);\n                        }\n                    };\n                if (navigatable) {\n                    that._tabindex();\n                    element.on('focus' + NS, function () {\n                        var current = that._current;\n                        if (!current || !current.is(':visible')) {\n                            current = that._item('first');\n                        }\n                        that.current(current);\n                    }).on('focusout' + NS, function () {\n                        if (that._current) {\n                            that._current.removeClass(FOCUSED);\n                        }\n                    }).on('keydown' + NS, function (e) {\n                        var key = e.keyCode, current = that.current(), target = $(e.target), canHandle = !target.is(':button,textarea,a,a>.t-icon,input'), isTextBox = target.is(':text,:password'), preventDefault = kendo.preventDefault, editItem = element.find('.' + KEDITITEM), active = activeElement(), idx;\n                        if (!canHandle && !isTextBox && keys.ESC != key || isTextBox && keys.ESC != key && keys.ENTER != key) {\n                            return;\n                        }\n                        if (keys.UP === key || keys.LEFT === key) {\n                            if (current) {\n                                current = current.prev();\n                            }\n                            that.current(!current || !current[0] ? that._item('last') : current);\n                            preventDefault(e);\n                        } else if (keys.DOWN === key || keys.RIGHT === key) {\n                            if (current) {\n                                current = current.next();\n                            }\n                            that.current(!current || !current[0] ? that._item('first') : current);\n                            preventDefault(e);\n                        } else if (keys.PAGEUP === key) {\n                            that.current(null);\n                            that.dataSource.page(that.dataSource.page() - 1);\n                            preventDefault(e);\n                        } else if (keys.PAGEDOWN === key) {\n                            that.current(null);\n                            that.dataSource.page(that.dataSource.page() + 1);\n                            preventDefault(e);\n                        } else if (keys.HOME === key) {\n                            that.current(that._item('first'));\n                            preventDefault(e);\n                        } else if (keys.END === key) {\n                            that.current(that._item('last'));\n                            preventDefault(e);\n                        } else if (keys.ENTER === key) {\n                            if (editItem.length !== 0 && (canHandle || isTextBox)) {\n                                idx = that.items().index(editItem);\n                                if (active) {\n                                    active.blur();\n                                }\n                                that.save();\n                                var focusAgain = function () {\n                                    that.element.trigger('focus');\n                                    that.current(that.items().eq(idx));\n                                };\n                                that.one('dataBound', focusAgain);\n                            } else if (that.options.editTemplate !== '') {\n                                that.edit(current);\n                            }\n                        } else if (keys.ESC === key) {\n                            editItem = element.find('.' + KEDITITEM);\n                            if (editItem.length === 0) {\n                                return;\n                            }\n                            idx = that.items().index(editItem);\n                            that.cancel();\n                            that.element.trigger('focus');\n                            that.current(that.items().eq(idx));\n                        }\n                    });\n                    element.on('mousedown' + NS + ' touchstart' + NS, FOCUSSELECTOR, proxy(clickCallback, that));\n                }\n            },\n            clearSelection: function () {\n                var that = this;\n                that.selectable.clear();\n                that.trigger(CHANGE);\n            },\n            select: function (items) {\n                var that = this, selectable = that.selectable;\n                items = $(items);\n                if (items.length) {\n                    if (!selectable.options.multiple) {\n                        selectable.clear();\n                        items = items.first();\n                    }\n                    selectable.value(items);\n                    return;\n                }\n                return selectable.value();\n            },\n            _destroyEditable: function () {\n                var that = this;\n                if (that.editable) {\n                    that.editable.destroy();\n                    delete that.editable;\n                }\n            },\n            _modelFromElement: function (element) {\n                var uid = element.attr(kendo.attr('uid'));\n                return this.dataSource.getByUid(uid);\n            },\n            _closeEditable: function () {\n                var that = this, editable = that.editable, data, item, index, template = that.template;\n                if (editable) {\n                    if (editable.element.index() % 2) {\n                        template = that.altTemplate;\n                    }\n                    that.angular('cleanup', function () {\n                        return { elements: [editable.element] };\n                    });\n                    data = that._modelFromElement(editable.element);\n                    that._destroyEditable();\n                    index = editable.element.index();\n                    editable.element.replaceWith(template(data));\n                    item = that.items().eq(index);\n                    item.attr(kendo.attr('uid'), data.uid);\n                    if (that._hasBindingTarget()) {\n                        kendo.bind(item, data);\n                    }\n                    that.angular('compile', function () {\n                        return {\n                            elements: [item],\n                            data: [{ dataItem: data }]\n                        };\n                    });\n                }\n                return true;\n            },\n            edit: function (item) {\n                var that = this, data = that._modelFromElement(item), container, uid = data.uid, index;\n                that.cancel();\n                item = that.items().filter('[' + kendo.attr('uid') + '=' + uid + ']');\n                index = item.index();\n                item.replaceWith(that.editTemplate(data));\n                container = that.items().eq(index).addClass(KEDITITEM).attr(kendo.attr('uid'), data.uid);\n                that.editable = container.kendoEditable({\n                    model: data,\n                    clearContainer: false,\n                    errorTemplate: false,\n                    target: that\n                }).data('kendoEditable');\n                that.trigger(EDIT, {\n                    model: data,\n                    item: container\n                });\n            },\n            save: function () {\n                var that = this, editable = that.editable, model;\n                if (!editable) {\n                    return;\n                }\n                var container = editable.element;\n                model = that._modelFromElement(container);\n                if (editable.end() && !that.trigger(SAVE, {\n                        model: model,\n                        item: container\n                    })) {\n                    that._closeEditable();\n                    that.dataSource.sync();\n                }\n            },\n            remove: function (item) {\n                var that = this, dataSource = that.dataSource, data = that._modelFromElement(item);\n                if (that.editable) {\n                    dataSource.cancelChanges(that._modelFromElement(that.editable.element));\n                    that._closeEditable();\n                }\n                if (!that.trigger(REMOVE, {\n                        model: data,\n                        item: item\n                    })) {\n                    item.hide();\n                    dataSource.remove(data);\n                    dataSource.sync();\n                }\n            },\n            add: function () {\n                var that = this, dataItem, dataSource = that.dataSource, index = dataSource.indexOf((dataSource.view() || [])[0]);\n                if (index < 0) {\n                    index = 0;\n                }\n                that.cancel();\n                dataItem = dataSource.insert(index, {});\n                that.edit(that.element.find('[data-uid=\\'' + dataItem.uid + '\\']'));\n            },\n            cancel: function () {\n                var that = this, dataSource = that.dataSource;\n                if (that.editable) {\n                    var container = that.editable.element;\n                    var model = that._modelFromElement(container);\n                    if (!that.trigger(CANCEL, {\n                            model: model,\n                            container: container\n                        })) {\n                        dataSource.cancelChanges(model);\n                        that._closeEditable();\n                    }\n                }\n            },\n            _crudHandlers: function () {\n                var that = this, clickNS = CLICK + NS;\n                that.element.on(clickNS, '.k-edit-button', function (e) {\n                    var item = $(this).closest('[' + kendo.attr('uid') + ']');\n                    that.edit(item);\n                    e.preventDefault();\n                });\n                that.element.on(clickNS, '.k-delete-button', function (e) {\n                    var item = $(this).closest('[' + kendo.attr('uid') + ']');\n                    that.remove(item);\n                    e.preventDefault();\n                });\n                that.element.on(clickNS, '.k-update-button', function (e) {\n                    that.save();\n                    e.preventDefault();\n                });\n                that.element.on(clickNS, '.k-cancel-button', function (e) {\n                    that.cancel();\n                    e.preventDefault();\n                });\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that._unbindDataSource();\n                that._destroyEditable();\n                that.element.off(NS);\n                if (that.pager) {\n                    that.pager.destroy();\n                }\n                kendo.destroy(that.element);\n            }\n        });\n        kendo.ui.plugin(ListView);\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.listbox', [\n        'kendo.draganddrop',\n        'kendo.data',\n        'kendo.selectable'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'listbox',\n        name: 'ListBox',\n        category: 'web',\n        depends: [\n            'draganddrop',\n            'data',\n            'selectable'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo;\n        var kendoAttr = kendo.attr;\n        var data = kendo.data;\n        var keys = kendo.keys;\n        var kendoTemplate = kendo.template;\n        var Widget = kendo.ui.Widget;\n        var DataSource = data.DataSource;\n        var Selectable = kendo.ui.Selectable;\n        var DataBoundWidget = kendo.ui.DataBoundWidget;\n        var Class = kendo.Class;\n        var extend = $.extend;\n        var noop = $.noop;\n        var proxy = $.proxy;\n        var DASH = '-';\n        var DOT = '.';\n        var SPACE = ' ';\n        var HASH = '#';\n        var KENDO_LISTBOX = 'kendoListBox';\n        var NS = DOT + KENDO_LISTBOX;\n        var DISABLED_STATE_CLASS = 'k-state-disabled';\n        var SELECTED_STATE_CLASS = 'k-state-selected';\n        var ENABLED_ITEM_SELECTOR = '.k-item:not(.k-state-disabled)';\n        var ENABLED_ITEMS_SELECTOR = '.k-list:not(.k-state-disabled) >' + ENABLED_ITEM_SELECTOR;\n        var TOOLBAR_CLASS = 'k-listbox-toolbar';\n        var TOOL_SELECTOR = 'li > a.k-button:not(.k-state-disabled)';\n        var FOCUSED_CLASS = 'k-state-focused';\n        var DRAG_CLUE_CLASS = 'k-drag-clue';\n        var DROP_HINT_CLASS = 'k-drop-hint';\n        var LIST_CLASS = 'k-reset k-list';\n        var LIST_SELECTOR = '.k-reset.k-list';\n        var RESET = 'k-reset';\n        var CLICK = 'click' + NS;\n        var KEYDOWN = 'keydown' + NS;\n        var BLUR = 'blur' + NS;\n        var outerWidth = kendo._outerWidth;\n        var outerHeight = kendo._outerHeight;\n        var CHANGE = 'change';\n        var DATABOUND = 'dataBound';\n        var ADD = 'add';\n        var REMOVE = 'remove';\n        var REORDER = 'reorder';\n        var MOVE_UP = 'moveUp';\n        var MOVE_DOWN = 'moveDown';\n        var TRANSFER_TO = 'transferTo';\n        var TRANSFER_FROM = 'transferFrom';\n        var TRANSFER_ALL_TO = 'transferAllTo';\n        var TRANSFER_ALL_FROM = 'transferAllFrom';\n        var DRAGGEDCLASS = 'k-ghost';\n        var UNIQUE_ID = 'uid';\n        var TABINDEX = 'tabindex';\n        var COMMAND = 'command';\n        var MOVE_UP_OFFSET = -1;\n        var MOVE_DOWN_OFFSET = 1;\n        var DRAGSTART = 'dragstart';\n        var DRAG = 'drag';\n        var DROP = 'drop';\n        var DRAGEND = 'dragend';\n        var DEFAULT_FILTER = 'ul.k-reset.k-list>li.k-item';\n        var RIGHT = 'right';\n        var BOTTOM = 'bottom';\n        var TOOLBAR_POSITION_CLASS_NAMES = [\n            TOOLBAR_CLASS + DASH + 'left',\n            TOOLBAR_CLASS + DASH + RIGHT,\n            TOOLBAR_CLASS + DASH + 'top',\n            TOOLBAR_CLASS + DASH + BOTTOM\n        ];\n        function getSortedDomIndices(items) {\n            var indices = $.map(items, function (item) {\n                return $(item).index();\n            });\n            return indices;\n        }\n        function isUndefined(value) {\n            return typeof value === 'undefined';\n        }\n        function defaultHint(element) {\n            return element.clone().removeClass(DRAGGEDCLASS).removeClass(FOCUSED_CLASS).addClass(kendo.format('{0} {1} {2}', SELECTED_STATE_CLASS, RESET, DRAG_CLUE_CLASS)).width(element.width());\n        }\n        function defaultPlaceholder() {\n            return $('<li>').addClass(DROP_HINT_CLASS);\n        }\n        var ListBox = DataBoundWidget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that._wrapper();\n                that._list();\n                element = that.element.attr('multiple', 'multiple').hide();\n                if (element[0] && !that.options.dataSource) {\n                    that.options.dataTextField = that.options.dataTextField || 'text';\n                    that.options.dataValueField = that.options.dataValueField || 'value';\n                }\n                that._templates();\n                that._selectable();\n                that._dataSource();\n                that._createToolbar();\n                that._createDraggable();\n                that._createNavigatable();\n            },\n            destroy: function () {\n                var that = this;\n                DataBoundWidget.fn.destroy.call(that);\n                if (!isNaN(that._listTabIndex)) {\n                    that._getList().off();\n                    that._listTabIndex = null;\n                }\n                that._unbindDataSource();\n                that._destroySelectable();\n                that._destroyToolbar();\n                that.wrapper.off(NS);\n                if (that._target) {\n                    that._target = null;\n                }\n                if (that._draggable) {\n                    that._draggable.destroy();\n                    that.placeholder = null;\n                }\n                kendo.destroy(that.element);\n            },\n            setOptions: function (options) {\n                Widget.fn.setOptions.call(this, options);\n                this._templates();\n                this._dataSource();\n            },\n            events: [\n                CHANGE,\n                DATABOUND,\n                ADD,\n                REMOVE,\n                REORDER,\n                DRAGSTART,\n                DRAG,\n                DROP,\n                DRAGEND\n            ],\n            options: {\n                name: 'ListBox',\n                autoBind: true,\n                template: '',\n                dataTextField: '',\n                dataValueField: '',\n                selectable: 'single',\n                draggable: null,\n                dropSources: [],\n                connectWith: '',\n                navigatable: true,\n                toolbar: {\n                    position: RIGHT,\n                    tools: []\n                },\n                messages: {\n                    tools: {\n                        remove: 'Delete',\n                        moveUp: 'Move Up',\n                        moveDown: 'Move Down',\n                        transferTo: 'Transfer To',\n                        transferFrom: 'Transfer From',\n                        transferAllTo: 'Transfer All To',\n                        transferAllFrom: 'Transfer All From'\n                    }\n                }\n            },\n            add: function (dataItems) {\n                var that = this;\n                var items = dataItems && dataItems.length ? dataItems : [dataItems];\n                var itemsLength = items.length;\n                var i;\n                that._unbindDataSource();\n                for (i = 0; i < itemsLength; i++) {\n                    that._addItem(items[i]);\n                }\n                that._bindDataSource();\n                that._syncElement();\n            },\n            _addItem: function (dataItem) {\n                var that = this;\n                var item = that.templates.itemTemplate({\n                    item: dataItem,\n                    r: that.templates.itemContent\n                });\n                $(item).attr(kendoAttr(UNIQUE_ID), dataItem.uid).appendTo(that._getList());\n                if (typeof dataItem === typeof '') {\n                    that.dataSource._data.push(dataItem);\n                } else {\n                    that.dataSource.add(dataItem);\n                }\n            },\n            _addItemAt: function (dataItem, index) {\n                var that = this;\n                var item = that.templates.itemTemplate({\n                    item: dataItem,\n                    r: that.templates.itemContent\n                });\n                that._unbindDataSource();\n                if (typeof dataItem === typeof '') {\n                    that._insertElementAt(item, index);\n                    that.dataSource._data.push(dataItem);\n                } else {\n                    that._insertElementAt($(item).attr(kendoAttr(UNIQUE_ID), dataItem.uid), index);\n                    that.dataSource.add(dataItem);\n                }\n                that._bindDataSource();\n                that._syncElement();\n            },\n            _insertElementAt: function (item, index) {\n                var that = this;\n                var list = that._getList();\n                if (index > 0) {\n                    $(item).insertAfter(list.children().eq(index - 1));\n                } else {\n                    $(list).prepend(item);\n                }\n            },\n            _createNavigatable: function () {\n                var that = this;\n                var options = that.options;\n                if (options.navigatable) {\n                    that._getList().on(CLICK, ENABLED_ITEM_SELECTOR, proxy(that._click, that)).on(KEYDOWN, proxy(that._keyDown, that)).on(BLUR, proxy(that._blur, that));\n                }\n            },\n            _getTabIndex: function () {\n                var that = this;\n                var tabindex;\n                if (!isNaN(that._listTabIndex)) {\n                    return that._listTabIndex;\n                }\n                tabindex = that.element.attr(TABINDEX);\n                that._listTabIndex = !isNaN(tabindex) ? tabindex : 0;\n                that.element.removeAttr(TABINDEX);\n                return that._listTabIndex;\n            },\n            _blur: function () {\n                if (this._target) {\n                    this._target.removeClass(FOCUSED_CLASS);\n                    this._getList().removeAttr('aria-activedescendant');\n                }\n                this._target = null;\n            },\n            _click: function (e) {\n                var that = this;\n                var target = $(e.currentTarget);\n                var oldTarget = that._target;\n                if (oldTarget) {\n                    oldTarget.removeClass(FOCUSED_CLASS);\n                }\n                that._target = target;\n                target.addClass(FOCUSED_CLASS);\n                that._getList().attr('aria-activedescendant', target.attr('id'));\n                if (that._getList()[0] !== kendo._activeElement()) {\n                    that.focus();\n                }\n            },\n            _getNavigatableItem: function (key) {\n                var that = this;\n                var current;\n                if (!that._target) {\n                    current = that.items().filter(ENABLED_ITEM_SELECTOR).first();\n                } else {\n                    current = that._target;\n                }\n                if (key === keys.UP && that._target) {\n                    current = that._target.prevAll(ENABLED_ITEM_SELECTOR).first();\n                }\n                if (key === keys.DOWN && that._target) {\n                    current = that._target.nextAll(ENABLED_ITEM_SELECTOR).first();\n                }\n                return current.length ? current : null;\n            },\n            _scrollIntoView: function (item) {\n                if (!item) {\n                    return;\n                }\n                if (item[0]) {\n                    item = item[0];\n                }\n                var list = this._getList().parent()[0];\n                var itemOffsetTop = item.offsetTop;\n                var contentScrollTop = list.scrollTop;\n                var contentOffsetHeight = list.clientHeight;\n                var bottomDistance = itemOffsetTop + item.offsetHeight;\n                if (contentScrollTop > itemOffsetTop) {\n                    contentScrollTop = itemOffsetTop;\n                } else if (bottomDistance > contentScrollTop + contentOffsetHeight) {\n                    contentScrollTop = bottomDistance - contentOffsetHeight;\n                }\n                list.scrollTop = contentScrollTop;\n            },\n            _keyDown: function (e) {\n                var that = this;\n                var key = e.keyCode;\n                var current = that._getNavigatableItem(key);\n                var shouldPreventDefault;\n                if (that._target) {\n                    that._target.removeClass(FOCUSED_CLASS);\n                }\n                if (!(e.shiftKey && !e.ctrlKey && (key === keys.DOWN || key === keys.UP))) {\n                    that._shiftSelecting = false;\n                }\n                if (key == keys.DELETE) {\n                    that._executeCommand(REMOVE);\n                    if (that._target) {\n                        that._target.removeClass(FOCUSED_CLASS);\n                        that._getList().removeAttr('aria-activedescendant');\n                        that._target = null;\n                    }\n                    shouldPreventDefault = true;\n                } else if (key === keys.DOWN || key === keys.UP) {\n                    if (!current) {\n                        e.preventDefault();\n                        return;\n                    }\n                    if (e.shiftKey && !e.ctrlKey) {\n                        if (!that._shiftSelecting) {\n                            that.clearSelection();\n                            that._shiftSelecting = true;\n                        }\n                        if (that._target && current.hasClass('k-state-selected')) {\n                            that._target.removeClass(SELECTED_STATE_CLASS);\n                            that.trigger(CHANGE);\n                        } else if (that.options.selectable == 'single') {\n                            that.select(current);\n                        } else {\n                            that.select(current.add(that._target));\n                        }\n                    } else if (e.shiftKey && e.ctrlKey) {\n                        that._executeCommand(key === keys.DOWN ? MOVE_DOWN : MOVE_UP);\n                        that._scrollIntoView(that._target);\n                        e.preventDefault();\n                        return;\n                    } else if (!e.shiftKey && !e.ctrlKey) {\n                        if (that.options.selectable === 'multiple') {\n                            that.clearSelection();\n                        }\n                        that.select(current);\n                    }\n                    that._target = current;\n                    if (that._target) {\n                        that._target.addClass(FOCUSED_CLASS);\n                        that._scrollIntoView(that._target);\n                        that._getList().attr('aria-activedescendant', that._target.attr('id'));\n                    } else {\n                        that._getList().removeAttr('aria-activedescendant');\n                    }\n                    shouldPreventDefault = true;\n                } else if (key == keys.SPACEBAR) {\n                    if (e.ctrlKey && that._target) {\n                        if (that._target.hasClass(SELECTED_STATE_CLASS)) {\n                            that._target.removeClass(SELECTED_STATE_CLASS);\n                            that.trigger(CHANGE);\n                        } else {\n                            that.select(that._target);\n                        }\n                    } else {\n                        that.clearSelection();\n                        that.select(that._target);\n                    }\n                    shouldPreventDefault = true;\n                } else if (e.ctrlKey && key == keys.RIGHT) {\n                    if (e.shiftKey) {\n                        that._executeCommand(TRANSFER_ALL_TO);\n                    } else {\n                        that._executeCommand(TRANSFER_TO);\n                    }\n                    that._target = that.select().length ? that.select() : null;\n                    shouldPreventDefault = true;\n                } else if (e.ctrlKey && key == keys.LEFT) {\n                    if (e.shiftKey) {\n                        that._executeCommand(TRANSFER_ALL_FROM);\n                    } else {\n                        that._executeCommand(TRANSFER_FROM);\n                    }\n                    shouldPreventDefault = true;\n                }\n                if (shouldPreventDefault) {\n                    e.preventDefault();\n                }\n            },\n            focus: function () {\n                kendo.focusElement(this._getList());\n            },\n            _createDraggable: function () {\n                var that = this;\n                var draggable = that.options.draggable;\n                var hint;\n                if (draggable) {\n                    hint = draggable.hint;\n                    if (!that.options.selectable) {\n                        throw new Error('Dragging requires selection to be enabled');\n                    }\n                    if (!hint) {\n                        hint = defaultHint;\n                    }\n                    that._draggable = new kendo.ui.Draggable(that.wrapper, {\n                        filter: draggable.filter ? draggable.filter : DEFAULT_FILTER,\n                        hint: kendo.isFunction(hint) ? hint : $(hint),\n                        dragstart: proxy(that._dragstart, that),\n                        dragcancel: proxy(that._clear, that),\n                        drag: proxy(that._drag, that),\n                        dragend: proxy(that._dragend, that)\n                    });\n                }\n            },\n            _dragstart: function (e) {\n                var that = this;\n                var draggedElement = that.draggedElement = e.currentTarget;\n                var placeholder = that.options.draggable.placeholder;\n                var dataItem = that.dataItem(draggedElement);\n                var eventData = {\n                    dataItems: dataItem,\n                    items: $(draggedElement),\n                    draggableEvent: e\n                };\n                if (that.options.draggable.enabled === false) {\n                    e.preventDefault();\n                    return;\n                }\n                if (!placeholder) {\n                    placeholder = defaultPlaceholder;\n                }\n                that.placeholder = kendo.isFunction(placeholder) ? $(placeholder.call(that, draggedElement)) : $(placeholder);\n                if (draggedElement.is(DOT + DISABLED_STATE_CLASS)) {\n                    e.preventDefault();\n                } else {\n                    if (that.trigger(DRAGSTART, eventData)) {\n                        e.preventDefault();\n                    } else {\n                        that.clearSelection();\n                        that.select(draggedElement);\n                        draggedElement.addClass(DRAGGEDCLASS);\n                    }\n                }\n            },\n            _clear: function () {\n                this.draggedElement.removeClass(DRAGGEDCLASS);\n                this.placeholder.remove();\n            },\n            _findElementUnderCursor: function (e) {\n                var elementUnderCursor = kendo.elementUnderCursor(e);\n                var draggable = e.sender;\n                if ($.contains(draggable.hint[0], elementUnderCursor) || draggable.hint[0] === elementUnderCursor) {\n                    draggable.hint.hide();\n                    elementUnderCursor = kendo.elementUnderCursor(e);\n                    draggable.hint.show();\n                }\n                return elementUnderCursor;\n            },\n            _findTarget: function (e) {\n                var that = this;\n                var element = that._findElementUnderCursor(e);\n                var elementNode = $(element);\n                var list = that._getList();\n                var items;\n                var node;\n                if ($.contains(list[0], element)) {\n                    items = that.items();\n                    element = elementNode.is('li') ? element : elementNode.closest('li')[0];\n                    node = items.filter(element)[0] || items.has(element)[0];\n                    if (node) {\n                        node = $(node);\n                        return !node.hasClass(DISABLED_STATE_CLASS) ? {\n                            element: node,\n                            listBox: that\n                        } : null;\n                    } else {\n                        return null;\n                    }\n                } else if (list[0] == element || list.parent()[0] == element) {\n                    return {\n                        element: $(list),\n                        appendToBottom: true,\n                        listBox: that\n                    };\n                } else {\n                    return that._searchConnectedListBox(elementNode);\n                }\n            },\n            _getElementCenter: function (element) {\n                var center = element.length ? kendo.getOffset(element) : null;\n                if (center) {\n                    center.top += outerHeight(element) / 2;\n                    center.left += outerWidth(element) / 2;\n                }\n                return center;\n            },\n            _searchConnectedListBox: function (element) {\n                var connectedListBox;\n                var items;\n                var node;\n                var originalElement = element;\n                var closestContainer;\n                if (element.hasClass('k-list-scroller k-selectable')) {\n                    closestContainer = element;\n                } else {\n                    closestContainer = element.closest('.k-list-scroller.k-selectable');\n                }\n                if (closestContainer.length) {\n                    connectedListBox = closestContainer.parent().find('[data-role=\\'listbox\\']').getKendoListBox();\n                } else {\n                    return null;\n                }\n                if (connectedListBox && $.inArray(this.element[0].id, connectedListBox.options.dropSources) !== -1) {\n                    items = connectedListBox.items();\n                    element = element.is('li') ? element[0] : element.closest('li')[0];\n                    node = items.filter(element)[0] || items.has(element)[0];\n                    if (node) {\n                        node = $(node);\n                        return !node.hasClass(DISABLED_STATE_CLASS) ? {\n                            element: node,\n                            listBox: connectedListBox\n                        } : null;\n                    } else if (!items.length || originalElement.hasClass('k-list-scroller k-selectable') || originalElement.hasClass('k-reset k-list')) {\n                        return {\n                            element: connectedListBox._getList(),\n                            listBox: connectedListBox,\n                            appendToBottom: true\n                        };\n                    } else {\n                        return null;\n                    }\n                }\n                return null;\n            },\n            _drag: function (e) {\n                var that = this;\n                var draggedElement = that.draggedElement;\n                var target = that._findTarget(e);\n                var cursorOffset = {\n                    left: e.x.location,\n                    top: e.y.location\n                };\n                var dataItem = that.dataItem(draggedElement);\n                var eventData = {\n                    dataItems: [dataItem],\n                    items: $(draggedElement),\n                    draggableEvent: e\n                };\n                var targetCenter;\n                var offsetDelta;\n                var direction;\n                if (that.trigger(DRAG, eventData)) {\n                    e.preventDefault();\n                    return;\n                }\n                if (target) {\n                    targetCenter = this._getElementCenter(target.element);\n                    offsetDelta = {\n                        left: Math.round(cursorOffset.left - targetCenter.left),\n                        top: Math.round(cursorOffset.top - targetCenter.top)\n                    };\n                    if (target.appendToBottom) {\n                        that._movePlaceholder(target, null, draggedElement);\n                        return;\n                    }\n                    if (offsetDelta.top < 0) {\n                        direction = 'prev';\n                    } else if (offsetDelta.top > 0) {\n                        direction = 'next';\n                    }\n                    if (direction) {\n                        if (target.element[0] != that.placeholder[0]) {\n                            that._movePlaceholder(target, direction, draggedElement);\n                        }\n                    }\n                } else if (that.placeholder.parent().length) {\n                    that.placeholder.remove();\n                }\n            },\n            _movePlaceholder: function (target, direction, draggedElement) {\n                var that = this;\n                var placeholder = that.placeholder;\n                var draggableOptions = target.listBox.options.draggable;\n                if (placeholder.parent().length) {\n                    that.placeholder.remove();\n                    if (draggableOptions && draggableOptions.placeholder) {\n                        that.placeholder = kendo.isFunction(draggableOptions.placeholder) ? $(draggableOptions.placeholder.call(that, draggedElement)) : $(draggableOptions.placeholder);\n                    } else {\n                        that.placeholder = $(defaultPlaceholder.call(that, draggedElement));\n                    }\n                }\n                if (!direction) {\n                    target.element.append(that.placeholder);\n                } else if (direction === 'prev') {\n                    target.element.before(that.placeholder);\n                } else if (direction === 'next') {\n                    target.element.after(that.placeholder);\n                }\n            },\n            _dragend: function (e) {\n                var that = this;\n                var draggedItem = that.draggedElement;\n                var items = that.items();\n                var placeholderIndex = items.not(that.draggedElement).index(that.placeholder);\n                var draggedIndex = items.not(that.placeholder).index(that.draggedElement);\n                var dataItem = that.dataItem(draggedItem);\n                var eventData = {\n                    dataItems: [dataItem],\n                    items: $(draggedItem)\n                };\n                var connectedListBox = that.placeholder.closest('.k-widget.k-listbox').find('[data-role=\\'listbox\\']').getKendoListBox();\n                if (that.trigger(DROP, extend({}, eventData, { draggableEvent: e }))) {\n                    e.preventDefault();\n                    this._clear();\n                    return;\n                }\n                if (placeholderIndex >= 0) {\n                    if (placeholderIndex !== draggedIndex && !that.trigger(REORDER, extend({}, eventData, { offset: placeholderIndex - draggedIndex }))) {\n                        draggedItem.removeClass(DRAGGEDCLASS);\n                        that.reorder(draggedItem, placeholderIndex);\n                    }\n                } else if (connectedListBox) {\n                    if (!that.trigger(REMOVE, eventData)) {\n                        that.remove($(draggedItem));\n                    }\n                    if (!connectedListBox.trigger(ADD, eventData)) {\n                        connectedListBox._addItemAt(dataItem, connectedListBox.items().index(that.placeholder));\n                    }\n                }\n                that._clear();\n                that._draggable.dropped = true;\n                that.trigger(DRAGEND, extend({}, eventData, { draggableEvent: e }));\n                that._updateToolbar();\n                that._updateAllToolbars();\n            },\n            reorder: function (item, index) {\n                var that = this;\n                var dataSource = that.dataSource;\n                var dataItem = that.dataItem(item);\n                var dataItemAtIndex = dataSource.at(index);\n                var itemAtIndex = that.items()[index];\n                var listItem = $(item);\n                if (dataItem && itemAtIndex && dataItemAtIndex) {\n                    that._removeElement(listItem);\n                    that._insertElementAt(listItem, index);\n                    that._updateToolbar();\n                }\n            },\n            remove: function (items) {\n                var that = this;\n                var listItems = that._getItems(items);\n                var itemsLength = listItems.length;\n                var i;\n                that._unbindDataSource();\n                for (i = 0; i < itemsLength; i++) {\n                    that._removeItem($(listItems[i]));\n                }\n                that._bindDataSource();\n                that._syncElement();\n                that._updateToolbar();\n                that._updateAllToolbars();\n            },\n            _removeItem: function (item) {\n                var that = this;\n                var dataSource = that.dataSource;\n                var dataItem = that.dataItem(item);\n                if (!dataItem || !dataSource) {\n                    return;\n                }\n                if (typeof dataItem === typeof '') {\n                    var data = dataSource._data;\n                    for (var i = 0; i < data.length; i++) {\n                        if (dataItem === data[i]) {\n                            data[i] = data[data.length - 1];\n                            data.pop();\n                            break;\n                        }\n                    }\n                } else {\n                    dataSource.remove(dataItem);\n                }\n                that._removeElement(item);\n            },\n            _removeElement: function (item) {\n                kendo.destroy(item);\n                $(item).off().remove();\n            },\n            dataItem: function (element) {\n                var uniqueIdAttr = kendoAttr(UNIQUE_ID);\n                var uid = $(element).attr(uniqueIdAttr) || $(element).closest('[' + uniqueIdAttr + ']').attr(uniqueIdAttr);\n                if (uid) {\n                    return this.dataSource.getByUid(uid);\n                } else {\n                    return $(element).html();\n                }\n            },\n            _dataItems: function (items) {\n                var dataItems = [];\n                var listItems = $(items);\n                var itemsLength = listItems.length;\n                var i;\n                for (i = 0; i < itemsLength; i++) {\n                    dataItems.push(this.dataItem(listItems.eq(i)));\n                }\n                return dataItems;\n            },\n            items: function () {\n                var list = this._getList();\n                return list.children();\n            },\n            select: function (items) {\n                var that = this;\n                var selectable = that.selectable;\n                var enabledItems;\n                if (isUndefined(items)) {\n                    return selectable.value();\n                }\n                enabledItems = that.items().filter(items).filter(ENABLED_ITEMS_SELECTOR);\n                if (!selectable.options.multiple) {\n                    selectable.clear();\n                    enabledItems = enabledItems.first();\n                }\n                return selectable.value(enabledItems);\n            },\n            clearSelection: function () {\n                var that = this;\n                var selectable = that.selectable;\n                if (selectable) {\n                    selectable.clear();\n                }\n            },\n            enable: function (items, enable) {\n                var that = this;\n                var enabled = isUndefined(enable) ? true : !!enable;\n                var listItems = that._getItems(items);\n                var itemsLength = listItems.length;\n                var i;\n                for (i = 0; i < itemsLength; i++) {\n                    that._enableItem($(listItems[i]), enabled);\n                }\n                that._updateAllToolbars();\n            },\n            _enableItem: function (item, enable) {\n                var that = this;\n                var dataItem = that.dataItem(item);\n                if (dataItem) {\n                    if (enable) {\n                        $(item).removeClass(DISABLED_STATE_CLASS);\n                    } else {\n                        $(item).addClass(DISABLED_STATE_CLASS).removeClass(SELECTED_STATE_CLASS);\n                    }\n                }\n            },\n            setDataSource: function (dataSource) {\n                var that = this;\n                that.options.dataSource = dataSource;\n                that._dataSource();\n            },\n            _dataSource: function () {\n                var that = this;\n                var options = that.options;\n                var dataSource = options.dataSource || {};\n                dataSource = $.isArray(dataSource) ? { data: dataSource } : dataSource;\n                dataSource.select = that.element;\n                dataSource.fields = [\n                    { field: options.dataTextField },\n                    { field: options.dataValueField }\n                ];\n                that._unbindDataSource();\n                that.dataSource = DataSource.create(dataSource);\n                that._bindDataSource();\n                if (that.options.autoBind) {\n                    that.dataSource.fetch();\n                }\n            },\n            _bindDataSource: function () {\n                var that = this;\n                var dataSource = that.dataSource;\n                that._dataChangeHandler = proxy(that.refresh, that);\n                if (dataSource) {\n                    dataSource.bind(CHANGE, that._dataChangeHandler);\n                }\n            },\n            _unbindDataSource: function () {\n                var that = this;\n                var dataSource = that.dataSource;\n                if (dataSource) {\n                    dataSource.unbind(CHANGE, that._dataChangeHandler);\n                }\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, wrapper = element.parent('div.k-listbox');\n                if (!wrapper[0]) {\n                    wrapper = element.wrap('<div class=\"k-widget k-listbox\" deselectable=\"on\" />').parent();\n                    wrapper[0].style.cssText = element[0].style.cssText;\n                    wrapper[0].title = element[0].title;\n                    $('<div class=\"k-list-scroller\" />').insertBefore(element);\n                }\n                that.wrapper = wrapper.addClass(element[0].className).css('display', '');\n                that._innerWrapper = $(wrapper[0].firstChild);\n            },\n            _list: function () {\n                var that = this;\n                $('<ul class=\\'' + LIST_CLASS + '\\' role=\\'listbox\\'></ul>').appendTo(that._innerWrapper);\n                if (that.options.navigatable) {\n                    that._getList().attr(TABINDEX, that._getTabIndex());\n                }\n            },\n            _templates: function () {\n                var that = this;\n                var options = this.options;\n                var template;\n                if (options.template && typeof options.template == 'string') {\n                    template = kendo.template(options.template);\n                } else if (!options.template) {\n                    template = kendo.template('${' + kendo.expr(options.dataTextField, 'data') + '}', { useWithBlock: false });\n                } else {\n                    template = options.template;\n                }\n                that.templates = {\n                    itemTemplate: kendo.template('# var item = data.item, r = data.r; # <li class=\\'k-item\\' role=\\'option\\' aria-selected=\\'false\\'>#=r(item)#</li>', { useWithBlock: false }),\n                    itemContent: template,\n                    toolbar: '<div class=\\'' + TOOLBAR_CLASS + '\\'></div>'\n                };\n            },\n            refresh: function () {\n                var that = this;\n                var view = that.dataSource.view();\n                var template = that.templates.itemTemplate;\n                var html = '';\n                for (var idx = 0; idx < view.length; idx++) {\n                    html += template({\n                        item: view[idx],\n                        r: that.templates.itemContent\n                    });\n                }\n                that._getList().html(html);\n                that._setItemIds();\n                that._createToolbar();\n                that._syncElement();\n                that._updateToolbar();\n                that._updateAllToolbars();\n                that.trigger(DATABOUND);\n            },\n            _syncElement: function () {\n                var options = '';\n                var view = this.dataSource.view();\n                for (var idx = 0; idx < view.length; idx++) {\n                    options += this._option(view[idx][this.options.dataValueField] || view[idx], view[idx][this.options.dataTextField] || view[idx], true);\n                }\n                this.element.html(options);\n            },\n            _option: function (dataValue, dataText) {\n                var option = '<option';\n                if (dataValue !== undefined) {\n                    dataValue += '';\n                    if (dataValue.indexOf('\"') !== -1) {\n                        dataValue = dataValue.replace(/\"/g, '&quot;');\n                    }\n                    option += ' value=\"' + dataValue + '\"';\n                }\n                option += ' selected>';\n                if (dataText !== undefined) {\n                    option += kendo.htmlEncode(dataText);\n                }\n                return option += '</option>';\n            },\n            _setItemIds: function () {\n                var that = this;\n                var items = that.items();\n                var view = that.dataSource.view();\n                var viewLength = view.length;\n                var i;\n                for (i = 0; i < viewLength; i++) {\n                    items.eq(i).attr(kendoAttr(UNIQUE_ID), view[i].uid).attr('id', view[i].uid);\n                }\n            },\n            _selectable: function () {\n                var that = this;\n                var selectable = that.options.selectable;\n                var selectableOptions = Selectable.parseOptions(selectable);\n                if (selectableOptions.multiple) {\n                    that.element.attr('aria-multiselectable', 'true');\n                }\n                that.selectable = new Selectable(that._innerWrapper, {\n                    aria: true,\n                    multiple: selectableOptions.multiple,\n                    filter: ENABLED_ITEM_SELECTOR,\n                    change: proxy(that._onSelect, that)\n                });\n            },\n            _onSelect: function () {\n                var that = this;\n                that._updateToolbar();\n                that._updateAllToolbars();\n                that.trigger(CHANGE);\n            },\n            _destroySelectable: function () {\n                var that = this;\n                if (that.selectable && that.selectable.element) {\n                    that.selectable.destroy();\n                    that.selectable = null;\n                }\n            },\n            _getList: function () {\n                return this.wrapper.find(LIST_SELECTOR);\n            },\n            _getItems: function (items) {\n                return this.items().filter(items);\n            },\n            _createToolbar: function () {\n                var that = this;\n                var toolbarOptions = that.options.toolbar;\n                var position = toolbarOptions.position || RIGHT;\n                var toolbarInsertion = position === BOTTOM ? 'insertAfter' : 'insertBefore';\n                var tools = toolbarOptions.tools || [];\n                var messages = that.options.messages;\n                that._destroyToolbar();\n                that.wrapper.removeClass(TOOLBAR_POSITION_CLASS_NAMES.join(SPACE));\n                if (tools.length && tools.length > 0) {\n                    var toolbarElement = $(that.templates.toolbar)[toolbarInsertion](that._innerWrapper);\n                    that.toolbar = new ToolBar(toolbarElement, extend({}, toolbarOptions, {\n                        listBox: that,\n                        messages: messages\n                    }));\n                    that.wrapper.addClass(TOOLBAR_CLASS + DASH + position);\n                }\n            },\n            _destroyToolbar: function () {\n                var that = this;\n                if (that.toolbar) {\n                    that.toolbar.destroy();\n                    that.toolbar = null;\n                }\n            },\n            _executeCommand: function (commandName) {\n                var that = this;\n                var command = CommandFactory.current.create(commandName, { listBox: that });\n                if (command) {\n                    command.execute();\n                    that._updateToolbar();\n                    that._updateAllToolbars();\n                }\n            },\n            _updateToolbar: function () {\n                var toolbar = this.toolbar;\n                if (toolbar) {\n                    toolbar._updateToolStates();\n                }\n            },\n            _updateAllToolbars: function () {\n                var listBoxElements = $('select[data-role=\\'listbox\\']');\n                var elementsLength = listBoxElements.length;\n                var listBox;\n                var i;\n                for (i = 0; i < elementsLength; i++) {\n                    listBox = $(listBoxElements[i]).data(KENDO_LISTBOX);\n                    if (listBox) {\n                        listBox._updateToolbar();\n                    }\n                }\n            }\n        });\n        kendo.ui.plugin(ListBox);\n        var CommandFactory = Class.extend({\n            init: function () {\n                this._commands = [];\n            },\n            register: function (commandName, commandType) {\n                this._commands.push({\n                    commandName: commandName,\n                    commandType: commandType\n                });\n            },\n            create: function (commandName, options) {\n                var commands = this._commands;\n                var itemsLength = commands.length;\n                var name = commandName ? commandName.toLowerCase() : '';\n                var match;\n                var command;\n                var i;\n                for (i = 0; i < itemsLength; i++) {\n                    command = commands[i];\n                    if (command.commandName.toLowerCase() === name) {\n                        match = command;\n                        break;\n                    }\n                }\n                if (match) {\n                    return new match.commandType(options);\n                }\n            }\n        });\n        CommandFactory.current = new CommandFactory();\n        var ListBoxCommand = Class.extend({\n            init: function (options) {\n                var that = this;\n                that.options = extend({}, that.options, options);\n                that.listBox = that.options.listBox;\n            },\n            options: { listBox: null },\n            getItems: function () {\n                return $(this.listBox.select());\n            },\n            execute: noop,\n            canExecute: noop\n        });\n        var RemoveItemsCommand = ListBoxCommand.extend({\n            execute: function () {\n                var that = this;\n                var listBox = that.listBox;\n                var items = that.getItems();\n                if (!listBox.trigger(REMOVE, {\n                        dataItems: listBox._dataItems(items),\n                        items: items\n                    })) {\n                    listBox.remove(items);\n                }\n            },\n            canExecute: function () {\n                return this.listBox.select().length > 0;\n            }\n        });\n        CommandFactory.current.register(REMOVE, RemoveItemsCommand);\n        var MoveItemsCommand = ListBoxCommand.extend({\n            execute: function () {\n                var that = this;\n                if (that.canExecute()) {\n                    that.moveItems();\n                }\n            },\n            canExecute: noop,\n            moveItems: function () {\n                var that = this;\n                var listBox = that.listBox;\n                var options = that.options;\n                var items = that.getItems();\n                var offset = options.offset;\n                var indecesInDom = getSortedDomIndices(items);\n                var movedItems = $.makeArray(items.sort(that.itemComparer));\n                var moveAction = options.moveAction;\n                var movedItem;\n                if (!listBox.trigger(REORDER, {\n                        dataItems: listBox._dataItems(movedItems),\n                        items: $(movedItems),\n                        offset: offset\n                    })) {\n                    while (movedItems.length > 0 && indecesInDom.length > 0) {\n                        movedItem = movedItems[moveAction]();\n                        listBox.reorder(movedItem, indecesInDom[moveAction]() + offset);\n                    }\n                }\n            },\n            options: {\n                offset: 0,\n                moveAction: 'pop'\n            },\n            itemComparer: function (item1, item2) {\n                var indexItem1 = $(item1).index();\n                var indexItem2 = $(item2).index();\n                if (indexItem1 === indexItem2) {\n                    return 0;\n                } else {\n                    return indexItem1 > indexItem2 ? 1 : -1;\n                }\n            }\n        });\n        var MoveUpItemsCommand = MoveItemsCommand.extend({\n            options: {\n                offset: MOVE_UP_OFFSET,\n                moveAction: 'shift'\n            },\n            canExecute: function () {\n                var items = this.getItems();\n                var domIndices = getSortedDomIndices(items);\n                return domIndices.length > 0 && domIndices[0] > 0;\n            }\n        });\n        CommandFactory.current.register(MOVE_UP, MoveUpItemsCommand);\n        var MoveDownItemsCommand = MoveItemsCommand.extend({\n            options: {\n                offset: MOVE_DOWN_OFFSET,\n                moveAction: 'pop'\n            },\n            canExecute: function () {\n                var that = this;\n                var items = that.getItems();\n                var domIndices = getSortedDomIndices(items);\n                return domIndices.length > 0 && $(domIndices).last()[0] < that.listBox.items().length - 1;\n            }\n        });\n        CommandFactory.current.register(MOVE_DOWN, MoveDownItemsCommand);\n        var TransferItemsCommand = ListBoxCommand.extend({\n            options: { filter: ENABLED_ITEM_SELECTOR },\n            execute: function () {\n                var that = this;\n                var sourceListBox = that.getSourceListBox();\n                var items = that.getItems().filter(that.options.filter);\n                var dataItems = sourceListBox ? sourceListBox._dataItems(items) : [];\n                var destinationListBox = that.getDestinationListBox();\n                var updatedSelection = that.getUpdatedSelection(items);\n                if (destinationListBox && items.length > 0) {\n                    if (!destinationListBox.trigger(ADD, {\n                            dataItems: dataItems,\n                            items: items\n                        })) {\n                        destinationListBox.add(dataItems);\n                    }\n                    if (!sourceListBox.trigger(REMOVE, {\n                            dataItems: dataItems,\n                            items: items\n                        })) {\n                        sourceListBox.remove(items);\n                        that.updateSelection(updatedSelection);\n                    }\n                }\n            },\n            getUpdatedSelection: function (items) {\n                var that = this;\n                var itemFilter = that.options.filter;\n                var sourceListBox = that.getSourceListBox();\n                var lastEnabledItem = sourceListBox ? sourceListBox.items().filter(itemFilter).last() : null;\n                var containsLastItem = $(items).filter(lastEnabledItem).length > 0;\n                var itemToSelect = containsLastItem ? $(items).prevAll(itemFilter)[0] : $(items).nextAll(itemFilter)[0];\n                if ($(items).length === 1 && itemToSelect) {\n                    return itemToSelect;\n                } else {\n                    return null;\n                }\n            },\n            updateSelection: function (item) {\n                var sourceListBox = this.getSourceListBox();\n                if (sourceListBox && item) {\n                    $(sourceListBox.select($(item)));\n                    sourceListBox._scrollIntoView(item);\n                }\n            },\n            getSourceListBox: noop,\n            getDestinationListBox: noop\n        });\n        var TransferItemsToCommand = TransferItemsCommand.extend({\n            canExecute: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? sourceListBox.select().length > 0 : false;\n            },\n            getSourceListBox: function () {\n                return this.listBox;\n            },\n            getDestinationListBox: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox && sourceListBox.options.connectWith ? $(HASH + sourceListBox.options.connectWith).data(KENDO_LISTBOX) : null;\n            },\n            getItems: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? $(sourceListBox.select()) : $();\n            }\n        });\n        CommandFactory.current.register(TRANSFER_TO, TransferItemsToCommand);\n        var TransferItemsFromCommand = TransferItemsCommand.extend({\n            canExecute: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? sourceListBox.select().length > 0 : false;\n            },\n            getSourceListBox: function () {\n                var destinationListBox = this.getDestinationListBox();\n                return destinationListBox && destinationListBox.options.connectWith ? $(HASH + destinationListBox.options.connectWith).data(KENDO_LISTBOX) : null;\n            },\n            getDestinationListBox: function () {\n                return this.listBox;\n            },\n            getItems: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? $(sourceListBox.select()) : $();\n            }\n        });\n        CommandFactory.current.register(TRANSFER_FROM, TransferItemsFromCommand);\n        var TransferAllItemsToCommand = TransferItemsToCommand.extend({\n            canExecute: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? sourceListBox.items().filter(ENABLED_ITEM_SELECTOR).length > 0 : false;\n            },\n            getItems: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? sourceListBox.items() : $();\n            },\n            getUpdatedSelection: noop,\n            updateSelection: noop\n        });\n        CommandFactory.current.register(TRANSFER_ALL_TO, TransferAllItemsToCommand);\n        var TransferAllItemsFromCommand = TransferItemsFromCommand.extend({\n            canExecute: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? sourceListBox.items().filter(ENABLED_ITEM_SELECTOR).length > 0 : false;\n            },\n            getItems: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? sourceListBox.items() : $();\n            },\n            getUpdatedSelection: noop,\n            updateSelection: noop\n        });\n        CommandFactory.current.register(TRANSFER_ALL_FROM, TransferAllItemsFromCommand);\n        var ToolBar = Class.extend({\n            init: function (element, options) {\n                var that = this;\n                that.element = $(element).addClass(TOOLBAR_CLASS);\n                that.options = extend({}, that.options, options);\n                that.listBox = that.options.listBox;\n                that._initTemplates();\n                that._createTools();\n                that._updateToolStates();\n                that._attachEventHandlers();\n            },\n            destroy: function () {\n                var that = this;\n                that._detachEventHandlers();\n                kendo.destroy(that.element);\n                that.element.remove();\n                that.element = null;\n            },\n            options: {\n                position: RIGHT,\n                tools: []\n            },\n            _initTemplates: function () {\n                this.templates = { tool: kendoTemplate('<li>' + '<a href=\\'\\\\\\\\#\\' class=\\'k-button k-button-icon\\' data-command=\\'#= command #\\' title=\\'#= text #\\' aria-label=\\'#= text #\\' role=\\'button\\'>' + '<span class=\\'k-icon #= iconClass #\\'></span>' + '</a>' + '</li>') };\n            },\n            _createTools: function () {\n                var that = this;\n                var tools = that.options.tools;\n                var toolsLength = tools.length;\n                var toolsMessages = that.options.messages.tools;\n                var toolList = that._createToolList();\n                var tool;\n                var i;\n                for (i = 0; i < toolsLength; i++) {\n                    tool = extend({}, ToolBar.defaultTools[tools[i]], { text: toolsMessages[tools[i]] });\n                    if (tool) {\n                        toolList.append($(that.templates.tool(tool)));\n                    }\n                }\n                that.element.append(toolList);\n            },\n            _createToolList: function () {\n                return $('<ul class=\\'k-reset\\' />');\n            },\n            _attachEventHandlers: function () {\n                var that = this;\n                that.element.on(CLICK, TOOL_SELECTOR, proxy(that._onToolClick, that));\n            },\n            _detachEventHandlers: function () {\n                this.element.off(NS).find('*').off(NS);\n            },\n            _onToolClick: function (e) {\n                e.preventDefault();\n                this._executeToolCommand($(e.currentTarget).data(COMMAND));\n            },\n            _executeToolCommand: function (command) {\n                var that = this;\n                var listBox = that.listBox;\n                if (listBox) {\n                    listBox._executeCommand(command);\n                }\n            },\n            _updateToolStates: function () {\n                var that = this;\n                var tools = that.options.tools;\n                var toolsLength = tools.length;\n                var i;\n                for (i = 0; i < toolsLength; i++) {\n                    that._updateToolState(tools[i]);\n                }\n            },\n            _updateToolState: function (toolName) {\n                var that = this;\n                var command = CommandFactory.current.create(toolName, { listBox: that.listBox });\n                var toolElement = that.element.find('[data-command=\\'' + toolName + '\\']')[0];\n                if (toolElement && command && command.canExecute) {\n                    if (command.canExecute()) {\n                        $(toolElement).removeClass(DISABLED_STATE_CLASS).removeAttr(TABINDEX);\n                    } else {\n                        $(toolElement).addClass(DISABLED_STATE_CLASS).attr(TABINDEX, '-1');\n                    }\n                }\n            }\n        });\n        ToolBar.defaultTools = {\n            remove: {\n                command: REMOVE,\n                iconClass: 'k-i-x'\n            },\n            moveUp: {\n                command: MOVE_UP,\n                iconClass: 'k-i-arrow-60-up'\n            },\n            moveDown: {\n                command: MOVE_DOWN,\n                iconClass: 'k-i-arrow-60-down'\n            },\n            transferTo: {\n                command: TRANSFER_TO,\n                iconClass: 'k-i-arrow-60-right'\n            },\n            transferFrom: {\n                command: TRANSFER_FROM,\n                iconClass: 'k-i-arrow-60-left'\n            },\n            transferAllTo: {\n                command: TRANSFER_ALL_TO,\n                iconClass: 'k-i-arrow-double-60-right'\n            },\n            transferAllFrom: {\n                command: TRANSFER_ALL_FROM,\n                iconClass: 'k-i-arrow-double-60-left'\n            }\n        };\n        extend(ListBox, { ToolBar: ToolBar });\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.maskedtextbox', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'maskedtextbox',\n        name: 'MaskedTextBox',\n        category: 'web',\n        description: 'The MaskedTextBox widget allows to specify a mask type on an input field.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var global = window;\n        var min = global.Math.min;\n        var kendo = global.kendo;\n        var caret = kendo.caret;\n        var keys = kendo.keys;\n        var ui = kendo.ui;\n        var Widget = ui.Widget;\n        var NS = '.kendoMaskedTextBox';\n        var proxy = $.proxy;\n        var setTimeout = window.setTimeout;\n        var STATEDISABLED = 'k-state-disabled';\n        var STATEINVALID = 'k-state-invalid';\n        var DISABLED = 'disabled';\n        var READONLY = 'readonly';\n        var CHANGE = 'change';\n        var MOUSEUP = 'mouseup';\n        var DROP = 'drop';\n        var KEYDOWN = 'keydown';\n        var PASTE = 'paste';\n        var INPUT = 'input';\n        function ns(name) {\n            return name + NS;\n        }\n        var INPUT_EVENT_NAME = ns(kendo.support.propertyChangeEvent ? 'propertychange' : INPUT);\n        function stringDiffStart(str1, str2) {\n            var i = 0;\n            while (i < str2.length) {\n                if (str1[i] !== str2[i]) {\n                    break;\n                }\n                i++;\n            }\n            return i;\n        }\n        var MaskedTextBox = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                var DOMElement;\n                Widget.fn.init.call(that, element, options);\n                that._rules = $.extend({}, that.rules, that.options.rules);\n                element = that.element;\n                DOMElement = element[0];\n                that._wrapper();\n                that._tokenize();\n                that._form();\n                that.element.addClass('k-textbox').attr('autocomplete', 'off').on('focus' + NS, function () {\n                    var value = DOMElement.value;\n                    if (!value) {\n                        DOMElement.value = that._old = that._emptyMask;\n                    } else {\n                        that._togglePrompt(true);\n                    }\n                    that._oldValue = value;\n                    that._timeoutId = setTimeout(function () {\n                        caret(element, 0, value ? that._maskLength : 0);\n                    });\n                }).on('focusout' + NS, function () {\n                    var value = element.val();\n                    clearTimeout(that._timeoutId);\n                    DOMElement.value = that._old = '';\n                    if (value !== that._emptyMask) {\n                        DOMElement.value = that._old = value;\n                    }\n                    that._change();\n                    that._togglePrompt();\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                that._validationIcon = $('<span class=\\'k-icon k-i-warning\\'></span>').insertAfter(element);\n                kendo.notify(that);\n            },\n            options: {\n                name: 'MaskedTextBox',\n                clearPromptChar: false,\n                unmaskOnPost: false,\n                promptChar: '_',\n                culture: '',\n                rules: {},\n                value: '',\n                mask: ''\n            },\n            events: [CHANGE],\n            rules: {\n                '0': /\\d/,\n                '9': /\\d|\\s/,\n                '#': /\\d|\\s|\\+|\\-/,\n                'L': /[a-zA-Z]/,\n                '?': /[a-zA-Z]|\\s/,\n                '&': /\\S/,\n                'C': /./,\n                'A': /[a-zA-Z0-9]/,\n                'a': /[a-zA-Z0-9]|\\s/\n            },\n            setOptions: function (options) {\n                var that = this;\n                Widget.fn.setOptions.call(that, options);\n                that._rules = $.extend({}, that.rules, that.options.rules);\n                that._tokenize();\n                this._unbindInput();\n                this._bindInput();\n                that.value(that.element.val());\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                    that._formElement.off('submit', that._submitHandler);\n                }\n                Widget.fn.destroy.call(that);\n            },\n            raw: function () {\n                var unmasked = this._unmask(this.element.val(), 0);\n                return unmasked.replace(new RegExp(this.options.promptChar, 'g'), '');\n            },\n            value: function (value) {\n                var element = this.element;\n                var emptyMask = this._emptyMask;\n                if (value === undefined) {\n                    return this.element.val();\n                }\n                if (value === null) {\n                    value = '';\n                }\n                if (!emptyMask) {\n                    this._oldValue = value;\n                    element.val(value);\n                    return;\n                }\n                value = this._unmask(value + '');\n                element.val(value ? emptyMask : '');\n                this._mask(0, this._maskLength, value);\n                this._unmaskedValue = null;\n                value = element.val();\n                this._oldValue = value;\n                if (kendo._activeElement() !== element) {\n                    if (value === emptyMask) {\n                        element.val('');\n                    } else {\n                        this._togglePrompt();\n                    }\n                }\n            },\n            _togglePrompt: function (show) {\n                var DOMElement = this.element[0];\n                var value = DOMElement.value;\n                if (this.options.clearPromptChar) {\n                    if (!show) {\n                        value = value.replace(new RegExp(this.options.promptChar, 'g'), ' ');\n                    } else {\n                        value = this._oldValue;\n                    }\n                    DOMElement.value = this._old = value;\n                }\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                if (that._maskLength) {\n                    if (that.options.$angular) {\n                        that.element.off(INPUT);\n                    }\n                    that.element.on(ns(KEYDOWN), proxy(that._keydown, that)).on(ns(DROP), proxy(that._drop, that)).on(ns(CHANGE), proxy(that._trackChange, that)).on(INPUT_EVENT_NAME, proxy(that._inputHandler, that));\n                    if (kendo.support.browser.msie) {\n                        var version = kendo.support.browser.version;\n                        if (version > 8 && version < 11) {\n                            var events = [\n                                ns(MOUSEUP),\n                                ns(DROP),\n                                ns(KEYDOWN),\n                                ns(PASTE)\n                            ].join(' ');\n                            that.element.on(events, proxy(that._legacyIEInputHandler, that));\n                        }\n                    }\n                }\n            },\n            _unbindInput: function () {\n                var events = [\n                    INPUT_EVENT_NAME,\n                    ns(KEYDOWN),\n                    ns(MOUSEUP),\n                    ns(DROP),\n                    ns(PASTE)\n                ].join(' ');\n                this.element.off(events);\n            },\n            _editable: function (options) {\n                var that = this;\n                var element = that.element;\n                var wrapper = that.wrapper;\n                var disable = options.disable;\n                var readonly = options.readonly;\n                that._unbindInput();\n                if (!readonly && !disable) {\n                    element.removeAttr(DISABLED).removeAttr(READONLY);\n                    wrapper.removeClass(STATEDISABLED);\n                    that._bindInput();\n                } else {\n                    element.attr(DISABLED, disable).attr(READONLY, readonly);\n                    wrapper.toggleClass(STATEDISABLED, disable);\n                }\n            },\n            _change: function () {\n                var that = this;\n                var value = that.value();\n                if (value !== that._oldValue) {\n                    that._oldValue = value;\n                    that.trigger(CHANGE);\n                    that.element.trigger(CHANGE);\n                } else if (value === '' && that.__changing) {\n                    that.element.trigger(CHANGE);\n                }\n            },\n            inputChange: function (backward) {\n                var that = this;\n                var old = that._old;\n                var element = that.element[0];\n                var value = element.value;\n                var selection = caret(element);\n                var cursor = selection[1];\n                var lengthDiff = value.length - old.length;\n                var mobile = kendo.support.mobileOS;\n                if (that.__dropping && lengthDiff < 0) {\n                    return;\n                }\n                if (lengthDiff === -1 && mobile.android && mobile.browser === 'chrome') {\n                    backward = true;\n                }\n                var contentStart = min(cursor, stringDiffStart(value, old));\n                var content = value.substring(contentStart, cursor);\n                element.value = value.substring(0, contentStart) + that._emptyMask.substring(contentStart);\n                var caretPos = that._mask(contentStart, cursor, content);\n                var endContent = that._trimStartPromptChars(value.substring(cursor), min(lengthDiff, caretPos - contentStart));\n                var unmasked = that._unmask(endContent, old.length - endContent.length);\n                that._mask(caretPos, caretPos, unmasked);\n                if (backward) {\n                    caretPos = that._findCaretPosBackwards(contentStart);\n                }\n                caret(element, caretPos);\n                that.__dropping = false;\n            },\n            _trimStartPromptChars: function (content, count) {\n                var promptChar = this.options.promptChar;\n                while (count-- > 0 && content.indexOf(promptChar) === 0) {\n                    content = content.substring(1);\n                }\n                return content;\n            },\n            _findCaretPosBackwards: function (pos) {\n                var caretStart = this._find(pos, true);\n                if (caretStart < pos) {\n                    caretStart += 1;\n                }\n                return caretStart;\n            },\n            _inputHandler: function () {\n                if (kendo._activeElement() !== this.element[0]) {\n                    return;\n                }\n                this.inputChange(this.__backward);\n            },\n            _legacyIEInputHandler: function (e) {\n                var that = this;\n                var input = that.element[0];\n                var value = input.value;\n                var type = e.type;\n                that.__pasting = type === 'paste';\n                setTimeout(function () {\n                    if (type === 'mouseup' && that.__pasting) {\n                        return;\n                    }\n                    if (input.value && input.value !== value) {\n                        that.inputChange(that.__backward);\n                    }\n                });\n            },\n            _trackChange: function () {\n                var that = this;\n                that.__changing = true;\n                setTimeout(function () {\n                    that.__changing = false;\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                if (form[0]) {\n                    that._resetHandler = function () {\n                        setTimeout(function () {\n                            that.value(element[0].value);\n                        });\n                    };\n                    that._submitHandler = function () {\n                        that.element[0].value = that._old = that.raw();\n                    };\n                    if (that.options.unmaskOnPost) {\n                        form.on('submit', that._submitHandler);\n                    }\n                    that._formElement = form.on('reset', that._resetHandler);\n                }\n            },\n            _keydown: function (e) {\n                var key = e.keyCode;\n                this.__backward = key === keys.BACKSPACE;\n                if (key === keys.ENTER) {\n                    this._change();\n                }\n            },\n            _drop: function () {\n                this.__dropping = true;\n            },\n            _find: function (idx, backward) {\n                var value = this.element.val() || this._emptyMask;\n                var step = 1;\n                if (backward === true) {\n                    step = -1;\n                }\n                while (idx > -1 || idx <= this._maskLength) {\n                    if (value.charAt(idx) !== this.tokens[idx]) {\n                        return idx;\n                    }\n                    idx += step;\n                }\n                return -1;\n            },\n            _mask: function (start, end, value, backward) {\n                var element = this.element[0];\n                var current = element.value || this._emptyMask;\n                var empty = this.options.promptChar;\n                var valueLength;\n                var chrIdx = 0;\n                var unmasked;\n                var chr;\n                var idx;\n                start = this._find(start, backward);\n                if (start > end) {\n                    end = start;\n                }\n                unmasked = this._unmask(current.substring(end), end);\n                value = this._unmask(value, start);\n                valueLength = value.length;\n                if (value) {\n                    unmasked = unmasked.replace(new RegExp('^_{0,' + valueLength + '}'), '');\n                }\n                value += unmasked;\n                current = current.split('');\n                chr = value.charAt(chrIdx);\n                while (start < this._maskLength) {\n                    current[start] = chr || empty;\n                    chr = value.charAt(++chrIdx);\n                    if (idx === undefined && chrIdx > valueLength) {\n                        idx = start;\n                    }\n                    start = this._find(start + 1);\n                }\n                element.value = this._old = current.join('');\n                if (kendo._activeElement() === element) {\n                    if (idx === undefined) {\n                        idx = this._maskLength;\n                    }\n                    caret(element, idx);\n                }\n                return idx;\n            },\n            _unmask: function (value, idx) {\n                if (!value) {\n                    return '';\n                }\n                if (this._unmaskedValue === value) {\n                    return this._unmaskedValue;\n                }\n                value = (value + '').split('');\n                var chr;\n                var token;\n                var chrIdx = 0;\n                var tokenIdx = idx || 0;\n                var empty = this.options.promptChar;\n                var valueLength = value.length;\n                var tokensLength = this.tokens.length;\n                var result = '';\n                while (tokenIdx < tokensLength) {\n                    chr = value[chrIdx];\n                    token = this.tokens[tokenIdx];\n                    if (chr === token || chr === empty) {\n                        result += chr === empty ? empty : '';\n                        chrIdx += 1;\n                        tokenIdx += 1;\n                    } else if (typeof token !== 'string') {\n                        if (token && token.test && token.test(chr) || $.isFunction(token) && token(chr)) {\n                            result += chr;\n                            tokenIdx += 1;\n                        } else {\n                            if (valueLength === 1) {\n                                this._blinkInvalidState();\n                            }\n                        }\n                        chrIdx += 1;\n                    } else {\n                        tokenIdx += 1;\n                    }\n                    if (chrIdx >= valueLength) {\n                        break;\n                    }\n                }\n                this._unmaskedValue = result;\n                return result;\n            },\n            _wrapper: function () {\n                var that = this;\n                var element = that.element;\n                var DOMElement = element[0];\n                var wrapper = element.wrap('<span class=\\'k-widget k-maskedtextbox\\'></span>').parent();\n                wrapper[0].style.cssText = DOMElement.style.cssText;\n                DOMElement.style.width = '100%';\n                that.wrapper = wrapper.addClass(DOMElement.className);\n            },\n            _blinkInvalidState: function () {\n                var that = this;\n                that.wrapper.addClass(STATEINVALID);\n                clearTimeout(that._invalidStateTimeout);\n                that._invalidStateTimeout = setTimeout(proxy(that._removeInvalidState, that), 100);\n            },\n            _removeInvalidState: function () {\n                var that = this;\n                that.wrapper.removeClass(STATEINVALID);\n                that._invalidStateTimeout = null;\n            },\n            _tokenize: function () {\n                var tokens = [];\n                var tokenIdx = 0;\n                var mask = this.options.mask || '';\n                var maskChars = mask.split('');\n                var length = maskChars.length;\n                var idx = 0;\n                var chr;\n                var rule;\n                var emptyMask = '';\n                var promptChar = this.options.promptChar;\n                var numberFormat = kendo.getCulture(this.options.culture).numberFormat;\n                var rules = this._rules;\n                for (; idx < length; idx++) {\n                    chr = maskChars[idx];\n                    rule = rules[chr];\n                    if (rule) {\n                        tokens[tokenIdx] = rule;\n                        emptyMask += promptChar;\n                        tokenIdx += 1;\n                    } else {\n                        if (chr === '.' || chr === ',') {\n                            chr = numberFormat[chr];\n                        } else if (chr === '$') {\n                            chr = numberFormat.currency.symbol;\n                        } else if (chr === '\\\\') {\n                            idx += 1;\n                            chr = maskChars[idx];\n                        }\n                        chr = chr.split('');\n                        for (var i = 0, l = chr.length; i < l; i++) {\n                            tokens[tokenIdx] = chr[i];\n                            emptyMask += chr[i];\n                            tokenIdx += 1;\n                        }\n                    }\n                }\n                this.tokens = tokens;\n                this._emptyMask = emptyMask;\n                this._maskLength = emptyMask.length;\n            }\n        });\n        ui.plugin(MaskedTextBox);\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.menu', ['kendo.popup'], f);\n}(function () {\n    var __meta__ = {\n        id: 'menu',\n        name: 'Menu',\n        category: 'web',\n        description: 'The Menu widget displays hierarchical data as a multi-level menu.',\n        depends: ['popup']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, activeElement = kendo._activeElement, touch = kendo.support.touch && kendo.support.mobileOS, MOUSEDOWN = 'mousedown', CLICK = 'click', DELAY = 30, SCROLLSPEED = 50, extend = $.extend, proxy = $.proxy, each = $.each, template = kendo.template, keys = kendo.keys, Widget = ui.Widget, excludedNodesRegExp = /^(ul|a|div)$/i, NS = '.kendoMenu', IMG = 'img', OPEN = 'open', MENU = 'k-menu', LINK = 'k-link k-menu-link', LINK_SELECTOR = '.k-link', LAST = 'k-last', CLOSE = 'close', TIMER = 'timer', FIRST = 'k-first', IMAGE = 'k-image', SELECT = 'select', ZINDEX = 'zIndex', ACTIVATE = 'activate', DEACTIVATE = 'deactivate', POINTERDOWN = 'touchstart' + NS + ' MSPointerDown' + NS + ' pointerdown' + NS, pointers = kendo.support.pointers, msPointers = kendo.support.msPointers, allPointers = msPointers || pointers, MOUSEENTER = pointers ? 'pointerenter' : msPointers ? 'MSPointerEnter' : 'mouseenter', MOUSELEAVE = pointers ? 'pointerleave' : msPointers ? 'MSPointerLeave' : 'mouseleave', MOUSEWHEEL = 'DOMMouseScroll' + NS + ' mousewheel' + NS, RESIZE = kendo.support.resize + NS, SCROLLWIDTH = 'scrollWidth', SCROLLHEIGHT = 'scrollHeight', OFFSETWIDTH = 'offsetWidth', OFFSETHEIGHT = 'offsetHeight', POPUP_ID_ATTR = 'group', POPUP_OPENER_ATTR = 'groupparent', DOCUMENT_ELEMENT = $(document.documentElement), KENDOPOPUP = 'kendoPopup', DEFAULTSTATE = 'k-state-default', HOVERSTATE = 'k-state-hover', FOCUSEDSTATE = 'k-state-focused', DISABLEDSTATE = 'k-state-disabled', SELECTEDSTATE = 'k-state-selected', menuSelector = '.k-menu', groupSelector = '.k-menu-group', animationContainerSelector = '.k-animation-container', popupSelector = groupSelector + ',' + animationContainerSelector, allItemsSelector = ':not(.k-list) > .k-item', disabledSelector = '.k-item.k-state-disabled', itemSelector = '.k-item', availableItemsSelector = '.k-item:not(.k-state-disabled)', linkSelector = '.k-item:not(.k-state-disabled) > .k-link', exclusionSelector = ':not(.k-item.k-separator)', nextSelector = itemSelector + exclusionSelector + ':eq(0)', lastSelector = itemSelector + exclusionSelector + ':last', templateSelector = 'div:not(.k-animation-container,.k-list-container)', scrollButtonSelector = '.k-menu-scroll-button', touchPointerTypes = {\n                '2': 1,\n                'touch': 1\n            }, templates = {\n                content: template('<div #= contentCssAttributes(item) # tabindex=\\'-1\\'>#= content(item) #</div>'),\n                group: template('<ul class=\\'#= groupCssClass(group) #\\'#= groupAttributes(group) # role=\\'menu\\' aria-hidden=\\'true\\'>' + '#= renderItems(data) #' + '</ul>'),\n                itemWrapper: template('<#= tag(item) # class=\\'#= textClass(item) #\\'#= textAttributes(item) #>' + '#= image(data) ##= sprite(item) ##= text(item) #' + '#= arrow(data) #' + '</#= tag(item) #>'),\n                item: template('<li class=\\'#= wrapperCssClass(group, item) #\\' #= itemCssAttributes(item) # role=\\'menuitem\\'  #=item.items ? \"aria-haspopup=\\'true\\'\": \"\"#' + '#=item.enabled === false ? \"aria-disabled=\\'true\\'\" : \\'\\'#>' + '#= itemWrapper(data) #' + '# if (item.items) { #' + '#= subGroup({ items: item.items, menu: menu, group: { expanded: item.expanded } }) #' + '# } else if (item.content || item.contentUrl) { #' + '#= renderContent(data) #' + '# } #' + '</li>'),\n                scrollButton: template('<span class=\\'k-button k-button-icon k-menu-scroll-button k-scroll-#= direction #\\' unselectable=\\'on\\'>' + '<span class=\\'k-icon k-i-arrow-60-#= direction #\\'></span></span>'),\n                image: template('<img #= imageCssAttributes(item) # alt=\\'\\' src=\\'#= item.imageUrl #\\' />'),\n                arrow: template('<span class=\\'#= arrowClass(item, group) #\\'></span>'),\n                sprite: template('<span class=\\'k-sprite #= spriteCssClass #\\'></span>'),\n                empty: template('')\n            }, rendering = {\n                wrapperCssClass: function (group, item) {\n                    var result = 'k-item', index = item.index;\n                    if (item.enabled === false) {\n                        result += ' k-state-disabled';\n                    } else {\n                        result += ' k-state-default';\n                    }\n                    if (group.firstLevel && index === 0) {\n                        result += ' k-first';\n                    }\n                    if (index == group.length - 1) {\n                        result += ' k-last';\n                    }\n                    if (item.cssClass) {\n                        result += ' ' + item.cssClass;\n                    }\n                    if (item.attr && item.attr.hasOwnProperty('class')) {\n                        result += ' ' + item.attr['class'];\n                    }\n                    if (item.selected) {\n                        result += ' ' + SELECTEDSTATE;\n                    }\n                    return result;\n                },\n                itemCssAttributes: function (item) {\n                    var result = '';\n                    var attributes = item.attr || {};\n                    for (var attr in attributes) {\n                        if (attributes.hasOwnProperty(attr) && attr !== 'class') {\n                            result += attr + '=\"' + attributes[attr] + '\" ';\n                        }\n                    }\n                    return result;\n                },\n                imageCssAttributes: function (item) {\n                    var result = '';\n                    var attributes = item.imageAttr || {};\n                    if (!attributes['class']) {\n                        attributes['class'] = IMAGE;\n                    } else {\n                        attributes['class'] += ' ' + IMAGE;\n                    }\n                    for (var attr in attributes) {\n                        if (attributes.hasOwnProperty(attr)) {\n                            result += attr + '=\"' + attributes[attr] + '\" ';\n                        }\n                    }\n                    return result;\n                },\n                contentCssAttributes: function (item) {\n                    var result = '';\n                    var attributes = item.contentAttr || {};\n                    var defaultClasses = 'k-content k-group k-menu-group';\n                    if (!attributes['class']) {\n                        attributes['class'] = defaultClasses;\n                    } else {\n                        attributes['class'] += ' ' + defaultClasses;\n                    }\n                    for (var attr in attributes) {\n                        if (attributes.hasOwnProperty(attr)) {\n                            result += attr + '=\"' + attributes[attr] + '\" ';\n                        }\n                    }\n                    return result;\n                },\n                textClass: function () {\n                    return LINK;\n                },\n                textAttributes: function (item) {\n                    return item.url ? ' href=\\'' + item.url + '\\'' : '';\n                },\n                arrowClass: function (item, group) {\n                    var result = 'k-icon';\n                    if (group.horizontal) {\n                        result += ' k-i-arrow-60-down';\n                    } else {\n                        result += ' k-i-arrow-60-right';\n                    }\n                    return result;\n                },\n                text: function (item) {\n                    return item.encoded === false ? item.text : kendo.htmlEncode(item.text);\n                },\n                tag: function (item) {\n                    return item.url ? 'a' : 'span';\n                },\n                groupAttributes: function (group) {\n                    return group.expanded !== true ? ' style=\\'display:none\\'' : '';\n                },\n                groupCssClass: function () {\n                    return 'k-group k-menu-group';\n                },\n                content: function (item) {\n                    return item.content ? item.content : '&nbsp;';\n                }\n            };\n        function getEffectDirection(direction, root) {\n            direction = direction.split(' ')[!root + 0] || direction;\n            return direction.replace('top', 'up').replace('bottom', 'down');\n        }\n        function parseDirection(direction, root, isRtl) {\n            direction = direction.split(' ')[!root + 0] || direction;\n            var output = {\n                    origin: [\n                        'bottom',\n                        isRtl ? 'right' : 'left'\n                    ],\n                    position: [\n                        'top',\n                        isRtl ? 'right' : 'left'\n                    ]\n                }, horizontal = /left|right/.test(direction);\n            if (horizontal) {\n                output.origin = [\n                    'top',\n                    direction\n                ];\n                output.position[1] = kendo.directions[direction].reverse;\n            } else {\n                output.origin[0] = direction;\n                output.position[0] = kendo.directions[direction].reverse;\n            }\n            output.origin = output.origin.join(' ');\n            output.position = output.position.join(' ');\n            return output;\n        }\n        function contains(parent, child) {\n            try {\n                return $.contains(parent, child);\n            } catch (e) {\n                return false;\n            }\n        }\n        function updateItemClasses(item) {\n            item = $(item);\n            item.addClass('k-item').children(IMG).addClass(IMAGE);\n            item.children('a').addClass(LINK).children(IMG).addClass(IMAGE);\n            item.filter(':not([disabled])').addClass(DEFAULTSTATE);\n            item.filter('.k-separator').empty().append('&nbsp;');\n            item.filter('li[disabled]').addClass(DISABLEDSTATE).removeAttr('disabled').attr('aria-disabled', true);\n            if (!item.filter('[role]').length) {\n                item.attr('role', 'menuitem');\n            }\n            if (!item.children(LINK_SELECTOR).length) {\n                item.contents().filter(function () {\n                    return !this.nodeName.match(excludedNodesRegExp) && !(this.nodeType == 3 && !$.trim(this.nodeValue));\n                }).wrapAll('<span class=\\'' + LINK + '\\'/>');\n            }\n            updateArrow(item);\n            updateFirstLast(item);\n        }\n        function updateArrow(item) {\n            item = $(item);\n            item.find('> .k-link > [class*=k-i-arrow-60]:not(.k-sprite)').remove();\n            item.filter(':has(.k-menu-group)').children('.k-link:not(:has([class*=k-i-arrow]:not(.k-sprite)))').each(function () {\n                var item = $(this), arrowCssClass = getArrowCssClass(item);\n                item.append('<span class=\\'k-icon' + arrowCssClass + ' k-menu-expand-arrow\\'/>');\n            });\n        }\n        function getArrowCssClass(item) {\n            var arrowCssClass, parent = item.parent().parent(), isRtl = kendo.support.isRtl(parent);\n            if (parent.hasClass(MENU + '-horizontal')) {\n                arrowCssClass = ' k-i-arrow-60-down';\n            } else {\n                if (isRtl) {\n                    arrowCssClass = ' k-i-arrow-60-left';\n                } else {\n                    arrowCssClass = ' k-i-arrow-60-right';\n                }\n            }\n            return arrowCssClass;\n        }\n        function updateFirstLast(item) {\n            item = $(item);\n            item.filter('.k-first:not(:first-child)').removeClass(FIRST);\n            item.filter('.k-last:not(:last-child)').removeClass(LAST);\n            item.filter(':first-child').addClass(FIRST);\n            item.filter(':last-child').addClass(LAST);\n        }\n        function updateHasAriaPopup(parents) {\n            if (parents && parents.length) {\n                for (var index in parents) {\n                    var parentLi = parents.eq(index);\n                    if (parentLi.find('ul').length) {\n                        parentLi.attr('aria-haspopup', true);\n                    } else {\n                        parentLi.removeAttr('aria-haspopup');\n                    }\n                }\n            }\n        }\n        function getParentLiItems(group) {\n            if (!group.hasClass(MENU)) {\n                return group.parentsUntil('.' + MENU, 'li');\n            }\n        }\n        function storeItemSelectEventHandler(element, options) {\n            var selectHandler = getItemSelectEventHandler(options);\n            if (selectHandler) {\n                setItemData(element, selectHandler);\n            }\n            if (options.items) {\n                $(element).children('ul').children('li').each(function (i) {\n                    storeItemSelectEventHandler(this, options.items[i]);\n                });\n            }\n        }\n        function setItemData(element, selectHandler) {\n            $(element).children('.k-link').data({ selectHandler: selectHandler });\n        }\n        function getItemSelectEventHandler(options) {\n            var selectHandler = options.select, isFunction = kendo.isFunction;\n            if (selectHandler && isFunction(selectHandler)) {\n                return selectHandler;\n            }\n            return null;\n        }\n        function popupOpenerSelector(id) {\n            return id ? 'li[data-groupparent=\\'' + id + '\\']' : 'li[data-groupparent]';\n        }\n        function popupGroupSelector(id) {\n            return id ? 'ul[data-group=\\'' + id + '\\']' : 'ul[data-group]';\n        }\n        function getChildPopups(currentPopup, overflowWrapper) {\n            var childPopupOpener = currentPopup.find(popupOpenerSelector());\n            var result = [];\n            childPopupOpener.each(function (i, opener) {\n                opener = $(opener);\n                var popupId = opener.data(POPUP_OPENER_ATTR);\n                var popup = currentPopup;\n                while (popupId) {\n                    popup = overflowWrapper.find(popupGroupSelector(popupId) + ':visible');\n                    if (popup.length) {\n                        result.push(popup);\n                    }\n                    opener = popup.find(popupOpenerSelector());\n                    popupId = opener.data(POPUP_OPENER_ATTR);\n                }\n            });\n            return result;\n        }\n        function popupParentItem(popupElement, overflowWrapper) {\n            var popupId = popupElement.data(POPUP_ID_ATTR);\n            return popupId ? overflowWrapper.find(popupOpenerSelector(popupId)) : $([]);\n        }\n        function itemPopup(item, overflowWrapper) {\n            var popupId = item.data(POPUP_OPENER_ATTR);\n            return popupId ? overflowWrapper.children(animationContainerSelector).children(popupGroupSelector(popupId)) : $([]);\n        }\n        function overflowMenuParents(current, overflowWrapper) {\n            var parents = [];\n            var getParents = function (item) {\n                while (item.parentNode && !overflowWrapper.is(item.parentNode)) {\n                    parents.push(item.parentNode);\n                    item = item.parentNode;\n                }\n            };\n            var elem = current[0] || current;\n            getParents(elem);\n            var last = parents[parents.length - 1];\n            while ($(last).is(animationContainerSelector)) {\n                var popupElement = $(last).children('ul');\n                elem = popupParentItem(popupElement, overflowWrapper)[0];\n                if (!elem) {\n                    break;\n                }\n                parents.push(elem);\n                getParents(elem);\n                last = parents[parents.length - 1];\n            }\n            return parents;\n        }\n        function mousewheelDelta(e) {\n            var delta = 0;\n            if (e.wheelDelta) {\n                delta = -e.wheelDelta / 120;\n                delta = delta > 0 ? Math.ceil(delta) : Math.floor(delta);\n            }\n            if (e.detail) {\n                delta = Math.round(e.detail / 3);\n            }\n            return delta;\n        }\n        function parentsScroll(current, scrollDirection) {\n            var scroll = 0;\n            var parent = current.parentNode;\n            while (parent && !isNaN(parent[scrollDirection])) {\n                scroll += parent[scrollDirection];\n                parent = parent.parentNode;\n            }\n            return scroll;\n        }\n        function isPointerTouch(e) {\n            return allPointers && e.originalEvent && e.originalEvent.pointerType in touchPointerTypes;\n        }\n        function isTouch(e) {\n            var ev = e.originalEvent;\n            return touch && /touch/i.test(ev.type || '');\n        }\n        function removeSpacesBetweenItems(ul) {\n            ul.contents().filter(function () {\n                return this.nodeName != 'LI';\n            }).remove();\n        }\n        var Menu = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                element = that.wrapper = that.element;\n                options = that.options;\n                that._initData(options);\n                that._updateClasses();\n                that._animations(options);\n                that.nextItemZIndex = 100;\n                that._tabindex();\n                that._initOverflow(options);\n                that._attachMenuEventsHandlers();\n                if (options.openOnClick) {\n                    that.clicked = false;\n                }\n                element.attr('role', 'menubar');\n                if (element[0].id) {\n                    that._ariaId = kendo.format('{0}_mn_active', element[0].id);\n                }\n                kendo.notify(that);\n            },\n            events: [\n                OPEN,\n                CLOSE,\n                ACTIVATE,\n                DEACTIVATE,\n                SELECT\n            ],\n            options: {\n                name: 'Menu',\n                animation: {\n                    open: { duration: 200 },\n                    close: { duration: 100 }\n                },\n                orientation: 'horizontal',\n                direction: 'default',\n                openOnClick: false,\n                closeOnClick: true,\n                hoverDelay: 100,\n                scrollable: false,\n                popupCollision: undefined\n            },\n            _initData: function (options) {\n                var that = this;\n                if (options.dataSource) {\n                    that.angular('cleanup', function () {\n                        return { elements: that.element.children() };\n                    });\n                    that.element.empty();\n                    that.append(options.dataSource, that.element);\n                    that.angular('compile', function () {\n                        return { elements: that.element.children() };\n                    });\n                }\n            },\n            _attachMenuEventsHandlers: function () {\n                var that = this;\n                var element = that.element;\n                var options = that.options;\n                var overflowWrapper = that._overflowWrapper();\n                (overflowWrapper || element).on(POINTERDOWN, itemSelector, proxy(that._focusHandler, that)).on(CLICK + NS, disabledSelector, false).on(CLICK + NS, itemSelector, proxy(that._click, that)).on(POINTERDOWN + ' ' + MOUSEDOWN + NS, '.k-content', proxy(that._preventClose, that)).on(MOUSEENTER + NS, availableItemsSelector, proxy(that._mouseenter, that)).on(MOUSELEAVE + NS, availableItemsSelector, proxy(that._mouseleave, that)).on(MOUSEDOWN + NS, availableItemsSelector, proxy(that._mousedown, that)).on(MOUSEENTER + NS + ' ' + MOUSELEAVE + NS + ' ' + MOUSEDOWN + NS + ' ' + CLICK + NS, linkSelector, proxy(that._toggleHover, that));\n                element.on('keydown' + NS, proxy(that._keydown, that)).on('focus' + NS, proxy(that._focus, that)).on('focus' + NS, '.k-content', proxy(that._focus, that)).on('blur' + NS, proxy(that._removeHoverItem, that)).on('blur' + NS, '[tabindex]', proxy(that._checkActiveElement, that));\n                if (overflowWrapper) {\n                    overflowWrapper.on(MOUSELEAVE + NS, popupSelector, proxy(that._mouseleavePopup, that)).on(MOUSEENTER + NS, popupSelector, proxy(that._mouseenterPopup, that));\n                }\n                if (options.openOnClick) {\n                    that._documentClickHandler = proxy(that._documentClick, that);\n                    $(document).click(that._documentClickHandler);\n                }\n            },\n            _detachMenuEventsHandlers: function () {\n                var that = this;\n                var overflowWrapper = that._overflowWrapper();\n                if (overflowWrapper) {\n                    overflowWrapper.off(NS);\n                }\n                that.element.off(NS);\n                if (that._documentClickHandler) {\n                    $(document).unbind('click', that._documentClickHandler);\n                }\n            },\n            _initOverflow: function (options) {\n                var that = this;\n                var isHorizontal = options.orientation == 'horizontal';\n                var backwardBtn, forwardBtn;\n                if (options.scrollable) {\n                    that._openedPopups = {};\n                    that._scrollWrapper = that.element.wrap('<div class=\\'k-menu-scroll-wrapper ' + options.orientation + '\\'></div>').parent();\n                    if (isHorizontal) {\n                        removeSpacesBetweenItems(that.element);\n                    }\n                    backwardBtn = $(templates.scrollButton({ direction: isHorizontal ? 'left' : 'up' }));\n                    forwardBtn = $(templates.scrollButton({ direction: isHorizontal ? 'right' : 'down' }));\n                    backwardBtn.add(forwardBtn).appendTo(that._scrollWrapper);\n                    that._initScrolling(that.element, backwardBtn, forwardBtn, isHorizontal);\n                    var initialWidth = that.element.outerWidth();\n                    var initialCssWidth = that.element[0].style.width;\n                    initialCssWidth = initialCssWidth === 'auto' ? '' : initialCssWidth;\n                    if (isHorizontal) {\n                        $(window).on(RESIZE, kendo.throttle(function () {\n                            that._setOverflowWrapperWidth(initialWidth, initialCssWidth);\n                            that._toggleScrollButtons(that.element, backwardBtn, forwardBtn, isHorizontal);\n                        }, 100));\n                    }\n                    that._setOverflowWrapperWidth(initialWidth, initialCssWidth);\n                    that._toggleScrollButtons(that.element, backwardBtn, forwardBtn, isHorizontal);\n                }\n            },\n            _overflowWrapper: function () {\n                return this._scrollWrapper || this._popupsWrapper;\n            },\n            _setOverflowWrapperWidth: function (initialWidth, initialCssWidth) {\n                var that = this;\n                var wrapperCssWidth = that._scrollWrapper.css('width');\n                that._scrollWrapper.css({ width: '' });\n                var wrapperWidth = that._scrollWrapper.outerWidth();\n                that._scrollWrapper.css({ width: wrapperCssWidth });\n                var menuWidth = that.element.outerWidth();\n                var borders = that.element[0].offsetWidth - that.element[0].clientWidth;\n                if (menuWidth != wrapperWidth && wrapperWidth > 0) {\n                    var width = initialCssWidth ? Math.min(initialWidth, wrapperWidth) : wrapperWidth;\n                    that.element.width(width - borders);\n                    that._scrollWrapper.width(width);\n                }\n            },\n            _reinitOverflow: function (options) {\n                var that = this;\n                var overflowChanged = options.scrollable && !that.options.scrollable || !options.scrollable && that.options.scrollable || options.scrollable && that.options.scrollable && options.scrollable.distance != that.options.scrollable.distance || options.orientation != that.options.orientation;\n                if (overflowChanged) {\n                    that._detachMenuEventsHandlers();\n                    that._destroyOverflow();\n                    that._initOverflow(options);\n                    that._attachMenuEventsHandlers();\n                }\n            },\n            _destroyOverflow: function () {\n                var that = this;\n                var overflowWrapper = that._overflowWrapper();\n                if (overflowWrapper) {\n                    overflowWrapper.off(NS);\n                    overflowWrapper.find(scrollButtonSelector).off(NS).remove();\n                    overflowWrapper.children(animationContainerSelector).each(function (i, popupWrapper) {\n                        var ul = $(popupWrapper).children(groupSelector);\n                        ul.off(MOUSEWHEEL);\n                        var popupParentLi = popupParentItem(ul, overflowWrapper);\n                        if (popupParentLi.length) {\n                            popupParentLi.append(popupWrapper);\n                        }\n                    });\n                    overflowWrapper.find(popupOpenerSelector()).removeAttr('data-groupparent');\n                    overflowWrapper.find(popupGroupSelector()).removeAttr('data-group');\n                    that.element.off(MOUSEWHEEL);\n                    $(window).off(RESIZE);\n                    overflowWrapper.contents().unwrap();\n                    that._scrollWrapper = that._popupsWrapper = that._openedPopups = undefined;\n                }\n            },\n            _initScrolling: function (scrollElement, backwardBtn, forwardBtn, isHorizontal) {\n                var that = this;\n                var scrollable = that.options.scrollable;\n                var distance = $.isNumeric(scrollable.distance) ? scrollable.distance : SCROLLSPEED;\n                var mouseWheelDistance = distance / 2;\n                var backward = '-=' + distance;\n                var forward = '+=' + distance;\n                var backwardDouble = '-=' + distance * 2;\n                var forwardDouble = '+=' + distance * 2;\n                var scrolling = false;\n                var touchEvents = false;\n                var scroll = function (value) {\n                    var scrollValue = isHorizontal ? { 'scrollLeft': value } : { 'scrollTop': value };\n                    scrollElement.finish().animate(scrollValue, 'fast', 'linear', function () {\n                        if (scrolling) {\n                            scroll(value);\n                        }\n                    });\n                    that._toggleScrollButtons(scrollElement, backwardBtn, forwardBtn, isHorizontal);\n                };\n                var mouseenterHandler = function (e) {\n                    if (!scrolling && !touchEvents) {\n                        scroll(e.data.direction);\n                        scrolling = true;\n                    }\n                };\n                var mousedownHandler = function (e) {\n                    var scrollValue = isHorizontal ? { 'scrollLeft': e.data.direction } : { 'scrollTop': e.data.direction };\n                    touchEvents = isTouch(e) || isPointerTouch(e);\n                    scrollElement.stop().animate(scrollValue, 'fast', 'linear', function () {\n                        if (!touchEvents) {\n                            $(e.currentTarget).trigger(MOUSEENTER);\n                        } else {\n                            that._toggleScrollButtons(scrollElement, backwardBtn, forwardBtn, isHorizontal);\n                            scrolling = true;\n                        }\n                    });\n                    scrolling = false;\n                    e.stopPropagation();\n                    e.preventDefault();\n                };\n                backwardBtn.on(MOUSEENTER + NS, { direction: backward }, mouseenterHandler).on(kendo.eventMap.down + NS, { direction: backwardDouble }, mousedownHandler);\n                forwardBtn.on(MOUSEENTER + NS, { direction: forward }, mouseenterHandler).on(kendo.eventMap.down + NS, { direction: forwardDouble }, mousedownHandler);\n                backwardBtn.add(forwardBtn).on(MOUSELEAVE + NS, function () {\n                    scrollElement.stop();\n                    scrolling = false;\n                    that._toggleScrollButtons(scrollElement, backwardBtn, forwardBtn, isHorizontal);\n                });\n                scrollElement.on(MOUSEWHEEL, function (e) {\n                    if (!e.ctrlKey && !e.shiftKey && !e.altKey) {\n                        var wheelDelta = mousewheelDelta(e.originalEvent);\n                        var scrollSpeed = Math.abs(wheelDelta) * mouseWheelDistance;\n                        var value = (wheelDelta > 0 ? '+=' : '-=') + scrollSpeed;\n                        var scrollValue = isHorizontal ? { 'scrollLeft': value } : { 'scrollTop': value };\n                        that._closeChildPopups(scrollElement);\n                        scrollElement.finish().animate(scrollValue, 'fast', 'linear', function () {\n                            that._toggleScrollButtons(scrollElement, backwardBtn, forwardBtn, isHorizontal);\n                        });\n                        e.preventDefault();\n                    }\n                });\n            },\n            _toggleScrollButtons: function (scrollElement, backwardBtn, forwardBtn, horizontal) {\n                var currentScroll = horizontal ? scrollElement.scrollLeft() : scrollElement.scrollTop();\n                var scrollSize = horizontal ? SCROLLWIDTH : SCROLLHEIGHT;\n                var offset = horizontal ? OFFSETWIDTH : OFFSETHEIGHT;\n                backwardBtn.toggle(currentScroll !== 0);\n                forwardBtn.toggle(currentScroll < scrollElement[0][scrollSize] - scrollElement[0][offset] - 1);\n            },\n            setOptions: function (options) {\n                var animation = this.options.animation;\n                this._animations(options);\n                options.animation = extend(true, animation, options.animation);\n                if ('dataSource' in options) {\n                    this._initData(options);\n                }\n                this._updateClasses();\n                this._reinitOverflow(options);\n                Widget.fn.setOptions.call(this, options);\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that._detachMenuEventsHandlers();\n                that._destroyOverflow();\n                kendo.destroy(that.element);\n            },\n            enable: function (element, enable) {\n                this._toggleDisabled(element, enable !== false);\n                return this;\n            },\n            disable: function (element) {\n                this._toggleDisabled(element, false);\n                return this;\n            },\n            append: function (item, referenceItem) {\n                referenceItem = this.element.find(referenceItem);\n                var inserted = this._insert(item, referenceItem, referenceItem.length ? referenceItem.find('> .k-menu-group, > .k-animation-container > .k-menu-group') : null);\n                each(inserted.items, function (i) {\n                    inserted.group.append(this);\n                    updateArrow(this);\n                    storeItemSelectEventHandler(this, item[i] || item);\n                });\n                updateArrow(referenceItem);\n                updateFirstLast(inserted.group.find('.k-first, .k-last').add(inserted.items));\n                updateHasAriaPopup(getParentLiItems(inserted.group));\n                return this;\n            },\n            insertBefore: function (item, referenceItem) {\n                referenceItem = this.element.find(referenceItem);\n                var inserted = this._insert(item, referenceItem, referenceItem.parent());\n                each(inserted.items, function (i) {\n                    referenceItem.before(this);\n                    updateArrow(this);\n                    updateFirstLast(this);\n                    storeItemSelectEventHandler(this, item[i] || item);\n                });\n                updateFirstLast(referenceItem);\n                return this;\n            },\n            insertAfter: function (item, referenceItem) {\n                referenceItem = this.element.find(referenceItem);\n                var inserted = this._insert(item, referenceItem, referenceItem.parent());\n                each(inserted.items, function (i) {\n                    referenceItem.after(this);\n                    updateArrow(this);\n                    updateFirstLast(this);\n                    storeItemSelectEventHandler(this, item[i] || item);\n                });\n                updateFirstLast(referenceItem);\n                return this;\n            },\n            _insert: function (item, referenceItem, parent) {\n                var that = this, items, groups;\n                if (!referenceItem || !referenceItem.length) {\n                    parent = that.element;\n                }\n                var plain = $.isPlainObject(item), groupData = {\n                        firstLevel: parent.hasClass(MENU),\n                        horizontal: parent.hasClass(MENU + '-horizontal'),\n                        expanded: true,\n                        length: parent.children().length\n                    };\n                if (referenceItem && !parent.length) {\n                    parent = $(Menu.renderGroup({ group: groupData })).appendTo(referenceItem);\n                }\n                if (plain || $.isArray(item)) {\n                    items = $($.map(plain ? [item] : item, function (value, idx) {\n                        if (typeof value === 'string') {\n                            return $(value).get();\n                        } else {\n                            return $(Menu.renderItem({\n                                group: groupData,\n                                item: extend(value, { index: idx })\n                            })).get();\n                        }\n                    }));\n                } else {\n                    if (typeof item == 'string' && item.charAt(0) != '<') {\n                        items = that.element.find(item);\n                    } else {\n                        items = $(item);\n                    }\n                    groups = items.find('> ul').addClass('k-menu-group').attr('role', 'menu');\n                    items = items.filter('li');\n                    items.add(groups.find('> li')).each(function () {\n                        updateItemClasses(this);\n                    });\n                }\n                return {\n                    items: items,\n                    group: parent\n                };\n            },\n            remove: function (element) {\n                element = this.element.find(element);\n                var that = this, parent = element.parentsUntil(that.element, allItemsSelector), group = element.parent('ul:not(.k-menu)');\n                element.remove();\n                if (group && !group.children(allItemsSelector).length) {\n                    var parentItems = getParentLiItems(group);\n                    var container = group.parent(animationContainerSelector);\n                    if (container.length) {\n                        container.remove();\n                    } else {\n                        group.remove();\n                    }\n                    updateHasAriaPopup(parentItems);\n                }\n                if (parent.length) {\n                    parent = parent.eq(0);\n                    updateArrow(parent);\n                    updateFirstLast(parent);\n                }\n                return that;\n            },\n            open: function (element) {\n                var that = this;\n                var options = that.options;\n                var horizontal = options.orientation == 'horizontal';\n                var direction = options.direction;\n                var isRtl = kendo.support.isRtl(that.wrapper);\n                var overflowWrapper = that._overflowWrapper();\n                element = (overflowWrapper || that.element).find(element);\n                if (/^(top|bottom|default)$/.test(direction)) {\n                    if (isRtl) {\n                        direction = horizontal ? (direction + ' left').replace('default', 'bottom') : 'left';\n                    } else {\n                        direction = horizontal ? (direction + ' right').replace('default', 'bottom') : 'right';\n                    }\n                }\n                var visiblePopups = '>.k-popup:visible,>.k-animation-container>.k-popup:visible';\n                var closePopup = function () {\n                    var popup = $(this).data(KENDOPOPUP);\n                    if (popup) {\n                        that.close($(this).closest('li.k-item'), true);\n                    }\n                };\n                element.siblings().find(visiblePopups).each(closePopup);\n                if (overflowWrapper) {\n                    element.find(visiblePopups).each(closePopup);\n                }\n                if (that.options.openOnClick) {\n                    that.clicked = true;\n                }\n                element.each(function () {\n                    var li = $(this);\n                    clearTimeout(li.data(TIMER));\n                    li.data(TIMER, setTimeout(function () {\n                        var ul = li.find('.k-menu-group:first:hidden');\n                        var popup;\n                        var overflowPopup;\n                        if (!ul[0] && overflowWrapper) {\n                            overflowPopup = that._getPopup(li);\n                            ul = overflowPopup && overflowPopup.element;\n                        }\n                        if (ul.is(':visible')) {\n                            return;\n                        }\n                        if (ul[0] && that._triggerEvent({\n                                item: li[0],\n                                type: OPEN\n                            }) === false) {\n                            if (!ul.find('.k-menu-group')[0] && ul.children('.k-item').length > 1) {\n                                var windowHeight = $(window).height(), setScrolling = function () {\n                                        ul.css({\n                                            maxHeight: windowHeight - (kendo._outerHeight(ul) - ul.height()) - kendo.getShadows(ul).bottom,\n                                            overflow: 'auto'\n                                        });\n                                    };\n                                if (kendo.support.browser.msie && kendo.support.browser.version <= 7) {\n                                    setTimeout(setScrolling, 0);\n                                } else {\n                                    setScrolling();\n                                }\n                            } else {\n                                ul.css({\n                                    maxHeight: '',\n                                    overflow: ''\n                                });\n                            }\n                            li.data(ZINDEX, li.css(ZINDEX));\n                            var nextZindex = that.nextItemZIndex++;\n                            li.css(ZINDEX, nextZindex);\n                            if (that.options.scrollable) {\n                                li.parent().siblings(scrollButtonSelector).css({ zIndex: ++nextZindex });\n                            }\n                            popup = ul.data(KENDOPOPUP);\n                            var root = li.parent().hasClass(MENU), parentHorizontal = root && horizontal, directions = parseDirection(direction, root, isRtl), effects = options.animation.open.effects, openEffects = effects !== undefined ? effects : 'slideIn:' + getEffectDirection(direction, root);\n                            if (!popup) {\n                                popup = ul.kendoPopup({\n                                    activate: function () {\n                                        that._triggerEvent({\n                                            item: this.wrapper.parent(),\n                                            type: ACTIVATE\n                                        });\n                                    },\n                                    deactivate: function (e) {\n                                        e.sender.element.removeData('targetTransform').css({ opacity: '' });\n                                        that._triggerEvent({\n                                            item: this.wrapper.parent(),\n                                            type: DEACTIVATE\n                                        });\n                                    },\n                                    origin: directions.origin,\n                                    position: directions.position,\n                                    collision: options.popupCollision !== undefined ? options.popupCollision : parentHorizontal ? 'fit' : 'fit flip',\n                                    anchor: li,\n                                    appendTo: overflowWrapper || li,\n                                    animation: {\n                                        open: extend(true, { effects: openEffects }, options.animation.open),\n                                        close: options.animation.close\n                                    },\n                                    open: proxy(that._popupOpen, that),\n                                    close: function (e) {\n                                        var li = e.sender.wrapper.parent();\n                                        if (overflowWrapper) {\n                                            var popupId = e.sender.element.data(POPUP_ID_ATTR);\n                                            if (popupId) {\n                                                li = (overflowWrapper || that.element).find(popupOpenerSelector(popupId));\n                                            }\n                                            e.sender.wrapper.children(scrollButtonSelector).hide();\n                                        }\n                                        if (!that._triggerEvent({\n                                                item: li[0],\n                                                type: CLOSE\n                                            })) {\n                                            li.css(ZINDEX, li.data(ZINDEX));\n                                            li.removeData(ZINDEX);\n                                            if (that.options.scrollable) {\n                                                li.parent().siblings(scrollButtonSelector).css({ zIndex: '' });\n                                            }\n                                            if (touch || allPointers) {\n                                                li.removeClass(HOVERSTATE);\n                                                that._removeHoverItem();\n                                            }\n                                        } else {\n                                            e.preventDefault();\n                                        }\n                                    }\n                                }).data(KENDOPOPUP);\n                            } else {\n                                popup = ul.data(KENDOPOPUP);\n                                popup.options.origin = directions.origin;\n                                popup.options.position = directions.position;\n                                popup.options.animation.open.effects = openEffects;\n                            }\n                            ul.removeAttr('aria-hidden');\n                            that._configurePopupOverflow(popup, li);\n                            popup._hovered = true;\n                            popup.open();\n                            that._initPopupScrolling(popup);\n                        }\n                    }, that.options.hoverDelay));\n                });\n                return that;\n            },\n            _configurePopupOverflow: function (popup, popupOpener) {\n                var that = this;\n                if (that.options.scrollable) {\n                    that._wrapPopupElement(popup);\n                    if (!popupOpener.attr('data-groupparent')) {\n                        var groupId = new Date().getTime();\n                        popupOpener.attr('data-groupparent', groupId);\n                        popup.element.attr('data-group', groupId);\n                    }\n                }\n            },\n            _wrapPopupElement: function (popup) {\n                if (!popup.element.parent().is(animationContainerSelector)) {\n                    popup.wrapper = kendo.wrap(popup.element, popup.options.autosize).css({\n                        overflow: 'hidden',\n                        display: 'block',\n                        position: 'absolute'\n                    });\n                }\n            },\n            _initPopupScrolling: function (popup, isHorizontal, skipMouseEvents) {\n                var that = this;\n                if (that.options.scrollable && popup.element[0].scrollHeight > popup.element[0].offsetHeight) {\n                    that._initPopupScrollButtons(popup, isHorizontal, skipMouseEvents);\n                }\n            },\n            _initPopupScrollButtons: function (popup, isHorizontal, skipMouseEvents) {\n                var that = this;\n                var scrollButtons = popup.wrapper.children(scrollButtonSelector);\n                var animation = that.options.animation;\n                var timeout = (animation && animation.open && animation.open.duration || 0) + DELAY;\n                setTimeout(function () {\n                    if (!scrollButtons.length) {\n                        var backwardBtn = $(templates.scrollButton({ direction: isHorizontal ? 'left' : 'up' }));\n                        var forwardBtn = $(templates.scrollButton({ direction: isHorizontal ? 'right' : 'down' }));\n                        scrollButtons = backwardBtn.add(forwardBtn).appendTo(popup.wrapper);\n                        that._initScrolling(popup.element, backwardBtn, forwardBtn, isHorizontal);\n                        if (!skipMouseEvents) {\n                            scrollButtons.on(MOUSEENTER + NS, function () {\n                                var overflowWrapper = that._overflowWrapper();\n                                $(getChildPopups(popup.element, overflowWrapper)).each(function (i, p) {\n                                    var popupOpener = overflowWrapper.find(popupOpenerSelector(p.data(POPUP_ID_ATTR)));\n                                    that.close(popupOpener);\n                                });\n                            }).on(MOUSELEAVE + NS, function () {\n                                setTimeout(function () {\n                                    if ($.isEmptyObject(that._openedPopups)) {\n                                        that._closeParentPopups(popup.element);\n                                    }\n                                }, DELAY);\n                            });\n                        }\n                    }\n                    that._toggleScrollButtons(popup.element, scrollButtons.first(), scrollButtons.last(), isHorizontal);\n                }, timeout);\n            },\n            _popupOpen: function (e) {\n                if (!this._keyTriggered) {\n                    e.sender.element.children('.' + FOCUSEDSTATE).removeClass(FOCUSEDSTATE);\n                }\n                if (this.options.scrollable) {\n                    this._setPopupHeight(e.sender);\n                }\n            },\n            _setPopupHeight: function (popup, isFixed) {\n                var popupElement = popup.element;\n                var popups = popupElement.add(popupElement.parent(animationContainerSelector));\n                popups.height(popupElement.hasClass(MENU) && this._initialHeight || '');\n                var location = popup._location(isFixed);\n                var windowHeight = $(window).height();\n                var popupOuterHeight = location.height;\n                var popupOffsetTop = isFixed ? 0 : Math.max(location.top, 0);\n                var scrollTop = isFixed ? 0 : parentsScroll(this._overflowWrapper()[0], 'scrollTop');\n                var bottomScrollbar = window.innerHeight - windowHeight;\n                var maxHeight = windowHeight - kendo.getShadows(popupElement).bottom + bottomScrollbar;\n                var canFit = maxHeight + scrollTop > popupOuterHeight + popupOffsetTop;\n                if (!canFit) {\n                    var height = Math.min(maxHeight, maxHeight - popupOffsetTop + scrollTop);\n                    popups.css({\n                        overflow: 'hidden',\n                        height: height + 'px'\n                    });\n                }\n            },\n            close: function (items, dontClearClose) {\n                var that = this;\n                var overflowWrapper = that._overflowWrapper();\n                var element = overflowWrapper || that.element;\n                items = element.find(items);\n                if (!items.length) {\n                    items = element.find('>.k-item');\n                }\n                var hasChildPopupsHovered = function (currentPopup) {\n                    var result = false;\n                    if ($.isEmptyObject(that._openedPopups)) {\n                        return result;\n                    }\n                    $(getChildPopups(currentPopup, overflowWrapper)).each(function (i, popup) {\n                        result = !!that._openedPopups[popup.data(POPUP_ID_ATTR).toString()];\n                        return !result;\n                    });\n                    return result;\n                };\n                var isPopupMouseLeaved = function (opener) {\n                    var groupId = opener.data(POPUP_OPENER_ATTR);\n                    return !overflowWrapper || !groupId || !that._openedPopups[groupId.toString()];\n                };\n                items.each(function () {\n                    var li = $(this);\n                    if (!dontClearClose && that._isRootItem(li)) {\n                        that.clicked = false;\n                    }\n                    clearTimeout(li.data(TIMER));\n                    li.data(TIMER, setTimeout(function () {\n                        var popup = that._getPopup(li);\n                        if (popup && (isPopupMouseLeaved(li) || that._forceClose)) {\n                            if (!that._forceClose && hasChildPopupsHovered(popup.element)) {\n                                return;\n                            }\n                            popup.close();\n                            popup.element.attr('aria-hidden', true);\n                            if (overflowWrapper) {\n                                if (that._forceClose && items.last().is(li[0])) {\n                                    delete that._forceClose;\n                                }\n                            }\n                        }\n                    }, that.options.hoverDelay));\n                });\n                return that;\n            },\n            _getPopup: function (li) {\n                var that = this;\n                var popup = li.find('.k-menu-group:not(.k-list-container):not(.k-calendar-container):first:visible').data(KENDOPOPUP);\n                var overflowWrapper = that._overflowWrapper();\n                if (!popup && overflowWrapper) {\n                    var groupId = li.data(POPUP_OPENER_ATTR);\n                    if (groupId) {\n                        var popupElement = overflowWrapper.find(popupGroupSelector(groupId));\n                        popup = popupElement.data(KENDOPOPUP);\n                    }\n                }\n                return popup;\n            },\n            _toggleDisabled: function (items, enable) {\n                this.element.find(items).each(function () {\n                    $(this).toggleClass(DEFAULTSTATE, enable).toggleClass(DISABLEDSTATE, !enable).attr('aria-disabled', !enable);\n                });\n            },\n            _toggleHover: function (e) {\n                var target = $(kendo.eventTarget(e) || e.target).closest(allItemsSelector), isEnter = e.type == MOUSEENTER || MOUSEDOWN.indexOf(e.type) !== -1;\n                if (!target.parents('li.' + DISABLEDSTATE).length) {\n                    target.toggleClass(HOVERSTATE, isEnter || e.type == 'mousedown' || e.type == 'click');\n                }\n                this._removeHoverItem();\n            },\n            _preventClose: function () {\n                if (!this.options.closeOnClick) {\n                    this._closurePrevented = true;\n                }\n            },\n            _checkActiveElement: function (e) {\n                var that = this, hoverItem = $(e ? e.currentTarget : this._hoverItem()), target = that._findRootParent(hoverItem)[0];\n                if (!this._closurePrevented) {\n                    setTimeout(function () {\n                        if (!document.hasFocus() || !contains(target, kendo._activeElement()) && e && !contains(target, e.currentTarget)) {\n                            that.close(target);\n                        }\n                    }, 0);\n                }\n                this._closurePrevented = false;\n            },\n            _removeHoverItem: function () {\n                var oldHoverItem = this._hoverItem();\n                if (oldHoverItem && oldHoverItem.hasClass(FOCUSEDSTATE)) {\n                    oldHoverItem.removeClass(FOCUSEDSTATE);\n                    this._oldHoverItem = null;\n                }\n            },\n            _updateClasses: function () {\n                var element = this.element, nonContentGroupsSelector = '.k-menu-init div ul', items;\n                element.removeClass('k-menu-horizontal k-menu-vertical');\n                element.addClass('k-widget k-reset k-header k-menu-init ' + MENU).addClass(MENU + '-' + this.options.orientation);\n                element.find('li > ul').filter(function () {\n                    return !kendo.support.matchesSelector.call(this, nonContentGroupsSelector);\n                }).addClass('k-group k-menu-group').attr('role', 'menu').attr('aria-hidden', element.is(':visible')).parent('li').attr('aria-haspopup', 'true').end().find('li > div').addClass('k-content').attr('tabindex', '-1');\n                items = element.find('> li,.k-menu-group > li');\n                element.removeClass('k-menu-init');\n                items.each(function () {\n                    updateItemClasses(this);\n                });\n            },\n            _mouseenter: function (e) {\n                var that = this;\n                var element = $(e.currentTarget);\n                var hasChildren = that._itemHasChildren(element);\n                var popupId = element.data(POPUP_OPENER_ATTR) || element.parent().data(POPUP_ID_ATTR);\n                var pointerTouch = isPointerTouch(e);\n                if (popupId) {\n                    that._openedPopups[popupId.toString()] = true;\n                }\n                if (e.delegateTarget != element.parents(menuSelector)[0] && e.delegateTarget != element.parents('.k-menu-scroll-wrapper,.k-popups-wrapper')[0]) {\n                    return;\n                }\n                that._keyTriggered = false;\n                if (that.options.openOnClick.rootMenuItems && that._isRootItem(element.closest(allItemsSelector)) || that.options.openOnClick.subMenuItems && !that._isRootItem(element.closest(allItemsSelector))) {\n                    return;\n                }\n                if ((that.options.openOnClick === false || that.options.openOnClick.rootMenuItems === false && that._isRootItem(element.closest(allItemsSelector)) || that.options.openOnClick.subMenuItems === false && !that._isRootItem(element.closest(allItemsSelector)) || that.clicked) && !touch && !(pointerTouch && that._isRootItem(element.closest(allItemsSelector)))) {\n                    if (!contains(e.currentTarget, e.relatedTarget) && hasChildren) {\n                        that.open(element);\n                    }\n                }\n                if (that.options.openOnClick === true && that.clicked || touch) {\n                    element.siblings().each(proxy(function (_, sibling) {\n                        that.close(sibling, true);\n                    }, that));\n                }\n            },\n            _mousedown: function (e) {\n                var that = this;\n                var element = $(e.currentTarget);\n                if (that.options.openOnClick.subMenuItems && !that._isRootItem(element) || touch) {\n                    element.siblings().each(proxy(function (_, sibling) {\n                        that.close(sibling, true);\n                    }, that));\n                }\n            },\n            _mouseleave: function (e) {\n                var that = this;\n                var element = $(e.currentTarget);\n                var popupOpener = element.data(POPUP_OPENER_ATTR);\n                var hasChildren = element.children(animationContainerSelector).length || element.children(groupSelector).length || popupOpener;\n                var $window = $(window);\n                if (popupOpener) {\n                    delete that._openedPopups[popupOpener.toString()];\n                }\n                if (element.parentsUntil(animationContainerSelector, '.k-list-container,.k-calendar-container')[0]) {\n                    e.stopImmediatePropagation();\n                    return;\n                }\n                if ((that.options.openOnClick === false || !that.options.openOnClick.rootMenuItems && that._isRootItem(element) || !that.options.openOnClick.subMenuItems && !that._isRootItem(element)) && !touch && !isPointerTouch(e) && !contains(e.currentTarget, e.relatedTarget || e.target) && hasChildren && !contains(e.currentTarget, kendo._activeElement())) {\n                    that.close(element, true);\n                    return;\n                }\n                if (kendo.support.browser.msie && !e.toElement && !e.relatedTarget && !isPointerTouch(e) || e.clientX < 0 || e.clientY < 0 || e.clientY > $window.height() || e.clientX > $window.width()) {\n                    that.close(element);\n                }\n            },\n            _mouseenterPopup: function (e) {\n                var that = this;\n                var popupElement = $(e.currentTarget);\n                if (popupElement.parent().is(animationContainerSelector)) {\n                    return;\n                }\n                popupElement = popupElement.children('ul');\n                var popupId = popupElement.data(POPUP_ID_ATTR);\n                if (popupId) {\n                    that._openedPopups[popupId.toString()] = true;\n                }\n            },\n            _mouseleavePopup: function (e) {\n                var that = this;\n                var popupElement = $(e.currentTarget);\n                if (!isPointerTouch(e) && popupElement.is(animationContainerSelector)) {\n                    that._closePopups(popupElement.children('ul'));\n                }\n            },\n            _closePopups: function (rootPopup) {\n                var that = this;\n                var overflowWrapper = that._overflowWrapper();\n                var popupId = rootPopup.data(POPUP_ID_ATTR);\n                if (popupId) {\n                    delete that._openedPopups[popupId.toString()];\n                    var groupParent = overflowWrapper.find(popupOpenerSelector(popupId));\n                    setTimeout(function () {\n                        if (that.options.openOnClick) {\n                            that._closeChildPopups(rootPopup);\n                        } else {\n                            if ($.isEmptyObject(that._openedPopups)) {\n                                var innerPopup = that._innerPopup(rootPopup);\n                                that._closeParentPopups(innerPopup);\n                            } else {\n                                that.close(groupParent, true);\n                            }\n                        }\n                    }, 0);\n                }\n            },\n            _closeChildPopups: function (current) {\n                var that = this;\n                var overflowWrapper = that._overflowWrapper();\n                $(getChildPopups(current, overflowWrapper)).each(function () {\n                    var popupOpener = overflowWrapper.find(popupOpenerSelector(this.data(POPUP_ID_ATTR)));\n                    that.close(popupOpener, true);\n                });\n            },\n            _innerPopup: function (current) {\n                var overflowWrapper = this._overflowWrapper();\n                var popups = getChildPopups(current, overflowWrapper);\n                return popups[popups.length - 1] || current;\n            },\n            _closeParentPopups: function (current) {\n                var that = this;\n                var overflowWrapper = that._overflowWrapper();\n                var popupId = current.data(POPUP_ID_ATTR);\n                var popupOpener = overflowWrapper.find(popupOpenerSelector(popupId));\n                popupId = popupOpener.parent().data(POPUP_ID_ATTR);\n                that.close(popupOpener, true);\n                while (popupId && !that._openedPopups[popupId]) {\n                    if (popupOpener.parent().is(menuSelector)) {\n                        break;\n                    }\n                    popupOpener = overflowWrapper.find(popupOpenerSelector(popupId));\n                    that.close(popupOpener, true);\n                    popupId = popupOpener.parent().data(POPUP_ID_ATTR);\n                }\n            },\n            _click: function (e) {\n                var that = this, openHandle, options = that.options, target = $(kendo.eventTarget(e)), targetElement = target[0], nodeName = target[0] ? target[0].nodeName.toUpperCase() : '', formNode = nodeName == 'INPUT' || nodeName == 'SELECT' || nodeName == 'BUTTON' || nodeName == 'LABEL', link = target.closest(LINK_SELECTOR), element = target.closest(allItemsSelector), itemElement = element[0], href = link.attr('href'), childGroup, childGroupVisible, targetHref = target.attr('href'), sampleHref = $('<a href=\\'#\\' />').attr('href'), isLink = !!href && href !== sampleHref, isLocalLink = isLink && !!href.match(/^#/), isTargetLink = !!targetHref && targetHref !== sampleHref, overflowWrapper = that._overflowWrapper(), shouldCloseTheRootItem;\n                while (targetElement && targetElement.parentNode != itemElement) {\n                    targetElement = targetElement.parentNode;\n                }\n                if ($(targetElement).is(templateSelector)) {\n                    return;\n                }\n                if (element.hasClass(DISABLEDSTATE)) {\n                    e.preventDefault();\n                    return;\n                }\n                if (!e.handled && that._triggerSelect(target, itemElement) && !formNode) {\n                    e.preventDefault();\n                }\n                e.handled = true;\n                childGroup = element.children(popupSelector);\n                if (overflowWrapper) {\n                    var childPopupId = element.data(POPUP_OPENER_ATTR);\n                    if (childPopupId) {\n                        childGroup = overflowWrapper.find(popupGroupSelector(childPopupId));\n                    }\n                }\n                childGroupVisible = childGroup.is(':visible');\n                shouldCloseTheRootItem = options.openOnClick && childGroupVisible && that._isRootItem(element);\n                if (options.closeOnClick && (!isLink || isLocalLink) && (!childGroup.length || shouldCloseTheRootItem)) {\n                    element.removeClass(HOVERSTATE).css('height');\n                    that._oldHoverItem = that._findRootParent(element);\n                    var item = that._parentsUntil(link, that.element, allItemsSelector);\n                    that._forceClose = !!overflowWrapper;\n                    that.close(item);\n                    that.clicked = false;\n                    if ('MSPointerUp'.indexOf(e.type) != -1) {\n                        e.preventDefault();\n                    }\n                    return;\n                }\n                if (isLink && e.enterKey) {\n                    link[0].click();\n                }\n                if ((!that._isRootItem(element) || options.openOnClick === false) && !options.openOnClick.subMenuItems && !kendo.support.touch && !(isPointerTouch(e) && that._isRootItem(element.closest(allItemsSelector)))) {\n                    return;\n                }\n                if (!isLink && !formNode && !isTargetLink) {\n                    e.preventDefault();\n                }\n                that.clicked = true;\n                openHandle = childGroup.is(':visible') ? CLOSE : OPEN;\n                if (!options.closeOnClick && openHandle == CLOSE) {\n                    return;\n                }\n                that[openHandle](element);\n            },\n            _parentsUntil: function (context, top, selector) {\n                var overflowWrapper = this._overflowWrapper();\n                if (!overflowWrapper) {\n                    return context.parentsUntil(top, selector);\n                } else {\n                    var parents = overflowMenuParents(context, overflowWrapper);\n                    var result = [];\n                    $(parents).each(function () {\n                        var parent = $(this);\n                        if (parent.is(top)) {\n                            return false;\n                        }\n                        if (parent.is(selector)) {\n                            result.push(this);\n                        }\n                    });\n                    return $(result);\n                }\n            },\n            _triggerSelect: function (target, itemElement) {\n                target = target.is('.k-link') ? target : target.closest('.k-link');\n                var selectHandler = target.data('selectHandler'), itemSelectEventData;\n                if (selectHandler) {\n                    itemSelectEventData = this._getEventData(target);\n                    selectHandler.call(this, itemSelectEventData);\n                }\n                var isSelectItemDefaultPrevented = itemSelectEventData && itemSelectEventData.isDefaultPrevented();\n                var isSelectDefaultPrevented = this._triggerEvent({\n                    item: itemElement,\n                    type: SELECT\n                });\n                return isSelectItemDefaultPrevented || isSelectDefaultPrevented;\n            },\n            _getEventData: function (target) {\n                var eventData = {\n                    sender: this,\n                    target: target,\n                    _defaultPrevented: false,\n                    preventDefault: function () {\n                        this._defaultPrevented = true;\n                    },\n                    isDefaultPrevented: function () {\n                        return this._defaultPrevented;\n                    }\n                };\n                return eventData;\n            },\n            _documentClick: function (e) {\n                var that = this;\n                if (contains((that._overflowWrapper() || that.element)[0], e.target)) {\n                    return;\n                }\n                that.clicked = false;\n            },\n            _focus: function (e) {\n                var that = this, target = e.target, hoverItem = that._hoverItem(), active = activeElement();\n                if (target != that.wrapper[0] && !$(target).is(':kendoFocusable')) {\n                    e.stopPropagation();\n                    $(target).closest('.k-content').closest('.k-menu-group').closest('.k-item').addClass(FOCUSEDSTATE);\n                    that.wrapper.focus();\n                    return;\n                }\n                if (active === e.currentTarget) {\n                    if (hoverItem.length) {\n                        that._moveHover([], hoverItem);\n                    } else if (!that._oldHoverItem) {\n                        that._moveHover([], that.wrapper.children().first());\n                    }\n                }\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode, hoverItem = that._oldHoverItem, target, belongsToVertical, hasChildren, isRtl = kendo.support.isRtl(that.wrapper);\n                if (e.target != e.currentTarget && key != keys.ESC) {\n                    return;\n                }\n                if (!hoverItem) {\n                    hoverItem = that._oldHoverItem = that._hoverItem();\n                }\n                belongsToVertical = that._itemBelongsToVertival(hoverItem);\n                hasChildren = that._itemHasChildren(hoverItem);\n                that._keyTriggered = true;\n                if (key == keys.RIGHT) {\n                    target = that[isRtl ? '_itemLeft' : '_itemRight'](hoverItem, belongsToVertical, hasChildren);\n                } else if (key == keys.LEFT) {\n                    target = that[isRtl ? '_itemRight' : '_itemLeft'](hoverItem, belongsToVertical, hasChildren);\n                } else if (key == keys.DOWN) {\n                    target = that._itemDown(hoverItem, belongsToVertical, hasChildren);\n                } else if (key == keys.UP) {\n                    target = that._itemUp(hoverItem, belongsToVertical, hasChildren);\n                } else if (key == keys.HOME) {\n                    that._moveHover(hoverItem, hoverItem.parent().children().first());\n                    e.preventDefault();\n                } else if (key == keys.END) {\n                    that._moveHover(hoverItem, hoverItem.parent().children().last());\n                    e.preventDefault();\n                } else if (key == keys.ESC) {\n                    target = that._itemEsc(hoverItem, belongsToVertical);\n                } else if (key == keys.ENTER || key == keys.SPACEBAR) {\n                    target = hoverItem.children('.k-link');\n                    if (target.length > 0) {\n                        that._click({\n                            target: target[0],\n                            preventDefault: function () {\n                            },\n                            enterKey: true\n                        });\n                        if (hasChildren && !hoverItem.hasClass(DISABLEDSTATE)) {\n                            that.open(hoverItem);\n                            that._moveHover(hoverItem, that._childPopupElement(hoverItem).children().first());\n                        } else {\n                            that._moveHover(hoverItem, that._findRootParent(hoverItem));\n                        }\n                    }\n                } else if (key == keys.TAB) {\n                    target = that._findRootParent(hoverItem);\n                    that._moveHover(hoverItem, target);\n                    that._checkActiveElement();\n                    return;\n                }\n                if (target && target[0]) {\n                    e.preventDefault();\n                    e.stopPropagation();\n                }\n            },\n            _hoverItem: function () {\n                return this.wrapper.find('.k-item.k-state-hover,.k-item.k-state-focused').filter(':visible');\n            },\n            _itemBelongsToVertival: function (item) {\n                var menuIsVertical = this.wrapper.hasClass('k-menu-vertical');\n                if (!item.length) {\n                    return menuIsVertical;\n                }\n                return item.parent().hasClass('k-menu-group') || menuIsVertical;\n            },\n            _itemHasChildren: function (item) {\n                if (!item || !item.length || !item[0].nodeType) {\n                    return false;\n                }\n                return item.children('.k-menu-group, div.k-animation-container').length > 0 || !!item.data(POPUP_OPENER_ATTR) && !!this._overflowWrapper().children(popupGroupSelector(item.data(POPUP_OPENER_ATTR)));\n            },\n            _moveHover: function (item, nextItem) {\n                var that = this, id = that._ariaId;\n                if (item.length && nextItem.length) {\n                    item.removeClass(FOCUSEDSTATE);\n                }\n                if (nextItem.length) {\n                    if (nextItem[0].id) {\n                        id = nextItem[0].id;\n                    }\n                    nextItem.addClass(FOCUSEDSTATE);\n                    that._oldHoverItem = nextItem;\n                    if (id) {\n                        that.element.removeAttr('aria-activedescendant');\n                        $('#' + id).removeAttr('id');\n                        nextItem.attr('id', id);\n                        that.element.attr('aria-activedescendant', id);\n                    }\n                    that._scrollToItem(nextItem);\n                }\n            },\n            _findRootParent: function (item) {\n                if (this._isRootItem(item)) {\n                    return item;\n                } else {\n                    return this._parentsUntil(item, menuSelector, 'li.k-item').last();\n                }\n            },\n            _isRootItem: function (item) {\n                return item.parent().hasClass(MENU);\n            },\n            _itemRight: function (item, belongsToVertical, hasChildren) {\n                var that = this, nextItem, parentItem, overflowWrapper;\n                if (!belongsToVertical) {\n                    nextItem = item.nextAll(nextSelector);\n                    if (!nextItem.length) {\n                        nextItem = item.prevAll(lastSelector);\n                    }\n                    that.close(item);\n                } else if (hasChildren && !item.hasClass(DISABLEDSTATE)) {\n                    that.open(item);\n                    nextItem = that._childPopupElement(item).children().first();\n                } else if (that.options.orientation == 'horizontal') {\n                    parentItem = that._findRootParent(item);\n                    overflowWrapper = that._overflowWrapper();\n                    if (overflowWrapper) {\n                        var rootPopup = itemPopup(parentItem, overflowWrapper);\n                        that._closeChildPopups(rootPopup);\n                    }\n                    that.close(parentItem);\n                    nextItem = parentItem.nextAll(nextSelector);\n                }\n                if (nextItem && !nextItem.length) {\n                    nextItem = that.wrapper.children('.k-item').first();\n                } else if (!nextItem) {\n                    nextItem = [];\n                }\n                that._moveHover(item, nextItem);\n                return nextItem;\n            },\n            _itemLeft: function (item, belongsToVertical) {\n                var that = this, nextItem, overflowWrapper;\n                if (!belongsToVertical) {\n                    nextItem = item.prevAll(nextSelector);\n                    if (!nextItem.length) {\n                        nextItem = item.nextAll(lastSelector);\n                    }\n                    that.close(item);\n                } else {\n                    nextItem = item.parent().closest('.k-item');\n                    overflowWrapper = that._overflowWrapper();\n                    if (!nextItem.length && overflowWrapper) {\n                        nextItem = popupParentItem(item.parent(), overflowWrapper);\n                    }\n                    that.close(nextItem);\n                    if (that._isRootItem(nextItem) && that.options.orientation == 'horizontal') {\n                        nextItem = nextItem.prevAll(nextSelector);\n                    }\n                }\n                if (!nextItem.length) {\n                    nextItem = that.wrapper.children('.k-item').last();\n                }\n                that._moveHover(item, nextItem);\n                return nextItem;\n            },\n            _itemDown: function (item, belongsToVertical, hasChildren) {\n                var that = this, nextItem;\n                if (!belongsToVertical) {\n                    if (!hasChildren || item.hasClass(DISABLEDSTATE)) {\n                        return;\n                    } else {\n                        that.open(item);\n                        nextItem = that._childPopupElement(item).children().first();\n                    }\n                } else {\n                    nextItem = item.nextAll(nextSelector);\n                }\n                if (!nextItem.length && item.length) {\n                    nextItem = item.parent().children().first();\n                } else if (!item.length) {\n                    nextItem = that.wrapper.children('.k-item').first();\n                }\n                that._moveHover(item, nextItem);\n                return nextItem;\n            },\n            _itemUp: function (item, belongsToVertical) {\n                var that = this, nextItem;\n                if (!belongsToVertical) {\n                    return;\n                } else {\n                    nextItem = item.prevAll(nextSelector);\n                }\n                if (!nextItem.length && item.length) {\n                    nextItem = item.parent().children().last();\n                } else if (!item.length) {\n                    nextItem = that.wrapper.children('.k-item').last();\n                }\n                that._moveHover(item, nextItem);\n                return nextItem;\n            },\n            _scrollToItem: function (item) {\n                var that = this;\n                if (that.options.scrollable && item && item.length) {\n                    var ul = item.parent();\n                    var isHorizontal = ul.hasClass(MENU) ? that.options.orientation == 'horizontal' : false;\n                    var scrollDir = isHorizontal ? 'scrollLeft' : 'scrollTop';\n                    var getSize = isHorizontal ? kendo._outerWidth : kendo._outerHeight;\n                    var currentScrollOffset = ul[scrollDir]();\n                    var itemSize = getSize(item);\n                    var itemOffset = item[0][isHorizontal ? 'offsetLeft' : 'offsetTop'];\n                    var ulSize = getSize(ul);\n                    var scrollButtons = ul.siblings(scrollButtonSelector);\n                    var scrollButtonSize = scrollButtons.length ? getSize(scrollButtons.first()) : 0;\n                    var itemPosition;\n                    if (currentScrollOffset + ulSize < itemOffset + itemSize + scrollButtonSize) {\n                        itemPosition = itemOffset + itemSize - ulSize + scrollButtonSize;\n                    } else if (currentScrollOffset > itemOffset - scrollButtonSize) {\n                        itemPosition = itemOffset - scrollButtonSize;\n                    }\n                    if (!isNaN(itemPosition)) {\n                        var scrolling = {};\n                        scrolling[scrollDir] = itemPosition;\n                        ul.finish().animate(scrolling, 'fast', 'linear', function () {\n                            that._toggleScrollButtons(ul, scrollButtons.first(), scrollButtons.last(), isHorizontal);\n                        });\n                    }\n                }\n            },\n            _itemEsc: function (item, belongsToVertical) {\n                var that = this, nextItem;\n                if (!belongsToVertical) {\n                    return item;\n                } else {\n                    nextItem = item.parent().closest('.k-item');\n                    that.close(nextItem);\n                    that._moveHover(item, nextItem);\n                }\n                return nextItem;\n            },\n            _childPopupElement: function (item) {\n                var popupElement = item.find('.k-menu-group');\n                var wrapper = this._overflowWrapper();\n                if (!popupElement.length && wrapper) {\n                    popupElement = itemPopup(item, wrapper);\n                }\n                return popupElement;\n            },\n            _triggerEvent: function (e) {\n                var that = this;\n                return that.trigger(e.type, {\n                    type: e.type,\n                    item: e.item\n                });\n            },\n            _focusHandler: function (e) {\n                var that = this, item = $(kendo.eventTarget(e)).closest(allItemsSelector);\n                if (item.hasClass(DISABLEDSTATE)) {\n                    return;\n                }\n                setTimeout(function () {\n                    that._moveHover([], item);\n                    if (item.children('.k-content')[0]) {\n                        item.parent().closest('.k-item').removeClass(FOCUSEDSTATE);\n                    }\n                }, 200);\n            },\n            _animations: function (options) {\n                if (options && 'animation' in options && !options.animation) {\n                    options.animation = {\n                        open: { effects: {} },\n                        close: {\n                            hide: true,\n                            effects: {}\n                        }\n                    };\n                }\n            }\n        });\n        extend(Menu, {\n            renderItem: function (options) {\n                options = extend({\n                    menu: {},\n                    group: {}\n                }, options);\n                var empty = templates.empty, item = options.item;\n                return templates.item(extend(options, {\n                    image: item.imageUrl ? templates.image : empty,\n                    sprite: item.spriteCssClass ? templates.sprite : empty,\n                    itemWrapper: templates.itemWrapper,\n                    renderContent: Menu.renderContent,\n                    arrow: item.items || item.content ? templates.arrow : empty,\n                    subGroup: Menu.renderGroup\n                }, rendering));\n            },\n            renderGroup: function (options) {\n                return templates.group(extend({\n                    renderItems: function (options) {\n                        var html = '', i = 0, items = options.items, len = items ? items.length : 0, group = extend({ length: len }, options.group);\n                        for (; i < len; i++) {\n                            html += Menu.renderItem(extend(options, {\n                                group: group,\n                                item: extend({ index: i }, items[i])\n                            }));\n                        }\n                        return html;\n                    }\n                }, options, rendering));\n            },\n            renderContent: function (options) {\n                return templates.content(extend(options, rendering));\n            }\n        });\n        var ContextMenu = Menu.extend({\n            init: function (element, options) {\n                var that = this;\n                Menu.fn.init.call(that, element, options);\n                that._marker = kendo.guid().substring(0, 8);\n                that.target = $(that.options.target);\n                that._popup();\n                that._wire();\n            },\n            _initOverflow: function (options) {\n                var that = this;\n                if (options.scrollable && !that._overflowWrapper()) {\n                    that._openedPopups = {};\n                    that._popupsWrapper = (that.element.parent().is(animationContainerSelector) ? that.element.parent() : that.element).wrap('<div class=\\'k-popups-wrapper ' + options.orientation + '\\'></div>').parent();\n                    if (that.options.orientation == 'horizontal') {\n                        removeSpacesBetweenItems(that.element);\n                    }\n                    if (options.appendTo) {\n                        options.appendTo.append(that._popupsWrapper);\n                    }\n                    that._initialHeight = that.element[0].style.height;\n                    that._initialWidth = that.element[0].style.width;\n                }\n            },\n            options: {\n                name: 'ContextMenu',\n                filter: null,\n                showOn: 'contextmenu',\n                orientation: 'vertical',\n                alignToAnchor: false,\n                target: 'body'\n            },\n            events: [\n                OPEN,\n                CLOSE,\n                ACTIVATE,\n                DEACTIVATE,\n                SELECT\n            ],\n            setOptions: function (options) {\n                var that = this;\n                Menu.fn.setOptions.call(that, options);\n                that.target.off(that.showOn + NS + that._marker, that._showProxy);\n                if (that.userEvents) {\n                    that.userEvents.destroy();\n                }\n                that.target = $(that.options.target);\n                if (options.orientation && that.popup.wrapper[0]) {\n                    that.popup.element.unwrap();\n                }\n                that._wire();\n                Menu.fn.setOptions.call(this, options);\n            },\n            destroy: function () {\n                var that = this;\n                that.target.off(that.options.showOn + NS + that._marker);\n                DOCUMENT_ELEMENT.off(kendo.support.mousedown + NS + that._marker, that._closeProxy);\n                if (that.userEvents) {\n                    that.userEvents.destroy();\n                }\n                Menu.fn.destroy.call(that);\n            },\n            open: function (x, y) {\n                var that = this;\n                x = $(x)[0];\n                if (contains(that.element[0], $(x)[0]) || that._itemHasChildren($(x))) {\n                    Menu.fn.open.call(that, x);\n                } else {\n                    if (that._triggerEvent({\n                            item: that.element,\n                            type: OPEN\n                        }) === false) {\n                        if (that.popup.visible() && that.options.filter) {\n                            that.popup.close(true);\n                            that.popup.element.kendoStop(true);\n                        }\n                        if (y !== undefined) {\n                            var overflowWrapper = that._overflowWrapper();\n                            if (overflowWrapper) {\n                                var offset = overflowWrapper.offset();\n                                x -= offset.left;\n                                y -= offset.top;\n                            }\n                            that.popup.wrapper.hide();\n                            that._configurePopupScrolling(x, y);\n                            that.popup.open(x, y);\n                        } else {\n                            that.popup.options.anchor = (x ? x : that.popup.anchor) || that.target;\n                            that.popup.element.kendoStop(true);\n                            that._configurePopupScrolling();\n                            that.popup.open();\n                        }\n                        DOCUMENT_ELEMENT.off(that.popup.downEvent, that.popup._mousedownProxy);\n                        DOCUMENT_ELEMENT.on(kendo.support.mousedown + NS + that._marker, that._closeProxy);\n                    }\n                }\n                return that;\n            },\n            _configurePopupScrolling: function (x, y) {\n                var that = this;\n                var popup = that.popup;\n                var isHorizontal = that.options.orientation == 'horizontal';\n                if (that.options.scrollable) {\n                    that._wrapPopupElement(popup);\n                    popup.element.parent().css({\n                        position: '',\n                        height: ''\n                    });\n                    popup.element.css({\n                        visibility: 'hidden',\n                        display: '',\n                        position: ''\n                    });\n                    if (isHorizontal) {\n                        that._setPopupWidth(popup, isNaN(x) ? undefined : {\n                            isFixed: true,\n                            x: x,\n                            y: y\n                        });\n                    } else {\n                        that._setPopupHeight(popup, isNaN(x) ? undefined : {\n                            isFixed: true,\n                            x: x,\n                            y: y\n                        });\n                    }\n                    popup.element.css({\n                        visibility: '',\n                        display: 'none',\n                        position: 'absolute'\n                    });\n                    that._initPopupScrollButtons(popup, isHorizontal, true);\n                    popup.element.siblings(scrollButtonSelector).hide();\n                }\n            },\n            _setPopupWidth: function (popup, isFixed) {\n                var popupElement = popup.element;\n                var popups = popupElement.add(popupElement.parent(animationContainerSelector));\n                popups.width(this._initialWidth || '');\n                var location = popup._location(isFixed);\n                var windowWidth = $(window).width();\n                var popupOuterWidth = location.width;\n                var popupOffsetLeft = Math.max(location.left, 0);\n                var scrollLeft = isFixed ? 0 : parentsScroll(this._overflowWrapper()[0], 'scrollLeft');\n                var shadow = kendo.getShadows(popupElement);\n                var maxWidth = windowWidth - shadow.left - shadow.right;\n                var canFit = maxWidth + scrollLeft > popupOuterWidth + popupOffsetLeft;\n                if (!canFit) {\n                    popups.css({\n                        overflow: 'hidden',\n                        width: maxWidth - popupOffsetLeft + scrollLeft + 'px'\n                    });\n                }\n            },\n            close: function () {\n                var that = this;\n                if (contains(that.element[0], $(arguments[0])[0]) || that._itemHasChildren(arguments[0])) {\n                    Menu.fn.close.call(that, arguments[0]);\n                } else {\n                    if (that.popup.visible()) {\n                        if (that._triggerEvent({\n                                item: that.element,\n                                type: CLOSE\n                            }) === false) {\n                            that.popup.close();\n                            DOCUMENT_ELEMENT.off(kendo.support.mousedown + NS + that._marker, that._closeProxy);\n                            that.unbind(SELECT, that._closeTimeoutProxy);\n                        }\n                    }\n                }\n            },\n            _showHandler: function (e) {\n                var ev = e, offset, that = this, options = that.options;\n                if (e.event) {\n                    ev = e.event;\n                    ev.pageX = e.x.location;\n                    ev.pageY = e.y.location;\n                }\n                if (contains(that.element[0], e.relatedTarget || e.target)) {\n                    return;\n                }\n                that._eventOrigin = ev;\n                ev.preventDefault();\n                ev.stopImmediatePropagation();\n                that.element.find('.' + FOCUSEDSTATE).removeClass(FOCUSEDSTATE);\n                if (options.filter && kendo.support.matchesSelector.call(ev.currentTarget, options.filter) || !options.filter) {\n                    if (options.alignToAnchor) {\n                        that.popup.options.anchor = ev.currentTarget;\n                        that.open(ev.currentTarget);\n                    } else {\n                        that.popup.options.anchor = ev.currentTarget;\n                        if (that._targetChild) {\n                            offset = that.target.offset();\n                            that.open(ev.pageX - offset.left, ev.pageY - offset.top);\n                        } else {\n                            that.open(ev.pageX, ev.pageY);\n                        }\n                    }\n                }\n            },\n            _closeHandler: function (e) {\n                var that = this, target = $(e.relatedTarget || e.target), sameTarget = target.closest(that.target.selector)[0] == that.target[0], item = target.closest(itemSelector), children = that._itemHasChildren(item), overflowWrapper = that._overflowWrapper(), containment = contains(that.element[0], target[0]) || overflowWrapper && contains(overflowWrapper[0], target[0]);\n                that._eventOrigin = e;\n                var normalClick = e.which !== 3;\n                if (that.popup.visible() && (normalClick && sameTarget || !sameTarget) && (that.options.closeOnClick && !children && containment || !containment)) {\n                    if (containment) {\n                        this.unbind(SELECT, this._closeTimeoutProxy);\n                        that.bind(SELECT, that._closeTimeoutProxy);\n                    } else {\n                        that.close();\n                    }\n                }\n            },\n            _wire: function () {\n                var that = this, options = that.options, target = that.target;\n                that._showProxy = proxy(that._showHandler, that);\n                that._closeProxy = proxy(that._closeHandler, that);\n                that._closeTimeoutProxy = proxy(that.close, that);\n                if (target[0]) {\n                    if (kendo.support.mobileOS && options.showOn == 'contextmenu') {\n                        that.userEvents = new kendo.UserEvents(target, {\n                            filter: options.filter,\n                            allowSelection: false\n                        });\n                        target.on(options.showOn + NS + that._marker, false);\n                        that.userEvents.bind('hold', that._showProxy);\n                    } else {\n                        if (options.filter) {\n                            target.on(options.showOn + NS + that._marker, options.filter, that._showProxy);\n                        } else {\n                            target.on(options.showOn + NS + that._marker, that._showProxy);\n                        }\n                    }\n                }\n            },\n            _triggerEvent: function (e) {\n                var that = this, anchor = $(that.popup.options.anchor)[0], origin = that._eventOrigin;\n                that._eventOrigin = undefined;\n                return that.trigger(e.type, extend({\n                    type: e.type,\n                    item: e.item || this.element[0],\n                    target: anchor\n                }, origin ? { event: origin } : {}));\n            },\n            _popup: function () {\n                var that = this;\n                var overflowWrapper = that._overflowWrapper();\n                that._triggerProxy = proxy(that._triggerEvent, that);\n                that.popup = that.element.addClass('k-context-menu').kendoPopup({\n                    anchor: that.target || 'body',\n                    copyAnchorStyles: that.options.copyAnchorStyles,\n                    collision: that.options.popupCollision || 'fit',\n                    animation: that.options.animation,\n                    activate: that._triggerProxy,\n                    deactivate: that._triggerProxy,\n                    appendTo: overflowWrapper || that.options.appendTo,\n                    close: !overflowWrapper ? $.noop : function (e) {\n                        $(getChildPopups(e.sender.element, overflowWrapper)).each(function (i, p) {\n                            var popup = p.data(KENDOPOPUP);\n                            if (popup) {\n                                popup.close(true);\n                            }\n                        });\n                    }\n                }).data(KENDOPOPUP);\n                that._targetChild = contains(that.target[0], that.popup.element[0]);\n            }\n        });\n        ui.plugin(Menu);\n        ui.plugin(ContextMenu);\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.panelbar', ['kendo.data'], f);\n}(function () {\n    var __meta__ = {\n        id: 'panelbar',\n        name: 'PanelBar',\n        category: 'web',\n        description: 'The PanelBar widget displays hierarchical data as a multi-level expandable panel bar.',\n        depends: [\n            'core',\n            'data',\n            'data.odata'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, keys = kendo.keys, extend = $.extend, proxy = $.proxy, each = $.each, isArray = $.isArray, template = kendo.template, Widget = ui.Widget, HierarchicalDataSource = kendo.data.HierarchicalDataSource, excludedNodesRegExp = /^(ul|a|div)$/i, NS = '.kendoPanelBar', IMG = 'img', HREF = 'href', LAST = 'k-last', LINK = 'k-link', LINKSELECTOR = '.' + LINK, ERROR = 'error', ITEM = '.k-item', GROUP = '.k-group', VISIBLEGROUP = GROUP + ':visible', IMAGE = 'k-image', FIRST = 'k-first', CHANGE = 'change', EXPAND = 'expand', SELECT = 'select', CONTENT = 'k-content', ACTIVATE = 'activate', COLLAPSE = 'collapse', DATABOUND = 'dataBound', MOUSEENTER = 'mouseenter', MOUSELEAVE = 'mouseleave', CONTENTLOAD = 'contentLoad', UNDEFINED = 'undefined', ACTIVECLASS = 'k-state-active', GROUPS = '> .k-panel', CONTENTS = '> .k-content', STRING = 'string', FOCUSEDCLASS = 'k-state-focused', DISABLEDCLASS = 'k-state-disabled', SELECTEDCLASS = 'k-state-selected', SELECTEDSELECTOR = '.' + SELECTEDCLASS, HIGHLIGHTCLASS = 'k-state-highlight', ACTIVEITEMSELECTOR = ITEM + ':not(.k-state-disabled)', clickableItems = '> ' + ACTIVEITEMSELECTOR + ' > ' + LINKSELECTOR + ', .k-panel > ' + ACTIVEITEMSELECTOR + ' > ' + LINKSELECTOR, disabledItems = ITEM + '.k-state-disabled > .k-link', selectableItems = '> li > ' + SELECTEDSELECTOR + ', .k-panel > li > ' + SELECTEDSELECTOR, defaultState = 'k-state-default', ARIA_DISABLED = 'aria-disabled', ARIA_EXPANDED = 'aria-expanded', ARIA_HIDDEN = 'aria-hidden', ARIA_SELECTED = 'aria-selected', VISIBLE = ':visible', EMPTY = ':empty', SINGLE = 'single', bindings = {\n                text: 'dataTextField',\n                url: 'dataUrlField',\n                spriteCssClass: 'dataSpriteCssClassField',\n                imageUrl: 'dataImageUrlField'\n            }, itemIcon, rendering = {\n                aria: function (item) {\n                    var attr = '';\n                    if (item.items || item.content || item.contentUrl || item.expanded) {\n                        attr += ARIA_EXPANDED + '=\\'' + (item.expanded ? 'true' : 'false') + '\\' ';\n                    }\n                    if (item.enabled === false) {\n                        attr += ARIA_DISABLED + '=\\'true\\'';\n                    }\n                    return attr;\n                },\n                wrapperCssClass: function (group, item) {\n                    var result = 'k-item', index = item.index;\n                    if (item.enabled === false) {\n                        result += ' ' + DISABLEDCLASS;\n                    } else if (item.expanded === true) {\n                        result += ' ' + ACTIVECLASS;\n                    } else {\n                        result += ' k-state-default';\n                    }\n                    if (index === 0) {\n                        result += ' k-first';\n                    }\n                    if (index == group.length - 1) {\n                        result += ' k-last';\n                    }\n                    if (item.cssClass) {\n                        result += ' ' + item.cssClass;\n                    }\n                    return result;\n                },\n                textClass: function (item, group) {\n                    var result = LINK;\n                    if (group.firstLevel) {\n                        result += ' k-header';\n                    }\n                    if (item.selected) {\n                        result += ' ' + SELECTEDCLASS;\n                    }\n                    return result;\n                },\n                textAttributes: function (url) {\n                    return url ? ' href=\\'' + url + '\\'' : '';\n                },\n                arrowClass: function (item) {\n                    var result = 'k-icon';\n                    result += item.expanded ? ' k-panelbar-collapse k-i-arrow-60-up' : ' k-panelbar-expand k-i-arrow-60-down';\n                    return result;\n                },\n                text: function (item) {\n                    return item.encoded === false ? item.text : kendo.htmlEncode(item.text);\n                },\n                groupAttributes: function (group) {\n                    return group.expanded !== true ? ' style=\\'display:none\\'' : '';\n                },\n                ariaHidden: function (group) {\n                    return group.expanded !== true;\n                },\n                groupCssClass: function () {\n                    return 'k-group k-panel';\n                },\n                contentAttributes: function (content) {\n                    return content.item.expanded !== true ? ' style=\\'display:none\\'' : '';\n                },\n                content: function (item) {\n                    return item.content ? item.content : item.contentUrl ? '' : '&nbsp;';\n                },\n                contentUrl: function (item) {\n                    return item.contentUrl ? 'href=\"' + item.contentUrl + '\"' : '';\n                }\n            };\n        function updateFirstLast(items) {\n            items = $(items);\n            items.filter('.k-first:not(:first-child)').removeClass(FIRST);\n            items.filter('.k-last:not(:last-child)').removeClass(LAST);\n            items.filter(':first-child').addClass(FIRST);\n            items.filter(':last-child').addClass(LAST);\n        }\n        function updateItemHtml(item) {\n            var wrapper = item, group = item.children('ul'), toggleButton = wrapper.children('.k-link').children('.k-icon');\n            if (item.hasClass('k-panelbar')) {\n                return;\n            }\n            if (!toggleButton.length && group.length) {\n                toggleButton = $('<span class=\\'k-icon\\' />').appendTo(wrapper);\n            } else if (!group.length || !group.children().length) {\n                toggleButton.remove();\n                group.remove();\n            }\n        }\n        itemIcon = function (item) {\n            return item.children('span').children('.k-icon');\n        };\n        var PanelBar = kendo.ui.DataBoundWidget.extend({\n            init: function (element, options) {\n                var that = this, content, hasDataSource;\n                if (isArray(options)) {\n                    options = { dataSource: options };\n                }\n                hasDataSource = options && !!options.dataSource;\n                Widget.fn.init.call(that, element, options);\n                element = that.wrapper = that.element.addClass('k-widget k-reset k-header k-panelbar');\n                options = that.options;\n                if (element[0].id) {\n                    that._itemId = element[0].id + '_pb_active';\n                }\n                that._tabindex();\n                that._accessors();\n                that._dataSource();\n                that._templates();\n                that._initData(hasDataSource);\n                that._updateClasses();\n                that._animations(options);\n                element.on('click' + NS, clickableItems, function (e) {\n                    if (that._click($(e.currentTarget))) {\n                        e.preventDefault();\n                    }\n                }).on(MOUSEENTER + NS + ' ' + MOUSELEAVE + NS, clickableItems, that._toggleHover).on('click' + NS, disabledItems, false).on('click' + NS, '.k-request-retry', proxy(that._retryRequest, that)).on('keydown' + NS, $.proxy(that._keydown, that)).on('focus' + NS, function () {\n                    var item = that.select();\n                    that._current(item[0] ? item : that._first());\n                }).on('blur' + NS, function () {\n                    that._current(null);\n                }).attr('role', 'menu');\n                content = element.find('li.' + ACTIVECLASS + ' > .' + CONTENT);\n                if (content[0]) {\n                    that.expand(content.parent(), false);\n                }\n                if (!options.dataSource) {\n                    that._angularCompile();\n                }\n                kendo.notify(that);\n            },\n            events: [\n                EXPAND,\n                COLLAPSE,\n                SELECT,\n                ACTIVATE,\n                CHANGE,\n                ERROR,\n                DATABOUND,\n                CONTENTLOAD\n            ],\n            options: {\n                name: 'PanelBar',\n                dataSource: {},\n                animation: {\n                    expand: {\n                        effects: 'expand:vertical',\n                        duration: 200\n                    },\n                    collapse: { duration: 200 }\n                },\n                messages: {\n                    loading: 'Loading...',\n                    requestFailed: 'Request failed.',\n                    retry: 'Retry'\n                },\n                autoBind: true,\n                loadOnDemand: true,\n                expandMode: 'multiple',\n                template: '',\n                dataTextField: null\n            },\n            _angularCompile: function () {\n                var that = this;\n                that.angular('compile', function () {\n                    return {\n                        elements: that.element.children('li'),\n                        data: [{ dataItem: that.options.$angular }]\n                    };\n                });\n            },\n            _angularCompileElements: function (html, items) {\n                var that = this;\n                that.angular('compile', function () {\n                    return {\n                        elements: html,\n                        data: $.map(items, function (item) {\n                            return [{ dataItem: item }];\n                        })\n                    };\n                });\n            },\n            _angularCleanup: function () {\n                var that = this;\n                that.angular('cleanup', function () {\n                    return { elements: that.element.children('li') };\n                });\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.element.off(NS);\n                this._angularCleanup();\n                kendo.destroy(this.element);\n            },\n            _initData: function (hasDataSource) {\n                var that = this;\n                if (hasDataSource) {\n                    that.element.empty();\n                    if (that.options.autoBind) {\n                        that._progress(true);\n                        that.dataSource.fetch();\n                    }\n                }\n            },\n            _templates: function () {\n                var that = this, options = that.options, fieldAccessor = proxy(that._fieldAccessor, that);\n                if (options.template && typeof options.template == STRING) {\n                    options.template = template(options.template);\n                } else if (!options.template) {\n                    options.template = template('# var text = ' + fieldAccessor('text') + '(data.item); #' + '# if (typeof data.item.encoded != \\'undefined\\' && data.item.encoded === false) {#' + '#= text #' + '# } else { #' + '#: text #' + '# } #');\n                }\n                that.templates = {\n                    content: template('<div role=\\'region\\' class=\\'k-content\\'#= contentAttributes(data) #>#= content(item) #</div>'),\n                    group: template('<ul role=\\'group\\' aria-hidden=\\'#= ariaHidden(group) #\\' class=\\'#= groupCssClass(group) #\\'#= groupAttributes(group) #>' + '#= renderItems(data) #' + '</ul>'),\n                    itemWrapper: template('# var url = ' + fieldAccessor('url') + '(item); #' + '# var imageUrl = ' + fieldAccessor('imageUrl') + '(item); #' + '# var spriteCssClass = ' + fieldAccessor('spriteCssClass') + '(item); #' + '# var contentUrl = contentUrl(item); #' + '# var tag = url||contentUrl ? \\'a\\' : \\'span\\'; #' + '<#= tag # class=\\'#= textClass(item, group) #\\' #= contentUrl ##= textAttributes(url) #>' + '# if (imageUrl) { #' + '<img class=\\'k-image\\' alt=\\'\\' src=\\'#= imageUrl #\\' />' + '# } #' + '# if (spriteCssClass) { #' + '<span class=\\'k-sprite #= spriteCssClass #\\'></span>' + '# } #' + '#= data.panelBar.options.template(data) #' + '#= arrow(data) #' + '</#= tag #>'),\n                    item: template('<li role=\\'menuitem\\' #=aria(item)#class=\\'#= wrapperCssClass(group, item) #\\'' + kendo.attr('uid') + '=\\'#= item.uid #\\'>' + '#= itemWrapper(data) #' + '# if (item.items && item.items.length > 0) { #' + '#= subGroup({ items: item.items, panelBar: panelBar, group: { expanded: item.expanded } }) #' + '# } else if (item.content || item.contentUrl) { #' + '#= renderContent(data) #' + '# } #' + '</li>'),\n                    loading: template('<div class=\\'k-item\\'><span class=\\'k-icon k-i-loading\\'></span> #: data.messages.loading #</div>'),\n                    retry: template('#: data.messages.requestFailed # ' + '<button class=\\'k-button k-request-retry\\'>#: data.messages.retry #</button>'),\n                    arrow: template('<span class=\\'#= arrowClass(item) #\\'></span>'),\n                    empty: template('')\n                };\n            },\n            setOptions: function (options) {\n                var animation = this.options.animation;\n                this._animations(options);\n                options.animation = extend(true, animation, options.animation);\n                if ('dataSource' in options) {\n                    this.setDataSource(options.dataSource);\n                }\n                Widget.fn.setOptions.call(this, options);\n            },\n            expand: function (element, useAnimation) {\n                var that = this, animBackup = {};\n                element = this.element.find(element);\n                if (that._animating && element.find('ul').is(':visible')) {\n                    that.one('complete', function () {\n                        setTimeout(function () {\n                            that.expand(element);\n                        });\n                    });\n                    return;\n                }\n                that._animating = true;\n                useAnimation = useAnimation !== false;\n                element.each(function (index, item) {\n                    item = $(item);\n                    var wrapper = element.children('.k-group,.k-content');\n                    if (!wrapper.length) {\n                        wrapper = that._addGroupElement(element);\n                    }\n                    var groups = wrapper.add(item.find(CONTENTS));\n                    if (!item.hasClass(DISABLEDCLASS) && groups.length > 0) {\n                        if (that.options.expandMode == SINGLE && that._collapseAllExpanded(item)) {\n                            return that;\n                        }\n                        element.find('.' + HIGHLIGHTCLASS).removeClass(HIGHLIGHTCLASS);\n                        item.addClass(HIGHLIGHTCLASS);\n                        if (!useAnimation) {\n                            animBackup = that.options.animation;\n                            that.options.animation = {\n                                expand: { effects: {} },\n                                collapse: {\n                                    hide: true,\n                                    effects: {}\n                                }\n                            };\n                        }\n                        if (!that._triggerEvent(EXPAND, item)) {\n                            that._toggleItem(item, false, false);\n                        }\n                        if (!useAnimation) {\n                            that.options.animation = animBackup;\n                        }\n                    }\n                });\n                return that;\n            },\n            collapse: function (element, useAnimation) {\n                var that = this, animBackup = {};\n                that._animating = true;\n                useAnimation = useAnimation !== false;\n                element = that.element.find(element);\n                element.each(function (index, item) {\n                    item = $(item);\n                    var groups = item.find(GROUPS).add(item.find(CONTENTS));\n                    if (!item.hasClass(DISABLEDCLASS) && groups.is(VISIBLE)) {\n                        item.removeClass(HIGHLIGHTCLASS);\n                        if (!useAnimation) {\n                            animBackup = that.options.animation;\n                            that.options.animation = {\n                                expand: { effects: {} },\n                                collapse: {\n                                    hide: true,\n                                    effects: {}\n                                }\n                            };\n                        }\n                        if (!that._triggerEvent(COLLAPSE, item)) {\n                            that._toggleItem(item, true);\n                        }\n                        if (!useAnimation) {\n                            that.options.animation = animBackup;\n                        }\n                    }\n                });\n                return that;\n            },\n            updateArrow: function (items) {\n                var that = this;\n                items = $(items);\n                items.children(LINKSELECTOR).children('.k-panelbar-collapse, .k-panelbar-expand').remove();\n                items.filter(function () {\n                    var dataItem = that.dataItem(this);\n                    if (!dataItem) {\n                        return $(this).find('.k-panel').length > 0 || $(this).find('.k-content').length > 0;\n                    }\n                    return dataItem.hasChildren || dataItem.content || dataItem.contentUrl;\n                }).children('.k-link:not(:has([class*=k-i-arrow]))').each(function () {\n                    var item = $(this), parent = item.parent();\n                    item.append('<span class=\\'k-icon ' + (parent.hasClass(ACTIVECLASS) ? ' k-panelbar-collapse k-i-arrow-60-up' : ' k-panelbar-expand k-i-arrow-60-down') + '\\'/>');\n                });\n            },\n            _accessors: function () {\n                var that = this, options = that.options, i, field, textField, element = that.element;\n                for (i in bindings) {\n                    field = options[bindings[i]];\n                    textField = element.attr(kendo.attr(i + '-field'));\n                    if (!field && textField) {\n                        field = textField;\n                    }\n                    if (!field) {\n                        field = i;\n                    }\n                    if (!isArray(field)) {\n                        field = [field];\n                    }\n                    options[bindings[i]] = field;\n                }\n            },\n            _progress: function (item, showProgress) {\n                var element = this.element;\n                var loadingText = this.templates.loading({ messages: this.options.messages });\n                if (arguments.length == 1) {\n                    showProgress = item;\n                    if (showProgress) {\n                        element.html(loadingText);\n                    } else {\n                        element.empty();\n                    }\n                } else {\n                    itemIcon(item).toggleClass('k-i-loading', showProgress).removeClass('k-i-refresh');\n                }\n            },\n            _refreshRoot: function (items) {\n                var that = this;\n                var parent = that.element;\n                var groupData = {\n                    firstLevel: true,\n                    expanded: true,\n                    length: parent.children().length\n                };\n                this.element.empty();\n                var rootItemsHtml = $.map(items, function (value, idx) {\n                    if (typeof value === 'string') {\n                        return $(value);\n                    } else {\n                        value.items = [];\n                        return $(that.renderItem({\n                            group: groupData,\n                            item: extend(value, { index: idx })\n                        }));\n                    }\n                });\n                this.element.append(rootItemsHtml);\n                this._angularCompileElements(rootItemsHtml, items);\n            },\n            _refreshChildren: function (item, parentNode) {\n                var i, children, child;\n                parentNode.children('.k-group').empty();\n                var items = item.children.data();\n                if (!items.length) {\n                    updateItemHtml(parentNode);\n                    children = parentNode.children('.k-group').children('li');\n                    this._angularCompileElements(children, items);\n                } else {\n                    this.append(item.children, parentNode);\n                    if (this.options.loadOnDemand) {\n                        this._toggleGroup(parentNode.children('.k-group'), false);\n                    }\n                    children = parentNode.children('.k-group').children('li');\n                    for (i = 0; i < children.length; i++) {\n                        child = children.eq(i);\n                        this.trigger('itemChange', {\n                            item: child,\n                            data: this.dataItem(child),\n                            ns: ui\n                        });\n                    }\n                }\n            },\n            findByUid: function (uid) {\n                var items = this.element.find('.k-item');\n                var uidAttr = kendo.attr('uid');\n                var result;\n                for (var i = 0; i < items.length; i++) {\n                    if (items[i].getAttribute(uidAttr) == uid) {\n                        result = items[i];\n                        break;\n                    }\n                }\n                return $(result);\n            },\n            refresh: function (e) {\n                var options = this.options;\n                var node = e.node;\n                var action = e.action;\n                var items = e.items;\n                var parentNode = this.wrapper;\n                var loadOnDemand = options.loadOnDemand;\n                if (e.field) {\n                    if (!items[0] || !items[0].level) {\n                        return;\n                    }\n                    return this._updateItems(items, e.field);\n                }\n                if (node) {\n                    parentNode = this.findByUid(node.uid);\n                    this._progress(parentNode, false);\n                }\n                if (action == 'add') {\n                    this._appendItems(e.index, items, parentNode);\n                } else if (action == 'remove') {\n                    this.remove(this.findByUid(items[0].uid));\n                } else if (action == 'itemchange') {\n                    this._updateItems(items);\n                } else if (action == 'itemloaded') {\n                    this._refreshChildren(node, parentNode);\n                } else {\n                    this._refreshRoot(items);\n                }\n                if (action != 'remove') {\n                    for (var k = 0; k < items.length; k++) {\n                        if (!loadOnDemand || items[k].expanded) {\n                            var tempItem = items[k];\n                            if (this._hasChildItems(tempItem)) {\n                                tempItem.load();\n                            }\n                        }\n                    }\n                }\n                this.trigger(DATABOUND, { node: node ? parentNode : undefined });\n            },\n            _error: function (e) {\n                var node = e.node && this.findByUid(e.node.uid);\n                var retryHtml = this.templates.retry({ messages: this.options.messages });\n                if (node) {\n                    this._progress(node, false);\n                    this._expanded(node, false);\n                    itemIcon(node).addClass('k-i-refresh');\n                    e.node.loaded(false);\n                } else {\n                    this._progress(false);\n                    this.element.html(retryHtml);\n                }\n            },\n            _retryRequest: function (e) {\n                e.preventDefault();\n                this.dataSource.fetch();\n            },\n            items: function () {\n                return this.element.find('.k-item > span:first-child');\n            },\n            setDataSource: function (dataSource) {\n                var options = this.options;\n                options.dataSource = dataSource;\n                this._dataSource();\n                if (this.options.autoBind) {\n                    this._progress(true);\n                    this.dataSource.fetch();\n                }\n            },\n            _bindDataSource: function () {\n                this._refreshHandler = proxy(this.refresh, this);\n                this._errorHandler = proxy(this._error, this);\n                this.dataSource.bind(CHANGE, this._refreshHandler);\n                this.dataSource.bind(ERROR, this._errorHandler);\n            },\n            _unbindDataSource: function () {\n                var dataSource = this.dataSource;\n                if (dataSource) {\n                    dataSource.unbind(CHANGE, this._refreshHandler);\n                    dataSource.unbind(ERROR, this._errorHandler);\n                }\n            },\n            _fieldAccessor: function (fieldName) {\n                var fieldBindings = this.options[bindings[fieldName]] || [], count = fieldBindings.length, result = '(function(item) {';\n                if (count === 0) {\n                    result += 'return item[\\'' + fieldName + '\\'];';\n                } else {\n                    result += 'var levels = [' + $.map(fieldBindings, function (x) {\n                        return 'function(d){ return ' + kendo.expr(x) + '}';\n                    }).join(',') + '];';\n                    result += 'if(item.level){return levels[Math.min(item.level(), ' + count + '-1)](item);}else';\n                    result += '{return levels[' + count + '-1](item)}';\n                }\n                result += '})';\n                return result;\n            },\n            _dataSource: function () {\n                var that = this, options = that.options, dataSource = options.dataSource;\n                if (!dataSource) {\n                    return;\n                }\n                dataSource = isArray(dataSource) ? { data: dataSource } : dataSource;\n                that._unbindDataSource();\n                if (!dataSource.fields) {\n                    dataSource.fields = [\n                        { field: 'text' },\n                        { field: 'url' },\n                        { field: 'spriteCssClass' },\n                        { field: 'imageUrl' }\n                    ];\n                }\n                that.dataSource = HierarchicalDataSource.create(dataSource);\n                that._bindDataSource();\n            },\n            _appendItems: function (index, items, parentNode) {\n                var that = this, children, wrapper;\n                if (parentNode.hasClass('k-panelbar')) {\n                    children = parentNode.children('li');\n                    wrapper = parentNode;\n                } else {\n                    wrapper = parentNode.children('.k-group');\n                    if (!wrapper.length) {\n                        wrapper = that._addGroupElement(parentNode);\n                    }\n                    children = wrapper.children('li');\n                }\n                var groupData = {\n                    firstLevel: parentNode.hasClass('k-panelbar'),\n                    expanded: true,\n                    length: children.length\n                };\n                var itemsHtml = $.map(items, function (value, idx) {\n                    if (typeof value === 'string') {\n                        return $(value);\n                    } else {\n                        return $(that.renderItem({\n                            group: groupData,\n                            item: extend(value, { index: idx })\n                        }));\n                    }\n                });\n                if (typeof index == UNDEFINED) {\n                    index = children.length;\n                }\n                for (var i = 0; i < itemsHtml.length; i++) {\n                    if (children.length === 0 || index === 0) {\n                        wrapper.append(itemsHtml[i]);\n                    } else {\n                        itemsHtml[i].insertAfter(children[index - 1]);\n                    }\n                }\n                that._angularCompileElements(itemsHtml, items);\n                if (that.dataItem(parentNode)) {\n                    that.dataItem(parentNode).hasChildren = true;\n                    that.updateArrow(parentNode);\n                }\n            },\n            _updateItems: function (items, field) {\n                var that = this;\n                var i, node, nodeWrapper, item;\n                var context = {\n                    panelBar: that.options,\n                    item: item,\n                    group: {}\n                };\n                var render = field != 'expanded';\n                if (field == 'selected') {\n                    if (items[0][field]) {\n                        var currentNode = that.findByUid(items[0].uid);\n                        if (!currentNode.hasClass(DISABLEDCLASS)) {\n                            that.select(currentNode, true);\n                        }\n                    } else {\n                        that.clearSelection();\n                    }\n                } else {\n                    var elements = $.map(items, function (item) {\n                        return that.findByUid(item.uid);\n                    });\n                    if (render) {\n                        that.angular('cleanup', function () {\n                            return { elements: elements };\n                        });\n                    }\n                    for (i = 0; i < items.length; i++) {\n                        context.item = item = items[i];\n                        context.panelBar = that;\n                        nodeWrapper = elements[i];\n                        node = nodeWrapper.parent();\n                        if (render) {\n                            context.group = {\n                                firstLevel: node.hasClass('k-panelbar'),\n                                expanded: nodeWrapper.parent().hasClass(ACTIVECLASS),\n                                length: nodeWrapper.children().length\n                            };\n                            nodeWrapper.children('.k-link').remove();\n                            nodeWrapper.prepend(that.templates.itemWrapper(extend(context, { arrow: item.hasChildren || item.content || item.contentUrl ? that.templates.arrow : that.templates.empty }, rendering)));\n                        }\n                        if (field == 'expanded') {\n                            that._toggleItem(nodeWrapper, !item[field], item[field] ? 'true' : true);\n                        } else if (field == 'enabled') {\n                            that.enable(nodeWrapper, item[field]);\n                            if (!item[field]) {\n                                if (item.selected) {\n                                    item.set('selected', false);\n                                }\n                            }\n                        }\n                        if (nodeWrapper.length) {\n                            this.trigger('itemChange', {\n                                item: nodeWrapper,\n                                data: item,\n                                ns: ui\n                            });\n                        }\n                    }\n                    if (render) {\n                        that.angular('compile', function () {\n                            return {\n                                elements: elements,\n                                data: $.map(items, function (item) {\n                                    return [{ dataItem: item }];\n                                })\n                            };\n                        });\n                    }\n                }\n            },\n            _toggleDisabled: function (element, enable) {\n                element = this.element.find(element);\n                element.toggleClass(defaultState, enable).toggleClass(DISABLEDCLASS, !enable).attr(ARIA_DISABLED, !enable);\n            },\n            dataItem: function (item) {\n                var uid = $(item).closest(ITEM).attr(kendo.attr('uid')), dataSource = this.dataSource;\n                return dataSource && dataSource.getByUid(uid);\n            },\n            select: function (element, skipChange) {\n                var that = this;\n                if (element === undefined) {\n                    return that.element.find(selectableItems).parent();\n                }\n                element = that.element.find(element);\n                if (!element.length) {\n                    this._updateSelected(element);\n                } else {\n                    element.each(function () {\n                        var item = $(this), link = item.children(LINKSELECTOR);\n                        if (item.hasClass(DISABLEDCLASS)) {\n                            return that;\n                        }\n                        that._updateSelected(link, skipChange);\n                    });\n                }\n                return that;\n            },\n            clearSelection: function () {\n                this.select($());\n            },\n            enable: function (element, state) {\n                this._toggleDisabled(element, state !== false);\n                return this;\n            },\n            disable: function (element) {\n                this._toggleDisabled(element, false);\n                return this;\n            },\n            append: function (item, referenceItem) {\n                referenceItem = this.element.find(referenceItem);\n                var inserted = this._insert(item, referenceItem, referenceItem.length ? referenceItem.find(GROUPS) : null);\n                each(inserted.items, function () {\n                    inserted.group.append(this);\n                    updateFirstLast(this);\n                });\n                this.updateArrow(referenceItem);\n                updateFirstLast(inserted.group.find('.k-first, .k-last'));\n                inserted.group.height('auto');\n                return this;\n            },\n            insertBefore: function (item, referenceItem) {\n                referenceItem = this.element.find(referenceItem);\n                var inserted = this._insert(item, referenceItem, referenceItem.parent());\n                each(inserted.items, function () {\n                    referenceItem.before(this);\n                    updateFirstLast(this);\n                });\n                updateFirstLast(referenceItem);\n                inserted.group.height('auto');\n                return this;\n            },\n            insertAfter: function (item, referenceItem) {\n                referenceItem = this.element.find(referenceItem);\n                var inserted = this._insert(item, referenceItem, referenceItem.parent());\n                each(inserted.items, function () {\n                    referenceItem.after(this);\n                    updateFirstLast(this);\n                });\n                updateFirstLast(referenceItem);\n                inserted.group.height('auto');\n                return this;\n            },\n            remove: function (element) {\n                element = this.element.find(element);\n                var that = this, parent = element.parentsUntil(that.element, ITEM), group = element.parent('ul');\n                element.remove();\n                if (group && !group.hasClass('k-panelbar') && !group.children(ITEM).length) {\n                    group.remove();\n                }\n                if (parent.length) {\n                    parent = parent.eq(0);\n                    that.updateArrow(parent);\n                    updateFirstLast(parent);\n                }\n                return that;\n            },\n            reload: function (element) {\n                var that = this;\n                element = that.element.find(element);\n                element.each(function () {\n                    var item = $(this);\n                    that._ajaxRequest(item, item.children('.' + CONTENT), !item.is(VISIBLE));\n                });\n            },\n            _first: function () {\n                return this.element.children(ACTIVEITEMSELECTOR).first();\n            },\n            _last: function () {\n                var item = this.element.children(ACTIVEITEMSELECTOR).last(), group = item.children(VISIBLEGROUP);\n                if (group[0]) {\n                    return group.children(ACTIVEITEMSELECTOR).last();\n                }\n                return item;\n            },\n            _current: function (candidate) {\n                var that = this, focused = that._focused, id = that._itemId;\n                if (candidate === undefined) {\n                    return focused;\n                }\n                that.element.removeAttr('aria-activedescendant');\n                if (focused && focused.length) {\n                    if (focused[0].id === id) {\n                        focused.removeAttr('id');\n                    }\n                    focused.children(LINKSELECTOR).removeClass(FOCUSEDCLASS);\n                }\n                if ($(candidate).length) {\n                    id = candidate[0].id || id;\n                    candidate.attr('id', id).children(LINKSELECTOR).addClass(FOCUSEDCLASS);\n                    that.element.attr('aria-activedescendant', id);\n                }\n                that._focused = candidate;\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode, current = that._current();\n                if (e.target != e.currentTarget) {\n                    return;\n                }\n                if (key == keys.DOWN || key == keys.RIGHT) {\n                    that._current(that._nextItem(current));\n                    e.preventDefault();\n                } else if (key == keys.UP || key == keys.LEFT) {\n                    that._current(that._prevItem(current));\n                    e.preventDefault();\n                } else if (key == keys.ENTER || key == keys.SPACEBAR) {\n                    that._click(current.children(LINKSELECTOR));\n                    e.preventDefault();\n                } else if (key == keys.HOME) {\n                    that._current(that._first());\n                    e.preventDefault();\n                } else if (key == keys.END) {\n                    that._current(that._last());\n                    e.preventDefault();\n                }\n            },\n            _nextItem: function (item) {\n                if (!item) {\n                    return this._first();\n                }\n                var group = item.children(VISIBLEGROUP), next = item.nextAll(':visible').first();\n                if (group[0]) {\n                    next = group.children('.' + FIRST);\n                }\n                if (!next[0]) {\n                    next = item.parent(VISIBLEGROUP).parent(ITEM).next();\n                }\n                if (!next[0]) {\n                    next = this._first();\n                }\n                if (next.hasClass(DISABLEDCLASS)) {\n                    next = this._nextItem(next);\n                }\n                return next;\n            },\n            _prevItem: function (item) {\n                if (!item) {\n                    return this._last();\n                }\n                var prev = item.prevAll(':visible').first(), result;\n                if (!prev[0]) {\n                    prev = item.parent(VISIBLEGROUP).parent(ITEM);\n                    if (!prev[0]) {\n                        prev = this._last();\n                    }\n                } else {\n                    result = prev;\n                    while (result[0]) {\n                        result = result.children(VISIBLEGROUP).children('.' + LAST);\n                        if (result[0]) {\n                            prev = result;\n                        }\n                    }\n                }\n                if (prev.hasClass(DISABLEDCLASS)) {\n                    prev = this._prevItem(prev);\n                }\n                return prev;\n            },\n            _insert: function (item, referenceItem, parent) {\n                var that = this, items, plain = $.isPlainObject(item), isReferenceItem = referenceItem && referenceItem[0], groupData;\n                if (!isReferenceItem) {\n                    parent = that.element;\n                }\n                groupData = {\n                    firstLevel: parent.hasClass('k-panelbar'),\n                    expanded: $(referenceItem).hasClass(ACTIVECLASS),\n                    length: parent.children().length\n                };\n                if (isReferenceItem && !parent.length) {\n                    parent = $(that.renderGroup({\n                        group: groupData,\n                        options: that.options\n                    })).appendTo(referenceItem);\n                }\n                if (plain || $.isArray(item) || item instanceof HierarchicalDataSource) {\n                    if (item instanceof HierarchicalDataSource) {\n                        item = item.data();\n                    }\n                    items = $.map(plain ? [item] : item, function (value, idx) {\n                        if (typeof value === 'string') {\n                            return $(value);\n                        } else {\n                            return $(that.renderItem({\n                                group: groupData,\n                                item: extend(value, { index: idx })\n                            }));\n                        }\n                    });\n                    if (isReferenceItem) {\n                        var dataItem = that.dataItem(referenceItem);\n                        if (dataItem) {\n                            dataItem.hasChildren = true;\n                            referenceItem.attr(ARIA_EXPANDED, dataItem.expanded).not('.' + ACTIVECLASS).children('ul').attr(ARIA_HIDDEN, !dataItem.expanded);\n                        } else {\n                            referenceItem.attr(ARIA_EXPANDED, false);\n                        }\n                    }\n                } else {\n                    if (typeof item == 'string' && item.charAt(0) != '<') {\n                        items = that.element.find(item);\n                    } else {\n                        items = $(item);\n                    }\n                    that._updateItemsClasses(items);\n                }\n                if (!item.length) {\n                    item = [item];\n                }\n                that._angularCompileElements(items, item);\n                return {\n                    items: items,\n                    group: parent\n                };\n            },\n            _toggleHover: function (e) {\n                var target = $(e.currentTarget);\n                if (!target.parents('li.' + DISABLEDCLASS).length) {\n                    target.toggleClass('k-state-hover', e.type == MOUSEENTER);\n                }\n            },\n            _updateClasses: function () {\n                var that = this, panels, items, expanded, panelsParent, dataItem;\n                panels = that.element.find('li > ul').not(function () {\n                    return $(this).parentsUntil('.k-panelbar', 'div').length;\n                }).addClass('k-group k-panel').attr('role', 'group');\n                panelsParent = panels.parent();\n                dataItem = that.dataItem(panelsParent);\n                expanded = dataItem && dataItem.expanded || false;\n                panels.parent().attr(ARIA_EXPANDED, expanded).not('.' + ACTIVECLASS).children('ul').attr(ARIA_HIDDEN, !expanded).hide();\n                items = that.element.add(panels).children();\n                that._updateItemsClasses(items);\n                that.updateArrow(items);\n                updateFirstLast(items);\n            },\n            _updateItemsClasses: function (items) {\n                var length = items.length, idx = 0;\n                for (; idx < length; idx++) {\n                    this._updateItemClasses(items[idx], idx);\n                }\n            },\n            _updateItemClasses: function (item, index) {\n                var selected = this._selected, contentUrls = this.options.contentUrls, url = contentUrls && contentUrls[index], root = this.element[0], wrapElement, link;\n                item = $(item).addClass('k-item').attr('role', 'menuitem');\n                if (kendo.support.browser.msie) {\n                    item.css('list-style-position', 'inside').css('list-style-position', '');\n                }\n                item.children(IMG).addClass(IMAGE);\n                link = item.children('a').addClass(LINK);\n                if (link[0]) {\n                    link.attr('href', url);\n                    link.children(IMG).addClass(IMAGE);\n                }\n                item.filter(':not([disabled]):not([class*=k-state])').addClass('k-state-default');\n                item.filter('li[disabled]').addClass('k-state-disabled').attr(ARIA_DISABLED, true).removeAttr('disabled');\n                item.children('div').addClass(CONTENT).attr('role', 'region').attr(ARIA_HIDDEN, true).hide().parent().attr(ARIA_EXPANDED, false);\n                link = item.children(SELECTEDSELECTOR);\n                if (link[0]) {\n                    if (selected) {\n                        selected.removeAttr(ARIA_SELECTED).children(SELECTEDSELECTOR).removeClass(SELECTEDCLASS);\n                    }\n                    link.addClass(SELECTEDCLASS);\n                    this._selected = item.attr(ARIA_SELECTED, true);\n                }\n                if (!item.children(LINKSELECTOR)[0]) {\n                    wrapElement = '<span class=\\'' + LINK + '\\'/>';\n                    if (contentUrls && contentUrls[index] && item[0].parentNode == root) {\n                        wrapElement = '<a class=\"k-link k-header\" href=\"' + contentUrls[index] + '\"/>';\n                    }\n                    item.contents().filter(function () {\n                        return !this.nodeName.match(excludedNodesRegExp) && !(this.nodeType == 3 && !$.trim(this.nodeValue));\n                    }).wrapAll(wrapElement);\n                }\n                if (item.parent('.k-panelbar')[0]) {\n                    item.children(LINKSELECTOR).addClass('k-header');\n                }\n            },\n            _click: function (target) {\n                var that = this, element = that.element, prevent, contents, href, isAnchor;\n                if (target.parents('li.' + DISABLEDCLASS).length) {\n                    return;\n                }\n                if (target.closest('.k-widget')[0] != element[0]) {\n                    return;\n                }\n                var link = target.closest(LINKSELECTOR), item = link.closest(ITEM);\n                that._updateSelected(link);\n                var wrapper = item.children('.k-group,.k-content');\n                var dataItem = this.dataItem(item);\n                if (!wrapper.length && (that.options.loadOnDemand && dataItem && dataItem.hasChildren || this._hasChildItems(item) || item.content || item.contentUrl)) {\n                    wrapper = that._addGroupElement(item);\n                }\n                contents = item.find(GROUPS).add(item.find(CONTENTS));\n                href = link.attr(HREF);\n                isAnchor = href && (href.charAt(href.length - 1) == '#' || href.indexOf('#' + that.element[0].id + '-') != -1);\n                prevent = !!(isAnchor || contents.length);\n                if (contents.data('animating')) {\n                    return prevent;\n                }\n                if (that._triggerEvent(SELECT, item)) {\n                    prevent = true;\n                }\n                if (prevent === false) {\n                    return;\n                }\n                if (that.options.expandMode == SINGLE) {\n                    if (that._collapseAllExpanded(item)) {\n                        return prevent;\n                    }\n                }\n                if (contents.length) {\n                    var visibility = contents.is(VISIBLE);\n                    if (!that._triggerEvent(!visibility ? EXPAND : COLLAPSE, item)) {\n                        prevent = that._toggleItem(item, visibility);\n                    }\n                }\n                return prevent;\n            },\n            _hasChildItems: function (item) {\n                return item.items && item.items.length > 0 || item.hasChildren;\n            },\n            _toggleItem: function (element, isVisible, expanded) {\n                var that = this, childGroup = element.find(GROUPS), link = element.find(LINKSELECTOR), url = link.attr(HREF), prevent, content, dataItem = that.dataItem(element), notVisible = !isVisible;\n                var loaded = dataItem && dataItem.loaded();\n                if (dataItem && !expanded && dataItem.expanded !== notVisible) {\n                    dataItem.set('expanded', notVisible);\n                    prevent = dataItem.hasChildren || !!dataItem.content || !!dataItem.contentUrl;\n                    return prevent;\n                }\n                if (dataItem && (!expanded || expanded === 'true') && !loaded && !dataItem.content && !dataItem.contentUrl) {\n                    if (that.options.loadOnDemand) {\n                        this._progress(element, true);\n                    }\n                    element.children('.k-group,.k-content').remove();\n                    prevent = dataItem.hasChildren;\n                    dataItem.load();\n                } else {\n                    if (childGroup.length) {\n                        this._toggleGroup(childGroup, isVisible);\n                        prevent = true;\n                    } else {\n                        content = element.children('.' + CONTENT);\n                        if (content.length) {\n                            prevent = true;\n                            if (!content.is(EMPTY) || url === undefined) {\n                                that._toggleGroup(content, isVisible);\n                            } else {\n                                that._ajaxRequest(element, content, isVisible);\n                            }\n                        }\n                    }\n                }\n                return prevent;\n            },\n            _toggleGroup: function (element, visibility) {\n                var that = this, animationSettings = that.options.animation, animation = animationSettings.expand, hasCollapseAnimation = animationSettings.collapse && 'effects' in animationSettings.collapse, collapse = extend({}, animationSettings.expand, animationSettings.collapse);\n                if (!hasCollapseAnimation) {\n                    collapse = extend(collapse, { reverse: true });\n                }\n                if (element.is(VISIBLE) != visibility) {\n                    that._animating = false;\n                    return;\n                }\n                element.attr(ARIA_HIDDEN, !!visibility);\n                element.parent().attr(ARIA_EXPANDED, !visibility).toggleClass(ACTIVECLASS, !visibility).find('> .k-link > .k-panelbar-collapse,> .k-link > .k-panelbar-expand').toggleClass('k-i-arrow-60-up', !visibility).toggleClass('k-panelbar-collapse', !visibility).toggleClass('k-i-arrow-60-down', visibility).toggleClass('k-panelbar-expand', visibility);\n                if (visibility) {\n                    animation = extend(collapse, { hide: true });\n                    animation.complete = function () {\n                        that._animationCallback();\n                    };\n                } else {\n                    animation = extend({\n                        complete: function (element) {\n                            that._triggerEvent(ACTIVATE, element.closest(ITEM));\n                            that._animationCallback();\n                        }\n                    }, animation);\n                }\n                element.kendoStop(true, true).kendoAnimate(animation);\n            },\n            _animationCallback: function () {\n                var that = this;\n                that.trigger('complete');\n                that._animating = false;\n            },\n            _addGroupElement: function (element) {\n                var group = $('<ul role=\"group\" aria-hidden=\"true\" class=\"k-group k-panel\" style=\"display:none\"></ul>');\n                element.append(group);\n                return group;\n            },\n            _collapseAllExpanded: function (item) {\n                var that = this, children, stopExpand = false;\n                var groups = item.find(GROUPS).add(item.find(CONTENTS));\n                if (groups.is(VISIBLE)) {\n                    stopExpand = true;\n                }\n                if (!(groups.is(VISIBLE) || groups.length === 0)) {\n                    children = item.siblings();\n                    children.find(GROUPS).add(children.find(CONTENTS)).filter(function () {\n                        return $(this).is(VISIBLE);\n                    }).each(function (index, content) {\n                        content = $(content);\n                        stopExpand = that._triggerEvent(COLLAPSE, content.closest(ITEM));\n                        if (!stopExpand) {\n                            that._toggleGroup(content, true);\n                        }\n                    });\n                    that.one('complete', function () {\n                        setTimeout(function () {\n                            children.each(function (index, child) {\n                                var dataItem = that.dataItem(child);\n                                if (dataItem) {\n                                    dataItem.set('expanded', false);\n                                }\n                            });\n                        });\n                    });\n                }\n                return stopExpand;\n            },\n            _ajaxRequest: function (element, contentElement, isVisible) {\n                var that = this, statusIcon = element.find('.k-panelbar-collapse, .k-panelbar-expand'), link = element.find(LINKSELECTOR), loadingIconTimeout = setTimeout(function () {\n                        statusIcon.addClass('k-i-loading');\n                    }, 100), data = {}, url = link.attr(HREF);\n                $.ajax({\n                    type: 'GET',\n                    cache: false,\n                    url: url,\n                    dataType: 'html',\n                    data: data,\n                    error: function (xhr, status) {\n                        statusIcon.removeClass('k-i-loading');\n                        if (that.trigger(ERROR, {\n                                xhr: xhr,\n                                status: status\n                            })) {\n                            this.complete();\n                        }\n                    },\n                    complete: function () {\n                        clearTimeout(loadingIconTimeout);\n                        statusIcon.removeClass('k-i-loading');\n                    },\n                    success: function (data) {\n                        function getElements() {\n                            return { elements: contentElement.get() };\n                        }\n                        try {\n                            that.angular('cleanup', getElements);\n                            contentElement.html(data);\n                            that.angular('compile', getElements);\n                        } catch (e) {\n                            var console = window.console;\n                            if (console && console.error) {\n                                console.error(e.name + ': ' + e.message + ' in ' + url);\n                            }\n                            this.error(this.xhr, 'error');\n                        }\n                        that._toggleGroup(contentElement, isVisible);\n                        that.trigger(CONTENTLOAD, {\n                            item: element[0],\n                            contentElement: contentElement[0]\n                        });\n                    }\n                });\n            },\n            _triggerEvent: function (eventName, element) {\n                var that = this;\n                return that.trigger(eventName, { item: element[0] });\n            },\n            _updateSelected: function (link, skipChange) {\n                var that = this, element = that.element, item = link.parent(ITEM), selected = that._selected, dataItem = that.dataItem(item);\n                if (selected) {\n                    selected.removeAttr(ARIA_SELECTED);\n                }\n                that._selected = item.attr(ARIA_SELECTED, true);\n                element.find(selectableItems).removeClass(SELECTEDCLASS);\n                element.find('> .' + HIGHLIGHTCLASS + ', .k-panel > .' + HIGHLIGHTCLASS).removeClass(HIGHLIGHTCLASS);\n                link.addClass(SELECTEDCLASS);\n                link.parentsUntil(element, ITEM).filter(':has(.k-header)').addClass(HIGHLIGHTCLASS);\n                that._current(item[0] ? item : null);\n                if (dataItem) {\n                    dataItem.set('selected', true);\n                }\n                if (!skipChange) {\n                    that.trigger(CHANGE);\n                }\n            },\n            _animations: function (options) {\n                if (options && 'animation' in options && !options.animation) {\n                    options.animation = {\n                        expand: { effects: {} },\n                        collapse: {\n                            hide: true,\n                            effects: {}\n                        }\n                    };\n                }\n            },\n            renderItem: function (options) {\n                var that = this;\n                options = extend({\n                    panelBar: that,\n                    group: {}\n                }, options);\n                var empty = that.templates.empty, item = options.item;\n                return that.templates.item(extend(options, {\n                    itemWrapper: that.templates.itemWrapper,\n                    renderContent: that.renderContent,\n                    arrow: that._hasChildItems(item) || item.content || item.contentUrl ? that.templates.arrow : empty,\n                    subGroup: !options.loadOnDemand || item.expanded ? that.renderGroup : empty\n                }, rendering));\n            },\n            renderGroup: function (options) {\n                var that = this;\n                var templates = that.templates || options.panelBar.templates;\n                return templates.group(extend({\n                    renderItems: function (options) {\n                        var html = '', i = 0, items = options.items, len = items ? items.length : 0, group = extend({ length: len }, options.group);\n                        for (; i < len; i++) {\n                            html += options.panelBar.renderItem(extend(options, {\n                                group: group,\n                                item: extend({ index: i }, items[i])\n                            }));\n                        }\n                        return html;\n                    }\n                }, options, rendering));\n            },\n            renderContent: function (options) {\n                return options.panelBar.templates.content(extend(options, rendering));\n            }\n        });\n        kendo.ui.plugin(PanelBar);\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.progressbar', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'progressbar',\n        name: 'ProgressBar',\n        category: 'web',\n        description: 'The ProgressBar offers rich functionality for displaying and tracking progress',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, HORIZONTAL = 'horizontal', VERTICAL = 'vertical', DEFAULTMIN = 0, DEFAULTMAX = 100, DEFAULTVALUE = 0, DEFAULTCHUNKCOUNT = 5, KPROGRESSBAR = 'k-progressbar', KPROGRESSBARREVERSE = 'k-progressbar-reverse', KPROGRESSBARINDETERMINATE = 'k-progressbar-indeterminate', KPROGRESSBARCOMPLETE = 'k-complete', KPROGRESSWRAPPER = 'k-state-selected', KPROGRESSSTATUS = 'k-progress-status', KCOMPLETEDCHUNK = 'k-state-selected', KUPCOMINGCHUNK = 'k-state-default', KSTATEDISABLED = 'k-state-disabled', PROGRESSTYPE = {\n                VALUE: 'value',\n                PERCENT: 'percent',\n                CHUNK: 'chunk'\n            }, CHANGE = 'change', COMPLETE = 'complete', BOOLEAN = 'boolean', math = Math, extend = $.extend, proxy = $.proxy, HUNDREDPERCENT = 100, DEFAULTANIMATIONDURATION = 400, PRECISION = 3, templates = { progressStatus: '<span class=\\'k-progress-status-wrap\\'><span class=\\'k-progress-status\\'></span></span>' };\n        var ProgressBar = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(this, element, options);\n                options = that.options;\n                that._progressProperty = options.orientation === HORIZONTAL ? 'width' : 'height';\n                that._fields();\n                options.value = that._validateValue(options.value);\n                that._validateType(options.type);\n                that._wrapper();\n                that._progressAnimation();\n                if (options.value !== options.min && options.value !== false) {\n                    that._updateProgress();\n                }\n            },\n            setOptions: function (options) {\n                var that = this;\n                Widget.fn.setOptions.call(that, options);\n                if (options.hasOwnProperty('reverse')) {\n                    that.wrapper.toggleClass('k-progressbar-reverse', options.reverse);\n                }\n                if (options.hasOwnProperty('enable')) {\n                    that.enable(options.enable);\n                }\n                that._progressAnimation();\n                that._validateValue();\n                that._updateProgress();\n            },\n            events: [\n                CHANGE,\n                COMPLETE\n            ],\n            options: {\n                name: 'ProgressBar',\n                orientation: HORIZONTAL,\n                reverse: false,\n                min: DEFAULTMIN,\n                max: DEFAULTMAX,\n                value: DEFAULTVALUE,\n                enable: true,\n                type: PROGRESSTYPE.VALUE,\n                chunkCount: DEFAULTCHUNKCOUNT,\n                showStatus: true,\n                animation: {}\n            },\n            _fields: function () {\n                var that = this;\n                that._isStarted = false;\n                that.progressWrapper = that.progressStatus = $();\n            },\n            _validateType: function (currentType) {\n                var isValid = false;\n                $.each(PROGRESSTYPE, function (k, type) {\n                    if (type === currentType) {\n                        isValid = true;\n                        return false;\n                    }\n                });\n                if (!isValid) {\n                    throw new Error(kendo.format('Invalid ProgressBar type \\'{0}\\'', currentType));\n                }\n            },\n            _wrapper: function () {\n                var that = this;\n                var container = that.wrapper = that.element;\n                var options = that.options;\n                var orientation = options.orientation;\n                var initialStatusValue;\n                container.addClass('k-widget ' + KPROGRESSBAR);\n                container.addClass(KPROGRESSBAR + '-' + (orientation === HORIZONTAL ? HORIZONTAL : VERTICAL));\n                if (options.enable === false) {\n                    container.addClass(KSTATEDISABLED);\n                }\n                if (options.reverse) {\n                    container.addClass(KPROGRESSBARREVERSE);\n                }\n                if (options.value === false) {\n                    container.addClass(KPROGRESSBARINDETERMINATE);\n                }\n                if (options.type === PROGRESSTYPE.CHUNK) {\n                    that._addChunkProgressWrapper();\n                } else {\n                    if (options.showStatus) {\n                        that.progressStatus = that.wrapper.prepend(templates.progressStatus).find('.' + KPROGRESSSTATUS);\n                        initialStatusValue = options.value !== false ? options.value : options.min;\n                        if (options.type === PROGRESSTYPE.VALUE) {\n                            that.progressStatus.text(initialStatusValue);\n                        } else {\n                            that.progressStatus.text(that._calculatePercentage(initialStatusValue).toFixed() + '%');\n                        }\n                    }\n                }\n            },\n            value: function (value) {\n                return this._value(value);\n            },\n            _value: function (value) {\n                var that = this;\n                var options = that.options;\n                var validated;\n                if (value === undefined) {\n                    return options.value;\n                } else {\n                    if (typeof value !== BOOLEAN) {\n                        value = that._roundValue(value);\n                        if (!isNaN(value)) {\n                            validated = that._validateValue(value);\n                            if (validated !== options.value) {\n                                that.wrapper.removeClass(KPROGRESSBARINDETERMINATE);\n                                options.value = validated;\n                                that._isStarted = true;\n                                that._updateProgress();\n                            }\n                        }\n                    } else if (!value) {\n                        that.wrapper.addClass(KPROGRESSBARINDETERMINATE);\n                        options.value = false;\n                    }\n                }\n            },\n            _roundValue: function (value) {\n                value = parseFloat(value);\n                var power = math.pow(10, PRECISION);\n                return math.floor(value * power) / power;\n            },\n            _validateValue: function (value) {\n                var that = this;\n                var options = that.options;\n                if (value !== false) {\n                    if (value <= options.min || value === true) {\n                        return options.min;\n                    } else if (value >= options.max) {\n                        return options.max;\n                    }\n                } else if (value === false) {\n                    return false;\n                }\n                if (isNaN(that._roundValue(value))) {\n                    return options.min;\n                }\n                return value;\n            },\n            _updateProgress: function () {\n                var that = this;\n                var options = that.options;\n                var percentage = that._calculatePercentage();\n                if (options.type === PROGRESSTYPE.CHUNK) {\n                    that._updateChunks(percentage);\n                    that._onProgressUpdateAlways(options.value);\n                } else {\n                    that._updateProgressWrapper(percentage);\n                }\n            },\n            _updateChunks: function (percentage) {\n                var that = this;\n                var options = that.options;\n                var chunkCount = options.chunkCount;\n                var percentagesPerChunk = parseInt(HUNDREDPERCENT / chunkCount * 100, 10) / 100;\n                var percentageParsed = parseInt(percentage * 100, 10) / 100;\n                var completedChunksCount = math.floor(percentageParsed / percentagesPerChunk);\n                var completedChunks;\n                if (options.orientation === HORIZONTAL && !options.reverse || options.orientation === VERTICAL && options.reverse) {\n                    completedChunks = that.wrapper.find('li.k-item:lt(' + completedChunksCount + ')');\n                } else {\n                    completedChunks = that.wrapper.find('li.k-item:gt(-' + (completedChunksCount + 1) + ')');\n                }\n                that.wrapper.find('.' + KCOMPLETEDCHUNK).removeClass(KCOMPLETEDCHUNK).addClass(KUPCOMINGCHUNK);\n                completedChunks.removeClass(KUPCOMINGCHUNK).addClass(KCOMPLETEDCHUNK);\n            },\n            _updateProgressWrapper: function (percentage) {\n                var that = this;\n                var options = that.options;\n                var progressWrapper = that.wrapper.find('.' + KPROGRESSWRAPPER);\n                var animationDuration = that._isStarted ? that._animation.duration : 0;\n                var animationCssOptions = {};\n                if (progressWrapper.length === 0) {\n                    that._addRegularProgressWrapper();\n                }\n                animationCssOptions[that._progressProperty] = percentage + '%';\n                that.progressWrapper.animate(animationCssOptions, {\n                    duration: animationDuration,\n                    start: proxy(that._onProgressAnimateStart, that),\n                    progress: proxy(that._onProgressAnimate, that),\n                    complete: proxy(that._onProgressAnimateComplete, that, options.value),\n                    always: proxy(that._onProgressUpdateAlways, that, options.value)\n                });\n            },\n            _onProgressAnimateStart: function () {\n                this.progressWrapper.show();\n            },\n            _onProgressAnimate: function (e) {\n                var that = this;\n                var options = that.options;\n                var progressInPercent = parseFloat(e.elem.style[that._progressProperty], 10);\n                var progressStatusWrapSize;\n                if (options.showStatus) {\n                    progressStatusWrapSize = 10000 / parseFloat(that.progressWrapper[0].style[that._progressProperty]);\n                    that.progressWrapper.find('.k-progress-status-wrap').css(that._progressProperty, progressStatusWrapSize + '%');\n                }\n                if (options.type !== PROGRESSTYPE.CHUNK && progressInPercent <= 98) {\n                    that.progressWrapper.removeClass(KPROGRESSBARCOMPLETE);\n                }\n            },\n            _onProgressAnimateComplete: function (currentValue) {\n                var that = this;\n                var options = that.options;\n                var progressWrapperSize = parseFloat(that.progressWrapper[0].style[that._progressProperty]);\n                var progressValue;\n                if (options.type !== PROGRESSTYPE.CHUNK && progressWrapperSize > 98) {\n                    that.progressWrapper.addClass(KPROGRESSBARCOMPLETE);\n                }\n                if (options.showStatus) {\n                    if (options.type === PROGRESSTYPE.VALUE) {\n                        progressValue = currentValue;\n                    } else if (options.type == PROGRESSTYPE.PERCENT) {\n                        progressValue = that._calculatePercentage(currentValue).toFixed() + '%';\n                    } else {\n                        progressValue = math.floor(that._calculatePercentage(currentValue)) + '%';\n                    }\n                    that.progressStatus.text(progressValue);\n                }\n                if (currentValue === options.min) {\n                    that.progressWrapper.hide();\n                }\n            },\n            _onProgressUpdateAlways: function (currentValue) {\n                var that = this;\n                var options = that.options;\n                if (that._isStarted) {\n                    that.trigger(CHANGE, { value: currentValue });\n                }\n                if (currentValue === options.max && that._isStarted) {\n                    that.trigger(COMPLETE, { value: options.max });\n                }\n            },\n            enable: function (enable) {\n                var that = this;\n                var options = that.options;\n                options.enable = typeof enable === 'undefined' ? true : enable;\n                that.wrapper.toggleClass(KSTATEDISABLED, !options.enable);\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n            },\n            _addChunkProgressWrapper: function () {\n                var that = this;\n                var options = that.options;\n                var container = that.wrapper;\n                var chunkSize = HUNDREDPERCENT / options.chunkCount;\n                var html = '';\n                if (options.chunkCount <= 1) {\n                    options.chunkCount = 1;\n                }\n                html += '<ul class=\\'k-reset\\'>';\n                for (var i = options.chunkCount - 1; i >= 0; i--) {\n                    html += '<li class=\\'k-item k-state-default\\'></li>';\n                }\n                html += '</ul>';\n                container.append(html).find('.k-item').css(that._progressProperty, chunkSize + '%').first().addClass('k-first').end().last().addClass('k-last');\n                that._normalizeChunkSize();\n            },\n            _normalizeChunkSize: function () {\n                var that = this;\n                var options = that.options;\n                var lastChunk = that.wrapper.find('.k-item:last');\n                var currentSize = parseFloat(lastChunk[0].style[that._progressProperty]);\n                var difference = HUNDREDPERCENT - options.chunkCount * currentSize;\n                if (difference > 0) {\n                    lastChunk.css(that._progressProperty, currentSize + difference + '%');\n                }\n            },\n            _addRegularProgressWrapper: function () {\n                var that = this;\n                that.progressWrapper = $('<div class=\\'' + KPROGRESSWRAPPER + '\\'></div>').appendTo(that.wrapper);\n                if (that.options.showStatus) {\n                    that.progressWrapper.append(templates.progressStatus);\n                    that.progressStatus = that.wrapper.find('.' + KPROGRESSSTATUS);\n                }\n            },\n            _calculateChunkSize: function () {\n                var that = this;\n                var chunkCount = that.options.chunkCount;\n                var chunkContainer = that.wrapper.find('ul.k-reset');\n                return (parseInt(chunkContainer.css(that._progressProperty), 10) - (chunkCount - 1)) / chunkCount;\n            },\n            _calculatePercentage: function (currentValue) {\n                var that = this;\n                var options = that.options;\n                var value = currentValue !== undefined ? currentValue : options.value;\n                var min = options.min;\n                var max = options.max;\n                that._onePercent = math.abs((max - min) / 100);\n                return math.abs((value - min) / that._onePercent);\n            },\n            _progressAnimation: function () {\n                var that = this;\n                var options = that.options;\n                var animation = options.animation;\n                if (animation === false) {\n                    that._animation = { duration: 0 };\n                } else {\n                    that._animation = extend({ duration: DEFAULTANIMATIONDURATION }, options.animation);\n                }\n            }\n        });\n        kendo.ui.plugin(ProgressBar);\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.responsivepanel', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'responsive-panel',\n        name: 'Responsive Panel',\n        category: 'web',\n        description: 'The Responsive Panel widget allows a panel of content to be hidden on mobile devices, available through a toggle button.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var proxy = $.proxy;\n        var NS = '.kendoResponsivePanel';\n        var OPEN = 'open';\n        var CLOSE = 'close';\n        var ACTIVATE_EVENTS = 'click' + NS + ' touchstart' + NS;\n        var Widget = kendo.ui.Widget;\n        var ResponsivePanel = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this._guid = '_' + kendo.guid();\n                this._toggleHandler = proxy(this._toggleButtonClick, this);\n                this._closeHandler = proxy(this._close, this);\n                $(document.documentElement).on(ACTIVATE_EVENTS, this.options.toggleButton, this._toggleHandler);\n                this._registerBreakpoint();\n                this.element.addClass('k-rpanel k-rpanel-' + this.options.orientation + ' ' + this._guid);\n                this._resizeHandler = proxy(this.resize, this, true);\n                $(window).on('resize' + NS, this._resizeHandler);\n            },\n            _mediaQuery: '@media (max-width: #= breakpoint-1 #px) {' + '.#= guid #.k-rpanel-animate.k-rpanel-left,' + '.#= guid #.k-rpanel-animate.k-rpanel-right {' + '-webkit-transition: -webkit-transform .2s ease-out;' + '-ms-transition: -ms-transform .2s ease-out;' + 'transition: transform .2s ease-out;' + '} ' + '.#= guid #.k-rpanel-top {' + 'overflow: hidden;' + '}' + '.#= guid #.k-rpanel-animate.k-rpanel-top {' + '-webkit-transition: max-height .2s linear;' + '-ms-transition: max-height .2s linear;' + 'transition: max-height .2s linear;' + '}' + '} ' + '@media (min-width: #= breakpoint #px) {' + '#= toggleButton # { display: none; } ' + '.#= guid #.k-rpanel-left { float: left; } ' + '.#= guid #.k-rpanel-right { float: right; } ' + '.#= guid #.k-rpanel-left, .#= guid #.k-rpanel-right {' + 'position: relative;' + '-webkit-transform: translateX(0);' + '-ms-transform: translateX(0);' + 'transform: translateX(0);' + '-webkit-transform: translateX(0) translateZ(0);' + '-ms-transform: translateX(0) translateZ(0);' + 'transform: translateX(0) translateZ(0);' + '} ' + '.k-ie9 .#= guid #.k-rpanel-left { left: 0; } ' + '.#= guid #.k-rpanel-top { max-height: none; }' + '}',\n            _registerBreakpoint: function () {\n                var options = this.options;\n                this._registerStyle(kendo.template(this._mediaQuery)({\n                    breakpoint: options.breakpoint,\n                    toggleButton: options.toggleButton,\n                    guid: this._guid\n                }));\n            },\n            _registerStyle: function (cssText) {\n                var head = $('head,body')[0];\n                var style = document.createElement('style');\n                head.appendChild(style);\n                if (style.styleSheet) {\n                    style.styleSheet.cssText = cssText;\n                } else {\n                    style.appendChild(document.createTextNode(cssText));\n                }\n            },\n            options: {\n                name: 'ResponsivePanel',\n                orientation: 'left',\n                toggleButton: '.k-rpanel-toggle',\n                breakpoint: 640,\n                autoClose: true\n            },\n            events: [\n                OPEN,\n                CLOSE\n            ],\n            _resize: function () {\n                this.element.removeClass('k-rpanel-animate k-rpanel-expanded');\n                $(document.documentElement).off(ACTIVATE_EVENTS, this._closeHandler);\n            },\n            _toggleButtonClick: function (e) {\n                e.preventDefault();\n                if (this.element.hasClass('k-rpanel-expanded')) {\n                    this.close();\n                } else {\n                    this.open();\n                }\n            },\n            open: function () {\n                if (!this.trigger(OPEN)) {\n                    this.element.addClass('k-rpanel-animate k-rpanel-expanded');\n                    if (this.options.autoClose) {\n                        $(document.documentElement).on(ACTIVATE_EVENTS, this._closeHandler);\n                    }\n                }\n            },\n            close: function () {\n                if (!this.trigger(CLOSE)) {\n                    this.element.addClass('k-rpanel-animate').removeClass('k-rpanel-expanded');\n                    $(document.documentElement).off(ACTIVATE_EVENTS, this._closeHandler);\n                }\n            },\n            _close: function (e) {\n                var prevented = e.isDefaultPrevented();\n                var container = $(e.target).closest(this.options.toggleButton + ',.k-rpanel');\n                if (!container.length && !prevented) {\n                    this.close();\n                }\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                $(window).off('resize' + NS, this._resizeHandler);\n                $(document.documentElement).off(ACTIVATE_EVENTS, this._closeHandler);\n            }\n        });\n        kendo.ui.plugin(ResponsivePanel);\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.tabstrip', ['kendo.data'], f);\n}(function () {\n    var __meta__ = {\n        id: 'tabstrip',\n        name: 'TabStrip',\n        category: 'web',\n        description: 'The TabStrip widget displays a collection of tabs with associated tab content.',\n        depends: ['data'],\n        features: [{\n                id: 'tabstrip-fx',\n                name: 'Animation',\n                description: 'Support for animation',\n                depends: ['fx']\n            }]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, keys = kendo.keys, map = $.map, each = $.each, trim = $.trim, extend = $.extend, isFunction = kendo.isFunction, template = kendo.template, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, Widget = ui.Widget, excludedNodesRegExp = /^(a|div)$/i, NS = '.kendoTabStrip', IMG = 'img', HREF = 'href', PREV = 'prev', NEXT = 'next', SHOW = 'show', LINK = 'k-link', LAST = 'k-last', CLICK = 'click', ERROR = 'error', EMPTY = ':empty', IMAGE = 'k-image', FIRST = 'k-first', SELECT = 'select', ACTIVATE = 'activate', CONTENT = 'k-content', CONTENTURL = 'contentUrl', MOUSEENTER = 'mouseenter', MOUSELEAVE = 'mouseleave', CONTENTLOAD = 'contentLoad', DISABLEDSTATE = 'k-state-disabled', DEFAULTSTATE = 'k-state-default', ACTIVESTATE = 'k-state-active', FOCUSEDSTATE = 'k-state-focused', HOVERSTATE = 'k-state-hover', TABONTOP = 'k-tab-on-top', NAVIGATABLEITEMS = '.k-item:not(.' + DISABLEDSTATE + ')', KEYBOARDNAVIGATABLEITEMS = '.k-item', HOVERABLEITEMS = '.k-tabstrip-items > ' + NAVIGATABLEITEMS + ':not(.' + ACTIVESTATE + ')', DEFAULTDISTANCE = 200, templates = {\n                content: template('<div class=\\'k-content\\'#= contentAttributes(data) # role=\\'tabpanel\\'>#= content(item) #</div>'),\n                itemWrapper: template('<#= tag(item) # class=\\'k-link\\'#= contentUrl(item) ##= textAttributes(item) #>' + '#= image(item) ##= sprite(item) ##= text(item) #' + '</#= tag(item) #>'),\n                item: template('<li class=\\'#= wrapperCssClass(group, item) #\\' role=\\'tab\\' #=item.active ? \"aria-selected=\\'true\\'\" : \\'\\'#>' + '#= itemWrapper(data) #' + '</li>'),\n                image: template('<img class=\\'k-image\\' alt=\\'\\' src=\\'#= imageUrl #\\' />'),\n                sprite: template('<span class=\\'k-sprite #= spriteCssClass #\\'></span>'),\n                empty: template('')\n            }, rendering = {\n                wrapperCssClass: function (group, item) {\n                    var result = 'k-item', index = item.index;\n                    if (item.enabled === false) {\n                        result += ' k-state-disabled';\n                    } else {\n                        result += ' k-state-default';\n                    }\n                    if (index === 0) {\n                        result += ' k-first';\n                    }\n                    if (index == group.length - 1) {\n                        result += ' k-last';\n                    }\n                    return result;\n                },\n                textAttributes: function (item) {\n                    return item.url ? ' href=\\'' + item.url + '\\'' : '';\n                },\n                text: function (item) {\n                    return item.encoded === false ? item.text : kendo.htmlEncode(item.text);\n                },\n                tag: function (item) {\n                    return item.url ? 'a' : 'span';\n                },\n                contentAttributes: function (content) {\n                    return content.active !== true ? ' style=\\'display:none\\' aria-hidden=\\'true\\' aria-expanded=\\'false\\'' : '';\n                },\n                content: function (item) {\n                    return item.content ? item.content : item.contentUrl ? '' : '&nbsp;';\n                },\n                contentUrl: function (item) {\n                    return item.contentUrl ? kendo.attr('content-url') + '=\"' + item.contentUrl + '\"' : '';\n                }\n            };\n        function updateTabClasses(tabs) {\n            tabs.children(IMG).addClass(IMAGE);\n            tabs.children('a').addClass(LINK).children(IMG).addClass(IMAGE);\n            tabs.filter(':not([disabled]):not([class*=k-state-disabled])').addClass(DEFAULTSTATE);\n            tabs.filter('li[disabled]').addClass(DISABLEDSTATE).attr('aria-disabled', 'true').removeAttr('disabled');\n            tabs.filter(':not([class*=k-state])').children('a').filter(':focus').parent().addClass(ACTIVESTATE + ' ' + TABONTOP);\n            tabs.attr('role', 'tab');\n            tabs.filter('.' + ACTIVESTATE).attr('aria-selected', true);\n            tabs.each(function () {\n                var item = $(this);\n                if (!item.children('.' + LINK).length) {\n                    item.contents().filter(function () {\n                        return !this.nodeName.match(excludedNodesRegExp) && !(this.nodeType == 3 && !trim(this.nodeValue));\n                    }).wrapAll('<span UNSELECTABLE=\\'on\\' class=\\'' + LINK + '\\'/>');\n                }\n            });\n        }\n        function updateFirstLast(tabGroup) {\n            var tabs = tabGroup.children('.k-item');\n            tabs.filter('.k-first:not(:first-child)').removeClass(FIRST);\n            tabs.filter('.k-last:not(:last-child)').removeClass(LAST);\n            tabs.filter(':first-child').addClass(FIRST);\n            tabs.filter(':last-child').addClass(LAST);\n        }\n        function scrollButtonHtml(buttonClass, iconClass) {\n            return '<span class=\\'k-button k-button-icon k-bare k-tabstrip-' + buttonClass + '\\' unselectable=\\'on\\'><span class=\\'k-icon ' + iconClass + '\\'></span></span>';\n        }\n        var TabStrip = Widget.extend({\n            init: function (element, options) {\n                var that = this, value;\n                Widget.fn.init.call(that, element, options);\n                that._animations(that.options);\n                options = that.options;\n                that._contentUrls = options.contentUrls || [];\n                that._wrapper();\n                that._isRtl = kendo.support.isRtl(that.wrapper);\n                that._tabindex();\n                that._updateClasses();\n                that._dataSource();\n                if (options.dataSource) {\n                    that.dataSource.fetch();\n                }\n                that._tabPosition();\n                that._scrollable();\n                if (that._contentUrls.length) {\n                    that.wrapper.find('.k-tabstrip-items > .k-item').each(function (index, item) {\n                        var url = that._contentUrls[index];\n                        if (typeof url === 'string') {\n                            $(item).find('>.' + LINK).data(CONTENTURL, url);\n                        }\n                    });\n                } else {\n                    that._contentUrls.length = that.tabGroup.find('li.k-item').length;\n                }\n                that.wrapper.on(MOUSEENTER + NS + ' ' + MOUSELEAVE + NS, HOVERABLEITEMS, that._toggleHover).on('focus' + NS, $.proxy(that._active, that)).on('blur' + NS, function () {\n                    that._current(null);\n                });\n                that._keyDownProxy = $.proxy(that._keydown, that);\n                if (options.navigatable) {\n                    that.wrapper.on('keydown' + NS, that._keyDownProxy);\n                }\n                if (that.options.value) {\n                    value = that.options.value;\n                }\n                that.wrapper.children('.k-tabstrip-items').on(CLICK + NS, '.k-state-disabled .k-link', false).on(CLICK + NS, ' > ' + NAVIGATABLEITEMS, function (e) {\n                    var wr = that.wrapper[0];\n                    if (wr !== document.activeElement) {\n                        var msie = kendo.support.browser.msie;\n                        if (msie) {\n                            try {\n                                wr.setActive();\n                            } catch (j) {\n                                wr.focus();\n                            }\n                        } else {\n                            wr.focus();\n                        }\n                    }\n                    if (that._click($(e.currentTarget))) {\n                        e.preventDefault();\n                    }\n                });\n                var selectedItems = that.tabGroup.children('li.' + ACTIVESTATE), content = that.contentHolder(selectedItems.index());\n                if (selectedItems[0] && content.length > 0 && content[0].childNodes.length === 0) {\n                    that.activateTab(selectedItems.eq(0));\n                }\n                that.element.attr('role', 'tablist');\n                if (that.element[0].id) {\n                    that._ariaId = that.element[0].id + '_ts_active';\n                }\n                that.value(value);\n                kendo.notify(that);\n            },\n            _active: function () {\n                var item = this.tabGroup.children().filter('.' + ACTIVESTATE);\n                item = item[0] ? item : this._endItem('first');\n                if (item[0]) {\n                    this._current(item);\n                }\n            },\n            _endItem: function (action) {\n                return this.tabGroup.children(NAVIGATABLEITEMS)[action]();\n            },\n            _getItem: function (action) {\n                return this.tabGroup.children(KEYBOARDNAVIGATABLEITEMS)[action]();\n            },\n            _item: function (item, action) {\n                var endItem;\n                if (action === PREV) {\n                    endItem = 'last';\n                } else {\n                    endItem = 'first';\n                }\n                if (!item) {\n                    return this._endItem(endItem);\n                }\n                item = item[action]();\n                if (!item[0]) {\n                    item = this.tabGroup.children(KEYBOARDNAVIGATABLEITEMS)[endItem]();\n                }\n                if (item.hasClass(DISABLEDSTATE)) {\n                    item.addClass(FOCUSEDSTATE);\n                }\n                if (item.hasClass(DISABLEDSTATE) || item.hasClass(ACTIVESTATE)) {\n                    this._focused = item;\n                }\n                return item;\n            },\n            _current: function (candidate) {\n                var that = this, focused = that._focused, id = that._ariaId;\n                if (candidate === undefined) {\n                    return focused;\n                }\n                if (focused) {\n                    that.tabGroup.children('#' + id).removeAttr('id');\n                    focused.removeClass(FOCUSEDSTATE);\n                }\n                if (candidate) {\n                    if (!candidate.hasClass(ACTIVESTATE)) {\n                        candidate.addClass(FOCUSEDSTATE);\n                    }\n                    that.element.removeAttr('aria-activedescendant');\n                    id = candidate[0].id || id;\n                    if (id) {\n                        candidate.attr('id', id);\n                        that.element.attr('aria-activedescendant', id);\n                    }\n                }\n                that._focused = candidate;\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode, current = that._current(), rtl = that._isRtl, isHorizontal = /top|bottom/.test(that.options.tabPosition), action;\n                if (e.target != e.currentTarget) {\n                    return;\n                }\n                if (key === keys.DOWN && !isHorizontal) {\n                    action = NEXT;\n                } else if (key === keys.UP && !isHorizontal) {\n                    action = PREV;\n                } else if (key === keys.RIGHT && isHorizontal) {\n                    action = rtl ? PREV : NEXT;\n                } else if (key === keys.LEFT && isHorizontal) {\n                    action = rtl ? NEXT : PREV;\n                } else if (key == keys.ENTER || key == keys.SPACEBAR) {\n                    that._click(current);\n                    e.preventDefault();\n                } else if (key == keys.HOME) {\n                    that._click(that._getItem('first'));\n                    e.preventDefault();\n                    return;\n                } else if (key == keys.END) {\n                    that._click(that._getItem('last'));\n                    e.preventDefault();\n                    return;\n                }\n                if (action) {\n                    that._click(that._item(current, action));\n                    e.preventDefault();\n                }\n            },\n            _dataSource: function () {\n                var that = this;\n                if (that.dataSource && that._refreshHandler) {\n                    that.dataSource.unbind('change', that._refreshHandler);\n                } else {\n                    that._refreshHandler = $.proxy(that.refresh, that);\n                }\n                that.dataSource = kendo.data.DataSource.create(that.options.dataSource).bind('change', that._refreshHandler);\n            },\n            setDataSource: function (dataSource) {\n                var that = this;\n                that.options.dataSource = dataSource;\n                that._dataSource();\n                that.dataSource.fetch();\n            },\n            _animations: function (options) {\n                if (options && 'animation' in options && !options.animation) {\n                    options.animation = {\n                        open: { effects: {} },\n                        close: { effects: {} }\n                    };\n                }\n            },\n            refresh: function (e) {\n                var that = this, options = that.options, encoded = kendo.getter(options.dataEncodedField), text = kendo.getter(options.dataTextField), content = kendo.getter(options.dataContentField), contentUrl = kendo.getter(options.dataContentUrlField), image = kendo.getter(options.dataImageUrlField), url = kendo.getter(options.dataUrlField), sprite = kendo.getter(options.dataSpriteCssClass), idx, tabs = [], tab, action, view = that.dataSource.view(), length;\n                e = e || {};\n                action = e.action;\n                if (action) {\n                    view = e.items;\n                }\n                for (idx = 0, length = view.length; idx < length; idx++) {\n                    tab = { text: text(view[idx]) };\n                    if (options.dataEncodedField) {\n                        tab.encoded = encoded(view[idx]);\n                    }\n                    if (options.dataContentField) {\n                        tab.content = content(view[idx]);\n                    }\n                    if (options.dataContentUrlField) {\n                        tab.contentUrl = contentUrl(view[idx]);\n                    }\n                    if (options.dataUrlField) {\n                        tab.url = url(view[idx]);\n                    }\n                    if (options.dataImageUrlField) {\n                        tab.imageUrl = image(view[idx]);\n                    }\n                    if (options.dataSpriteCssClass) {\n                        tab.spriteCssClass = sprite(view[idx]);\n                    }\n                    tabs[idx] = tab;\n                }\n                if (e.action == 'add') {\n                    if (e.index < that.tabGroup.children().length) {\n                        that.insertBefore(tabs, that.tabGroup.children().eq(e.index));\n                    } else {\n                        that.append(tabs);\n                    }\n                } else if (e.action == 'remove') {\n                    for (idx = 0; idx < view.length; idx++) {\n                        that.remove(e.index);\n                    }\n                } else if (e.action == 'itemchange') {\n                    idx = that.dataSource.view().indexOf(view[0]);\n                    if (e.field === options.dataTextField) {\n                        that.tabGroup.children().eq(idx).find('.k-link').text(view[0].get(e.field));\n                    }\n                    if (e.field === options.dataUrlField) {\n                        that._contentUrls[idx] = view[0].get(e.field);\n                    }\n                } else {\n                    that.trigger('dataBinding');\n                    that.remove('li');\n                    that._contentUrls = [];\n                    that.append(tabs);\n                    that.trigger('dataBound');\n                }\n            },\n            value: function (value) {\n                var that = this;\n                if (value !== undefined) {\n                    if (value != that.value()) {\n                        that.tabGroup.children().each(function () {\n                            if ($.trim($(this).text()) == value) {\n                                that.select(this);\n                            }\n                        });\n                    }\n                } else {\n                    return that.select().text();\n                }\n            },\n            items: function () {\n                return this.tabGroup[0].children;\n            },\n            setOptions: function (options) {\n                var that = this, animation = that.options.animation;\n                that._animations(options);\n                if (options.contentUrls) {\n                    that._contentUrls = options.contentUrls;\n                }\n                options.animation = extend(true, animation, options.animation);\n                if (options.navigatable) {\n                    that.wrapper.on('keydown' + NS, that._keyDownProxy);\n                } else {\n                    that.wrapper.off('keydown' + NS, that._keyDownProxy);\n                }\n                Widget.fn.setOptions.call(that, options);\n            },\n            events: [\n                SELECT,\n                ACTIVATE,\n                SHOW,\n                ERROR,\n                CONTENTLOAD,\n                'change',\n                'dataBinding',\n                'dataBound'\n            ],\n            options: {\n                name: 'TabStrip',\n                dataEncodedField: '',\n                dataTextField: '',\n                dataContentField: '',\n                dataImageUrlField: '',\n                dataUrlField: '',\n                dataSpriteCssClass: '',\n                dataContentUrlField: '',\n                tabPosition: 'top',\n                animation: {\n                    open: {\n                        effects: 'expand:vertical fadeIn',\n                        duration: 200\n                    },\n                    close: { duration: 200 }\n                },\n                collapsible: false,\n                navigatable: true,\n                contentUrls: false,\n                scrollable: { distance: DEFAULTDISTANCE }\n            },\n            destroy: function () {\n                var that = this, scrollWrap = that.scrollWrap;\n                Widget.fn.destroy.call(that);\n                if (that._refreshHandler) {\n                    that.dataSource.unbind('change', that._refreshHandler);\n                }\n                that.wrapper.off(NS);\n                that.wrapper.children('.k-tabstrip-items').off(NS);\n                if (that._scrollableModeActive) {\n                    that._scrollPrevButton.off().remove();\n                    that._scrollNextButton.off().remove();\n                }\n                kendo.destroy(that.wrapper);\n                scrollWrap.children('.k-tabstrip').unwrap();\n            },\n            select: function (element) {\n                var that = this;\n                if (arguments.length === 0) {\n                    return that.tabGroup.children('li.' + ACTIVESTATE);\n                }\n                if (!isNaN(element)) {\n                    element = that.tabGroup.children().get(element);\n                }\n                element = that.tabGroup.find(element);\n                $(element).each(function (index, item) {\n                    item = $(item);\n                    if (!item.hasClass(ACTIVESTATE) && !that.trigger(SELECT, {\n                            item: item[0],\n                            contentElement: that.contentHolder(item.index())[0]\n                        })) {\n                        that.activateTab(item);\n                    }\n                });\n                return that;\n            },\n            enable: function (element, state) {\n                this._toggleDisabled(element, state !== false);\n                return this;\n            },\n            disable: function (element) {\n                this._toggleDisabled(element, false);\n                return this;\n            },\n            reload: function (element) {\n                element = this.tabGroup.find(element);\n                var that = this;\n                var contentUrls = that._contentUrls;\n                element.each(function () {\n                    var item = $(this), contentUrl = item.find('.' + LINK).data(CONTENTURL) || contentUrls[item.index()], content = that.contentHolder(item.index());\n                    if (contentUrl) {\n                        that.ajaxRequest(item, content, null, contentUrl);\n                    }\n                });\n                return that;\n            },\n            append: function (tab) {\n                var that = this, inserted = that._create(tab);\n                each(inserted.tabs, function (idx) {\n                    var contents = inserted.contents[idx];\n                    that.tabGroup.append(this);\n                    if (that.options.tabPosition == 'bottom') {\n                        that.tabGroup.before(contents);\n                    } else if (that._scrollableModeActive) {\n                        that._scrollPrevButton.before(contents);\n                    } else {\n                        that.wrapper.append(contents);\n                    }\n                    that.angular('compile', function () {\n                        return { elements: [contents] };\n                    });\n                });\n                updateFirstLast(that.tabGroup);\n                that._updateContentElements();\n                that.resize(true);\n                return that;\n            },\n            _appendUrlItem: function (url) {\n                this._contentUrls.push(url);\n            },\n            _moveUrlItem: function (from, to) {\n                this._contentUrls.splice(to, 0, this._contentUrls.splice(from, 1)[0]);\n            },\n            _removeUrlItem: function (index) {\n                this._contentUrls.splice(index, 1);\n            },\n            insertBefore: function (tab, referenceTab) {\n                if ($(tab).is($(referenceTab))) {\n                    referenceTab = this.tabGroup.find(referenceTab).next();\n                } else {\n                    referenceTab = this.tabGroup.find(referenceTab);\n                }\n                var that = this, inserted = that._create(tab), referenceContent = that.element.find('[id=\\'' + referenceTab.attr('aria-controls') + '\\']');\n                each(inserted.tabs, function (idx) {\n                    var contents = inserted.contents[idx];\n                    var fromIndex = inserted.newTabsCreated ? that._contentUrls.length - (inserted.tabs.length - idx) : $(contents).index() - 1;\n                    referenceTab.before(this);\n                    referenceContent.before(contents);\n                    that._moveUrlItem(fromIndex, $(this).index());\n                    that.angular('compile', function () {\n                        return { elements: [contents] };\n                    });\n                });\n                updateFirstLast(that.tabGroup);\n                that._updateContentElements(inserted.newTabsCreated);\n                that.resize(true);\n                return that;\n            },\n            insertAfter: function (tab, referenceTab) {\n                if ($(tab).is($(referenceTab))) {\n                    referenceTab = this.tabGroup.find(referenceTab).prev();\n                } else {\n                    referenceTab = this.tabGroup.find(referenceTab);\n                }\n                var that = this, inserted = that._create(tab), referenceContent = that.element.find('[id=\\'' + referenceTab.attr('aria-controls') + '\\']');\n                each(inserted.tabs, function (idx) {\n                    var contents = inserted.contents[idx];\n                    var fromIndex = inserted.newTabsCreated ? that._contentUrls.length - (inserted.tabs.length - idx) : $(contents).index() - 1;\n                    referenceTab.after(this);\n                    referenceContent.after(contents);\n                    that._moveUrlItem(fromIndex, $(this).index());\n                    that.angular('compile', function () {\n                        return { elements: [contents] };\n                    });\n                });\n                updateFirstLast(that.tabGroup);\n                that._updateContentElements(inserted.newTabsCreated);\n                that.resize(true);\n                return that;\n            },\n            remove: function (elements) {\n                var that = this;\n                var type = typeof elements;\n                var contents;\n                if (type === 'string') {\n                    elements = that.tabGroup.find(elements);\n                } else if (type === 'number') {\n                    elements = that.tabGroup.children().eq(elements);\n                }\n                contents = elements.map(function () {\n                    var idx = $(this).index();\n                    var content = that.contentElement(idx);\n                    kendo.destroy(content);\n                    that._removeUrlItem(idx);\n                    return content;\n                });\n                elements.remove();\n                contents.empty();\n                contents.remove();\n                that._updateContentElements();\n                that.resize(true);\n                return that;\n            },\n            _create: function (tab) {\n                var that = this, tabs, contents, content, newTabsCreated = false;\n                tab = tab instanceof kendo.data.ObservableArray ? tab.toJSON() : tab;\n                if ($.isPlainObject(tab) || $.isArray(tab)) {\n                    tab = $.isArray(tab) ? tab : [tab];\n                    newTabsCreated = true;\n                    tabs = map(tab, function (value, idx) {\n                        that._appendUrlItem(tab[idx].contentUrl || null);\n                        return $(TabStrip.renderItem({\n                            group: that.tabGroup,\n                            item: extend(value, { index: idx })\n                        }));\n                    });\n                    contents = map(tab, function (value, idx) {\n                        if (typeof value.content == 'string' || value.contentUrl) {\n                            return $(TabStrip.renderContent({ item: extend(value, { index: idx }) }));\n                        }\n                    });\n                } else {\n                    if (typeof tab == 'string' && tab[0] != '<') {\n                        tabs = that.element.find(tab);\n                    } else {\n                        tabs = $(tab);\n                    }\n                    contents = $();\n                    tabs.each(function () {\n                        if (/k-tabstrip-items/.test(this.parentNode.className)) {\n                            var element = that.element.find('[id=\\'' + this.getAttribute('aria-controls') + '\\']');\n                            content = element;\n                        } else {\n                            content = $('<div class=\\'' + CONTENT + '\\'/>');\n                        }\n                        contents = contents.add(content);\n                    });\n                    updateTabClasses(tabs);\n                }\n                return {\n                    tabs: tabs,\n                    contents: contents,\n                    newTabsCreated: newTabsCreated\n                };\n            },\n            _toggleDisabled: function (element, enable) {\n                element = this.tabGroup.find(element);\n                element.each(function () {\n                    $(this).toggleClass(DEFAULTSTATE, enable).toggleClass(DISABLEDSTATE, !enable).attr('aria-disabled', !enable);\n                });\n            },\n            _updateClasses: function () {\n                var that = this, tabs, activeItem, activeTab;\n                that.wrapper.addClass('k-widget k-header k-tabstrip');\n                that.tabGroup = that.wrapper.children('ul').addClass('k-tabstrip-items k-reset');\n                if (!that.tabGroup[0]) {\n                    that.tabGroup = $('<ul class=\\'k-tabstrip-items k-reset\\'/>').appendTo(that.wrapper);\n                }\n                tabs = that.tabGroup.find('li').addClass('k-item');\n                if (tabs.length) {\n                    activeItem = tabs.filter('.' + ACTIVESTATE).index();\n                    activeTab = activeItem >= 0 ? activeItem : undefined;\n                    that.tabGroup.contents().filter(function () {\n                        return this.nodeType == 3 && !trim(this.nodeValue);\n                    }).remove();\n                }\n                if (activeItem >= 0) {\n                    tabs.eq(activeItem).addClass(TABONTOP);\n                }\n                that.contentElements = that.wrapper.children('div');\n                that.contentElements.addClass(CONTENT).eq(activeTab).addClass(ACTIVESTATE).css({ display: 'block' });\n                if (tabs.length) {\n                    updateTabClasses(tabs);\n                    updateFirstLast(that.tabGroup);\n                    that._updateContentElements(true);\n                }\n            },\n            _elementId: function (element, idx) {\n                var elementId = element.attr('id');\n                var wrapperId = this.element.attr('id');\n                if (!elementId || elementId.indexOf(wrapperId + '-') > -1) {\n                    var tabStripID = (wrapperId || kendo.guid()) + '-';\n                    return tabStripID + (idx + 1);\n                }\n                return elementId;\n            },\n            _updateContentElements: function (isInitialUpdate) {\n                var that = this, contentUrls = that._contentUrls, items = that.tabGroup.children('.k-item'), contentElements = that.wrapper.children('div'), _elementId = that._elementId.bind(that);\n                if (contentElements.length && items.length > contentElements.length) {\n                    contentElements.each(function (idx) {\n                        var id = _elementId($(this), idx);\n                        var item = items.filter('[aria-controls=' + (this.id || 0) + ']')[0];\n                        if (!item && isInitialUpdate) {\n                            item = items[idx];\n                        }\n                        if (item) {\n                            item.setAttribute('aria-controls', id);\n                        }\n                        this.setAttribute('id', id);\n                    });\n                } else {\n                    items.each(function (idx) {\n                        var currentContent = contentElements.eq(idx);\n                        var id = _elementId(currentContent, idx);\n                        this.setAttribute('aria-controls', id);\n                        if (!currentContent.length && contentUrls[idx]) {\n                            $('<div class=\\'' + CONTENT + '\\'/>').appendTo(that.wrapper).attr('id', id);\n                        } else {\n                            currentContent.attr('id', id);\n                            if (!$(this).children('.k-loading')[0] && !contentUrls[idx]) {\n                                $('<span class=\\'k-loading k-complete\\'/>').prependTo(this);\n                            }\n                        }\n                        currentContent.attr('role', 'tabpanel');\n                        currentContent.filter(':not(.' + ACTIVESTATE + ')').attr('aria-hidden', true).attr('aria-expanded', false);\n                        currentContent.filter('.' + ACTIVESTATE).attr('aria-expanded', true);\n                    });\n                }\n                that.contentElements = that.contentAnimators = that.wrapper.children('div');\n                that.tabsHeight = outerHeight(that.tabGroup) + parseInt(that.wrapper.css('border-top-width'), 10) + parseInt(that.wrapper.css('border-bottom-width'), 10);\n                if (kendo.kineticScrollNeeded && kendo.mobile.ui.Scroller) {\n                    kendo.touchScroller(that.contentElements);\n                    that.contentElements = that.contentElements.children('.km-scroll-container');\n                }\n            },\n            _wrapper: function () {\n                var that = this;\n                if (that.element.is('ul')) {\n                    that.wrapper = that.element.wrapAll('<div />').parent();\n                } else {\n                    that.wrapper = that.element;\n                }\n                that.scrollWrap = that.wrapper.parent('.k-tabstrip-wrapper');\n                if (!that.scrollWrap[0]) {\n                    that.scrollWrap = that.wrapper.wrapAll('<div class=\\'k-tabstrip-wrapper\\' />').parent();\n                }\n            },\n            _tabPosition: function () {\n                var that = this, tabPosition = that.options.tabPosition;\n                that.wrapper.addClass('k-floatwrap k-tabstrip-' + tabPosition);\n                if (tabPosition == 'bottom') {\n                    that.tabGroup.appendTo(that.wrapper);\n                }\n                that.resize(true);\n            },\n            _setContentElementsDimensions: function () {\n                var that = this, tabPosition = that.options.tabPosition;\n                if (tabPosition == 'left' || tabPosition == 'right') {\n                    var contentDivs = that.wrapper.children('.k-content'), activeDiv = contentDivs.filter(':visible'), marginStyleProperty = 'margin-' + tabPosition, tabGroup = that.tabGroup, margin = outerWidth(tabGroup);\n                    var minHeight = Math.ceil(tabGroup.height()) - parseInt(activeDiv.css('padding-top'), 10) - parseInt(activeDiv.css('padding-bottom'), 10) - parseInt(activeDiv.css('border-top-width'), 10) - parseInt(activeDiv.css('border-bottom-width'), 10);\n                    setTimeout(function () {\n                        contentDivs.css(marginStyleProperty, margin).css('min-height', minHeight);\n                    });\n                }\n            },\n            _resize: function () {\n                this._setContentElementsDimensions();\n                this._scrollable();\n            },\n            _sizeScrollWrap: function (element) {\n                if (element.is(':visible')) {\n                    var tabPosition = this.options.tabPosition;\n                    var h = Math.floor(outerHeight(element, true)) + (tabPosition === 'left' || tabPosition === 'right' ? 2 : this.tabsHeight);\n                    this.scrollWrap.css('height', h).css('height');\n                }\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass(HOVERSTATE, e.type == MOUSEENTER);\n            },\n            _click: function (item) {\n                var that = this, link = item.find('.' + LINK), href = link.attr(HREF), collapse = that.options.collapsible, index = item.index(), contentHolder = that.contentHolder(index), prevent, isAnchor, neighbours = item.parent().children(), oldFocusedTab = neighbours.filter('.' + FOCUSEDSTATE);\n                if (item.closest('.k-widget')[0] != that.wrapper[0]) {\n                    return;\n                }\n                if (item.is('.' + DISABLEDSTATE + (!collapse ? ',.' + ACTIVESTATE : ''))) {\n                    oldFocusedTab.removeClass(FOCUSEDSTATE);\n                    that._focused = item;\n                    item.addClass(FOCUSEDSTATE);\n                    that._current(item);\n                    if (that._scrollableModeActive) {\n                        that._scrollTabsToItem(item);\n                    }\n                    return true;\n                }\n                isAnchor = link.data(CONTENTURL) || that._contentUrls[index] || href && (href.charAt(href.length - 1) == '#' || href.indexOf('#' + that.element[0].id + '-') != -1);\n                prevent = !href || isAnchor;\n                if (that.tabGroup.children('[data-animating]').length) {\n                    return prevent;\n                }\n                if (that.trigger(SELECT, {\n                        item: item[0],\n                        contentElement: contentHolder[0]\n                    })) {\n                    return true;\n                }\n                if (prevent === false) {\n                    return;\n                }\n                if (collapse && item.is('.' + ACTIVESTATE)) {\n                    that.deactivateTab(item);\n                    return true;\n                }\n                if (that.activateTab(item)) {\n                    prevent = true;\n                }\n                return prevent;\n            },\n            _scrollable: function () {\n                var that = this, options = that.options, wrapperOffsetWidth, tabGroupScrollWidth, scrollPrevButton, scrollNextButton;\n                if (that._scrollableAllowed()) {\n                    that.wrapper.addClass('k-tabstrip-scrollable');\n                    wrapperOffsetWidth = that.wrapper[0].offsetWidth;\n                    tabGroupScrollWidth = that.tabGroup[0].scrollWidth;\n                    if (tabGroupScrollWidth > wrapperOffsetWidth && !that._scrollableModeActive) {\n                        that._nowScrollingTabs = false;\n                        that._isRtl = kendo.support.isRtl(that.element);\n                        var mouseDown = kendo.support.mobileOS ? 'touchstart' : 'mousedown';\n                        var mouseUp = kendo.support.mobileOS ? 'touchend' : 'mouseup';\n                        that.wrapper.append(scrollButtonHtml('prev', 'k-i-arrow-60-left') + scrollButtonHtml('next', 'k-i-arrow-60-right'));\n                        scrollPrevButton = that._scrollPrevButton = that.wrapper.children('.k-tabstrip-prev');\n                        scrollNextButton = that._scrollNextButton = that.wrapper.children('.k-tabstrip-next');\n                        that.tabGroup.css({\n                            marginLeft: outerWidth(scrollPrevButton) + 9,\n                            marginRight: outerWidth(scrollNextButton) + 12\n                        });\n                        scrollPrevButton.on(mouseDown + NS, function () {\n                            that._nowScrollingTabs = true;\n                            that._scrollTabsByDelta(options.scrollable.distance * (that._isRtl ? 1 : -1));\n                        });\n                        scrollNextButton.on(mouseDown + NS, function () {\n                            that._nowScrollingTabs = true;\n                            that._scrollTabsByDelta(options.scrollable.distance * (that._isRtl ? -1 : 1));\n                        });\n                        scrollPrevButton.add(scrollNextButton).on(mouseUp + NS, function () {\n                            that._nowScrollingTabs = false;\n                        });\n                        that._scrollableModeActive = true;\n                        that._toggleScrollButtons();\n                    } else if (that._scrollableModeActive && tabGroupScrollWidth <= wrapperOffsetWidth) {\n                        that._scrollableModeActive = false;\n                        that.wrapper.removeClass('k-tabstrip-scrollable');\n                        that._scrollPrevButton.off().remove();\n                        that._scrollNextButton.off().remove();\n                        that.tabGroup.css({\n                            marginLeft: '',\n                            marginRight: ''\n                        });\n                    } else if (!that._scrollableModeActive) {\n                        that.wrapper.removeClass('k-tabstrip-scrollable');\n                    } else {\n                        that._toggleScrollButtons();\n                    }\n                }\n            },\n            _scrollableAllowed: function () {\n                var options = this.options;\n                if (options.scrollable && !options.scrollable.distance) {\n                    options.scrollable = { distance: DEFAULTDISTANCE };\n                }\n                return options.scrollable && !isNaN(options.scrollable.distance) && (options.tabPosition == 'top' || options.tabPosition == 'bottom');\n            },\n            _scrollTabsToItem: function (item) {\n                var that = this, tabGroup = that.tabGroup, currentScrollOffset = tabGroup.scrollLeft(), itemWidth = outerWidth(item), itemOffset = that._isRtl ? item.position().left : item.position().left - tabGroup.children().first().position().left, tabGroupWidth = tabGroup[0].offsetWidth, tabGroupPadding = Math.ceil(parseFloat(tabGroup.css('padding-left'))), itemPosition;\n                if (that._isRtl) {\n                    if (itemOffset < 0) {\n                        itemPosition = currentScrollOffset + itemOffset - (tabGroupWidth - currentScrollOffset) - tabGroupPadding;\n                    } else if (itemOffset + itemWidth > tabGroupWidth) {\n                        itemPosition = currentScrollOffset + itemOffset - itemWidth + tabGroupPadding * 2;\n                    }\n                } else {\n                    if (currentScrollOffset + tabGroupWidth < itemOffset + itemWidth) {\n                        itemPosition = itemOffset + itemWidth - tabGroupWidth + tabGroupPadding * 2;\n                    } else if (currentScrollOffset > itemOffset) {\n                        itemPosition = itemOffset - tabGroupPadding;\n                    }\n                }\n                tabGroup.finish().animate({ 'scrollLeft': itemPosition }, 'fast', 'linear', function () {\n                    that._toggleScrollButtons();\n                });\n            },\n            _scrollTabsByDelta: function (delta) {\n                var that = this;\n                var tabGroup = that.tabGroup;\n                var scrLeft = tabGroup.scrollLeft();\n                tabGroup.finish().animate({ 'scrollLeft': scrLeft + delta }, 'fast', 'linear', function () {\n                    if (that._nowScrollingTabs && !jQuery.fx.off) {\n                        that._scrollTabsByDelta(delta);\n                    } else {\n                        that._toggleScrollButtons();\n                    }\n                });\n            },\n            _toggleScrollButtons: function () {\n                var that = this, ul = that.tabGroup, scrollLeft = ul.scrollLeft();\n                that._scrollPrevButton.toggle(that._isRtl ? scrollLeft < ul[0].scrollWidth - ul[0].offsetWidth - 1 : scrollLeft !== 0);\n                that._scrollNextButton.toggle(that._isRtl ? scrollLeft !== 0 : scrollLeft < ul[0].scrollWidth - ul[0].offsetWidth - 1);\n            },\n            deactivateTab: function (item) {\n                var that = this, animationSettings = that.options.animation, animation = animationSettings.open, close = extend({}, animationSettings.close), hasCloseAnimation = close && 'effects' in close;\n                item = that.tabGroup.find(item);\n                close = extend(hasCloseAnimation ? close : extend({ reverse: true }, animation), { hide: true });\n                if (kendo.size(animation.effects)) {\n                    item.kendoAddClass(DEFAULTSTATE, { duration: animation.duration });\n                    item.kendoRemoveClass(ACTIVESTATE, { duration: animation.duration });\n                } else {\n                    item.addClass(DEFAULTSTATE);\n                    item.removeClass(ACTIVESTATE);\n                }\n                item.removeAttr('aria-selected');\n                that.contentAnimators.filter('.' + ACTIVESTATE).kendoStop(true, true).kendoAnimate(close).removeClass(ACTIVESTATE).attr('aria-hidden', true);\n            },\n            activateTab: function (item) {\n                if (this.tabGroup.children('[data-animating]').length) {\n                    return;\n                }\n                item = this.tabGroup.find(item);\n                var that = this, animationSettings = that.options.animation, animation = animationSettings.open, close = extend({}, animationSettings.close), hasCloseAnimation = close && 'effects' in close, neighbours = item.parent().children(), oldTab = neighbours.filter('.' + ACTIVESTATE), itemIndex = neighbours.index(item), isAnimationEnabled = animation && 'duration' in animation && 'effects' in animation;\n                close = extend(hasCloseAnimation ? close : extend({ reverse: true }, animation), { hide: true });\n                if (kendo.size(animation.effects)) {\n                    oldTab.kendoRemoveClass(ACTIVESTATE, { duration: close.duration });\n                    item.kendoRemoveClass(HOVERSTATE, { duration: close.duration });\n                } else {\n                    oldTab.removeClass(ACTIVESTATE);\n                    item.removeClass(HOVERSTATE);\n                }\n                var contentAnimators = that.contentAnimators;\n                if (that.inRequest) {\n                    that.xhr.abort();\n                    that.inRequest = false;\n                }\n                if (contentAnimators.length === 0) {\n                    that.tabGroup.find('.' + TABONTOP).removeClass(TABONTOP);\n                    item.addClass(TABONTOP).css('z-index');\n                    item.addClass(ACTIVESTATE);\n                    that._current(item);\n                    that.trigger('change');\n                    if (that._scrollableModeActive) {\n                        that._scrollTabsToItem(item);\n                    }\n                    return false;\n                }\n                var visibleContents = contentAnimators.filter('.' + ACTIVESTATE), contentHolder = that.contentHolder(itemIndex), contentElement = contentHolder.closest('.k-content');\n                that.tabsHeight = outerHeight(that.tabGroup) + parseInt(that.wrapper.css('border-top-width'), 10) + parseInt(that.wrapper.css('border-bottom-width'), 10);\n                that._sizeScrollWrap(visibleContents);\n                if (contentHolder.length === 0) {\n                    visibleContents.removeClass(ACTIVESTATE).attr('aria-hidden', true).kendoStop(true, true).kendoAnimate(close);\n                    return false;\n                }\n                item.attr('data-animating', true);\n                var isAjaxContent = (item.children('.' + LINK).data(CONTENTURL) || that._contentUrls[itemIndex] || false) && contentHolder.is(EMPTY), showContentElement = function () {\n                        oldTab.removeAttr('aria-selected');\n                        item.attr('aria-selected', true);\n                        that._current(item);\n                        that._sizeScrollWrap(contentElement);\n                        contentElement.addClass(ACTIVESTATE).removeAttr('aria-hidden').kendoStop(true, true).attr('aria-expanded', true).kendoAnimate(extend({\n                            init: function () {\n                                that.trigger(SHOW, {\n                                    item: item[0],\n                                    contentElement: contentHolder[0]\n                                });\n                                kendo.resize(contentHolder);\n                            }\n                        }, animation, {\n                            complete: function () {\n                                item.removeAttr('data-animating');\n                                that.trigger(ACTIVATE, {\n                                    item: item[0],\n                                    contentElement: contentHolder[0]\n                                });\n                                kendo.resize(contentHolder);\n                                that.scrollWrap.css('height', '').css('height');\n                                if (isAnimationEnabled && (kendo.support.browser.msie || kendo.support.browser.edge)) {\n                                    contentHolder.finish().animate({ opacity: 0.9 }, 'fast', 'linear', function () {\n                                        contentHolder.finish().animate({ opacity: 1 }, 'fast', 'linear');\n                                    });\n                                }\n                            }\n                        }));\n                    }, showContent = function () {\n                        if (!isAjaxContent) {\n                            showContentElement();\n                            that.trigger('change');\n                        } else {\n                            item.removeAttr('data-animating');\n                            that.ajaxRequest(item, contentHolder, function () {\n                                item.attr('data-animating', true);\n                                showContentElement();\n                                that.trigger('change');\n                            });\n                        }\n                        if (that._scrollableModeActive) {\n                            that._scrollTabsToItem(item);\n                        }\n                    };\n                visibleContents.removeClass(ACTIVESTATE);\n                that.tabGroup.find('.' + TABONTOP).removeClass(TABONTOP);\n                item.addClass(TABONTOP).css('z-index');\n                if (kendo.size(animation.effects)) {\n                    oldTab.kendoAddClass(DEFAULTSTATE, { duration: animation.duration });\n                    item.kendoAddClass(ACTIVESTATE, { duration: animation.duration });\n                } else {\n                    oldTab.addClass(DEFAULTSTATE);\n                    item.addClass(ACTIVESTATE);\n                }\n                visibleContents.attr('aria-hidden', true);\n                visibleContents.attr('aria-expanded', false);\n                if (visibleContents.length) {\n                    visibleContents.kendoStop(true, true).kendoAnimate(extend({ complete: showContent }, close));\n                } else {\n                    showContent();\n                }\n                return true;\n            },\n            contentElement: function (itemIndex) {\n                if (isNaN(itemIndex - 0)) {\n                    return undefined;\n                }\n                var contentElements = this.contentElements && this.contentElements[0] && !kendo.kineticScrollNeeded ? this.contentElements : this.contentAnimators;\n                var id = $(this.tabGroup.children()[itemIndex]).attr('aria-controls');\n                if (contentElements) {\n                    for (var i = 0, len = contentElements.length; i < len; i++) {\n                        if (contentElements.eq(i).closest('.k-content')[0].id == id) {\n                            return contentElements[i];\n                        }\n                    }\n                }\n                return undefined;\n            },\n            contentHolder: function (itemIndex) {\n                var contentElement = $(this.contentElement(itemIndex)), scrollContainer = contentElement.children('.km-scroll-container');\n                return kendo.support.touch && scrollContainer[0] ? scrollContainer : contentElement;\n            },\n            ajaxRequest: function (element, content, complete, url) {\n                element = this.tabGroup.find(element);\n                var that = this, xhr = $.ajaxSettings.xhr, link = element.find('.' + LINK), data = {}, halfWidth = element.width() / 2, fakeProgress = false, statusIcon = element.find('.k-loading').removeClass('k-complete');\n                if (!statusIcon[0]) {\n                    statusIcon = $('<span class=\\'k-loading\\'/>').prependTo(element);\n                }\n                var endState = halfWidth * 2 - statusIcon.width();\n                var oldProgressAnimation = function () {\n                    statusIcon.animate({ marginLeft: (parseInt(statusIcon.css('marginLeft'), 10) || 0) < halfWidth ? endState : 0 }, 500, oldProgressAnimation);\n                };\n                if (kendo.support.browser.msie && kendo.support.browser.version < 10) {\n                    setTimeout(oldProgressAnimation, 40);\n                }\n                url = url || link.data(CONTENTURL) || that._contentUrls[element.index()] || link.attr(HREF);\n                that.inRequest = true;\n                var ajaxOptions = {\n                    type: 'GET',\n                    cache: false,\n                    url: url,\n                    dataType: 'html',\n                    data: data,\n                    xhr: function () {\n                        var current = this, request = xhr(), event = current.progressUpload ? 'progressUpload' : current.progress ? 'progress' : false;\n                        if (request) {\n                            $.each([\n                                request,\n                                request.upload\n                            ], function () {\n                                if (this.addEventListener) {\n                                    this.addEventListener('progress', function (evt) {\n                                        if (event) {\n                                            current[event](evt);\n                                        }\n                                    }, false);\n                                }\n                            });\n                        }\n                        current.noProgress = !(window.XMLHttpRequest && 'upload' in new XMLHttpRequest());\n                        return request;\n                    },\n                    progress: function (evt) {\n                        if (evt.lengthComputable) {\n                            var percent = parseInt(evt.loaded / evt.total * 100, 10) + '%';\n                            statusIcon.stop(true).addClass('k-progress').css({\n                                'width': percent,\n                                'marginLeft': 0\n                            });\n                        }\n                    },\n                    error: function (xhr, status) {\n                        if (that.trigger('error', {\n                                xhr: xhr,\n                                status: status\n                            })) {\n                            this.complete();\n                        }\n                    },\n                    stopProgress: function () {\n                        clearInterval(fakeProgress);\n                        statusIcon.stop(true).addClass('k-progress')[0].style.cssText = '';\n                    },\n                    complete: function (xhr) {\n                        that.inRequest = false;\n                        if (this.noProgress) {\n                            setTimeout(this.stopProgress, 500);\n                        } else {\n                            this.stopProgress();\n                        }\n                        if (xhr.statusText == 'abort') {\n                            statusIcon.remove();\n                        }\n                    },\n                    success: function (data) {\n                        statusIcon.addClass('k-complete');\n                        try {\n                            var current = this, loaded = 10;\n                            if (current.noProgress) {\n                                statusIcon.width(loaded + '%');\n                                fakeProgress = setInterval(function () {\n                                    current.progress({\n                                        lengthComputable: true,\n                                        loaded: Math.min(loaded, 100),\n                                        total: 100\n                                    });\n                                    loaded += 10;\n                                }, 40);\n                            }\n                            that.angular('cleanup', function () {\n                                return { elements: content.get() };\n                            });\n                            kendo.destroy(content);\n                            content.html(data);\n                        } catch (e) {\n                            var console = window.console;\n                            if (console && console.error) {\n                                console.error(e.name + ': ' + e.message + ' in ' + url);\n                            }\n                            this.error(this.xhr, 'error');\n                        }\n                        if (complete) {\n                            complete.call(that, content);\n                        }\n                        that.angular('compile', function () {\n                            return { elements: content.get() };\n                        });\n                        that.trigger(CONTENTLOAD, {\n                            item: element[0],\n                            contentElement: content[0]\n                        });\n                    }\n                };\n                if (typeof url === 'object') {\n                    ajaxOptions = $.extend(true, {}, ajaxOptions, url);\n                    if (isFunction(ajaxOptions.url)) {\n                        ajaxOptions.url = ajaxOptions.url();\n                    }\n                }\n                that.xhr = $.ajax(ajaxOptions);\n            }\n        });\n        extend(TabStrip, {\n            renderItem: function (options) {\n                options = extend({\n                    tabStrip: {},\n                    group: {}\n                }, options);\n                var empty = templates.empty, item = options.item;\n                return templates.item(extend(options, {\n                    image: item.imageUrl ? templates.image : empty,\n                    sprite: item.spriteCssClass ? templates.sprite : empty,\n                    itemWrapper: templates.itemWrapper\n                }, rendering));\n            },\n            renderContent: function (options) {\n                return templates.content(extend(options, rendering));\n            }\n        });\n        kendo.ui.plugin(TabStrip);\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.timepicker', [\n        'kendo.popup',\n        'kendo.dateinput'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'timepicker',\n        name: 'TimePicker',\n        category: 'web',\n        description: 'The TimePicker widget allows the end user to select a value from a list of predefined values or to type a new value.',\n        depends: ['popup']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, keys = kendo.keys, parse = kendo.parseDate, activeElement = kendo._activeElement, extractFormat = kendo._extractFormat, support = kendo.support, browser = support.browser, ui = kendo.ui, Widget = ui.Widget, OPEN = 'open', CLOSE = 'close', CHANGE = 'change', ns = '.kendoTimePicker', CLICK = 'click' + ns, DEFAULT = 'k-state-default', DISABLED = 'disabled', READONLY = 'readonly', LI = 'li', SPAN = '<span/>', FOCUSED = 'k-state-focused', HOVER = 'k-state-hover', HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, MOUSEDOWN = 'mousedown' + ns, MS_PER_MINUTE = 60000, MS_PER_DAY = 86400000, SELECTED = 'k-state-selected', STATEDISABLED = 'k-state-disabled', ARIA_SELECTED = 'aria-selected', ARIA_EXPANDED = 'aria-expanded', ARIA_HIDDEN = 'aria-hidden', ARIA_DISABLED = 'aria-disabled', ARIA_ACTIVEDESCENDANT = 'aria-activedescendant', ID = 'id', isArray = $.isArray, extend = $.extend, proxy = $.proxy, DATE = Date, TODAY = new DATE();\n        TODAY = new DATE(TODAY.getFullYear(), TODAY.getMonth(), TODAY.getDate(), 0, 0, 0);\n        var TimeView = function (options) {\n            var that = this, id = options.id;\n            that.options = options;\n            that._dates = [];\n            that.ul = $('<ul tabindex=\"-1\" role=\"listbox\" aria-hidden=\"true\" unselectable=\"on\" class=\"k-list k-reset\"/>').css({ overflow: support.kineticScrollNeeded ? '' : 'auto' }).on(CLICK, LI, proxy(that._click, that)).on('mouseenter' + ns, LI, function () {\n                $(this).addClass(HOVER);\n            }).on('mouseleave' + ns, LI, function () {\n                $(this).removeClass(HOVER);\n            });\n            that.list = $('<div class=\\'k-list-container k-list-scroller\\' unselectable=\\'on\\'/>').append(that.ul).on(MOUSEDOWN, preventDefault);\n            if (id) {\n                that._timeViewID = id + '_timeview';\n                that._optionID = id + '_option_selected';\n                that.ul.attr(ID, that._timeViewID);\n            }\n            that._popup();\n            that._heightHandler = proxy(that._height, that);\n            that.template = kendo.template('<li tabindex=\"-1\" role=\"option\" class=\"k-item\" unselectable=\"on\">#=data#</li>', { useWithBlock: false });\n        };\n        TimeView.prototype = {\n            current: function (candidate) {\n                var that = this, active = that.options.active;\n                if (candidate !== undefined) {\n                    if (that._current) {\n                        that._current.removeClass(SELECTED).removeAttr(ARIA_SELECTED).removeAttr(ID);\n                    }\n                    if (candidate) {\n                        candidate = $(candidate).addClass(SELECTED).attr(ID, that._optionID).attr(ARIA_SELECTED, true);\n                        that.scroll(candidate[0]);\n                    }\n                    that._current = candidate;\n                    if (active) {\n                        active(candidate);\n                    }\n                } else {\n                    return that._current;\n                }\n            },\n            close: function () {\n                this.popup.close();\n            },\n            destroy: function () {\n                var that = this;\n                that.ul.off(ns);\n                that.list.off(ns);\n                that.popup.destroy();\n            },\n            open: function () {\n                var that = this;\n                var popupHovered;\n                if (!that.ul[0].firstChild) {\n                    that.bind();\n                }\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                if (that._current) {\n                    that.scroll(that._current[0]);\n                }\n            },\n            dataBind: function (dates) {\n                var that = this, options = that.options, format = options.format, toString = kendo.toString, template = that.template, length = dates.length, idx = 0, date, html = '';\n                for (; idx < length; idx++) {\n                    date = dates[idx];\n                    if (isInRange(date, options.min, options.max)) {\n                        html += template(toString(date, format, options.culture));\n                    }\n                }\n                that._html(html);\n            },\n            refresh: function () {\n                var that = this, options = that.options, format = options.format, offset = dst(), ignoreDST = offset < 0, min = options.min, max = options.max, msMin = getMilliseconds(min), msMax = getMilliseconds(max), msLastTime = getMilliseconds(lastTimeOption(options.interval)), msInterval = options.interval * MS_PER_MINUTE, toString = kendo.toString, template = that.template, start = new DATE(+min), startDate = new DATE(start), msStart, lastIdx, idx = 0, length, html = '';\n                if (ignoreDST) {\n                    length = (MS_PER_DAY + offset * MS_PER_MINUTE) / msInterval;\n                } else {\n                    length = MS_PER_DAY / msInterval;\n                }\n                if (msMin != msMax || msLastTime === msMax) {\n                    if (msMin > msMax) {\n                        msMax += MS_PER_DAY;\n                    }\n                    length = (msMax - msMin) / msInterval + 1;\n                }\n                lastIdx = parseInt(length, 10);\n                for (; idx < length; idx++) {\n                    if (idx) {\n                        setTime(start, msInterval, ignoreDST);\n                    }\n                    if (msMax && lastIdx == idx) {\n                        msStart = getMilliseconds(start);\n                        if (startDate < start) {\n                            msStart += MS_PER_DAY;\n                        }\n                        if (msStart > msMax) {\n                            start = new DATE(+max);\n                        }\n                    }\n                    that._dates.push(getMilliseconds(start));\n                    html += template(toString(start, format, options.culture));\n                }\n                that._html(html);\n            },\n            bind: function () {\n                var that = this, dates = that.options.dates;\n                if (dates && dates[0]) {\n                    that.dataBind(dates);\n                } else {\n                    that.refresh();\n                }\n            },\n            _html: function (html) {\n                var that = this;\n                that.ul[0].innerHTML = html;\n                that.popup.unbind(OPEN, that._heightHandler);\n                that.popup.one(OPEN, that._heightHandler);\n                that.current(null);\n                that.select(that._value);\n            },\n            scroll: function (item) {\n                if (!item) {\n                    return;\n                }\n                var content = this.list[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            select: function (li) {\n                var that = this, options = that.options, current = that._current, selection;\n                if (li instanceof Date) {\n                    li = kendo.toString(li, options.format, options.culture);\n                }\n                if (typeof li === 'string') {\n                    if (!current || current.text() !== li) {\n                        li = $.grep(that.ul[0].childNodes, function (node) {\n                            return (node.textContent || node.innerText) == li;\n                        });\n                        li = li[0] ? li : null;\n                    } else {\n                        li = current;\n                    }\n                }\n                selection = that._distinctSelection(li);\n                that.current(selection);\n            },\n            _distinctSelection: function (selection) {\n                var that = this, currentValue, selectionIndex;\n                if (selection && selection.length > 1) {\n                    currentValue = getMilliseconds(that._value);\n                    selectionIndex = $.inArray(currentValue, that._dates);\n                    selection = that.ul.children()[selectionIndex];\n                }\n                return selection;\n            },\n            setOptions: function (options) {\n                var old = this.options;\n                options.min = parse(options.min);\n                options.max = parse(options.max);\n                this.options = extend(old, options, {\n                    active: old.active,\n                    change: old.change,\n                    close: old.close,\n                    open: old.open\n                });\n                this.bind();\n            },\n            toggle: function () {\n                var that = this;\n                if (that.popup.visible()) {\n                    that.close();\n                } else {\n                    that.open();\n                }\n            },\n            value: function (value) {\n                var that = this;\n                that._value = value;\n                if (that.ul[0].firstChild) {\n                    that.select(value);\n                }\n            },\n            _click: function (e) {\n                var that = this, li = $(e.currentTarget), date = li.text(), dates = that.options.dates;\n                if (dates && dates.length > 0) {\n                    date = dates[li.index()];\n                }\n                if (!e.isDefaultPrevented()) {\n                    that.select(li);\n                    that.options.change(date, true);\n                    that.close();\n                }\n            },\n            _height: function () {\n                var that = this;\n                var list = that.list;\n                var parent = list.parent('.k-animation-container');\n                var height = that.options.height;\n                if (that.ul[0].children.length) {\n                    list.add(parent).show().height(that.ul[0].scrollHeight > height ? height : 'auto').hide();\n                }\n            },\n            _parse: function (value) {\n                var that = this, options = that.options, min = getMilliseconds(options.min) != getMilliseconds(TODAY) ? options.min : null, max = getMilliseconds(options.max) != getMilliseconds(TODAY) ? options.max : null, current = that._value || min || max || TODAY;\n                if (value instanceof DATE) {\n                    return value;\n                }\n                value = parse(value, options.parseFormats, options.culture);\n                if (value) {\n                    value = new DATE(current.getFullYear(), current.getMonth(), current.getDate(), value.getHours(), value.getMinutes(), value.getSeconds(), value.getMilliseconds());\n                }\n                return value;\n            },\n            _adjustListWidth: function () {\n                var list = this.list, width = list[0].style.width, wrapper = this.options.anchor, computedStyle, computedWidth, outerWidth = kendo._outerWidth;\n                if (!list.data('width') && width) {\n                    return;\n                }\n                computedStyle = window.getComputedStyle ? window.getComputedStyle(wrapper[0], null) : 0;\n                computedWidth = computedStyle ? parseFloat(computedStyle.width) : outerWidth(wrapper);\n                if (computedStyle && (browser.mozilla || browser.msie)) {\n                    computedWidth += parseFloat(computedStyle.paddingLeft) + parseFloat(computedStyle.paddingRight) + parseFloat(computedStyle.borderLeftWidth) + parseFloat(computedStyle.borderRightWidth);\n                }\n                width = computedWidth - (outerWidth(list) - list.width());\n                list.css({\n                    fontFamily: wrapper.css('font-family'),\n                    width: width\n                }).data('width', width);\n            },\n            _popup: function () {\n                var that = this, list = that.list, options = that.options, anchor = options.anchor;\n                that.popup = new ui.Popup(list, extend(options.popup, {\n                    anchor: anchor,\n                    open: options.open,\n                    close: options.close,\n                    animation: options.animation,\n                    isRtl: support.isRtl(options.anchor)\n                }));\n            },\n            move: function (e) {\n                var that = this, key = e.keyCode, ul = that.ul[0], current = that._current, down = key === keys.DOWN;\n                if (key === keys.UP || down) {\n                    if (e.altKey) {\n                        that.toggle(down);\n                        return;\n                    } else if (down) {\n                        current = current ? current[0].nextSibling : ul.firstChild;\n                    } else {\n                        current = current ? current[0].previousSibling : ul.lastChild;\n                    }\n                    if (current) {\n                        that.select(current);\n                    }\n                    that.options.change(that._current.text());\n                    e.preventDefault();\n                } else if (key === keys.ENTER || key === keys.TAB || key === keys.ESC) {\n                    e.preventDefault();\n                    if (current) {\n                        that.options.change(current.text(), true);\n                    }\n                    that.close();\n                }\n            }\n        };\n        function setTime(date, time, ignoreDST) {\n            var offset = date.getTimezoneOffset(), offsetDiff;\n            date.setTime(date.getTime() + time);\n            if (!ignoreDST) {\n                offsetDiff = date.getTimezoneOffset() - offset;\n                date.setTime(date.getTime() + offsetDiff * MS_PER_MINUTE);\n            }\n        }\n        function dst() {\n            var today = new DATE(), midnight = new DATE(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0), noon = new DATE(today.getFullYear(), today.getMonth(), today.getDate(), 12, 0, 0);\n            return -1 * (midnight.getTimezoneOffset() - noon.getTimezoneOffset());\n        }\n        function getMilliseconds(date) {\n            return date.getHours() * 60 * MS_PER_MINUTE + date.getMinutes() * MS_PER_MINUTE + date.getSeconds() * 1000 + date.getMilliseconds();\n        }\n        function lastTimeOption(interval) {\n            var date = new Date(2100, 0, 1);\n            date.setMinutes(-interval);\n            return date;\n        }\n        function isInRange(value, min, max) {\n            var msMin = getMilliseconds(min), msMax = getMilliseconds(max), msValue;\n            if (!value || msMin == msMax) {\n                return true;\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        TimeView.getMilliseconds = getMilliseconds;\n        kendo.TimeView = TimeView;\n        var TimePicker = Widget.extend({\n            init: function (element, options) {\n                var that = this, ul, timeView, disabled;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\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.timeView = timeView = new TimeView(extend({}, options, {\n                    id: element.attr(ID),\n                    anchor: that.wrapper,\n                    format: options.format,\n                    change: function (value, trigger) {\n                        if (trigger) {\n                            that._change(value);\n                        } else {\n                            element.val(value);\n                        }\n                    },\n                    open: function (e) {\n                        that.timeView._adjustListWidth();\n                        if (that.trigger(OPEN)) {\n                            e.preventDefault();\n                        } else {\n                            element.attr(ARIA_EXPANDED, true);\n                            ul.attr(ARIA_HIDDEN, false);\n                        }\n                    },\n                    close: function (e) {\n                        if (that.trigger(CLOSE)) {\n                            e.preventDefault();\n                        } else {\n                            element.attr(ARIA_EXPANDED, false);\n                            ul.attr(ARIA_HIDDEN, true);\n                        }\n                    },\n                    active: function (current) {\n                        element.removeAttr(ARIA_ACTIVEDESCENDANT);\n                        if (current) {\n                            element.attr(ARIA_ACTIVEDESCENDANT, timeView._optionID);\n                        }\n                    }\n                }));\n                ul = timeView.ul;\n                that._icon();\n                that._reset();\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': timeView._timeViewID\n                });\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                if (options.dateInput) {\n                    var min = options.min;\n                    var max = options.max;\n                    var today = new DATE();\n                    if (getMilliseconds(min) == getMilliseconds(max)) {\n                        min = new DATE(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0);\n                        max = new DATE(today.getFullYear(), today.getMonth(), today.getDate(), 24, 0, 0);\n                    }\n                    that._dateInput = new ui.DateInput(element, {\n                        culture: options.culture,\n                        format: options.format,\n                        min: min,\n                        max: max,\n                        value: options.value\n                    });\n                }\n                that._old = that._update(options.value || that.element.val());\n                that._oldText = element.val();\n                kendo.notify(that);\n            },\n            options: {\n                name: 'TimePicker',\n                min: TODAY,\n                max: TODAY,\n                format: '',\n                dates: [],\n                parseFormats: [],\n                value: null,\n                interval: 30,\n                height: 200,\n                animation: {},\n                dateInput: false\n            },\n            events: [\n                OPEN,\n                CLOSE,\n                CHANGE\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                normalize(options);\n                that.timeView.setOptions(options);\n                if (value) {\n                    that.element.val(kendo.toString(value, options.format, options.culture));\n                }\n            },\n            dataBind: function (dates) {\n                if (isArray(dates)) {\n                    this.timeView.dataBind(dates);\n                }\n            },\n            _editable: function (options) {\n                var that = this, disable = options.disable, readonly = options.readonly, arrow = that._arrow.off(ns), element = that.element.off(ns), wrapper = that._inputWrapper.off(ns);\n                if (!readonly && !disable) {\n                    wrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n                    element.removeAttr(DISABLED).removeAttr(READONLY).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                    arrow.on(CLICK, 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            },\n            enable: function (enable) {\n                this._editable({\n                    readonly: false,\n                    disable: !(enable = enable === undefined ? true : enable)\n                });\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that.timeView.destroy();\n                that.element.off(ns);\n                that._arrow.off(ns);\n                that._inputWrapper.off(ns);\n                if (that._form) {\n                    that._form.off('reset', that._resetHandler);\n                }\n            },\n            close: function () {\n                this.timeView.close();\n            },\n            open: function () {\n                this.timeView.open();\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            _blur: function () {\n                var that = this, value = that.element.val();\n                that.close();\n                if (value !== that._oldText) {\n                    that._change(value);\n                }\n                that._inputWrapper.removeClass(FOCUSED);\n            },\n            _click: function () {\n                var that = this, element = that.element;\n                that.timeView.toggle();\n                if (!support.touch && element[0] !== activeElement()) {\n                    element.focus();\n                }\n            },\n            _change: function (value) {\n                var that = this;\n                value = that._update(value);\n                if (+that._old != +value) {\n                    that._old = value;\n                    that._oldText = that.element.val();\n                    if (!that._typing) {\n                        that.element.trigger(CHANGE);\n                    }\n                    that.trigger(CHANGE);\n                }\n                that._typing = false;\n            },\n            _icon: function () {\n                var that = this, element = that.element, arrow;\n                arrow = element.next('span.k-select');\n                if (!arrow[0]) {\n                    arrow = $('<span unselectable=\"on\" class=\"k-select\" aria-label=\"select\"><span class=\"k-icon k-i-clock\"></span></span>').insertAfter(element);\n                }\n                that._arrow = arrow.attr({\n                    'role': 'button',\n                    'aria-controls': that.timeView._timeViewID\n                });\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode, timeView = that.timeView, value = that.element.val();\n                if (timeView.popup.visible() || e.altKey) {\n                    timeView.move(e);\n                    if (that._dateInput && e.stopImmediatePropagation) {\n                        e.stopImmediatePropagation();\n                    }\n                } else if (key === keys.ENTER && value !== that._oldText) {\n                    that._change(value);\n                } else {\n                    that._typing = true;\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 = that.timeView._parse(value);\n                if (!value) {\n                    return;\n                }\n                value = new DATE(+value);\n                options[option] = value;\n                that.timeView.options[option] = value;\n                that.timeView.bind();\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter');\n            },\n            _update: function (value) {\n                var that = this, options = that.options, timeView = that.timeView, date = timeView._parse(value);\n                if (!isInRange(date, options.min, options.max)) {\n                    date = null;\n                }\n                that._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                timeView.value(date);\n                return date;\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, wrapper;\n                wrapper = element.parents('.k-timepicker');\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                that.wrapper = wrapper.addClass('k-widget k-timepicker k-header').addClass(element[0].className);\n                element.css({\n                    width: '100%',\n                    height: element[0].style.height\n                });\n                that._inputWrapper = $(wrapper[0].firstChild);\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        that.value(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        });\n        function normalize(options) {\n            var parseFormats = options.parseFormats;\n            options.format = extractFormat(options.format || kendo.getCulture(options.culture).calendars.standard.patterns.t);\n            parseFormats = isArray(parseFormats) ? parseFormats : [parseFormats];\n            parseFormats.splice(0, 0, options.format);\n            options.parseFormats = parseFormats;\n        }\n        function preventDefault(e) {\n            e.preventDefault();\n        }\n        ui.plugin(TimePicker);\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.datetimepicker', [\n        'kendo.datepicker',\n        'kendo.timepicker'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'datetimepicker',\n        name: 'DateTimePicker',\n        category: 'web',\n        description: 'The DateTimePicker allows the end user to select a value from a calendar or a time drop-down list.',\n        depends: [\n            'datepicker',\n            'timepicker'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, TimeView = kendo.TimeView, parse = kendo.parseDate, support = kendo.support, activeElement = kendo._activeElement, extractFormat = kendo._extractFormat, calendar = kendo.calendar, isInRange = calendar.isInRange, restrictValue = calendar.restrictValue, isEqualDatePart = calendar.isEqualDatePart, getMilliseconds = TimeView.getMilliseconds, ui = kendo.ui, Widget = ui.Widget, OPEN = 'open', CLOSE = 'close', CHANGE = 'change', ns = '.kendoDateTimePicker', CLICK = 'click' + ns, UP = support.mouseAndTouchPresent ? kendo.applyEventMap('up', ns.slice(1)) : CLICK, DISABLED = 'disabled', READONLY = 'readonly', DEFAULT = 'k-state-default', FOCUSED = 'k-state-focused', HOVER = 'k-state-hover', STATEDISABLED = 'k-state-disabled', HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, MOUSEDOWN = 'mousedown' + ns, MONTH = 'month', SPAN = '<span/>', ARIA_ACTIVEDESCENDANT = 'aria-activedescendant', ARIA_EXPANDED = 'aria-expanded', ARIA_HIDDEN = 'aria-hidden', ARIA_OWNS = 'aria-owns', ARIA_DISABLED = 'aria-disabled', DATE = Date, MIN = new DATE(1800, 0, 1), MAX = new DATE(2099, 11, 31), dateViewParams = { view: 'date' }, timeViewParams = { view: 'time' }, extend = $.extend;\n        var DateTimePicker = Widget.extend({\n            init: function (element, options) {\n                var that = this, disabled;\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._views();\n                that._icons();\n                that._reset();\n                that._template();\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                });\n                that._midnight = that._calculateMidnight(options.min, options.max);\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            options: {\n                name: 'DateTimePicker',\n                value: null,\n                format: '',\n                timeFormat: '',\n                culture: '',\n                parseFormats: [],\n                dates: [],\n                disableDates: null,\n                min: new DATE(MIN),\n                max: new DATE(MAX),\n                interval: 30,\n                height: 200,\n                footer: '',\n                start: MONTH,\n                depth: MONTH,\n                animation: {},\n                month: {},\n                ARIATemplate: 'Current focused date is #=kendo.toString(data.current, \"d\")#',\n                dateButtonText: 'Open the date view',\n                timeButtonText: 'Open the time view',\n                dateInput: false,\n                weekNumber: false\n            },\n            events: [\n                OPEN,\n                CLOSE,\n                CHANGE\n            ],\n            setOptions: function (options) {\n                var that = this, value = that._value, min, max, currentValue;\n                Widget.fn.setOptions.call(that, options);\n                options = that.options;\n                options.min = min = parse(options.min);\n                options.max = max = parse(options.max);\n                normalize(options);\n                that._midnight = that._calculateMidnight(options.min, options.max);\n                currentValue = options.value || that._value || that.dateView._current;\n                if (min && !isEqualDatePart(min, currentValue)) {\n                    min = new DATE(MIN);\n                }\n                if (max && !isEqualDatePart(max, currentValue)) {\n                    max = new DATE(MAX);\n                }\n                that.dateView.setOptions(options);\n                that.timeView.setOptions(extend({}, options, {\n                    format: options.timeFormat,\n                    min: min,\n                    max: max\n                }));\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, element = that.element.off(ns), dateIcon = that._dateIcon.off(ns), timeIcon = that._timeIcon.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                    element.removeAttr(DISABLED).removeAttr(READONLY).attr(ARIA_DISABLED, false).on('keydown' + ns, $.proxy(that._keydown, that)).on('focus' + ns, function () {\n                        that._inputWrapper.addClass(FOCUSED);\n                    }).on('focusout' + ns, function () {\n                        that._inputWrapper.removeClass(FOCUSED);\n                        if (element.val() !== that._oldText) {\n                            that._change(element.val());\n                        }\n                        that.close('date');\n                        that.close('time');\n                    });\n                    dateIcon.on(MOUSEDOWN, preventDefault).on(UP, function (e) {\n                        that.toggle('date');\n                        that._focusElement(e.type);\n                    });\n                    timeIcon.on(MOUSEDOWN, preventDefault).on(UP, function (e) {\n                        that.toggle('time');\n                        that._focusElement(e.type);\n                    });\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            _focusElement: function (eventType) {\n                var element = this.element;\n                if ((!support.touch || support.mouseAndTouchPresent && !(eventType || '').match(/touch/i)) && element[0] !== activeElement()) {\n                    element.focus();\n                }\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            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that.dateView.destroy();\n                that.timeView.destroy();\n                that.element.off(ns);\n                that._dateIcon.off(ns);\n                that._timeIcon.off(ns);\n                that._inputWrapper.off(ns);\n                if (that._form) {\n                    that._form.off('reset', that._resetHandler);\n                }\n            },\n            close: function (view) {\n                if (view !== 'time') {\n                    view = 'date';\n                }\n                this[view + 'View'].close();\n            },\n            open: function (view) {\n                if (view !== 'time') {\n                    view = 'date';\n                }\n                this[view + 'View'].open();\n            },\n            min: function (value) {\n                return this._option('min', value);\n            },\n            max: function (value) {\n                return this._option('max', value);\n            },\n            toggle: function (view) {\n                var secondView = 'timeView';\n                if (view !== 'time') {\n                    view = 'date';\n                } else {\n                    secondView = 'dateView';\n                }\n                this[view + 'View'].toggle();\n                this[secondView].close();\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            _change: function (value) {\n                var that = this, oldValue = that.element.val(), dateChanged;\n                value = that._update(value);\n                dateChanged = +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            _option: function (option, value) {\n                var that = this;\n                var options = that.options;\n                var timeView = that.timeView;\n                var timeViewOptions = timeView.options;\n                var current = that._value || that._old;\n                var minDateEqual;\n                var maxDateEqual;\n                if (value === undefined) {\n                    return options[option];\n                }\n                value = parse(value, options.parseFormats, options.culture);\n                if (!value) {\n                    return;\n                }\n                if (options.min.getTime() === options.max.getTime()) {\n                    timeViewOptions.dates = [];\n                }\n                options[option] = new DATE(value.getTime());\n                that.dateView[option](value);\n                that._midnight = that._calculateMidnight(options.min, options.max);\n                if (current) {\n                    minDateEqual = isEqualDatePart(options.min, current);\n                    maxDateEqual = isEqualDatePart(options.max, current);\n                }\n                if (minDateEqual || maxDateEqual) {\n                    timeViewOptions[option] = value;\n                    if (minDateEqual && !maxDateEqual) {\n                        timeViewOptions.max = lastTimeOption(options.interval);\n                    }\n                    if (maxDateEqual) {\n                        if (that._midnight) {\n                            timeView.dataBind([MAX]);\n                            return;\n                        } else if (!minDateEqual) {\n                            timeViewOptions.min = MIN;\n                        }\n                    }\n                } else {\n                    timeViewOptions.max = MAX;\n                    timeViewOptions.min = MIN;\n                }\n                timeView.bind();\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter');\n            },\n            _update: function (value) {\n                var that = this, options = that.options, min = options.min, max = options.max, dates = options.dates, timeView = that.timeView, current = that._value, date = parse(value, options.parseFormats, options.culture), isSameType = date === null && current === null || date instanceof Date && current instanceof Date, rebind, timeViewOptions, old, skip, formattedValue;\n                if (options.disableDates && 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                        if (value instanceof String) {\n                            that.element.trigger(CHANGE);\n                        }\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                timeView.value(date);\n                that.dateView.value(date);\n                if (date) {\n                    old = that._old;\n                    timeViewOptions = timeView.options;\n                    if (dates[0]) {\n                        dates = $.grep(dates, function (d) {\n                            return isEqualDatePart(date, d);\n                        });\n                        if (dates[0]) {\n                            timeView.dataBind(dates);\n                            skip = true;\n                        }\n                    }\n                    if (!skip) {\n                        if (isEqualDatePart(date, min)) {\n                            timeViewOptions.min = min;\n                            timeViewOptions.max = lastTimeOption(options.interval);\n                            rebind = true;\n                        }\n                        if (isEqualDatePart(date, max)) {\n                            if (that._midnight) {\n                                timeView.dataBind([MAX]);\n                                skip = true;\n                            } else {\n                                timeViewOptions.max = max;\n                                if (!rebind) {\n                                    timeViewOptions.min = MIN;\n                                }\n                                rebind = true;\n                            }\n                        }\n                    }\n                    if (!skip && (!old && rebind || old && !isEqualDatePart(old, date))) {\n                        if (!rebind) {\n                            timeViewOptions.max = MAX;\n                            timeViewOptions.min = MIN;\n                        }\n                        timeView.bind();\n                    }\n                }\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            _keydown: function (e) {\n                var that = this, dateView = that.dateView, timeView = that.timeView, value = that.element.val(), isDateViewVisible = dateView.popup.visible();\n                var stopPropagation = that._dateInput && e.stopImmediatePropagation;\n                if (e.altKey && e.keyCode === kendo.keys.DOWN) {\n                    that.toggle(isDateViewVisible ? 'time' : 'date');\n                } else if (isDateViewVisible) {\n                    dateView.move(e);\n                    that._updateARIA(dateView._current);\n                } else if (timeView.popup.visible()) {\n                    timeView.move(e);\n                } else if (e.keyCode === kendo.keys.ENTER && value !== that._oldText) {\n                    that._change(value);\n                } else {\n                    that._typing = true;\n                    stopPropagation = false;\n                }\n                if (stopPropagation) {\n                    e.stopImmediatePropagation();\n                }\n            },\n            _views: function () {\n                var that = this, element = that.element, options = that.options, id = element.attr('id'), dateView, timeView, div, ul, msMin, date;\n                that.dateView = dateView = new kendo.DateView(extend({}, options, {\n                    id: id,\n                    anchor: that.wrapper,\n                    change: function () {\n                        var value = dateView.calendar.value(), msValue = +value, msMin = +options.min, msMax = +options.max, current, adjustedDate;\n                        if (msValue === msMin || msValue === msMax) {\n                            current = msValue === msMin ? msMin : msMax;\n                            current = new DATE(that._value || current);\n                            current.setFullYear(value.getFullYear(), value.getMonth(), value.getDate());\n                            if (isInRange(current, msMin, msMax)) {\n                                value = current;\n                            }\n                        }\n                        if (that._value) {\n                            adjustedDate = kendo.date.setHours(new Date(value), that._value);\n                            if (isInRange(adjustedDate, msMin, msMax)) {\n                                value = adjustedDate;\n                            }\n                        }\n                        that._change(value);\n                        that.close('date');\n                    },\n                    close: function (e) {\n                        if (that.trigger(CLOSE, dateViewParams)) {\n                            e.preventDefault();\n                        } else {\n                            element.attr(ARIA_EXPANDED, false);\n                            div.attr(ARIA_HIDDEN, true);\n                            if (!timeView.popup.visible()) {\n                                element.removeAttr(ARIA_OWNS);\n                            }\n                        }\n                    },\n                    open: function (e) {\n                        if (that.trigger(OPEN, dateViewParams)) {\n                            e.preventDefault();\n                        } else {\n                            if (element.val() !== that._oldText) {\n                                date = parse(element.val(), options.parseFormats, options.culture);\n                                that.dateView[date ? 'current' : 'value'](date);\n                            }\n                            div.attr(ARIA_HIDDEN, false);\n                            element.attr(ARIA_EXPANDED, true).attr(ARIA_OWNS, dateView._dateViewID);\n                            that._updateARIA(date);\n                        }\n                    }\n                }));\n                div = dateView.div;\n                msMin = options.min.getTime();\n                that.timeView = timeView = new TimeView({\n                    id: id,\n                    value: options.value,\n                    anchor: that.wrapper,\n                    animation: options.animation,\n                    format: options.timeFormat,\n                    culture: options.culture,\n                    height: options.height,\n                    interval: options.interval,\n                    min: new DATE(MIN),\n                    max: new DATE(MAX),\n                    dates: msMin === options.max.getTime() ? [new Date(msMin)] : [],\n                    parseFormats: options.parseFormats,\n                    change: function (value, trigger) {\n                        value = timeView._parse(value);\n                        if (value < options.min) {\n                            value = new DATE(+options.min);\n                            timeView.options.min = value;\n                        } else if (value > options.max) {\n                            value = new DATE(+options.max);\n                            timeView.options.max = value;\n                        }\n                        if (trigger) {\n                            that._timeSelected = true;\n                            that._change(value);\n                        } else {\n                            element.val(kendo.toString(value, options.format, options.culture));\n                            dateView.value(value);\n                            that._updateARIA(value);\n                        }\n                    },\n                    close: function (e) {\n                        if (that.trigger(CLOSE, timeViewParams)) {\n                            e.preventDefault();\n                        } else {\n                            ul.attr(ARIA_HIDDEN, true);\n                            element.attr(ARIA_EXPANDED, false);\n                            if (!dateView.popup.visible()) {\n                                element.removeAttr(ARIA_OWNS);\n                            }\n                        }\n                    },\n                    open: function (e) {\n                        timeView._adjustListWidth();\n                        if (that.trigger(OPEN, timeViewParams)) {\n                            e.preventDefault();\n                        } else {\n                            if (element.val() !== that._oldText) {\n                                date = parse(element.val(), options.parseFormats, options.culture);\n                                that.timeView.value(date);\n                            }\n                            ul.attr(ARIA_HIDDEN, false);\n                            element.attr(ARIA_EXPANDED, true).attr(ARIA_OWNS, timeView._timeViewID);\n                            timeView.options.active(timeView.current());\n                        }\n                    },\n                    active: function (current) {\n                        element.removeAttr(ARIA_ACTIVEDESCENDANT);\n                        if (current) {\n                            element.attr(ARIA_ACTIVEDESCENDANT, timeView._optionID);\n                        }\n                    }\n                });\n                ul = timeView.ul;\n            },\n            _icons: function () {\n                var that = this;\n                var element = that.element;\n                var options = that.options;\n                var icons;\n                icons = element.next('span.k-select');\n                if (!icons[0]) {\n                    icons = $('<span unselectable=\"on\" class=\"k-select\">' + '<span class=\"k-link k-link-date\" aria-label=\"' + options.dateButtonText + '\"><span unselectable=\"on\" class=\"k-icon k-i-calendar\"></span></span>' + '<span class=\"k-link k-link-time\" aria-label=\"' + options.timeButtonText + '\"><span unselectable=\"on\" class=\"k-icon k-i-clock\"></span></span>' + '</span>').insertAfter(element);\n                }\n                icons = icons.children();\n                icons = icons.children();\n                that._dateIcon = icons.eq(0).attr('aria-controls', that.dateView._dateViewID);\n                that._timeIcon = icons.eq(1).attr('aria-controls', that.timeView._timeViewID);\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, wrapper;\n                wrapper = element.parents('.k-datetimepicker');\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-datetimepicker k-header').addClass(element[0].className);\n                that._inputWrapper = $(wrapper[0].firstChild);\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        that.value(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 = kendo.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            _calculateMidnight: function (min, max) {\n                return getMilliseconds(min) + getMilliseconds(max) === 0;\n            },\n            _updateARIA: function (date) {\n                var cell;\n                var that = this;\n                var calendar = that.dateView.calendar;\n                that.element.removeAttr(ARIA_ACTIVEDESCENDANT);\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        function lastTimeOption(interval) {\n            var date = new Date(2100, 0, 1);\n            date.setMinutes(-interval);\n            return date;\n        }\n        function preventDefault(e) {\n            e.preventDefault();\n        }\n        function normalize(options) {\n            var patterns = kendo.getCulture(options.culture).calendars.standard.patterns, parseFormats = !options.parseFormats.length, timeFormat;\n            options.format = extractFormat(options.format || patterns.g);\n            options.timeFormat = timeFormat = extractFormat(options.timeFormat || patterns.t);\n            kendo.DateView.normalize(options);\n            if (parseFormats) {\n                options.parseFormats.unshift('yyyy-MM-ddTHH:mm:ss');\n            }\n            if ($.inArray(timeFormat, options.parseFormats) === -1) {\n                options.parseFormats.push(timeFormat);\n            }\n        }\n        ui.plugin(DateTimePicker);\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.splitter', ['kendo.resizable'], f);\n}(function () {\n    var __meta__ = {\n        id: 'splitter',\n        name: 'Splitter',\n        category: 'web',\n        description: 'The Splitter widget provides an easy way to create a dynamic layout of resizable and collapsible panes.',\n        depends: ['resizable']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, keys = kendo.keys, extend = $.extend, proxy = $.proxy, Widget = ui.Widget, pxUnitsRegex = /^\\d+(\\.\\d+)?px$/i, percentageUnitsRegex = /^\\d+(\\.\\d+)?%$/i, NS = '.kendoSplitter', EXPAND = 'expand', COLLAPSE = 'collapse', CONTENTLOAD = 'contentLoad', ERROR = 'error', RESIZE = 'resize', LAYOUTCHANGE = 'layoutChange', HORIZONTAL = 'horizontal', VERTICAL = 'vertical', MOUSEENTER = 'mouseenter', CLICK = 'click', PANE = 'pane', MOUSELEAVE = 'mouseleave', FOCUSED = 'k-state-focused', KPANE = 'k-' + PANE, PANECLASS = '.' + KPANE;\n        function isPercentageSize(size) {\n            return percentageUnitsRegex.test(size);\n        }\n        function isPixelSize(size) {\n            return pxUnitsRegex.test(size) || /^\\d+$/.test(size);\n        }\n        function isFluid(size) {\n            return !isPercentageSize(size) && !isPixelSize(size);\n        }\n        function calculateSize(size, total) {\n            var output = parseInt(size, 10);\n            if (isPercentageSize(size)) {\n                output = Math.floor(output * total / 100);\n            }\n            return output;\n        }\n        function panePropertyAccessor(propertyName, triggersResize) {\n            return function (pane, value) {\n                var paneConfig = this.element.find(pane).data(PANE);\n                if (arguments.length == 1) {\n                    return paneConfig[propertyName];\n                }\n                paneConfig[propertyName] = value;\n                if (triggersResize) {\n                    var splitter = this.element.data('kendo' + this.options.name);\n                    splitter.resize(true);\n                }\n            };\n        }\n        var Splitter = Widget.extend({\n            init: function (element, options) {\n                var that = this, isHorizontal;\n                Widget.fn.init.call(that, element, options);\n                that.wrapper = that.element;\n                if (that.options.orientation) {\n                    isHorizontal = that.options.orientation.toLowerCase() != VERTICAL;\n                }\n                that.orientation = isHorizontal ? HORIZONTAL : VERTICAL;\n                that._dimension = isHorizontal ? 'width' : 'height';\n                that._keys = {\n                    decrease: isHorizontal ? keys.LEFT : keys.UP,\n                    increase: isHorizontal ? keys.RIGHT : keys.DOWN\n                };\n                that._resizeStep = 10;\n                that._marker = kendo.guid().substring(0, 8);\n                that._initPanes();\n                that.resizing = new PaneResizing(that);\n                that.element.triggerHandler('init' + NS);\n            },\n            events: [\n                EXPAND,\n                COLLAPSE,\n                CONTENTLOAD,\n                ERROR,\n                RESIZE,\n                LAYOUTCHANGE\n            ],\n            _addOverlays: function () {\n                this._panes().append('<div class=\\'k-splitter-overlay k-overlay\\' />');\n            },\n            _removeOverlays: function () {\n                this._panes().children('.k-splitter-overlay').remove();\n            },\n            _attachEvents: function () {\n                var that = this, orientation = that.options.orientation;\n                that.element.children('.k-splitbar-draggable-' + orientation).on('keydown' + NS, proxy(that._keydown, that)).on('mousedown' + NS, function (e) {\n                    e.currentTarget.focus();\n                }).on('focus' + NS, function (e) {\n                    $(e.currentTarget).addClass(FOCUSED);\n                }).on('blur' + NS, function (e) {\n                    $(e.currentTarget).removeClass(FOCUSED);\n                    if (that.resizing) {\n                        that.resizing.end();\n                    }\n                }).on(MOUSEENTER + NS, function () {\n                    $(this).addClass('k-splitbar-' + that.orientation + '-hover');\n                }).on(MOUSELEAVE + NS, function () {\n                    $(this).removeClass('k-splitbar-' + that.orientation + '-hover');\n                }).on('mousedown' + NS, proxy(that._addOverlays, that)).end().children('.k-splitbar').on('dblclick' + NS, proxy(that._togglePane, that)).children('.k-collapse-next, .k-collapse-prev').on(CLICK + NS, that._arrowClick(COLLAPSE)).end().children('.k-expand-next, .k-expand-prev').on(CLICK + NS, that._arrowClick(EXPAND)).end().end();\n                $(window).on('resize' + NS + that._marker, proxy(that.resize, that, false));\n                $(document).on('mouseup' + NS + that._marker, proxy(that._removeOverlays, that));\n            },\n            _detachEvents: function () {\n                var that = this;\n                that.element.children('.k-splitbar-draggable-' + that.orientation).off(NS).end().children('.k-splitbar').off('dblclick' + NS).children('.k-collapse-next, .k-collapse-prev, .k-expand-next, .k-expand-prev').off(NS);\n                $(window).off(NS + that._marker);\n                $(document).off(NS + that._marker);\n            },\n            options: {\n                name: 'Splitter',\n                orientation: HORIZONTAL,\n                panes: []\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this._detachEvents();\n                if (this.resizing) {\n                    this.resizing.destroy();\n                }\n                kendo.destroy(this.element);\n                this.wrapper = this.element = null;\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode, resizing = that.resizing, target = $(e.currentTarget), navigationKeys = that._keys, increase = key === navigationKeys.increase, decrease = key === navigationKeys.decrease, pane;\n                if (increase || decrease) {\n                    if (e.ctrlKey) {\n                        pane = target[decrease ? 'next' : 'prev']();\n                        if (resizing && resizing.isResizing()) {\n                            resizing.end();\n                        }\n                        if (!pane[that._dimension]()) {\n                            that._triggerAction(EXPAND, pane);\n                        } else {\n                            that._triggerAction(COLLAPSE, target[decrease ? 'prev' : 'next']());\n                        }\n                    } else if (resizing) {\n                        resizing.move((decrease ? -1 : 1) * that._resizeStep, target);\n                    }\n                    e.preventDefault();\n                } else if (key === keys.HOME) {\n                    resizing.move(-resizing._maxPosition, target);\n                    e.preventDefault();\n                } else if (key === keys.END) {\n                    resizing.move(resizing._maxPosition, target);\n                    e.preventDefault();\n                } else if (key === keys.ENTER && resizing) {\n                    resizing.end();\n                    e.preventDefault();\n                }\n            },\n            _initPanes: function () {\n                var panesConfig = this.options.panes || [];\n                var that = this;\n                this.element.addClass('k-widget').addClass('k-splitter').children().each(function (i, pane) {\n                    if (pane.nodeName.toLowerCase() != 'script') {\n                        that._initPane(pane, panesConfig[i]);\n                    }\n                });\n                this.resize();\n            },\n            _initPane: function (pane, config) {\n                pane = $(pane).attr('role', 'group').addClass(KPANE);\n                pane.data(PANE, config ? config : {}).toggleClass('k-scrollable', config ? config.scrollable !== false : true);\n                this.ajaxRequest(pane);\n            },\n            ajaxRequest: function (pane, url, data) {\n                var that = this, paneConfig;\n                pane = that.element.find(pane);\n                paneConfig = pane.data(PANE);\n                url = url || paneConfig.contentUrl;\n                if (url) {\n                    pane.append('<span class=\\'k-icon k-i-loading k-pane-loading\\' />');\n                    if (kendo.isLocalUrl(url)) {\n                        jQuery.ajax({\n                            url: url,\n                            data: data || {},\n                            type: 'GET',\n                            dataType: 'html',\n                            success: function (data) {\n                                that.angular('cleanup', function () {\n                                    return { elements: pane.get() };\n                                });\n                                pane.html(data);\n                                that.angular('compile', function () {\n                                    return { elements: pane.get() };\n                                });\n                                that.trigger(CONTENTLOAD, { pane: pane[0] });\n                            },\n                            error: function (xhr, status) {\n                                that.trigger(ERROR, {\n                                    pane: pane[0],\n                                    status: status,\n                                    xhr: xhr\n                                });\n                            }\n                        });\n                    } else {\n                        pane.removeClass('k-scrollable').html('<iframe src=\\'' + url + '\\' frameborder=\\'0\\' class=\\'k-content-frame\\'>' + 'This page requires frames in order to show content' + '</iframe>');\n                    }\n                }\n            },\n            _triggerAction: function (type, pane) {\n                if (!this.trigger(type, { pane: pane[0] })) {\n                    this[type](pane[0]);\n                }\n            },\n            _togglePane: function (e) {\n                var that = this, target = $(e.target), arrow;\n                if (target.closest('.k-splitter')[0] != that.element[0]) {\n                    return;\n                }\n                arrow = target.children('.k-icon:not(.k-resize-handle)');\n                if (arrow.length !== 1) {\n                    return;\n                }\n                if (arrow.is('.k-collapse-prev')) {\n                    that._triggerAction(COLLAPSE, target.prev());\n                } else if (arrow.is('.k-collapse-next')) {\n                    that._triggerAction(COLLAPSE, target.next());\n                } else if (arrow.is('.k-expand-prev')) {\n                    that._triggerAction(EXPAND, target.prev());\n                } else if (arrow.is('.k-expand-next')) {\n                    that._triggerAction(EXPAND, target.next());\n                }\n            },\n            _arrowClick: function (arrowType) {\n                var that = this;\n                return function (e) {\n                    var target = $(e.target), pane;\n                    if (target.closest('.k-splitter')[0] != that.element[0]) {\n                        return;\n                    }\n                    if (target.is('.k-' + arrowType + '-prev')) {\n                        pane = target.parent().prev();\n                    } else {\n                        pane = target.parent().next();\n                    }\n                    that._triggerAction(arrowType, pane);\n                };\n            },\n            _updateSplitBar: function (splitbar, previousPane, nextPane) {\n                var catIconIf = function (iconType, condition) {\n                        return condition ? '<div class=\\'k-icon ' + iconType + '\\' />' : '';\n                    }, orientation = this.orientation, draggable = previousPane.resizable !== false && nextPane.resizable !== false, prevCollapsible = previousPane.collapsible, prevCollapsed = previousPane.collapsed, nextCollapsible = nextPane.collapsible, nextCollapsed = nextPane.collapsed;\n                splitbar.addClass('k-splitbar k-state-default k-splitbar-' + orientation).attr('role', 'separator').attr('aria-expanded', !(prevCollapsed || nextCollapsed)).removeClass('k-splitbar-' + orientation + '-hover').toggleClass('k-splitbar-draggable-' + orientation, draggable && !prevCollapsed && !nextCollapsed).toggleClass('k-splitbar-static-' + orientation, !draggable && !prevCollapsible && !nextCollapsible).html(catIconIf('k-collapse-prev k-i-arrow-60-up', prevCollapsible && !prevCollapsed && !nextCollapsed && orientation == VERTICAL) + catIconIf('k-collapse-prev k-i-arrow-60-left', prevCollapsible && !prevCollapsed && !nextCollapsed && orientation == HORIZONTAL) + catIconIf('k-expand-prev k-i-arrow-60-down', prevCollapsible && prevCollapsed && !nextCollapsed && orientation == VERTICAL) + catIconIf('k-expand-prev k-i-arrow-60-right', prevCollapsible && prevCollapsed && !nextCollapsed && orientation == HORIZONTAL) + catIconIf('k-resize-handle k-i-hbar', draggable && orientation == VERTICAL) + catIconIf('k-resize-handle k-i-vbar', draggable && orientation == HORIZONTAL) + catIconIf('k-collapse-next k-i-arrow-60-down', nextCollapsible && !nextCollapsed && !prevCollapsed && orientation == VERTICAL) + catIconIf('k-collapse-next k-i-arrow-60-right', nextCollapsible && !nextCollapsed && !prevCollapsed && orientation == HORIZONTAL) + catIconIf('k-expand-next k-i-arrow-60-up', nextCollapsible && nextCollapsed && !prevCollapsed && orientation == VERTICAL) + catIconIf('k-expand-next k-i-arrow-60-left', nextCollapsible && nextCollapsed && !prevCollapsed && orientation == HORIZONTAL));\n                if (!draggable && !prevCollapsible && !nextCollapsible) {\n                    splitbar.removeAttr('tabindex');\n                }\n            },\n            _updateSplitBars: function () {\n                var that = this;\n                this.element.children('.k-splitbar').each(function () {\n                    var splitbar = $(this), previousPane = splitbar.prevAll(PANECLASS).first().data(PANE), nextPane = splitbar.nextAll(PANECLASS).first().data(PANE);\n                    if (!nextPane) {\n                        return;\n                    }\n                    that._updateSplitBar(splitbar, previousPane, nextPane);\n                });\n            },\n            _removeSplitBars: function () {\n                this.element.children('.k-splitbar').remove();\n            },\n            _panes: function () {\n                if (!this.element) {\n                    return $();\n                }\n                return this.element.children(PANECLASS);\n            },\n            _resize: function () {\n                var that = this, element = that.element, panes = element.children(PANECLASS), isHorizontal = that.orientation == HORIZONTAL, splitBars = element.children('.k-splitbar'), splitBarsCount = splitBars.length, sizingProperty = isHorizontal ? 'width' : 'height', totalSize = element[sizingProperty]();\n                that.wrapper.addClass('k-splitter-resizing');\n                if (splitBarsCount === 0) {\n                    splitBarsCount = panes.length - 1;\n                    panes.slice(0, splitBarsCount).after('<div tabindex=\\'0\\' class=\\'k-splitbar\\' data-marker=\\'' + that._marker + '\\' />');\n                    that._updateSplitBars();\n                    splitBars = element.children('.k-splitbar');\n                } else {\n                    that._updateSplitBars();\n                }\n                splitBars.each(function () {\n                    totalSize -= this[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n                });\n                var sizedPanesWidth = 0, sizedPanesCount = 0, freeSizedPanes = $();\n                panes.css({\n                    position: 'absolute',\n                    top: 0\n                })[sizingProperty](function () {\n                    var element = $(this), config = element.data(PANE) || {}, size;\n                    element.removeClass('k-state-collapsed');\n                    if (config.collapsed) {\n                        size = config.collapsedSize ? calculateSize(config.collapsedSize, totalSize) : 0;\n                        element.css('overflow', 'hidden').addClass('k-state-collapsed');\n                    } else if (isFluid(config.size)) {\n                        freeSizedPanes = freeSizedPanes.add(this);\n                        return;\n                    } else {\n                        size = calculateSize(config.size, totalSize);\n                    }\n                    sizedPanesCount++;\n                    sizedPanesWidth += size;\n                    return size;\n                });\n                totalSize -= sizedPanesWidth;\n                var freeSizePanesCount = freeSizedPanes.length, freeSizePaneWidth = Math.floor(totalSize / freeSizePanesCount);\n                freeSizedPanes.slice(0, freeSizePanesCount - 1).css(sizingProperty, freeSizePaneWidth).end().eq(freeSizePanesCount - 1).css(sizingProperty, totalSize - (freeSizePanesCount - 1) * freeSizePaneWidth);\n                var sum = 0, alternateSizingProperty = isHorizontal ? 'height' : 'width', positioningProperty = isHorizontal ? 'left' : 'top', sizingDomProperty = isHorizontal ? 'offsetWidth' : 'offsetHeight';\n                if (freeSizePanesCount === 0) {\n                    var lastNonCollapsedPane = panes.filter(function () {\n                        return !($(this).data(PANE) || {}).collapsed;\n                    }).last();\n                    lastNonCollapsedPane[sizingProperty](totalSize + lastNonCollapsedPane[0][sizingDomProperty]);\n                }\n                element.children().css(alternateSizingProperty, element[alternateSizingProperty]()).each(function (i, child) {\n                    if (child.tagName.toLowerCase() != 'script') {\n                        child.style[positioningProperty] = Math.floor(sum) + 'px';\n                        sum += child[sizingDomProperty];\n                    }\n                });\n                that._detachEvents();\n                that._attachEvents();\n                that.wrapper.removeClass('k-splitter-resizing');\n                kendo.resize(panes);\n                that.trigger(LAYOUTCHANGE);\n            },\n            toggle: function (pane, expand) {\n                var that = this, paneConfig;\n                pane = that.element.find(pane);\n                paneConfig = pane.data(PANE);\n                if (!expand && !paneConfig.collapsible) {\n                    return;\n                }\n                if (arguments.length == 1) {\n                    expand = paneConfig.collapsed === undefined ? false : paneConfig.collapsed;\n                }\n                paneConfig.collapsed = !expand;\n                if (paneConfig.collapsed) {\n                    pane.css('overflow', 'hidden');\n                } else {\n                    pane.css('overflow', '');\n                }\n                that.resize(true);\n            },\n            collapse: function (pane) {\n                this.toggle(pane, false);\n            },\n            expand: function (pane) {\n                this.toggle(pane, true);\n            },\n            _addPane: function (config, idx, paneElement) {\n                var that = this;\n                if (paneElement.length) {\n                    that.options.panes.splice(idx, 0, config);\n                    that._initPane(paneElement, config);\n                    that._removeSplitBars();\n                    that.resize(true);\n                }\n                return paneElement;\n            },\n            append: function (config) {\n                config = config || {};\n                var that = this, paneElement = $('<div />').appendTo(that.element);\n                return that._addPane(config, that.options.panes.length, paneElement);\n            },\n            insertBefore: function (config, referencePane) {\n                referencePane = $(referencePane);\n                config = config || {};\n                var that = this, idx = that.wrapper.children('.k-pane').index(referencePane), paneElement = $('<div />').insertBefore($(referencePane));\n                return that._addPane(config, idx, paneElement);\n            },\n            insertAfter: function (config, referencePane) {\n                referencePane = $(referencePane);\n                config = config || {};\n                var that = this, idx = that.wrapper.children('.k-pane').index(referencePane), paneElement = $('<div />').insertAfter($(referencePane));\n                return that._addPane(config, idx + 1, paneElement);\n            },\n            remove: function (pane) {\n                var that = this;\n                pane = that.wrapper.find(pane);\n                if (pane.length) {\n                    kendo.destroy(pane);\n                    pane.each(function (idx, element) {\n                        that.options.panes.splice(that.wrapper.children('.k-pane').index(element), 1);\n                        $(element).remove();\n                    });\n                    that._removeSplitBars();\n                    if (that.options.panes.length) {\n                        that.resize(true);\n                    }\n                }\n                return that;\n            },\n            size: panePropertyAccessor('size', true),\n            min: panePropertyAccessor('min'),\n            max: panePropertyAccessor('max')\n        });\n        ui.plugin(Splitter);\n        var verticalDefaults = {\n            sizingProperty: 'height',\n            sizingDomProperty: 'offsetHeight',\n            alternateSizingProperty: 'width',\n            positioningProperty: 'top',\n            mousePositioningProperty: 'pageY'\n        };\n        var horizontalDefaults = {\n            sizingProperty: 'width',\n            sizingDomProperty: 'offsetWidth',\n            alternateSizingProperty: 'height',\n            positioningProperty: 'left',\n            mousePositioningProperty: 'pageX'\n        };\n        function PaneResizing(splitter) {\n            var that = this, orientation = splitter.orientation;\n            that.owner = splitter;\n            that._element = splitter.element;\n            that.orientation = orientation;\n            extend(that, orientation === HORIZONTAL ? horizontalDefaults : verticalDefaults);\n            that._resizable = new kendo.ui.Resizable(splitter.element, {\n                orientation: orientation,\n                handle: '.k-splitbar-draggable-' + orientation + '[data-marker=' + splitter._marker + ']',\n                hint: proxy(that._createHint, that),\n                start: proxy(that._start, that),\n                max: proxy(that._max, that),\n                min: proxy(that._min, that),\n                invalidClass: 'k-restricted-size-' + orientation,\n                resizeend: proxy(that._stop, that)\n            });\n        }\n        PaneResizing.prototype = {\n            press: function (target) {\n                this._resizable.press(target);\n            },\n            move: function (delta, target) {\n                if (!this.pressed) {\n                    this.press(target);\n                    this.pressed = true;\n                }\n                if (!this._resizable.target) {\n                    this._resizable.press(target);\n                }\n                this._resizable.move(delta);\n            },\n            end: function () {\n                this._resizable.end();\n                this.pressed = false;\n            },\n            destroy: function () {\n                this._resizable.destroy();\n                this._resizable = this._element = this.owner = null;\n            },\n            isResizing: function () {\n                return this._resizable.resizing;\n            },\n            _createHint: function (handle) {\n                var that = this;\n                return $('<div class=\\'k-ghost-splitbar k-ghost-splitbar-' + that.orientation + ' k-state-default\\' />').css(that.alternateSizingProperty, handle[that.alternateSizingProperty]());\n            },\n            _start: function (e) {\n                var that = this, splitbar = $(e.currentTarget), previousPane = splitbar.prev(), nextPane = splitbar.next(), previousPaneConfig = previousPane.data(PANE), nextPaneConfig = nextPane.data(PANE), prevBoundary = parseInt(previousPane[0].style[that.positioningProperty], 10), nextBoundary = parseInt(nextPane[0].style[that.positioningProperty], 10) + nextPane[0][that.sizingDomProperty] - splitbar[0][that.sizingDomProperty], totalSize = parseInt(that._element.css(that.sizingProperty), 10), toPx = function (value) {\n                        var val = parseInt(value, 10);\n                        return (isPixelSize(value) ? val : totalSize * val / 100) || 0;\n                    }, prevMinSize = toPx(previousPaneConfig.min), prevMaxSize = toPx(previousPaneConfig.max) || nextBoundary - prevBoundary, nextMinSize = toPx(nextPaneConfig.min), nextMaxSize = toPx(nextPaneConfig.max) || nextBoundary - prevBoundary;\n                that.previousPane = previousPane;\n                that.nextPane = nextPane;\n                that._maxPosition = Math.min(nextBoundary - nextMinSize, prevBoundary + prevMaxSize);\n                that._minPosition = Math.max(prevBoundary + prevMinSize, nextBoundary - nextMaxSize);\n            },\n            _max: function () {\n                return this._maxPosition;\n            },\n            _min: function () {\n                return this._minPosition;\n            },\n            _stop: function (e) {\n                var that = this, splitbar = $(e.currentTarget), owner = that.owner;\n                owner._panes().children('.k-splitter-overlay').remove();\n                if (e.keyCode !== kendo.keys.ESC) {\n                    var ghostPosition = e.position, previousPane = splitbar.prev(), nextPane = splitbar.next(), previousPaneConfig = previousPane.data(PANE), nextPaneConfig = nextPane.data(PANE), previousPaneNewSize = ghostPosition - parseInt(previousPane[0].style[that.positioningProperty], 10), nextPaneNewSize = parseInt(nextPane[0].style[that.positioningProperty], 10) + nextPane[0][that.sizingDomProperty] - ghostPosition - splitbar[0][that.sizingDomProperty], fluidPanesCount = that._element.children(PANECLASS).filter(function () {\n                            return isFluid($(this).data(PANE).size);\n                        }).length;\n                    if (!isFluid(previousPaneConfig.size) || fluidPanesCount > 1) {\n                        if (isFluid(previousPaneConfig.size)) {\n                            fluidPanesCount--;\n                        }\n                        previousPaneConfig.size = previousPaneNewSize + 'px';\n                    }\n                    if (!isFluid(nextPaneConfig.size) || fluidPanesCount > 1) {\n                        nextPaneConfig.size = nextPaneNewSize + 'px';\n                    }\n                    owner.resize(true);\n                }\n                return false;\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.dialog', [\n        'kendo.core',\n        'kendo.popup'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'dialog',\n        name: 'Dialog',\n        category: 'web',\n        description: 'The dialog widget is a modal popup that brings information to the user.',\n        depends: [\n            'core',\n            'popup'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, TabKeyTrap = kendo.ui.Popup.TabKeyTrap, proxy = $.proxy, template = kendo.template, keys = kendo.keys, isFunction = $.isFunction, NS = 'kendoWindow', KDIALOG = '.k-dialog', KWINDOW = '.k-window', KICONCLOSE = '.k-dialog-close', KCONTENTCLASS = 'k-content k-window-content k-dialog-content', KCONTENT = '.k-content', KSCROLL = 'k-scroll', KTITLELESS = 'k-dialog-titleless', KDIALOGTITLE = '.k-dialog-title', KDIALOGTITLEBAR = KDIALOGTITLE + 'bar', KBUTTONGROUP = '.k-dialog-buttongroup', KBUTTON = '.k-button', KALERT = 'k-alert', KCONFIRM = 'k-confirm', KPROMPT = 'k-prompt', KTEXTBOX = '.k-textbox', KOVERLAY = '.k-overlay', VISIBLE = ':visible', ZINDEX = 'zIndex', BODY = 'body', INITOPEN = 'initOpen', OPEN = 'open', CLOSE = 'close', SHOW = 'show', HIDE = 'hide', WIDTH = 'width', HUNDREDPERCENT = 100, messages = {\n                okText: 'OK',\n                cancel: 'Cancel',\n                promptInput: 'Input'\n            }, ceil = Math.ceil, templates, overlaySelector = ':not(link,meta,script,style)';\n        function defined(x) {\n            return typeof x != 'undefined';\n        }\n        function constrain(value, low, high) {\n            return Math.max(Math.min(parseInt(value, 10), high === Infinity ? high : parseInt(high, 10)), parseInt(low, 10));\n        }\n        function buttonKeyTrigger(e) {\n            return e.keyCode == keys.ENTER || e.keyCode == keys.SPACEBAR;\n        }\n        var DialogBase = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that._init(that.element, that.options);\n                kendo.notify(that);\n            },\n            _init: function (element, options) {\n                var that = this, wrapper;\n                that._centerCallback = proxy(that._center, that);\n                that.appendTo = $(BODY);\n                if (!defined(options.visible) || options.visible === null) {\n                    options.visible = element.is(VISIBLE);\n                }\n                if (that.wrapperTemplate === undefined) {\n                    that.wrapperTemplate = templates.wrapper;\n                }\n                that._createDialog();\n                wrapper = that.wrapper = element.closest(KDIALOG);\n                if (options._defaultFocus === undefined) {\n                    that._defaultFocus = element[0];\n                }\n                that._tabindex(element);\n                that._dimensions();\n                this._tabKeyTrap = new TabKeyTrap(wrapper);\n                if (!that.options.visible) {\n                    that.wrapper.hide();\n                } else {\n                    that._triggerOpen();\n                }\n            },\n            setOptions: function (options) {\n                var that = this;\n                options = $.extend(that.options, options);\n                Widget.fn.setOptions.call(that, options);\n                if (options.title !== undefined) {\n                    that.title(options.title);\n                }\n                if (options.content) {\n                    kendo.destroy(that.element.children());\n                    that.element.html(options.content);\n                }\n                if (options.actions) {\n                    that.wrapper.children(KBUTTONGROUP).remove();\n                    that._createActionbar(that.wrapper);\n                }\n                that.wrapper.show();\n                that._closable(that.wrapper);\n                that._dimensions();\n                if (!options.visible) {\n                    that.wrapper.hide();\n                } else {\n                    that._triggerOpen();\n                }\n            },\n            _dimensions: function () {\n                var that = this, wrapper = that.wrapper, options = that.options, width = options.width, height = options.height, dimensions = [\n                        'minWidth',\n                        'minHeight',\n                        'maxWidth',\n                        'maxHeight'\n                    ];\n                for (var i = 0; i < dimensions.length; i++) {\n                    var value = options[dimensions[i]];\n                    if (value && value != Infinity) {\n                        wrapper.css(dimensions[i], value);\n                    }\n                }\n                this._setElementMaxHeight();\n                if (width) {\n                    if (width.toString().indexOf('%') > 0) {\n                        wrapper.width(width);\n                    } else {\n                        wrapper.outerWidth(constrain(width, options.minWidth, options.maxWidth));\n                    }\n                }\n                if (height) {\n                    if (height.toString().indexOf('%') > 0) {\n                        wrapper.height(height);\n                    } else {\n                        wrapper.outerHeight(constrain(height, options.minHeight, options.maxHeight));\n                    }\n                    this._setElementHeight();\n                }\n            },\n            _setElementMaxHeight: function () {\n                var that = this, element = that.element, maxHeight = that.options.maxHeight, paddingBox, elementMaxHeight;\n                if (maxHeight != Infinity) {\n                    paddingBox = that._paddingBox(element);\n                    elementMaxHeight = parseFloat(maxHeight, 10) - that._uiHeight() - paddingBox.vertical;\n                    if (elementMaxHeight > 0) {\n                        element.css({ maxHeight: ceil(elementMaxHeight) + 'px' });\n                    }\n                }\n            },\n            _paddingBox: function (element) {\n                var paddingTop = parseFloat(element.css('padding-top'), 10), paddingLeft = parseFloat(element.css('padding-left'), 10), paddingBottom = parseFloat(element.css('padding-bottom'), 10), paddingRight = parseFloat(element.css('padding-right'), 10);\n                return {\n                    vertical: paddingTop + paddingBottom,\n                    horizontal: paddingLeft + paddingRight\n                };\n            },\n            _setElementHeight: function () {\n                var that = this, element = that.element, height = that.options.height, paddingBox = that._paddingBox(element), elementHeight = parseFloat(height, 10) - that._uiHeight() - paddingBox.vertical;\n                if (elementHeight < 0) {\n                    elementHeight = 0;\n                }\n                element.css({ height: ceil(elementHeight) + 'px' });\n                this._applyScrollClassName(element);\n            },\n            _applyScrollClassName: function (element) {\n                var hasScroll = element.get(0).scrollHeight > element.outerHeight();\n                if (hasScroll) {\n                    element.addClass(KSCROLL);\n                } else {\n                    element.removeClass(KSCROLL);\n                }\n            },\n            _uiHeight: function () {\n                var that = this, wrapper = that.wrapper, actionbar = wrapper.children(KBUTTONGROUP), actionbarHeight = actionbar[0] && actionbar[0].offsetHeight || 0, titlebar = wrapper.children(KDIALOGTITLEBAR), titlebarHeight = titlebar[0] && titlebar[0].offsetHeight || 0;\n                return actionbarHeight + titlebarHeight;\n            },\n            _overlay: function (visible) {\n                var overlay = this.appendTo.children(KOVERLAY), wrapper = this.wrapper;\n                if (!overlay.length) {\n                    overlay = $(templates.overlay);\n                }\n                overlay.insertBefore(wrapper[0]).toggle(visible).css(ZINDEX, parseInt(wrapper.css(ZINDEX), 10) - 1);\n                if (visible) {\n                    this._waiAriaOverlay();\n                } else {\n                    this._removeWaiAriaOverlay();\n                }\n                return overlay;\n            },\n            _waiAriaOverlay: function () {\n                var node = this.wrapper;\n                this._overlayedNodes = node.prevAll(overlaySelector).add(node.nextAll(overlaySelector)).each(function () {\n                    var jthis = $(this);\n                    jthis.data('ariaHidden', jthis.attr('aria-hidden'));\n                    jthis.attr('aria-hidden', 'true');\n                });\n            },\n            _removeWaiAriaOverlay: function () {\n                return this._overlayedNodes && this._overlayedNodes.each(function () {\n                    var node = $(this);\n                    var hiddenValue = node.data('ariaHidden');\n                    if (hiddenValue) {\n                        node.attr('aria-hidden', hiddenValue);\n                    } else {\n                        node.removeAttr('aria-hidden');\n                    }\n                });\n            },\n            _closeClick: function (e) {\n                e.preventDefault();\n                this.close();\n            },\n            _closeKeyHandler: function (e) {\n                if (buttonKeyTrigger(e) || e.keyCode == keys.ESC) {\n                    this.close();\n                }\n            },\n            _keydown: function (e) {\n                var that = this, options = that.options, keyCode = e.keyCode;\n                if (keyCode == keys.ESC && !that._closing && options.closable) {\n                    that.close();\n                }\n            },\n            _createDialog: function () {\n                var that = this, content = that.element, options = that.options, isRtl = kendo.support.isRtl(content), titlebar = $(templates.titlebar(options)), titleId = (content.id || kendo.guid()) + '_title', wrapper = $(that.wrapperTemplate(options));\n                wrapper.toggleClass('k-rtl', isRtl);\n                content.addClass(KCONTENTCLASS);\n                that.appendTo.append(wrapper);\n                if (options.title !== false) {\n                    wrapper.append(titlebar);\n                    titlebar.attr('id', titleId);\n                    wrapper.attr('aria-labelledby', titleId);\n                } else {\n                    wrapper.addClass(KTITLELESS);\n                }\n                that._closable(wrapper);\n                wrapper.append(content);\n                if (options.content) {\n                    kendo.destroy(content.children());\n                    content.html(options.content);\n                }\n                if (options.actions.length) {\n                    that._createActionbar(wrapper);\n                }\n            },\n            _closable: function (wrapper) {\n                var that = this;\n                var options = that.options;\n                var titlebar = wrapper.children(KDIALOGTITLEBAR);\n                var titlebarActions = titlebar.find('.k-window-actions');\n                var closeAction = titlebarActions.length ? titlebarActions.find('.k-dialog-close') : wrapper.find('.k-dialog-close');\n                closeAction.remove();\n                if (options.closable !== false) {\n                    if (options.title !== false && titlebarActions.length) {\n                        titlebarActions.append(templates.close(options));\n                    } else {\n                        wrapper.prepend(templates.close(options));\n                    }\n                    wrapper.autoApplyNS(NS);\n                    that.element.autoApplyNS(NS);\n                    wrapper.find(KICONCLOSE).on('click', proxy(that._closeClick, that)).on('keydown', proxy(that._closeKeyHandler, that));\n                    that.element.on('keydown', proxy(that._keydown, that));\n                }\n            },\n            _createActionbar: function (wrapper) {\n                var isStretchedLayout = this.options.buttonLayout === 'stretched';\n                var buttonLayout = isStretchedLayout ? 'stretched' : 'normal';\n                var actionbar = $(templates.actionbar({ buttonLayout: buttonLayout }));\n                this._addButtons(actionbar);\n                if (isStretchedLayout) {\n                    this._normalizeButtonSize(actionbar);\n                }\n                wrapper.append(actionbar);\n            },\n            _addButtons: function (actionbar) {\n                var that = this, o = that.options, actionClick = proxy(that._actionClick, that), actionKeyHandler = proxy(that._actionKeyHandler, that), actions = that.options.actions, length = actions.length, buttonSize = Math.round(HUNDREDPERCENT / length), action, text;\n                for (var i = 0; i < length; i++) {\n                    action = actions[i];\n                    text = that._mergeTextWithOptions(action);\n                    var btn = $(templates.action(action)).autoApplyNS(NS).html(text).appendTo(actionbar).data('action', action.action).on('click', actionClick).on('keydown', actionKeyHandler);\n                    if (o.buttonLayout === 'stretched') {\n                        if (i == length - 1) {\n                            buttonSize = HUNDREDPERCENT - i * buttonSize;\n                        }\n                        btn.css(WIDTH, buttonSize + '%');\n                    }\n                }\n            },\n            _mergeTextWithOptions: function (action) {\n                var text = action.text;\n                return text ? template(text)(this.options) : '';\n            },\n            _normalizeButtonSize: function (actionbar) {\n                var that = this, options = that.options, lastButton = actionbar.children(KBUTTON + ':last'), currentSize = parseFloat(lastButton[0] ? lastButton[0].style[WIDTH] : 0), difference = HUNDREDPERCENT - options.actions.length * currentSize;\n                if (difference > 0) {\n                    lastButton.css(WIDTH, currentSize + difference + '%');\n                }\n            },\n            _tabindex: function (target) {\n                var that = this;\n                var wrapper = that.wrapper;\n                var closeBtn = wrapper.find(KICONCLOSE);\n                var actionButtons = wrapper.find(KBUTTONGROUP + ' ' + KBUTTON);\n                Widget.fn._tabindex.call(this, target);\n                var tabIndex = target.attr('tabindex');\n                closeBtn.attr('tabIndex', tabIndex);\n                actionButtons.attr('tabIndex', tabIndex);\n            },\n            _actionClick: function (e) {\n                if (this.wrapper.is(VISIBLE)) {\n                    this._runActionBtn(e.currentTarget);\n                }\n            },\n            _actionKeyHandler: function (e) {\n                if (buttonKeyTrigger(e)) {\n                    this._runActionBtn(e.currentTarget);\n                } else if (e.keyCode == keys.ESC) {\n                    this.close();\n                }\n            },\n            _runActionBtn: function (target) {\n                var that = this;\n                if (that._closing) {\n                    return;\n                }\n                var action = $(target).data('action'), preventClose = isFunction(action) && action({ sender: that }) === false;\n                if (!preventClose) {\n                    that.close();\n                }\n            },\n            _triggerOpen: function () {\n                var that = this;\n                var options = that.options;\n                var wrapper = that.wrapper;\n                that.toFront();\n                that._triggerInitOpen();\n                that.trigger(OPEN);\n                if (options.modal) {\n                    that._overlay(wrapper.is(VISIBLE)).css({ opacity: 0.5 });\n                    that._focusDialog();\n                }\n            },\n            open: function () {\n                var that = this, wrapper = that.wrapper, showOptions = this._animationOptions(OPEN), options = that.options, overlay, otherModalsVisible;\n                this._triggerInitOpen();\n                if (!that.trigger(OPEN)) {\n                    if (that._closing) {\n                        wrapper.kendoStop(true, true);\n                    }\n                    that._closing = false;\n                    that.toFront();\n                    options.visible = true;\n                    if (options.modal) {\n                        otherModalsVisible = !!that._modals().length;\n                        overlay = that._overlay(otherModalsVisible);\n                        overlay.kendoStop(true, true);\n                        if (showOptions.duration && kendo.effects.Fade && !otherModalsVisible) {\n                            var overlayFx = kendo.fx(overlay).fadeIn();\n                            overlayFx.duration(showOptions.duration || 0);\n                            overlayFx.endValue(0.5);\n                            overlayFx.play();\n                        } else {\n                            overlay.css('opacity', 0.5);\n                        }\n                        overlay.show();\n                    }\n                    wrapper.show().kendoStop().kendoAnimate({\n                        effects: showOptions.effects,\n                        duration: showOptions.duration,\n                        complete: proxy(that._openAnimationEnd, that)\n                    });\n                    wrapper.show();\n                }\n                return that;\n            },\n            _animationOptions: function (id) {\n                var animation = this.options.animation;\n                var basicAnimation = {\n                    open: { effects: {} },\n                    close: {\n                        hide: true,\n                        effects: {}\n                    }\n                };\n                return animation && animation[id] || basicAnimation[id];\n            },\n            _openAnimationEnd: function () {\n                if (this.options.modal) {\n                    this._focusDialog();\n                }\n                this.trigger(SHOW);\n            },\n            _triggerInitOpen: function () {\n                if (!defined(this._initOpenTriggered)) {\n                    this._initOpenTriggered = true;\n                    this.trigger(INITOPEN);\n                }\n            },\n            toFront: function () {\n                var that = this, wrapper = that.wrapper, zIndex = +wrapper.css(ZINDEX), originalZIndex = zIndex;\n                that.center();\n                $(KWINDOW).each(function (i, element) {\n                    var windowObject = $(element), zIndexNew = windowObject.css(ZINDEX);\n                    if (!isNaN(zIndexNew)) {\n                        zIndex = Math.max(+zIndexNew, zIndex);\n                    }\n                });\n                if (!wrapper[0].style.zIndex || originalZIndex < zIndex) {\n                    wrapper.css(ZINDEX, zIndex + 2);\n                }\n                that.element.find('> .k-overlay').remove();\n                wrapper = null;\n                return that;\n            },\n            close: function () {\n                this._close(true);\n                this._stopCenterOnResize();\n                return this;\n            },\n            _close: function (systemTriggered) {\n                var that = this, wrapper = that.wrapper, options = that.options, showOptions = this._animationOptions('open'), hideOptions = this._animationOptions('close');\n                if (wrapper.is(VISIBLE) && !that.trigger(CLOSE, { userTriggered: !systemTriggered })) {\n                    if (that._closing) {\n                        return;\n                    }\n                    that._closing = true;\n                    options.visible = false;\n                    this._removeOverlay();\n                    wrapper.kendoStop().kendoAnimate({\n                        effects: hideOptions.effects || showOptions.effects,\n                        reverse: hideOptions.reverse === true,\n                        duration: hideOptions.duration,\n                        complete: proxy(this._closeAnimationEnd, this)\n                    });\n                }\n                return that;\n            },\n            center: function () {\n                this._center();\n                this._centerOnResize();\n            },\n            _center: function () {\n                var that = this, wrapper = that.wrapper, documentWindow = $(window), scrollTop = 0, scrollLeft = 0, newLeft = scrollLeft + Math.max(0, (documentWindow.width() - wrapper.width()) / 2), newTop = scrollTop + Math.max(0, (documentWindow.height() - wrapper.height() - parseInt(wrapper.css('paddingTop'), 10)) / 2);\n                wrapper.css({\n                    left: newLeft,\n                    top: newTop\n                });\n                return that;\n            },\n            _centerOnResize: function () {\n                if (this._trackResize) {\n                    return;\n                }\n                kendo.onResize(this._centerCallback);\n                this._trackResize = true;\n            },\n            _stopCenterOnResize: function () {\n                kendo.unbindResize(this._centerCallback);\n                this._trackResize = false;\n            },\n            _removeOverlay: function () {\n                var modals = this._modals();\n                var options = this.options;\n                var hideOverlay = options.modal && !modals.length;\n                if (hideOverlay) {\n                    this._overlay(false).remove();\n                } else if (modals.length) {\n                    this._object(modals.last())._overlay(true);\n                }\n            },\n            _closeAnimationEnd: function () {\n                var that = this;\n                that._closing = false;\n                that.wrapper.hide().css('opacity', '');\n                that.trigger(HIDE);\n                if (that.options.modal) {\n                    var lastModal = that._object(that._modals().last());\n                    if (lastModal) {\n                        lastModal.toFront();\n                    }\n                }\n            },\n            _modals: function () {\n                var that = this;\n                var zStack = $(KWINDOW).filter(function () {\n                    var dom = $(this);\n                    var object = that._object(dom);\n                    var options = object && object.options;\n                    return options && options.modal && that.options.appendTo == options.appendTo && options.visible && dom.is(VISIBLE);\n                }).sort(function (a, b) {\n                    return +$(a).css('zIndex') - +$(b).css('zIndex');\n                });\n                that = null;\n                return zStack;\n            },\n            _object: function (element) {\n                var content = element.children(KCONTENT);\n                var widget = kendo.widgetInstance(content);\n                if (widget) {\n                    return widget;\n                }\n                return undefined;\n            },\n            destroy: function () {\n                var that = this;\n                that._destroy();\n                Widget.fn.destroy.call(that);\n                that.wrapper.remove();\n                that.wrapper = that.element = $();\n            },\n            _destroy: function () {\n                var that = this;\n                var ns = '.' + NS;\n                that.wrapper.off(ns);\n                that.element.off(ns);\n                that.wrapper.find(KICONCLOSE + ',' + KBUTTONGROUP + ' > ' + KBUTTON).off(ns);\n                that._stopCenterOnResize();\n            },\n            title: function (html) {\n                var that = this, wrapper = that.wrapper, options = that.options, titlebar = wrapper.children(KDIALOGTITLEBAR), title = titlebar.children(KDIALOGTITLE), encodedHtml = kendo.htmlEncode(html);\n                if (!arguments.length) {\n                    return title.html();\n                }\n                if (html === false) {\n                    titlebar.remove();\n                    wrapper.addClass(KTITLELESS);\n                } else {\n                    if (!titlebar.length) {\n                        titlebar = $(templates.titlebar(options)).prependTo(wrapper);\n                        title = titlebar.children(KDIALOGTITLE);\n                        wrapper.removeClass(KTITLELESS);\n                    }\n                    title.html(encodedHtml);\n                }\n                that.options.title = encodedHtml;\n                return that;\n            },\n            content: function (html, data) {\n                var that = this, content = that.wrapper.children(KCONTENT);\n                if (!defined(html)) {\n                    return content.html();\n                }\n                this.angular('cleanup', function () {\n                    return { elements: content.children() };\n                });\n                kendo.destroy(content.children());\n                content.html(html);\n                this.angular('compile', function () {\n                    var a = [];\n                    for (var i = content.length; --i >= 0;) {\n                        a.push({ dataItem: data });\n                    }\n                    return {\n                        elements: content.children(),\n                        data: a\n                    };\n                });\n                that.options.content = html;\n                return that;\n            },\n            _focusDialog: function () {\n                if (this._defaultFocus) {\n                    this._focus(this._defaultFocus);\n                }\n                this._tabKeyTrap.trap();\n            },\n            _focus: function (node) {\n                if (node) {\n                    node.focus();\n                }\n            },\n            events: [\n                INITOPEN,\n                OPEN,\n                CLOSE,\n                SHOW,\n                HIDE\n            ],\n            options: {\n                title: '',\n                buttonLayout: 'stretched',\n                actions: [],\n                modal: true,\n                width: null,\n                height: null,\n                minWidth: 0,\n                minHeight: 0,\n                maxWidth: Infinity,\n                maxHeight: Infinity,\n                content: null,\n                visible: null,\n                appendTo: BODY,\n                closable: true\n            }\n        });\n        var Dialog = DialogBase.extend({\n            options: {\n                name: 'Dialog',\n                messages: { close: 'Close' }\n            }\n        });\n        kendo.ui.plugin(Dialog);\n        var PopupBox = DialogBase.extend({\n            _init: function (element, options) {\n                var that = this;\n                that.wrapperTemplate = templates.alertWrapper;\n                options._defaultFocus = null;\n                that._ensureContentId(element);\n                DialogBase.fn._init.call(that, element, options);\n                that.bind(HIDE, proxy(that.destroy, that));\n                that._ariaDescribedBy();\n                that._initFocus();\n            },\n            _ensureContentId: function (element) {\n                var node = $(element);\n                if (!node.attr('id')) {\n                    node.attr('id', kendo.guid() + '_k-popup');\n                }\n            },\n            _ariaDescribedBy: function () {\n                this.wrapper.attr('aria-describedby', this.element.attr('id'));\n            },\n            _initFocus: function () {\n                var o = this.options;\n                this._defaultFocus = this._chooseEntryFocus();\n                if (this._defaultFocus && o.visible && o.modal) {\n                    this._focusDialog();\n                }\n            },\n            _chooseEntryFocus: function () {\n                return this.wrapper.find(KBUTTONGROUP + ' > ' + KBUTTON)[0];\n            },\n            options: {\n                title: window.location.host,\n                closable: false,\n                messages: messages\n            }\n        });\n        var Alert = PopupBox.extend({\n            _init: function (element, options) {\n                var that = this;\n                PopupBox.fn._init.call(that, element, options);\n                that.wrapper.addClass(KALERT);\n            },\n            options: {\n                name: 'Alert',\n                modal: true,\n                actions: [{ text: '#: messages.okText #' }]\n            }\n        });\n        kendo.ui.plugin(Alert);\n        var kendoAlert = function (text) {\n            return $(templates.alert).kendoAlert({ content: text }).data('kendoAlert').open();\n        };\n        var Confirm = PopupBox.extend({\n            _init: function (element, options) {\n                var that = this;\n                PopupBox.fn._init.call(that, element, options);\n                that.wrapper.addClass(KCONFIRM);\n                that.result = $.Deferred();\n            },\n            options: {\n                name: 'Confirm',\n                modal: true,\n                actions: [\n                    {\n                        text: '#: messages.okText #',\n                        primary: true,\n                        action: function (e) {\n                            e.sender.result.resolve();\n                        }\n                    },\n                    {\n                        text: '#: messages.cancel #',\n                        action: function (e) {\n                            e.sender.result.reject();\n                        }\n                    }\n                ]\n            }\n        });\n        kendo.ui.plugin(Confirm);\n        var kendoConfirm = function (text) {\n            var confirmDialog = $(templates.confirm).kendoConfirm({ content: text }).data('kendoConfirm').open();\n            return confirmDialog.result;\n        };\n        var Prompt = PopupBox.extend({\n            _init: function (element, options) {\n                var that = this;\n                PopupBox.fn._init.call(that, element, options);\n                that.wrapper.addClass(KPROMPT);\n                that._createPrompt();\n                that.result = $.Deferred();\n            },\n            _createPrompt: function () {\n                var value = this.options.value, promptContainer = $(templates.promptInputContainer(this.options)).insertAfter(this.element);\n                if (value) {\n                    promptContainer.children(KTEXTBOX).val(value);\n                }\n                this._defaultFocus = this._chooseEntryFocus();\n                this._focusDialog();\n            },\n            _chooseEntryFocus: function () {\n                return this.wrapper.find(KTEXTBOX)[0];\n            },\n            options: {\n                name: 'Prompt',\n                modal: true,\n                value: '',\n                actions: [\n                    {\n                        text: '#: messages.okText #',\n                        primary: true,\n                        action: function (e) {\n                            var sender = e.sender, value = sender.wrapper.find(KTEXTBOX).val();\n                            sender.result.resolve(value);\n                        }\n                    },\n                    {\n                        text: '#: messages.cancel #',\n                        action: function (e) {\n                            var sender = e.sender, value = sender.wrapper.find(KTEXTBOX).val();\n                            e.sender.result.reject(value);\n                        }\n                    }\n                ]\n            }\n        });\n        kendo.ui.plugin(Prompt);\n        var kendoPrompt = function (text, value) {\n            var promptDialog = $(templates.prompt).kendoPrompt({\n                content: text,\n                value: value\n            }).data('kendoPrompt').open();\n            return promptDialog.result;\n        };\n        templates = {\n            wrapper: template('<div class=\\'k-widget k-window k-dialog\\' role=\\'dialog\\' />'),\n            action: template('<button type=\\'button\\' class=\\'k-button# if (data.primary) { # k-primary# } role=\\'button\\' #\\'></button>'),\n            titlebar: template('<div class=\\'k-window-titlebar k-dialog-titlebar k-header\\'>' + '<span class=\\'k-window-title k-dialog-title\\'>#: title #</span>' + '<div class=\\'k-window-actions k-dialog-actions\\' />' + '</div>'),\n            close: template('<a role=\\'button\\' href=\\'\\\\#\\' class=\\'k-button k-bare k-button-icon k-window-action k-dialog-action k-dialog-close\\' title=\\'#: messages.close #\\' aria-label=\\'#: messages.close #\\' tabindex=\\'-1\\'><span class=\\'k-icon k-i-close\\'></span></a>'),\n            actionbar: template('<div class=\\'k-button-group k-dialog-buttongroup k-dialog-button-layout-#: buttonLayout #\\' role=\\'toolbar\\' />'),\n            overlay: '<div class=\\'k-overlay\\' />',\n            alertWrapper: template('<div class=\\'k-widget k-window k-dialog\\' role=\\'alertdialog\\' />'),\n            alert: '<div />',\n            confirm: '<div />',\n            prompt: '<div />',\n            promptInputContainer: template('<div class=\\'k-prompt-container\\'><input type=\\'text\\' class=\\'k-textbox\\' title=\\'#: messages.promptInput #\\' aria-label=\\'#: messages.promptInput #\\' /></div>')\n        };\n        kendo.alert = kendoAlert;\n        kendo.confirm = kendoConfirm;\n        kendo.prompt = kendoPrompt;\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.window', [\n        'kendo.draganddrop',\n        'kendo.popup'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'window',\n        name: 'Window',\n        category: 'web',\n        description: 'The Window widget displays content in a modal or non-modal HTML window.',\n        depends: [\n            'draganddrop',\n            'popup'\n        ],\n        features: [{\n                id: 'window-fx',\n                name: 'Animation',\n                description: 'Support for animation',\n                depends: ['fx']\n            }]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, TabKeyTrap = kendo.ui.Popup.TabKeyTrap, Draggable = kendo.ui.Draggable, isPlainObject = $.isPlainObject, activeElement = kendo._activeElement, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, proxy = $.proxy, extend = $.extend, each = $.each, template = kendo.template, BODY = 'body', templates, NS = '.kendoWindow', KWINDOW = '.k-window', KWINDOWTITLE = '.k-window-title', KWINDOWTITLEBAR = KWINDOWTITLE + 'bar', KWINDOWCONTENT = '.k-window-content', KDIALOGCONTENT = '.k-dialog-content', KWINDOWRESIZEHANDLES = '.k-resize-handle', KOVERLAY = '.k-overlay', KCONTENTFRAME = 'k-content-frame', LOADING = 'k-i-loading', KHOVERSTATE = 'k-state-hover', KFOCUSEDSTATE = 'k-state-focused', MAXIMIZEDSTATE = 'k-window-maximized', VISIBLE = ':visible', HIDDEN = 'hidden', CURSOR = 'cursor', OPEN = 'open', ACTIVATE = 'activate', DEACTIVATE = 'deactivate', CLOSE = 'close', REFRESH = 'refresh', MINIMIZE = 'minimize', MAXIMIZE = 'maximize', RESIZESTART = 'resizeStart', RESIZE = 'resize', RESIZEEND = 'resizeEnd', DRAGSTART = 'dragstart', DRAGEND = 'dragend', ERROR = 'error', OVERFLOW = 'overflow', DATADOCOVERFLOWRULE = 'original-overflow-rule', ZINDEX = 'zIndex', MINIMIZE_MAXIMIZE = '.k-window-actions .k-i-window-minimize,.k-window-actions .k-i-window-maximize', KPIN = '.k-i-pin', KUNPIN = '.k-i-unpin', PIN_UNPIN = KPIN + ',' + KUNPIN, TITLEBAR_BUTTONS = '.k-window-titlebar .k-window-action', REFRESHICON = '.k-window-titlebar .k-i-refresh', WINDOWEVENTSHANDLED = 'WindowEventsHandled', zero = /^0[a-z]*$/i, isLocalUrl = kendo.isLocalUrl;\n        function defined(x) {\n            return typeof x != 'undefined';\n        }\n        function constrain(value, low, high) {\n            return Math.max(Math.min(parseInt(value, 10), high === Infinity ? high : parseInt(high, 10)), parseInt(low, 10));\n        }\n        function executableScript() {\n            return !this.type || this.type.toLowerCase().indexOf('script') >= 0;\n        }\n        var Window = Widget.extend({\n            init: function (element, options) {\n                var that = this, wrapper, offset = {}, visibility, display, position, isVisible = false, content, windowContent, windowFrame, globalWindow, suppressActions = options && options.actions && !options.actions.length, id;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                position = options.position;\n                element = that.element;\n                content = options.content;\n                globalWindow = $(window);\n                if (suppressActions) {\n                    options.actions = [];\n                }\n                that.appendTo = $(options.appendTo);\n                if (content && !isPlainObject(content)) {\n                    content = options.content = { url: content };\n                }\n                element.find('script').filter(executableScript).remove();\n                if (!element.parent().is(that.appendTo) && (position.top === undefined || position.left === undefined)) {\n                    if (element.is(VISIBLE)) {\n                        offset = element.offset();\n                        isVisible = true;\n                    } else {\n                        visibility = element.css('visibility');\n                        display = element.css('display');\n                        element.css({\n                            visibility: HIDDEN,\n                            display: ''\n                        });\n                        offset = element.offset();\n                        element.css({\n                            visibility: visibility,\n                            display: display\n                        });\n                    }\n                    if (position.top === undefined) {\n                        position.top = offset.top;\n                    }\n                    if (position.left === undefined) {\n                        position.left = offset.left;\n                    }\n                }\n                if (!defined(options.visible) || options.visible === null) {\n                    options.visible = element.is(VISIBLE);\n                }\n                wrapper = that.wrapper = element.closest(KWINDOW);\n                if (!element.is('.k-content') || !wrapper[0]) {\n                    element.addClass('k-window-content k-content');\n                    that._createWindow(element, options);\n                    wrapper = that.wrapper = element.closest(KWINDOW);\n                    that._dimensions();\n                }\n                that._position();\n                if (content) {\n                    that.refresh(content);\n                }\n                if (options.visible) {\n                    that.toFront();\n                }\n                windowContent = wrapper.children(KWINDOWCONTENT);\n                that._tabindex(windowContent);\n                if (options.visible && options.modal) {\n                    that._overlay(wrapper.is(VISIBLE)).css({ opacity: 0.5 });\n                }\n                wrapper.on('mouseenter' + NS, TITLEBAR_BUTTONS, proxy(that._buttonEnter, that)).on('mouseleave' + NS, TITLEBAR_BUTTONS, proxy(that._buttonLeave, that)).on('click' + NS, '> ' + TITLEBAR_BUTTONS, proxy(that._windowActionHandler, that)).on('keydown' + NS, proxy(that._keydown, that)).on('focus' + NS, proxy(that._focus, that)).on('blur' + NS, proxy(that._blur, that));\n                windowContent.on('keydown' + NS, proxy(that._keydown, that)).on('focus' + NS, proxy(that._focus, that)).on('blur' + NS, proxy(that._blur, that));\n                windowFrame = windowContent.find('.' + KCONTENTFRAME)[0];\n                if (windowFrame && !globalWindow.data(WINDOWEVENTSHANDLED)) {\n                    globalWindow.on('blur' + NS, function () {\n                        var element = $(document.activeElement).parent(KWINDOWCONTENT);\n                        if (element.length) {\n                            var windowInstance = kendo.widgetInstance(element);\n                            windowInstance._focus();\n                        }\n                    });\n                    globalWindow.on('focus' + NS, function () {\n                        $(KWINDOWCONTENT).not(KDIALOGCONTENT).each(function (i, element) {\n                            kendo.widgetInstance($(element))._blur();\n                        });\n                    });\n                    globalWindow.data(WINDOWEVENTSHANDLED, true);\n                }\n                this._resizable();\n                this._draggable();\n                if (options.pinned && this.wrapper.is(':visible')) {\n                    that.pin();\n                }\n                id = element.attr('id');\n                if (id) {\n                    id = id + '_wnd_title';\n                    wrapper.children(KWINDOWTITLEBAR).children(KWINDOWTITLE).attr('id', id);\n                    windowContent.attr({\n                        'role': 'dialog',\n                        'aria-labelledby': id\n                    });\n                }\n                wrapper.add(wrapper.children('.k-resize-handle,' + KWINDOWTITLEBAR)).on('mousedown' + NS, proxy(that.toFront, that));\n                that.touchScroller = kendo.touchScroller(element);\n                that._resizeHandler = proxy(that._onDocumentResize, that);\n                that._marker = kendo.guid().substring(0, 8);\n                $(window).on('resize' + NS + that._marker, that._resizeHandler);\n                if (options.visible) {\n                    that.trigger(OPEN);\n                    that.trigger(ACTIVATE);\n                }\n                kendo.notify(that);\n                if (this.options.modal) {\n                    this._tabKeyTrap = new TabKeyTrap(wrapper);\n                    this._tabKeyTrap.trap();\n                    this._tabKeyTrap.shouldTrap = function () {\n                        return windowContent.data('isFront');\n                    };\n                }\n            },\n            _buttonEnter: function (e) {\n                $(e.currentTarget).addClass(KHOVERSTATE);\n            },\n            _buttonLeave: function (e) {\n                $(e.currentTarget).removeClass(KHOVERSTATE);\n            },\n            _focus: function () {\n                this.wrapper.addClass(KFOCUSEDSTATE);\n            },\n            _blur: function () {\n                this.wrapper.removeClass(KFOCUSEDSTATE);\n            },\n            _dimensions: function () {\n                var wrapper = this.wrapper;\n                var options = this.options;\n                var width = options.width;\n                var height = options.height;\n                var maxHeight = options.maxHeight;\n                var dimensions = [\n                    'minWidth',\n                    'minHeight',\n                    'maxWidth',\n                    'maxHeight'\n                ];\n                this.title(options.title);\n                for (var i = 0; i < dimensions.length; i++) {\n                    var value = options[dimensions[i]] || '';\n                    if (value != Infinity) {\n                        wrapper.css(dimensions[i], value);\n                    }\n                }\n                if (maxHeight != Infinity) {\n                    this.element.css('maxHeight', maxHeight);\n                }\n                if (width) {\n                    if (isNaN(width) && width.toString().indexOf('px') < 0) {\n                        wrapper.width(width);\n                    } else {\n                        wrapper.width(constrain(width, options.minWidth, options.maxWidth));\n                    }\n                } else {\n                    wrapper.width('');\n                }\n                if (height) {\n                    if (isNaN(height) && height.toString().indexOf('px') < 0) {\n                        wrapper.height(height);\n                    } else {\n                        wrapper.height(constrain(height, options.minHeight, options.maxHeight));\n                    }\n                } else {\n                    wrapper.height('');\n                }\n                if (!options.visible) {\n                    wrapper.hide();\n                }\n            },\n            _position: function () {\n                var wrapper = this.wrapper, position = this.options.position;\n                if (position.top === 0) {\n                    position.top = position.top.toString();\n                }\n                if (position.left === 0) {\n                    position.left = position.left.toString();\n                }\n                wrapper.css({\n                    top: position.top || '',\n                    left: position.left || ''\n                });\n            },\n            _animationOptions: function (id) {\n                var animation = this.options.animation;\n                var basicAnimation = {\n                    open: { effects: {} },\n                    close: {\n                        hide: true,\n                        effects: {}\n                    }\n                };\n                return animation && animation[id] || basicAnimation[id];\n            },\n            _resize: function () {\n                kendo.resize(this.element.children());\n            },\n            _resizable: function () {\n                var resizable = this.options.resizable;\n                var wrapper = this.wrapper;\n                if (this.resizing) {\n                    wrapper.off('dblclick' + NS).children(KWINDOWRESIZEHANDLES).remove();\n                    this.resizing.destroy();\n                    this.resizing = null;\n                }\n                if (resizable) {\n                    wrapper.on('dblclick' + NS, KWINDOWTITLEBAR, proxy(function (e) {\n                        if (!$(e.target).closest('.k-window-action').length) {\n                            this.toggleMaximization();\n                        }\n                    }, this));\n                    each('n e s w se sw ne nw'.split(' '), function (index, handler) {\n                        wrapper.append(templates.resizeHandle(handler));\n                    });\n                    this.resizing = new WindowResizing(this);\n                }\n                wrapper = null;\n            },\n            _draggable: function () {\n                var draggable = this.options.draggable;\n                if (this.dragging) {\n                    this.dragging.destroy();\n                    this.dragging = null;\n                }\n                if (draggable) {\n                    this.dragging = new WindowDragging(this, draggable.dragHandle || KWINDOWTITLEBAR);\n                }\n            },\n            _actions: function () {\n                var options = this.options;\n                var actions = options.actions;\n                var pinned = options.pinned;\n                var titlebar = this.wrapper.children(KWINDOWTITLEBAR);\n                var container = titlebar.find('.k-window-actions');\n                var windowSpecificCommands = [\n                    'maximize',\n                    'minimize'\n                ];\n                actions = $.map(actions, function (action) {\n                    action = pinned && action.toLowerCase() === 'pin' ? 'unpin' : action;\n                    return { name: windowSpecificCommands.indexOf(action.toLowerCase()) > -1 ? 'window-' + action : action };\n                });\n                container.html(kendo.render(templates.action, actions));\n            },\n            setOptions: function (options) {\n                var cachedOptions = JSON.parse(JSON.stringify(options));\n                extend(options.position, this.options.position);\n                extend(options.position, cachedOptions.position);\n                Widget.fn.setOptions.call(this, options);\n                var scrollable = this.options.scrollable !== false;\n                this.restore();\n                this._dimensions();\n                this._position();\n                this._resizable();\n                this._draggable();\n                this._actions();\n                if (typeof options.modal !== 'undefined') {\n                    var visible = this.options.visible !== false;\n                    this._overlay(options.modal && visible);\n                }\n                this.element.css(OVERFLOW, scrollable ? '' : 'hidden');\n            },\n            events: [\n                OPEN,\n                ACTIVATE,\n                DEACTIVATE,\n                CLOSE,\n                MINIMIZE,\n                MAXIMIZE,\n                REFRESH,\n                RESIZESTART,\n                RESIZE,\n                RESIZEEND,\n                DRAGSTART,\n                DRAGEND,\n                ERROR\n            ],\n            options: {\n                name: 'Window',\n                animation: {\n                    open: {\n                        effects: {\n                            zoom: { direction: 'in' },\n                            fade: { direction: 'in' }\n                        },\n                        duration: 350\n                    },\n                    close: {\n                        effects: {\n                            zoom: {\n                                direction: 'out',\n                                properties: { scale: 0.7 }\n                            },\n                            fade: { direction: 'out' }\n                        },\n                        duration: 350,\n                        hide: true\n                    }\n                },\n                title: '',\n                actions: ['Close'],\n                autoFocus: true,\n                modal: false,\n                resizable: true,\n                draggable: true,\n                minWidth: 90,\n                minHeight: 50,\n                maxWidth: Infinity,\n                maxHeight: Infinity,\n                pinned: false,\n                scrollable: true,\n                position: {},\n                content: null,\n                visible: null,\n                height: null,\n                width: null,\n                appendTo: 'body',\n                isMaximized: false,\n                isMinimized: false\n            },\n            _closable: function () {\n                return $.inArray('close', $.map(this.options.actions, function (x) {\n                    return x.toLowerCase();\n                })) > -1;\n            },\n            _keydown: function (e) {\n                var that = this, options = that.options, keys = kendo.keys, keyCode = e.keyCode, wrapper = that.wrapper, offset, handled, distance = 10, isMaximized = that.options.isMaximized, isMinimized = that.options.isMinimized, newWidth, newHeight, w, h;\n                if (keyCode == keys.ESC && that._closable()) {\n                    e.stopPropagation();\n                    that._close(false);\n                }\n                if (e.target != e.currentTarget || that._closing) {\n                    return;\n                }\n                if (e.altKey && keyCode == 82) {\n                    that.refresh();\n                }\n                if (e.altKey && keyCode == 80) {\n                    if (that.options.pinned) {\n                        that.unpin();\n                    } else {\n                        that.pin();\n                    }\n                }\n                if (e.altKey && keyCode == keys.UP) {\n                    if (isMinimized) {\n                        that.restore();\n                        that.element.focus();\n                    } else if (!isMaximized) {\n                        that.maximize();\n                        that.element.focus();\n                    }\n                } else if (e.altKey && keyCode == keys.DOWN) {\n                    if (!isMinimized && !isMaximized) {\n                        that.minimize();\n                        that.wrapper.focus();\n                    } else if (isMaximized) {\n                        that.restore();\n                        that.element.focus();\n                    }\n                }\n                if (options.draggable && !e.ctrlKey && !e.altKey && !isMaximized) {\n                    offset = kendo.getOffset(wrapper);\n                    if (keyCode == keys.UP) {\n                        handled = wrapper.css('top', offset.top - distance);\n                    } else if (keyCode == keys.DOWN) {\n                        handled = wrapper.css('top', offset.top + distance);\n                    } else if (keyCode == keys.LEFT) {\n                        handled = wrapper.css('left', offset.left - distance);\n                    } else if (keyCode == keys.RIGHT) {\n                        handled = wrapper.css('left', offset.left + distance);\n                    }\n                }\n                if (options.resizable && e.ctrlKey && !isMaximized && !isMinimized) {\n                    if (keyCode == keys.UP) {\n                        handled = true;\n                        newHeight = wrapper.height() - distance;\n                    } else if (keyCode == keys.DOWN) {\n                        handled = true;\n                        newHeight = wrapper.height() + distance;\n                    }\n                    if (keyCode == keys.LEFT) {\n                        handled = true;\n                        newWidth = wrapper.width() - distance;\n                    } else if (keyCode == keys.RIGHT) {\n                        handled = true;\n                        newWidth = wrapper.width() + distance;\n                    }\n                    if (handled) {\n                        w = constrain(newWidth, options.minWidth, options.maxWidth);\n                        h = constrain(newHeight, options.minHeight, options.maxHeight);\n                        if (!isNaN(w)) {\n                            wrapper.width(w);\n                            that.options.width = w + 'px';\n                        }\n                        if (!isNaN(h)) {\n                            wrapper.height(h);\n                            that.options.height = h + 'px';\n                        }\n                        that.resize();\n                    }\n                }\n                if (handled) {\n                    e.preventDefault();\n                }\n            },\n            _overlay: function (visible) {\n                var overlay = this.appendTo.children(KOVERLAY), wrapper = this.wrapper;\n                if (!overlay.length) {\n                    overlay = $('<div class=\\'k-overlay\\' />');\n                }\n                overlay.insertBefore(wrapper[0]).toggle(visible).css(ZINDEX, parseInt(wrapper.css(ZINDEX), 10) - 1);\n                return overlay;\n            },\n            _actionForIcon: function (icon) {\n                var iconClass = /\\bk-i(-\\w+)+\\b/.exec(icon[0].className)[0];\n                return {\n                    'k-i-close': '_close',\n                    'k-i-window-maximize': 'maximize',\n                    'k-i-window-minimize': 'minimize',\n                    'k-i-window-restore': 'restore',\n                    'k-i-refresh': 'refresh',\n                    'k-i-pin': 'pin',\n                    'k-i-unpin': 'unpin'\n                }[iconClass];\n            },\n            _windowActionHandler: function (e) {\n                if (this._closing) {\n                    return;\n                }\n                var icon = $(e.target).closest('.k-window-action').find('.k-icon');\n                var action = this._actionForIcon(icon);\n                if (action) {\n                    e.preventDefault();\n                    this[action]();\n                    return false;\n                }\n            },\n            _modals: function () {\n                var that = this;\n                var zStack = $(KWINDOW).filter(function () {\n                    var dom = $(this);\n                    var object = that._object(dom);\n                    var options = object && object.options;\n                    return options && options.modal && options.visible && options.appendTo === that.options.appendTo && dom.is(VISIBLE);\n                }).sort(function (a, b) {\n                    return +$(a).css('zIndex') - +$(b).css('zIndex');\n                });\n                that = null;\n                return zStack;\n            },\n            _object: function (element) {\n                var content = element.children(KWINDOWCONTENT);\n                var widget = kendo.widgetInstance(content);\n                if (widget) {\n                    return widget;\n                }\n                return undefined;\n            },\n            center: function () {\n                var that = this, position = that.options.position, wrapper = that.wrapper, documentWindow = $(window), scrollTop = 0, scrollLeft = 0, newTop, newLeft;\n                if (that.options.isMaximized) {\n                    return that;\n                }\n                if (that.options.pinned && !that._isPinned) {\n                    that.pin();\n                }\n                if (!that.options.pinned) {\n                    scrollTop = documentWindow.scrollTop();\n                    scrollLeft = documentWindow.scrollLeft();\n                }\n                newLeft = scrollLeft + Math.max(0, (documentWindow.width() - wrapper.width()) / 2);\n                newTop = scrollTop + Math.max(0, (documentWindow.height() - wrapper.height() - parseInt(wrapper.css('paddingTop'), 10)) / 2);\n                wrapper.css({\n                    left: newLeft,\n                    top: newTop\n                });\n                position.top = newTop;\n                position.left = newLeft;\n                return that;\n            },\n            title: function (text) {\n                var that = this, wrapper = that.wrapper, options = that.options, titleBar = wrapper.children(KWINDOWTITLEBAR), title = titleBar.children(KWINDOWTITLE), titleBarHeight;\n                if (!arguments.length) {\n                    return title.html();\n                }\n                if (text === false) {\n                    wrapper.addClass('k-window-titleless');\n                    titleBar.remove();\n                } else {\n                    if (!titleBar.length) {\n                        wrapper.prepend(templates.titlebar(options));\n                        that._actions();\n                        titleBar = wrapper.children(KWINDOWTITLEBAR);\n                    } else {\n                        title.html(kendo.htmlEncode(text));\n                    }\n                    titleBarHeight = parseInt(outerHeight(titleBar), 10);\n                    wrapper.css('padding-top', titleBarHeight);\n                    titleBar.css('margin-top', -titleBarHeight);\n                }\n                that.options.title = text;\n                return that;\n            },\n            content: function (html, data) {\n                var content = this.wrapper.children(KWINDOWCONTENT), scrollContainer = content.children('.km-scroll-container');\n                content = scrollContainer[0] ? scrollContainer : content;\n                if (!defined(html)) {\n                    return content.html();\n                }\n                this.angular('cleanup', function () {\n                    return { elements: content.children() };\n                });\n                kendo.destroy(this.element.children());\n                content.empty().html(html);\n                this.angular('compile', function () {\n                    var a = [];\n                    for (var i = content.length; --i >= 0;) {\n                        a.push({ dataItem: data });\n                    }\n                    return {\n                        elements: content.children(),\n                        data: a\n                    };\n                });\n                return this;\n            },\n            open: function () {\n                var that = this, wrapper = that.wrapper, options = that.options, showOptions = this._animationOptions('open'), contentElement = wrapper.children(KWINDOWCONTENT), overlay, otherModalsVisible, doc = $(document);\n                if (!that.trigger(OPEN)) {\n                    if (that._closing) {\n                        wrapper.kendoStop(true, true);\n                    }\n                    that._closing = false;\n                    that.toFront();\n                    if (options.autoFocus) {\n                        that.element.focus();\n                    }\n                    options.visible = true;\n                    if (options.modal) {\n                        otherModalsVisible = !!that._modals().length;\n                        overlay = that._overlay(otherModalsVisible);\n                        overlay.kendoStop(true, true);\n                        if (showOptions.duration && kendo.effects.Fade && !otherModalsVisible) {\n                            var overlayFx = kendo.fx(overlay).fadeIn();\n                            overlayFx.duration(showOptions.duration || 0);\n                            overlayFx.endValue(0.5);\n                            overlayFx.play();\n                        } else {\n                            overlay.css('opacity', 0.5);\n                        }\n                        overlay.show();\n                        $(window).on('focus', function () {\n                            if (contentElement.data('isFront') && !$(document.activeElement).closest(contentElement).length) {\n                                that.element.focus();\n                            }\n                        });\n                    }\n                    if (!wrapper.is(VISIBLE)) {\n                        contentElement.css(OVERFLOW, HIDDEN);\n                        wrapper.show().kendoStop().kendoAnimate({\n                            effects: showOptions.effects,\n                            duration: showOptions.duration,\n                            complete: proxy(this._activate, this)\n                        });\n                    }\n                }\n                if (options.isMaximized) {\n                    that._documentScrollTop = doc.scrollTop();\n                    that._documentScrollLeft = doc.scrollLeft();\n                    that._stopDocumentScrolling();\n                }\n                if (options.pinned && !that._isPinned) {\n                    that.pin();\n                }\n                return that;\n            },\n            _activate: function () {\n                var scrollable = this.options.scrollable !== false;\n                if (this.options.autoFocus) {\n                    this.element.focus();\n                }\n                this.element.css(OVERFLOW, scrollable ? '' : 'hidden');\n                kendo.resize(this.element.children());\n                this.trigger(ACTIVATE);\n            },\n            _removeOverlay: function (suppressAnimation) {\n                var modals = this._modals();\n                var options = this.options;\n                var hideOverlay = options.modal && !modals.length;\n                var overlay = options.modal ? this._overlay(true) : $(undefined);\n                var hideOptions = this._animationOptions('close');\n                if (hideOverlay) {\n                    if (!suppressAnimation && hideOptions.duration && kendo.effects.Fade) {\n                        var overlayFx = kendo.fx(overlay).fadeOut();\n                        overlayFx.duration(hideOptions.duration || 0);\n                        overlayFx.startValue(0.5);\n                        overlayFx.play();\n                    } else {\n                        this._overlay(false).remove();\n                    }\n                } else if (modals.length) {\n                    this._object(modals.last())._overlay(true);\n                }\n            },\n            _close: function (systemTriggered) {\n                var that = this, wrapper = that.wrapper, options = that.options, showOptions = this._animationOptions('open'), hideOptions = this._animationOptions('close'), doc = $(document), defaultPrevented;\n                if (that._closing) {\n                    return;\n                }\n                defaultPrevented = that.trigger(CLOSE, { userTriggered: !systemTriggered });\n                that._closing = !defaultPrevented;\n                if (wrapper.is(VISIBLE) && !defaultPrevented) {\n                    options.visible = false;\n                    $(KWINDOW).each(function (i, element) {\n                        var contentElement = $(element).children(KWINDOWCONTENT);\n                        if (element != wrapper && contentElement.find('> .' + KCONTENTFRAME).length > 0) {\n                            contentElement.children(KOVERLAY).remove();\n                        }\n                    });\n                    this._removeOverlay();\n                    wrapper.kendoStop().kendoAnimate({\n                        effects: hideOptions.effects || showOptions.effects,\n                        reverse: hideOptions.reverse === true,\n                        duration: hideOptions.duration,\n                        complete: proxy(this._deactivate, this)\n                    });\n                }\n                if (that.options.isMaximized) {\n                    that._enableDocumentScrolling();\n                    if (that._documentScrollTop && that._documentScrollTop > 0) {\n                        doc.scrollTop(that._documentScrollTop);\n                    }\n                    if (that._documentScrollLeft && that._documentScrollLeft > 0) {\n                        doc.scrollLeft(that._documentScrollLeft);\n                    }\n                }\n            },\n            _deactivate: function () {\n                var that = this;\n                that.wrapper.hide().css('opacity', '');\n                that.trigger(DEACTIVATE);\n                if (that.options.modal) {\n                    var lastModal = that._object(that._modals().last());\n                    if (lastModal) {\n                        lastModal.toFront();\n                    }\n                }\n            },\n            close: function () {\n                this._close(true);\n                return this;\n            },\n            _actionable: function (element) {\n                return $(element).is(TITLEBAR_BUTTONS + ',' + TITLEBAR_BUTTONS + ' .k-icon,:input,a');\n            },\n            _shouldFocus: function (target) {\n                var active = activeElement(), element = this.element;\n                return this.options.autoFocus && !$(active).is(element) && !this._actionable(target) && (!element.find(active).length || !element.find(target).length);\n            },\n            toFront: function (e) {\n                var that = this, wrapper = that.wrapper, currentWindow = wrapper[0], zIndex = +wrapper.css(ZINDEX), originalZIndex = zIndex, target = e && e.target || null;\n                $(KWINDOW).each(function (i, element) {\n                    var windowObject = $(element), zIndexNew = windowObject.css(ZINDEX), contentElement = windowObject.children(KWINDOWCONTENT);\n                    if (!isNaN(zIndexNew)) {\n                        zIndex = Math.max(+zIndexNew, zIndex);\n                    }\n                    contentElement.data('isFront', element == currentWindow);\n                    if (element != currentWindow && contentElement.find('> .' + KCONTENTFRAME).length > 0) {\n                        contentElement.append(templates.overlay);\n                    }\n                });\n                if (!wrapper[0].style.zIndex || originalZIndex < zIndex) {\n                    wrapper.css(ZINDEX, zIndex + 2);\n                }\n                that.element.find('> .k-overlay').remove();\n                if (that._shouldFocus(target)) {\n                    if (that.isMinimized()) {\n                        that.wrapper.focus();\n                    } else if ($(target).is(KOVERLAY)) {\n                        setTimeout(function () {\n                            that.element.focus();\n                        });\n                    } else {\n                        that.element.focus();\n                    }\n                    var scrollTop = $(window).scrollTop(), windowTop = parseInt(wrapper.position().top, 10);\n                    if (!that.options.pinned && windowTop > 0 && windowTop < scrollTop) {\n                        if (scrollTop > 0) {\n                            $(window).scrollTop(windowTop);\n                        } else {\n                            wrapper.css('top', scrollTop);\n                        }\n                    }\n                }\n                wrapper = null;\n                return that;\n            },\n            toggleMaximization: function () {\n                if (this._closing) {\n                    return this;\n                }\n                return this[this.options.isMaximized ? 'restore' : 'maximize']();\n            },\n            restore: function () {\n                var that = this;\n                var options = that.options;\n                var minHeight = options.minHeight;\n                var restoreOptions = that.restoreOptions;\n                var doc = $(document);\n                if (!options.isMaximized && !options.isMinimized) {\n                    return that;\n                }\n                if (minHeight && minHeight != Infinity) {\n                    that.wrapper.css('min-height', minHeight);\n                }\n                that.wrapper.css({\n                    position: options.pinned ? 'fixed' : 'absolute',\n                    left: restoreOptions.left,\n                    top: restoreOptions.top,\n                    width: restoreOptions.width,\n                    height: restoreOptions.height\n                }).removeClass(MAXIMIZEDSTATE).find('.k-window-content,.k-resize-handle').show().end().find('.k-window-titlebar .k-i-window-restore').parent().remove().end().end().find(MINIMIZE_MAXIMIZE).parent().show().end().end().find(PIN_UNPIN).parent().show();\n                if (options.isMaximized) {\n                    that.wrapper.find('.k-i-window-maximize').parent().focus();\n                } else if (options.isMinimized) {\n                    that.wrapper.find('.k-i-window-minimize').parent().focus();\n                }\n                that.options.width = restoreOptions.width;\n                that.options.height = restoreOptions.height;\n                that._enableDocumentScrolling();\n                if (this._documentScrollTop && this._documentScrollTop > 0) {\n                    doc.scrollTop(this._documentScrollTop);\n                }\n                if (this._documentScrollLeft && this._documentScrollLeft > 0) {\n                    doc.scrollLeft(this._documentScrollLeft);\n                }\n                options.isMaximized = options.isMinimized = false;\n                this.wrapper.removeAttr('tabindex');\n                this.wrapper.removeAttr('aria-labelled-by');\n                that.resize();\n                return that;\n            },\n            _sizingAction: function (actionId, callback) {\n                var that = this, wrapper = that.wrapper, style = wrapper[0].style, options = that.options;\n                if (options.isMaximized || options.isMinimized) {\n                    return that;\n                }\n                that.restoreOptions = {\n                    width: style.width,\n                    height: style.height\n                };\n                wrapper.children(KWINDOWRESIZEHANDLES).hide().end().children(KWINDOWTITLEBAR).find(MINIMIZE_MAXIMIZE).parent().hide().eq(0).before(templates.action({ name: 'window-restore' }));\n                callback.call(that);\n                that.wrapper.children(KWINDOWTITLEBAR).find(PIN_UNPIN).parent().toggle(actionId !== 'maximize');\n                that.trigger(actionId);\n                wrapper.find('.k-i-window-restore').parent().focus();\n                return that;\n            },\n            maximize: function () {\n                this._sizingAction('maximize', function () {\n                    var that = this, wrapper = that.wrapper, position = wrapper.position(), doc = $(document);\n                    extend(that.restoreOptions, {\n                        left: position.left,\n                        top: position.top\n                    });\n                    wrapper.css({\n                        left: 0,\n                        top: 0,\n                        position: 'fixed'\n                    }).addClass(MAXIMIZEDSTATE);\n                    this._documentScrollTop = doc.scrollTop();\n                    this._documentScrollLeft = doc.scrollLeft();\n                    that._stopDocumentScrolling();\n                    that.options.isMaximized = true;\n                    that._onDocumentResize();\n                });\n                return this;\n            },\n            _stopDocumentScrolling: function () {\n                var that = this;\n                var $body = $('body');\n                that._storeOverflowRule($body);\n                $body.css(OVERFLOW, HIDDEN);\n                var $html = $('html');\n                that._storeOverflowRule($html);\n                $html.css(OVERFLOW, HIDDEN);\n            },\n            _enableDocumentScrolling: function () {\n                var that = this;\n                that._restoreOverflowRule($(document.body));\n                that._restoreOverflowRule($('html'));\n            },\n            _storeOverflowRule: function ($element) {\n                if (this._isOverflowStored($element)) {\n                    return;\n                }\n                var overflowRule = $element.get(0).style.overflow;\n                if (typeof overflowRule === 'string') {\n                    $element.data(DATADOCOVERFLOWRULE, overflowRule);\n                }\n            },\n            _isOverflowStored: function ($element) {\n                return typeof $element.data(DATADOCOVERFLOWRULE) === 'string';\n            },\n            _restoreOverflowRule: function ($element) {\n                var overflowRule = $element.data(DATADOCOVERFLOWRULE);\n                if (overflowRule !== null && overflowRule !== undefined) {\n                    $element.css(OVERFLOW, overflowRule);\n                    $element.removeData(DATADOCOVERFLOWRULE);\n                } else {\n                    $element.css(OVERFLOW, '');\n                }\n            },\n            isMaximized: function () {\n                return this.options.isMaximized;\n            },\n            minimize: function () {\n                this._sizingAction('minimize', function () {\n                    var that = this;\n                    that.wrapper.css({\n                        height: '',\n                        minHeight: ''\n                    });\n                    that.element.hide();\n                    that.options.isMinimized = true;\n                });\n                this.wrapper.attr('tabindex', 0);\n                this.wrapper.attr('aria-labelled-by', this.element.attr('aria-labelled-by'));\n                return this;\n            },\n            isMinimized: function () {\n                return this.options.isMinimized;\n            },\n            pin: function () {\n                var that = this, win = $(window), wrapper = that.wrapper, top = parseInt(wrapper.css('top'), 10), left = parseInt(wrapper.css('left'), 10);\n                if (!that.options.isMaximized) {\n                    wrapper.css({\n                        position: 'fixed',\n                        top: top - win.scrollTop(),\n                        left: left - win.scrollLeft()\n                    });\n                    wrapper.children(KWINDOWTITLEBAR).find(KPIN).addClass('k-i-unpin').removeClass('k-i-pin');\n                    that._isPinned = true;\n                    that.options.pinned = true;\n                }\n            },\n            unpin: function () {\n                var that = this, win = $(window), wrapper = that.wrapper, top = parseInt(wrapper.css('top'), 10), left = parseInt(wrapper.css('left'), 10);\n                if (!that.options.isMaximized) {\n                    wrapper.css({\n                        position: '',\n                        top: top + win.scrollTop(),\n                        left: left + win.scrollLeft()\n                    });\n                    wrapper.children(KWINDOWTITLEBAR).find(KUNPIN).addClass('k-i-pin').removeClass('k-i-unpin');\n                    that._isPinned = false;\n                    that.options.pinned = false;\n                }\n            },\n            _onDocumentResize: function () {\n                var that = this, wrapper = that.wrapper, wnd = $(window), zoomLevel = kendo.support.zoomLevel(), w, h;\n                if (!that.options.isMaximized) {\n                    return;\n                }\n                var lrBorderWidth = parseInt(wrapper.css('border-left-width'), 10) + parseInt(wrapper.css('border-right-width'), 10);\n                var tbBorderWidth = parseInt(wrapper.css('border-top-width'), 10) + parseInt(wrapper.css('border-bottom-width'), 10);\n                w = wnd.width() / zoomLevel - lrBorderWidth;\n                h = wnd.height() / zoomLevel - parseInt(wrapper.css('padding-top'), 10) - tbBorderWidth;\n                wrapper.css({\n                    width: w,\n                    height: h\n                });\n                that.options.width = w;\n                that.options.height = h;\n                that.resize();\n            },\n            refresh: function (options) {\n                var that = this, initOptions = that.options, element = $(that.element), iframe, showIframe, url;\n                if (!isPlainObject(options)) {\n                    options = { url: options };\n                }\n                options = extend({}, initOptions.content, options);\n                showIframe = defined(initOptions.iframe) ? initOptions.iframe : options.iframe;\n                url = options.url;\n                if (url) {\n                    if (!defined(showIframe)) {\n                        showIframe = !isLocalUrl(url);\n                    }\n                    if (!showIframe) {\n                        that._ajaxRequest(options);\n                    } else {\n                        iframe = element.find('.' + KCONTENTFRAME)[0];\n                        if (iframe) {\n                            iframe.src = url || iframe.src;\n                        } else {\n                            element.html(templates.contentFrame(extend({}, initOptions, { content: options })));\n                        }\n                        element.find('.' + KCONTENTFRAME).unbind('load' + NS).on('load' + NS, proxy(this._triggerRefresh, this));\n                    }\n                } else {\n                    if (options.template) {\n                        that.content(template(options.template)({}));\n                    }\n                    that.trigger(REFRESH);\n                }\n                element.toggleClass('k-window-iframecontent', !!showIframe);\n                return that;\n            },\n            _triggerRefresh: function () {\n                this.trigger(REFRESH);\n            },\n            _ajaxComplete: function () {\n                clearTimeout(this._loadingIconTimeout);\n                this.wrapper.find(REFRESHICON).removeClass(LOADING);\n            },\n            _ajaxError: function (xhr, status) {\n                this.trigger(ERROR, {\n                    status: status,\n                    xhr: xhr\n                });\n            },\n            _ajaxSuccess: function (contentTemplate) {\n                return function (data) {\n                    var html = data;\n                    if (contentTemplate) {\n                        html = template(contentTemplate)(data || {});\n                    }\n                    this.content(html, data);\n                    this.element.prop('scrollTop', 0);\n                    this.trigger(REFRESH);\n                };\n            },\n            _showLoading: function () {\n                this.wrapper.find(REFRESHICON).addClass(LOADING);\n            },\n            _ajaxRequest: function (options) {\n                this._loadingIconTimeout = setTimeout(proxy(this._showLoading, this), 100);\n                $.ajax(extend({\n                    type: 'GET',\n                    dataType: 'html',\n                    cache: false,\n                    error: proxy(this._ajaxError, this),\n                    complete: proxy(this._ajaxComplete, this),\n                    success: proxy(this._ajaxSuccess(options.template), this)\n                }, options));\n            },\n            _destroy: function () {\n                if (this.resizing) {\n                    this.resizing.destroy();\n                }\n                if (this.dragging) {\n                    this.dragging.destroy();\n                }\n                this.wrapper.off(NS).children(KWINDOWCONTENT).off(NS).end().find('.k-resize-handle,.k-window-titlebar').off(NS);\n                $(window).off('resize' + NS + this._marker);\n                $(window).off(NS);\n                clearTimeout(this._loadingIconTimeout);\n                Widget.fn.destroy.call(this);\n                this.unbind(undefined);\n                kendo.destroy(this.wrapper);\n                this._removeOverlay(true);\n            },\n            destroy: function () {\n                this._destroy();\n                this.wrapper.empty().remove();\n                this.wrapper = this.appendTo = this.element = $();\n            },\n            _createWindow: function () {\n                var contentHtml = this.element, options = this.options, iframeSrcAttributes, wrapper, isRtl = kendo.support.isRtl(contentHtml);\n                if (options.scrollable === false) {\n                    contentHtml.css('overflow', 'hidden');\n                }\n                wrapper = $(templates.wrapper(options));\n                iframeSrcAttributes = contentHtml.find('iframe:not(.k-content)').map(function () {\n                    var src = this.getAttribute('src');\n                    this.src = '';\n                    return src;\n                });\n                wrapper.toggleClass('k-rtl', isRtl).appendTo(this.appendTo).append(contentHtml).find('iframe:not(.k-content)').each(function (index) {\n                    this.src = iframeSrcAttributes[index];\n                });\n                wrapper.find('.k-window-title').css(isRtl ? 'left' : 'right', outerWidth(wrapper.find('.k-window-actions')) + 10);\n                contentHtml.css('visibility', '').show();\n                contentHtml.find('[data-role=editor]').each(function () {\n                    var editor = $(this).data('kendoEditor');\n                    if (editor) {\n                        editor.refresh();\n                    }\n                });\n                wrapper = contentHtml = null;\n            }\n        });\n        templates = {\n            wrapper: template('<div class=\\'k-widget k-window\\' />'),\n            action: template('<a role=\\'button\\' href=\\'\\\\#\\' class=\\'k-button k-bare k-button-icon k-window-action\\' aria-label=\\'#= name #\\'>' + '<span class=\\'k-icon k-i-#= name.toLowerCase() #\\'></span>' + '</a>'),\n            titlebar: template('<div class=\\'k-window-titlebar k-header\\'>' + '<span class=\\'k-window-title\\'>#: title #</span>' + '<div class=\\'k-window-actions\\' />' + '</div>'),\n            overlay: '<div class=\\'k-overlay\\' />',\n            contentFrame: template('<iframe frameborder=\\'0\\' title=\\'#= title #\\' class=\\'' + KCONTENTFRAME + '\\' ' + 'src=\\'#= content.url #\\'>' + 'This page requires frames in order to show content' + '</iframe>'),\n            resizeHandle: template('<div class=\\'k-resize-handle k-resize-#= data #\\'></div>')\n        };\n        function WindowResizing(wnd) {\n            var that = this;\n            that.owner = wnd;\n            that._preventDragging = false;\n            that._draggable = new Draggable(wnd.wrapper, {\n                filter: '>' + KWINDOWRESIZEHANDLES,\n                group: wnd.wrapper.id + '-resizing',\n                dragstart: proxy(that.dragstart, that),\n                drag: proxy(that.drag, that),\n                dragend: proxy(that.dragend, that)\n            });\n            that._draggable.userEvents.bind('press', proxy(that.addOverlay, that));\n            that._draggable.userEvents.bind('release', proxy(that.removeOverlay, that));\n        }\n        function getPosition(elem) {\n            var result = {\n                    top: elem.offsetTop,\n                    left: elem.offsetLeft\n                }, parent = elem.offsetParent;\n            while (parent) {\n                result.top += parent.offsetTop;\n                result.left += parent.offsetLeft;\n                var parentOverflowX = $(parent).css('overflowX');\n                var parentOverflowY = $(parent).css('overflowY');\n                if (parentOverflowY === 'auto' || parentOverflowY === 'scroll') {\n                    result.top -= parent.scrollTop;\n                }\n                if (parentOverflowX === 'auto' || parentOverflowX === 'scroll') {\n                    result.left -= parent.scrollLeft;\n                }\n                parent = parent.offsetParent;\n            }\n            return result;\n        }\n        WindowResizing.prototype = {\n            addOverlay: function () {\n                this.owner.wrapper.append(templates.overlay);\n            },\n            removeOverlay: function () {\n                this.owner.wrapper.find(KOVERLAY).remove();\n            },\n            dragstart: function (e) {\n                var that = this;\n                var wnd = that.owner;\n                var wrapper = wnd.wrapper;\n                that._preventDragging = wnd.trigger(RESIZESTART);\n                if (that._preventDragging) {\n                    return;\n                }\n                that.elementPadding = parseInt(wrapper.css('padding-top'), 10);\n                that.initialPosition = kendo.getOffset(wrapper, 'position');\n                that.resizeDirection = e.currentTarget.prop('className').replace('k-resize-handle k-resize-', '');\n                that.initialSize = {\n                    width: wrapper.width(),\n                    height: wrapper.height()\n                };\n                that.containerOffset = kendo.getOffset(wnd.appendTo, 'position');\n                var offsetParent = wrapper.offsetParent();\n                if (offsetParent.is('html')) {\n                    that.containerOffset.top = that.containerOffset.left = 0;\n                } else {\n                    var marginTop = offsetParent.css('margin-top');\n                    var marginLeft = offsetParent.css('margin-left');\n                    var hasMargin = !zero.test(marginTop) || !zero.test(marginLeft);\n                    if (hasMargin) {\n                        var wrapperPosition = getPosition(wrapper[0]);\n                        var relativeElMarginLeft = wrapperPosition.left - that.containerOffset.left - that.initialPosition.left;\n                        var relativeElMarginTop = wrapperPosition.top - that.containerOffset.top - that.initialPosition.top;\n                        that._relativeElMarginLeft = relativeElMarginLeft > 1 ? relativeElMarginLeft : 0;\n                        that._relativeElMarginTop = relativeElMarginTop > 1 ? relativeElMarginTop : 0;\n                        that.initialPosition.left += that._relativeElMarginLeft;\n                        that.initialPosition.top += that._relativeElMarginTop;\n                    }\n                }\n                wrapper.children(KWINDOWRESIZEHANDLES).not(e.currentTarget).hide();\n                $(BODY).css(CURSOR, e.currentTarget.css(CURSOR));\n            },\n            drag: function (e) {\n                if (this._preventDragging) {\n                    return;\n                }\n                var that = this, wnd = that.owner, wrapper = wnd.wrapper, options = wnd.options, direction = that.resizeDirection, containerOffset = that.containerOffset, initialPosition = that.initialPosition, initialSize = that.initialSize, newWidth, newHeight, windowBottom, windowRight, x = Math.max(e.x.location, 0), y = Math.max(e.y.location, 0);\n                if (direction.indexOf('e') >= 0) {\n                    newWidth = x - initialPosition.left - containerOffset.left;\n                    wrapper.width(constrain(newWidth, options.minWidth, options.maxWidth));\n                } else if (direction.indexOf('w') >= 0) {\n                    windowRight = initialPosition.left + initialSize.width + containerOffset.left;\n                    newWidth = constrain(windowRight - x, options.minWidth, options.maxWidth);\n                    wrapper.css({\n                        left: windowRight - newWidth - containerOffset.left - (that._relativeElMarginLeft || 0),\n                        width: newWidth\n                    });\n                }\n                var newWindowTop = y;\n                if (wnd.options.pinned) {\n                    newWindowTop -= $(window).scrollTop();\n                }\n                if (direction.indexOf('s') >= 0) {\n                    newHeight = newWindowTop - initialPosition.top - that.elementPadding - containerOffset.top;\n                    wrapper.height(constrain(newHeight, options.minHeight, options.maxHeight));\n                } else if (direction.indexOf('n') >= 0) {\n                    windowBottom = initialPosition.top + initialSize.height + containerOffset.top;\n                    newHeight = constrain(windowBottom - newWindowTop, options.minHeight, options.maxHeight);\n                    wrapper.css({\n                        top: windowBottom - newHeight - containerOffset.top - (that._relativeElMarginTop || 0),\n                        height: newHeight\n                    });\n                }\n                if (newWidth) {\n                    wnd.options.width = newWidth + 'px';\n                }\n                if (newHeight) {\n                    wnd.options.height = newHeight + 'px';\n                }\n                wnd.resize();\n            },\n            dragend: function (e) {\n                if (this._preventDragging) {\n                    return;\n                }\n                var that = this, wnd = that.owner, wrapper = wnd.wrapper;\n                wrapper.children(KWINDOWRESIZEHANDLES).not(e.currentTarget).show();\n                $(BODY).css(CURSOR, '');\n                if (wnd.touchScroller) {\n                    wnd.touchScroller.reset();\n                }\n                if (e.keyCode == 27) {\n                    wrapper.css(that.initialPosition).css(that.initialSize);\n                }\n                wnd.trigger(RESIZEEND);\n                return false;\n            },\n            destroy: function () {\n                if (this._draggable) {\n                    this._draggable.destroy();\n                }\n                this._draggable = this.owner = null;\n            }\n        };\n        function WindowDragging(wnd, dragHandle) {\n            var that = this;\n            that.owner = wnd;\n            that._preventDragging = false;\n            that._draggable = new Draggable(wnd.wrapper, {\n                filter: dragHandle,\n                group: wnd.wrapper.id + '-moving',\n                dragstart: proxy(that.dragstart, that),\n                drag: proxy(that.drag, that),\n                dragend: proxy(that.dragend, that),\n                dragcancel: proxy(that.dragcancel, that)\n            });\n            that._draggable.userEvents.stopPropagation = false;\n        }\n        WindowDragging.prototype = {\n            dragstart: function (e) {\n                var wnd = this.owner, element = wnd.element, actions = element.find('.k-window-actions'), containerOffset = kendo.getOffset(wnd.appendTo);\n                this._preventDragging = wnd.trigger(DRAGSTART) || !wnd.options.draggable;\n                if (this._preventDragging) {\n                    return;\n                }\n                wnd.initialWindowPosition = kendo.getOffset(wnd.wrapper, 'position');\n                wnd.initialPointerPosition = {\n                    left: e.x.client,\n                    top: e.y.client\n                };\n                wnd.startPosition = {\n                    left: e.x.client - wnd.initialWindowPosition.left,\n                    top: e.y.client - wnd.initialWindowPosition.top\n                };\n                if (actions.length > 0) {\n                    wnd.minLeftPosition = outerWidth(actions) + parseInt(actions.css('right'), 10) - outerWidth(element);\n                } else {\n                    wnd.minLeftPosition = 20 - outerWidth(element);\n                }\n                wnd.minLeftPosition -= containerOffset.left;\n                wnd.minTopPosition = -containerOffset.top;\n                wnd.wrapper.append(templates.overlay).children(KWINDOWRESIZEHANDLES).hide();\n                $(BODY).css(CURSOR, e.currentTarget.css(CURSOR));\n            },\n            drag: function (e) {\n                if (this._preventDragging) {\n                    return;\n                }\n                var wnd = this.owner;\n                var position = wnd.options.position;\n                position.top = Math.max(e.y.client - wnd.startPosition.top, wnd.minTopPosition);\n                position.left = Math.max(e.x.client - wnd.startPosition.left, wnd.minLeftPosition);\n                if (kendo.support.transforms) {\n                    $(wnd.wrapper).css('transform', 'translate(' + (e.x.client - wnd.initialPointerPosition.left) + 'px, ' + (e.y.client - wnd.initialPointerPosition.top) + 'px)');\n                } else {\n                    $(wnd.wrapper).css(position);\n                }\n            },\n            _finishDrag: function () {\n                var wnd = this.owner;\n                wnd.wrapper.children(KWINDOWRESIZEHANDLES).toggle(!wnd.options.isMinimized).end().find(KOVERLAY).remove();\n                $(BODY).css(CURSOR, '');\n            },\n            dragcancel: function (e) {\n                if (this._preventDragging) {\n                    return;\n                }\n                this._finishDrag();\n                e.currentTarget.closest(KWINDOW).css(this.owner.initialWindowPosition);\n            },\n            dragend: function () {\n                if (this._preventDragging) {\n                    return;\n                }\n                $(this.owner.wrapper).css(this.owner.options.position).css('transform', '');\n                this._finishDrag();\n                this.owner.trigger(DRAGEND);\n                return false;\n            },\n            destroy: function () {\n                if (this._draggable) {\n                    this._draggable.destroy();\n                }\n                this._draggable = this.owner = null;\n            }\n        };\n        kendo.ui.plugin(Window);\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.view', [\n        'kendo.core',\n        'kendo.fx',\n        'kendo.mobile.scroller',\n        'kendo.view'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.view',\n        name: 'View',\n        category: 'mobile',\n        description: 'Mobile View',\n        depends: [\n            'core',\n            'fx',\n            'mobile.scroller',\n            'view'\n        ],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, mobile = kendo.mobile, ui = mobile.ui, attr = kendo.attr, Widget = ui.Widget, ViewClone = kendo.ViewClone, INIT = 'init', UI_OVERLAY = '<div style=\"height: 100%; width: 100%; position: absolute; top: 0; left: 0; z-index: 20000; display: none\" />', BEFORE_SHOW = 'beforeShow', SHOW = 'show', AFTER_SHOW = 'afterShow', BEFORE_HIDE = 'beforeHide', TRANSITION_END = 'transitionEnd', TRANSITION_START = 'transitionStart', HIDE = 'hide', DESTROY = 'destroy', attrValue = kendo.attrValue, roleSelector = kendo.roleSelector, directiveSelector = kendo.directiveSelector, compileMobileDirective = kendo.compileMobileDirective;\n        function initPopOvers(element) {\n            var popovers = element.find(roleSelector('popover')), idx, length, roles = ui.roles;\n            for (idx = 0, length = popovers.length; idx < length; idx++) {\n                kendo.initWidget(popovers[idx], {}, roles);\n            }\n        }\n        function preventScrollIfNotInput(e) {\n            if (!kendo.triggeredByInput(e)) {\n                e.preventDefault();\n            }\n        }\n        var View = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this.params = {};\n                $.extend(this, options);\n                this.transition = this.transition || this.defaultTransition;\n                this._id();\n                if (!this.options.$angular) {\n                    this._layout();\n                    this._overlay();\n                    this._scroller();\n                    this._model();\n                } else {\n                    this._overlay();\n                }\n            },\n            events: [\n                INIT,\n                BEFORE_SHOW,\n                SHOW,\n                AFTER_SHOW,\n                BEFORE_HIDE,\n                HIDE,\n                DESTROY,\n                TRANSITION_START,\n                TRANSITION_END\n            ],\n            options: {\n                name: 'View',\n                title: '',\n                layout: null,\n                getLayout: $.noop,\n                reload: false,\n                transition: '',\n                defaultTransition: '',\n                useNativeScrolling: false,\n                stretch: false,\n                zoom: false,\n                model: null,\n                modelScope: window,\n                scroller: {},\n                initWidgets: true\n            },\n            enable: function (enable) {\n                if (typeof enable == 'undefined') {\n                    enable = true;\n                }\n                if (enable) {\n                    this.overlay.hide();\n                } else {\n                    this.overlay.show();\n                }\n            },\n            destroy: function () {\n                if (this.layout) {\n                    this.layout.detach(this);\n                }\n                this.trigger(DESTROY);\n                Widget.fn.destroy.call(this);\n                if (this.scroller) {\n                    this.scroller.destroy();\n                }\n                if (this.options.$angular) {\n                    this.element.scope().$destroy();\n                }\n                kendo.destroy(this.element);\n            },\n            purge: function () {\n                this.destroy();\n                this.element.remove();\n            },\n            triggerBeforeShow: function () {\n                if (this.trigger(BEFORE_SHOW, { view: this })) {\n                    return false;\n                }\n                return true;\n            },\n            triggerBeforeHide: function () {\n                if (this.trigger(BEFORE_HIDE, { view: this })) {\n                    return false;\n                }\n                return true;\n            },\n            showStart: function () {\n                var element = this.element;\n                element.css('display', '');\n                if (!this.inited) {\n                    this.inited = true;\n                    this.trigger(INIT, { view: this });\n                } else {\n                    this._invokeNgController();\n                }\n                if (this.layout) {\n                    this.layout.attach(this);\n                }\n                this._padIfNativeScrolling();\n                this.trigger(SHOW, { view: this });\n                kendo.resize(element);\n            },\n            showEnd: function () {\n                this.trigger(AFTER_SHOW, { view: this });\n                this._padIfNativeScrolling();\n            },\n            hideEnd: function () {\n                var that = this;\n                that.element.hide();\n                that.trigger(HIDE, { view: that });\n                if (that.layout) {\n                    that.layout.trigger(HIDE, {\n                        view: that,\n                        layout: that.layout\n                    });\n                }\n            },\n            beforeTransition: function (type) {\n                this.trigger(TRANSITION_START, { type: type });\n            },\n            afterTransition: function (type) {\n                this.trigger(TRANSITION_END, { type: type });\n            },\n            _padIfNativeScrolling: function () {\n                if (mobile.appLevelNativeScrolling()) {\n                    var isAndroid = kendo.support.mobileOS && kendo.support.mobileOS.android, skin = mobile.application.skin() || '', isAndroidForced = mobile.application.os.android || skin.indexOf('android') > -1, hasPlatformIndependentSkin = skin === 'flat' || skin.indexOf('material') > -1, topContainer = (isAndroid || isAndroidForced) && !hasPlatformIndependentSkin ? 'footer' : 'header', bottomContainer = (isAndroid || isAndroidForced) && !hasPlatformIndependentSkin ? 'header' : 'footer';\n                    this.content.css({\n                        paddingTop: this[topContainer].height(),\n                        paddingBottom: this[bottomContainer].height()\n                    });\n                }\n            },\n            contentElement: function () {\n                var that = this;\n                return that.options.stretch ? that.content : that.scrollerContent;\n            },\n            clone: function () {\n                return new ViewClone(this);\n            },\n            _scroller: function () {\n                var that = this;\n                if (mobile.appLevelNativeScrolling()) {\n                    return;\n                }\n                if (that.options.stretch) {\n                    that.content.addClass('km-stretched-view');\n                } else {\n                    that.content.kendoMobileScroller($.extend(that.options.scroller, {\n                        zoom: that.options.zoom,\n                        useNative: that.options.useNativeScrolling\n                    }));\n                    that.scroller = that.content.data('kendoMobileScroller');\n                    that.scrollerContent = that.scroller.scrollElement;\n                }\n                if (kendo.support.kineticScrollNeeded) {\n                    $(that.element).on('touchmove', '.km-header', preventScrollIfNotInput);\n                    if (!that.options.useNativeScrolling && !that.options.stretch) {\n                        $(that.element).on('touchmove', '.km-content', preventScrollIfNotInput);\n                    }\n                }\n            },\n            _model: function () {\n                var that = this, element = that.element, model = that.options.model;\n                if (typeof model === 'string') {\n                    model = kendo.getter(model)(that.options.modelScope);\n                }\n                that.model = model;\n                initPopOvers(element);\n                that.element.css('display', '');\n                if (that.options.initWidgets) {\n                    if (model) {\n                        kendo.bind(element, model, ui, kendo.ui, kendo.dataviz.ui);\n                    } else {\n                        mobile.init(element.children());\n                    }\n                }\n                that.element.css('display', 'none');\n            },\n            _id: function () {\n                var element = this.element, idAttrValue = element.attr('id') || '';\n                this.id = attrValue(element, 'url') || '#' + idAttrValue;\n                if (this.id == '#') {\n                    this.id = kendo.guid();\n                    element.attr('id', this.id);\n                }\n            },\n            _layout: function () {\n                var contentSelector = roleSelector('content'), element = this.element;\n                element.addClass('km-view');\n                this.header = element.children(roleSelector('header')).addClass('km-header');\n                this.footer = element.children(roleSelector('footer')).addClass('km-footer');\n                if (!element.children(contentSelector)[0]) {\n                    element.wrapInner('<div ' + attr('role') + '=\"content\"></div>');\n                }\n                this.content = element.children(roleSelector('content')).addClass('km-content');\n                this.element.prepend(this.header).append(this.footer);\n                this.layout = this.options.getLayout(this.layout);\n                if (this.layout) {\n                    this.layout.setup(this);\n                }\n            },\n            _overlay: function () {\n                this.overlay = $(UI_OVERLAY).appendTo(this.element);\n            },\n            _invokeNgController: function () {\n                var controller, scope;\n                if (this.options.$angular) {\n                    controller = this.element.controller();\n                    scope = this.options.$angular[0];\n                    if (controller) {\n                        var callback = $.proxy(this, '_callController', controller, scope);\n                        if (/^\\$(digest|apply)$/.test(scope.$$phase)) {\n                            callback();\n                        } else {\n                            scope.$apply(callback);\n                        }\n                    }\n                }\n            },\n            _callController: function (controller, scope) {\n                this.element.injector().invoke(controller.constructor, controller, { $scope: scope });\n            }\n        });\n        function initWidgets(collection) {\n            collection.each(function () {\n                kendo.initWidget($(this), {}, ui.roles);\n            });\n        }\n        var Layout = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                element = this.element;\n                this.header = element.children(this._locate('header')).addClass('km-header');\n                this.footer = element.children(this._locate('footer')).addClass('km-footer');\n                this.elements = this.header.add(this.footer);\n                initPopOvers(element);\n                if (!this.options.$angular) {\n                    kendo.mobile.init(this.element.children());\n                }\n                this.element.detach();\n                this.trigger(INIT, { layout: this });\n            },\n            _locate: function (selectors) {\n                return this.options.$angular ? directiveSelector(selectors) : roleSelector(selectors);\n            },\n            options: {\n                name: 'Layout',\n                id: null,\n                platform: null\n            },\n            events: [\n                INIT,\n                SHOW,\n                HIDE\n            ],\n            setup: function (view) {\n                if (!view.header[0]) {\n                    view.header = this.header;\n                }\n                if (!view.footer[0]) {\n                    view.footer = this.footer;\n                }\n            },\n            detach: function (view) {\n                var that = this;\n                if (view.header === that.header && that.header[0]) {\n                    view.element.prepend(that.header.detach()[0].cloneNode(true));\n                }\n                if (view.footer === that.footer && that.footer.length) {\n                    view.element.append(that.footer.detach()[0].cloneNode(true));\n                }\n            },\n            attach: function (view) {\n                var that = this, previousView = that.currentView;\n                if (previousView) {\n                    that.detach(previousView);\n                }\n                if (view.header === that.header) {\n                    that.header.detach();\n                    view.element.children(roleSelector('header')).remove();\n                    view.element.prepend(that.header);\n                }\n                if (view.footer === that.footer) {\n                    that.footer.detach();\n                    view.element.children(roleSelector('footer')).remove();\n                    view.element.append(that.footer);\n                }\n                that.trigger(SHOW, {\n                    layout: that,\n                    view: view\n                });\n                that.currentView = view;\n            }\n        });\n        var Observable = kendo.Observable, bodyRegExp = /<body[^>]*>(([\\u000a\\u000d\\u2028\\u2029]|.)*)<\\/body>/i, LOAD_START = 'loadStart', LOAD_COMPLETE = 'loadComplete', SHOW_START = 'showStart', SAME_VIEW_REQUESTED = 'sameViewRequested', VIEW_SHOW = 'viewShow', VIEW_TYPE_DETERMINED = 'viewTypeDetermined', AFTER = 'after';\n        var ViewEngine = Observable.extend({\n            init: function (options) {\n                var that = this, views, errorMessage, container, collection;\n                Observable.fn.init.call(that);\n                $.extend(that, options);\n                that.sandbox = $('<div />');\n                container = that.container;\n                views = that._hideViews(container);\n                that.rootView = views.first();\n                if (!that.rootView[0] && options.rootNeeded) {\n                    if (container[0] == kendo.mobile.application.element[0]) {\n                        errorMessage = 'Your kendo mobile application element does not contain any direct child elements with data-role=\"view\" attribute set. Make sure that you instantiate the mobile application using the correct container.';\n                    } else {\n                        errorMessage = 'Your pane element does not contain any direct child elements with data-role=\"view\" attribute set.';\n                    }\n                    throw new Error(errorMessage);\n                }\n                that.layouts = {};\n                that.viewContainer = new kendo.ViewContainer(that.container);\n                that.viewContainer.bind('accepted', function (e) {\n                    e.view.params = that.params;\n                });\n                that.viewContainer.bind('complete', function (e) {\n                    that.trigger(VIEW_SHOW, { view: e.view });\n                });\n                that.viewContainer.bind(AFTER, function () {\n                    that.trigger(AFTER);\n                });\n                this.getLayoutProxy = $.proxy(this, '_getLayout');\n                that._setupLayouts(container);\n                collection = container.children(that._locate('modalview drawer'));\n                if (that.$angular) {\n                    that.$angular[0].viewOptions = {\n                        defaultTransition: that.transition,\n                        loader: that.loader,\n                        container: that.container,\n                        getLayout: that.getLayoutProxy\n                    };\n                    collection.each(function (idx, element) {\n                        compileMobileDirective($(element), options.$angular[0]);\n                    });\n                } else {\n                    initWidgets(collection);\n                }\n                this.bind(this.events, options);\n            },\n            events: [\n                SHOW_START,\n                AFTER,\n                VIEW_SHOW,\n                LOAD_START,\n                LOAD_COMPLETE,\n                SAME_VIEW_REQUESTED,\n                VIEW_TYPE_DETERMINED\n            ],\n            destroy: function () {\n                kendo.destroy(this.container);\n                for (var id in this.layouts) {\n                    this.layouts[id].destroy();\n                }\n            },\n            view: function () {\n                return this.viewContainer.view;\n            },\n            showView: function (url, transition, params) {\n                url = url.replace(new RegExp('^' + this.remoteViewURLPrefix), '');\n                if (url === '' && this.remoteViewURLPrefix) {\n                    url = '/';\n                }\n                if (url.replace(/^#/, '') === this.url) {\n                    this.trigger(SAME_VIEW_REQUESTED);\n                    return false;\n                }\n                this.trigger(SHOW_START);\n                var that = this, showClosure = function (view) {\n                        return that.viewContainer.show(view, transition, url);\n                    }, element = that._findViewElement(url), view = kendo.widgetInstance(element);\n                that.url = url.replace(/^#/, '');\n                that.params = params;\n                if (view && view.reload) {\n                    view.purge();\n                    element = [];\n                }\n                this.trigger(VIEW_TYPE_DETERMINED, {\n                    remote: element.length === 0,\n                    url: url\n                });\n                if (element[0]) {\n                    if (!view) {\n                        view = that._createView(element);\n                    }\n                    return showClosure(view);\n                } else {\n                    if (this.serverNavigation) {\n                        location.href = url;\n                    } else {\n                        that._loadView(url, showClosure);\n                    }\n                    return true;\n                }\n            },\n            append: function (html, url) {\n                var sandbox = this.sandbox, urlPath = (url || '').split('?')[0], container = this.container, views, modalViews, view;\n                if (bodyRegExp.test(html)) {\n                    html = RegExp.$1;\n                }\n                sandbox[0].innerHTML = html;\n                container.append(sandbox.children('script, style'));\n                views = this._hideViews(sandbox);\n                view = views.first();\n                if (!view.length) {\n                    views = view = sandbox.wrapInner('<div data-role=view />').children();\n                }\n                if (urlPath) {\n                    view.hide().attr(attr('url'), urlPath);\n                }\n                this._setupLayouts(sandbox);\n                modalViews = sandbox.children(this._locate('modalview drawer'));\n                container.append(sandbox.children(this._locate('layout modalview drawer')).add(views));\n                initWidgets(modalViews);\n                return this._createView(view);\n            },\n            _locate: function (selectors) {\n                return this.$angular ? directiveSelector(selectors) : roleSelector(selectors);\n            },\n            _findViewElement: function (url) {\n                var element, urlPath = url.split('?')[0];\n                if (!urlPath) {\n                    return this.rootView;\n                }\n                element = this.container.children('[' + attr('url') + '=\\'' + urlPath + '\\']');\n                if (!element[0] && urlPath.indexOf('/') === -1) {\n                    element = this.container.children(urlPath.charAt(0) === '#' ? urlPath : '#' + urlPath);\n                }\n                return element;\n            },\n            _createView: function (element) {\n                if (this.$angular) {\n                    return compileMobileDirective(element, this.$angular[0]);\n                } else {\n                    return kendo.initWidget(element, {\n                        defaultTransition: this.transition,\n                        loader: this.loader,\n                        container: this.container,\n                        getLayout: this.getLayoutProxy,\n                        modelScope: this.modelScope,\n                        reload: attrValue(element, 'reload')\n                    }, ui.roles);\n                }\n            },\n            _getLayout: function (name) {\n                if (name === '') {\n                    return null;\n                }\n                return name ? this.layouts[name] : this.layouts[this.layout];\n            },\n            _loadView: function (url, callback) {\n                if (this._xhr) {\n                    this._xhr.abort();\n                }\n                this.trigger(LOAD_START);\n                this._xhr = $.get(kendo.absoluteURL(url, this.remoteViewURLPrefix), 'html').always($.proxy(this, '_xhrComplete', callback, url));\n            },\n            _xhrComplete: function (callback, url, response) {\n                var success = true;\n                if (typeof response === 'object') {\n                    if (response.status === 0) {\n                        if (response.responseText && response.responseText.length > 0) {\n                            success = true;\n                            response = response.responseText;\n                        } else {\n                            return;\n                        }\n                    }\n                }\n                this.trigger(LOAD_COMPLETE);\n                if (success) {\n                    callback(this.append(response, url));\n                }\n            },\n            _hideViews: function (container) {\n                return container.children(this._locate('view splitview')).hide();\n            },\n            _setupLayouts: function (element) {\n                var that = this, layout;\n                element.children(that._locate('layout')).each(function () {\n                    if (that.$angular) {\n                        layout = compileMobileDirective($(this), that.$angular[0]);\n                    } else {\n                        layout = kendo.initWidget($(this), {}, ui.roles);\n                    }\n                    var platform = layout.options.platform;\n                    if (!platform || platform === mobile.application.os.name) {\n                        that.layouts[layout.options.id] = layout;\n                    } else {\n                        layout.destroy();\n                    }\n                });\n            }\n        });\n        kendo.mobile.ViewEngine = ViewEngine;\n        ui.plugin(View);\n        ui.plugin(Layout);\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.loader', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.loader',\n        name: 'Loader',\n        category: 'mobile',\n        description: 'Mobile Loader',\n        depends: ['core'],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.mobile.ui, Widget = ui.Widget, CAPTURE_EVENTS = $.map(kendo.eventMap, function (value) {\n                return value;\n            }).join(' ').split(' ');\n        var Loader = Widget.extend({\n            init: function (container, options) {\n                var that = this, element = $('<div class=\"km-loader\"><span class=\"km-loading km-spin\"></span><span class=\"km-loading-left\"></span><span class=\"km-loading-right\"></span></div>');\n                Widget.fn.init.call(that, element, options);\n                that.container = container;\n                that.captureEvents = false;\n                that._attachCapture();\n                element.append(that.options.loading).hide().appendTo(container);\n            },\n            options: {\n                name: 'Loader',\n                loading: '<h1>Loading...</h1>',\n                timeout: 100\n            },\n            show: function () {\n                var that = this;\n                clearTimeout(that._loading);\n                if (that.options.loading === false) {\n                    return;\n                }\n                that.captureEvents = true;\n                that._loading = setTimeout(function () {\n                    that.element.show();\n                }, that.options.timeout);\n            },\n            hide: function () {\n                this.captureEvents = false;\n                clearTimeout(this._loading);\n                this.element.hide();\n            },\n            changeMessage: function (message) {\n                this.options.loading = message;\n                this.element.find('>h1').html(message);\n            },\n            transition: function () {\n                this.captureEvents = true;\n                this.container.css('pointer-events', 'none');\n            },\n            transitionDone: function () {\n                this.captureEvents = false;\n                this.container.css('pointer-events', '');\n            },\n            _attachCapture: function () {\n                var that = this;\n                that.captureEvents = false;\n                function capture(e) {\n                    if (that.captureEvents) {\n                        e.preventDefault();\n                    }\n                }\n                for (var i = 0; i < CAPTURE_EVENTS.length; i++) {\n                    that.container[0].addEventListener(CAPTURE_EVENTS[i], capture, true);\n                }\n            }\n        });\n        ui.plugin(Loader);\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.pane', [\n        'kendo.mobile.view',\n        'kendo.mobile.loader'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.pane',\n        name: 'Pane',\n        category: 'mobile',\n        description: 'Mobile Pane',\n        depends: [\n            'mobile.view',\n            'mobile.loader'\n        ],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, mobile = kendo.mobile, roleSelector = kendo.roleSelector, ui = mobile.ui, Widget = ui.Widget, ViewEngine = mobile.ViewEngine, View = ui.View, Loader = mobile.ui.Loader, EXTERNAL = 'external', HREF = 'href', DUMMY_HREF = '#!', NAVIGATE = 'navigate', VIEW_SHOW = 'viewShow', SAME_VIEW_REQUESTED = 'sameViewRequested', OS = kendo.support.mobileOS, SKIP_TRANSITION_ON_BACK_BUTTON = OS.ios && !OS.appMode && OS.flatVersion >= 700, WIDGET_RELS = /popover|actionsheet|modalview|drawer/, BACK = '#:back', attrValue = kendo.attrValue;\n        var Pane = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.element;\n                element.addClass('km-pane');\n                if (that.options.collapsible) {\n                    element.addClass('km-collapsible-pane');\n                }\n                this.history = [];\n                this.historyCallback = function (url, params, backButtonPressed) {\n                    var transition = that.transition;\n                    that.transition = null;\n                    if (SKIP_TRANSITION_ON_BACK_BUTTON && backButtonPressed) {\n                        transition = 'none';\n                    }\n                    return that.viewEngine.showView(url, transition, params);\n                };\n                this._historyNavigate = function (url) {\n                    if (url === BACK) {\n                        if (that.history.length === 1) {\n                            return;\n                        }\n                        that.history.pop();\n                        url = that.history[that.history.length - 1];\n                    } else {\n                        that.history.push(url);\n                    }\n                    that.historyCallback(url, kendo.parseQueryStringParams(url));\n                };\n                this._historyReplace = function (url) {\n                    var params = kendo.parseQueryStringParams(url);\n                    that.history[that.history.length - 1] = url;\n                    that.historyCallback(url, params);\n                };\n                that.loader = new Loader(element, { loading: that.options.loading });\n                that.viewEngine = new ViewEngine({\n                    container: element,\n                    transition: options.transition,\n                    modelScope: options.modelScope,\n                    rootNeeded: !options.initial,\n                    serverNavigation: options.serverNavigation,\n                    remoteViewURLPrefix: options.root || '',\n                    layout: options.layout,\n                    $angular: options.$angular,\n                    loader: that.loader,\n                    showStart: function () {\n                        that.loader.transition();\n                        that.closeActiveDialogs();\n                    },\n                    after: function () {\n                        that.loader.transitionDone();\n                    },\n                    viewShow: function (e) {\n                        that.trigger(VIEW_SHOW, e);\n                    },\n                    loadStart: function () {\n                        that.loader.show();\n                    },\n                    loadComplete: function () {\n                        that.loader.hide();\n                    },\n                    sameViewRequested: function () {\n                        that.trigger(SAME_VIEW_REQUESTED);\n                    },\n                    viewTypeDetermined: function (e) {\n                        if (!e.remote || !that.options.serverNavigation) {\n                            that.trigger(NAVIGATE, { url: e.url });\n                        }\n                    }\n                });\n                this._setPortraitWidth();\n                kendo.onResize(function () {\n                    that._setPortraitWidth();\n                });\n                that._setupAppLinks();\n            },\n            closeActiveDialogs: function () {\n                var dialogs = this.element.find(roleSelector('actionsheet popover modalview')).filter(':visible');\n                dialogs.each(function () {\n                    kendo.widgetInstance($(this), ui).close();\n                });\n            },\n            navigateToInitial: function () {\n                var initial = this.options.initial;\n                if (initial) {\n                    this.navigate(initial);\n                }\n                return initial;\n            },\n            options: {\n                name: 'Pane',\n                portraitWidth: '',\n                transition: '',\n                layout: '',\n                collapsible: false,\n                initial: null,\n                modelScope: window,\n                loading: '<h1>Loading...</h1>'\n            },\n            events: [\n                NAVIGATE,\n                VIEW_SHOW,\n                SAME_VIEW_REQUESTED\n            ],\n            append: function (html) {\n                return this.viewEngine.append(html);\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.viewEngine.destroy();\n                this.userEvents.destroy();\n            },\n            navigate: function (url, transition) {\n                if (url instanceof View) {\n                    url = url.id;\n                }\n                this.transition = transition;\n                this._historyNavigate(url);\n            },\n            replace: function (url, transition) {\n                if (url instanceof View) {\n                    url = url.id;\n                }\n                this.transition = transition;\n                this._historyReplace(url);\n            },\n            bindToRouter: function (router) {\n                var that = this, history = this.history, viewEngine = this.viewEngine;\n                router.bind('init', function (e) {\n                    var url = e.url, attrUrl = router.pushState ? url : '/';\n                    viewEngine.rootView.attr(kendo.attr('url'), attrUrl);\n                    var length = history.length;\n                    if (url === '/' && length) {\n                        router.navigate(history[length - 1], true);\n                        e.preventDefault();\n                    }\n                });\n                router.bind('routeMissing', function (e) {\n                    if (!that.historyCallback(e.url, e.params, e.backButtonPressed)) {\n                        e.preventDefault();\n                    }\n                });\n                router.bind('same', function () {\n                    that.trigger(SAME_VIEW_REQUESTED);\n                });\n                that._historyNavigate = function (url) {\n                    router.navigate(url);\n                };\n                that._historyReplace = function (url) {\n                    router.replace(url);\n                };\n            },\n            hideLoading: function () {\n                this.loader.hide();\n            },\n            showLoading: function () {\n                this.loader.show();\n            },\n            changeLoadingMessage: function (message) {\n                this.loader.changeMessage(message);\n            },\n            view: function () {\n                return this.viewEngine.view();\n            },\n            _setPortraitWidth: function () {\n                var width, portraitWidth = this.options.portraitWidth;\n                if (portraitWidth) {\n                    width = kendo.mobile.application.element.is('.km-vertical') ? portraitWidth : 'auto';\n                    this.element.css('width', width);\n                }\n            },\n            _setupAppLinks: function () {\n                var that = this, linkRoles = 'tab', pressedButtonSelector = '[data-' + kendo.ns + 'navigate-on-press]', buttonSelectors = $.map([\n                        'button',\n                        'backbutton',\n                        'detailbutton',\n                        'listview-link'\n                    ], function (role) {\n                        return roleSelector(role) + ':not(' + pressedButtonSelector + ')';\n                    }).join(',');\n                this.element.handler(this).on('down', roleSelector(linkRoles) + ',' + pressedButtonSelector, '_mouseup').on('click', roleSelector(linkRoles) + ',' + buttonSelectors + ',' + pressedButtonSelector, '_appLinkClick');\n                this.userEvents = new kendo.UserEvents(this.element, {\n                    fastTap: true,\n                    filter: buttonSelectors,\n                    tap: function (e) {\n                        e.event.currentTarget = e.touch.currentTarget;\n                        that._mouseup(e.event);\n                    }\n                });\n                this.element.css('-ms-touch-action', '');\n            },\n            _appLinkClick: function (e) {\n                var href = $(e.currentTarget).attr('href');\n                var remote = href && href[0] !== '#' && this.options.serverNavigation;\n                if (!remote && attrValue($(e.currentTarget), 'rel') != EXTERNAL) {\n                    e.preventDefault();\n                }\n            },\n            _mouseup: function (e) {\n                if (e.which > 1 || e.isDefaultPrevented()) {\n                    return;\n                }\n                var pane = this, link = $(e.currentTarget), transition = attrValue(link, 'transition'), rel = attrValue(link, 'rel') || '', target = attrValue(link, 'target'), href = link.attr(HREF), delayedTouchEnd = SKIP_TRANSITION_ON_BACK_BUTTON && link[0].offsetHeight === 0, remote = href && href[0] !== '#' && this.options.serverNavigation;\n                if (delayedTouchEnd || remote || rel === EXTERNAL || typeof href === 'undefined' || href === DUMMY_HREF) {\n                    return;\n                }\n                link.attr(HREF, DUMMY_HREF);\n                setTimeout(function () {\n                    link.attr(HREF, href);\n                });\n                if (rel.match(WIDGET_RELS)) {\n                    kendo.widgetInstance($(href), ui).openFor(link);\n                    if (rel === 'actionsheet' || rel === 'drawer') {\n                        e.stopPropagation();\n                    }\n                } else {\n                    if (target === '_top') {\n                        pane = mobile.application.pane;\n                    } else if (target) {\n                        pane = $('#' + target).data('kendoMobilePane');\n                    }\n                    pane.navigate(href, transition);\n                }\n                e.preventDefault();\n            }\n        });\n        Pane.wrap = function (element) {\n            if (!element.is(roleSelector('view'))) {\n                element = element.wrap('<div data-' + kendo.ns + 'role=\"view\" data-stretch=\"true\"></div>').parent();\n            }\n            var paneContainer = element.wrap('<div class=\"km-pane-wrapper\"><div></div></div>').parent(), pane = new Pane(paneContainer);\n            pane.navigate('');\n            return pane;\n        };\n        ui.plugin(Pane);\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.popover', [\n        'kendo.popup',\n        'kendo.mobile.pane'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.popover',\n        name: 'PopOver',\n        category: 'mobile',\n        description: 'The mobile PopOver widget represents a transient view which is displayed when the user taps on a navigational widget or area on the screen. ',\n        depends: [\n            'popup',\n            'mobile.pane'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, mobile = kendo.mobile, ui = mobile.ui, HIDE = 'hide', OPEN = 'open', CLOSE = 'close', WRAPPER = '<div class=\"km-popup-wrapper\" />', ARROW = '<div class=\"km-popup-arrow\" />', OVERLAY = '<div class=\"km-popup-overlay\" />', DIRECTION_CLASSES = 'km-up km-down km-left km-right', Widget = ui.Widget, DIRECTIONS = {\n                'down': {\n                    origin: 'bottom center',\n                    position: 'top center'\n                },\n                'up': {\n                    origin: 'top center',\n                    position: 'bottom center'\n                },\n                'left': {\n                    origin: 'center left',\n                    position: 'center right',\n                    collision: 'fit flip'\n                },\n                'right': {\n                    origin: 'center right',\n                    position: 'center left',\n                    collision: 'fit flip'\n                }\n            }, ANIMATION = {\n                animation: {\n                    open: {\n                        effects: 'fade:in',\n                        duration: 0\n                    },\n                    close: {\n                        effects: 'fade:out',\n                        duration: 400\n                    }\n                }\n            }, DIMENSIONS = {\n                'horizontal': {\n                    offset: 'top',\n                    size: 'height'\n                },\n                'vertical': {\n                    offset: 'left',\n                    size: 'width'\n                }\n            }, REVERSE = {\n                'up': 'down',\n                'down': 'up',\n                'left': 'right',\n                'right': 'left'\n            };\n        var Popup = Widget.extend({\n            init: function (element, options) {\n                var that = this, containerPopup = element.closest('.km-modalview-wrapper'), viewport = element.closest('.km-root').children('.km-pane').first(), container = containerPopup[0] ? containerPopup : viewport, popupOptions, axis;\n                if (options.viewport) {\n                    viewport = options.viewport;\n                } else if (!viewport[0]) {\n                    viewport = window;\n                }\n                if (options.container) {\n                    container = options.container;\n                } else if (!container[0]) {\n                    container = document.body;\n                }\n                popupOptions = {\n                    viewport: viewport,\n                    copyAnchorStyles: false,\n                    autosize: true,\n                    open: function () {\n                        that.overlay.show();\n                    },\n                    activate: $.proxy(that._activate, that),\n                    deactivate: function () {\n                        that.overlay.hide();\n                        if (!that._apiCall) {\n                            that.trigger(HIDE);\n                        }\n                        that._apiCall = false;\n                    }\n                };\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                element.wrap(WRAPPER).addClass('km-popup').show();\n                axis = that.options.direction.match(/left|right/) ? 'horizontal' : 'vertical';\n                that.dimensions = DIMENSIONS[axis];\n                that.wrapper = element.parent().css({\n                    width: options.width,\n                    height: options.height\n                }).addClass('km-popup-wrapper km-' + options.direction).hide();\n                that.arrow = $(ARROW).prependTo(that.wrapper).hide();\n                that.overlay = $(OVERLAY).appendTo(container).hide();\n                popupOptions.appendTo = that.overlay;\n                if (options.className) {\n                    that.overlay.addClass(options.className);\n                }\n                that.popup = new kendo.ui.Popup(that.wrapper, $.extend(true, popupOptions, ANIMATION, DIRECTIONS[options.direction]));\n            },\n            options: {\n                name: 'Popup',\n                width: 240,\n                height: '',\n                direction: 'down',\n                container: null,\n                viewport: null\n            },\n            events: [HIDE],\n            show: function (target) {\n                this.popup.options.anchor = $(target);\n                this.popup.open();\n            },\n            hide: function () {\n                this._apiCall = true;\n                this.popup.close();\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.popup.destroy();\n                this.overlay.remove();\n            },\n            target: function () {\n                return this.popup.options.anchor;\n            },\n            _activate: function () {\n                var that = this, direction = that.options.direction, dimensions = that.dimensions, offset = dimensions.offset, popup = that.popup, anchor = popup.options.anchor, anchorOffset = $(anchor).offset(), elementOffset = $(popup.element).offset(), cssClass = popup.flipped ? REVERSE[direction] : direction, min = that.arrow[dimensions.size]() * 2, max = that.element[dimensions.size]() - that.arrow[dimensions.size](), size = $(anchor)[dimensions.size](), offsetAmount = anchorOffset[offset] - elementOffset[offset] + size / 2;\n                if (offsetAmount < min) {\n                    offsetAmount = min;\n                }\n                if (offsetAmount > max) {\n                    offsetAmount = max;\n                }\n                that.wrapper.removeClass(DIRECTION_CLASSES).addClass('km-' + cssClass);\n                that.arrow.css(offset, offsetAmount).show();\n            }\n        });\n        var PopOver = Widget.extend({\n            init: function (element, options) {\n                var that = this, popupOptions;\n                that.initialOpen = false;\n                Widget.fn.init.call(that, element, options);\n                popupOptions = $.extend({\n                    className: 'km-popover-root',\n                    hide: function () {\n                        that.trigger(CLOSE);\n                    }\n                }, this.options.popup);\n                that.popup = new Popup(that.element, popupOptions);\n                that.popup.overlay.on('move', function (e) {\n                    if (e.target == that.popup.overlay[0]) {\n                        e.preventDefault();\n                    }\n                });\n                that.pane = new ui.Pane(that.element, $.extend(this.options.pane, { $angular: this.options.$angular }));\n                kendo.notify(that, ui);\n            },\n            options: {\n                name: 'PopOver',\n                popup: {},\n                pane: {}\n            },\n            events: [\n                OPEN,\n                CLOSE\n            ],\n            open: function (target) {\n                this.popup.show(target);\n                if (!this.initialOpen) {\n                    if (!this.pane.navigateToInitial()) {\n                        this.pane.navigate('');\n                    }\n                    this.popup.popup._position();\n                    this.initialOpen = true;\n                } else {\n                    this.pane.view()._invokeNgController();\n                }\n            },\n            openFor: function (target) {\n                this.open(target);\n                this.trigger(OPEN, { target: this.popup.target() });\n            },\n            close: function () {\n                this.popup.hide();\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.pane.destroy();\n                this.popup.destroy();\n                kendo.destroy(this.element);\n            }\n        });\n        ui.plugin(Popup);\n        ui.plugin(PopOver);\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.shim', ['kendo.popup'], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.shim',\n        name: 'Shim',\n        category: 'mobile',\n        description: 'Mobile Shim',\n        depends: ['popup'],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.mobile.ui, Popup = kendo.ui.Popup, SHIM = '<div class=\"km-shim\"/>', HIDE = 'hide', Widget = ui.Widget;\n        var Shim = Widget.extend({\n            init: function (element, options) {\n                var that = this, app = kendo.mobile.application, os = kendo.support.mobileOS, osname = app ? app.os.name : os ? os.name : 'ios', ioswp = osname === 'ios' || osname === 'wp' || (app ? app.os.skin : false), bb = osname === 'blackberry', align = options.align || (ioswp ? 'bottom center' : bb ? 'center right' : 'center center'), position = options.position || (ioswp ? 'bottom center' : bb ? 'center right' : 'center center'), effect = options.effect || (ioswp ? 'slideIn:up' : bb ? 'slideIn:left' : 'fade:in'), shim = $(SHIM).handler(that).hide();\n                Widget.fn.init.call(that, element, options);\n                that.shim = shim;\n                element = that.element;\n                options = that.options;\n                if (options.className) {\n                    that.shim.addClass(options.className);\n                }\n                if (!options.modal) {\n                    that.shim.on('down', '_hide');\n                }\n                (app ? app.element : $(document.body)).append(shim);\n                that.popup = new Popup(that.element, {\n                    anchor: shim,\n                    modal: true,\n                    appendTo: shim,\n                    origin: align,\n                    position: position,\n                    animation: {\n                        open: {\n                            effects: effect,\n                            duration: options.duration\n                        },\n                        close: { duration: options.duration }\n                    },\n                    close: function (e) {\n                        var prevented = false;\n                        if (!that._apiCall) {\n                            prevented = that.trigger(HIDE);\n                        }\n                        if (prevented) {\n                            e.preventDefault();\n                        }\n                        that._apiCall = false;\n                    },\n                    deactivate: function () {\n                        shim.hide();\n                    },\n                    open: function () {\n                        shim.show();\n                    }\n                });\n                kendo.notify(that);\n            },\n            events: [HIDE],\n            options: {\n                name: 'Shim',\n                modal: false,\n                align: undefined,\n                position: undefined,\n                effect: undefined,\n                duration: 200\n            },\n            show: function () {\n                this.popup.open();\n            },\n            hide: function () {\n                this._apiCall = true;\n                this.popup.close();\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.shim.kendoDestroy();\n                this.popup.destroy();\n                this.shim.remove();\n            },\n            _hide: function (e) {\n                if (!e || !$.contains(this.shim.children().children('.k-popup')[0], e.target)) {\n                    this.popup.close();\n                }\n            }\n        });\n        ui.plugin(Shim);\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.modalview', [\n        'kendo.mobile.shim',\n        'kendo.mobile.view'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.modalview',\n        name: 'ModalView',\n        category: 'mobile',\n        description: 'The Kendo ModalView is used to present self-contained functionality in the context of the current task.',\n        depends: [\n            'mobile.shim',\n            'mobile.view'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.mobile.ui, Shim = ui.Shim, Widget = ui.Widget, BEFORE_OPEN = 'beforeOpen', OPEN = 'open', CLOSE = 'close', INIT = 'init', WRAP = '<div class=\"km-modalview-wrapper\" />';\n        var ModalView = ui.View.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that._id();\n                that._wrap();\n                that._shim();\n                if (!this.options.$angular) {\n                    that._layout();\n                    that._scroller();\n                    that._model();\n                }\n                that.element.css('display', '');\n                that.trigger(INIT);\n            },\n            events: [\n                INIT,\n                BEFORE_OPEN,\n                OPEN,\n                CLOSE\n            ],\n            options: {\n                name: 'ModalView',\n                modal: true,\n                width: null,\n                height: null\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.shim.destroy();\n            },\n            open: function (target) {\n                var that = this;\n                that.target = $(target);\n                that.shim.show();\n                that._invokeNgController();\n                that.trigger('show', { view: that });\n            },\n            openFor: function (target) {\n                if (!this.trigger(BEFORE_OPEN, { target: target })) {\n                    this.open(target);\n                    this.trigger(OPEN, { target: target });\n                }\n            },\n            close: function () {\n                if (this.element.is(':visible') && !this.trigger(CLOSE)) {\n                    this.shim.hide();\n                }\n            },\n            _wrap: function () {\n                var that = this, element = that.element, options = that.options, width, height;\n                width = element[0].style.width || 'auto';\n                height = element[0].style.height || 'auto';\n                element.addClass('km-modalview').wrap(WRAP);\n                that.wrapper = element.parent().css({\n                    width: options.width || width || 300,\n                    height: options.height || height || 300\n                }).addClass(height == 'auto' ? ' km-auto-height' : '');\n                element.css({\n                    width: '',\n                    height: ''\n                });\n            },\n            _shim: function () {\n                var that = this;\n                that.shim = new Shim(that.wrapper, {\n                    modal: that.options.modal,\n                    position: 'center center',\n                    align: 'center center',\n                    effect: 'fade:in',\n                    className: 'km-modalview-root',\n                    hide: function (e) {\n                        if (that.trigger(CLOSE)) {\n                            e.preventDefault();\n                        }\n                    }\n                });\n            }\n        });\n        ui.plugin(ModalView);\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.drawer', [\n        'kendo.mobile.view',\n        'kendo.userevents'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.drawer',\n        name: 'Drawer',\n        category: 'mobile',\n        description: 'The Kendo Mobile Drawer widget provides slide to reveal global application toolbox',\n        depends: [\n            'mobile.view',\n            'userevents'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, mobile = kendo.mobile, os = kendo.support.mobileOS, Transition = kendo.effects.Transition, roleSelector = kendo.roleSelector, AXIS = 'x', ui = mobile.ui, SWIPE_TO_OPEN = !(os.ios && os.majorVersion == 7 && !os.appMode), BEFORE_SHOW = 'beforeShow', INIT = 'init', SHOW = 'show', HIDE = 'hide', AFTER_HIDE = 'afterHide', NULL_VIEW = { enable: $.noop };\n        var Drawer = ui.View.extend({\n            init: function (element, options) {\n                $(element).parent().prepend(element);\n                mobile.ui.Widget.fn.init.call(this, element, options);\n                if (!this.options.$angular) {\n                    this._layout();\n                    this._scroller();\n                }\n                this._model();\n                var pane = this.element.closest(roleSelector('pane')).data('kendoMobilePane'), userEvents;\n                if (pane) {\n                    this.pane = pane;\n                    this.pane.bind('viewShow', function (e) {\n                        drawer._viewShow(e);\n                    });\n                    this.pane.bind('sameViewRequested', function () {\n                        drawer.hide();\n                    });\n                    userEvents = this.userEvents = new kendo.UserEvents(pane.element, {\n                        fastTap: true,\n                        filter: roleSelector('view splitview'),\n                        allowSelection: true\n                    });\n                } else {\n                    this.currentView = NULL_VIEW;\n                    var container = $(this.options.container);\n                    if (!container) {\n                        throw new Error('The drawer needs a container configuration option set.');\n                    }\n                    userEvents = this.userEvents = new kendo.UserEvents(container, {\n                        fastTap: true,\n                        allowSelection: true\n                    });\n                    this._attachTransition(container);\n                }\n                var drawer = this;\n                var hide = function (e) {\n                    if (drawer.visible) {\n                        drawer.hide();\n                        e.preventDefault();\n                    }\n                };\n                if (this.options.swipeToOpen && SWIPE_TO_OPEN) {\n                    userEvents.bind('press', function () {\n                        drawer.transition.cancel();\n                    });\n                    userEvents.bind('start', function (e) {\n                        drawer._start(e);\n                    });\n                    userEvents.bind('move', function (e) {\n                        drawer._update(e);\n                    });\n                    userEvents.bind('end', function (e) {\n                        drawer._end(e);\n                    });\n                    userEvents.bind('tap', hide);\n                } else {\n                    userEvents.bind('press', hide);\n                }\n                this.leftPositioned = this.options.position === 'left';\n                this.visible = false;\n                this.element.hide().addClass('km-drawer').addClass(this.leftPositioned ? 'km-left-drawer' : 'km-right-drawer');\n                this.trigger(INIT);\n            },\n            options: {\n                name: 'Drawer',\n                position: 'left',\n                views: [],\n                swipeToOpenViews: [],\n                swipeToOpen: true,\n                title: '',\n                container: null\n            },\n            events: [\n                BEFORE_SHOW,\n                HIDE,\n                AFTER_HIDE,\n                INIT,\n                SHOW\n            ],\n            show: function () {\n                if (this._activate()) {\n                    this._show();\n                }\n            },\n            hide: function () {\n                if (!this.currentView) {\n                    return;\n                }\n                this.currentView.enable();\n                Drawer.current = null;\n                this._moveViewTo(0);\n                this.trigger(HIDE, { view: this });\n            },\n            openFor: function () {\n                if (this.visible) {\n                    this.hide();\n                } else {\n                    this.show();\n                }\n            },\n            destroy: function () {\n                ui.View.fn.destroy.call(this);\n                this.userEvents.destroy();\n            },\n            _activate: function () {\n                if (this.visible) {\n                    return true;\n                }\n                var visibleOnCurrentView = this._currentViewIncludedIn(this.options.views);\n                if (!visibleOnCurrentView || this.trigger(BEFORE_SHOW, { view: this })) {\n                    return false;\n                }\n                this._setAsCurrent();\n                this.element.show();\n                this.trigger(SHOW, { view: this });\n                this._invokeNgController();\n                return true;\n            },\n            _currentViewIncludedIn: function (views) {\n                if (!this.pane || !views.length) {\n                    return true;\n                }\n                var view = this.pane.view();\n                return $.inArray(view.id.replace('#', ''), views) > -1 || $.inArray(view.element.attr('id'), views) > -1;\n            },\n            _show: function () {\n                this.currentView.enable(false);\n                this.visible = true;\n                var offset = this.element.width();\n                if (!this.leftPositioned) {\n                    offset = -offset;\n                }\n                this._moveViewTo(offset);\n            },\n            _setAsCurrent: function () {\n                if (Drawer.last !== this) {\n                    if (Drawer.last) {\n                        Drawer.last.element.hide();\n                    }\n                    this.element.show();\n                }\n                Drawer.last = this;\n                Drawer.current = this;\n            },\n            _moveViewTo: function (offset) {\n                this.userEvents.cancel();\n                this.transition.moveTo({\n                    location: offset,\n                    duration: 400,\n                    ease: Transition.easeOutExpo\n                });\n            },\n            _viewShow: function (e) {\n                if (this.currentView) {\n                    this.currentView.enable();\n                }\n                if (this.currentView === e.view) {\n                    this.hide();\n                    return;\n                }\n                this.currentView = e.view;\n                this._attachTransition(e.view.element);\n            },\n            _attachTransition: function (element) {\n                var that = this, movable = this.movable, currentOffset = movable && movable.x;\n                if (this.transition) {\n                    this.transition.cancel();\n                    this.movable.moveAxis('x', 0);\n                }\n                movable = this.movable = new kendo.ui.Movable(element);\n                this.transition = new Transition({\n                    axis: AXIS,\n                    movable: this.movable,\n                    onEnd: function () {\n                        if (movable[AXIS] === 0) {\n                            element[0].style.cssText = '';\n                            that.element.hide();\n                            that.trigger(AFTER_HIDE);\n                            that.visible = false;\n                        }\n                    }\n                });\n                if (currentOffset) {\n                    element.addClass('k-fx-hidden');\n                    kendo.animationFrame(function () {\n                        element.removeClass('k-fx-hidden');\n                        that.movable.moveAxis(AXIS, currentOffset);\n                        that.hide();\n                    });\n                }\n            },\n            _start: function (e) {\n                var userEvents = e.sender;\n                if (Math.abs(e.x.velocity) < Math.abs(e.y.velocity) || kendo.triggeredByInput(e.event) || !this._currentViewIncludedIn(this.options.swipeToOpenViews)) {\n                    userEvents.cancel();\n                    return;\n                }\n                var leftPositioned = this.leftPositioned, visible = this.visible, canMoveLeft = leftPositioned && visible || !leftPositioned && !Drawer.current, canMoveRight = !leftPositioned && visible || leftPositioned && !Drawer.current, leftSwipe = e.x.velocity < 0;\n                if (canMoveLeft && leftSwipe || canMoveRight && !leftSwipe) {\n                    if (this._activate()) {\n                        userEvents.capture();\n                        return;\n                    }\n                }\n                userEvents.cancel();\n            },\n            _update: function (e) {\n                var movable = this.movable, newPosition = movable.x + e.x.delta, limitedPosition;\n                if (this.leftPositioned) {\n                    limitedPosition = Math.min(Math.max(0, newPosition), this.element.width());\n                } else {\n                    limitedPosition = Math.max(Math.min(0, newPosition), -this.element.width());\n                }\n                this.movable.moveAxis(AXIS, limitedPosition);\n                e.event.preventDefault();\n                e.event.stopPropagation();\n            },\n            _end: function (e) {\n                var velocity = e.x.velocity, pastHalf = Math.abs(this.movable.x) > this.element.width() / 2, velocityThreshold = 0.8, shouldShow;\n                if (this.leftPositioned) {\n                    shouldShow = velocity > -velocityThreshold && (velocity > velocityThreshold || pastHalf);\n                } else {\n                    shouldShow = velocity < velocityThreshold && (velocity < -velocityThreshold || pastHalf);\n                }\n                if (shouldShow) {\n                    this._show();\n                } else {\n                    this.hide();\n                }\n            }\n        });\n        ui.plugin(Drawer);\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.splitview', ['kendo.mobile.pane'], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.splitview',\n        name: 'SplitView',\n        category: 'mobile',\n        description: 'The mobile SplitView is a tablet-specific view that consists of two or more mobile Pane widgets.',\n        depends: ['mobile.pane']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.mobile.ui, Widget = ui.Widget, EXPANED_PANE_SHIM = '<div class=\\'km-expanded-pane-shim\\' />', View = ui.View;\n        var SplitView = View.extend({\n            init: function (element, options) {\n                var that = this, pane, modalViews;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                $.extend(that, options);\n                that._id();\n                if (!that.options.$angular) {\n                    that._layout();\n                    that._overlay();\n                } else {\n                    that._overlay();\n                }\n                that._style();\n                modalViews = element.children(that._locate('modalview'));\n                if (!that.options.$angular) {\n                    kendo.mobile.init(modalViews);\n                } else {\n                    modalViews.each(function (idx, element) {\n                        kendo.compileMobileDirective($(element), options.$angular[0]);\n                    });\n                }\n                that.panes = [];\n                that._paramsHistory = [];\n                if (!that.options.$angular) {\n                    that.content.children(kendo.roleSelector('pane')).each(function () {\n                        pane = kendo.initWidget(this, {}, ui.roles);\n                        that.panes.push(pane);\n                    });\n                } else {\n                    that.element.children(kendo.directiveSelector('pane')).each(function () {\n                        pane = kendo.compileMobileDirective($(this), options.$angular[0]);\n                        that.panes.push(pane);\n                    });\n                    that.element.children(kendo.directiveSelector('header footer')).each(function () {\n                        kendo.compileMobileDirective($(this), options.$angular[0]);\n                    });\n                }\n                that.expandedPaneShim = $(EXPANED_PANE_SHIM).appendTo(that.element);\n                that._shimUserEvents = new kendo.UserEvents(that.expandedPaneShim, {\n                    fastTap: true,\n                    tap: function () {\n                        that.collapsePanes();\n                    }\n                });\n            },\n            _locate: function (selectors) {\n                return this.options.$angular ? kendo.directiveSelector(selectors) : kendo.roleSelector(selectors);\n            },\n            options: {\n                name: 'SplitView',\n                style: 'horizontal'\n            },\n            expandPanes: function () {\n                this.element.addClass('km-expanded-splitview');\n            },\n            collapsePanes: function () {\n                this.element.removeClass('km-expanded-splitview');\n            },\n            _layout: function () {\n                var that = this, element = that.element;\n                that.transition = kendo.attrValue(element, 'transition');\n                kendo.mobile.ui.View.prototype._layout.call(this);\n                kendo.mobile.init(this.header.add(this.footer));\n                that.element.addClass('km-splitview');\n                that.content.addClass('km-split-content');\n            },\n            _style: function () {\n                var style = this.options.style, element = this.element, styles;\n                if (style) {\n                    styles = style.split(' ');\n                    $.each(styles, function () {\n                        element.addClass('km-split-' + this);\n                    });\n                }\n            },\n            showStart: function () {\n                var that = this;\n                that.element.css('display', '');\n                if (!that.inited) {\n                    that.inited = true;\n                    $.each(that.panes, function () {\n                        if (this.options.initial) {\n                            this.navigateToInitial();\n                        } else {\n                            this.navigate('');\n                        }\n                    });\n                    that.trigger('init', { view: that });\n                } else {\n                    this._invokeNgController();\n                }\n                that.trigger('show', { view: that });\n            }\n        });\n        ui.plugin(SplitView);\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.application', [\n        'kendo.mobile.pane',\n        'kendo.router'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.application',\n        name: 'Application',\n        category: 'mobile',\n        description: 'The Mobile application provides a framework to build native looking web applications on mobile devices.',\n        depends: [\n            'mobile.pane',\n            'router'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, mobile = kendo.mobile, support = kendo.support, Widget = mobile.ui.Widget, Pane = mobile.ui.Pane, DEFAULT_OS = 'ios7', OS = support.mobileOS, BERRYPHONEGAP = OS.device == 'blackberry' && OS.flatVersion >= 600 && OS.flatVersion < 1000 && OS.appMode, FONT_SIZE_COEF = 0.93, VERTICAL = 'km-vertical', CHROME = OS.browser === 'chrome', BROKEN_WEBVIEW_RESIZE = OS.ios && OS.flatVersion >= 700 && OS.flatVersion < 800 && (OS.appMode || CHROME), INITIALLY_HORIZONTAL = Math.abs(window.orientation) / 90 == 1, HORIZONTAL = 'km-horizontal', MOBILE_PLATFORMS = {\n                ios7: {\n                    ios: true,\n                    browser: 'default',\n                    device: 'iphone',\n                    flatVersion: '700',\n                    majorVersion: '7',\n                    minorVersion: '0.0',\n                    name: 'ios',\n                    tablet: false\n                },\n                ios: {\n                    ios: true,\n                    browser: 'default',\n                    device: 'iphone',\n                    flatVersion: '612',\n                    majorVersion: '6',\n                    minorVersion: '1.2',\n                    name: 'ios',\n                    tablet: false\n                },\n                android: {\n                    android: true,\n                    browser: 'default',\n                    device: 'android',\n                    flatVersion: '442',\n                    majorVersion: '4',\n                    minorVersion: '4.2',\n                    name: 'android',\n                    tablet: false\n                },\n                blackberry: {\n                    blackberry: true,\n                    browser: 'default',\n                    device: 'blackberry',\n                    flatVersion: '710',\n                    majorVersion: '7',\n                    minorVersion: '1.0',\n                    name: 'blackberry',\n                    tablet: false\n                },\n                meego: {\n                    meego: true,\n                    browser: 'default',\n                    device: 'meego',\n                    flatVersion: '850',\n                    majorVersion: '8',\n                    minorVersion: '5.0',\n                    name: 'meego',\n                    tablet: false\n                },\n                wp: {\n                    wp: true,\n                    browser: 'default',\n                    device: 'wp',\n                    flatVersion: '800',\n                    majorVersion: '8',\n                    minorVersion: '0.0',\n                    name: 'wp',\n                    tablet: false\n                }\n            }, viewportTemplate = kendo.template('<meta content=\"initial-scale=#: data.scale #, maximum-scale=#: data.scale #, user-scalable=no#=data.height#\" name=\"viewport\" />', { usedWithBlock: false }), systemMeta = kendo.template('<meta name=\"apple-mobile-web-app-capable\" content=\"#= data.webAppCapable === false ? \\'no\\' : \\'yes\\' #\" /> ' + '<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"#=data.statusBarStyle#\" /> ' + '<meta name=\"msapplication-tap-highlight\" content=\"no\" /> ', { usedWithBlock: false }), clipTemplate = kendo.template('<style>.km-view { clip: rect(0 #= data.width #px #= data.height #px 0); }</style>', { usedWithBlock: false }), ENABLE_CLIP = OS.android && OS.browser != 'chrome' || OS.blackberry, iconMeta = kendo.template('<link rel=\"apple-touch-icon' + (OS.android ? '-precomposed' : '') + '\" # if(data.size) { # sizes=\"#=data.size#\" #}# href=\"#=data.icon#\" />', { usedWithBlock: false }), HIDEBAR = (OS.device == 'iphone' || OS.device == 'ipod') && OS.majorVersion < 7, SUPPORT_SWIPE_TO_GO_BACK = (OS.device == 'iphone' || OS.device == 'ipod') && OS.majorVersion >= 7, HISTORY_TRANSITION = SUPPORT_SWIPE_TO_GO_BACK ? 'none' : null, BARCOMPENSATION = OS.browser == 'mobilesafari' ? 60 : 0, STATUS_BAR_HEIGHT = 20, WINDOW = $(window), SCREEN = window.screen, HEAD = $('head'), INIT = 'init', proxy = $.proxy;\n        function osCssClass(os, options) {\n            var classes = [];\n            if (OS) {\n                classes.push('km-on-' + OS.name);\n            }\n            if (os.skin) {\n                classes.push('km-' + os.skin);\n            } else {\n                if (os.name == 'ios' && os.majorVersion > 6) {\n                    classes.push('km-ios7');\n                } else {\n                    classes.push('km-' + os.name);\n                }\n            }\n            if (os.name == 'ios' && os.majorVersion < 7 || os.name != 'ios') {\n                classes.push('km-' + os.name + os.majorVersion);\n            }\n            classes.push('km-' + os.majorVersion);\n            classes.push('km-m' + (os.minorVersion ? os.minorVersion[0] : 0));\n            if (os.variant && (os.skin && os.skin === os.name || !os.skin || os.setDefaultPlatform === false)) {\n                classes.push('km-' + (os.skin ? os.skin : os.name) + '-' + os.variant);\n            }\n            if (os.cordova) {\n                classes.push('km-cordova');\n            }\n            if (os.appMode) {\n                classes.push('km-app');\n            } else {\n                classes.push('km-web');\n            }\n            if (options && options.statusBarStyle) {\n                classes.push('km-' + options.statusBarStyle + '-status-bar');\n            }\n            return classes.join(' ');\n        }\n        function wp8Background(os) {\n            return 'km-wp-' + (os.noVariantSet ? parseInt($('<div style=\\'background: Background\\' />').css('background-color').split(',')[1], 10) === 0 ? 'dark' : 'light' : os.variant + ' km-wp-' + os.variant + '-force');\n        }\n        function isOrientationHorizontal(element) {\n            return OS.wp ? element.css('animation-name') == '-kendo-landscape' : Math.abs(window.orientation) / 90 == 1;\n        }\n        function getOrientationClass(element) {\n            return isOrientationHorizontal(element) ? HORIZONTAL : VERTICAL;\n        }\n        function setMinimumHeight(pane) {\n            pane.parent().addBack().css('min-height', window.innerHeight);\n        }\n        function applyViewportHeight() {\n            $('meta[name=viewport]').remove();\n            HEAD.append(viewportTemplate({ height: ', width=device-width' + (isOrientationHorizontal() ? ', height=' + window.innerHeight + 'px' : support.mobileOS.flatVersion >= 600 && support.mobileOS.flatVersion < 700 ? ', height=' + window.innerWidth + 'px' : ', height=device-height') }));\n        }\n        var Application = Widget.extend({\n            init: function (element, options) {\n                mobile.application = this;\n                $($.proxy(this, 'bootstrap', element, options));\n            },\n            bootstrap: function (element, options) {\n                element = $(element);\n                if (!element[0]) {\n                    element = $(document.body);\n                }\n                Widget.fn.init.call(this, element, options);\n                this.element.removeAttr('data-' + kendo.ns + 'role');\n                this._setupPlatform();\n                this._attachMeta();\n                this._setupElementClass();\n                this._attachHideBarHandlers();\n                var paneOptions = $.extend({}, this.options);\n                delete paneOptions.name;\n                var that = this, startHistory = function () {\n                        that.pane = new Pane(that.element, paneOptions);\n                        that.pane.navigateToInitial();\n                        if (that.options.updateDocumentTitle) {\n                            that._setupDocumentTitle();\n                        }\n                        that._startHistory();\n                        that.trigger(INIT);\n                    };\n                if (this.options.$angular) {\n                    setTimeout(startHistory);\n                } else {\n                    startHistory();\n                }\n            },\n            options: {\n                name: 'Application',\n                hideAddressBar: true,\n                browserHistory: true,\n                historyTransition: HISTORY_TRANSITION,\n                modelScope: window,\n                statusBarStyle: 'black',\n                transition: '',\n                retina: false,\n                platform: null,\n                skin: null,\n                updateDocumentTitle: true,\n                useNativeScrolling: false\n            },\n            events: [INIT],\n            navigate: function (url, transition) {\n                this.pane.navigate(url, transition);\n            },\n            replace: function (url, transition) {\n                this.pane.replace(url, transition);\n            },\n            scroller: function () {\n                return this.view().scroller;\n            },\n            hideLoading: function () {\n                if (this.pane) {\n                    this.pane.hideLoading();\n                } else {\n                    throw new Error('The mobile application instance is not fully instantiated. Please consider activating loading in the application init event handler.');\n                }\n            },\n            showLoading: function () {\n                if (this.pane) {\n                    this.pane.showLoading();\n                } else {\n                    throw new Error('The mobile application instance is not fully instantiated. Please consider activating loading in the application init event handler.');\n                }\n            },\n            changeLoadingMessage: function (message) {\n                if (this.pane) {\n                    this.pane.changeLoadingMessage(message);\n                } else {\n                    throw new Error('The mobile application instance is not fully instantiated. Please consider changing the message in the application init event handler.');\n                }\n            },\n            view: function () {\n                return this.pane.view();\n            },\n            skin: function (skin) {\n                var that = this;\n                if (!arguments.length) {\n                    return that.options.skin;\n                }\n                that.options.skin = skin || '';\n                that.element[0].className = 'km-pane';\n                that._setupPlatform();\n                that._setupElementClass();\n                return that.options.skin;\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.pane.destroy();\n                if (this.options.browserHistory) {\n                    this.router.destroy();\n                }\n            },\n            _setupPlatform: function () {\n                var that = this, platform = that.options.platform, skin = that.options.skin, split = [], os = OS || MOBILE_PLATFORMS[DEFAULT_OS];\n                if (platform) {\n                    os.setDefaultPlatform = true;\n                    if (typeof platform === 'string') {\n                        split = platform.split('-');\n                        os = $.extend({ variant: split[1] }, os, MOBILE_PLATFORMS[split[0]]);\n                    } else {\n                        os = platform;\n                    }\n                }\n                if (skin) {\n                    split = skin.split('-');\n                    if (!OS) {\n                        os.setDefaultPlatform = false;\n                    }\n                    os = $.extend({}, os, {\n                        skin: split[0],\n                        variant: split[1]\n                    });\n                }\n                if (!os.variant) {\n                    os.noVariantSet = true;\n                    os.variant = 'dark';\n                }\n                that.os = os;\n                that.osCssClass = osCssClass(that.os, that.options);\n                if (os.name == 'wp') {\n                    if (!that.refreshBackgroundColorProxy) {\n                        that.refreshBackgroundColorProxy = $.proxy(function () {\n                            if (that.os.variant && (that.os.skin && that.os.skin === that.os.name) || !that.os.skin) {\n                                that.element.removeClass('km-wp-dark km-wp-light km-wp-dark-force km-wp-light-force').addClass(wp8Background(that.os));\n                            }\n                        }, that);\n                    }\n                    $(document).off('visibilitychange', that.refreshBackgroundColorProxy);\n                    $(document).off('resume', that.refreshBackgroundColorProxy);\n                    if (!os.skin) {\n                        that.element.parent().css('overflow', 'hidden');\n                        $(document).on('visibilitychange', that.refreshBackgroundColorProxy);\n                        $(document).on('resume', that.refreshBackgroundColorProxy);\n                        that.refreshBackgroundColorProxy();\n                    }\n                }\n            },\n            _startHistory: function () {\n                if (this.options.browserHistory) {\n                    this.router = new kendo.Router({\n                        pushState: this.options.pushState,\n                        root: this.options.root,\n                        hashBang: this.options.hashBang\n                    });\n                    this.pane.bindToRouter(this.router);\n                    this.router.start();\n                } else {\n                    if (!this.options.initial) {\n                        this.pane.navigate('');\n                    }\n                }\n            },\n            _resizeToScreenHeight: function () {\n                var includeStatusBar = $('meta[name=apple-mobile-web-app-status-bar-style]').attr('content').match(/black-translucent|hidden/), element = this.element, height;\n                if (CHROME) {\n                    height = window.innerHeight;\n                } else {\n                    if (isOrientationHorizontal(element)) {\n                        if (includeStatusBar) {\n                            if (INITIALLY_HORIZONTAL) {\n                                height = SCREEN.availWidth + STATUS_BAR_HEIGHT;\n                            } else {\n                                height = SCREEN.availWidth;\n                            }\n                        } else {\n                            if (INITIALLY_HORIZONTAL) {\n                                height = SCREEN.availWidth;\n                            } else {\n                                height = SCREEN.availWidth - STATUS_BAR_HEIGHT;\n                            }\n                        }\n                    } else {\n                        if (includeStatusBar) {\n                            if (INITIALLY_HORIZONTAL) {\n                                height = SCREEN.availHeight;\n                            } else {\n                                height = SCREEN.availHeight + STATUS_BAR_HEIGHT;\n                            }\n                        } else {\n                            if (INITIALLY_HORIZONTAL) {\n                                height = SCREEN.availHeight - STATUS_BAR_HEIGHT;\n                            } else {\n                                height = SCREEN.availHeight;\n                            }\n                        }\n                    }\n                }\n                element.height(height);\n            },\n            _setupElementClass: function () {\n                var that = this, size, element = that.element;\n                element.parent().addClass('km-root km-' + (that.os.tablet ? 'tablet' : 'phone'));\n                element.addClass(that.osCssClass + ' ' + getOrientationClass(element));\n                if (this.options.useNativeScrolling) {\n                    element.parent().addClass('km-native-scrolling');\n                }\n                if (CHROME) {\n                    element.addClass('km-ios-chrome');\n                }\n                if (support.wpDevicePixelRatio) {\n                    element.parent().css('font-size', support.wpDevicePixelRatio + 'em');\n                }\n                if (this.options.retina) {\n                    element.parent().addClass('km-retina');\n                    element.parent().css('font-size', support.devicePixelRatio * FONT_SIZE_COEF + 'em');\n                }\n                if (BERRYPHONEGAP) {\n                    applyViewportHeight();\n                }\n                if (that.options.useNativeScrolling) {\n                    element.parent().addClass('km-native-scrolling');\n                } else if (ENABLE_CLIP) {\n                    size = (screen.availWidth > screen.availHeight ? screen.availWidth : screen.availHeight) + 200;\n                    $(clipTemplate({\n                        width: size,\n                        height: size\n                    })).appendTo(HEAD);\n                }\n                if (BROKEN_WEBVIEW_RESIZE) {\n                    that._resizeToScreenHeight();\n                }\n                kendo.onResize(function () {\n                    element.removeClass('km-horizontal km-vertical').addClass(getOrientationClass(element));\n                    if (that.options.useNativeScrolling) {\n                        setMinimumHeight(element);\n                    }\n                    if (BROKEN_WEBVIEW_RESIZE) {\n                        that._resizeToScreenHeight();\n                    }\n                    if (BERRYPHONEGAP) {\n                        applyViewportHeight();\n                    }\n                    kendo.resize(element);\n                });\n            },\n            _clearExistingMeta: function () {\n                HEAD.find('meta').filter('[name|=\\'apple-mobile-web-app\\'],[name|=\\'msapplication-tap\\'],[name=\\'viewport\\']').remove();\n            },\n            _attachMeta: function () {\n                var options = this.options, icon = options.icon, size;\n                this._clearExistingMeta();\n                if (!BERRYPHONEGAP) {\n                    HEAD.prepend(viewportTemplate({\n                        height: '',\n                        scale: this.options.retina ? 1 / support.devicePixelRatio : '1.0'\n                    }));\n                }\n                HEAD.prepend(systemMeta(options));\n                if (icon) {\n                    if (typeof icon === 'string') {\n                        icon = { '': icon };\n                    }\n                    for (size in icon) {\n                        HEAD.prepend(iconMeta({\n                            icon: icon[size],\n                            size: size\n                        }));\n                    }\n                }\n                if (options.useNativeScrolling) {\n                    setMinimumHeight(this.element);\n                }\n            },\n            _attachHideBarHandlers: function () {\n                var that = this, hideBar = proxy(that, '_hideBar');\n                if (support.mobileOS.appMode || !that.options.hideAddressBar || !HIDEBAR || that.options.useNativeScrolling) {\n                    return;\n                }\n                that._initialHeight = {};\n                WINDOW.on('load', hideBar);\n                kendo.onResize(function () {\n                    setTimeout(window.scrollTo, 0, 0, 1);\n                });\n            },\n            _setupDocumentTitle: function () {\n                var that = this, defaultTitle = document.title;\n                that.pane.bind('viewShow', function (e) {\n                    var title = e.view.title;\n                    document.title = title !== undefined ? title : defaultTitle;\n                });\n            },\n            _hideBar: function () {\n                var that = this, element = that.element;\n                element.height(kendo.support.transforms.css + 'calc(100% + ' + BARCOMPENSATION + 'px)');\n                $(window).trigger(kendo.support.resize);\n            }\n        });\n        kendo.mobile.Application = Application;\n        kendo.ui.plugin(Application, kendo.mobile, 'Mobile');\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.actionsheet', [\n        'kendo.mobile.popover',\n        'kendo.mobile.shim'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.actionsheet',\n        name: 'ActionSheet',\n        category: 'mobile',\n        description: 'The mobile ActionSheet widget displays a set of choices related to a task the user initiates.',\n        depends: [\n            'mobile.popover',\n            'mobile.shim'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, support = kendo.support, ui = kendo.mobile.ui, Shim = ui.Shim, Popup = ui.Popup, Widget = ui.Widget, OPEN = 'open', CLOSE = 'close', COMMAND = 'command', BUTTONS = 'li>a', CONTEXT_DATA = 'actionsheetContext', WRAP = '<div class=\"km-actionsheet-wrapper\" />', cancelTemplate = kendo.template('<li class=\"km-actionsheet-cancel\"><a href=\"\\\\#\">#:cancel#</a></li>');\n        var ActionSheet = Widget.extend({\n            init: function (element, options) {\n                var that = this, ShimClass, tablet, type, os = support.mobileOS;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                type = options.type;\n                element = that.element;\n                if (type === 'auto') {\n                    tablet = os && os.tablet;\n                } else {\n                    tablet = type === 'tablet';\n                }\n                ShimClass = tablet ? Popup : Shim;\n                if (options.cancelTemplate) {\n                    cancelTemplate = kendo.template(options.cancelTemplate);\n                }\n                element.addClass('km-actionsheet').append(cancelTemplate({ cancel: that.options.cancel })).wrap(WRAP).on('up', BUTTONS, '_click').on('click', BUTTONS, kendo.preventDefault);\n                that.view().bind('destroy', function () {\n                    that.destroy();\n                });\n                that.wrapper = element.parent().addClass(type ? ' km-actionsheet-' + type : '');\n                that.shim = new ShimClass(that.wrapper, $.extend({\n                    modal: os.ios && os.majorVersion < 7,\n                    className: 'km-actionsheet-root'\n                }, that.options.popup));\n                that._closeProxy = $.proxy(that, '_close');\n                that._shimHideProxy = $.proxy(that, '_shimHide');\n                that.shim.bind('hide', that._shimHideProxy);\n                if (tablet) {\n                    kendo.onResize(that._closeProxy);\n                }\n                kendo.notify(that, ui);\n            },\n            events: [\n                OPEN,\n                CLOSE,\n                COMMAND\n            ],\n            options: {\n                name: 'ActionSheet',\n                cancel: 'Cancel',\n                type: 'auto',\n                popup: { height: 'auto' }\n            },\n            open: function (target, context) {\n                var that = this;\n                that.target = $(target);\n                that.context = context;\n                that.shim.show(target);\n            },\n            close: function () {\n                this.context = this.target = null;\n                this.shim.hide();\n            },\n            openFor: function (target) {\n                var that = this, context = target.data(CONTEXT_DATA);\n                that.open(target, context);\n                that.trigger(OPEN, {\n                    target: target,\n                    context: context\n                });\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                kendo.unbindResize(this._closeProxy);\n                this.shim.destroy();\n            },\n            _click: function (e) {\n                if (e.isDefaultPrevented()) {\n                    return;\n                }\n                var currentTarget = $(e.currentTarget);\n                var action = currentTarget.data('action');\n                if (action) {\n                    var actionData = {\n                            target: this.target,\n                            context: this.context\n                        }, $angular = this.options.$angular;\n                    if ($angular) {\n                        this.element.injector().get('$parse')(action)($angular[0])(actionData);\n                    } else {\n                        kendo.getter(action)(window)(actionData);\n                    }\n                }\n                this.trigger(COMMAND, {\n                    target: this.target,\n                    context: this.context,\n                    currentTarget: currentTarget\n                });\n                e.preventDefault();\n                this._close();\n            },\n            _shimHide: function (e) {\n                if (!this.trigger(CLOSE)) {\n                    this.context = this.target = null;\n                } else {\n                    e.preventDefault();\n                }\n            },\n            _close: function (e) {\n                if (!this.trigger(CLOSE)) {\n                    this.close();\n                } else {\n                    e.preventDefault();\n                }\n            }\n        });\n        ui.plugin(ActionSheet);\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.button', ['kendo.userevents'], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.button',\n        name: 'Button',\n        category: 'mobile',\n        description: 'The Button widget navigates between mobile Application views when pressed.',\n        depends: ['userevents']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, mobile = kendo.mobile, ui = mobile.ui, Widget = ui.Widget, support = kendo.support, os = support.mobileOS, ANDROID3UP = os.android && os.flatVersion >= 300, CLICK = 'click', DISABLED = 'disabled', DISABLEDSTATE = 'km-state-disabled';\n        function highlightButton(widget, event, highlight) {\n            $(event.target).closest('.km-button,.km-detail').toggleClass('km-state-active', highlight);\n            if (ANDROID3UP && widget.deactivateTimeoutID) {\n                clearTimeout(widget.deactivateTimeoutID);\n                widget.deactivateTimeoutID = 0;\n            }\n        }\n        function createBadge(value) {\n            return $('<span class=\"km-badge\">' + value + '</span>');\n        }\n        var Button = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                var useTap = that.options.clickOn === 'up';\n                that._wrap();\n                that._style();\n                if (!useTap) {\n                    that.element.attr('data-navigate-on-press', true);\n                }\n                that.options.enable = that.options.enable && !that.element.attr(DISABLED);\n                that.enable(that.options.enable);\n                that._userEvents = new kendo.UserEvents(that.element, {\n                    allowSelection: !useTap,\n                    fastTap: true,\n                    press: function (e) {\n                        that._activate(e);\n                    },\n                    release: function (e) {\n                        highlightButton(that, e, false);\n                        if (!useTap) {\n                            e.event.stopPropagation();\n                        }\n                    }\n                });\n                that._userEvents.bind(useTap ? 'tap' : 'press', function (e) {\n                    that._release(e);\n                });\n                if (ANDROID3UP) {\n                    that.element.on('move', function (e) {\n                        that._timeoutDeactivate(e);\n                    });\n                }\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this._userEvents.destroy();\n            },\n            events: [CLICK],\n            options: {\n                name: 'Button',\n                icon: '',\n                style: '',\n                badge: '',\n                clickOn: 'up',\n                enable: true\n            },\n            badge: function (value) {\n                var badge = this.badgeElement = this.badgeElement || createBadge(value).appendTo(this.element);\n                if (value || value === 0) {\n                    badge.html(value);\n                    return this;\n                }\n                if (value === false) {\n                    badge.empty().remove();\n                    this.badgeElement = false;\n                    return this;\n                }\n                return badge.html();\n            },\n            enable: function (enable) {\n                var element = this.element;\n                if (typeof enable == 'undefined') {\n                    enable = true;\n                }\n                this.options.enable = enable;\n                if (enable) {\n                    element.removeAttr(DISABLED);\n                } else {\n                    element.attr(DISABLED, DISABLED);\n                }\n                element.toggleClass(DISABLEDSTATE, !enable);\n            },\n            _timeoutDeactivate: function (e) {\n                if (!this.deactivateTimeoutID) {\n                    this.deactivateTimeoutID = setTimeout(highlightButton, 500, this, e, false);\n                }\n            },\n            _activate: function (e) {\n                var activeElement = document.activeElement, nodeName = activeElement ? activeElement.nodeName : '';\n                if (this.options.enable) {\n                    highlightButton(this, e, true);\n                    if (nodeName == 'INPUT' || nodeName == 'TEXTAREA') {\n                        activeElement.blur();\n                    }\n                }\n            },\n            _release: function (e) {\n                var that = this;\n                if (e.which > 1) {\n                    return;\n                }\n                if (!that.options.enable) {\n                    e.preventDefault();\n                    return;\n                }\n                if (that.trigger(CLICK, {\n                        target: $(e.target),\n                        button: that.element\n                    })) {\n                    e.preventDefault();\n                }\n            },\n            _style: function () {\n                var style = this.options.style, element = this.element, styles;\n                if (style) {\n                    styles = style.split(' ');\n                    $.each(styles, function () {\n                        element.addClass('km-' + this);\n                    });\n                }\n            },\n            _wrap: function () {\n                var that = this, icon = that.options.icon, badge = that.options.badge, iconSpan = '<span class=\"km-icon km-' + icon, element = that.element.addClass('km-button'), span = element.children('span:not(.km-icon)').addClass('km-text'), image = element.find('img').addClass('km-image');\n                if (!span[0] && element.html()) {\n                    span = element.wrapInner('<span class=\"km-text\" />').children('span.km-text');\n                }\n                if (!image[0] && icon) {\n                    if (!span[0]) {\n                        iconSpan += ' km-notext';\n                    }\n                    that.iconElement = element.prepend($(iconSpan + '\" />'));\n                }\n                if (badge || badge === 0) {\n                    that.badgeElement = createBadge(badge).appendTo(element);\n                }\n            }\n        });\n        var BackButton = Button.extend({\n            options: {\n                name: 'BackButton',\n                style: 'back'\n            },\n            init: function (element, options) {\n                var that = this;\n                Button.fn.init.call(that, element, options);\n                if (typeof that.element.attr('href') === 'undefined') {\n                    that.element.attr('href', '#:back');\n                }\n            }\n        });\n        var DetailButton = Button.extend({\n            options: {\n                name: 'DetailButton',\n                style: ''\n            },\n            init: function (element, options) {\n                Button.fn.init.call(this, element, options);\n            },\n            _style: function () {\n                var style = this.options.style + ' detail', element = this.element;\n                if (style) {\n                    var styles = style.split(' ');\n                    $.each(styles, function () {\n                        element.addClass('km-' + this);\n                    });\n                }\n            },\n            _wrap: function () {\n                var that = this, icon = that.options.icon, iconSpan = '<span class=\"km-icon km-' + icon, element = that.element, span = element.children('span'), image = element.find('img').addClass('km-image');\n                if (!image[0] && icon) {\n                    if (!span[0]) {\n                        iconSpan += ' km-notext';\n                    }\n                    element.prepend($(iconSpan + '\" />'));\n                }\n            }\n        });\n        ui.plugin(Button);\n        ui.plugin(BackButton);\n        ui.plugin(DetailButton);\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.buttongroup', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.buttongroup',\n        name: 'ButtonGroup',\n        category: 'mobile',\n        description: 'The Kendo mobile ButtonGroup widget is a linear set of grouped buttons.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.mobile.ui, Widget = ui.Widget, ACTIVE = 'state-active', DISABLE = 'state-disabled', SELECT = 'select', SELECTOR = 'li:not(.km-' + ACTIVE + ')';\n        function className(name) {\n            return 'k-' + name + ' km-' + name;\n        }\n        function createBadge(value) {\n            return $('<span class=\"' + className('badge') + '\">' + value + '</span>');\n        }\n        var ButtonGroup = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that.element.addClass('km-buttongroup k-widget k-button-group').find('li').each(that._button);\n                that.element.on(that.options.selectOn, SELECTOR, '_select');\n                that._enable = true;\n                that.select(that.options.index);\n                if (!that.options.enable) {\n                    that._enable = false;\n                    that.wrapper.addClass(className(DISABLE));\n                }\n            },\n            events: [SELECT],\n            options: {\n                name: 'ButtonGroup',\n                selectOn: 'down',\n                index: -1,\n                enable: true\n            },\n            current: function () {\n                return this.element.find('.km-' + ACTIVE);\n            },\n            select: function (li) {\n                var that = this, index = -1;\n                if (li === undefined || li === -1 || !that._enable || $(li).is('.km-' + DISABLE)) {\n                    return;\n                }\n                that.current().removeClass(className(ACTIVE));\n                if (typeof li === 'number') {\n                    index = li;\n                    li = $(that.element[0].children[li]);\n                } else if (li.nodeType) {\n                    li = $(li);\n                    index = li.index();\n                }\n                li.addClass(className(ACTIVE));\n                that.selectedIndex = index;\n            },\n            badge: function (item, value) {\n                var buttongroup = this.element, badge;\n                if (!isNaN(item)) {\n                    item = buttongroup.children().get(item);\n                }\n                item = buttongroup.find(item);\n                badge = $(item.children('.km-badge')[0] || createBadge(value).appendTo(item));\n                if (value || value === 0) {\n                    badge.html(value);\n                    return this;\n                }\n                if (value === false) {\n                    badge.empty().remove();\n                    return this;\n                }\n                return badge.html();\n            },\n            enable: function (enable) {\n                if (typeof enable == 'undefined') {\n                    enable = true;\n                }\n                this.wrapper.toggleClass(className(DISABLE), !enable);\n                this._enable = this.options.enable = enable;\n            },\n            _button: function () {\n                var button = $(this).addClass(className('button')), icon = kendo.attrValue(button, 'icon'), badge = kendo.attrValue(button, 'badge'), span = button.children('span'), image = button.find('img').addClass(className('image'));\n                if (!span[0]) {\n                    span = button.wrapInner('<span/>').children('span');\n                }\n                span.addClass(className('text'));\n                if (!image[0] && icon) {\n                    button.prepend($('<span class=\"' + className('icon') + ' ' + className(icon) + '\"/>'));\n                }\n                if (badge || badge === 0) {\n                    createBadge(badge).appendTo(button);\n                }\n            },\n            _select: function (e) {\n                if (e.which > 1 || e.isDefaultPrevented() || !this._enable) {\n                    return;\n                }\n                this.select(e.currentTarget);\n                this.trigger(SELECT, { index: this.selectedIndex });\n            }\n        });\n        ui.plugin(ButtonGroup);\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.collapsible', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.collapsible',\n        name: 'Collapsible',\n        category: 'mobile',\n        description: 'The Kendo mobile Collapsible widget provides ability for creating collapsible blocks of content.',\n        depends: [\n            'core',\n            'userevents'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.mobile.ui, Widget = ui.Widget, COLLAPSIBLE = 'km-collapsible', HEADER = 'km-collapsible-header', CONTENT = 'km-collapsible-content', INSET = 'km-collapsibleinset', HEADER_WRAPPER = '<div data-role=\\'collapsible-header\\' class=\\'' + HEADER + '\\'></div>', CONTENT_WRAPPER = '<div data-role=\\'collapsible-content\\' class=\\'' + CONTENT + '\\'></div>', COLLAPSED = 'km-collapsed', EXPANDED = 'km-expanded', ANIMATED = 'km-animated', LEFT = 'left', EXAPND = 'expand', COLLAPSE = 'collapse';\n        var Collapsible = Widget.extend({\n            init: function (element, options) {\n                var that = this, container = $(element);\n                Widget.fn.init.call(that, container, options);\n                container.addClass(COLLAPSIBLE);\n                that._buildHeader();\n                that.content = container.children().not(that.header).wrapAll(CONTENT_WRAPPER).parent();\n                that._userEvents = new kendo.UserEvents(that.header, {\n                    fastTap: true,\n                    tap: function () {\n                        that.toggle();\n                    }\n                });\n                container.addClass(that.options.collapsed ? COLLAPSED : EXPANDED);\n                if (that.options.inset) {\n                    container.addClass(INSET);\n                }\n                if (that.options.animation) {\n                    that.content.addClass(ANIMATED);\n                    that.content.height(0);\n                    if (that.options.collapsed) {\n                        that.content.hide();\n                    }\n                } else if (that.options.collapsed) {\n                    that.content.hide();\n                }\n            },\n            events: [\n                EXAPND,\n                COLLAPSE\n            ],\n            options: {\n                name: 'Collapsible',\n                collapsed: true,\n                collapseIcon: 'arrow-n',\n                expandIcon: 'arrow-s',\n                iconPosition: LEFT,\n                animation: true,\n                inset: false\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this._userEvents.destroy();\n            },\n            expand: function (instant) {\n                var icon = this.options.collapseIcon, content = this.content, ios = kendo.support.mobileOS.ios;\n                if (!this.trigger(EXAPND)) {\n                    if (icon) {\n                        this.header.find('.km-icon').removeClass().addClass('km-icon km-' + icon);\n                    }\n                    this.element.removeClass(COLLAPSED).addClass(EXPANDED);\n                    if (this.options.animation && !instant) {\n                        content.off('transitionend');\n                        content.show();\n                        if (ios) {\n                            content.removeClass(ANIMATED);\n                        }\n                        content.height(this._getContentHeight());\n                        if (ios) {\n                            content.addClass(ANIMATED);\n                        }\n                        kendo.resize(content);\n                    } else {\n                        content.show();\n                    }\n                }\n            },\n            collapse: function (instant) {\n                var icon = this.options.expandIcon, content = this.content;\n                if (!this.trigger(COLLAPSE)) {\n                    if (icon) {\n                        this.header.find('.km-icon').removeClass().addClass('km-icon km-' + icon);\n                    }\n                    this.element.removeClass(EXPANDED).addClass(COLLAPSED);\n                    if (this.options.animation && !instant) {\n                        content.one('transitionend', function () {\n                            content.hide();\n                        });\n                        content.height(0);\n                    } else {\n                        content.hide();\n                    }\n                }\n            },\n            toggle: function (instant) {\n                if (this.isCollapsed()) {\n                    this.expand(instant);\n                } else {\n                    this.collapse(instant);\n                }\n            },\n            isCollapsed: function () {\n                return this.element.hasClass(COLLAPSED);\n            },\n            resize: function () {\n                if (!this.isCollapsed() && this.options.animation) {\n                    this.content.height(this._getContentHeight());\n                }\n            },\n            _buildHeader: function () {\n                var header = this.element.children(':header').wrapAll(HEADER_WRAPPER), iconSpan = $('<span class=\"km-icon\"/>'), icon = this.options.collapsed ? this.options.expandIcon : this.options.collapseIcon, iconPosition = this.options.iconPosition;\n                if (icon) {\n                    header.prepend(iconSpan);\n                    iconSpan.addClass('km-' + icon);\n                }\n                this.header = header.parent();\n                this.header.addClass('km-icon-' + iconPosition);\n            },\n            _getContentHeight: function () {\n                var style = this.content.attr('style'), height;\n                this.content.css({\n                    position: 'absolute',\n                    visibility: 'hidden',\n                    height: 'auto'\n                });\n                height = this.content.height();\n                this.content.attr('style', style ? style : '');\n                return height;\n            }\n        });\n        ui.plugin(Collapsible);\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.listview', [\n        'kendo.data',\n        'kendo.userevents',\n        'kendo.mobile.button'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.listview',\n        name: 'ListView',\n        category: 'mobile',\n        description: 'The Kendo Mobile ListView widget is used to display flat or grouped list of items.',\n        depends: [\n            'data',\n            'userevents',\n            'mobile.button'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Node = window.Node, mobile = kendo.mobile, ui = mobile.ui, outerHeight = kendo._outerHeight, DataSource = kendo.data.DataSource, Widget = ui.DataBoundWidget, ITEM_SELECTOR = '.km-list > li, > li:not(.km-group-container)', HIGHLIGHT_SELECTOR = '.km-listview-link, .km-listview-label', ICON_SELECTOR = '[' + kendo.attr('icon') + ']', proxy = $.proxy, attrValue = kendo.attrValue, GROUP_CLASS = 'km-group-title', ACTIVE_CLASS = 'km-state-active', GROUP_WRAPPER = '<div class=\"' + GROUP_CLASS + '\"><div class=\"km-text\"></div></div>', GROUP_TEMPLATE = kendo.template('<li><div class=\"' + GROUP_CLASS + '\"><div class=\"km-text\">#= this.headerTemplate(data) #</div></div><ul>#= kendo.render(this.template, data.items)#</ul></li>'), WRAPPER = '<div class=\"km-listview-wrapper\" />', SEARCH_TEMPLATE = kendo.template('<form class=\"km-filter-form\"><div class=\"km-filter-wrap\"><input type=\"search\" placeholder=\"#=placeholder#\"/><a href=\"\\\\#\" class=\"km-filter-reset\" title=\"Clear\"><span class=\"km-icon km-clear\"></span><span class=\"km-text\">Clear</span></a></div></form>'), NS = '.kendoMobileListView', STYLED = 'styled', DATABOUND = 'dataBound', DATABINDING = 'dataBinding', ITEM_CHANGE = 'itemChange', CLICK = 'click', CHANGE = 'change', PROGRESS = 'progress', FUNCTION = 'function', whitespaceRegExp = /^\\s+$/, buttonRegExp = /button/;\n        function whitespace() {\n            return this.nodeType === Node.TEXT_NODE && this.nodeValue.match(whitespaceRegExp);\n        }\n        function addIcon(item, icon) {\n            if (icon && !item[0].querySelector('.km-icon')) {\n                item.prepend('<span class=\"km-icon km-' + icon + '\"/>');\n            }\n        }\n        function enhanceItem(item) {\n            addIcon(item, attrValue(item, 'icon'));\n            addIcon(item, attrValue(item.children(ICON_SELECTOR), 'icon'));\n        }\n        function enhanceLinkItem(item) {\n            var parent = item.parent(), itemAndDetailButtons = item.add(parent.children(kendo.roleSelector('detailbutton'))), otherNodes = parent.contents().not(itemAndDetailButtons).not(whitespace);\n            if (otherNodes.length) {\n                return;\n            }\n            item.addClass('km-listview-link').attr(kendo.attr('role'), 'listview-link');\n            addIcon(item, attrValue(parent, 'icon'));\n            addIcon(item, attrValue(item, 'icon'));\n        }\n        function enhanceCheckBoxItem(label) {\n            if (!label[0].querySelector('input[type=checkbox],input[type=radio]')) {\n                return;\n            }\n            var item = label.parent();\n            if (item.contents().not(label).not(function () {\n                    return this.nodeType == 3;\n                })[0]) {\n                return;\n            }\n            label.addClass('km-listview-label');\n            label.children('[type=checkbox],[type=radio]').addClass('km-widget km-icon km-check');\n        }\n        function putAt(element, top) {\n            $(element).css('transform', 'translate3d(0px, ' + top + 'px, 0px)');\n        }\n        var HeaderFixer = kendo.Class.extend({\n            init: function (listView) {\n                var scroller = listView.scroller();\n                if (!scroller) {\n                    return;\n                }\n                this.options = listView.options;\n                this.element = listView.element;\n                this.scroller = listView.scroller();\n                this._shouldFixHeaders();\n                var headerFixer = this;\n                var cacheHeaders = function () {\n                    headerFixer._cacheHeaders();\n                };\n                listView.bind('resize', cacheHeaders);\n                listView.bind(STYLED, cacheHeaders);\n                listView.bind(DATABOUND, cacheHeaders);\n                this._scrollHandler = function (e) {\n                    headerFixer._fixHeader(e);\n                };\n                scroller.bind('scroll', this._scrollHandler);\n            },\n            destroy: function () {\n                var that = this;\n                if (that.scroller) {\n                    that.scroller.unbind('scroll', that._scrollHandler);\n                }\n            },\n            _fixHeader: function (e) {\n                if (!this.fixedHeaders) {\n                    return;\n                }\n                var i = 0, scroller = this.scroller, headers = this.headers, scrollTop = e.scrollTop, headerPair, offset, header;\n                do {\n                    headerPair = headers[i++];\n                    if (!headerPair) {\n                        header = $('<div />');\n                        break;\n                    }\n                    offset = headerPair.offset;\n                    header = headerPair.header;\n                } while (offset + 1 > scrollTop);\n                if (this.currentHeader != i) {\n                    scroller.fixedContainer.html(header.clone());\n                    this.currentHeader = i;\n                }\n            },\n            _shouldFixHeaders: function () {\n                this.fixedHeaders = this.options.type === 'group' && this.options.fixedHeaders;\n            },\n            _cacheHeaders: function () {\n                this._shouldFixHeaders();\n                if (!this.fixedHeaders) {\n                    return;\n                }\n                var headers = [], offset = this.scroller.scrollTop;\n                this.element.find('.' + GROUP_CLASS).each(function (_, header) {\n                    header = $(header);\n                    headers.unshift({\n                        offset: header.position().top + offset,\n                        header: header\n                    });\n                });\n                this.headers = headers;\n                this._fixHeader({ scrollTop: offset });\n            }\n        });\n        var DEFAULT_PULL_PARAMETERS = function () {\n            return { page: 1 };\n        };\n        var RefreshHandler = kendo.Class.extend({\n            init: function (listView) {\n                var handler = this, options = listView.options, scroller = listView.scroller(), pullParameters = options.pullParameters || DEFAULT_PULL_PARAMETERS;\n                this.listView = listView;\n                this.scroller = scroller;\n                listView.bind('_dataSource', function (e) {\n                    handler.setDataSource(e.dataSource);\n                });\n                scroller.setOptions({\n                    pullToRefresh: true,\n                    pull: function () {\n                        if (!handler._pulled) {\n                            handler._pulled = true;\n                            handler.dataSource.read(pullParameters.call(listView, handler._first));\n                        }\n                    },\n                    messages: {\n                        pullTemplate: options.messages.pullTemplate,\n                        releaseTemplate: options.messages.releaseTemplate,\n                        refreshTemplate: options.messages.refreshTemplate\n                    }\n                });\n            },\n            setDataSource: function (dataSource) {\n                var handler = this;\n                this._first = dataSource.view()[0];\n                this.dataSource = dataSource;\n                dataSource.bind('change', function () {\n                    handler._change();\n                });\n                dataSource.bind('error', function () {\n                    handler._change();\n                });\n            },\n            _change: function () {\n                var scroller = this.scroller, dataSource = this.dataSource;\n                if (this._pulled) {\n                    scroller.pullHandled();\n                }\n                if (this._pulled || !this._first) {\n                    var view = dataSource.view();\n                    if (view[0]) {\n                        this._first = view[0];\n                    }\n                }\n                this._pulled = false;\n            }\n        });\n        var VirtualList = kendo.Observable.extend({\n            init: function (options) {\n                var list = this;\n                kendo.Observable.fn.init.call(list);\n                list.buffer = options.buffer;\n                list.height = options.height;\n                list.item = options.item;\n                list.items = [];\n                list.footer = options.footer;\n                list.buffer.bind('reset', function () {\n                    list.refresh();\n                });\n            },\n            refresh: function () {\n                var buffer = this.buffer, items = this.items, endReached = false;\n                while (items.length) {\n                    items.pop().destroy();\n                }\n                this.offset = buffer.offset;\n                var itemConstructor = this.item, prevItem, item;\n                for (var idx = 0; idx < buffer.viewSize; idx++) {\n                    if (idx === buffer.total()) {\n                        endReached = true;\n                        break;\n                    }\n                    item = itemConstructor(this.content(this.offset + items.length));\n                    item.below(prevItem);\n                    prevItem = item;\n                    items.push(item);\n                }\n                this.itemCount = items.length;\n                this.trigger('reset');\n                this._resize();\n                if (endReached) {\n                    this.trigger('endReached');\n                }\n            },\n            totalHeight: function () {\n                if (!this.items[0]) {\n                    return 0;\n                }\n                var list = this, items = list.items, top = items[0].top, bottom = items[items.length - 1].bottom, averageItemHeight = (bottom - top) / list.itemCount, remainingItemsCount = list.buffer.length - list.offset - list.itemCount;\n                return (this.footer ? this.footer.height : 0) + bottom + remainingItemsCount * averageItemHeight;\n            },\n            batchUpdate: function (top) {\n                var height = this.height(), items = this.items, item, initialOffset = this.offset;\n                if (!items[0]) {\n                    return;\n                }\n                if (this.lastDirection) {\n                    while (items[items.length - 1].bottom > top + height * 2) {\n                        if (this.offset === 0) {\n                            break;\n                        }\n                        this.offset--;\n                        item = items.pop();\n                        item.update(this.content(this.offset));\n                        item.above(items[0]);\n                        items.unshift(item);\n                    }\n                } else {\n                    while (items[0].top < top - height) {\n                        var nextIndex = this.offset + this.itemCount;\n                        if (nextIndex === this.buffer.total()) {\n                            this.trigger('endReached');\n                            break;\n                        }\n                        if (nextIndex === this.buffer.length) {\n                            break;\n                        }\n                        item = items.shift();\n                        item.update(this.content(this.offset + this.itemCount));\n                        item.below(items[items.length - 1]);\n                        items.push(item);\n                        this.offset++;\n                    }\n                }\n                if (initialOffset !== this.offset) {\n                    this._resize();\n                }\n            },\n            update: function (top) {\n                var list = this, items = this.items, item, firstItem, lastItem, height = this.height(), itemCount = this.itemCount, padding = height / 2, up = (this.lastTop || 0) > top, topBorder = top - padding, bottomBorder = top + height + padding;\n                if (!items[0]) {\n                    return;\n                }\n                this.lastTop = top;\n                this.lastDirection = up;\n                if (up) {\n                    if (items[0].top > topBorder && items[items.length - 1].bottom > bottomBorder + padding && this.offset > 0) {\n                        this.offset--;\n                        item = items.pop();\n                        firstItem = items[0];\n                        item.update(this.content(this.offset));\n                        items.unshift(item);\n                        item.above(firstItem);\n                        list._resize();\n                    }\n                } else {\n                    if (items[items.length - 1].bottom < bottomBorder && items[0].top < topBorder - padding) {\n                        var nextIndex = this.offset + itemCount;\n                        if (nextIndex === this.buffer.total()) {\n                            this.trigger('endReached');\n                        } else if (nextIndex !== this.buffer.length) {\n                            item = items.shift();\n                            lastItem = items[items.length - 1];\n                            items.push(item);\n                            item.update(this.content(this.offset + this.itemCount));\n                            list.offset++;\n                            item.below(lastItem);\n                            list._resize();\n                        }\n                    }\n                }\n            },\n            content: function (index) {\n                return this.buffer.at(index);\n            },\n            destroy: function () {\n                this.unbind();\n            },\n            _resize: function () {\n                var items = this.items, top = 0, bottom = 0, firstItem = items[0], lastItem = items[items.length - 1];\n                if (firstItem) {\n                    top = firstItem.top;\n                    bottom = lastItem.bottom;\n                }\n                this.trigger('resize', {\n                    top: top,\n                    bottom: bottom\n                });\n                if (this.footer) {\n                    this.footer.below(lastItem);\n                }\n            }\n        });\n        kendo.mobile.ui.VirtualList = VirtualList;\n        var VirtualListViewItem = kendo.Class.extend({\n            init: function (listView, dataItem) {\n                var element = listView.append([dataItem], true)[0], height = element.offsetHeight;\n                $.extend(this, {\n                    top: 0,\n                    element: element,\n                    listView: listView,\n                    height: height,\n                    bottom: height\n                });\n            },\n            update: function (dataItem) {\n                this.element = this.listView.setDataItem(this.element, dataItem);\n            },\n            above: function (item) {\n                if (item) {\n                    this.height = this.element.offsetHeight;\n                    this.top = item.top - this.height;\n                    this.bottom = item.top;\n                    putAt(this.element, this.top);\n                }\n            },\n            below: function (item) {\n                if (item) {\n                    this.height = this.element.offsetHeight;\n                    this.top = item.bottom;\n                    this.bottom = this.top + this.height;\n                    putAt(this.element, this.top);\n                }\n            },\n            destroy: function () {\n                kendo.destroy(this.element);\n                $(this.element).remove();\n            }\n        });\n        var LOAD_ICON = '<div><span class=\"km-icon\"></span><span class=\"km-loading-left\"></span><span class=\"km-loading-right\"></span></div>';\n        var VirtualListViewLoadingIndicator = kendo.Class.extend({\n            init: function (listView) {\n                this.element = $('<li class=\"km-load-more km-scroller-refresh\" style=\"display: none\"></li>').appendTo(listView.element);\n                this._loadIcon = $(LOAD_ICON).appendTo(this.element);\n            },\n            enable: function () {\n                this.element.show();\n                this.height = outerHeight(this.element, true);\n            },\n            disable: function () {\n                this.element.hide();\n                this.height = 0;\n            },\n            below: function (item) {\n                if (item) {\n                    this.top = item.bottom;\n                    this.bottom = this.height + this.top;\n                    putAt(this.element, this.top);\n                }\n            }\n        });\n        var VirtualListViewPressToLoadMore = VirtualListViewLoadingIndicator.extend({\n            init: function (listView, buffer) {\n                this._loadIcon = $(LOAD_ICON).hide();\n                this._loadButton = $('<a class=\"km-load\">' + listView.options.messages.loadMoreText + '</a>').hide();\n                this.element = $('<li class=\"km-load-more\" style=\"display: none\"></li>').append(this._loadIcon).append(this._loadButton).appendTo(listView.element);\n                var loadMore = this;\n                this._loadButton.kendoMobileButton().data('kendoMobileButton').bind('click', function () {\n                    loadMore._hideShowButton();\n                    buffer.next();\n                });\n                buffer.bind('resize', function () {\n                    loadMore._showLoadButton();\n                });\n                this.height = outerHeight(this.element, true);\n                this.disable();\n            },\n            _hideShowButton: function () {\n                this._loadButton.hide();\n                this.element.addClass('km-scroller-refresh');\n                this._loadIcon.css('display', 'block');\n            },\n            _showLoadButton: function () {\n                this._loadButton.show();\n                this.element.removeClass('km-scroller-refresh');\n                this._loadIcon.hide();\n            }\n        });\n        var VirtualListViewItemBinder = kendo.Class.extend({\n            init: function (listView) {\n                var binder = this;\n                this.chromeHeight = outerHeight(listView.wrapper.children().not(listView.element));\n                this.listView = listView;\n                this.scroller = listView.scroller();\n                this.options = listView.options;\n                listView.bind('_dataSource', function (e) {\n                    binder.setDataSource(e.dataSource, e.empty);\n                });\n                listView.bind('resize', function () {\n                    if (!binder.list.items.length) {\n                        return;\n                    }\n                    binder.scroller.reset();\n                    binder.buffer.range(0);\n                    binder.list.refresh();\n                });\n                this.scroller.makeVirtual();\n                this._scroll = function (e) {\n                    binder.list.update(e.scrollTop);\n                };\n                this.scroller.bind('scroll', this._scroll);\n                this._scrollEnd = function (e) {\n                    binder.list.batchUpdate(e.scrollTop);\n                };\n                this.scroller.bind('scrollEnd', this._scrollEnd);\n            },\n            destroy: function () {\n                this.list.unbind();\n                this.buffer.unbind();\n                this.scroller.unbind('scroll', this._scroll);\n                this.scroller.unbind('scrollEnd', this._scrollEnd);\n            },\n            setDataSource: function (dataSource, empty) {\n                var binder = this, options = this.options, listView = this.listView, scroller = listView.scroller(), pressToLoadMore = options.loadMore, pageSize, buffer, footer;\n                this.dataSource = dataSource;\n                pageSize = dataSource.pageSize() || options.virtualViewSize;\n                if (!pageSize && !empty) {\n                    throw new Error('the DataSource does not have page size configured. Page Size setting is mandatory for the mobile listview virtual scrolling to work as expected.');\n                }\n                if (this.buffer) {\n                    this.buffer.destroy();\n                }\n                buffer = new kendo.data.Buffer(dataSource, Math.floor(pageSize / 2), pressToLoadMore);\n                if (pressToLoadMore) {\n                    footer = new VirtualListViewPressToLoadMore(listView, buffer);\n                } else {\n                    footer = new VirtualListViewLoadingIndicator(listView);\n                }\n                if (this.list) {\n                    this.list.destroy();\n                }\n                var list = new VirtualList({\n                    buffer: buffer,\n                    footer: footer,\n                    item: function (dataItem) {\n                        return new VirtualListViewItem(listView, dataItem);\n                    },\n                    height: function () {\n                        return scroller.height();\n                    }\n                });\n                list.bind('resize', function () {\n                    binder.updateScrollerSize();\n                    listView.updateSize();\n                });\n                list.bind('reset', function () {\n                    binder.footer.enable();\n                });\n                list.bind('endReached', function () {\n                    footer.disable();\n                    binder.updateScrollerSize();\n                });\n                buffer.bind('expand', function () {\n                    list.lastDirection = false;\n                    list.batchUpdate(scroller.scrollTop);\n                });\n                $.extend(this, {\n                    buffer: buffer,\n                    scroller: scroller,\n                    list: list,\n                    footer: footer\n                });\n            },\n            updateScrollerSize: function () {\n                this.scroller.virtualSize(0, this.list.totalHeight() + this.chromeHeight);\n            },\n            refresh: function () {\n                this.list.refresh();\n            },\n            reset: function () {\n                this.buffer.range(0);\n                this.list.refresh();\n            }\n        });\n        var ListViewItemBinder = kendo.Class.extend({\n            init: function (listView) {\n                var binder = this;\n                this.listView = listView;\n                this.options = listView.options;\n                var itemBinder = this;\n                this._refreshHandler = function (e) {\n                    itemBinder.refresh(e);\n                };\n                this._progressHandler = function () {\n                    listView.showLoading();\n                };\n                listView.bind('_dataSource', function (e) {\n                    binder.setDataSource(e.dataSource);\n                });\n            },\n            destroy: function () {\n                this._unbindDataSource();\n            },\n            reset: function () {\n            },\n            refresh: function (e) {\n                var action = e && e.action, dataItems = e && e.items, listView = this.listView, dataSource = this.dataSource, prependOnRefresh = this.options.appendOnRefresh, view = dataSource.view(), groups = dataSource.group(), groupedMode = groups && groups[0], item;\n                if (action === 'itemchange') {\n                    if (!listView._hasBindingTarget()) {\n                        item = listView.findByDataItem(dataItems)[0];\n                        if (item) {\n                            listView.setDataItem(item, dataItems[0]);\n                        }\n                    }\n                    return;\n                }\n                var removedItems, addedItems, addedDataItems;\n                var adding = action === 'add' && !groupedMode || prependOnRefresh && !listView._filter;\n                var removing = action === 'remove' && !groupedMode;\n                if (adding) {\n                    removedItems = [];\n                } else if (removing) {\n                    removedItems = listView.findByDataItem(dataItems);\n                }\n                if (listView.trigger(DATABINDING, {\n                        action: action || 'rebind',\n                        items: dataItems,\n                        removedItems: removedItems,\n                        index: e && e.index\n                    })) {\n                    if (this._shouldShowLoading()) {\n                        listView.hideLoading();\n                    }\n                    return;\n                }\n                if (action === 'add' && !groupedMode) {\n                    var index = view.indexOf(dataItems[0]);\n                    if (index > -1) {\n                        addedItems = listView.insertAt(dataItems, index);\n                        addedDataItems = dataItems;\n                    }\n                } else if (action === 'remove' && !groupedMode) {\n                    addedItems = [];\n                    listView.remove(dataItems);\n                } else if (groupedMode) {\n                    listView.replaceGrouped(view);\n                } else if (prependOnRefresh && !listView._filter) {\n                    addedItems = listView.prepend(view);\n                    addedDataItems = view;\n                } else {\n                    listView.replace(view);\n                }\n                if (this._shouldShowLoading()) {\n                    listView.hideLoading();\n                }\n                listView.trigger(DATABOUND, {\n                    ns: ui,\n                    addedItems: addedItems,\n                    addedDataItems: addedDataItems\n                });\n            },\n            setDataSource: function (dataSource) {\n                if (this.dataSource) {\n                    this._unbindDataSource();\n                }\n                this.dataSource = dataSource;\n                dataSource.bind(CHANGE, this._refreshHandler);\n                if (this._shouldShowLoading()) {\n                    this.dataSource.bind(PROGRESS, this._progressHandler);\n                }\n            },\n            _unbindDataSource: function () {\n                this.dataSource.unbind(CHANGE, this._refreshHandler).unbind(PROGRESS, this._progressHandler);\n            },\n            _shouldShowLoading: function () {\n                var options = this.options;\n                return !options.pullToRefresh && !options.loadMore && !options.endlessScroll;\n            }\n        });\n        var ListViewFilter = kendo.Class.extend({\n            init: function (listView) {\n                var filter = this, filterable = listView.options.filterable, events = 'change paste', that = this;\n                this.listView = listView;\n                this.options = filterable;\n                listView.element.before(SEARCH_TEMPLATE({ placeholder: filterable.placeholder || 'Search...' }));\n                if (filterable.autoFilter !== false) {\n                    events += ' keyup';\n                }\n                this.element = listView.wrapper.find('.km-search-form');\n                this.searchInput = listView.wrapper.find('input[type=search]').closest('form').on('submit' + NS, function (e) {\n                    e.preventDefault();\n                }).end().on('focus' + NS, function () {\n                    filter._oldFilter = filter.searchInput.val();\n                }).on(events.split(' ').join(NS + ' ') + NS, proxy(this._filterChange, this));\n                this.clearButton = listView.wrapper.find('.km-filter-reset').on(CLICK, proxy(this, '_clearFilter')).hide();\n                this._dataSourceChange = $.proxy(this._refreshInput, this);\n                listView.bind('_dataSource', function (e) {\n                    e.dataSource.bind('change', that._dataSourceChange);\n                });\n            },\n            _refreshInput: function () {\n                var appliedFilters = this.listView.dataSource.filter();\n                var searchInput = this.listView._filter.searchInput;\n                if (!appliedFilters || appliedFilters.filters[0].field !== this.listView.options.filterable.field) {\n                    searchInput.val('');\n                } else {\n                    searchInput.val(appliedFilters.filters[0].value);\n                }\n            },\n            _search: function (expr) {\n                this._filter = true;\n                this.clearButton[expr ? 'show' : 'hide']();\n                this.listView.dataSource.filter(expr);\n            },\n            _filterChange: function (e) {\n                var filter = this;\n                if (e.type == 'paste' && this.options.autoFilter !== false) {\n                    setTimeout(function () {\n                        filter._applyFilter();\n                    }, 1);\n                } else {\n                    this._applyFilter();\n                }\n            },\n            _applyFilter: function () {\n                var options = this.options, value = this.searchInput.val(), expr = value.length ? {\n                        field: options.field,\n                        operator: options.operator || 'startswith',\n                        ignoreCase: options.ignoreCase,\n                        value: value\n                    } : null;\n                if (value === this._oldFilter) {\n                    return;\n                }\n                this._oldFilter = value;\n                this._search(expr);\n            },\n            _clearFilter: function (e) {\n                this.searchInput.val('');\n                this._search(null);\n                e.preventDefault();\n            }\n        });\n        var ListView = Widget.extend({\n            init: function (element, options) {\n                var listView = this;\n                Widget.fn.init.call(this, element, options);\n                element = this.element;\n                options = this.options;\n                if (options.scrollTreshold) {\n                    options.scrollThreshold = options.scrollTreshold;\n                }\n                element.on('down', HIGHLIGHT_SELECTOR, '_highlight').on('move up cancel', HIGHLIGHT_SELECTOR, '_dim');\n                this._userEvents = new kendo.UserEvents(element, {\n                    fastTap: true,\n                    filter: ITEM_SELECTOR,\n                    allowSelection: true,\n                    tap: function (e) {\n                        listView._click(e);\n                    }\n                });\n                element.css('-ms-touch-action', 'auto');\n                element.wrap(WRAPPER);\n                this.wrapper = this.element.parent();\n                this._headerFixer = new HeaderFixer(this);\n                this._itemsCache = {};\n                this._templates();\n                this.virtual = options.endlessScroll || options.loadMore;\n                this._style();\n                if (this.options.$angular && (this.virtual || this.options.pullToRefresh)) {\n                    setTimeout($.proxy(this, '_start'));\n                } else {\n                    this._start();\n                }\n            },\n            _start: function () {\n                var options = this.options;\n                if (this.options.filterable) {\n                    this._filter = new ListViewFilter(this);\n                }\n                if (this.virtual) {\n                    this._itemBinder = new VirtualListViewItemBinder(this);\n                } else {\n                    this._itemBinder = new ListViewItemBinder(this);\n                }\n                if (this.options.pullToRefresh) {\n                    this._pullToRefreshHandler = new RefreshHandler(this);\n                }\n                this.setDataSource(options.dataSource);\n                this._enhanceItems(this.items());\n                kendo.notify(this, ui);\n            },\n            events: [\n                CLICK,\n                DATABINDING,\n                DATABOUND,\n                ITEM_CHANGE\n            ],\n            options: {\n                name: 'ListView',\n                style: '',\n                type: 'flat',\n                autoBind: true,\n                fixedHeaders: false,\n                template: '#:data#',\n                headerTemplate: '<span class=\"km-text\">#:value#</span>',\n                appendOnRefresh: false,\n                loadMore: false,\n                endlessScroll: false,\n                scrollThreshold: 30,\n                pullToRefresh: false,\n                messages: {\n                    loadMoreText: 'Press to load more',\n                    pullTemplate: 'Pull to refresh',\n                    releaseTemplate: 'Release to refresh',\n                    refreshTemplate: 'Refreshing'\n                },\n                pullOffset: 140,\n                filterable: false,\n                virtualViewSize: null\n            },\n            refresh: function () {\n                this._itemBinder.refresh();\n            },\n            reset: function () {\n                this._itemBinder.reset();\n            },\n            setDataSource: function (dataSource) {\n                var emptyDataSource = !dataSource;\n                this.dataSource = DataSource.create(dataSource);\n                this.trigger('_dataSource', {\n                    dataSource: this.dataSource,\n                    empty: emptyDataSource\n                });\n                if (this.options.autoBind && !emptyDataSource) {\n                    this.items().remove();\n                    this.dataSource.fetch();\n                }\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                kendo.destroy(this.element);\n                this._userEvents.destroy();\n                if (this._itemBinder) {\n                    this._itemBinder.destroy();\n                }\n                if (this._headerFixer) {\n                    this._headerFixer.destroy();\n                }\n                this.element.unwrap();\n                delete this.element;\n                delete this.wrapper;\n                delete this._userEvents;\n            },\n            items: function () {\n                if (this.options.type === 'group') {\n                    return this.element.find('.km-list').children();\n                } else {\n                    return this.element.children().not('.km-load-more');\n                }\n            },\n            scroller: function () {\n                if (!this._scrollerInstance) {\n                    this._scrollerInstance = this.element.closest('.km-scroll-wrapper').data('kendoMobileScroller');\n                }\n                return this._scrollerInstance;\n            },\n            showLoading: function () {\n                var view = this.view();\n                if (view && view.loader) {\n                    view.loader.show();\n                }\n            },\n            hideLoading: function () {\n                var view = this.view();\n                if (view && view.loader) {\n                    view.loader.hide();\n                }\n            },\n            insertAt: function (dataItems, index, triggerChange) {\n                var listView = this;\n                return listView._renderItems(dataItems, function (items) {\n                    if (index === 0) {\n                        listView.element.prepend(items);\n                    } else if (index === -1) {\n                        listView.element.append(items);\n                    } else {\n                        listView.items().eq(index - 1).after(items);\n                    }\n                    if (triggerChange) {\n                        for (var i = 0; i < items.length; i++) {\n                            listView.trigger(ITEM_CHANGE, {\n                                item: items.eq(i),\n                                data: dataItems[i],\n                                ns: ui\n                            });\n                        }\n                    }\n                });\n            },\n            append: function (dataItems, triggerChange) {\n                return this.insertAt(dataItems, -1, triggerChange);\n            },\n            prepend: function (dataItems, triggerChange) {\n                return this.insertAt(dataItems, 0, triggerChange);\n            },\n            replace: function (dataItems) {\n                this.options.type = 'flat';\n                this._angularItems('cleanup');\n                kendo.destroy(this.element.children());\n                this.element.empty();\n                this._userEvents.cancel();\n                this._style();\n                return this.insertAt(dataItems, 0);\n            },\n            replaceGrouped: function (groups) {\n                this.options.type = 'group';\n                this._angularItems('cleanup');\n                this.element.empty();\n                var items = $(kendo.render(this.groupTemplate, groups));\n                this._enhanceItems(items.children('ul').children('li'));\n                this.element.append(items);\n                mobile.init(items);\n                this._style();\n                this._angularItems('compile');\n            },\n            remove: function (dataItems) {\n                var items = this.findByDataItem(dataItems);\n                this.angular('cleanup', function () {\n                    return { elements: items };\n                });\n                kendo.destroy(items);\n                items.remove();\n            },\n            findByDataItem: function (dataItems) {\n                var selectors = [];\n                for (var idx = 0, length = dataItems.length; idx < length; idx++) {\n                    selectors[idx] = '[data-' + kendo.ns + 'uid=' + dataItems[idx].uid + ']';\n                }\n                return this.element.find(selectors.join(','));\n            },\n            setDataItem: function (item, dataItem) {\n                var listView = this, replaceItem = function (items) {\n                        var newItem = $(items[0]);\n                        kendo.destroy(item);\n                        listView.angular('cleanup', function () {\n                            return { elements: [$(item)] };\n                        });\n                        $(item).replaceWith(newItem);\n                        listView.trigger(ITEM_CHANGE, {\n                            item: newItem,\n                            data: dataItem,\n                            ns: ui\n                        });\n                    };\n                return this._renderItems([dataItem], replaceItem)[0];\n            },\n            updateSize: function () {\n                this._size = this.getSize();\n            },\n            _renderItems: function (dataItems, callback) {\n                var items = $(kendo.render(this.template, dataItems));\n                callback(items);\n                this.angular('compile', function () {\n                    return {\n                        elements: items,\n                        data: dataItems.map(function (data) {\n                            return { dataItem: data };\n                        })\n                    };\n                });\n                mobile.init(items);\n                this._enhanceItems(items);\n                return items;\n            },\n            _dim: function (e) {\n                this._toggle(e, false);\n            },\n            _highlight: function (e) {\n                this._toggle(e, true);\n            },\n            _toggle: function (e, highlight) {\n                if (e.which > 1) {\n                    return;\n                }\n                var clicked = $(e.currentTarget), item = clicked.parent(), role = attrValue(clicked, 'role') || '', plainItem = !role.match(buttonRegExp), prevented = e.isDefaultPrevented();\n                if (plainItem) {\n                    item.toggleClass(ACTIVE_CLASS, highlight && !prevented);\n                }\n            },\n            _templates: function () {\n                var template = this.options.template, headerTemplate = this.options.headerTemplate, dataIDAttribute = ' data-uid=\"#=arguments[0].uid || \"\"#\"', templateProxy = {}, groupTemplateProxy = {};\n                if (typeof template === FUNCTION) {\n                    templateProxy.template = template;\n                    template = '#=this.template(data)#';\n                }\n                this.template = proxy(kendo.template('<li' + dataIDAttribute + '>' + template + '</li>'), templateProxy);\n                groupTemplateProxy.template = this.template;\n                if (typeof headerTemplate === FUNCTION) {\n                    groupTemplateProxy._headerTemplate = headerTemplate;\n                    headerTemplate = '#=this._headerTemplate(data)#';\n                }\n                groupTemplateProxy.headerTemplate = kendo.template(headerTemplate);\n                this.groupTemplate = proxy(GROUP_TEMPLATE, groupTemplateProxy);\n            },\n            _click: function (e) {\n                if (e.event.which > 1 || e.event.isDefaultPrevented()) {\n                    return;\n                }\n                var dataItem, item = e.target, target = $(e.event.target), buttonElement = target.closest(kendo.roleSelector('button', 'detailbutton', 'backbutton')), button = kendo.widgetInstance(buttonElement, ui), id = item.attr(kendo.attr('uid'));\n                if (id) {\n                    dataItem = this.dataSource.getByUid(id);\n                }\n                if (this.trigger(CLICK, {\n                        target: target,\n                        item: item,\n                        dataItem: dataItem,\n                        button: button\n                    })) {\n                    e.preventDefault();\n                }\n            },\n            _styleGroups: function () {\n                var rootItems = this.element.children();\n                rootItems.children('ul').addClass('km-list');\n                rootItems.each(function () {\n                    var li = $(this), groupHeader = li.contents().first();\n                    li.addClass('km-group-container');\n                    if (!groupHeader.is('ul') && !groupHeader.is('div.' + GROUP_CLASS)) {\n                        groupHeader.wrap(GROUP_WRAPPER);\n                    }\n                });\n            },\n            _style: function () {\n                var options = this.options, grouped = options.type === 'group', element = this.element, inset = options.style === 'inset';\n                element.addClass('km-listview').toggleClass('km-list', !grouped).toggleClass('km-virtual-list', this.virtual).toggleClass('km-listinset', !grouped && inset).toggleClass('km-listgroup', grouped && !inset).toggleClass('km-listgroupinset', grouped && inset);\n                if (!element.parents('.km-listview')[0]) {\n                    element.closest('.km-content').toggleClass('km-insetcontent', inset);\n                }\n                if (grouped) {\n                    this._styleGroups();\n                }\n                this.trigger(STYLED);\n            },\n            _enhanceItems: function (items) {\n                items.each(function () {\n                    var item = $(this), child, enhanced = false;\n                    item.children().each(function () {\n                        child = $(this);\n                        if (child.is('a')) {\n                            enhanceLinkItem(child);\n                            enhanced = true;\n                        } else if (child.is('label')) {\n                            enhanceCheckBoxItem(child);\n                            enhanced = true;\n                        }\n                    });\n                    if (!enhanced) {\n                        enhanceItem(item);\n                    }\n                });\n            }\n        });\n        ui.plugin(ListView);\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.navbar', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.navbar',\n        name: 'NavBar',\n        category: 'mobile',\n        description: 'The Kendo mobile NavBar widget is used inside a mobile View or Layout Header element to display an application navigation bar.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, mobile = kendo.mobile, ui = mobile.ui, Widget = ui.Widget;\n        function createContainer(align, element) {\n            var items = element.find('[' + kendo.attr('align') + '=' + align + ']');\n            if (items[0]) {\n                return $('<div class=\"km-' + align + 'item\" />').append(items).prependTo(element);\n            }\n        }\n        function toggleTitle(centerElement) {\n            var siblings = centerElement.siblings(), noTitle = !!centerElement.children('ul')[0], showTitle = !!siblings[0] && $.trim(centerElement.text()) === '', android = !!(kendo.mobile.application && kendo.mobile.application.element.is('.km-android'));\n            centerElement.prevAll().toggleClass('km-absolute', noTitle);\n            centerElement.toggleClass('km-show-title', showTitle);\n            centerElement.toggleClass('km-fill-title', showTitle && !$.trim(centerElement.html()));\n            centerElement.toggleClass('km-no-title', noTitle);\n            centerElement.toggleClass('km-hide-title', android && !siblings.children().is(':visible'));\n        }\n        var NavBar = 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.container().bind('show', $.proxy(this, 'refresh'));\n                element.addClass('km-navbar').wrapInner($('<div class=\"km-view-title km-show-title\" />'));\n                that.leftElement = createContainer('left', element);\n                that.rightElement = createContainer('right', element);\n                that.centerElement = element.find('.km-view-title');\n            },\n            options: { name: 'NavBar' },\n            title: function (value) {\n                this.element.find(kendo.roleSelector('view-title')).text(value);\n                toggleTitle(this.centerElement);\n            },\n            refresh: function (e) {\n                var view = e.view;\n                this.title(view.options.title);\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                kendo.destroy(this.element);\n            }\n        });\n        ui.plugin(NavBar);\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.scrollview', [\n        'kendo.fx',\n        'kendo.data',\n        'kendo.draganddrop'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.scrollview',\n        name: 'ScrollView',\n        category: 'mobile',\n        description: 'The Kendo Mobile ScrollView widget is used to scroll content wider than the device screen.',\n        depends: [\n            'fx',\n            'data',\n            'draganddrop'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, mobile = kendo.mobile, ui = mobile.ui, proxy = $.proxy, Transition = kendo.effects.Transition, Pane = kendo.ui.Pane, PaneDimensions = kendo.ui.PaneDimensions, Widget = ui.DataBoundWidget, DataSource = kendo.data.DataSource, Buffer = kendo.data.Buffer, BatchBuffer = kendo.data.BatchBuffer, math = Math, abs = math.abs, ceil = math.ceil, round = math.round, max = math.max, min = math.min, floor = math.floor, CHANGE = 'change', CHANGING = 'changing', REFRESH = 'refresh', CURRENT_PAGE_CLASS = 'current-page', VIRTUAL_PAGE_CLASS = 'virtual-page', FUNCTION = 'function', ITEM_CHANGE = 'itemChange', CLEANUP = 'cleanup', VIRTUAL_PAGE_COUNT = 3, LEFT_PAGE = -1, CETER_PAGE = 0, RIGHT_PAGE = 1, LEFT_SWIPE = -1, NUDGE = 0, RIGHT_SWIPE = 1;\n        function className(name) {\n            return 'k-' + name + ' km-' + name;\n        }\n        var Pager = kendo.Class.extend({\n            init: function (scrollView) {\n                var that = this, element = $('<ol class=\\'' + className('pages') + '\\'/>');\n                scrollView.element.append(element);\n                this._changeProxy = proxy(that, '_change');\n                this._refreshProxy = proxy(that, '_refresh');\n                scrollView.bind(CHANGE, this._changeProxy);\n                scrollView.bind(REFRESH, this._refreshProxy);\n                $.extend(that, {\n                    element: element,\n                    scrollView: scrollView\n                });\n            },\n            items: function () {\n                return this.element.children();\n            },\n            _refresh: function (e) {\n                var pageHTML = '';\n                for (var idx = 0; idx < e.pageCount; idx++) {\n                    pageHTML += '<li/>';\n                }\n                this.element.html(pageHTML);\n                this.items().eq(e.page).addClass(className(CURRENT_PAGE_CLASS));\n            },\n            _change: function (e) {\n                this.items().removeClass(className(CURRENT_PAGE_CLASS)).eq(e.page).addClass(className(CURRENT_PAGE_CLASS));\n            },\n            destroy: function () {\n                this.scrollView.unbind(CHANGE, this._changeProxy);\n                this.scrollView.unbind(REFRESH, this._refreshProxy);\n                this.element.remove();\n            }\n        });\n        kendo.mobile.ui.ScrollViewPager = Pager;\n        var TRANSITION_END = 'transitionEnd', DRAG_START = 'dragStart', DRAG_END = 'dragEnd';\n        var ElasticPane = kendo.Observable.extend({\n            init: function (element, options) {\n                var that = this;\n                kendo.Observable.fn.init.call(this);\n                this.element = element;\n                this.container = element.parent();\n                var movable, transition, userEvents, dimensions, dimension, pane;\n                movable = new kendo.ui.Movable(that.element);\n                transition = new Transition({\n                    axis: 'x',\n                    movable: movable,\n                    onEnd: function () {\n                        that.trigger(TRANSITION_END);\n                    }\n                });\n                userEvents = new kendo.UserEvents(element, {\n                    fastTap: true,\n                    start: function (e) {\n                        if (abs(e.x.velocity) * 2 >= abs(e.y.velocity)) {\n                            userEvents.capture();\n                        } else {\n                            userEvents.cancel();\n                        }\n                        that.trigger(DRAG_START, e);\n                        transition.cancel();\n                    },\n                    allowSelection: true,\n                    end: function (e) {\n                        that.trigger(DRAG_END, e);\n                    }\n                });\n                dimensions = new PaneDimensions({\n                    element: that.element,\n                    container: that.container\n                });\n                dimension = dimensions.x;\n                dimension.bind(CHANGE, function () {\n                    that.trigger(CHANGE);\n                });\n                pane = new Pane({\n                    dimensions: dimensions,\n                    userEvents: userEvents,\n                    movable: movable,\n                    elastic: true\n                });\n                $.extend(that, {\n                    duration: options && options.duration || 1,\n                    movable: movable,\n                    transition: transition,\n                    userEvents: userEvents,\n                    dimensions: dimensions,\n                    dimension: dimension,\n                    pane: pane\n                });\n                this.bind([\n                    TRANSITION_END,\n                    DRAG_START,\n                    DRAG_END,\n                    CHANGE\n                ], options);\n            },\n            size: function () {\n                return {\n                    width: this.dimensions.x.getSize(),\n                    height: this.dimensions.y.getSize()\n                };\n            },\n            total: function () {\n                return this.dimension.getTotal();\n            },\n            offset: function () {\n                return -this.movable.x;\n            },\n            updateDimension: function () {\n                this.dimension.update(true);\n            },\n            refresh: function () {\n                this.dimensions.refresh();\n            },\n            moveTo: function (offset) {\n                this.movable.moveAxis('x', -offset);\n            },\n            transitionTo: function (offset, ease, instant) {\n                if (instant) {\n                    this.moveTo(-offset);\n                } else {\n                    this.transition.moveTo({\n                        location: offset,\n                        duration: this.duration,\n                        ease: ease\n                    });\n                }\n            }\n        });\n        kendo.mobile.ui.ScrollViewElasticPane = ElasticPane;\n        var ScrollViewContent = kendo.Observable.extend({\n            init: function (element, pane, options) {\n                var that = this;\n                kendo.Observable.fn.init.call(this);\n                that.element = element;\n                that.pane = pane;\n                that._getPages();\n                this.page = 0;\n                this.pageSize = options.pageSize || 1;\n                this.contentHeight = options.contentHeight;\n                this.enablePager = options.enablePager;\n                this.pagerOverlay = options.pagerOverlay;\n            },\n            scrollTo: function (page, instant) {\n                this.page = page;\n                this.pane.transitionTo(-page * this.pane.size().width, Transition.easeOutExpo, instant);\n            },\n            paneMoved: function (swipeType, bounce, callback, instant) {\n                var that = this, pane = that.pane, width = pane.size().width * that.pageSize, approx = round, ease = bounce ? Transition.easeOutBack : Transition.easeOutExpo, snap, nextPage;\n                if (swipeType === LEFT_SWIPE) {\n                    approx = ceil;\n                } else if (swipeType === RIGHT_SWIPE) {\n                    approx = floor;\n                }\n                nextPage = approx(pane.offset() / width);\n                snap = max(that.minSnap, min(-nextPage * width, that.maxSnap));\n                if (nextPage != that.page) {\n                    if (callback && callback({\n                            currentPage: that.page,\n                            nextPage: nextPage\n                        })) {\n                        snap = -that.page * pane.size().width;\n                    }\n                }\n                pane.transitionTo(snap, ease, instant);\n            },\n            updatePage: function () {\n                var pane = this.pane, page = round(pane.offset() / pane.size().width);\n                if (page != this.page) {\n                    this.page = page;\n                    return true;\n                }\n                return false;\n            },\n            forcePageUpdate: function () {\n                return this.updatePage();\n            },\n            resizeTo: function (size) {\n                var pane = this.pane, width = size.width;\n                this.pageElements.width(width);\n                if (this.contentHeight === '100%') {\n                    var containerHeight = this.element.parent().height();\n                    if (this.enablePager === true) {\n                        var pager = this.element.parent().find('ol.km-pages');\n                        if (!this.pagerOverlay && pager.length) {\n                            containerHeight -= kendo._outerHeight(pager, true);\n                        }\n                    }\n                    this.element.css('height', containerHeight);\n                    this.pageElements.css('height', containerHeight);\n                }\n                pane.updateDimension();\n                if (!this._paged) {\n                    this.page = floor(pane.offset() / width);\n                }\n                this.scrollTo(this.page, true);\n                this.pageCount = ceil(pane.total() / width);\n                this.minSnap = -(this.pageCount - 1) * width;\n                this.maxSnap = 0;\n            },\n            _getPages: function () {\n                this.pageElements = this.element.find(kendo.roleSelector('page'));\n                this._paged = this.pageElements.length > 0;\n            }\n        });\n        kendo.mobile.ui.ScrollViewContent = ScrollViewContent;\n        var VirtualScrollViewContent = kendo.Observable.extend({\n            init: function (element, pane, options) {\n                var that = this;\n                kendo.Observable.fn.init.call(this);\n                that.element = element;\n                that.pane = pane;\n                that.options = options;\n                that._templates();\n                that.page = options.page || 0;\n                that.pages = [];\n                that._initPages();\n                that.resizeTo(that.pane.size());\n                that.pane.dimension.forceEnabled();\n            },\n            setDataSource: function (dataSource) {\n                this.dataSource = DataSource.create(dataSource);\n                this._buffer();\n                this._pendingPageRefresh = false;\n                this._pendingWidgetRefresh = false;\n            },\n            _viewShow: function () {\n                var that = this;\n                if (that._pendingWidgetRefresh) {\n                    setTimeout(function () {\n                        that._resetPages();\n                    }, 0);\n                    that._pendingWidgetRefresh = false;\n                }\n            },\n            _buffer: function () {\n                var itemsPerPage = this.options.itemsPerPage;\n                if (this.buffer) {\n                    this.buffer.destroy();\n                }\n                if (itemsPerPage > 1) {\n                    this.buffer = new BatchBuffer(this.dataSource, itemsPerPage);\n                } else {\n                    this.buffer = new Buffer(this.dataSource, itemsPerPage * 3);\n                }\n                this._resizeProxy = proxy(this, '_onResize');\n                this._resetProxy = proxy(this, '_onReset');\n                this._endReachedProxy = proxy(this, '_onEndReached');\n                this.buffer.bind({\n                    'resize': this._resizeProxy,\n                    'reset': this._resetProxy,\n                    'endreached': this._endReachedProxy\n                });\n            },\n            _templates: function () {\n                var template = this.options.template, emptyTemplate = this.options.emptyTemplate, templateProxy = {}, emptyTemplateProxy = {};\n                if (typeof template === FUNCTION) {\n                    templateProxy.template = template;\n                    template = '#=this.template(data)#';\n                }\n                this.template = proxy(kendo.template(template), templateProxy);\n                if (typeof emptyTemplate === FUNCTION) {\n                    emptyTemplateProxy.emptyTemplate = emptyTemplate;\n                    emptyTemplate = '#=this.emptyTemplate(data)#';\n                }\n                this.emptyTemplate = proxy(kendo.template(emptyTemplate), emptyTemplateProxy);\n            },\n            _initPages: function () {\n                var pages = this.pages, element = this.element, page;\n                for (var i = 0; i < VIRTUAL_PAGE_COUNT; i++) {\n                    page = new Page(element);\n                    pages.push(page);\n                }\n                this.pane.updateDimension();\n            },\n            resizeTo: function (size) {\n                var pages = this.pages, pane = this.pane;\n                for (var i = 0; i < pages.length; i++) {\n                    pages[i].setWidth(size.width);\n                }\n                if (this.options.contentHeight === 'auto') {\n                    this.element.css('height', this.pages[1].element.height());\n                } else if (this.options.contentHeight === '100%') {\n                    var containerHeight = this.element.parent().height();\n                    if (this.options.enablePager === true) {\n                        var pager = this.element.parent().find('ol.km-pages');\n                        if (!this.options.pagerOverlay && pager.length) {\n                            containerHeight -= kendo._outerHeight(pager, true);\n                        }\n                    }\n                    this.element.css('height', containerHeight);\n                    pages[0].element.css('height', containerHeight);\n                    pages[1].element.css('height', containerHeight);\n                    pages[2].element.css('height', containerHeight);\n                }\n                pane.updateDimension();\n                this._repositionPages();\n                this.width = size.width;\n            },\n            scrollTo: function (page) {\n                var buffer = this.buffer, dataItem;\n                buffer.syncDataSource();\n                dataItem = buffer.at(page);\n                if (!dataItem) {\n                    return;\n                }\n                this._updatePagesContent(page);\n                this.page = page;\n            },\n            paneMoved: function (swipeType, bounce, callback, instant) {\n                var that = this, pane = that.pane, width = pane.size().width, offset = pane.offset(), thresholdPassed = Math.abs(offset) >= width / 3, ease = bounce ? kendo.effects.Transition.easeOutBack : kendo.effects.Transition.easeOutExpo, isEndReached = that.page + 2 > that.buffer.total(), nextPage, delta = 0;\n                if (swipeType === RIGHT_SWIPE) {\n                    if (that.page !== 0) {\n                        delta = -1;\n                    }\n                } else if (swipeType === LEFT_SWIPE && !isEndReached) {\n                    delta = 1;\n                } else if (offset > 0 && (thresholdPassed && !isEndReached)) {\n                    delta = 1;\n                } else if (offset < 0 && thresholdPassed) {\n                    if (that.page !== 0) {\n                        delta = -1;\n                    }\n                }\n                nextPage = that.page;\n                if (delta) {\n                    nextPage = delta > 0 ? nextPage + 1 : nextPage - 1;\n                }\n                if (callback && callback({\n                        currentPage: that.page,\n                        nextPage: nextPage\n                    })) {\n                    delta = 0;\n                }\n                if (delta === 0) {\n                    that._cancelMove(ease, instant);\n                } else if (delta === -1) {\n                    that._moveBackward(instant);\n                } else if (delta === 1) {\n                    that._moveForward(instant);\n                }\n            },\n            updatePage: function () {\n                var pages = this.pages;\n                if (this.pane.offset() === 0) {\n                    return false;\n                }\n                if (this.pane.offset() > 0) {\n                    pages.push(this.pages.shift());\n                    this.page++;\n                    this.setPageContent(pages[2], this.page + 1);\n                } else {\n                    pages.unshift(this.pages.pop());\n                    this.page--;\n                    this.setPageContent(pages[0], this.page - 1);\n                }\n                this._repositionPages();\n                this._resetMovable();\n                return true;\n            },\n            forcePageUpdate: function () {\n                var offset = this.pane.offset(), threshold = this.pane.size().width * 3 / 4;\n                if (abs(offset) > threshold) {\n                    return this.updatePage();\n                }\n                return false;\n            },\n            _resetMovable: function () {\n                this.pane.moveTo(0);\n            },\n            _moveForward: function (instant) {\n                this.pane.transitionTo(-this.width, kendo.effects.Transition.easeOutExpo, instant);\n            },\n            _moveBackward: function (instant) {\n                this.pane.transitionTo(this.width, kendo.effects.Transition.easeOutExpo, instant);\n            },\n            _cancelMove: function (ease, instant) {\n                this.pane.transitionTo(0, ease, instant);\n            },\n            _resetPages: function () {\n                this.page = this.options.page || 0;\n                this._updatePagesContent(this.page);\n                this._repositionPages();\n                this.trigger('reset');\n            },\n            _onResize: function () {\n                this.pageCount = ceil(this.dataSource.total() / this.options.itemsPerPage);\n                if (this._pendingPageRefresh) {\n                    this._updatePagesContent(this.page);\n                    this._pendingPageRefresh = false;\n                }\n                this.trigger('resize');\n            },\n            _onReset: function () {\n                this.pageCount = ceil(this.dataSource.total() / this.options.itemsPerPage);\n                this._resetPages();\n            },\n            _onEndReached: function () {\n                this._pendingPageRefresh = true;\n            },\n            _repositionPages: function () {\n                var pages = this.pages;\n                pages[0].position(LEFT_PAGE);\n                pages[1].position(CETER_PAGE);\n                pages[2].position(RIGHT_PAGE);\n            },\n            _updatePagesContent: function (offset) {\n                var pages = this.pages, currentPage = offset || 0;\n                this.setPageContent(pages[0], currentPage - 1);\n                this.setPageContent(pages[1], currentPage);\n                this.setPageContent(pages[2], currentPage + 1);\n            },\n            setPageContent: function (page, index) {\n                var buffer = this.buffer, template = this.template, emptyTemplate = this.emptyTemplate, view = null;\n                if (index >= 0) {\n                    view = buffer.at(index);\n                    if ($.isArray(view) && !view.length) {\n                        view = null;\n                    }\n                }\n                this.trigger(CLEANUP, { item: page.element });\n                if (view !== null) {\n                    page.content(template(view));\n                } else {\n                    page.content(emptyTemplate({}));\n                }\n                kendo.mobile.init(page.element);\n                this.trigger(ITEM_CHANGE, {\n                    item: page.element,\n                    data: view,\n                    ns: kendo.mobile.ui\n                });\n            }\n        });\n        kendo.mobile.ui.VirtualScrollViewContent = VirtualScrollViewContent;\n        var Page = kendo.Class.extend({\n            init: function (container) {\n                this.element = $('<div class=\\'' + className(VIRTUAL_PAGE_CLASS) + '\\'></div>');\n                this.width = container.width();\n                this.element.width(this.width);\n                container.append(this.element);\n            },\n            content: function (theContent) {\n                this.element.html(theContent);\n            },\n            position: function (position) {\n                this.element.css('transform', 'translate3d(' + this.width * position + 'px, 0, 0)');\n            },\n            setWidth: function (width) {\n                this.width = width;\n                this.element.width(width);\n            }\n        });\n        kendo.mobile.ui.VirtualPage = Page;\n        var ScrollView = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.element;\n                kendo.stripWhitespace(element[0]);\n                element.wrapInner('<div/>').addClass('k-widget ' + className('scrollview'));\n                if (this.options.enablePager) {\n                    this.pager = new Pager(this);\n                    if (this.options.pagerOverlay) {\n                        element.addClass(className('scrollview-overlay'));\n                    }\n                }\n                that.inner = element.children().first();\n                that.page = 0;\n                that.inner.css('height', options.contentHeight);\n                that.pane = new ElasticPane(that.inner, {\n                    duration: this.options.duration,\n                    transitionEnd: proxy(this, '_transitionEnd'),\n                    dragStart: proxy(this, '_dragStart'),\n                    dragEnd: proxy(this, '_dragEnd'),\n                    change: proxy(this, REFRESH)\n                });\n                that.bind('resize', function () {\n                    that.pane.refresh();\n                });\n                that.page = options.page;\n                var empty = this.inner.children().length === 0;\n                var content = empty ? new VirtualScrollViewContent(that.inner, that.pane, options) : new ScrollViewContent(that.inner, that.pane, options);\n                content.page = that.page;\n                content.bind('reset', function () {\n                    this._pendingPageRefresh = false;\n                    that._syncWithContent();\n                    that.trigger(REFRESH, {\n                        pageCount: content.pageCount,\n                        page: content.page\n                    });\n                });\n                content.bind('resize', function () {\n                    that.trigger(REFRESH, {\n                        pageCount: content.pageCount,\n                        page: content.page\n                    });\n                });\n                content.bind(ITEM_CHANGE, function (e) {\n                    that.trigger(ITEM_CHANGE, e);\n                    that.angular('compile', function () {\n                        return {\n                            elements: e.item,\n                            data: [{ dataItem: e.data }]\n                        };\n                    });\n                });\n                content.bind(CLEANUP, function (e) {\n                    that.angular('cleanup', function () {\n                        return { elements: e.item };\n                    });\n                });\n                that._content = content;\n                that.setDataSource(options.dataSource);\n                var mobileContainer = that.container();\n                if (mobileContainer.nullObject) {\n                    that.viewInit();\n                    that.viewShow();\n                } else {\n                    mobileContainer.bind('show', proxy(this, 'viewShow')).bind('init', proxy(this, 'viewInit'));\n                }\n            },\n            options: {\n                name: 'ScrollView',\n                page: 0,\n                duration: 400,\n                velocityThreshold: 0.8,\n                contentHeight: 'auto',\n                pageSize: 1,\n                itemsPerPage: 1,\n                bounceVelocityThreshold: 1.6,\n                enablePager: true,\n                pagerOverlay: false,\n                autoBind: true,\n                template: '',\n                emptyTemplate: ''\n            },\n            events: [\n                CHANGING,\n                CHANGE,\n                REFRESH\n            ],\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                kendo.destroy(this.element);\n            },\n            viewInit: function () {\n                if (this.options.autoBind) {\n                    this._content.scrollTo(this._content.page, true);\n                }\n            },\n            viewShow: function () {\n                this.pane.refresh();\n            },\n            refresh: function () {\n                var content = this._content;\n                content.resizeTo(this.pane.size());\n                this.page = content.page;\n                this.trigger(REFRESH, {\n                    pageCount: content.pageCount,\n                    page: content.page\n                });\n            },\n            content: function (html) {\n                this.element.children().first().html(html);\n                this._content._getPages();\n                this.pane.refresh();\n            },\n            value: function (item) {\n                var dataSource = this.dataSource;\n                if (item) {\n                    this.scrollTo(dataSource.indexOf(item), true);\n                } else {\n                    return dataSource.at(this.page);\n                }\n            },\n            scrollTo: function (page, instant) {\n                this._content.scrollTo(page, instant);\n                this._syncWithContent();\n            },\n            prev: function () {\n                var that = this, prevPage = that.page - 1;\n                if (that._content instanceof VirtualScrollViewContent) {\n                    that._content.paneMoved(RIGHT_SWIPE, undefined, function (eventData) {\n                        return that.trigger(CHANGING, eventData);\n                    });\n                } else if (prevPage > -1) {\n                    that.scrollTo(prevPage);\n                }\n            },\n            next: function () {\n                var that = this, nextPage = that.page + 1;\n                if (that._content instanceof VirtualScrollViewContent) {\n                    that._content.paneMoved(LEFT_SWIPE, undefined, function (eventData) {\n                        return that.trigger(CHANGING, eventData);\n                    });\n                } else if (nextPage < that._content.pageCount) {\n                    that.scrollTo(nextPage);\n                }\n            },\n            setDataSource: function (dataSource) {\n                if (!(this._content instanceof VirtualScrollViewContent)) {\n                    return;\n                }\n                var emptyDataSource = !dataSource;\n                this.dataSource = DataSource.create(dataSource);\n                this._content.setDataSource(this.dataSource);\n                if (this.options.autoBind && !emptyDataSource) {\n                    this.dataSource.fetch();\n                }\n            },\n            items: function () {\n                return this.element.find('.km-' + VIRTUAL_PAGE_CLASS);\n            },\n            _syncWithContent: function () {\n                var pages = this._content.pages, buffer = this._content.buffer, data, element;\n                this.page = this._content.page;\n                data = buffer ? buffer.at(this.page) : undefined;\n                if (!(data instanceof Array)) {\n                    data = [data];\n                }\n                element = pages ? pages[1].element : undefined;\n                this.trigger(CHANGE, {\n                    page: this.page,\n                    element: element,\n                    data: data\n                });\n            },\n            _dragStart: function () {\n                if (this._content.forcePageUpdate()) {\n                    this._syncWithContent();\n                }\n            },\n            _dragEnd: function (e) {\n                var that = this, velocity = e.x.velocity, velocityThreshold = this.options.velocityThreshold, swipeType = NUDGE, bounce = abs(velocity) > this.options.bounceVelocityThreshold;\n                if (velocity > velocityThreshold) {\n                    swipeType = RIGHT_SWIPE;\n                } else if (velocity < -velocityThreshold) {\n                    swipeType = LEFT_SWIPE;\n                }\n                this._content.paneMoved(swipeType, bounce, function (eventData) {\n                    return that.trigger(CHANGING, eventData);\n                });\n            },\n            _transitionEnd: function () {\n                if (this._content.updatePage()) {\n                    this._syncWithContent();\n                }\n            }\n        });\n        ui.plugin(ScrollView);\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.switch', [\n        'kendo.fx',\n        'kendo.userevents'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.switch',\n        name: 'Switch',\n        category: 'mobile',\n        description: 'The mobile Switch widget is used to display two exclusive choices.',\n        depends: [\n            'fx',\n            'userevents'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.mobile.ui, outerWidth = kendo._outerWidth, Widget = ui.Widget, support = kendo.support, CHANGE = 'change', SWITCHON = 'switch-on', SWITCHOFF = 'switch-off', MARGINLEFT = 'margin-left', ACTIVE_STATE = 'state-active', DISABLED_STATE = 'state-disabled', DISABLED = 'disabled', RESOLVEDPREFIX = support.transitions.css === undefined ? '' : support.transitions.css, TRANSFORMSTYLE = RESOLVEDPREFIX + 'transform', proxy = $.proxy;\n        function className(name) {\n            return 'k-' + name + ' km-' + name;\n        }\n        function limitValue(value, minLimit, maxLimit) {\n            return Math.max(minLimit, Math.min(maxLimit, value));\n        }\n        var SWITCH_MARKUP = '<span class=\"' + className('switch') + ' ' + className('widget') + '\">        <span class=\"' + className('switch-wrapper') + '\">            <span class=\"' + className('switch-background') + '\"></span>        </span>         <span class=\"' + className('switch-container') + '\">            <span class=\"' + className('switch-handle') + '\">                 <span class=\"' + className('switch-label-on') + '\">{0}</span>                 <span class=\"' + className('switch-label-off') + '\">{1}</span>             </span>         </span>    </span>';\n        var Switch = Widget.extend({\n            init: function (element, options) {\n                var that = this, checked;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                that.wrapper = $(kendo.format(SWITCH_MARKUP, options.onLabel, options.offLabel));\n                that.handle = that.wrapper.find('.km-switch-handle');\n                that.background = that.wrapper.find('.km-switch-background');\n                that.wrapper.insertBefore(that.element).prepend(that.element);\n                that._drag();\n                that.origin = parseInt(that.background.css(MARGINLEFT), 10);\n                that.constrain = 0;\n                that.snapPoint = 0;\n                element = that.element[0];\n                element.type = 'checkbox';\n                that._animateBackground = true;\n                checked = that.options.checked;\n                if (checked === null) {\n                    checked = element.checked;\n                }\n                that.check(checked);\n                that.options.enable = that.options.enable && !that.element.attr(DISABLED);\n                that.enable(that.options.enable);\n                that.refresh();\n                kendo.notify(that, kendo.mobile.ui);\n            },\n            refresh: function () {\n                var that = this, handleWidth = outerWidth(that.handle, true);\n                that.width = that.wrapper.width();\n                that.constrain = that.width - handleWidth;\n                that.snapPoint = that.constrain / 2;\n                if (typeof that.origin != 'number') {\n                    that.origin = parseInt(that.background.css(MARGINLEFT), 10);\n                }\n                that.background.data('origin', that.origin);\n                that.check(that.element[0].checked);\n            },\n            events: [CHANGE],\n            options: {\n                name: 'Switch',\n                onLabel: 'on',\n                offLabel: 'off',\n                checked: null,\n                enable: true\n            },\n            check: function (check) {\n                var that = this, element = that.element[0];\n                if (check === undefined) {\n                    return element.checked;\n                }\n                that._position(check ? that.constrain : 0);\n                element.checked = check;\n                that.wrapper.toggleClass(className(SWITCHON), check).toggleClass(className(SWITCHOFF), !check);\n            },\n            value: function () {\n                return this.check.apply(this, arguments);\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.userEvents.destroy();\n            },\n            toggle: function () {\n                var that = this;\n                that.check(!that.element[0].checked);\n            },\n            enable: function (enable) {\n                var element = this.element, wrapper = this.wrapper;\n                if (typeof enable == 'undefined') {\n                    enable = true;\n                }\n                this.options.enable = enable;\n                if (enable) {\n                    element.removeAttr(DISABLED);\n                } else {\n                    element.attr(DISABLED, DISABLED);\n                }\n                wrapper.toggleClass(className(DISABLED_STATE), !enable);\n            },\n            _resize: function () {\n                this.refresh();\n            },\n            _move: function (e) {\n                var that = this;\n                e.preventDefault();\n                that._position(limitValue(that.position + e.x.delta, 0, that.width - outerWidth(that.handle, true)));\n            },\n            _position: function (position) {\n                var that = this;\n                that.position = position;\n                that.handle.css(TRANSFORMSTYLE, 'translatex(' + position + 'px)');\n                if (that._animateBackground) {\n                    that.background.css(MARGINLEFT, that.origin + position);\n                }\n            },\n            _start: function () {\n                if (!this.options.enable) {\n                    this.userEvents.cancel();\n                } else {\n                    this.userEvents.capture();\n                    this.handle.addClass(className(ACTIVE_STATE));\n                }\n            },\n            _stop: function () {\n                var that = this;\n                that.handle.removeClass(className(ACTIVE_STATE));\n                that._toggle(that.position > that.snapPoint);\n            },\n            _toggle: function (checked) {\n                var that = this, handle = that.handle, element = that.element[0], value = element.checked, duration = kendo.mobile.application && kendo.mobile.application.os.wp ? 100 : 200, distance;\n                that.wrapper.toggleClass(className(SWITCHON), checked).toggleClass(className(SWITCHOFF), !checked);\n                that.position = distance = checked * that.constrain;\n                if (that._animateBackground) {\n                    that.background.kendoStop(true, true).kendoAnimate({\n                        effects: 'slideMargin',\n                        offset: distance,\n                        reset: true,\n                        reverse: !checked,\n                        axis: 'left',\n                        duration: duration\n                    });\n                }\n                handle.kendoStop(true, true).kendoAnimate({\n                    effects: 'slideTo',\n                    duration: duration,\n                    offset: distance + 'px,0',\n                    reset: true,\n                    complete: function () {\n                        if (value !== checked) {\n                            element.checked = checked;\n                            that.trigger(CHANGE, { checked: checked });\n                        }\n                    }\n                });\n            },\n            _drag: function () {\n                var that = this;\n                that.userEvents = new kendo.UserEvents(that.wrapper, {\n                    fastTap: true,\n                    tap: function () {\n                        if (that.options.enable) {\n                            that._toggle(!that.element[0].checked);\n                        }\n                    },\n                    start: proxy(that._start, that),\n                    move: proxy(that._move, that),\n                    end: proxy(that._stop, that)\n                });\n            }\n        });\n        ui.plugin(Switch);\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.tabstrip', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.tabstrip',\n        name: 'TabStrip',\n        category: 'mobile',\n        description: 'The mobile TabStrip widget is used inside a mobile view or layout footer element to display an application-wide group of navigation buttons.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.mobile.ui, Widget = ui.Widget, ACTIVE_STATE_CLASS = 'km-state-active', SELECT = 'select';\n        function createBadge(value) {\n            return $('<span class=\"km-badge\">' + value + '</span>');\n        }\n        var TabStrip = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that.container().bind('show', $.proxy(this, 'refresh'));\n                that.element.addClass('km-tabstrip').find('a').each(that._buildButton).eq(that.options.selectedIndex).addClass(ACTIVE_STATE_CLASS);\n                that.element.on('down', 'a', '_release');\n            },\n            events: [SELECT],\n            switchTo: function (url) {\n                var tabs = this.element.find('a'), tab, path, idx = 0, length = tabs.length;\n                if (isNaN(url)) {\n                    for (; idx < length; idx++) {\n                        tab = tabs[idx];\n                        path = tab.href.replace(/(\\#.+)(\\?.+)$/, '$1');\n                        if (path.indexOf(url, path.length - url.length) !== -1) {\n                            this._setActiveItem($(tab));\n                            return true;\n                        }\n                    }\n                } else {\n                    this._setActiveItem(tabs.eq(url));\n                    return true;\n                }\n                return false;\n            },\n            switchByFullUrl: function (url) {\n                var tab;\n                tab = this.element.find('a[href$=\\'' + url + '\\']');\n                this._setActiveItem(tab);\n            },\n            clear: function () {\n                this.currentItem().removeClass(ACTIVE_STATE_CLASS);\n            },\n            currentItem: function () {\n                return this.element.children('.' + ACTIVE_STATE_CLASS);\n            },\n            badge: function (item, value) {\n                var tabstrip = this.element, badge;\n                if (!isNaN(item)) {\n                    item = tabstrip.children().get(item);\n                }\n                item = tabstrip.find(item);\n                badge = $(item.find('.km-badge')[0] || createBadge(value).insertAfter(item.children('.km-icon')));\n                if (value || value === 0) {\n                    badge.html(value);\n                    return this;\n                }\n                if (value === false) {\n                    badge.empty().remove();\n                    return this;\n                }\n                return badge.html();\n            },\n            _release: function (e) {\n                if (e.which > 1) {\n                    return;\n                }\n                var that = this, item = $(e.currentTarget);\n                if (item[0] === that.currentItem()[0]) {\n                    return;\n                }\n                if (that.trigger(SELECT, { item: item })) {\n                    e.preventDefault();\n                } else {\n                    that._setActiveItem(item);\n                }\n            },\n            _setActiveItem: function (item) {\n                if (!item[0]) {\n                    return;\n                }\n                this.clear();\n                item.addClass(ACTIVE_STATE_CLASS);\n            },\n            _buildButton: function () {\n                var button = $(this), icon = kendo.attrValue(button, 'icon'), badge = kendo.attrValue(button, 'badge'), image = button.find('img'), iconSpan = $('<span class=\"km-icon\"/>');\n                button.addClass('km-button').attr(kendo.attr('role'), 'tab').contents().not(image).wrapAll('<span class=\"km-text\"/>');\n                if (image[0]) {\n                    image.addClass('km-image').prependTo(button);\n                } else {\n                    button.prepend(iconSpan);\n                    if (icon) {\n                        iconSpan.addClass('km-' + icon);\n                        if (badge || badge === 0) {\n                            createBadge(badge).insertAfter(iconSpan);\n                        }\n                    }\n                }\n            },\n            refresh: function (e) {\n                var url = e.view.id;\n                if (url && !this.switchTo(e.view.id)) {\n                    this.switchTo(url);\n                }\n            },\n            options: {\n                name: 'TabStrip',\n                selectedIndex: 0,\n                enable: true\n            }\n        });\n        ui.plugin(TabStrip);\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.angular', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'angular',\n        name: 'AngularJS Directives',\n        category: 'framework',\n        description: 'Adds Kendo UI for AngularJS directives',\n        depends: ['core'],\n        defer: true\n    };\n    (function ($, angular, undefined) {\n        'use strict';\n        if (!angular || !angular.injector) {\n            return;\n        }\n        var module = angular.module('kendo.directives', []), $injector = angular.injector(['ng']), $parse = $injector.get('$parse'), $timeout = $injector.get('$timeout'), $defaultCompile, $log = $injector.get('$log');\n        function withoutTimeout(f) {\n            var save = $timeout;\n            try {\n                $timeout = function (f) {\n                    return f();\n                };\n                return f();\n            } finally {\n                $timeout = save;\n            }\n        }\n        var OPTIONS_NOW;\n        var createDataSource = function () {\n            var types = {\n                TreeList: 'TreeListDataSource',\n                TreeView: 'HierarchicalDataSource',\n                Scheduler: 'SchedulerDataSource',\n                PivotGrid: 'PivotDataSource',\n                PivotConfigurator: 'PivotDataSource',\n                PanelBar: 'HierarchicalDataSource',\n                Menu: '$PLAIN',\n                ContextMenu: '$PLAIN'\n            };\n            var toDataSource = function (dataSource, type) {\n                if (type == '$PLAIN') {\n                    return dataSource;\n                }\n                return kendo.data[type].create(dataSource);\n            };\n            return function (scope, element, role, source) {\n                var type = types[role] || 'DataSource';\n                var current = scope.$eval(source);\n                var ds = toDataSource(current, type);\n                scope.$watch(source, function (mew) {\n                    var widget = kendoWidgetInstance(element);\n                    if (widget && typeof widget.setDataSource == 'function') {\n                        if (mew !== current) {\n                            var ds = toDataSource(mew, type);\n                            widget.setDataSource(ds);\n                            current = mew;\n                        }\n                    }\n                });\n                return ds;\n            };\n        }();\n        var ignoredAttributes = {\n            kDataSource: true,\n            kOptions: true,\n            kRebind: true,\n            kNgModel: true,\n            kNgDelay: true\n        };\n        var ignoredOwnProperties = {\n            name: true,\n            title: true,\n            style: true\n        };\n        function createWidget(scope, element, attrs, widget, origAttr, controllers) {\n            if (!(element instanceof jQuery)) {\n                throw new Error('The Kendo UI directives require jQuery to be available before AngularJS. Please include jquery before angular in the document.');\n            }\n            var kNgDelay = attrs.kNgDelay, delayValue = scope.$eval(kNgDelay);\n            controllers = controllers || [];\n            var ngModel = controllers[0], ngForm = controllers[1];\n            var ctor = $(element)[widget];\n            if (!ctor) {\n                window.console.error('Could not find: ' + widget);\n                return null;\n            }\n            var parsed = parseOptions(scope, element, attrs, widget, ctor);\n            var options = parsed.options;\n            if (parsed.unresolved.length) {\n                var promises = [];\n                for (var i = 0, len = parsed.unresolved.length; i < len; i++) {\n                    var unresolved = parsed.unresolved[i];\n                    var promise = $.Deferred(function (d) {\n                        var unwatch = scope.$watch(unresolved.path, function (newValue) {\n                            if (newValue !== undefined) {\n                                unwatch();\n                                d.resolve();\n                            }\n                        });\n                    }).promise();\n                    promises.push(promise);\n                }\n                $.when.apply(null, promises).then(createIt);\n                return;\n            }\n            if (kNgDelay && !delayValue) {\n                var root = scope.$root || scope;\n                var register = function () {\n                    var unregister = scope.$watch(kNgDelay, function (newValue) {\n                        if (newValue !== undefined) {\n                            unregister();\n                            element.removeAttr(attrs.$attr.kNgDelay);\n                            kNgDelay = null;\n                            $timeout(createIt);\n                        }\n                    });\n                };\n                if (/^\\$(digest|apply)$/.test(root.$$phase)) {\n                    register();\n                } else {\n                    scope.$apply(register);\n                }\n                return;\n            } else {\n                return createIt();\n            }\n            function createIt() {\n                var originalElement;\n                if (attrs.kRebind) {\n                    originalElement = $($(element)[0].cloneNode(true));\n                }\n                options = parseOptions(scope, element, attrs, widget, ctor).options;\n                if (element.is('select')) {\n                    (function (options) {\n                        if (options.length > 0) {\n                            var first = $(options[0]);\n                            if (!/\\S/.test(first.text()) && /^\\?/.test(first.val())) {\n                                first.remove();\n                            }\n                            for (var i = 0; i < options.length; i++) {\n                                $(options[i]).off('$destroy');\n                            }\n                        }\n                    }(element[0].options));\n                }\n                var object = ctor.call(element, OPTIONS_NOW = options).data(widget);\n                exposeWidget(object, scope, attrs, widget, origAttr);\n                scope.$emit('kendoWidgetCreated', object);\n                var destroyRegister = destroyWidgetOnScopeDestroy(scope, object);\n                if (attrs.kRebind) {\n                    setupRebind(object, scope, element, originalElement, attrs.kRebind, destroyRegister, attrs);\n                }\n                if (attrs.kNgDisabled) {\n                    var kNgDisabled = attrs.kNgDisabled;\n                    var isDisabled = scope.$eval(kNgDisabled);\n                    if (isDisabled) {\n                        object.enable(!isDisabled);\n                    }\n                    bindToKNgDisabled(object, scope, element, kNgDisabled);\n                }\n                if (attrs.kNgReadonly) {\n                    var kNgReadonly = attrs.kNgReadonly;\n                    var isReadonly = scope.$eval(kNgReadonly);\n                    if (isReadonly) {\n                        object.readonly(isReadonly);\n                    }\n                    bindToKNgReadonly(object, scope, element, kNgReadonly);\n                }\n                if (attrs.kNgModel) {\n                    bindToKNgModel(object, scope, attrs.kNgModel);\n                }\n                if (ngModel) {\n                    bindToNgModel(object, scope, element, ngModel, ngForm);\n                }\n                if (object) {\n                    propagateClassToWidgetWrapper(object, element);\n                }\n                return object;\n            }\n        }\n        function parseOptions(scope, element, attrs, widget, ctor) {\n            var role = widget.replace(/^kendo/, '');\n            var unresolved = [];\n            var optionsPath = attrs.kOptions || attrs.options;\n            var optionsValue = scope.$eval(optionsPath);\n            if (optionsPath && optionsValue === undefined) {\n                unresolved.push({\n                    option: 'options',\n                    path: optionsPath\n                });\n            }\n            var options = angular.extend({}, attrs.defaultOptions, optionsValue);\n            function addOption(name, value) {\n                var scopeValue = angular.copy(scope.$eval(value));\n                if (scopeValue === undefined) {\n                    unresolved.push({\n                        option: name,\n                        path: value\n                    });\n                } else {\n                    options[name] = scopeValue;\n                }\n            }\n            var widgetOptions = ctor.widget.prototype.options;\n            var widgetEvents = ctor.widget.prototype.events;\n            $.each(attrs, function (name, value) {\n                if (name === 'source' || name === 'kDataSource' || name === 'kScopeField' || name === 'scopeField') {\n                    return;\n                }\n                var dataName = 'data' + name.charAt(0).toUpperCase() + name.slice(1);\n                if (name.indexOf('on') === 0) {\n                    var eventKey = name.replace(/^on./, function (prefix) {\n                        return prefix.charAt(2).toLowerCase();\n                    });\n                    if (widgetEvents.indexOf(eventKey) > -1) {\n                        options[eventKey] = value;\n                    }\n                }\n                if (widgetOptions.hasOwnProperty(dataName)) {\n                    addOption(dataName, value);\n                } else if (widgetOptions.hasOwnProperty(name) && !ignoredOwnProperties[name]) {\n                    addOption(name, value);\n                } else if (!ignoredAttributes[name]) {\n                    var match = name.match(/^k(On)?([A-Z].*)/);\n                    if (match) {\n                        var optionName = match[2].charAt(0).toLowerCase() + match[2].slice(1);\n                        if (match[1] && name != 'kOnLabel') {\n                            options[optionName] = value;\n                        } else {\n                            if (name == 'kOnLabel') {\n                                optionName = 'onLabel';\n                            }\n                            addOption(optionName, value);\n                        }\n                    }\n                }\n            });\n            var dataSource = attrs.kDataSource || attrs.source;\n            if (dataSource) {\n                options.dataSource = createDataSource(scope, element, role, dataSource);\n            }\n            options.$angular = [scope];\n            return {\n                options: options,\n                unresolved: unresolved\n            };\n        }\n        function bindToKNgDisabled(widget, scope, element, kNgDisabled) {\n            if (kendo.ui.PanelBar && widget instanceof kendo.ui.PanelBar || kendo.ui.Menu && widget instanceof kendo.ui.Menu) {\n                $log.warn('k-ng-disabled specified on a widget that does not have the enable() method: ' + widget.options.name);\n                return;\n            }\n            scope.$watch(kNgDisabled, function (newValue, oldValue) {\n                if (newValue != oldValue) {\n                    widget.enable(!newValue);\n                }\n            });\n        }\n        function bindToKNgReadonly(widget, scope, element, kNgReadonly) {\n            if (typeof widget.readonly != 'function') {\n                $log.warn('k-ng-readonly specified on a widget that does not have the readonly() method: ' + widget.options.name);\n                return;\n            }\n            scope.$watch(kNgReadonly, function (newValue, oldValue) {\n                if (newValue != oldValue) {\n                    widget.readonly(newValue);\n                }\n            });\n        }\n        function exposeWidget(widget, scope, attrs, kendoWidget, origAttr) {\n            if (attrs[origAttr]) {\n                var set = $parse(attrs[origAttr]).assign;\n                if (set) {\n                    set(scope, widget);\n                } else {\n                    throw new Error(origAttr + ' attribute used but expression in it is not assignable: ' + attrs[kendoWidget]);\n                }\n            }\n        }\n        function formValue(element) {\n            if (/checkbox|radio/i.test(element.attr('type'))) {\n                return element.prop('checked');\n            }\n            return element.val();\n        }\n        var formRegExp = /^(input|select|textarea)$/i;\n        function isForm(element) {\n            return formRegExp.test(element[0].tagName);\n        }\n        function bindToNgModel(widget, scope, element, ngModel, ngForm) {\n            if (!widget.value) {\n                return;\n            }\n            var value;\n            var haveChangeOnElement = false;\n            if (isForm(element)) {\n                value = function () {\n                    return formValue(element);\n                };\n            } else {\n                value = function () {\n                    return widget.value();\n                };\n            }\n            var viewRender = function () {\n                var val = ngModel.$viewValue;\n                if (val === undefined) {\n                    val = ngModel.$modelValue;\n                }\n                if (val === undefined) {\n                    val = null;\n                }\n                haveChangeOnElement = true;\n                setTimeout(function () {\n                    haveChangeOnElement = false;\n                    if (widget) {\n                        var kNgModel = scope[widget.element.attr('k-ng-model')];\n                        if (kNgModel) {\n                            val = kNgModel;\n                        }\n                        if (widget.options.autoBind === false && !widget.listView.bound()) {\n                            if (val) {\n                                widget.value(val);\n                            }\n                        } else {\n                            widget.value(val);\n                        }\n                    }\n                }, 0);\n            };\n            ngModel.$render = viewRender;\n            setTimeout(function () {\n                if (ngModel.$render !== viewRender) {\n                    ngModel.$render = viewRender;\n                    ngModel.$render();\n                }\n            });\n            if (isForm(element)) {\n                element.on('change', function () {\n                    haveChangeOnElement = true;\n                });\n            }\n            var onChange = function (pristine) {\n                return function () {\n                    var formPristine;\n                    if (haveChangeOnElement && !element.is('select')) {\n                        return;\n                    }\n                    if (pristine && ngForm) {\n                        formPristine = ngForm.$pristine;\n                    }\n                    ngModel.$setViewValue(value());\n                    if (pristine) {\n                        ngModel.$setPristine();\n                        if (formPristine) {\n                            ngForm.$setPristine();\n                        }\n                    }\n                    digest(scope);\n                };\n            };\n            widget.first('change', onChange(false));\n            widget.first('spin', onChange(false));\n            if (!(kendo.ui.AutoComplete && widget instanceof kendo.ui.AutoComplete)) {\n                widget.first('dataBound', onChange(true));\n            }\n            var currentVal = value();\n            if (!isNaN(ngModel.$viewValue) && currentVal != ngModel.$viewValue) {\n                if (!ngModel.$isEmpty(ngModel.$viewValue)) {\n                    widget.value(ngModel.$viewValue);\n                } else if (currentVal != null && currentVal !== '' && currentVal != ngModel.$viewValue) {\n                    ngModel.$setViewValue(currentVal);\n                }\n            }\n            ngModel.$setPristine();\n        }\n        function bindToKNgModel(widget, scope, kNgModel) {\n            if (typeof widget.value != 'function') {\n                $log.warn('k-ng-model specified on a widget that does not have the value() method: ' + widget.options.name);\n                return;\n            }\n            var form = $(widget.element).parents('ng-form, form').first();\n            var ngForm = kendo.getter(form.attr('name'), true)(scope);\n            var getter = $parse(kNgModel);\n            var setter = getter.assign;\n            var updating = false;\n            var valueIsCollection = kendo.ui.MultiSelect && widget instanceof kendo.ui.MultiSelect || kendo.ui.RangeSlider && widget instanceof kendo.ui.RangeSlider;\n            var length = function (value) {\n                return value && valueIsCollection ? value.length : 0;\n            };\n            var currentValueLength = length(getter(scope));\n            widget.$angular_setLogicValue(getter(scope));\n            var watchHandler = function (newValue, oldValue) {\n                if (newValue === undefined) {\n                    newValue = null;\n                }\n                if (updating || newValue == oldValue && length(newValue) == currentValueLength) {\n                    return;\n                }\n                currentValueLength = length(newValue);\n                widget.$angular_setLogicValue(newValue);\n            };\n            if (valueIsCollection) {\n                scope.$watchCollection(kNgModel, watchHandler);\n            } else {\n                scope.$watch(kNgModel, watchHandler);\n            }\n            var changeHandler = function () {\n                updating = true;\n                if (ngForm && ngForm.$pristine) {\n                    ngForm.$setDirty();\n                }\n                digest(scope, function () {\n                    setter(scope, widget.$angular_getLogicValue());\n                    currentValueLength = length(getter(scope));\n                });\n                updating = false;\n            };\n            widget.first('change', changeHandler);\n            widget.first('spin', changeHandler);\n        }\n        function destroyWidgetOnScopeDestroy(scope, widget) {\n            var deregister = scope.$on('$destroy', function () {\n                deregister();\n                if (widget) {\n                    kendo.destroy(widget.element);\n                    widget = null;\n                }\n            });\n            return deregister;\n        }\n        function propagateClassToWidgetWrapper(widget, element) {\n            if (!(window.MutationObserver && widget.wrapper)) {\n                return;\n            }\n            var prevClassList = [].slice.call($(element)[0].classList);\n            var mo = new MutationObserver(function (changes) {\n                suspend();\n                if (!widget) {\n                    return;\n                }\n                changes.forEach(function (chg) {\n                    var w = $(widget.wrapper)[0];\n                    switch (chg.attributeName) {\n                    case 'class':\n                        var currClassList = [].slice.call(chg.target.classList);\n                        currClassList.forEach(function (cls) {\n                            if (prevClassList.indexOf(cls) < 0) {\n                                w.classList.add(cls);\n                                if (kendo.ui.ComboBox && widget instanceof kendo.ui.ComboBox) {\n                                    widget.input[0].classList.add(cls);\n                                }\n                            }\n                        });\n                        prevClassList.forEach(function (cls) {\n                            if (currClassList.indexOf(cls) < 0) {\n                                w.classList.remove(cls);\n                                if (kendo.ui.ComboBox && widget instanceof kendo.ui.ComboBox) {\n                                    widget.input[0].classList.remove(cls);\n                                }\n                            }\n                        });\n                        prevClassList = currClassList;\n                        break;\n                    case 'disabled':\n                        if (typeof widget.enable == 'function' && !widget.element.attr('readonly')) {\n                            widget.enable(!$(chg.target).attr('disabled'));\n                        }\n                        break;\n                    case 'readonly':\n                        if (typeof widget.readonly == 'function' && !widget.element.attr('disabled')) {\n                            widget.readonly(!!$(chg.target).attr('readonly'));\n                        }\n                        break;\n                    }\n                });\n                resume();\n            });\n            function suspend() {\n                mo.disconnect();\n            }\n            function resume() {\n                mo.observe($(element)[0], { attributes: true });\n            }\n            resume();\n            widget.first('destroy', suspend);\n        }\n        function setupRebind(widget, scope, element, originalElement, rebindAttr, destroyRegister, attrs) {\n            var unregister = scope.$watch(rebindAttr, function (newValue, oldValue) {\n                if (!widget._muteRebind && newValue !== oldValue) {\n                    unregister();\n                    if (attrs._cleanUp) {\n                        attrs._cleanUp();\n                    }\n                    var templateOptions = WIDGET_TEMPLATE_OPTIONS[widget.options.name];\n                    if (templateOptions) {\n                        templateOptions.forEach(function (name) {\n                            var templateContents = scope.$eval(attrs['k' + name]);\n                            if (templateContents) {\n                                originalElement.append($(templateContents).attr(kendo.toHyphens('k' + name), ''));\n                            }\n                        });\n                    }\n                    var _wrapper = $(widget.wrapper)[0];\n                    var _element = $(widget.element)[0];\n                    var isUpload = widget.options.name === 'Upload';\n                    if (isUpload) {\n                        element = $(_element);\n                    }\n                    var compile = element.injector().get('$compile');\n                    widget._destroy();\n                    if (destroyRegister) {\n                        destroyRegister();\n                    }\n                    widget = null;\n                    if (_element) {\n                        if (_wrapper) {\n                            _wrapper.parentNode.replaceChild(_element, _wrapper);\n                        }\n                        $(element).replaceWith(originalElement);\n                    }\n                    compile(originalElement)(scope);\n                }\n            }, true);\n            digest(scope);\n        }\n        function bind(f, obj) {\n            return function (a, b) {\n                return f.call(obj, a, b);\n            };\n        }\n        function setTemplate(key, value) {\n            this[key] = kendo.stringify(value);\n        }\n        module.factory('directiveFactory', [\n            '$compile',\n            function (compile) {\n                var kendoRenderedTimeout;\n                var RENDERED = false;\n                $defaultCompile = compile;\n                var create = function (role, origAttr) {\n                    return {\n                        restrict: 'AC',\n                        require: [\n                            '?ngModel',\n                            '^?form'\n                        ],\n                        scope: false,\n                        controller: [\n                            '$scope',\n                            '$attrs',\n                            '$element',\n                            function ($scope, $attrs) {\n                                this.template = bind(setTemplate, $attrs);\n                                $attrs._cleanUp = bind(function () {\n                                    this.template = null;\n                                    $attrs._cleanUp = null;\n                                }, this);\n                            }\n                        ],\n                        link: function (scope, element, attrs, controllers) {\n                            var $element = $(element);\n                            var roleattr = role.replace(/([A-Z])/g, '-$1');\n                            $element.attr(roleattr, $element.attr('data-' + roleattr));\n                            $element[0].removeAttribute('data-' + roleattr);\n                            var widget = createWidget(scope, element, attrs, role, origAttr, controllers);\n                            if (!widget) {\n                                return;\n                            }\n                            if (kendoRenderedTimeout) {\n                                clearTimeout(kendoRenderedTimeout);\n                            }\n                            kendoRenderedTimeout = setTimeout(function () {\n                                scope.$emit('kendoRendered');\n                                if (!RENDERED) {\n                                    RENDERED = true;\n                                    $('form').each(function () {\n                                        var form = $(this).controller('form');\n                                        if (form) {\n                                            form.$setPristine();\n                                        }\n                                    });\n                                }\n                            });\n                        }\n                    };\n                };\n                return { create: create };\n            }\n        ]);\n        var TAGNAMES = {\n            Editor: 'textarea',\n            NumericTextBox: 'input',\n            DatePicker: 'input',\n            DateTimePicker: 'input',\n            TimePicker: 'input',\n            AutoComplete: 'input',\n            ColorPicker: 'input',\n            MaskedTextBox: 'input',\n            MultiSelect: 'input',\n            Upload: 'input',\n            Validator: 'form',\n            Button: 'button',\n            MobileButton: 'a',\n            MobileBackButton: 'a',\n            MobileDetailButton: 'a',\n            ListView: 'ul',\n            MobileListView: 'ul',\n            PanelBar: 'ul',\n            TreeView: 'ul',\n            Menu: 'ul',\n            ContextMenu: 'ul',\n            ActionSheet: 'ul'\n        };\n        var SKIP_SHORTCUTS = [\n            'MobileView',\n            'MobileDrawer',\n            'MobileLayout',\n            'MobileSplitView',\n            'MobilePane',\n            'MobileModalView'\n        ];\n        var MANUAL_DIRECTIVES = [\n            'MobileApplication',\n            'MobileView',\n            'MobileModalView',\n            'MobileLayout',\n            'MobileActionSheet',\n            'MobileDrawer',\n            'MobileSplitView',\n            'MobilePane',\n            'MobileScrollView',\n            'MobilePopOver'\n        ];\n        angular.forEach([\n            'MobileNavBar',\n            'MobileButton',\n            'MobileBackButton',\n            'MobileDetailButton',\n            'MobileTabStrip',\n            'MobileScrollView',\n            'MobileScroller'\n        ], function (widget) {\n            MANUAL_DIRECTIVES.push(widget);\n            widget = 'kendo' + widget;\n            module.directive(widget, function () {\n                return {\n                    restrict: 'A',\n                    link: function (scope, element, attrs) {\n                        createWidget(scope, element, attrs, widget, widget);\n                    }\n                };\n            });\n        });\n        function createDirectives(klass, isMobile) {\n            function make(directiveName, widgetName) {\n                module.directive(directiveName, [\n                    'directiveFactory',\n                    function (directiveFactory) {\n                        return directiveFactory.create(widgetName, directiveName);\n                    }\n                ]);\n            }\n            var name = isMobile ? 'Mobile' : '';\n            name += klass.fn.options.name;\n            var className = name;\n            var shortcut = 'kendo' + name.charAt(0) + name.substr(1).toLowerCase();\n            name = 'kendo' + name;\n            var dashed = name.replace(/([A-Z])/g, '-$1');\n            if (SKIP_SHORTCUTS.indexOf(name.replace('kendo', '')) == -1) {\n                var names = name === shortcut ? [name] : [\n                    name,\n                    shortcut\n                ];\n                angular.forEach(names, function (directiveName) {\n                    module.directive(directiveName, function () {\n                        return {\n                            restrict: 'E',\n                            replace: true,\n                            template: function (element, attributes) {\n                                var tag = TAGNAMES[className] || 'div';\n                                var scopeField = attributes.kScopeField || attributes.scopeField;\n                                return '<' + tag + ' ' + dashed + (scopeField ? '=\"' + scopeField + '\"' : '') + '>' + element.html() + '</' + tag + '>';\n                            }\n                        };\n                    });\n                });\n            }\n            if (MANUAL_DIRECTIVES.indexOf(name.replace('kendo', '')) > -1) {\n                return;\n            }\n            make(name, name);\n            if (shortcut != name) {\n                make(shortcut, name);\n            }\n        }\n        function kendoWidgetInstance(el) {\n            el = $(el);\n            return kendo.widgetInstance(el, kendo.ui) || kendo.widgetInstance(el, kendo.mobile.ui) || kendo.widgetInstance(el, kendo.dataviz.ui);\n        }\n        function digest(scope, func) {\n            var root = scope.$root || scope;\n            var isDigesting = /^\\$(digest|apply)$/.test(root.$$phase);\n            if (func) {\n                if (isDigesting) {\n                    func();\n                } else {\n                    root.$apply(func);\n                }\n            } else if (!isDigesting) {\n                root.$digest();\n            }\n        }\n        function destroyScope(scope, el) {\n            scope.$destroy();\n            if (el) {\n                $(el).removeData('$scope').removeData('$$kendoScope').removeData('$isolateScope').removeData('$isolateScopeNoTemplate').removeClass('ng-scope');\n            }\n        }\n        var pendingPatches = [];\n        function defadvice(klass, methodName, func) {\n            if ($.isArray(klass)) {\n                return angular.forEach(klass, function (klass) {\n                    defadvice(klass, methodName, func);\n                });\n            }\n            if (typeof klass == 'string') {\n                var a = klass.split('.');\n                var x = kendo;\n                while (x && a.length > 0) {\n                    x = x[a.shift()];\n                }\n                if (!x) {\n                    pendingPatches.push([\n                        klass,\n                        methodName,\n                        func\n                    ]);\n                    return false;\n                }\n                klass = x.prototype;\n            }\n            var origMethod = klass[methodName];\n            klass[methodName] = function () {\n                var self = this, args = arguments;\n                return func.apply({\n                    self: self,\n                    next: function () {\n                        return origMethod.apply(self, arguments.length > 0 ? arguments : args);\n                    }\n                }, args);\n            };\n            return true;\n        }\n        kendo.onWidgetRegistered(function (entry) {\n            pendingPatches = $.grep(pendingPatches, function (args) {\n                return !defadvice.apply(null, args);\n            });\n            createDirectives(entry.widget, entry.prefix == 'Mobile');\n        });\n        defadvice([\n            'ui.Widget',\n            'mobile.ui.Widget'\n        ], 'angular', function (cmd, arg) {\n            var self = this.self;\n            if (cmd == 'init') {\n                if (!arg && OPTIONS_NOW) {\n                    arg = OPTIONS_NOW;\n                }\n                OPTIONS_NOW = null;\n                if (arg && arg.$angular) {\n                    self.$angular_scope = arg.$angular[0];\n                    self.$angular_init(self.element, arg);\n                }\n                return;\n            }\n            var scope = self.$angular_scope;\n            if (scope) {\n                withoutTimeout(function () {\n                    var x = arg(), elements = x.elements, data = x.data;\n                    if (elements.length > 0) {\n                        switch (cmd) {\n                        case 'cleanup':\n                            angular.forEach(elements, function (el) {\n                                var itemScope = $(el).data('$$kendoScope');\n                                if (itemScope && itemScope !== scope && itemScope.$$kendoScope) {\n                                    destroyScope(itemScope, el);\n                                }\n                            });\n                            break;\n                        case 'compile':\n                            var injector = self.element.injector();\n                            var compile = injector ? injector.get('$compile') : $defaultCompile;\n                            angular.forEach(elements, function (el, i) {\n                                var itemScope;\n                                if (x.scopeFrom) {\n                                    itemScope = x.scopeFrom;\n                                } else {\n                                    var vars = data && data[i];\n                                    if (vars !== undefined) {\n                                        itemScope = $.extend(scope.$new(), vars);\n                                        itemScope.$$kendoScope = true;\n                                    } else {\n                                        itemScope = scope;\n                                    }\n                                }\n                                $(el).data('$$kendoScope', itemScope);\n                                compile(el)(itemScope);\n                            });\n                            digest(scope);\n                            break;\n                        }\n                    }\n                });\n            }\n        });\n        defadvice('ui.Widget', '$angular_getLogicValue', function () {\n            return this.self.value();\n        });\n        defadvice('ui.Widget', '$angular_setLogicValue', function (val) {\n            this.self.value(val);\n        });\n        defadvice('ui.Select', '$angular_getLogicValue', function () {\n            var item = this.self.dataItem(), valueField = this.self.options.dataValueField;\n            if (item) {\n                if (this.self.options.valuePrimitive) {\n                    if (!!valueField) {\n                        return item[valueField];\n                    } else {\n                        return item;\n                    }\n                } else {\n                    return item.toJSON();\n                }\n            } else {\n                return null;\n            }\n        });\n        defadvice('ui.Select', '$angular_setLogicValue', function (val) {\n            var self = this.self;\n            var options = self.options;\n            var valueField = options.dataValueField;\n            var text = options.text || '';\n            if (val === undefined) {\n                val = '';\n            }\n            if (valueField && !options.valuePrimitive && val) {\n                text = val[options.dataTextField] || '';\n                val = val[valueField || options.dataTextField];\n            }\n            if (self.options.autoBind === false && !self.listView.bound()) {\n                if (!text && val && options.valuePrimitive) {\n                    self.value(val);\n                } else {\n                    self._preselect(val, text);\n                }\n            } else {\n                self.value(val);\n            }\n        });\n        defadvice('ui.MultiSelect', '$angular_getLogicValue', function () {\n            var value = this.self.dataItems().slice(0);\n            var valueField = this.self.options.dataValueField;\n            if (valueField && this.self.options.valuePrimitive) {\n                value = $.map(value, function (item) {\n                    return item[valueField];\n                });\n            }\n            return value;\n        });\n        defadvice('ui.MultiSelect', '$angular_setLogicValue', function (val) {\n            if (val == null) {\n                val = [];\n            }\n            var self = this.self;\n            var options = self.options;\n            var valueField = options.dataValueField;\n            var data = val;\n            if (valueField && !options.valuePrimitive) {\n                val = $.map(val, function (item) {\n                    return item[valueField];\n                });\n            }\n            if (options.autoBind === false && !options.valuePrimitive && !self.listView.bound()) {\n                self._preselect(data, val);\n            } else {\n                self.value(val);\n            }\n        });\n        defadvice('ui.Widget', '$angular_init', function (element, options) {\n            var self = this.self;\n            if (options && !$.isArray(options)) {\n                var scope = self.$angular_scope;\n                for (var i = self.events.length; --i >= 0;) {\n                    var event = self.events[i];\n                    var handler = options[event];\n                    if (handler && typeof handler == 'string') {\n                        options[event] = self.$angular_makeEventHandler(event, scope, handler);\n                    }\n                }\n            }\n        });\n        defadvice('ui.Widget', '$angular_makeEventHandler', function (event, scope, handler) {\n            handler = $parse(handler);\n            return function (e) {\n                digest(scope, function () {\n                    handler(scope, { kendoEvent: e });\n                });\n            };\n        });\n        defadvice([\n            'ui.Grid',\n            'ui.ListView',\n            'ui.TreeView',\n            'ui.PanelBar'\n        ], '$angular_makeEventHandler', function (event, scope, handler) {\n            if (event != 'change') {\n                return this.next();\n            }\n            handler = $parse(handler);\n            return function (ev) {\n                var widget = ev.sender;\n                var options = widget.options;\n                var cell, multiple, locals = { kendoEvent: ev }, elems, items, columns, colIdx;\n                if (angular.isString(options.selectable)) {\n                    cell = options.selectable.indexOf('cell') !== -1;\n                    multiple = options.selectable.indexOf('multiple') !== -1;\n                }\n                if (widget._checkBoxSelection) {\n                    multiple = true;\n                }\n                elems = locals.selected = this.select();\n                items = locals.data = [];\n                columns = locals.columns = [];\n                for (var i = 0; i < elems.length; i++) {\n                    var item = cell ? elems[i].parentNode : elems[i];\n                    var dataItem = widget.dataItem(item);\n                    if (cell) {\n                        if (angular.element.inArray(dataItem, items) < 0) {\n                            items.push(dataItem);\n                        }\n                        colIdx = angular.element(elems[i]).index();\n                        if (angular.element.inArray(colIdx, columns) < 0) {\n                            columns.push(colIdx);\n                        }\n                    } else {\n                        items.push(dataItem);\n                    }\n                }\n                if (!multiple) {\n                    locals.dataItem = locals.data = items[0];\n                    locals.angularDataItem = kendo.proxyModelSetters(locals.dataItem);\n                    locals.selected = elems[0];\n                }\n                digest(scope, function () {\n                    handler(scope, locals);\n                });\n            };\n        });\n        defadvice('ui.Grid', '$angular_init', function (element, options) {\n            this.next();\n            if (options.columns) {\n                var settings = $.extend({}, kendo.Template, options.templateSettings);\n                angular.forEach(options.columns, function (col) {\n                    if (col.field && !col.template && !col.format && !col.values && (col.encoded === undefined || col.encoded)) {\n                        col.template = '<span ng-bind=\\'' + kendo.expr(col.field, 'dataItem') + '\\'>#: ' + kendo.expr(col.field, settings.paramName) + '#</span>';\n                    }\n                });\n            }\n        });\n        {\n            defadvice('mobile.ui.ButtonGroup', 'value', function (mew) {\n                var self = this.self;\n                if (mew != null) {\n                    self.select(self.element.children('li.km-button').eq(mew));\n                    self.trigger('change');\n                    self.trigger('select', { index: self.selectedIndex });\n                }\n                return self.selectedIndex;\n            });\n            defadvice('mobile.ui.ButtonGroup', '_select', function () {\n                this.next();\n                this.self.trigger('change');\n            });\n        }\n        module.directive('kendoMobileApplication', function () {\n            return {\n                terminal: true,\n                link: function (scope, element, attrs) {\n                    createWidget(scope, element, attrs, 'kendoMobileApplication', 'kendoMobileApplication');\n                }\n            };\n        }).directive('kendoMobileView', function () {\n            return {\n                scope: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        attrs._instance = createWidget(scope, element, attrs, 'kendoMobileView', 'kendoMobileView');\n                    },\n                    post: function (scope, element, attrs) {\n                        attrs._instance._layout();\n                        attrs._instance._scroller();\n                    }\n                }\n            };\n        }).directive('kendoMobileDrawer', function () {\n            return {\n                scope: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        attrs._instance = createWidget(scope, element, attrs, 'kendoMobileDrawer', 'kendoMobileDrawer');\n                    },\n                    post: function (scope, element, attrs) {\n                        attrs._instance._layout();\n                        attrs._instance._scroller();\n                    }\n                }\n            };\n        }).directive('kendoMobileModalView', function () {\n            return {\n                scope: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        attrs._instance = createWidget(scope, element, attrs, 'kendoMobileModalView', 'kendoMobileModalView');\n                    },\n                    post: function (scope, element, attrs) {\n                        attrs._instance._layout();\n                        attrs._instance._scroller();\n                    }\n                }\n            };\n        }).directive('kendoMobileSplitView', function () {\n            return {\n                terminal: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        attrs._instance = createWidget(scope, element, attrs, 'kendoMobileSplitView', 'kendoMobileSplitView');\n                    },\n                    post: function (scope, element, attrs) {\n                        attrs._instance._layout();\n                    }\n                }\n            };\n        }).directive('kendoMobilePane', function () {\n            return {\n                terminal: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        createWidget(scope, element, attrs, 'kendoMobilePane', 'kendoMobilePane');\n                    }\n                }\n            };\n        }).directive('kendoMobileLayout', function () {\n            return {\n                link: {\n                    pre: function (scope, element, attrs) {\n                        createWidget(scope, element, attrs, 'kendoMobileLayout', 'kendoMobileLayout');\n                    }\n                }\n            };\n        }).directive('kendoMobileActionSheet', function () {\n            return {\n                restrict: 'A',\n                link: function (scope, element, attrs) {\n                    element.find('a[k-action]').each(function () {\n                        $(this).attr('data-' + kendo.ns + 'action', $(this).attr('k-action'));\n                    });\n                    createWidget(scope, element, attrs, 'kendoMobileActionSheet', 'kendoMobileActionSheet');\n                }\n            };\n        }).directive('kendoMobilePopOver', function () {\n            return {\n                terminal: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        createWidget(scope, element, attrs, 'kendoMobilePopOver', 'kendoMobilePopOver');\n                    }\n                }\n            };\n        }).directive('kendoViewTitle', function () {\n            return {\n                restrict: 'E',\n                replace: true,\n                template: function (element) {\n                    return '<span data-' + kendo.ns + 'role=\\'view-title\\'>' + element.html() + '</span>';\n                }\n            };\n        }).directive('kendoMobileHeader', function () {\n            return {\n                restrict: 'E',\n                link: function (scope, element) {\n                    element.addClass('km-header').attr('data-role', 'header');\n                }\n            };\n        }).directive('kendoMobileFooter', function () {\n            return {\n                restrict: 'E',\n                link: function (scope, element) {\n                    element.addClass('km-footer').attr('data-role', 'footer');\n                }\n            };\n        }).directive('kendoMobileScrollViewPage', function () {\n            return {\n                restrict: 'E',\n                replace: true,\n                template: function (element) {\n                    return '<div data-' + kendo.ns + 'role=\\'page\\'>' + element.html() + '</div>';\n                }\n            };\n        });\n        angular.forEach([\n            'align',\n            'icon',\n            'rel',\n            'transition',\n            'actionsheetContext'\n        ], function (attr) {\n            var kAttr = 'k' + attr.slice(0, 1).toUpperCase() + attr.slice(1);\n            module.directive(kAttr, function () {\n                return {\n                    restrict: 'A',\n                    priority: 2,\n                    link: function (scope, element, attrs) {\n                        element.attr(kendo.attr(kendo.toHyphens(attr)), scope.$eval(attrs[kAttr]));\n                    }\n                };\n            });\n        });\n        var WIDGET_TEMPLATE_OPTIONS = {\n            'TreeMap': ['Template'],\n            'MobileListView': [\n                'HeaderTemplate',\n                'Template'\n            ],\n            'MobileScrollView': [\n                'EmptyTemplate',\n                'Template'\n            ],\n            'Grid': [\n                'AltRowTemplate',\n                'DetailTemplate',\n                'RowTemplate'\n            ],\n            'ListView': [\n                'EditTemplate',\n                'Template',\n                'AltTemplate'\n            ],\n            'Pager': [\n                'SelectTemplate',\n                'LinkTemplate'\n            ],\n            'PivotGrid': [\n                'ColumnHeaderTemplate',\n                'DataCellTemplate',\n                'RowHeaderTemplate'\n            ],\n            'Scheduler': [\n                'AllDayEventTemplate',\n                'DateHeaderTemplate',\n                'EventTemplate',\n                'MajorTimeHeaderTemplate',\n                'MinorTimeHeaderTemplate'\n            ],\n            'PanelBar': ['Template'],\n            'TreeView': ['Template'],\n            'Validator': ['ErrorTemplate']\n        };\n        (function () {\n            var templateDirectives = {};\n            angular.forEach(WIDGET_TEMPLATE_OPTIONS, function (templates, widget) {\n                angular.forEach(templates, function (template) {\n                    if (!templateDirectives[template]) {\n                        templateDirectives[template] = [];\n                    }\n                    templateDirectives[template].push('?^^kendo' + widget);\n                });\n            });\n            angular.forEach(templateDirectives, function (parents, directive) {\n                var templateName = 'k' + directive;\n                var attrName = kendo.toHyphens(templateName);\n                module.directive(templateName, function () {\n                    return {\n                        restrict: 'A',\n                        require: parents,\n                        terminal: true,\n                        compile: function ($element, $attrs) {\n                            if ($attrs[templateName] !== '') {\n                                return;\n                            }\n                            $element.removeAttr(attrName);\n                            var template = $element[0].outerHTML;\n                            return function (scope, element, attrs, controllers) {\n                                var controller;\n                                while (!controller && controllers.length) {\n                                    controller = controllers.shift();\n                                }\n                                if (!controller) {\n                                    $log.warn(attrName + ' without a matching parent widget found. It can be one of the following: ' + parents.join(', '));\n                                } else {\n                                    controller.template(templateName, template);\n                                    element.remove();\n                                }\n                            };\n                        }\n                    };\n                });\n            });\n        }());\n    }(window.kendo.jQuery, window.angular));\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.ui.core', [\n        'kendo.core',\n        'kendo.router',\n        'kendo.touch',\n        'kendo.view',\n        'kendo.fx',\n        'kendo.data.odata',\n        'kendo.data.xml',\n        'kendo.data',\n        'kendo.data.signalr',\n        'kendo.binder',\n        'kendo.validator',\n        'kendo.userevents',\n        'kendo.draganddrop',\n        'kendo.mobile.scroller',\n        'kendo.resizable',\n        'kendo.sortable',\n        'kendo.selectable',\n        'kendo.button',\n        'kendo.pager',\n        'kendo.popup',\n        'kendo.notification',\n        'kendo.tooltip',\n        'kendo.toolbar',\n        'kendo.list',\n        'kendo.calendar',\n        'kendo.dateinput',\n        'kendo.datepicker',\n        'kendo.autocomplete',\n        'kendo.dropdownlist',\n        'kendo.combobox',\n        'kendo.multiselect',\n        'kendo.colorpicker',\n        'kendo.listview',\n        'kendo.listbox',\n        'kendo.numerictextbox',\n        'kendo.maskedtextbox',\n        'kendo.menu',\n        'kendo.editable',\n        'kendo.panelbar',\n        'kendo.progressbar',\n        'kendo.responsivepanel',\n        'kendo.tabstrip',\n        'kendo.timepicker',\n        'kendo.datetimepicker',\n        'kendo.slider',\n        'kendo.splitter',\n        'kendo.dialog',\n        'kendo.window',\n        'kendo.virtuallist',\n        'kendo.mobile.popover',\n        'kendo.mobile.loader',\n        'kendo.mobile.scroller',\n        'kendo.mobile.shim',\n        'kendo.mobile.view',\n        'kendo.mobile.modalview',\n        'kendo.mobile.drawer',\n        'kendo.mobile.splitview',\n        'kendo.mobile.pane',\n        'kendo.mobile.application',\n        'kendo.mobile.actionsheet',\n        'kendo.mobile.button',\n        'kendo.mobile.buttongroup',\n        'kendo.mobile.collapsible',\n        'kendo.mobile.listview',\n        'kendo.mobile.navbar',\n        'kendo.mobile.scrollview',\n        'kendo.mobile.switch',\n        'kendo.mobile.tabstrip',\n        'kendo.angular'\n    ], f);\n}(function () {\n    'bundle all';\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));"]}