').width('100%').height('100%').css('top', container.scrollTop()).css(leftRight, Math.abs(containerScrollLeft) + webkitCorrection).prependTo(container);
}
} else if (mask) {
mask.remove();
}
},
plugin: function (widget, register, prefix) {
var name = widget.fn.options.name, getter;
register = register || kendo.ui;
prefix = prefix || '';
register[name] = widget;
register.roles[name.toLowerCase()] = widget;
getter = 'getKendo' + prefix + name;
name = 'kendo' + prefix + name;
var widgetEntry = {
name: name,
widget: widget,
prefix: prefix || ''
};
kendo.widgets.push(widgetEntry);
for (var i = 0, len = kendo._widgetRegisteredCallbacks.length; i < len; i++) {
kendo._widgetRegisteredCallbacks[i](widgetEntry);
}
$.fn[name] = function (options) {
var value = this, args;
if (typeof options === STRING) {
args = slice.call(arguments, 1);
this.each(function () {
var widget = $.data(this, name), method, result;
if (!widget) {
throw new Error(kendo.format('Cannot call method \'{0}\' of {1} before it is initialized', options, name));
}
method = widget[options];
if (typeof method !== FUNCTION) {
throw new Error(kendo.format('Cannot find method \'{0}\' of {1}', options, name));
}
result = method.apply(widget, args);
if (result !== undefined) {
value = result;
return false;
}
});
} else {
this.each(function () {
return new widget(this, options);
});
}
return value;
};
$.fn[name].widget = widget;
$.fn[getter] = function () {
return this.data(name);
};
}
});
var ContainerNullObject = {
bind: function () {
return this;
},
nullObject: true,
options: {}
};
var MobileWidget = Widget.extend({
init: function (element, options) {
Widget.fn.init.call(this, element, options);
this.element.autoApplyNS();
this.wrapper = this.element;
this.element.addClass('km-widget');
},
destroy: function () {
Widget.fn.destroy.call(this);
this.element.kendoDestroy();
},
options: { prefix: 'Mobile' },
events: [],
view: function () {
var viewElement = this.element.closest(kendo.roleSelector('view splitview modalview drawer'));
return kendo.widgetInstance(viewElement, kendo.mobile.ui) || ContainerNullObject;
},
viewHasNativeScrolling: function () {
var view = this.view();
return view && view.options.useNativeScrolling;
},
container: function () {
var element = this.element.closest(kendo.roleSelector('view layout modalview drawer splitview'));
return kendo.widgetInstance(element.eq(0), kendo.mobile.ui) || ContainerNullObject;
}
});
extend(kendo.mobile, {
init: function (element) {
kendo.init(element, kendo.mobile.ui, kendo.ui, kendo.dataviz.ui);
},
appLevelNativeScrolling: function () {
return kendo.mobile.application && kendo.mobile.application.options && kendo.mobile.application.options.useNativeScrolling;
},
roles: {},
ui: {
Widget: MobileWidget,
DataBoundWidget: DataBoundWidget.extend(MobileWidget.prototype),
roles: {},
plugin: function (widget) {
kendo.ui.plugin(widget, kendo.mobile.ui, 'Mobile');
}
}
});
deepExtend(kendo.dataviz, {
init: function (element) {
kendo.init(element, kendo.dataviz.ui);
},
ui: {
roles: {},
themes: {},
views: [],
plugin: function (widget) {
kendo.ui.plugin(widget, kendo.dataviz.ui);
}
},
roles: {}
});
kendo.touchScroller = function (elements, options) {
if (!options) {
options = {};
}
options.useNative = true;
return $(elements).map(function (idx, element) {
element = $(element);
if (support.kineticScrollNeeded && kendo.mobile.ui.Scroller && !element.data('kendoMobileScroller')) {
element.kendoMobileScroller(options);
return element.data('kendoMobileScroller');
} else {
return false;
}
})[0];
};
kendo.preventDefault = function (e) {
e.preventDefault();
};
kendo.widgetInstance = function (element, suites) {
var role = element.data(kendo.ns + 'role'), widgets = [], i, length;
if (role) {
if (role === 'content') {
role = 'scroller';
}
if (suites) {
if (suites[0]) {
for (i = 0, length = suites.length; i < length; i++) {
widgets.push(suites[i].roles[role]);
}
} else {
widgets.push(suites.roles[role]);
}
} else {
widgets = [
kendo.ui.roles[role],
kendo.dataviz.ui.roles[role],
kendo.mobile.ui.roles[role]
];
}
if (role.indexOf('.') >= 0) {
widgets = [kendo.getter(role)(window)];
}
for (i = 0, length = widgets.length; i < length; i++) {
var widget = widgets[i];
if (widget) {
var instance = element.data('kendo' + widget.fn.options.prefix + widget.fn.options.name);
if (instance) {
return instance;
}
}
}
}
};
kendo.onResize = function (callback) {
var handler = callback;
if (support.mobileOS.android) {
handler = function () {
setTimeout(callback, 600);
};
}
$(window).on(support.resize, handler);
return handler;
};
kendo.unbindResize = function (callback) {
$(window).off(support.resize, callback);
};
kendo.attrValue = function (element, key) {
return element.data(kendo.ns + key);
};
kendo.days = {
Sunday: 0,
Monday: 1,
Tuesday: 2,
Wednesday: 3,
Thursday: 4,
Friday: 5,
Saturday: 6
};
function focusable(element, isTabIndexNotNaN) {
var nodeName = element.nodeName.toLowerCase();
return (/input|select|textarea|button|object/.test(nodeName) ? !element.disabled : 'a' === nodeName ? element.href || isTabIndexNotNaN : isTabIndexNotNaN) && visible(element);
}
function visible(element) {
return $.expr.filters.visible(element) && !$(element).parents().addBack().filter(function () {
return $.css(this, 'visibility') === 'hidden';
}).length;
}
$.extend($.expr[':'], {
kendoFocusable: function (element) {
var idx = $.attr(element, 'tabindex');
return focusable(element, !isNaN(idx) && idx > -1);
}
});
var MOUSE_EVENTS = [
'mousedown',
'mousemove',
'mouseenter',
'mouseleave',
'mouseover',
'mouseout',
'mouseup',
'click'
];
var EXCLUDE_BUST_CLICK_SELECTOR = 'label, input, [data-rel=external]';
var MouseEventNormalizer = {
setupMouseMute: function () {
var idx = 0, length = MOUSE_EVENTS.length, element = document.documentElement;
if (MouseEventNormalizer.mouseTrap || !support.eventCapture) {
return;
}
MouseEventNormalizer.mouseTrap = true;
MouseEventNormalizer.bustClick = false;
MouseEventNormalizer.captureMouse = false;
var handler = function (e) {
if (MouseEventNormalizer.captureMouse) {
if (e.type === 'click') {
if (MouseEventNormalizer.bustClick && !$(e.target).is(EXCLUDE_BUST_CLICK_SELECTOR)) {
e.preventDefault();
e.stopPropagation();
}
} else {
e.stopPropagation();
}
}
};
for (; idx < length; idx++) {
element.addEventListener(MOUSE_EVENTS[idx], handler, true);
}
},
muteMouse: function (e) {
MouseEventNormalizer.captureMouse = true;
if (e.data.bustClick) {
MouseEventNormalizer.bustClick = true;
}
clearTimeout(MouseEventNormalizer.mouseTrapTimeoutID);
},
unMuteMouse: function () {
clearTimeout(MouseEventNormalizer.mouseTrapTimeoutID);
MouseEventNormalizer.mouseTrapTimeoutID = setTimeout(function () {
MouseEventNormalizer.captureMouse = false;
MouseEventNormalizer.bustClick = false;
}, 400);
}
};
var eventMap = {
down: 'touchstart mousedown',
move: 'mousemove touchmove',
up: 'mouseup touchend touchcancel',
cancel: 'mouseleave touchcancel'
};
if (support.touch && (support.mobileOS.ios || support.mobileOS.android)) {
eventMap = {
down: 'touchstart',
move: 'touchmove',
up: 'touchend touchcancel',
cancel: 'touchcancel'
};
} else if (support.pointers) {
eventMap = {
down: 'pointerdown',
move: 'pointermove',
up: 'pointerup',
cancel: 'pointercancel pointerleave'
};
} else if (support.msPointers) {
eventMap = {
down: 'MSPointerDown',
move: 'MSPointerMove',
up: 'MSPointerUp',
cancel: 'MSPointerCancel MSPointerLeave'
};
}
if (support.msPointers && !('onmspointerenter' in window)) {
$.each({
MSPointerEnter: 'MSPointerOver',
MSPointerLeave: 'MSPointerOut'
}, function (orig, fix) {
$.event.special[orig] = {
delegateType: fix,
bindType: fix,
handle: function (event) {
var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj;
if (!related || related !== target && !$.contains(target, related)) {
event.type = handleObj.origType;
ret = handleObj.handler.apply(this, arguments);
event.type = fix;
}
return ret;
}
};
});
}
var getEventMap = function (e) {
return eventMap[e] || e;
}, eventRegEx = /([^ ]+)/g;
kendo.applyEventMap = function (events, ns) {
events = events.replace(eventRegEx, getEventMap);
if (ns) {
events = events.replace(eventRegEx, '$1.' + ns);
}
return events;
};
var on = $.fn.on;
function kendoJQuery(selector, context) {
return new kendoJQuery.fn.init(selector, context);
}
extend(true, kendoJQuery, $);
kendoJQuery.fn = kendoJQuery.prototype = new $();
kendoJQuery.fn.constructor = kendoJQuery;
kendoJQuery.fn.init = function (selector, context) {
if (context && context instanceof $ && !(context instanceof kendoJQuery)) {
context = kendoJQuery(context);
}
return $.fn.init.call(this, selector, context, rootjQuery);
};
kendoJQuery.fn.init.prototype = kendoJQuery.fn;
var rootjQuery = kendoJQuery(document);
extend(kendoJQuery.fn, {
handler: function (handler) {
this.data('handler', handler);
return this;
},
autoApplyNS: function (ns) {
this.data('kendoNS', ns || kendo.guid());
return this;
},
on: function () {
var that = this, ns = that.data('kendoNS');
if (arguments.length === 1) {
return on.call(that, arguments[0]);
}
var context = that, args = slice.call(arguments);
if (typeof args[args.length - 1] === UNDEFINED) {
args.pop();
}
var callback = args[args.length - 1], events = kendo.applyEventMap(args[0], ns);
if (support.mouseAndTouchPresent && events.search(/mouse|click/) > -1 && this[0] !== document.documentElement) {
MouseEventNormalizer.setupMouseMute();
var selector = args.length === 2 ? null : args[1], bustClick = events.indexOf('click') > -1 && events.indexOf('touchend') > -1;
on.call(this, {
touchstart: MouseEventNormalizer.muteMouse,
touchend: MouseEventNormalizer.unMuteMouse
}, selector, { bustClick: bustClick });
}
if (typeof callback === STRING) {
context = that.data('handler');
callback = context[callback];
args[args.length - 1] = function (e) {
callback.call(context, e);
};
}
args[0] = events;
on.apply(that, args);
return that;
},
kendoDestroy: function (ns) {
ns = ns || this.data('kendoNS');
if (ns) {
this.off('.' + ns);
}
return this;
}
});
kendo.jQuery = kendoJQuery;
kendo.eventMap = eventMap;
kendo.timezone = function () {
var months = {
Jan: 0,
Feb: 1,
Mar: 2,
Apr: 3,
May: 4,
Jun: 5,
Jul: 6,
Aug: 7,
Sep: 8,
Oct: 9,
Nov: 10,
Dec: 11
};
var days = {
Sun: 0,
Mon: 1,
Tue: 2,
Wed: 3,
Thu: 4,
Fri: 5,
Sat: 6
};
function ruleToDate(year, rule) {
var date;
var targetDay;
var ourDay;
var month = rule[3];
var on = rule[4];
var time = rule[5];
var cache = rule[8];
if (!cache) {
rule[8] = cache = {};
}
if (cache[year]) {
return cache[year];
}
if (!isNaN(on)) {
date = new Date(Date.UTC(year, months[month], on, time[0], time[1], time[2], 0));
} else if (on.indexOf('last') === 0) {
date = new Date(Date.UTC(year, months[month] + 1, 1, time[0] - 24, time[1], time[2], 0));
targetDay = days[on.substr(4, 3)];
ourDay = date.getUTCDay();
date.setUTCDate(date.getUTCDate() + targetDay - ourDay - (targetDay > ourDay ? 7 : 0));
} else if (on.indexOf('>=') >= 0) {
date = new Date(Date.UTC(year, months[month], on.substr(5), time[0], time[1], time[2], 0));
targetDay = days[on.substr(0, 3)];
ourDay = date.getUTCDay();
date.setUTCDate(date.getUTCDate() + targetDay - ourDay + (targetDay < ourDay ? 7 : 0));
}
return cache[year] = date;
}
function findRule(utcTime, rules, zone) {
rules = rules[zone];
if (!rules) {
var time = zone.split(':');
var offset = 0;
if (time.length > 1) {
offset = time[0] * 60 + Number(time[1]);
}
return [
-1000000,
'max',
'-',
'Jan',
1,
[
0,
0,
0
],
offset,
'-'
];
}
var year = new Date(utcTime).getUTCFullYear();
rules = jQuery.grep(rules, function (rule) {
var from = rule[0];
var to = rule[1];
return from <= year && (to >= year || from == year && to == 'only' || to == 'max');
});
rules.push(utcTime);
rules.sort(function (a, b) {
if (typeof a != 'number') {
a = Number(ruleToDate(year, a));
}
if (typeof b != 'number') {
b = Number(ruleToDate(year, b));
}
return a - b;
});
var rule = rules[jQuery.inArray(utcTime, rules) - 1] || rules[rules.length - 1];
return isNaN(rule) ? rule : null;
}
function findZone(utcTime, zones, timezone) {
var zoneRules = zones[timezone];
if (typeof zoneRules === 'string') {
zoneRules = zones[zoneRules];
}
if (!zoneRules) {
throw new Error('Timezone "' + timezone + '" is either incorrect, or kendo.timezones.min.js is not included.');
}
for (var idx = zoneRules.length - 1; idx >= 0; idx--) {
var until = zoneRules[idx][3];
if (until && utcTime > until) {
break;
}
}
var zone = zoneRules[idx + 1];
if (!zone) {
throw new Error('Timezone "' + timezone + '" not found on ' + utcTime + '.');
}
return zone;
}
function zoneAndRule(utcTime, zones, rules, timezone) {
if (typeof utcTime != NUMBER) {
utcTime = Date.UTC(utcTime.getFullYear(), utcTime.getMonth(), utcTime.getDate(), utcTime.getHours(), utcTime.getMinutes(), utcTime.getSeconds(), utcTime.getMilliseconds());
}
var zone = findZone(utcTime, zones, timezone);
return {
zone: zone,
rule: findRule(utcTime, rules, zone[1])
};
}
function offset(utcTime, timezone) {
if (timezone == 'Etc/UTC' || timezone == 'Etc/GMT') {
return 0;
}
var info = zoneAndRule(utcTime, this.zones, this.rules, timezone);
var zone = info.zone;
var rule = info.rule;
return kendo.parseFloat(rule ? zone[0] - rule[6] : zone[0]);
}
function abbr(utcTime, timezone) {
var info = zoneAndRule(utcTime, this.zones, this.rules, timezone);
var zone = info.zone;
var rule = info.rule;
var base = zone[2];
if (base.indexOf('/') >= 0) {
return base.split('/')[rule && +rule[6] ? 1 : 0];
} else if (base.indexOf('%s') >= 0) {
return base.replace('%s', !rule || rule[7] == '-' ? '' : rule[7]);
}
return base;
}
function convert(date, fromOffset, toOffset) {
if (typeof fromOffset == STRING) {
fromOffset = this.offset(date, fromOffset);
}
if (typeof toOffset == STRING) {
toOffset = this.offset(date, toOffset);
}
var fromLocalOffset = date.getTimezoneOffset();
date = new Date(date.getTime() + (fromOffset - toOffset) * 60000);
var toLocalOffset = date.getTimezoneOffset();
return new Date(date.getTime() + (toLocalOffset - fromLocalOffset) * 60000);
}
function apply(date, timezone) {
return this.convert(date, date.getTimezoneOffset(), timezone);
}
function remove(date, timezone) {
return this.convert(date, timezone, date.getTimezoneOffset());
}
function toLocalDate(time) {
return this.apply(new Date(time), 'Etc/UTC');
}
return {
zones: {},
rules: {},
offset: offset,
convert: convert,
apply: apply,
remove: remove,
abbr: abbr,
toLocalDate: toLocalDate
};
}();
kendo.date = function () {
var MS_PER_MINUTE = 60000, MS_PER_DAY = 86400000;
function adjustDST(date, hours) {
if (hours === 0 && date.getHours() === 23) {
date.setHours(date.getHours() + 2);
return true;
}
return false;
}
function setDayOfWeek(date, day, dir) {
var hours = date.getHours();
dir = dir || 1;
day = (day - date.getDay() + 7 * dir) % 7;
date.setDate(date.getDate() + day);
adjustDST(date, hours);
}
function dayOfWeek(date, day, dir) {
date = new Date(date);
setDayOfWeek(date, day, dir);
return date;
}
function firstDayOfMonth(date) {
return new Date(date.getFullYear(), date.getMonth(), 1);
}
function lastDayOfMonth(date) {
var last = new Date(date.getFullYear(), date.getMonth() + 1, 0), first = firstDayOfMonth(date), timeOffset = Math.abs(last.getTimezoneOffset() - first.getTimezoneOffset());
if (timeOffset) {
last.setHours(first.getHours() + timeOffset / 60);
}
return last;
}
function getDate(date) {
date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);
adjustDST(date, 0);
return date;
}
function toUtcTime(date) {
return Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());
}
function getMilliseconds(date) {
return date.getTime() - getDate(date);
}
function isInTimeRange(value, min, max) {
var msMin = getMilliseconds(min), msMax = getMilliseconds(max), msValue;
if (!value || msMin == msMax) {
return true;
}
if (min >= max) {
max += MS_PER_DAY;
}
msValue = getMilliseconds(value);
if (msMin > msValue) {
msValue += MS_PER_DAY;
}
if (msMax < msMin) {
msMax += MS_PER_DAY;
}
return msValue >= msMin && msValue <= msMax;
}
function isInDateRange(value, min, max) {
var msMin = min.getTime(), msMax = max.getTime(), msValue;
if (msMin >= msMax) {
msMax += MS_PER_DAY;
}
msValue = value.getTime();
return msValue >= msMin && msValue <= msMax;
}
function addDays(date, offset) {
var hours = date.getHours();
date = new Date(date);
setTime(date, offset * MS_PER_DAY);
adjustDST(date, hours);
return date;
}
function setTime(date, milliseconds, ignoreDST) {
var offset = date.getTimezoneOffset();
var difference;
date.setTime(date.getTime() + milliseconds);
if (!ignoreDST) {
difference = date.getTimezoneOffset() - offset;
date.setTime(date.getTime() + difference * MS_PER_MINUTE);
}
}
function setHours(date, time) {
date = new Date(kendo.date.getDate(date).getTime() + kendo.date.getMilliseconds(time));
adjustDST(date, time.getHours());
return date;
}
function today() {
return getDate(new Date());
}
function isToday(date) {
return getDate(date).getTime() == today().getTime();
}
function toInvariantTime(date) {
var staticDate = new Date(1980, 1, 1, 0, 0, 0);
if (date) {
staticDate.setHours(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());
}
return staticDate;
}
return {
adjustDST: adjustDST,
dayOfWeek: dayOfWeek,
setDayOfWeek: setDayOfWeek,
getDate: getDate,
isInDateRange: isInDateRange,
isInTimeRange: isInTimeRange,
isToday: isToday,
nextDay: function (date) {
return addDays(date, 1);
},
previousDay: function (date) {
return addDays(date, -1);
},
toUtcTime: toUtcTime,
MS_PER_DAY: MS_PER_DAY,
MS_PER_HOUR: 60 * MS_PER_MINUTE,
MS_PER_MINUTE: MS_PER_MINUTE,
setTime: setTime,
setHours: setHours,
addDays: addDays,
today: today,
toInvariantTime: toInvariantTime,
firstDayOfMonth: firstDayOfMonth,
lastDayOfMonth: lastDayOfMonth,
getMilliseconds: getMilliseconds
};
}();
kendo.stripWhitespace = function (element) {
if (document.createNodeIterator) {
var iterator = document.createNodeIterator(element, NodeFilter.SHOW_TEXT, function (node) {
return node.parentNode == element ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
}, false);
while (iterator.nextNode()) {
if (iterator.referenceNode && !iterator.referenceNode.textContent.trim()) {
iterator.referenceNode.parentNode.removeChild(iterator.referenceNode);
}
}
} else {
for (var i = 0; i < element.childNodes.length; i++) {
var child = element.childNodes[i];
if (child.nodeType == 3 && !/\S/.test(child.nodeValue)) {
element.removeChild(child);
i--;
}
if (child.nodeType == 1) {
kendo.stripWhitespace(child);
}
}
}
};
var animationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) {
setTimeout(callback, 1000 / 60);
};
kendo.animationFrame = function (callback) {
animationFrame.call(window, callback);
};
var animationQueue = [];
kendo.queueAnimation = function (callback) {
animationQueue[animationQueue.length] = callback;
if (animationQueue.length === 1) {
kendo.runNextAnimation();
}
};
kendo.runNextAnimation = function () {
kendo.animationFrame(function () {
if (animationQueue[0]) {
animationQueue.shift()();
if (animationQueue[0]) {
kendo.runNextAnimation();
}
}
});
};
kendo.parseQueryStringParams = function (url) {
var queryString = url.split('?')[1] || '', params = {}, paramParts = queryString.split(/&|=/), length = paramParts.length, idx = 0;
for (; idx < length; idx += 2) {
if (paramParts[idx] !== '') {
params[decodeURIComponent(paramParts[idx])] = decodeURIComponent(paramParts[idx + 1]);
}
}
return params;
};
kendo.elementUnderCursor = function (e) {
if (typeof e.x.client != 'undefined') {
return document.elementFromPoint(e.x.client, e.y.client);
}
};
kendo.wheelDeltaY = function (jQueryEvent) {
var e = jQueryEvent.originalEvent, deltaY = e.wheelDeltaY, delta;
if (e.wheelDelta) {
if (deltaY === undefined || deltaY) {
delta = e.wheelDelta;
}
} else if (e.detail && e.axis === e.VERTICAL_AXIS) {
delta = -e.detail * 10;
}
return delta;
};
kendo.throttle = function (fn, delay) {
var timeout;
var lastExecTime = 0;
if (!delay || delay <= 0) {
return fn;
}
var throttled = function () {
var that = this;
var elapsed = +new Date() - lastExecTime;
var args = arguments;
function exec() {
fn.apply(that, args);
lastExecTime = +new Date();
}
if (!lastExecTime) {
return exec();
}
if (timeout) {
clearTimeout(timeout);
}
if (elapsed > delay) {
exec();
} else {
timeout = setTimeout(exec, delay - elapsed);
}
};
throttled.cancel = function () {
clearTimeout(timeout);
};
return throttled;
};
kendo.caret = function (element, start, end) {
var rangeElement;
var isPosition = start !== undefined;
if (end === undefined) {
end = start;
}
if (element[0]) {
element = element[0];
}
if (isPosition && element.disabled) {
return;
}
try {
if (element.selectionStart !== undefined) {
if (isPosition) {
element.focus();
element.setSelectionRange(start, end);
} else {
start = [
element.selectionStart,
element.selectionEnd
];
}
} else if (document.selection) {
if ($(element).is(':visible')) {
element.focus();
}
rangeElement = element.createTextRange();
if (isPosition) {
rangeElement.collapse(true);
rangeElement.moveStart('character', start);
rangeElement.moveEnd('character', end - start);
rangeElement.select();
} else {
var rangeDuplicated = rangeElement.duplicate(), selectionStart, selectionEnd;
rangeElement.moveToBookmark(document.selection.createRange().getBookmark());
rangeDuplicated.setEndPoint('EndToStart', rangeElement);
selectionStart = rangeDuplicated.text.length;
selectionEnd = selectionStart + rangeElement.text.length;
start = [
selectionStart,
selectionEnd
];
}
}
} catch (e) {
start = [];
}
return start;
};
kendo.compileMobileDirective = function (element, scope) {
var angular = window.angular;
element.attr('data-' + kendo.ns + 'role', element[0].tagName.toLowerCase().replace('kendo-mobile-', '').replace('-', ''));
angular.element(element).injector().invoke([
'$compile',
function ($compile) {
$compile(element)(scope);
if (!/^\$(digest|apply)$/.test(scope.$$phase)) {
scope.$digest();
}
}
]);
return kendo.widgetInstance(element, kendo.mobile.ui);
};
kendo.antiForgeryTokens = function () {
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');
$('input[name^=\'__RequestVerificationToken\']').each(function () {
tokens[this.name] = this.value;
});
if (csrf_param !== undefined && csrf_token !== undefined) {
tokens[csrf_param] = csrf_token;
}
return tokens;
};
kendo.cycleForm = function (form) {
var firstElement = form.find('input, .k-widget').first();
var lastElement = form.find('button, .k-button').last();
function focus(el) {
var widget = kendo.widgetInstance(el);
if (widget && widget.focus) {
widget.focus();
} else {
el.focus();
}
}
lastElement.on('keydown', function (e) {
if (e.keyCode == kendo.keys.TAB && !e.shiftKey) {
e.preventDefault();
focus(firstElement);
}
});
firstElement.on('keydown', function (e) {
if (e.keyCode == kendo.keys.TAB && e.shiftKey) {
e.preventDefault();
focus(lastElement);
}
});
};
(function () {
function postToProxy(dataURI, fileName, proxyURL, proxyTarget) {
var form = $('
'), NS = '.kendoMobileListView', STYLED = 'styled', DATABOUND = 'dataBound', DATABINDING = 'dataBinding', ITEM_CHANGE = 'itemChange', CLICK = 'click', CHANGE = 'change', PROGRESS = 'progress', FUNCTION = 'function', whitespaceRegExp = /^\s+$/, buttonRegExp = /button/;
function whitespace() {
return this.nodeType === Node.TEXT_NODE && this.nodeValue.match(whitespaceRegExp);
}
function addIcon(item, icon) {
if (icon && !item[0].querySelector('.km-icon')) {
item.prepend('
');
}
}
function enhanceItem(item) {
addIcon(item, attrValue(item, 'icon'));
addIcon(item, attrValue(item.children(ICON_SELECTOR), 'icon'));
}
function enhanceLinkItem(item) {
var parent = item.parent(), itemAndDetailButtons = item.add(parent.children(kendo.roleSelector('detailbutton'))), otherNodes = parent.contents().not(itemAndDetailButtons).not(whitespace);
if (otherNodes.length) {
return;
}
item.addClass('km-listview-link').attr(kendo.attr('role'), 'listview-link');
addIcon(item, attrValue(parent, 'icon'));
addIcon(item, attrValue(item, 'icon'));
}
function enhanceCheckBoxItem(label) {
if (!label[0].querySelector('input[type=checkbox],input[type=radio]')) {
return;
}
var item = label.parent();
if (item.contents().not(label).not(function () {
return this.nodeType == 3;
})[0]) {
return;
}
label.addClass('km-listview-label');
label.children('[type=checkbox],[type=radio]').addClass('km-widget km-icon km-check');
}
function putAt(element, top) {
$(element).css('transform', 'translate3d(0px, ' + top + 'px, 0px)');
}
var HeaderFixer = kendo.Class.extend({
init: function (listView) {
var scroller = listView.scroller();
if (!scroller) {
return;
}
this.options = listView.options;
this.element = listView.element;
this.scroller = listView.scroller();
this._shouldFixHeaders();
var headerFixer = this;
var cacheHeaders = function () {
headerFixer._cacheHeaders();
};
listView.bind('resize', cacheHeaders);
listView.bind(STYLED, cacheHeaders);
listView.bind(DATABOUND, cacheHeaders);
scroller.bind('scroll', function (e) {
headerFixer._fixHeader(e);
});
},
_fixHeader: function (e) {
if (!this.fixedHeaders) {
return;
}
var i = 0, scroller = this.scroller, headers = this.headers, scrollTop = e.scrollTop, headerPair, offset, header;
do {
headerPair = headers[i++];
if (!headerPair) {
header = $('
');
break;
}
offset = headerPair.offset;
header = headerPair.header;
} while (offset + 1 > scrollTop);
if (this.currentHeader != i) {
scroller.fixedContainer.html(header.clone());
this.currentHeader = i;
}
},
_shouldFixHeaders: function () {
this.fixedHeaders = this.options.type === 'group' && this.options.fixedHeaders;
},
_cacheHeaders: function () {
this._shouldFixHeaders();
if (!this.fixedHeaders) {
return;
}
var headers = [], offset = this.scroller.scrollTop;
this.element.find('.' + GROUP_CLASS).each(function (_, header) {
header = $(header);
headers.unshift({
offset: header.position().top + offset,
header: header
});
});
this.headers = headers;
this._fixHeader({ scrollTop: offset });
}
});
var DEFAULT_PULL_PARAMETERS = function () {
return { page: 1 };
};
var RefreshHandler = kendo.Class.extend({
init: function (listView) {
var handler = this, options = listView.options, scroller = listView.scroller(), pullParameters = options.pullParameters || DEFAULT_PULL_PARAMETERS;
this.listView = listView;
this.scroller = scroller;
listView.bind('_dataSource', function (e) {
handler.setDataSource(e.dataSource);
});
scroller.setOptions({
pullToRefresh: true,
pull: function () {
if (!handler._pulled) {
handler._pulled = true;
handler.dataSource.read(pullParameters.call(listView, handler._first));
}
},
messages: {
pullTemplate: options.messages.pullTemplate,
releaseTemplate: options.messages.releaseTemplate,
refreshTemplate: options.messages.refreshTemplate
}
});
},
setDataSource: function (dataSource) {
var handler = this;
this._first = dataSource.view()[0];
this.dataSource = dataSource;
dataSource.bind('change', function () {
handler._change();
});
dataSource.bind('error', function () {
handler._change();
});
},
_change: function () {
var scroller = this.scroller, dataSource = this.dataSource;
if (this._pulled) {
scroller.pullHandled();
}
if (this._pulled || !this._first) {
var view = dataSource.view();
if (view[0]) {
this._first = view[0];
}
}
this._pulled = false;
}
});
var VirtualList = kendo.Observable.extend({
init: function (options) {
var list = this;
kendo.Observable.fn.init.call(list);
list.buffer = options.buffer;
list.height = options.height;
list.item = options.item;
list.items = [];
list.footer = options.footer;
list.buffer.bind('reset', function () {
list.refresh();
});
},
refresh: function () {
var buffer = this.buffer, items = this.items, endReached = false;
while (items.length) {
items.pop().destroy();
}
this.offset = buffer.offset;
var itemConstructor = this.item, prevItem, item;
for (var idx = 0; idx < buffer.viewSize; idx++) {
if (idx === buffer.total()) {
endReached = true;
break;
}
item = itemConstructor(this.content(this.offset + items.length));
item.below(prevItem);
prevItem = item;
items.push(item);
}
this.itemCount = items.length;
this.trigger('reset');
this._resize();
if (endReached) {
this.trigger('endReached');
}
},
totalHeight: function () {
if (!this.items[0]) {
return 0;
}
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;
return (this.footer ? this.footer.height : 0) + bottom + remainingItemsCount * averageItemHeight;
},
batchUpdate: function (top) {
var height = this.height(), items = this.items, item, initialOffset = this.offset;
if (!items[0]) {
return;
}
if (this.lastDirection) {
while (items[items.length - 1].bottom > top + height * 2) {
if (this.offset === 0) {
break;
}
this.offset--;
item = items.pop();
item.update(this.content(this.offset));
item.above(items[0]);
items.unshift(item);
}
} else {
while (items[0].top < top - height) {
var nextIndex = this.offset + this.itemCount;
if (nextIndex === this.buffer.total()) {
this.trigger('endReached');
break;
}
if (nextIndex === this.buffer.length) {
break;
}
item = items.shift();
item.update(this.content(this.offset + this.itemCount));
item.below(items[items.length - 1]);
items.push(item);
this.offset++;
}
}
if (initialOffset !== this.offset) {
this._resize();
}
},
update: function (top) {
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;
if (!items[0]) {
return;
}
this.lastTop = top;
this.lastDirection = up;
if (up) {
if (items[0].top > topBorder && items[items.length - 1].bottom > bottomBorder + padding && this.offset > 0) {
this.offset--;
item = items.pop();
firstItem = items[0];
item.update(this.content(this.offset));
items.unshift(item);
item.above(firstItem);
list._resize();
}
} else {
if (items[items.length - 1].bottom < bottomBorder && items[0].top < topBorder - padding) {
var nextIndex = this.offset + itemCount;
if (nextIndex === this.buffer.total()) {
this.trigger('endReached');
} else if (nextIndex !== this.buffer.length) {
item = items.shift();
lastItem = items[items.length - 1];
items.push(item);
item.update(this.content(this.offset + this.itemCount));
list.offset++;
item.below(lastItem);
list._resize();
}
}
}
},
content: function (index) {
return this.buffer.at(index);
},
destroy: function () {
this.unbind();
},
_resize: function () {
var items = this.items, top = 0, bottom = 0, firstItem = items[0], lastItem = items[items.length - 1];
if (firstItem) {
top = firstItem.top;
bottom = lastItem.bottom;
}
this.trigger('resize', {
top: top,
bottom: bottom
});
if (this.footer) {
this.footer.below(lastItem);
}
}
});
kendo.mobile.ui.VirtualList = VirtualList;
var VirtualListViewItem = kendo.Class.extend({
init: function (listView, dataItem) {
var element = listView.append([dataItem], true)[0], height = element.offsetHeight;
$.extend(this, {
top: 0,
element: element,
listView: listView,
height: height,
bottom: height
});
},
update: function (dataItem) {
this.element = this.listView.setDataItem(this.element, dataItem);
},
above: function (item) {
if (item) {
this.height = this.element.offsetHeight;
this.top = item.top - this.height;
this.bottom = item.top;
putAt(this.element, this.top);
}
},
below: function (item) {
if (item) {
this.height = this.element.offsetHeight;
this.top = item.bottom;
this.bottom = this.top + this.height;
putAt(this.element, this.top);
}
},
destroy: function () {
kendo.destroy(this.element);
$(this.element).remove();
}
});
var LOAD_ICON = '
';
var VirtualListViewLoadingIndicator = kendo.Class.extend({
init: function (listView) {
this.element = $('
').appendTo(listView.element);
this._loadIcon = $(LOAD_ICON).appendTo(this.element);
},
enable: function () {
this.element.show();
this.height = this.element.outerHeight(true);
},
disable: function () {
this.element.hide();
this.height = 0;
},
below: function (item) {
if (item) {
this.top = item.bottom;
this.bottom = this.height + this.top;
putAt(this.element, this.top);
}
}
});
var VirtualListViewPressToLoadMore = VirtualListViewLoadingIndicator.extend({
init: function (listView, buffer) {
this._loadIcon = $(LOAD_ICON).hide();
this._loadButton = $('
' + listView.options.messages.loadMoreText + '').hide();
this.element = $('
').append(this._loadIcon).append(this._loadButton).appendTo(listView.element);
var loadMore = this;
this._loadButton.kendoMobileButton().data('kendoMobileButton').bind('click', function () {
loadMore._hideShowButton();
buffer.next();
});
buffer.bind('resize', function () {
loadMore._showLoadButton();
});
this.height = this.element.outerHeight(true);
this.disable();
},
_hideShowButton: function () {
this._loadButton.hide();
this.element.addClass('km-scroller-refresh');
this._loadIcon.css('display', 'block');
},
_showLoadButton: function () {
this._loadButton.show();
this.element.removeClass('km-scroller-refresh');
this._loadIcon.hide();
}
});
var VirtualListViewItemBinder = kendo.Class.extend({
init: function (listView) {
var binder = this;
this.chromeHeight = listView.wrapper.children().not(listView.element).outerHeight() || 0;
this.listView = listView;
this.scroller = listView.scroller();
this.options = listView.options;
listView.bind('_dataSource', function (e) {
binder.setDataSource(e.dataSource, e.empty);
});
listView.bind('resize', function () {
if (!binder.list.items.length) {
return;
}
binder.scroller.reset();
binder.buffer.range(0);
binder.list.refresh();
});
this.scroller.makeVirtual();
this.scroller.bind('scroll', function (e) {
binder.list.update(e.scrollTop);
});
this.scroller.bind('scrollEnd', function (e) {
binder.list.batchUpdate(e.scrollTop);
});
},
destroy: function () {
this.list.unbind();
this.buffer.unbind();
},
setDataSource: function (dataSource, empty) {
var binder = this, options = this.options, listView = this.listView, scroller = listView.scroller(), pressToLoadMore = options.loadMore, pageSize, buffer, footer;
this.dataSource = dataSource;
pageSize = dataSource.pageSize() || options.virtualViewSize;
if (!pageSize && !empty) {
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.');
}
if (this.buffer) {
this.buffer.destroy();
}
buffer = new kendo.data.Buffer(dataSource, Math.floor(pageSize / 2), pressToLoadMore);
if (pressToLoadMore) {
footer = new VirtualListViewPressToLoadMore(listView, buffer);
} else {
footer = new VirtualListViewLoadingIndicator(listView);
}
if (this.list) {
this.list.destroy();
}
var list = new VirtualList({
buffer: buffer,
footer: footer,
item: function (dataItem) {
return new VirtualListViewItem(listView, dataItem);
},
height: function () {
return scroller.height();
}
});
list.bind('resize', function () {
binder.updateScrollerSize();
listView.updateSize();
});
list.bind('reset', function () {
binder.footer.enable();
});
list.bind('endReached', function () {
footer.disable();
binder.updateScrollerSize();
});
buffer.bind('expand', function () {
list.lastDirection = false;
list.batchUpdate(scroller.scrollTop);
});
$.extend(this, {
buffer: buffer,
scroller: scroller,
list: list,
footer: footer
});
},
updateScrollerSize: function () {
this.scroller.virtualSize(0, this.list.totalHeight() + this.chromeHeight);
},
refresh: function () {
this.list.refresh();
},
reset: function () {
this.buffer.range(0);
this.list.refresh();
}
});
var ListViewItemBinder = kendo.Class.extend({
init: function (listView) {
var binder = this;
this.listView = listView;
this.options = listView.options;
var itemBinder = this;
this._refreshHandler = function (e) {
itemBinder.refresh(e);
};
this._progressHandler = function () {
listView.showLoading();
};
listView.bind('_dataSource', function (e) {
binder.setDataSource(e.dataSource);
});
},
destroy: function () {
this._unbindDataSource();
},
reset: function () {
},
refresh: function (e) {
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;
if (action === 'itemchange') {
if (!listView._hasBindingTarget()) {
item = listView.findByDataItem(dataItems)[0];
if (item) {
listView.setDataItem(item, dataItems[0]);
}
}
return;
}
var removedItems, addedItems, addedDataItems;
var adding = action === 'add' && !groupedMode || prependOnRefresh && !listView._filter;
var removing = action === 'remove' && !groupedMode;
if (adding) {
removedItems = [];
} else if (removing) {
removedItems = listView.findByDataItem(dataItems);
}
if (listView.trigger(DATABINDING, {
action: action || 'rebind',
items: dataItems,
removedItems: removedItems,
index: e && e.index
})) {
if (this._shouldShowLoading()) {
listView.hideLoading();
}
return;
}
if (action === 'add' && !groupedMode) {
var index = view.indexOf(dataItems[0]);
if (index > -1) {
addedItems = listView.insertAt(dataItems, index);
addedDataItems = dataItems;
}
} else if (action === 'remove' && !groupedMode) {
addedItems = [];
listView.remove(dataItems);
} else if (groupedMode) {
listView.replaceGrouped(view);
} else if (prependOnRefresh && !listView._filter) {
addedItems = listView.prepend(view);
addedDataItems = view;
} else {
listView.replace(view);
}
if (this._shouldShowLoading()) {
listView.hideLoading();
}
listView.trigger(DATABOUND, {
ns: ui,
addedItems: addedItems,
addedDataItems: addedDataItems
});
},
setDataSource: function (dataSource) {
if (this.dataSource) {
this._unbindDataSource();
}
this.dataSource = dataSource;
dataSource.bind(CHANGE, this._refreshHandler);
if (this._shouldShowLoading()) {
this.dataSource.bind(PROGRESS, this._progressHandler);
}
},
_unbindDataSource: function () {
this.dataSource.unbind(CHANGE, this._refreshHandler).unbind(PROGRESS, this._progressHandler);
},
_shouldShowLoading: function () {
var options = this.options;
return !options.pullToRefresh && !options.loadMore && !options.endlessScroll;
}
});
var ListViewFilter = kendo.Class.extend({
init: function (listView) {
var filter = this, filterable = listView.options.filterable, events = 'change paste', that = this;
this.listView = listView;
this.options = filterable;
listView.element.before(SEARCH_TEMPLATE({ placeholder: filterable.placeholder || 'Search...' }));
if (filterable.autoFilter !== false) {
events += ' keyup';
}
this.element = listView.wrapper.find('.km-search-form');
this.searchInput = listView.wrapper.find('input[type=search]').closest('form').on('submit' + NS, function (e) {
e.preventDefault();
}).end().on('focus' + NS, function () {
filter._oldFilter = filter.searchInput.val();
}).on(events.split(' ').join(NS + ' ') + NS, proxy(this._filterChange, this));
this.clearButton = listView.wrapper.find('.km-filter-reset').on(CLICK, proxy(this, '_clearFilter')).hide();
this._dataSourceChange = $.proxy(this._refreshInput, this);
listView.bind('_dataSource', function (e) {
e.dataSource.bind('change', that._dataSourceChange);
});
},
_refreshInput: function () {
var appliedFilters = this.listView.dataSource.filter();
var searchInput = this.listView._filter.searchInput;
if (!appliedFilters || appliedFilters.filters[0].field !== this.listView.options.filterable.field) {
searchInput.val('');
} else {
searchInput.val(appliedFilters.filters[0].value);
}
},
_search: function (expr) {
this._filter = true;
this.clearButton[expr ? 'show' : 'hide']();
this.listView.dataSource.filter(expr);
},
_filterChange: function (e) {
var filter = this;
if (e.type == 'paste' && this.options.autoFilter !== false) {
setTimeout(function () {
filter._applyFilter();
}, 1);
} else {
this._applyFilter();
}
},
_applyFilter: function () {
var options = this.options, value = this.searchInput.val(), expr = value.length ? {
field: options.field,
operator: options.operator || 'startswith',
ignoreCase: options.ignoreCase,
value: value
} : null;
if (value === this._oldFilter) {
return;
}
this._oldFilter = value;
this._search(expr);
},
_clearFilter: function (e) {
this.searchInput.val('');
this._search(null);
e.preventDefault();
}
});
var ListView = Widget.extend({
init: function (element, options) {
var listView = this;
Widget.fn.init.call(this, element, options);
element = this.element;
options = this.options;
if (options.scrollTreshold) {
options.scrollThreshold = options.scrollTreshold;
}
element.on('down', HIGHLIGHT_SELECTOR, '_highlight').on('move up cancel', HIGHLIGHT_SELECTOR, '_dim');
this._userEvents = new kendo.UserEvents(element, {
fastTap: true,
filter: ITEM_SELECTOR,
allowSelection: true,
tap: function (e) {
listView._click(e);
}
});
element.css('-ms-touch-action', 'auto');
element.wrap(WRAPPER);
this.wrapper = this.element.parent();
this._headerFixer = new HeaderFixer(this);
this._itemsCache = {};
this._templates();
this.virtual = options.endlessScroll || options.loadMore;
this._style();
if (this.options.$angular && (this.virtual || this.options.pullToRefresh)) {
setTimeout($.proxy(this, '_start'));
} else {
this._start();
}
},
_start: function () {
var options = this.options;
if (this.options.filterable) {
this._filter = new ListViewFilter(this);
}
if (this.virtual) {
this._itemBinder = new VirtualListViewItemBinder(this);
} else {
this._itemBinder = new ListViewItemBinder(this);
}
if (this.options.pullToRefresh) {
this._pullToRefreshHandler = new RefreshHandler(this);
}
this.setDataSource(options.dataSource);
this._enhanceItems(this.items());
kendo.notify(this, ui);
},
events: [
CLICK,
DATABINDING,
DATABOUND,
ITEM_CHANGE
],
options: {
name: 'ListView',
style: '',
type: 'flat',
autoBind: true,
fixedHeaders: false,
template: '#:data#',
headerTemplate: '
#:value#',
appendOnRefresh: false,
loadMore: false,
endlessScroll: false,
scrollThreshold: 30,
pullToRefresh: false,
messages: {
loadMoreText: 'Press to load more',
pullTemplate: 'Pull to refresh',
releaseTemplate: 'Release to refresh',
refreshTemplate: 'Refreshing'
},
pullOffset: 140,
filterable: false,
virtualViewSize: null
},
refresh: function () {
this._itemBinder.refresh();
},
reset: function () {
this._itemBinder.reset();
},
setDataSource: function (dataSource) {
var emptyDataSource = !dataSource;
this.dataSource = DataSource.create(dataSource);
this.trigger('_dataSource', {
dataSource: this.dataSource,
empty: emptyDataSource
});
if (this.options.autoBind && !emptyDataSource) {
this.items().remove();
this.dataSource.fetch();
}
},
destroy: function () {
Widget.fn.destroy.call(this);
kendo.destroy(this.element);
this._userEvents.destroy();
if (this._itemBinder) {
this._itemBinder.destroy();
}
this.element.unwrap();
delete this.element;
delete this.wrapper;
delete this._userEvents;
},
items: function () {
if (this.options.type === 'group') {
return this.element.find('.km-list').children();
} else {
return this.element.children().not('.km-load-more');
}
},
scroller: function () {
if (!this._scrollerInstance) {
this._scrollerInstance = this.element.closest('.km-scroll-wrapper').data('kendoMobileScroller');
}
return this._scrollerInstance;
},
showLoading: function () {
var view = this.view();
if (view && view.loader) {
view.loader.show();
}
},
hideLoading: function () {
var view = this.view();
if (view && view.loader) {
view.loader.hide();
}
},
insertAt: function (dataItems, index, triggerChange) {
var listView = this;
return listView._renderItems(dataItems, function (items) {
if (index === 0) {
listView.element.prepend(items);
} else if (index === -1) {
listView.element.append(items);
} else {
listView.items().eq(index - 1).after(items);
}
if (triggerChange) {
for (var i = 0; i < items.length; i++) {
listView.trigger(ITEM_CHANGE, {
item: items.eq(i),
data: dataItems[i],
ns: ui
});
}
}
});
},
append: function (dataItems, triggerChange) {
return this.insertAt(dataItems, -1, triggerChange);
},
prepend: function (dataItems, triggerChange) {
return this.insertAt(dataItems, 0, triggerChange);
},
replace: function (dataItems) {
this.options.type = 'flat';
this._angularItems('cleanup');
this.element.empty();
this._userEvents.cancel();
this._style();
return this.insertAt(dataItems, 0);
},
replaceGrouped: function (groups) {
this.options.type = 'group';
this._angularItems('cleanup');
this.element.empty();
var items = $(kendo.render(this.groupTemplate, groups));
this._enhanceItems(items.children('ul').children('li'));
this.element.append(items);
mobile.init(items);
this._style();
this._angularItems('compile');
},
remove: function (dataItems) {
var items = this.findByDataItem(dataItems);
this.angular('cleanup', function () {
return { elements: items };
});
kendo.destroy(items);
items.remove();
},
findByDataItem: function (dataItems) {
var selectors = [];
for (var idx = 0, length = dataItems.length; idx < length; idx++) {
selectors[idx] = '[data-' + kendo.ns + 'uid=' + dataItems[idx].uid + ']';
}
return this.element.find(selectors.join(','));
},
setDataItem: function (item, dataItem) {
var listView = this, replaceItem = function (items) {
var newItem = $(items[0]);
kendo.destroy(item);
listView.angular('cleanup', function () {
return { elements: [$(item)] };
});
$(item).replaceWith(newItem);
listView.trigger(ITEM_CHANGE, {
item: newItem,
data: dataItem,
ns: ui
});
};
return this._renderItems([dataItem], replaceItem)[0];
},
updateSize: function () {
this._size = this.getSize();
},
_renderItems: function (dataItems, callback) {
var items = $(kendo.render(this.template, dataItems));
callback(items);
this.angular('compile', function () {
return {
elements: items,
data: dataItems.map(function (data) {
return { dataItem: data };
})
};
});
mobile.init(items);
this._enhanceItems(items);
return items;
},
_dim: function (e) {
this._toggle(e, false);
},
_highlight: function (e) {
this._toggle(e, true);
},
_toggle: function (e, highlight) {
if (e.which > 1) {
return;
}
var clicked = $(e.currentTarget), item = clicked.parent(), role = attrValue(clicked, 'role') || '', plainItem = !role.match(buttonRegExp), prevented = e.isDefaultPrevented();
if (plainItem) {
item.toggleClass(ACTIVE_CLASS, highlight && !prevented);
}
},
_templates: function () {
var template = this.options.template, headerTemplate = this.options.headerTemplate, dataIDAttribute = ' data-uid="#=arguments[0].uid || ""#"', templateProxy = {}, groupTemplateProxy = {};
if (typeof template === FUNCTION) {
templateProxy.template = template;
template = '#=this.template(data)#';
}
this.template = proxy(kendo.template('
' + template + ''), templateProxy);
groupTemplateProxy.template = this.template;
if (typeof headerTemplate === FUNCTION) {
groupTemplateProxy._headerTemplate = headerTemplate;
headerTemplate = '#=this._headerTemplate(data)#';
}
groupTemplateProxy.headerTemplate = kendo.template(headerTemplate);
this.groupTemplate = proxy(GROUP_TEMPLATE, groupTemplateProxy);
},
_click: function (e) {
if (e.event.which > 1 || e.event.isDefaultPrevented()) {
return;
}
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'));
if (id) {
dataItem = this.dataSource.getByUid(id);
}
if (this.trigger(CLICK, {
target: target,
item: item,
dataItem: dataItem,
button: button
})) {
e.preventDefault();
}
},
_styleGroups: function () {
var rootItems = this.element.children();
rootItems.children('ul').addClass('km-list');
rootItems.each(function () {
var li = $(this), groupHeader = li.contents().first();
li.addClass('km-group-container');
if (!groupHeader.is('ul') && !groupHeader.is('div.' + GROUP_CLASS)) {
groupHeader.wrap(GROUP_WRAPPER);
}
});
},
_style: function () {
var options = this.options, grouped = options.type === 'group', element = this.element, inset = options.style === 'inset';
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);
if (!element.parents('.km-listview')[0]) {
element.closest('.km-content').toggleClass('km-insetcontent', inset);
}
if (grouped) {
this._styleGroups();
}
this.trigger(STYLED);
},
_enhanceItems: function (items) {
items.each(function () {
var item = $(this), child, enhanced = false;
item.children().each(function () {
child = $(this);
if (child.is('a')) {
enhanceLinkItem(child);
enhanced = true;
} else if (child.is('label')) {
enhanceCheckBoxItem(child);
enhanced = true;
}
});
if (!enhanced) {
enhanceItem(item);
}
});
}
});
ui.plugin(ListView);
}(window.kendo.jQuery));
return window.kendo;
}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {
(a3 || a2)();
}));
(function (f, define) {
define('kendo.mobile.navbar', ['kendo.core'], f);
}(function () {
var __meta__ = {
id: 'mobile.navbar',
name: 'NavBar',
category: 'mobile',
description: 'The Kendo mobile NavBar widget is used inside a mobile View or Layout Header element to display an application navigation bar.',
depends: ['core']
};
(function ($, undefined) {
var kendo = window.kendo, mobile = kendo.mobile, ui = mobile.ui, Widget = ui.Widget;
function createContainer(align, element) {
var items = element.find('[' + kendo.attr('align') + '=' + align + ']');
if (items[0]) {
return $('
').append(items).prependTo(element);
}
}
function toggleTitle(centerElement) {
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'));
centerElement.prevAll().toggleClass('km-absolute', noTitle);
centerElement.toggleClass('km-show-title', showTitle);
centerElement.toggleClass('km-fill-title', showTitle && !$.trim(centerElement.html()));
centerElement.toggleClass('km-no-title', noTitle);
centerElement.toggleClass('km-hide-title', android && !siblings.children().is(':visible'));
}
var NavBar = Widget.extend({
init: function (element, options) {
var that = this;
Widget.fn.init.call(that, element, options);
element = that.element;
that.container().bind('show', $.proxy(this, 'refresh'));
element.addClass('km-navbar').wrapInner($('
'));
that.leftElement = createContainer('left', element);
that.rightElement = createContainer('right', element);
that.centerElement = element.find('.km-view-title');
},
options: { name: 'NavBar' },
title: function (value) {
this.element.find(kendo.roleSelector('view-title')).text(value);
toggleTitle(this.centerElement);
},
refresh: function (e) {
var view = e.view;
this.title(view.options.title);
},
destroy: function () {
Widget.fn.destroy.call(this);
kendo.destroy(this.element);
}
});
ui.plugin(NavBar);
}(window.kendo.jQuery));
return window.kendo;
}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {
(a3 || a2)();
}));
(function (f, define) {
define('kendo.mobile.scrollview', [
'kendo.fx',
'kendo.data',
'kendo.draganddrop'
], f);
}(function () {
var __meta__ = {
id: 'mobile.scrollview',
name: 'ScrollView',
category: 'mobile',
description: 'The Kendo Mobile ScrollView widget is used to scroll content wider than the device screen.',
depends: [
'fx',
'data',
'draganddrop'
]
};
(function ($, undefined) {
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 = 'km-current-page', VIRTUAL_PAGE_CLASS = 'km-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;
var Pager = kendo.Class.extend({
init: function (scrollView) {
var that = this, element = $('
');
scrollView.element.append(element);
this._changeProxy = proxy(that, '_change');
this._refreshProxy = proxy(that, '_refresh');
scrollView.bind(CHANGE, this._changeProxy);
scrollView.bind(REFRESH, this._refreshProxy);
$.extend(that, {
element: element,
scrollView: scrollView
});
},
items: function () {
return this.element.children();
},
_refresh: function (e) {
var pageHTML = '';
for (var idx = 0; idx < e.pageCount; idx++) {
pageHTML += '';
}
this.element.html(pageHTML);
this.items().eq(e.page).addClass(CURRENT_PAGE_CLASS);
},
_change: function (e) {
this.items().removeClass(CURRENT_PAGE_CLASS).eq(e.page).addClass(CURRENT_PAGE_CLASS);
},
destroy: function () {
this.scrollView.unbind(CHANGE, this._changeProxy);
this.scrollView.unbind(REFRESH, this._refreshProxy);
this.element.remove();
}
});
kendo.mobile.ui.ScrollViewPager = Pager;
var TRANSITION_END = 'transitionEnd', DRAG_START = 'dragStart', DRAG_END = 'dragEnd';
var ElasticPane = kendo.Observable.extend({
init: function (element, options) {
var that = this;
kendo.Observable.fn.init.call(this);
this.element = element;
this.container = element.parent();
var movable, transition, userEvents, dimensions, dimension, pane;
movable = new kendo.ui.Movable(that.element);
transition = new Transition({
axis: 'x',
movable: movable,
onEnd: function () {
that.trigger(TRANSITION_END);
}
});
userEvents = new kendo.UserEvents(element, {
fastTap: true,
start: function (e) {
if (abs(e.x.velocity) * 2 >= abs(e.y.velocity)) {
userEvents.capture();
} else {
userEvents.cancel();
}
that.trigger(DRAG_START, e);
transition.cancel();
},
allowSelection: true,
end: function (e) {
that.trigger(DRAG_END, e);
}
});
dimensions = new PaneDimensions({
element: that.element,
container: that.container
});
dimension = dimensions.x;
dimension.bind(CHANGE, function () {
that.trigger(CHANGE);
});
pane = new Pane({
dimensions: dimensions,
userEvents: userEvents,
movable: movable,
elastic: true
});
$.extend(that, {
duration: options && options.duration || 1,
movable: movable,
transition: transition,
userEvents: userEvents,
dimensions: dimensions,
dimension: dimension,
pane: pane
});
this.bind([
TRANSITION_END,
DRAG_START,
DRAG_END,
CHANGE
], options);
},
size: function () {
return {
width: this.dimensions.x.getSize(),
height: this.dimensions.y.getSize()
};
},
total: function () {
return this.dimension.getTotal();
},
offset: function () {
return -this.movable.x;
},
updateDimension: function () {
this.dimension.update(true);
},
refresh: function () {
this.dimensions.refresh();
},
moveTo: function (offset) {
this.movable.moveAxis('x', -offset);
},
transitionTo: function (offset, ease, instant) {
if (instant) {
this.moveTo(-offset);
} else {
this.transition.moveTo({
location: offset,
duration: this.duration,
ease: ease
});
}
}
});
kendo.mobile.ui.ScrollViewElasticPane = ElasticPane;
var ScrollViewContent = kendo.Observable.extend({
init: function (element, pane, options) {
var that = this;
kendo.Observable.fn.init.call(this);
that.element = element;
that.pane = pane;
that._getPages();
this.page = 0;
this.pageSize = options.pageSize || 1;
this.contentHeight = options.contentHeight;
this.enablePager = options.enablePager;
this.pagerOverlay = options.pagerOverlay;
},
scrollTo: function (page, instant) {
this.page = page;
this.pane.transitionTo(-page * this.pane.size().width, Transition.easeOutExpo, instant);
},
paneMoved: function (swipeType, bounce, callback, instant) {
var that = this, pane = that.pane, width = pane.size().width * that.pageSize, approx = round, ease = bounce ? Transition.easeOutBack : Transition.easeOutExpo, snap, nextPage;
if (swipeType === LEFT_SWIPE) {
approx = ceil;
} else if (swipeType === RIGHT_SWIPE) {
approx = floor;
}
nextPage = approx(pane.offset() / width);
snap = max(that.minSnap, min(-nextPage * width, that.maxSnap));
if (nextPage != that.page) {
if (callback && callback({
currentPage: that.page,
nextPage: nextPage
})) {
snap = -that.page * pane.size().width;
}
}
pane.transitionTo(snap, ease, instant);
},
updatePage: function () {
var pane = this.pane, page = round(pane.offset() / pane.size().width);
if (page != this.page) {
this.page = page;
return true;
}
return false;
},
forcePageUpdate: function () {
return this.updatePage();
},
resizeTo: function (size) {
var pane = this.pane, width = size.width;
this.pageElements.width(width);
if (this.contentHeight === '100%') {
var containerHeight = this.element.parent().height();
if (this.enablePager === true) {
var pager = this.element.parent().find('ol.km-pages');
if (!this.pagerOverlay && pager.length) {
containerHeight -= pager.outerHeight(true);
}
}
this.element.css('height', containerHeight);
this.pageElements.css('height', containerHeight);
}
pane.updateDimension();
if (!this._paged) {
this.page = floor(pane.offset() / width);
}
this.scrollTo(this.page, true);
this.pageCount = ceil(pane.total() / width);
this.minSnap = -(this.pageCount - 1) * width;
this.maxSnap = 0;
},
_getPages: function () {
this.pageElements = this.element.find(kendo.roleSelector('page'));
this._paged = this.pageElements.length > 0;
}
});
kendo.mobile.ui.ScrollViewContent = ScrollViewContent;
var VirtualScrollViewContent = kendo.Observable.extend({
init: function (element, pane, options) {
var that = this;
kendo.Observable.fn.init.call(this);
that.element = element;
that.pane = pane;
that.options = options;
that._templates();
that.page = options.page || 0;
that.pages = [];
that._initPages();
that.resizeTo(that.pane.size());
that.pane.dimension.forceEnabled();
},
setDataSource: function (dataSource) {
this.dataSource = DataSource.create(dataSource);
this._buffer();
this._pendingPageRefresh = false;
this._pendingWidgetRefresh = false;
},
_viewShow: function () {
var that = this;
if (that._pendingWidgetRefresh) {
setTimeout(function () {
that._resetPages();
}, 0);
that._pendingWidgetRefresh = false;
}
},
_buffer: function () {
var itemsPerPage = this.options.itemsPerPage;
if (this.buffer) {
this.buffer.destroy();
}
if (itemsPerPage > 1) {
this.buffer = new BatchBuffer(this.dataSource, itemsPerPage);
} else {
this.buffer = new Buffer(this.dataSource, itemsPerPage * 3);
}
this._resizeProxy = proxy(this, '_onResize');
this._resetProxy = proxy(this, '_onReset');
this._endReachedProxy = proxy(this, '_onEndReached');
this.buffer.bind({
'resize': this._resizeProxy,
'reset': this._resetProxy,
'endreached': this._endReachedProxy
});
},
_templates: function () {
var template = this.options.template, emptyTemplate = this.options.emptyTemplate, templateProxy = {}, emptyTemplateProxy = {};
if (typeof template === FUNCTION) {
templateProxy.template = template;
template = '#=this.template(data)#';
}
this.template = proxy(kendo.template(template), templateProxy);
if (typeof emptyTemplate === FUNCTION) {
emptyTemplateProxy.emptyTemplate = emptyTemplate;
emptyTemplate = '#=this.emptyTemplate(data)#';
}
this.emptyTemplate = proxy(kendo.template(emptyTemplate), emptyTemplateProxy);
},
_initPages: function () {
var pages = this.pages, element = this.element, page;
for (var i = 0; i < VIRTUAL_PAGE_COUNT; i++) {
page = new Page(element);
pages.push(page);
}
this.pane.updateDimension();
},
resizeTo: function (size) {
var pages = this.pages, pane = this.pane;
for (var i = 0; i < pages.length; i++) {
pages[i].setWidth(size.width);
}
if (this.options.contentHeight === 'auto') {
this.element.css('height', this.pages[1].element.height());
} else if (this.options.contentHeight === '100%') {
var containerHeight = this.element.parent().height();
if (this.options.enablePager === true) {
var pager = this.element.parent().find('ol.km-pages');
if (!this.options.pagerOverlay && pager.length) {
containerHeight -= pager.outerHeight(true);
}
}
this.element.css('height', containerHeight);
pages[0].element.css('height', containerHeight);
pages[1].element.css('height', containerHeight);
pages[2].element.css('height', containerHeight);
}
pane.updateDimension();
this._repositionPages();
this.width = size.width;
},
scrollTo: function (page) {
var buffer = this.buffer, dataItem;
buffer.syncDataSource();
dataItem = buffer.at(page);
if (!dataItem) {
return;
}
this._updatePagesContent(page);
this.page = page;
},
paneMoved: function (swipeType, bounce, callback, instant) {
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;
if (swipeType === RIGHT_SWIPE) {
if (that.page !== 0) {
delta = -1;
}
} else if (swipeType === LEFT_SWIPE && !isEndReached) {
delta = 1;
} else if (offset > 0 && (thresholdPassed && !isEndReached)) {
delta = 1;
} else if (offset < 0 && thresholdPassed) {
if (that.page !== 0) {
delta = -1;
}
}
nextPage = that.page;
if (delta) {
nextPage = delta > 0 ? nextPage + 1 : nextPage - 1;
}
if (callback && callback({
currentPage: that.page,
nextPage: nextPage
})) {
delta = 0;
}
if (delta === 0) {
that._cancelMove(ease, instant);
} else if (delta === -1) {
that._moveBackward(instant);
} else if (delta === 1) {
that._moveForward(instant);
}
},
updatePage: function () {
var pages = this.pages;
if (this.pane.offset() === 0) {
return false;
}
if (this.pane.offset() > 0) {
pages.push(this.pages.shift());
this.page++;
this.setPageContent(pages[2], this.page + 1);
} else {
pages.unshift(this.pages.pop());
this.page--;
this.setPageContent(pages[0], this.page - 1);
}
this._repositionPages();
this._resetMovable();
return true;
},
forcePageUpdate: function () {
var offset = this.pane.offset(), threshold = this.pane.size().width * 3 / 4;
if (abs(offset) > threshold) {
return this.updatePage();
}
return false;
},
_resetMovable: function () {
this.pane.moveTo(0);
},
_moveForward: function (instant) {
this.pane.transitionTo(-this.width, kendo.effects.Transition.easeOutExpo, instant);
},
_moveBackward: function (instant) {
this.pane.transitionTo(this.width, kendo.effects.Transition.easeOutExpo, instant);
},
_cancelMove: function (ease, instant) {
this.pane.transitionTo(0, ease, instant);
},
_resetPages: function () {
this.page = this.options.page || 0;
this._updatePagesContent(this.page);
this._repositionPages();
this.trigger('reset');
},
_onResize: function () {
this.pageCount = ceil(this.dataSource.total() / this.options.itemsPerPage);
if (this._pendingPageRefresh) {
this._updatePagesContent(this.page);
this._pendingPageRefresh = false;
}
this.trigger('resize');
},
_onReset: function () {
this.pageCount = ceil(this.dataSource.total() / this.options.itemsPerPage);
this._resetPages();
},
_onEndReached: function () {
this._pendingPageRefresh = true;
},
_repositionPages: function () {
var pages = this.pages;
pages[0].position(LEFT_PAGE);
pages[1].position(CETER_PAGE);
pages[2].position(RIGHT_PAGE);
},
_updatePagesContent: function (offset) {
var pages = this.pages, currentPage = offset || 0;
this.setPageContent(pages[0], currentPage - 1);
this.setPageContent(pages[1], currentPage);
this.setPageContent(pages[2], currentPage + 1);
},
setPageContent: function (page, index) {
var buffer = this.buffer, template = this.template, emptyTemplate = this.emptyTemplate, view = null;
if (index >= 0) {
view = buffer.at(index);
if ($.isArray(view) && !view.length) {
view = null;
}
}
this.trigger(CLEANUP, { item: page.element });
if (view !== null) {
page.content(template(view));
} else {
page.content(emptyTemplate({}));
}
kendo.mobile.init(page.element);
this.trigger(ITEM_CHANGE, {
item: page.element,
data: view,
ns: kendo.mobile.ui
});
}
});
kendo.mobile.ui.VirtualScrollViewContent = VirtualScrollViewContent;
var Page = kendo.Class.extend({
init: function (container) {
this.element = $('');
this.width = container.width();
this.element.width(this.width);
container.append(this.element);
},
content: function (theContent) {
this.element.html(theContent);
},
position: function (position) {
this.element.css('transform', 'translate3d(' + this.width * position + 'px, 0, 0)');
},
setWidth: function (width) {
this.width = width;
this.element.width(width);
}
});
kendo.mobile.ui.VirtualPage = Page;
var ScrollView = Widget.extend({
init: function (element, options) {
var that = this;
Widget.fn.init.call(that, element, options);
options = that.options;
element = that.element;
kendo.stripWhitespace(element[0]);
element.wrapInner('').addClass('km-scrollview');
if (this.options.enablePager) {
this.pager = new Pager(this);
if (this.options.pagerOverlay) {
element.addClass('km-scrollview-overlay');
}
}
that.inner = element.children().first();
that.page = 0;
that.inner.css('height', options.contentHeight);
that.pane = new ElasticPane(that.inner, {
duration: this.options.duration,
transitionEnd: proxy(this, '_transitionEnd'),
dragStart: proxy(this, '_dragStart'),
dragEnd: proxy(this, '_dragEnd'),
change: proxy(this, REFRESH)
});
that.bind('resize', function () {
that.pane.refresh();
});
that.page = options.page;
var empty = this.inner.children().length === 0;
var content = empty ? new VirtualScrollViewContent(that.inner, that.pane, options) : new ScrollViewContent(that.inner, that.pane, options);
content.page = that.page;
content.bind('reset', function () {
this._pendingPageRefresh = false;
that._syncWithContent();
that.trigger(REFRESH, {
pageCount: content.pageCount,
page: content.page
});
});
content.bind('resize', function () {
that.trigger(REFRESH, {
pageCount: content.pageCount,
page: content.page
});
});
content.bind(ITEM_CHANGE, function (e) {
that.trigger(ITEM_CHANGE, e);
that.angular('compile', function () {
return {
elements: e.item,
data: [{ dataItem: e.data }]
};
});
});
content.bind(CLEANUP, function (e) {
that.angular('cleanup', function () {
return { elements: e.item };
});
});
that._content = content;
that.setDataSource(options.dataSource);
var mobileContainer = that.container();
if (mobileContainer.nullObject) {
that.viewInit();
that.viewShow();
} else {
mobileContainer.bind('show', proxy(this, 'viewShow')).bind('init', proxy(this, 'viewInit'));
}
},
options: {
name: 'ScrollView',
page: 0,
duration: 400,
velocityThreshold: 0.8,
contentHeight: 'auto',
pageSize: 1,
itemsPerPage: 1,
bounceVelocityThreshold: 1.6,
enablePager: true,
pagerOverlay: false,
autoBind: true,
template: '',
emptyTemplate: ''
},
events: [
CHANGING,
CHANGE,
REFRESH
],
destroy: function () {
Widget.fn.destroy.call(this);
kendo.destroy(this.element);
},
viewInit: function () {
if (this.options.autoBind) {
this._content.scrollTo(this._content.page, true);
}
},
viewShow: function () {
this.pane.refresh();
},
refresh: function () {
var content = this._content;
content.resizeTo(this.pane.size());
this.page = content.page;
this.trigger(REFRESH, {
pageCount: content.pageCount,
page: content.page
});
},
content: function (html) {
this.element.children().first().html(html);
this._content._getPages();
this.pane.refresh();
},
value: function (item) {
var dataSource = this.dataSource;
if (item) {
this.scrollTo(dataSource.indexOf(item), true);
} else {
return dataSource.at(this.page);
}
},
scrollTo: function (page, instant) {
this._content.scrollTo(page, instant);
this._syncWithContent();
},
prev: function () {
var that = this, prevPage = that.page - 1;
if (that._content instanceof VirtualScrollViewContent) {
that._content.paneMoved(RIGHT_SWIPE, undefined, function (eventData) {
return that.trigger(CHANGING, eventData);
});
} else if (prevPage > -1) {
that.scrollTo(prevPage);
}
},
next: function () {
var that = this, nextPage = that.page + 1;
if (that._content instanceof VirtualScrollViewContent) {
that._content.paneMoved(LEFT_SWIPE, undefined, function (eventData) {
return that.trigger(CHANGING, eventData);
});
} else if (nextPage < that._content.pageCount) {
that.scrollTo(nextPage);
}
},
setDataSource: function (dataSource) {
if (!(this._content instanceof VirtualScrollViewContent)) {
return;
}
var emptyDataSource = !dataSource;
this.dataSource = DataSource.create(dataSource);
this._content.setDataSource(this.dataSource);
if (this.options.autoBind && !emptyDataSource) {
this.dataSource.fetch();
}
},
items: function () {
return this.element.find('.' + VIRTUAL_PAGE_CLASS);
},
_syncWithContent: function () {
var pages = this._content.pages, buffer = this._content.buffer, data, element;
this.page = this._content.page;
data = buffer ? buffer.at(this.page) : undefined;
if (!(data instanceof Array)) {
data = [data];
}
element = pages ? pages[1].element : undefined;
this.trigger(CHANGE, {
page: this.page,
element: element,
data: data
});
},
_dragStart: function () {
if (this._content.forcePageUpdate()) {
this._syncWithContent();
}
},
_dragEnd: function (e) {
var that = this, velocity = e.x.velocity, velocityThreshold = this.options.velocityThreshold, swipeType = NUDGE, bounce = abs(velocity) > this.options.bounceVelocityThreshold;
if (velocity > velocityThreshold) {
swipeType = RIGHT_SWIPE;
} else if (velocity < -velocityThreshold) {
swipeType = LEFT_SWIPE;
}
this._content.paneMoved(swipeType, bounce, function (eventData) {
return that.trigger(CHANGING, eventData);
});
},
_transitionEnd: function () {
if (this._content.updatePage()) {
this._syncWithContent();
}
}
});
ui.plugin(ScrollView);
}(window.kendo.jQuery));
return window.kendo;
}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {
(a3 || a2)();
}));
(function (f, define) {
define('kendo.mobile.switch', [
'kendo.fx',
'kendo.userevents'
], f);
}(function () {
var __meta__ = {
id: 'mobile.switch',
name: 'Switch',
category: 'mobile',
description: 'The mobile Switch widget is used to display two exclusive choices.',
depends: [
'fx',
'userevents'
]
};
(function ($, undefined) {
var kendo = window.kendo, ui = kendo.mobile.ui, Widget = ui.Widget, support = kendo.support, CHANGE = 'change', SWITCHON = 'km-switch-on', SWITCHOFF = 'km-switch-off', MARGINLEFT = 'margin-left', ACTIVE_STATE = 'km-state-active', DISABLED_STATE = 'km-state-disabled', DISABLED = 'disabled', TRANSFORMSTYLE = support.transitions.css + 'transform', proxy = $.proxy;
function limitValue(value, minLimit, maxLimit) {
return Math.max(minLimit, Math.min(maxLimit, value));
}
var SWITCH_MARKUP = ' {0} {1} ';
var Switch = Widget.extend({
init: function (element, options) {
var that = this, checked;
Widget.fn.init.call(that, element, options);
options = that.options;
that.wrapper = $(kendo.format(SWITCH_MARKUP, options.onLabel, options.offLabel));
that.handle = that.wrapper.find('.km-switch-handle');
that.background = that.wrapper.find('.km-switch-background');
that.wrapper.insertBefore(that.element).prepend(that.element);
that._drag();
that.origin = parseInt(that.background.css(MARGINLEFT), 10);
that.constrain = 0;
that.snapPoint = 0;
element = that.element[0];
element.type = 'checkbox';
that._animateBackground = true;
checked = that.options.checked;
if (checked === null) {
checked = element.checked;
}
that.check(checked);
that.options.enable = that.options.enable && !that.element.attr(DISABLED);
that.enable(that.options.enable);
that.refresh();
kendo.notify(that, kendo.mobile.ui);
},
refresh: function () {
var that = this, handleWidth = that.handle.outerWidth(true);
that.width = that.wrapper.width();
that.constrain = that.width - handleWidth;
that.snapPoint = that.constrain / 2;
if (typeof that.origin != 'number') {
that.origin = parseInt(that.background.css(MARGINLEFT), 10);
}
that.background.data('origin', that.origin);
that.check(that.element[0].checked);
},
events: [CHANGE],
options: {
name: 'Switch',
onLabel: 'on',
offLabel: 'off',
checked: null,
enable: true
},
check: function (check) {
var that = this, element = that.element[0];
if (check === undefined) {
return element.checked;
}
that._position(check ? that.constrain : 0);
element.checked = check;
that.wrapper.toggleClass(SWITCHON, check).toggleClass(SWITCHOFF, !check);
},
value: function () {
return this.check.apply(this, arguments);
},
destroy: function () {
Widget.fn.destroy.call(this);
this.userEvents.destroy();
},
toggle: function () {
var that = this;
that.check(!that.element[0].checked);
},
enable: function (enable) {
var element = this.element, wrapper = this.wrapper;
if (typeof enable == 'undefined') {
enable = true;
}
this.options.enable = enable;
if (enable) {
element.removeAttr(DISABLED);
} else {
element.attr(DISABLED, DISABLED);
}
wrapper.toggleClass(DISABLED_STATE, !enable);
},
_resize: function () {
this.refresh();
},
_move: function (e) {
var that = this;
e.preventDefault();
that._position(limitValue(that.position + e.x.delta, 0, that.width - that.handle.outerWidth(true)));
},
_position: function (position) {
var that = this;
that.position = position;
that.handle.css(TRANSFORMSTYLE, 'translatex(' + position + 'px)');
if (that._animateBackground) {
that.background.css(MARGINLEFT, that.origin + position);
}
},
_start: function () {
if (!this.options.enable) {
this.userEvents.cancel();
} else {
this.userEvents.capture();
this.handle.addClass(ACTIVE_STATE);
}
},
_stop: function () {
var that = this;
that.handle.removeClass(ACTIVE_STATE);
that._toggle(that.position > that.snapPoint);
},
_toggle: function (checked) {
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;
that.wrapper.toggleClass(SWITCHON, checked).toggleClass(SWITCHOFF, !checked);
that.position = distance = checked * that.constrain;
if (that._animateBackground) {
that.background.kendoStop(true, true).kendoAnimate({
effects: 'slideMargin',
offset: distance,
reset: true,
reverse: !checked,
axis: 'left',
duration: duration
});
}
handle.kendoStop(true, true).kendoAnimate({
effects: 'slideTo',
duration: duration,
offset: distance + 'px,0',
reset: true,
complete: function () {
if (value !== checked) {
element.checked = checked;
that.trigger(CHANGE, { checked: checked });
}
}
});
},
_drag: function () {
var that = this;
that.userEvents = new kendo.UserEvents(that.wrapper, {
fastTap: true,
tap: function () {
if (that.options.enable) {
that._toggle(!that.element[0].checked);
}
},
start: proxy(that._start, that),
move: proxy(that._move, that),
end: proxy(that._stop, that)
});
}
});
ui.plugin(Switch);
}(window.kendo.jQuery));
return window.kendo;
}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {
(a3 || a2)();
}));
(function (f, define) {
define('kendo.mobile.tabstrip', ['kendo.core'], f);
}(function () {
var __meta__ = {
id: 'mobile.tabstrip',
name: 'TabStrip',
category: 'mobile',
description: 'The mobile TabStrip widget is used inside a mobile view or layout footer element to display an application-wide group of navigation buttons.',
depends: ['core']
};
(function ($, undefined) {
var kendo = window.kendo, ui = kendo.mobile.ui, Widget = ui.Widget, ACTIVE_STATE_CLASS = 'km-state-active', SELECT = 'select';
function createBadge(value) {
return $('' + value + '');
}
var TabStrip = Widget.extend({
init: function (element, options) {
var that = this;
Widget.fn.init.call(that, element, options);
that.container().bind('show', $.proxy(this, 'refresh'));
that.element.addClass('km-tabstrip').find('a').each(that._buildButton).eq(that.options.selectedIndex).addClass(ACTIVE_STATE_CLASS);
that.element.on('down', 'a', '_release');
},
events: [SELECT],
switchTo: function (url) {
var tabs = this.element.find('a'), tab, path, idx = 0, length = tabs.length;
if (isNaN(url)) {
for (; idx < length; idx++) {
tab = tabs[idx];
path = tab.href.replace(/(\#.+)(\?.+)$/, '$1');
if (path.indexOf(url, path.length - url.length) !== -1) {
this._setActiveItem($(tab));
return true;
}
}
} else {
this._setActiveItem(tabs.eq(url));
return true;
}
return false;
},
switchByFullUrl: function (url) {
var tab;
tab = this.element.find('a[href$=\'' + url + '\']');
this._setActiveItem(tab);
},
clear: function () {
this.currentItem().removeClass(ACTIVE_STATE_CLASS);
},
currentItem: function () {
return this.element.children('.' + ACTIVE_STATE_CLASS);
},
badge: function (item, value) {
var tabstrip = this.element, badge;
if (!isNaN(item)) {
item = tabstrip.children().get(item);
}
item = tabstrip.find(item);
badge = $(item.find('.km-badge')[0] || createBadge(value).insertAfter(item.children('.km-icon')));
if (value || value === 0) {
badge.html(value);
return this;
}
if (value === false) {
badge.empty().remove();
return this;
}
return badge.html();
},
_release: function (e) {
if (e.which > 1) {
return;
}
var that = this, item = $(e.currentTarget);
if (item[0] === that.currentItem()[0]) {
return;
}
if (that.trigger(SELECT, { item: item })) {
e.preventDefault();
} else {
that._setActiveItem(item);
}
},
_setActiveItem: function (item) {
if (!item[0]) {
return;
}
this.clear();
item.addClass(ACTIVE_STATE_CLASS);
},
_buildButton: function () {
var button = $(this), icon = kendo.attrValue(button, 'icon'), badge = kendo.attrValue(button, 'badge'), image = button.find('img'), iconSpan = $('');
button.addClass('km-button').attr(kendo.attr('role'), 'tab').contents().not(image).wrapAll('');
if (image[0]) {
image.addClass('km-image').prependTo(button);
} else {
button.prepend(iconSpan);
if (icon) {
iconSpan.addClass('km-' + icon);
if (badge || badge === 0) {
createBadge(badge).insertAfter(iconSpan);
}
}
}
},
refresh: function (e) {
var url = e.view.id;
if (url && !this.switchTo(e.view.id)) {
this.switchTo(url);
}
},
options: {
name: 'TabStrip',
selectedIndex: 0,
enable: true
}
});
ui.plugin(TabStrip);
}(window.kendo.jQuery));
return window.kendo;
}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {
(a3 || a2)();
}));
(function (f, define) {
define('kendo.angular', ['kendo.core'], f);
}(function () {
var __meta__ = {
id: 'angular',
name: 'AngularJS Directives',
category: 'framework',
description: 'Adds Kendo UI for AngularJS directives',
depends: ['core'],
defer: true
};
(function ($, angular, undefined) {
'use strict';
if (!angular || !angular.injector) {
return;
}
var module = angular.module('kendo.directives', []), $injector = angular.injector(['ng']), $parse = $injector.get('$parse'), $timeout = $injector.get('$timeout'), $defaultCompile, $log = $injector.get('$log');
function withoutTimeout(f) {
var save = $timeout;
try {
$timeout = function (f) {
return f();
};
return f();
} finally {
$timeout = save;
}
}
var OPTIONS_NOW;
var createDataSource = function () {
var types = {
TreeList: 'TreeListDataSource',
TreeView: 'HierarchicalDataSource',
Scheduler: 'SchedulerDataSource',
PanelBar: '$PLAIN',
Menu: '$PLAIN',
ContextMenu: '$PLAIN'
};
var toDataSource = function (dataSource, type) {
if (type == '$PLAIN') {
return dataSource;
}
return kendo.data[type].create(dataSource);
};
return function (scope, element, role, source) {
var type = types[role] || 'DataSource';
var current = scope.$eval(source);
var ds = toDataSource(current, type);
scope.$watch(source, function (mew) {
var widget = kendoWidgetInstance(element);
if (widget && typeof widget.setDataSource == 'function') {
if (mew !== current) {
var ds = toDataSource(mew, type);
widget.setDataSource(ds);
current = mew;
}
}
});
return ds;
};
}();
var ignoredAttributes = {
kDataSource: true,
kOptions: true,
kRebind: true,
kNgModel: true,
kNgDelay: true
};
var ignoredOwnProperties = {
name: true,
title: true,
style: true
};
function createWidget(scope, element, attrs, widget, origAttr, controllers) {
if (!(element instanceof jQuery)) {
throw new Error('The Kendo UI directives require jQuery to be available before AngularJS. Please include jquery before angular in the document.');
}
var kNgDelay = attrs.kNgDelay, delayValue = scope.$eval(kNgDelay);
controllers = controllers || [];
var ngModel = controllers[0], ngForm = controllers[1];
var ctor = $(element)[widget];
if (!ctor) {
window.console.error('Could not find: ' + widget);
return null;
}
var parsed = parseOptions(scope, element, attrs, widget, ctor);
var options = parsed.options;
if (parsed.unresolved.length) {
var promises = [];
for (var i = 0, len = parsed.unresolved.length; i < len; i++) {
var unresolved = parsed.unresolved[i];
var promise = $.Deferred(function (d) {
var unwatch = scope.$watch(unresolved.path, function (newValue) {
if (newValue !== undefined) {
unwatch();
d.resolve();
}
});
}).promise();
promises.push(promise);
}
$.when.apply(null, promises).then(createIt);
return;
}
if (kNgDelay && !delayValue) {
var root = scope.$root || scope;
var register = function () {
var unregister = scope.$watch(kNgDelay, function (newValue) {
if (newValue !== undefined) {
unregister();
element.removeAttr(attrs.$attr.kNgDelay);
kNgDelay = null;
$timeout(createIt);
}
});
};
if (/^\$(digest|apply)$/.test(root.$$phase)) {
register();
} else {
scope.$apply(register);
}
return;
} else {
return createIt();
}
function createIt() {
var originalElement;
if (attrs.kRebind) {
originalElement = $($(element)[0].cloneNode(true));
}
options = parseOptions(scope, element, attrs, widget, ctor).options;
if (element.is('select')) {
(function (options) {
if (options.length > 0) {
var first = $(options[0]);
if (!/\S/.test(first.text()) && /^\?/.test(first.val())) {
first.remove();
}
}
}(element[0].options));
}
var object = ctor.call(element, OPTIONS_NOW = options).data(widget);
exposeWidget(object, scope, attrs, widget, origAttr);
scope.$emit('kendoWidgetCreated', object);
var destroyRegister = destroyWidgetOnScopeDestroy(scope, object);
if (attrs.kRebind) {
setupRebind(object, scope, element, originalElement, attrs.kRebind, destroyRegister, attrs);
}
if (attrs.kNgDisabled) {
var kNgDisabled = attrs.kNgDisabled;
var isDisabled = scope.$eval(kNgDisabled);
if (isDisabled) {
object.enable(!isDisabled);
}
bindToKNgDisabled(object, scope, element, kNgDisabled);
}
if (attrs.kNgReadonly) {
var kNgReadonly = attrs.kNgReadonly;
var isReadonly = scope.$eval(kNgReadonly);
if (isReadonly) {
object.readonly(isReadonly);
}
bindToKNgReadonly(object, scope, element, kNgReadonly);
}
if (attrs.kNgModel) {
bindToKNgModel(object, scope, attrs.kNgModel);
}
if (ngModel) {
bindToNgModel(object, scope, element, ngModel, ngForm);
}
if (object) {
propagateClassToWidgetWrapper(object, element);
}
return object;
}
}
function parseOptions(scope, element, attrs, widget, ctor) {
var role = widget.replace(/^kendo/, '');
var unresolved = [];
var optionsPath = attrs.kOptions || attrs.options;
var optionsValue = scope.$eval(optionsPath);
if (optionsPath && optionsValue === undefined) {
unresolved.push({
option: 'options',
path: optionsPath
});
}
var options = angular.extend({}, attrs.defaultOptions, optionsValue);
function addOption(name, value) {
var scopeValue = angular.copy(scope.$eval(value));
if (scopeValue === undefined) {
unresolved.push({
option: name,
path: value
});
} else {
options[name] = scopeValue;
}
}
var widgetOptions = ctor.widget.prototype.options;
var widgetEvents = ctor.widget.prototype.events;
$.each(attrs, function (name, value) {
if (name === 'source' || name === 'kDataSource' || name === 'kScopeField' || name === 'scopeField') {
return;
}
var dataName = 'data' + name.charAt(0).toUpperCase() + name.slice(1);
if (name.indexOf('on') === 0) {
var eventKey = name.replace(/^on./, function (prefix) {
return prefix.charAt(2).toLowerCase();
});
if (widgetEvents.indexOf(eventKey) > -1) {
options[eventKey] = value;
}
}
if (widgetOptions.hasOwnProperty(dataName)) {
addOption(dataName, value);
} else if (widgetOptions.hasOwnProperty(name) && !ignoredOwnProperties[name]) {
addOption(name, value);
} else if (!ignoredAttributes[name]) {
var match = name.match(/^k(On)?([A-Z].*)/);
if (match) {
var optionName = match[2].charAt(0).toLowerCase() + match[2].slice(1);
if (match[1] && name != 'kOnLabel') {
options[optionName] = value;
} else {
if (name == 'kOnLabel') {
optionName = 'onLabel';
}
addOption(optionName, value);
}
}
}
});
var dataSource = attrs.kDataSource || attrs.source;
if (dataSource) {
options.dataSource = createDataSource(scope, element, role, dataSource);
}
options.$angular = [scope];
return {
options: options,
unresolved: unresolved
};
}
function bindToKNgDisabled(widget, scope, element, kNgDisabled) {
if (kendo.ui.PanelBar && widget instanceof kendo.ui.PanelBar || kendo.ui.Menu && widget instanceof kendo.ui.Menu) {
$log.warn('k-ng-disabled specified on a widget that does not have the enable() method: ' + widget.options.name);
return;
}
scope.$watch(kNgDisabled, function (newValue, oldValue) {
if (newValue != oldValue) {
widget.enable(!newValue);
}
});
}
function bindToKNgReadonly(widget, scope, element, kNgReadonly) {
if (typeof widget.readonly != 'function') {
$log.warn('k-ng-readonly specified on a widget that does not have the readonly() method: ' + widget.options.name);
return;
}
scope.$watch(kNgReadonly, function (newValue, oldValue) {
if (newValue != oldValue) {
widget.readonly(newValue);
}
});
}
function exposeWidget(widget, scope, attrs, kendoWidget, origAttr) {
if (attrs[origAttr]) {
var set = $parse(attrs[origAttr]).assign;
if (set) {
set(scope, widget);
} else {
throw new Error(origAttr + ' attribute used but expression in it is not assignable: ' + attrs[kendoWidget]);
}
}
}
function formValue(element) {
if (/checkbox|radio/i.test(element.attr('type'))) {
return element.prop('checked');
}
return element.val();
}
var formRegExp = /^(input|select|textarea)$/i;
function isForm(element) {
return formRegExp.test(element[0].tagName);
}
function bindToNgModel(widget, scope, element, ngModel, ngForm) {
if (!widget.value) {
return;
}
var value;
if (isForm(element)) {
value = function () {
return formValue(element);
};
} else {
value = function () {
return widget.value();
};
}
ngModel.$render = function () {
var val = ngModel.$viewValue;
if (val === undefined) {
val = ngModel.$modelValue;
}
if (val === undefined) {
val = null;
}
setTimeout(function () {
if (widget) {
var kNgModel = scope[widget.element.attr('k-ng-model')];
if (kNgModel) {
val = kNgModel;
}
if (widget.options.autoBind === false && !widget.listView.bound()) {
if (val) {
widget.value(val);
}
} else {
widget.value(val);
}
}
}, 0);
};
var haveChangeOnElement = false;
if (isForm(element)) {
element.on('change', function () {
haveChangeOnElement = true;
});
}
var onChange = function (pristine) {
return function () {
var formPristine;
if (haveChangeOnElement) {
return;
}
if (pristine && ngForm) {
formPristine = ngForm.$pristine;
}
ngModel.$setViewValue(value());
if (pristine) {
ngModel.$setPristine();
if (formPristine) {
ngForm.$setPristine();
}
}
digest(scope);
};
};
widget.first('change', onChange(false));
if (!(kendo.ui.AutoComplete && widget instanceof kendo.ui.AutoComplete)) {
widget.first('dataBound', onChange(true));
}
var currentVal = value();
if (!isNaN(ngModel.$viewValue) && currentVal != ngModel.$viewValue) {
if (!ngModel.$isEmpty(ngModel.$viewValue)) {
widget.value(ngModel.$viewValue);
} else if (currentVal != null && currentVal !== '' && currentVal != ngModel.$viewValue) {
ngModel.$setViewValue(currentVal);
}
}
ngModel.$setPristine();
}
function bindToKNgModel(widget, scope, kNgModel) {
if (typeof widget.value != 'function') {
$log.warn('k-ng-model specified on a widget that does not have the value() method: ' + widget.options.name);
return;
}
var form = $(widget.element).parents('form');
var ngForm = scope[form.attr('name')];
var getter = $parse(kNgModel);
var setter = getter.assign;
var updating = false;
var valueIsCollection = kendo.ui.MultiSelect && widget instanceof kendo.ui.MultiSelect;
var length = function (value) {
return valueIsCollection ? value.length : 0;
};
var currentValueLength = length(getter(scope));
widget.$angular_setLogicValue(getter(scope));
var watchHandler = function (newValue, oldValue) {
if (newValue === undefined) {
newValue = null;
}
if (updating || newValue == oldValue && length(newValue) == currentValueLength) {
return;
}
currentValueLength = length(newValue);
widget.$angular_setLogicValue(newValue);
};
if (valueIsCollection) {
scope.$watchCollection(kNgModel, watchHandler);
} else {
scope.$watch(kNgModel, watchHandler);
}
widget.first('change', function () {
updating = true;
if (ngForm && ngForm.$pristine) {
ngForm.$setDirty();
}
digest(scope, function () {
setter(scope, widget.$angular_getLogicValue());
currentValueLength = length(getter(scope));
});
updating = false;
});
}
function destroyWidgetOnScopeDestroy(scope, widget) {
var deregister = scope.$on('$destroy', function () {
deregister();
if (widget) {
if (widget.element) {
widget.destroy();
}
widget = null;
}
});
return deregister;
}
function propagateClassToWidgetWrapper(widget, element) {
if (!(window.MutationObserver && widget.wrapper)) {
return;
}
var prevClassList = [].slice.call($(element)[0].classList);
var mo = new MutationObserver(function (changes) {
suspend();
if (!widget) {
return;
}
changes.forEach(function (chg) {
var w = $(widget.wrapper)[0];
switch (chg.attributeName) {
case 'class':
var currClassList = [].slice.call(chg.target.classList);
currClassList.forEach(function (cls) {
if (prevClassList.indexOf(cls) < 0) {
w.classList.add(cls);
if (kendo.ui.ComboBox && widget instanceof kendo.ui.ComboBox) {
widget.input[0].classList.add(cls);
}
}
});
prevClassList.forEach(function (cls) {
if (currClassList.indexOf(cls) < 0) {
w.classList.remove(cls);
if (kendo.ui.ComboBox && widget instanceof kendo.ui.ComboBox) {
widget.input[0].classList.remove(cls);
}
}
});
prevClassList = currClassList;
break;
case 'disabled':
if (typeof widget.enable == 'function' && !widget.element.attr('readonly')) {
widget.enable(!$(chg.target).attr('disabled'));
}
break;
case 'readonly':
if (typeof widget.readonly == 'function' && !widget.element.attr('disabled')) {
widget.readonly(!!$(chg.target).attr('readonly'));
}
break;
}
});
resume();
});
function suspend() {
mo.disconnect();
}
function resume() {
mo.observe($(element)[0], { attributes: true });
}
resume();
widget.first('destroy', suspend);
}
function setupRebind(widget, scope, element, originalElement, rebindAttr, destroyRegister, attrs) {
var unregister = scope.$watch(rebindAttr, function (newValue, oldValue) {
if (!widget._muteRebind && newValue !== oldValue) {
unregister();
var templateOptions = WIDGET_TEMPLATE_OPTIONS[widget.options.name];
if (templateOptions) {
templateOptions.forEach(function (name) {
var templateContents = scope.$eval(attrs['k' + name]);
if (templateContents) {
originalElement.append($(templateContents).attr(kendo.toHyphens('k' + name), ''));
}
});
}
var _wrapper = $(widget.wrapper)[0];
var _element = $(widget.element)[0];
var isUpload = widget.options.name === 'Upload';
if (isUpload) {
element = $(_element);
}
var compile = element.injector().get('$compile');
widget._destroy();
if (destroyRegister) {
destroyRegister();
}
widget = null;
if (_element) {
if (_wrapper) {
_wrapper.parentNode.replaceChild(_element, _wrapper);
}
$(element).replaceWith(originalElement);
}
compile(originalElement)(scope);
}
}, true);
digest(scope);
}
module.factory('directiveFactory', [
'$compile',
function (compile) {
var kendoRenderedTimeout;
var RENDERED = false;
$defaultCompile = compile;
var create = function (role, origAttr) {
return {
restrict: 'AC',
require: [
'?ngModel',
'^?form'
],
scope: false,
controller: [
'$scope',
'$attrs',
'$element',
function ($scope, $attrs) {
var that = this;
that.template = function (key, value) {
$attrs[key] = kendo.stringify(value);
};
$scope.$on('$destroy', function () {
that.template = null;
that = null;
});
}
],
link: function (scope, element, attrs, controllers) {
var $element = $(element);
var roleattr = role.replace(/([A-Z])/g, '-$1');
$element.attr(roleattr, $element.attr('data-' + roleattr));
$element[0].removeAttribute('data-' + roleattr);
var widget = createWidget(scope, element, attrs, role, origAttr, controllers);
if (!widget) {
return;
}
if (kendoRenderedTimeout) {
clearTimeout(kendoRenderedTimeout);
}
kendoRenderedTimeout = setTimeout(function () {
scope.$emit('kendoRendered');
if (!RENDERED) {
RENDERED = true;
$('form').each(function () {
var form = $(this).controller('form');
if (form) {
form.$setPristine();
}
});
}
});
}
};
};
return { create: create };
}
]);
var TAGNAMES = {
Editor: 'textarea',
NumericTextBox: 'input',
DatePicker: 'input',
DateTimePicker: 'input',
TimePicker: 'input',
AutoComplete: 'input',
ColorPicker: 'input',
MaskedTextBox: 'input',
MultiSelect: 'input',
Upload: 'input',
Validator: 'form',
Button: 'button',
MobileButton: 'a',
MobileBackButton: 'a',
MobileDetailButton: 'a',
ListView: 'ul',
MobileListView: 'ul',
TreeView: 'ul',
Menu: 'ul',
ContextMenu: 'ul',
ActionSheet: 'ul'
};
var SKIP_SHORTCUTS = [
'MobileView',
'MobileDrawer',
'MobileLayout',
'MobileSplitView',
'MobilePane',
'MobileModalView'
];
var MANUAL_DIRECTIVES = [
'MobileApplication',
'MobileView',
'MobileModalView',
'MobileLayout',
'MobileActionSheet',
'MobileDrawer',
'MobileSplitView',
'MobilePane',
'MobileScrollView',
'MobilePopOver'
];
angular.forEach([
'MobileNavBar',
'MobileButton',
'MobileBackButton',
'MobileDetailButton',
'MobileTabStrip',
'MobileScrollView',
'MobileScroller'
], function (widget) {
MANUAL_DIRECTIVES.push(widget);
widget = 'kendo' + widget;
module.directive(widget, function () {
return {
restrict: 'A',
link: function (scope, element, attrs) {
createWidget(scope, element, attrs, widget, widget);
}
};
});
});
function createDirectives(klass, isMobile) {
function make(directiveName, widgetName) {
module.directive(directiveName, [
'directiveFactory',
function (directiveFactory) {
return directiveFactory.create(widgetName, directiveName);
}
]);
}
var name = isMobile ? 'Mobile' : '';
name += klass.fn.options.name;
var className = name;
var shortcut = 'kendo' + name.charAt(0) + name.substr(1).toLowerCase();
name = 'kendo' + name;
var dashed = name.replace(/([A-Z])/g, '-$1');
if (SKIP_SHORTCUTS.indexOf(name.replace('kendo', '')) == -1) {
var names = name === shortcut ? [name] : [
name,
shortcut
];
angular.forEach(names, function (directiveName) {
module.directive(directiveName, function () {
return {
restrict: 'E',
replace: true,
template: function (element, attributes) {
var tag = TAGNAMES[className] || 'div';
var scopeField = attributes.kScopeField || attributes.scopeField;
return '<' + tag + ' ' + dashed + (scopeField ? '="' + scopeField + '"' : '') + '>' + element.html() + '' + tag + '>';
}
};
});
});
}
if (MANUAL_DIRECTIVES.indexOf(name.replace('kendo', '')) > -1) {
return;
}
make(name, name);
if (shortcut != name) {
make(shortcut, name);
}
}
function kendoWidgetInstance(el) {
el = $(el);
return kendo.widgetInstance(el, kendo.ui) || kendo.widgetInstance(el, kendo.mobile.ui) || kendo.widgetInstance(el, kendo.dataviz.ui);
}
function digest(scope, func) {
var root = scope.$root || scope;
var isDigesting = /^\$(digest|apply)$/.test(root.$$phase);
if (func) {
if (isDigesting) {
func();
} else {
root.$apply(func);
}
} else if (!isDigesting) {
root.$digest();
}
}
function destroyScope(scope, el) {
scope.$destroy();
if (el) {
$(el).removeData('$scope').removeData('$$kendoScope').removeData('$isolateScope').removeData('$isolateScopeNoTemplate').removeClass('ng-scope');
}
}
var pendingPatches = [];
function defadvice(klass, methodName, func) {
if ($.isArray(klass)) {
return angular.forEach(klass, function (klass) {
defadvice(klass, methodName, func);
});
}
if (typeof klass == 'string') {
var a = klass.split('.');
var x = kendo;
while (x && a.length > 0) {
x = x[a.shift()];
}
if (!x) {
pendingPatches.push([
klass,
methodName,
func
]);
return false;
}
klass = x.prototype;
}
var origMethod = klass[methodName];
klass[methodName] = function () {
var self = this, args = arguments;
return func.apply({
self: self,
next: function () {
return origMethod.apply(self, arguments.length > 0 ? arguments : args);
}
}, args);
};
return true;
}
kendo.onWidgetRegistered(function (entry) {
pendingPatches = $.grep(pendingPatches, function (args) {
return !defadvice.apply(null, args);
});
createDirectives(entry.widget, entry.prefix == 'Mobile');
});
defadvice([
'ui.Widget',
'mobile.ui.Widget'
], 'angular', function (cmd, arg) {
var self = this.self;
if (cmd == 'init') {
if (!arg && OPTIONS_NOW) {
arg = OPTIONS_NOW;
}
OPTIONS_NOW = null;
if (arg && arg.$angular) {
self.$angular_scope = arg.$angular[0];
self.$angular_init(self.element, arg);
}
return;
}
var scope = self.$angular_scope;
if (scope) {
withoutTimeout(function () {
var x = arg(), elements = x.elements, data = x.data;
if (elements.length > 0) {
switch (cmd) {
case 'cleanup':
angular.forEach(elements, function (el) {
var itemScope = $(el).data('$$kendoScope');
if (itemScope && itemScope !== scope && itemScope.$$kendoScope) {
destroyScope(itemScope, el);
}
});
break;
case 'compile':
var injector = self.element.injector();
var compile = injector ? injector.get('$compile') : $defaultCompile;
angular.forEach(elements, function (el, i) {
var itemScope;
if (x.scopeFrom) {
itemScope = x.scopeFrom;
} else {
var vars = data && data[i];
if (vars !== undefined) {
itemScope = $.extend(scope.$new(), vars);
itemScope.$$kendoScope = true;
} else {
itemScope = scope;
}
}
$(el).data('$$kendoScope', itemScope);
compile(el)(itemScope);
});
digest(scope);
break;
}
}
});
}
});
defadvice('ui.Widget', '$angular_getLogicValue', function () {
return this.self.value();
});
defadvice('ui.Widget', '$angular_setLogicValue', function (val) {
this.self.value(val);
});
defadvice('ui.Select', '$angular_getLogicValue', function () {
var item = this.self.dataItem(), valueField = this.self.options.dataValueField;
if (item) {
if (this.self.options.valuePrimitive) {
if (!!valueField) {
return item[valueField];
} else {
return item;
}
} else {
return item.toJSON();
}
} else {
return null;
}
});
defadvice('ui.Select', '$angular_setLogicValue', function (val) {
var self = this.self;
var options = self.options;
var valueField = options.dataValueField;
var text = options.text || '';
if (val === undefined) {
val = '';
}
if (valueField && !options.valuePrimitive && val) {
text = val[options.dataTextField] || '';
val = val[valueField || options.dataTextField];
}
if (self.options.autoBind === false && !self.listView.bound()) {
if (!text && val && options.valuePrimitive) {
self.value(val);
} else {
self._preselect(val, text);
}
} else {
self.value(val);
}
});
defadvice('ui.MultiSelect', '$angular_getLogicValue', function () {
var value = this.self.dataItems().slice(0);
var valueField = this.self.options.dataValueField;
if (valueField && this.self.options.valuePrimitive) {
value = $.map(value, function (item) {
return item[valueField];
});
}
return value;
});
defadvice('ui.MultiSelect', '$angular_setLogicValue', function (val) {
if (val == null) {
val = [];
}
var self = this.self;
var options = self.options;
var valueField = options.dataValueField;
var data = val;
if (valueField && !options.valuePrimitive) {
val = $.map(val, function (item) {
return item[valueField];
});
}
if (options.autoBind === false && !options.valuePrimitive && !self.listView.bound()) {
self._preselect(data, val);
} else {
self.value(val);
}
});
defadvice('ui.AutoComplete', '$angular_getLogicValue', function () {
var options = this.self.options;
var values = this.self.value().split(options.separator);
var valuePrimitive = options.valuePrimitive;
var data = this.self.dataSource.data();
var dataItems = [];
for (var idx = 0, length = data.length; idx < length; idx++) {
var item = data[idx];
var dataValue = options.dataTextField ? item[options.dataTextField] : item;
for (var j = 0; j < values.length; j++) {
if (dataValue === values[j]) {
if (valuePrimitive) {
dataItems.push(dataValue);
} else {
dataItems.push(item.toJSON());
}
break;
}
}
}
return dataItems;
});
defadvice('ui.AutoComplete', '$angular_setLogicValue', function (value) {
if (value == null) {
value = [];
}
var self = this.self, dataTextField = self.options.dataTextField;
if (dataTextField && !self.options.valuePrimitive) {
if (value.length !== undefined) {
value = $.map(value, function (item) {
return item[dataTextField];
});
} else {
value = value[dataTextField];
}
}
self.value(value);
});
defadvice('ui.Widget', '$angular_init', function (element, options) {
var self = this.self;
if (options && !$.isArray(options)) {
var scope = self.$angular_scope;
for (var i = self.events.length; --i >= 0;) {
var event = self.events[i];
var handler = options[event];
if (handler && typeof handler == 'string') {
options[event] = self.$angular_makeEventHandler(event, scope, handler);
}
}
}
});
defadvice('ui.Widget', '$angular_makeEventHandler', function (event, scope, handler) {
handler = $parse(handler);
return function (e) {
digest(scope, function () {
handler(scope, { kendoEvent: e });
});
};
});
defadvice([
'ui.Grid',
'ui.ListView',
'ui.TreeView'
], '$angular_makeEventHandler', function (event, scope, handler) {
if (event != 'change') {
return this.next();
}
handler = $parse(handler);
return function (ev) {
var widget = ev.sender;
var options = widget.options;
var cell, multiple, locals = { kendoEvent: ev }, elems, items, columns, colIdx;
if (angular.isString(options.selectable)) {
cell = options.selectable.indexOf('cell') !== -1;
multiple = options.selectable.indexOf('multiple') !== -1;
}
elems = locals.selected = this.select();
items = locals.data = [];
columns = locals.columns = [];
for (var i = 0; i < elems.length; i++) {
var item = cell ? elems[i].parentNode : elems[i];
var dataItem = widget.dataItem(item);
if (cell) {
if (angular.element.inArray(dataItem, items) < 0) {
items.push(dataItem);
}
colIdx = angular.element(elems[i]).index();
if (angular.element.inArray(colIdx, columns) < 0) {
columns.push(colIdx);
}
} else {
items.push(dataItem);
}
}
if (!multiple) {
locals.dataItem = locals.data = items[0];
locals.angularDataItem = kendo.proxyModelSetters(locals.dataItem);
locals.selected = elems[0];
}
digest(scope, function () {
handler(scope, locals);
});
};
});
defadvice('ui.Grid', '$angular_init', function (element, options) {
this.next();
if (options.columns) {
var settings = $.extend({}, kendo.Template, options.templateSettings);
angular.forEach(options.columns, function (col) {
if (col.field && !col.template && !col.format && !col.values && (col.encoded === undefined || col.encoded)) {
col.template = '#: ' + kendo.expr(col.field, settings.paramName) + '#';
}
});
}
});
{
defadvice('mobile.ui.ButtonGroup', 'value', function (mew) {
var self = this.self;
if (mew != null) {
self.select(self.element.children('li.km-button').eq(mew));
self.trigger('change');
self.trigger('select', { index: self.selectedIndex });
}
return self.selectedIndex;
});
defadvice('mobile.ui.ButtonGroup', '_select', function () {
this.next();
this.self.trigger('change');
});
}
module.directive('kendoMobileApplication', function () {
return {
terminal: true,
link: function (scope, element, attrs) {
createWidget(scope, element, attrs, 'kendoMobileApplication', 'kendoMobileApplication');
}
};
}).directive('kendoMobileView', function () {
return {
scope: true,
link: {
pre: function (scope, element, attrs) {
attrs.defaultOptions = scope.viewOptions;
attrs._instance = createWidget(scope, element, attrs, 'kendoMobileView', 'kendoMobileView');
},
post: function (scope, element, attrs) {
attrs._instance._layout();
attrs._instance._scroller();
}
}
};
}).directive('kendoMobileDrawer', function () {
return {
scope: true,
link: {
pre: function (scope, element, attrs) {
attrs.defaultOptions = scope.viewOptions;
attrs._instance = createWidget(scope, element, attrs, 'kendoMobileDrawer', 'kendoMobileDrawer');
},
post: function (scope, element, attrs) {
attrs._instance._layout();
attrs._instance._scroller();
}
}
};
}).directive('kendoMobileModalView', function () {
return {
scope: true,
link: {
pre: function (scope, element, attrs) {
attrs.defaultOptions = scope.viewOptions;
attrs._instance = createWidget(scope, element, attrs, 'kendoMobileModalView', 'kendoMobileModalView');
},
post: function (scope, element, attrs) {
attrs._instance._layout();
attrs._instance._scroller();
}
}
};
}).directive('kendoMobileSplitView', function () {
return {
terminal: true,
link: {
pre: function (scope, element, attrs) {
attrs.defaultOptions = scope.viewOptions;
attrs._instance = createWidget(scope, element, attrs, 'kendoMobileSplitView', 'kendoMobileSplitView');
},
post: function (scope, element, attrs) {
attrs._instance._layout();
}
}
};
}).directive('kendoMobilePane', function () {
return {
terminal: true,
link: {
pre: function (scope, element, attrs) {
attrs.defaultOptions = scope.viewOptions;
createWidget(scope, element, attrs, 'kendoMobilePane', 'kendoMobilePane');
}
}
};
}).directive('kendoMobileLayout', function () {
return {
link: {
pre: function (scope, element, attrs) {
createWidget(scope, element, attrs, 'kendoMobileLayout', 'kendoMobileLayout');
}
}
};
}).directive('kendoMobileActionSheet', function () {
return {
restrict: 'A',
link: function (scope, element, attrs) {
element.find('a[k-action]').each(function () {
$(this).attr('data-' + kendo.ns + 'action', $(this).attr('k-action'));
});
createWidget(scope, element, attrs, 'kendoMobileActionSheet', 'kendoMobileActionSheet');
}
};
}).directive('kendoMobilePopOver', function () {
return {
terminal: true,
link: {
pre: function (scope, element, attrs) {
attrs.defaultOptions = scope.viewOptions;
createWidget(scope, element, attrs, 'kendoMobilePopOver', 'kendoMobilePopOver');
}
}
};
}).directive('kendoViewTitle', function () {
return {
restrict: 'E',
replace: true,
template: function (element) {
return '' + element.html() + '';
}
};
}).directive('kendoMobileHeader', function () {
return {
restrict: 'E',
link: function (scope, element) {
element.addClass('km-header').attr('data-role', 'header');
}
};
}).directive('kendoMobileFooter', function () {
return {
restrict: 'E',
link: function (scope, element) {
element.addClass('km-footer').attr('data-role', 'footer');
}
};
}).directive('kendoMobileScrollViewPage', function () {
return {
restrict: 'E',
replace: true,
template: function (element) {
return '' + element.html() + '
';
}
};
});
angular.forEach([
'align',
'icon',
'rel',
'transition',
'actionsheetContext'
], function (attr) {
var kAttr = 'k' + attr.slice(0, 1).toUpperCase() + attr.slice(1);
module.directive(kAttr, function () {
return {
restrict: 'A',
priority: 2,
link: function (scope, element, attrs) {
element.attr(kendo.attr(kendo.toHyphens(attr)), scope.$eval(attrs[kAttr]));
}
};
});
});
var WIDGET_TEMPLATE_OPTIONS = {
'TreeMap': ['Template'],
'MobileListView': [
'HeaderTemplate',
'Template'
],
'MobileScrollView': [
'EmptyTemplate',
'Template'
],
'Grid': [
'AltRowTemplate',
'DetailTemplate',
'RowTemplate'
],
'ListView': [
'EditTemplate',
'Template',
'AltTemplate'
],
'Pager': [
'SelectTemplate',
'LinkTemplate'
],
'PivotGrid': [
'ColumnHeaderTemplate',
'DataCellTemplate',
'RowHeaderTemplate'
],
'Scheduler': [
'AllDayEventTemplate',
'DateHeaderTemplate',
'EventTemplate',
'MajorTimeHeaderTemplate',
'MinorTimeHeaderTemplate'
],
'TreeView': ['Template'],
'Validator': ['ErrorTemplate']
};
(function () {
var templateDirectives = {};
angular.forEach(WIDGET_TEMPLATE_OPTIONS, function (templates, widget) {
angular.forEach(templates, function (template) {
if (!templateDirectives[template]) {
templateDirectives[template] = [];
}
templateDirectives[template].push('?^^kendo' + widget);
});
});
angular.forEach(templateDirectives, function (parents, directive) {
var templateName = 'k' + directive;
var attrName = kendo.toHyphens(templateName);
module.directive(templateName, function () {
return {
restrict: 'A',
require: parents,
terminal: true,
compile: function ($element, $attrs) {
if ($attrs[templateName] !== '') {
return;
}
$element.removeAttr(attrName);
var template = $element[0].outerHTML;
return function (scope, element, attrs, controllers) {
var controller;
while (!controller && controllers.length) {
controller = controllers.shift();
}
if (!controller) {
$log.warn(attrName + ' without a matching parent widget found. It can be one of the following: ' + parents.join(', '));
} else {
controller.template(templateName, template);
$element.remove();
}
};
}
};
});
});
}());
}(window.kendo.jQuery, window.angular));
return window.kendo;
}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {
(a3 || a2)();
}));
(function (f, define) {
define('kendo.webcomponents', ['kendo.core'], f);
}(function () {
var __meta__ = {
id: 'webcomponents',
name: 'Web Components',
category: 'framework',
description: 'Adds Kendo UI custom elements for Web Components',
depends: ['core']
};
(function ($, angular, undefined) {
if (!kendo.support.customElements || kendo.webComponents.length) {
return;
}
if (angular && (angular.version.major == 1 || angular.injector)) {
return;
}
var TAGNAMES = {
editor: 'textarea',
numerictextbox: 'input',
datepicker: 'input',
datetimepicker: 'input',
timepicker: 'input',
autocomplete: 'input',
colorpicker: 'input',
maskedtextbox: 'input',
dropdownlist: 'select',
multiselect: 'select',
upload: 'input',
validator: 'form',
button: 'button',
mobilebutton: 'a',
mobilebackbutton: 'a',
mobiledetailbutton: 'a',
listview: 'ul',
mobilelistview: 'ul',
treeview: 'ul',
menu: 'ul',
contextmenu: 'ul',
actionsheet: 'ul'
};
var EVENT_PREFIX = 'on-';
var registered = [];
kendo.onWidgetRegistered(function (entry) {
var elementName = entry.prefix + entry.widget.prototype.options.name.toLowerCase();
if (registered.indexOf(elementName) === -1) {
registered.push(elementName);
registerElement(elementName, entry.widget);
}
});
var jsonRegExp = /^\s*(?:\{(?:.|\r\n|\n)*\}|\[(?:.|\r\n|\n)*\])\s*$/;
var jsonFormatRegExp = /^\{(\d+)(:[^\}]+)?\}|^\[[A-Za-z_]*\]$/;
var numberRegExp = /^(\+|-?)\d+(\.?)\d*$/;
function parseOption(element, option) {
var value = element.getAttribute(option);
if (value === null) {
value = undefined;
} else if (value === 'null') {
value = null;
} else if (value === 'true') {
value = true;
} else if (value === 'false') {
value = false;
} else if (numberRegExp.test(value)) {
value = parseFloat(value);
} else if (jsonRegExp.test(value) && !jsonFormatRegExp.test(value)) {
value = new Function('return (' + value + ')')();
}
return value;
}
function parseOptions(element, options) {
var result = {};
Object.keys(options).concat('dataSource').forEach(function (name) {
if (element.hasAttribute(kendo.toHyphens(name))) {
result[name] = parseOption(element, kendo.toHyphens(name));
}
});
return result;
}
function cloneEvent(e) {
var result = {};
Object.keys(e).forEach(function (key) {
if (key[0] != '_') {
result[key] = e[key];
}
});
return result;
}
function eventHandler(eventName, e) {
var event = document.createEvent('CustomEvent');
event.initCustomEvent(eventName, false, true, cloneEvent(e));
this.dispatchEvent(event);
if (event.defaultPrevented) {
e.preventDefault();
}
}
function expose(component, obj) {
var props = Object.keys(obj);
for (var idx = 0; idx <= props.length; idx++) {
if (typeof obj[props[idx]] === 'function') {
if (!component[props[idx]]) {
component[props[idx]] = obj[props[idx]].bind(component.widget);
}
} else {
if (props[idx] === 'options') {
continue;
}
component[props[idx]] = component[props[idx]] || obj[props[idx]];
}
}
}
function registerElement(name, widget) {
var options = widget.prototype.options;
var prototype = Object.create(HTMLElement.prototype);
Object.defineProperty(prototype, 'options', {
get: function () {
return this.widget.options;
},
set: function (options) {
var instance = this.widget;
options = $.extend(true, {}, instance.options, options);
var _wrapper = $(instance.wrapper)[0];
var _element = $(instance.element)[0];
instance._destroy();
var newElement = document.createElement(TAGNAMES[name] || 'div');
if (_wrapper && _element) {
_wrapper.parentNode.replaceChild(_element, _wrapper);
$(_element).replaceWith(newElement);
}
if (instance.value) {
options.value = instance.value();
}
instance.init(newElement, options);
this.bindEvents();
}
});
prototype.bindEvents = function () {
widget.prototype.events.forEach(function (eventName) {
this.widget.bind(eventName, eventHandler.bind(this, eventName));
if (this.hasAttribute(EVENT_PREFIX + eventName)) {
this.bind(eventName, function (e) {
window[this.getAttribute(EVENT_PREFIX + eventName)].call(this, e);
}.bind(this));
}
}.bind(this));
};
prototype.attachedCallback = function () {
var that = this;
var element = document.createElement(TAGNAMES[name] || 'div');
$(element).append(that.childNodes);
$(element).attr('class', $(that).attr('class'));
$(element).attr('style', $(that).attr('style'));
that.appendChild(element);
that.widget = new widget(element, parseOptions(that, options));
var obj = that.widget;
do {
expose(that, obj);
} while (obj = Object.getPrototypeOf(obj));
this.bindEvents();
};
prototype.detachedCallback = function () {
kendo.destroy(this.element);
};
kendo.webComponents.push('kendo-' + name);
document.registerElement('kendo-' + name, { prototype: prototype });
}
}(window.kendo.jQuery, window.angular));
return window.kendo;
}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {
(a3 || a2)();
}));
(function (f, define) {
define('kendo.angular2', [
'kendo.core',
'kendo.webcomponents'
], f);
}(function () {
var __meta__ = {
id: 'angular2',
name: 'Angular 2',
category: 'framework',
description: 'Supports angular2 value accessors',
depends: ['core']
};
(function (kendo, System) {
if (!System || !System.register) {
return;
}
var __decorate = this && this.__decorate || function (decorators, target, key, desc) {
if (typeof Reflect === 'object' && typeof Reflect.decorate === 'function') {
return Reflect.decorate(decorators, target, key, desc);
}
switch (arguments.length) {
case 2:
return decorators.reduceRight(function (o, d) {
return d && d(o) || o;
}, target);
case 3:
return decorators.reduceRight(function (o, d) {
return d && d(target, key), void 0;
}, void 0);
case 4:
return decorators.reduceRight(function (o, d) {
return d && d(target, key, o) || o;
}, desc);
}
};
var __metadata = this && this.__metadata || function (k, v) {
if (typeof Reflect === 'object' && typeof Reflect.metadata === 'function') {
return Reflect.metadata(k, v);
}
};
System.register('kendo/angular2', ['angular2/angular2'], function (exports_1) {
var angular2_1;
var KendoValueAccessor;
return {
setters: [function (_angular2_1) {
angular2_1 = _angular2_1;
}],
execute: function () {
KendoValueAccessor = function () {
function KendoValueAccessor(cd, elementRef) {
var _this = this;
this.elementRef = elementRef;
this.onChange = function (_) {
};
this.onTouched = function () {
};
this.element = elementRef.nativeElement;
this.element.addEventListener('change', function () {
_this.onChange(_this.element.value());
});
this.element.addEventListener('spin', function () {
_this.onChange(_this.element.value());
});
cd.valueAccessor = this;
this.cd = cd;
cd.valueAccessor = this;
}
KendoValueAccessor.prototype.writeValue = function (value) {
this.element.value(value);
};
KendoValueAccessor.prototype.registerOnChange = function (fn) {
this.onChange = fn;
};
KendoValueAccessor.prototype.registerOnTouched = function (fn) {
this.onTouched = fn;
};
KendoValueAccessor = __decorate([
angular2_1.Directive({ selector: kendo.webComponents.join(',') }),
__metadata('design:paramtypes', [
angular2_1.NgControl,
angular2_1.ElementRef
])
], KendoValueAccessor);
return KendoValueAccessor;
}();
exports_1('KendoValueAccessor', KendoValueAccessor);
}
};
});
}(window.kendo, window.System));
}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {
(a3 || a2)();
}));
(function (f, define) {
define('kendo.mobile', [
'kendo.core',
'kendo.fx',
'kendo.data.odata',
'kendo.data.xml',
'kendo.data',
'kendo.data.signalr',
'kendo.binder',
'kendo.validator',
'kendo.router',
'kendo.view',
'kendo.userevents',
'kendo.draganddrop',
'kendo.popup',
'kendo.touch',
'kendo.mobile.popover',
'kendo.mobile.loader',
'kendo.mobile.scroller',
'kendo.mobile.shim',
'kendo.mobile.view',
'kendo.mobile.modalview',
'kendo.mobile.drawer',
'kendo.mobile.splitview',
'kendo.mobile.pane',
'kendo.mobile.application',
'kendo.mobile.actionsheet',
'kendo.mobile.button',
'kendo.mobile.buttongroup',
'kendo.mobile.collapsible',
'kendo.mobile.listview',
'kendo.mobile.navbar',
'kendo.mobile.scrollview',
'kendo.mobile.switch',
'kendo.mobile.tabstrip',
'kendo.angular',
'kendo.webcomponents',
'kendo.angular2'
], f);
}(function () {
'bundle all';
return window.kendo;
}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {
(a3 || a2)();
}));