kendo.webcomponents.js 11 KB
/** 
 * Kendo UI v2016.1.112 (http://www.telerik.com/kendo-ui)                                                                                                                                               
 * Copyright 2016 Telerik AD. All rights reserved.                                                                                                                                                      
 *                                                                                                                                                                                                      
 * Kendo UI commercial licenses may be obtained at                                                                                                                                                      
 * http://www.telerik.com/purchase/license-agreement/kendo-ui-complete                                                                                                                                  
 * If you do not own a commercial license, this file shall be governed by the trial license terms.                                                                                                      
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       

*/
(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)();
}));