/** * PUI Object */ var PUI = { zindex : 1000, gridColumns: { '1': 'ui-grid-col-12', '2': 'ui-grid-col-6', '3': 'ui-grid-col-4', '4': 'ui-grid-col-3', '6': 'ui-grid-col-2', '12': 'ui-grid-col-11' }, charSet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', /** * Aligns container scrollbar to keep item in container viewport, algorithm copied from jquery-ui menu widget */ scrollInView: function(container, item) { var borderTop = parseFloat(container.css('borderTopWidth')) || 0, paddingTop = parseFloat(container.css('paddingTop')) || 0, offset = item.offset().top - container.offset().top - borderTop - paddingTop, scroll = container.scrollTop(), elementHeight = container.height(), itemHeight = item.outerHeight(true); if(offset < 0) { container.scrollTop(scroll + offset); } else if((offset + itemHeight) > elementHeight) { container.scrollTop(scroll + offset - elementHeight + itemHeight); } }, generateRandomId: function() { var id = ''; for (var i = 1; i <= 10; i++) { var randPos = Math.floor(Math.random() * this.charSet.length); id += this.charSet[randPos]; } return id; }, isIE: function(version) { return (this.browser.msie && parseInt(this.browser.version, 10) === version); }, escapeRegExp: function(text) { return text.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"); }, escapeHTML: function(value) { return value.replace(/&/g,'&').replace(//g,'>'); }, escapeClientId: function(id) { return "#" + id.replace(/:/g,"\\:"); }, clearSelection: function() { if(window.getSelection) { if(window.getSelection().empty) { window.getSelection().empty(); } else if(window.getSelection().removeAllRanges) { window.getSelection().removeAllRanges(); } } else if(document.selection && document.selection.empty) { document.selection.empty(); } }, inArray: function(arr, item) { for(var i = 0; i < arr.length; i++) { if(arr[i] === item) { return true; } } return false; }, calculateScrollbarWidth: function() { if(!this.scrollbarWidth) { if(this.browser.msie) { var $textarea1 = $('') .css({ position: 'absolute', top: -1000, left: -1000 }).appendTo('body'), $textarea2 = $('') .css({ position: 'absolute', top: -1000, left: -1000 }).appendTo('body'); this.scrollbarWidth = $textarea1.width() - $textarea2.width(); $textarea1.add($textarea2).remove(); } else { var $div = $('
') .css({ width: 100, height: 100, overflow: 'auto', position: 'absolute', top: -1000, left: -1000 }) .prependTo('body').append('
').find('div') .css({ width: '100%', height: 200 }); this.scrollbarWidth = 100 - $div.width(); $div.parent().remove(); } } return this.scrollbarWidth; }, //adapted from jquery browser plugin resolveUserAgent: function() { var matched, browser; jQuery.uaMatch = function( ua ) { ua = ua.toLowerCase(); var match = /(opr)[\/]([\w.]+)/.exec( ua ) || /(chrome)[ \/]([\w.]+)/.exec( ua ) || /(version)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec( ua ) || /(webkit)[ \/]([\w.]+)/.exec( ua ) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) || /(msie) ([\w.]+)/.exec( ua ) || ua.indexOf("trident") >= 0 && /(rv)(?::| )([\w.]+)/.exec( ua ) || ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) || []; var platform_match = /(ipad)/.exec( ua ) || /(iphone)/.exec( ua ) || /(android)/.exec( ua ) || /(windows phone)/.exec( ua ) || /(win)/.exec( ua ) || /(mac)/.exec( ua ) || /(linux)/.exec( ua ) || /(cros)/i.exec( ua ) || []; return { browser: match[ 3 ] || match[ 1 ] || "", version: match[ 2 ] || "0", platform: platform_match[ 0 ] || "" }; }; matched = jQuery.uaMatch( window.navigator.userAgent ); browser = {}; if ( matched.browser ) { browser[ matched.browser ] = true; browser.version = matched.version; browser.versionNumber = parseInt(matched.version); } if ( matched.platform ) { browser[ matched.platform ] = true; } // These are all considered mobile platforms, meaning they run a mobile browser if ( browser.android || browser.ipad || browser.iphone || browser[ "windows phone" ] ) { browser.mobile = true; } // These are all considered desktop platforms, meaning they run a desktop browser if ( browser.cros || browser.mac || browser.linux || browser.win ) { browser.desktop = true; } // Chrome, Opera 15+ and Safari are webkit based browsers if ( browser.chrome || browser.opr || browser.safari ) { browser.webkit = true; } // IE11 has a new token so we will assign it msie to avoid breaking changes if ( browser.rv ) { var ie = "msie"; matched.browser = ie; browser[ie] = true; } // Opera 15+ are identified as opr if ( browser.opr ) { var opera = "opera"; matched.browser = opera; browser[opera] = true; } // Stock Android browsers are marked as Safari on Android. if ( browser.safari && browser.android ) { var android = "android"; matched.browser = android; browser[android] = true; } // Assign the name and platform variable browser.name = matched.browser; browser.platform = matched.platform; this.browser = browser; $.browser = browser; }, getGridColumn: function(number) { return this.gridColumns[number + '']; }, executeFunctionByName: function(functionName /*, args */) { var args = [].slice.call(arguments).splice(1), context = window, namespaces = functionName.split("."), func = namespaces.pop(); for(var i = 0; i < namespaces.length; i++) { context = context[namespaces[i]]; } return context[func].apply(this, args); }, resolveObjectByName: function(name) { if(name) { var parts = name.split("."); for(var i = 0, len = parts.length, obj = window; i < len; ++i) { obj = obj[parts[i]]; } return obj; } else { return null; } }, getCookie : function(name) { return $.cookie(name); }, setCookie : function(name, value, cfg) { $.cookie(name, value, cfg); }, deleteCookie: function(name, cfg) { $.removeCookie(name, cfg); } }; PUI.resolveUserAgent(); /** * PrimeUI Accordion widget */ (function() { $.widget("primeui.puiaccordion", { options: { activeIndex: 0, multiple: false }, _create: function() { if(this.options.multiple) { this.options.activeIndex = this.options.activeIndex||[0]; } var $this = this; this.element.addClass('ui-accordion ui-widget ui-helper-reset'); var tabContainers = this.element.children(); //primeui if(tabContainers.is('div')) { this.panelMode = 'native'; this.headers = this.element.children('h3'); this.panels = this.element.children('div'); } //primeng else { this.panelMode = 'wrapped'; this.headers = tabContainers.children('h3'); this.panels = tabContainers.children('div'); } this.headers.addClass('ui-accordion-header ui-helper-reset ui-state-default').each(function(i) { var header = $(this), title = header.html(), active = $this.options.multiple ? ($.inArray(i, $this.options.activeIndex) !== -1) : (i == $this.options.activeIndex), headerClass = (active) ? 'ui-state-active ui-corner-top' : 'ui-corner-all', iconClass = (active) ? 'fa fa-fw fa-caret-down' : 'fa fa-fw fa-caret-right'; header.addClass(headerClass).html('' + title + ''); }); this.panels.each(function(i) { var content = $(this); content.addClass('ui-accordion-content ui-helper-reset ui-widget-content'), active = $this.options.multiple ? ($.inArray(i, $this.options.activeIndex) !== -1) : (i == $this.options.activeIndex); if(!active) { content.addClass('ui-helper-hidden'); } }); this.headers.children('a').disableSelection(); this._bindEvents(); }, _destroy: function() { this._unbindEvents(); this.element.removeClass('ui-accordion ui-widget ui-helper-reset'); this.headers.removeClass('ui-accordion-header ui-helper-reset ui-state-default ui-state-hover ui-state-active ui-state-disabled ui-corner-all ui-corner-top'); this.panels.removeClass('ui-accordion-content ui-helper-reset ui-widget-content ui-helper-hidden'); this.headers.children('.fa').remove(); this.headers.children('a').contents().unwrap(); }, _bindEvents: function() { var $this = this; this.headers.on('mouseover.puiaccordion', function() { var element = $(this); if(!element.hasClass('ui-state-active')&&!element.hasClass('ui-state-disabled')) { element.addClass('ui-state-hover'); } }).on('mouseout.puiaccordion', function() { var element = $(this); if(!element.hasClass('ui-state-active')&&!element.hasClass('ui-state-disabled')) { element.removeClass('ui-state-hover'); } }).on('click.puiaccordion', function(e) { var element = $(this); if(!element.hasClass('ui-state-disabled')) { var tabIndex = ($this.panelMode === 'native') ? element.index() / 2 : element.parent().index(); if(element.hasClass('ui-state-active')) { $this.unselect(tabIndex); } else { $this.select(tabIndex, false); } } e.preventDefault(); }); }, _unbindEvents: function() { this.headers.off('mouseover.puiaccordion mouseout.puiaccordion click.puiaccordion'); }, /** * Activates a tab with given index */ select: function(index, silent) { var panel = this.panels.eq(index); if(!silent) { this._trigger('change', null, {'index': index}); } //update state if(this.options.multiple) { this._addToSelection(index); } else { this.options.activeIndex = index; } this._show(panel); }, /** * Deactivates a tab with given index */ unselect: function(index) { var panel = this.panels.eq(index), header = panel.prev(); header.attr('aria-expanded', false).children('.fa').removeClass('fa-caret-down').addClass('fa-caret-right'); header.removeClass('ui-state-active ui-corner-top').addClass('ui-corner-all'); panel.attr('aria-hidden', true).slideUp(); this._removeFromSelection(index); }, _show: function(panel) { //deactivate current if(!this.options.multiple) { var oldHeader = this.headers.filter('.ui-state-active'); oldHeader.children('.fa').removeClass('fa-caret-down').addClass('fa-caret-right'); oldHeader.attr('aria-expanded', false).removeClass('ui-state-active ui-corner-top').addClass('ui-corner-all').next().attr('aria-hidden', true).slideUp(); } //activate selected var newHeader = panel.prev(); newHeader.attr('aria-expanded', true).addClass('ui-state-active ui-corner-top').removeClass('ui-state-hover ui-corner-all') .children('.fa').removeClass('fa-caret-right').addClass('fa-caret-down'); panel.attr('aria-hidden', false).slideDown('normal'); }, _addToSelection: function(nodeId) { this.options.activeIndex.push(nodeId); }, _removeFromSelection: function(index) { this.options.activeIndex = $.grep(this.options.activeIndex, function(r) { return r != index; }); }, _setOption: function(key, value) { if(key === 'activeIndex') { this.select(value, true); } else { $.Widget.prototype._setOption.apply(this, arguments); } } }); })(); /** * PrimeUI autocomplete widget */ (function() { $.widget("primeui.puiautocomplete", { options: { delay: 300, minQueryLength: 1, multiple: false, dropdown: false, scrollHeight: 200, forceSelection: false, effect:null, effectOptions: {}, effectSpeed: 'normal', content: null, caseSensitive: false }, _create: function() { this.element.wrap(''); this.element.puiinputtext(); this.panel = $('
').appendTo('body'); if(this.options.multiple) { this.element.wrap('
    ' + '
'); this.inputContainer = this.element.parent(); this.multiContainer = this.inputContainer.parent(); } else { if(this.options.dropdown) { this.dropdown = $('') .insertAfter(this.element); this.element.removeClass('ui-corner-all').addClass('ui-corner-left'); } } this._bindEvents(); }, _bindEvents: function() { var $this = this; this._bindKeyEvents(); if(this.options.dropdown) { this.dropdown.on('mouseenter.puiautocomplete', function() { if(!$this.element.prop('disabled')) { $this.dropdown.addClass('ui-state-hover'); } }) .on('mouseleave.puiautocomplete', function() { $this.dropdown.removeClass('ui-state-hover'); }) .on('mousedown.puiautocomplete', function() { if(!$this.element.prop('disabled')) { $this.dropdown.addClass('ui-state-active'); } }) .on('mouseup.puiautocomplete', function() { if(!$this.element.prop('disabled')) { $this.dropdown.removeClass('ui-state-active'); $this.search(''); $this.element.focus(); } }) .on('focus.puiautocomplete', function() { $this.dropdown.addClass('ui-state-focus'); }) .on('blur.puiautocomplete', function() { $this.dropdown.removeClass('ui-state-focus'); }) .on('keydown.puiautocomplete', function(e) { var keyCode = $.ui.keyCode; if(e.which == keyCode.ENTER || e.which == keyCode.NUMPAD_ENTER) { $this.search(''); $this.input.focus(); e.preventDefault(); } }); } if(this.options.multiple) { this.multiContainer.on('hover.puiautocomplete', function() { $(this).toggleClass('ui-state-hover'); }) .on('click.puiautocomplete', function() { $this.element.trigger('focus'); }); this.element.on('focus.ui-autocomplete', function() { $this.multiContainer.addClass('ui-state-focus'); }) .on('blur.ui-autocomplete', function(e) { $this.multiContainer.removeClass('ui-state-focus'); }); } if(this.options.forceSelection) { this.currentItems = [this.element.val()]; this.element.on('blur.puiautocomplete', function() { var value = $(this).val(), valid = false; for(var i = 0; i < $this.currentItems.length; i++) { if($this.currentItems[i] === value) { valid = true; break; } } if(!valid) { $this.element.val(''); } }); } $(document.body).bind('mousedown.puiautocomplete', function (e) { if($this.panel.is(":hidden")) { return; } if(e.target === $this.element.get(0)) { return; } var offset = $this.panel.offset(); if (e.pageX < offset.left || e.pageX > offset.left + $this.panel.width() || e.pageY < offset.top || e.pageY > offset.top + $this.panel.height()) { $this.hide(); } }); $(window).bind('resize.' + this.element.id, function() { if($this.panel.is(':visible')) { $this._alignPanel(); } }); }, _bindKeyEvents: function() { var $this = this; this.element.on('keyup.puiautocomplete', function(e) { var keyCode = $.ui.keyCode, key = e.which, shouldSearch = true; if(key == keyCode.UP || key == keyCode.LEFT || key == keyCode.DOWN || key == keyCode.RIGHT || key == keyCode.TAB || key == keyCode.SHIFT || key == keyCode.ENTER || key == keyCode.NUMPAD_ENTER) { shouldSearch = false; } if(shouldSearch) { var value = $this.element.val(); if(!value.length) { $this.hide(); } if(value.length >= $this.options.minQueryLength) { if($this.timeout) { window.clearTimeout($this.timeout); } $this.timeout = window.setTimeout(function() { $this.search(value); }, $this.options.delay); } } }).on('keydown.puiautocomplete', function(e) { if($this.panel.is(':visible')) { var keyCode = $.ui.keyCode, highlightedItem = $this.items.filter('.ui-state-highlight'); switch(e.which) { case keyCode.UP: case keyCode.LEFT: var prev = highlightedItem.prev(); if(prev.length == 1) { highlightedItem.removeClass('ui-state-highlight'); prev.addClass('ui-state-highlight'); if($this.options.scrollHeight) { PUI.scrollInView($this.panel, prev); } } e.preventDefault(); break; case keyCode.DOWN: case keyCode.RIGHT: var next = highlightedItem.next(); if(next.length == 1) { highlightedItem.removeClass('ui-state-highlight'); next.addClass('ui-state-highlight'); if($this.options.scrollHeight) { PUI.scrollInView($this.panel, next); } } e.preventDefault(); break; case keyCode.ENTER: case keyCode.NUMPAD_ENTER: highlightedItem.trigger('click'); e.preventDefault(); break; case keyCode.ALT: case 224: break; case keyCode.TAB: highlightedItem.trigger('click'); $this.hide(); break; } } }); }, _bindDynamicEvents: function() { var $this = this; this.items.on('mouseover.puiautocomplete', function() { var item = $(this); if(!item.hasClass('ui-state-highlight')) { $this.items.filter('.ui-state-highlight').removeClass('ui-state-highlight'); item.addClass('ui-state-highlight'); } }) .on('click.puiautocomplete', function(event) { var item = $(this); if($this.options.multiple) { var tokenMarkup = '
  • '; tokenMarkup += ''; tokenMarkup += '' + item.data('label') + '
  • '; $(tokenMarkup).data(item.data()) .insertBefore($this.inputContainer).fadeIn() .children('.ui-autocomplete-token-icon').on('click.ui-autocomplete', function(e) { var token = $(this).parent(); $this._removeItem(token); $this._trigger('unselect', e, token); }); $this.element.val('').trigger('focus'); } else { $this.element.val(item.data('label')).focus(); } $this._trigger('select', event, item); $this.hide(); }); }, search: function(q) { this.query = this.options.caseSensitive ? q : q.toLowerCase(); var request = { query: this.query }; if(this.options.completeSource) { if($.isArray(this.options.completeSource)) { var sourceArr = this.options.completeSource, data = [], emptyQuery = ($.trim(q) === ''); for(var i = 0 ; i < sourceArr.length; i++) { var item = sourceArr[i], itemLabel = item.label||item; if(!this.options.caseSensitive) { itemLabel = itemLabel.toLowerCase(); } if(emptyQuery||itemLabel.indexOf(this.query) === 0) { data.push({label:sourceArr[i], value: item}); } } this._handleData(data); } else { this.options.completeSource.call(this, request, this._handleData); } } }, _handleData: function(data) { var $this = this; this.panel.html(''); this.listContainer = $('
      ').appendTo(this.panel); for(var i = 0; i < data.length; i++) { var item = $('
    • '); item.data(data[i]); if(this.options.content) item.html(this.options.content.call(this, data[i])); else item.text(data[i].label); this.listContainer.append(item); } this.items = this.listContainer.children('.ui-autocomplete-item'); this._bindDynamicEvents(); if(this.items.length > 0) { var firstItem = $this.items.eq(0), hidden = this.panel.is(':hidden'); firstItem.addClass('ui-state-highlight'); if($this.query.length > 0 && !$this.options.content) { $this.items.each(function() { var item = $(this), text = item.html(), re = new RegExp(PUI.escapeRegExp($this.query), 'gi'), highlighedText = text.replace(re, '$&'); item.html(highlighedText); }); } if(this.options.forceSelection) { this.currentItems = []; $.each(data, function(i, item) { $this.currentItems.push(item.label); }); } //adjust height if($this.options.scrollHeight) { var heightConstraint = hidden ? $this.panel.height() : $this.panel.children().height(); if(heightConstraint > $this.options.scrollHeight) $this.panel.height($this.options.scrollHeight); else $this.panel.css('height', 'auto'); } if(hidden) { $this.show(); } else { $this._alignPanel(); } } else { this.panel.hide(); } }, show: function() { this._alignPanel(); if(this.options.effect) this.panel.show(this.options.effect, {}, this.options.effectSpeed); else this.panel.show(); }, hide: function() { this.panel.hide(); this.panel.css('height', 'auto'); }, _removeItem: function(item) { item.fadeOut('fast', function() { var token = $(this); token.remove(); }); }, _alignPanel: function() { var panelWidth = null; if(this.options.multiple) { panelWidth = this.multiContainer.innerWidth() - (this.element.position().left - this.multiContainer.position().left); } else { if(this.panel.is(':visible')) { panelWidth = this.panel.children('.ui-autocomplete-items').outerWidth(); } else { this.panel.css({'visibility':'hidden','display':'block'}); panelWidth = this.panel.children('.ui-autocomplete-items').outerWidth(); this.panel.css({'visibility':'visible','display':'none'}); } var inputWidth = this.element.outerWidth(); if(panelWidth < inputWidth) { panelWidth = inputWidth; } } this.panel.css({ 'left':'', 'top':'', 'width': panelWidth, 'z-index': ++PUI.zindex }) .position({ my: 'left top', at: 'left bottom', of: this.element }); } }); })(); /** * PrimeFaces Button Widget */ (function() { $.widget("primeui.puibutton", { options: { value: null, icon: null, iconPos: 'left', click: null }, _create: function() { var element = this.element; this.elementText = this.element.text(); var value = this.options.value||(this.elementText === '' ? 'ui-button' : this.elementText), disabled = element.prop('disabled'), styleClass = null; if(this.options.icon) { styleClass = (value === 'ui-button') ? 'ui-button-icon-only' : 'ui-button-text-icon-' + this.options.iconPos; } else { styleClass = 'ui-button-text-only'; } if(disabled) { styleClass += ' ui-state-disabled'; } this.element.addClass('ui-button ui-widget ui-state-default ui-corner-all ' + styleClass).text(''); if(this.options.icon) { this.element.append(''); } this.element.append('' + value + ''); if(!disabled) { this._bindEvents(); } }, _destroy: function() { this.element.removeClass('ui-button ui-widget ui-state-default ui-state-hover ui-state-active ui-state-disabled ui-state-focus ui-corner-all ' + 'ui-button-text-only ui-button-icon-only ui-button-text-icon-right ui-button-text-icon-left'); this._unbindEvents(); this.element.children('.fa').remove(); this.element.children('.ui-button-text').remove(); this.element.text(this.elementText); }, _bindEvents: function() { var element = this.element, $this = this; element.on('mouseover.puibutton', function(){ if(!element.prop('disabled')) { element.addClass('ui-state-hover'); } }).on('mouseout.puibutton', function() { $(this).removeClass('ui-state-active ui-state-hover'); }).on('mousedown.puibutton', function() { if(!element.hasClass('ui-state-disabled')) { element.addClass('ui-state-active').removeClass('ui-state-hover'); } }).on('mouseup.puibutton', function(e) { element.removeClass('ui-state-active').addClass('ui-state-hover'); $this._trigger('click', e); }).on('focus.puibutton', function() { element.addClass('ui-state-focus'); }).on('blur.puibutton', function() { element.removeClass('ui-state-focus'); }).on('keydown.puibutton',function(e) { if(e.keyCode == $.ui.keyCode.SPACE || e.keyCode == $.ui.keyCode.ENTER || e.keyCode == $.ui.keyCode.NUMPAD_ENTER) { element.addClass('ui-state-active'); } }).on('keyup.puibutton', function() { element.removeClass('ui-state-active'); }); return this; }, _unbindEvents: function() { this.element.off('mouseover.puibutton mouseout.puibutton mousedown.puibutton mouseup.puibutton focus.puibutton blur.puibutton keydown.puibutton keyup.puibutton'); }, disable: function() { this._unbindEvents(); this.element.addClass('ui-state-disabled').prop('disabled',true); }, enable: function() { if(this.element.prop('disabled')) { this._bindEvents(); this.element.prop('disabled', false).removeClass('ui-state-disabled'); } }, _setOption: function(key, value) { if(key === 'disabled') { if(value) this.disable(); else this.enable(); } else { $.Widget.prototype._setOption.apply(this, arguments); } } }); })(); /** * PrimeUI Carousel widget */ (function() { $.widget("primeui.puicarousel", { options: { datasource: null, numVisible: 3, firstVisible: 0, headerText: null, effectDuration: 500, circular :false, breakpoint: 560, itemContent: null, responsive: true, autoplayInterval: 0, easing: 'easeInOutCirc', pageLinks: 3, style: null, styleClass: null, template: null, enhanced: false }, _create: function() { this.id = this.element.attr('id'); if(!this.id) { this.id = this.element.uniqueId().attr('id'); } if(!this.options.enhanced) { this.element.wrap(''); } this.container = this.element.parent().parent(); this.element.addClass('ui-carousel-items'); this.viewport = this.element.parent(); this.container.prepend(''); this.header = this.container.children('.ui-carousel-header'); this.header.append('' + ''); if(this.options.headerText) { this.header.children('.ui-carousel-header-title').html(this.options.headerText); } if(this.options.styleClass) { this.container.addClass(this.options.styleClass); } if(this.options.style) { this.container.attr('style', this.options.style); } if(this.options.datasource) this._loadData(); else this._render(); }, _destroy: function() { this._unbindEvents(); this.header.remove(); this.items.removeClass('ui-carousel-item ui-widget-content ui-corner-all').css('width','auto'); this.element.removeClass('ui-carousel-items').css('left','auto'); if(!this.options.enhanced) { this.element.unwrap().unwrap(); } if(this.options.datasource) { this.items.remove(); } }, _loadData: function() { if($.isArray(this.options.datasource)) this._render(this.options.datasource); else if($.type(this.options.datasource) === 'function') this.options.datasource.call(this, this._render); }, _updateDatasource: function(value) { this.options.datasource = value; this.element.children().remove(); this.header.children('.ui-carousel-page-links').remove(); this.header.children('select').remove(); this._loadData(); }, _render: function(data) { this.data = data; if(this.data) { for(var i = 0; i < data.length; i++) { var itemContent = this._createItemContent(data[i]); if($.type(itemContent) === 'string') this.element.append('
    • ' + itemContent + '
    • '); else this.element.append($('
    • ').wrapInner(itemContent)); } } this.items = this.element.children('li'); this.items.addClass('ui-carousel-item ui-widget-content ui-corner-all'); this.itemsCount = this.items.length; this.columns = this.options.numVisible; this.first = this.options.firstVisible; this.page = parseInt(this.first/this.columns); this.totalPages = Math.ceil(this.itemsCount/this.options.numVisible); this._renderPageLinks(); this.prevNav = this.header.children('.ui-carousel-prev-button'); this.nextNav = this.header.children('.ui-carousel-next-button'); this.pageLinks = this.header.find('> .ui-carousel-page-links > .ui-carousel-page-link'); this.dropdown = this.header.children('.ui-carousel-dropdown'); this.mobileDropdown = this.header.children('.ui-carousel-mobiledropdown'); this._bindEvents(); if(this.options.responsive) { this.refreshDimensions(); } else { this.calculateItemWidths(); this.container.width(this.container.width()); this.updateNavigators(); } }, _renderPageLinks: function() { if(this.totalPages <= this.options.pageLinks) { this.pageLinksContainer = $(''); for(var i = 0; i < this.totalPages; i++) { this.pageLinksContainer.append(''); } this.header.append(this.pageLinksContainer); } else { this.dropdown = $(''); for(var i = 0; i < this.totalPages; i++) { var pageNumber = (i+1); this.dropdown.append(''); } this.header.append(this.dropdown); } if(this.options.responsive) { this.mobileDropdown = $(''); for(var i = 0; i < this.itemsCount; i++) { var pageNumber = (i+1); this.mobileDropdown.append(''); } this.header.append(this.mobileDropdown); } }, calculateItemWidths: function() { var firstItem = this.items.eq(0); if(firstItem.length) { var itemFrameWidth = firstItem.outerWidth(true) - firstItem.width(); //sum of margin, border and padding this.items.width((this.viewport.innerWidth() - itemFrameWidth * this.columns) / this.columns); } }, refreshDimensions: function() { var win = $(window); if(win.width() <= this.options.breakpoint) { this.columns = 1; this.calculateItemWidths(this.columns); this.totalPages = this.itemsCount; this.mobileDropdown.show(); this.pageLinks.hide(); } else { this.columns = this.options.numVisible; this.calculateItemWidths(); this.totalPages = Math.ceil(this.itemsCount / this.options.numVisible); this.mobileDropdown.hide(); this.pageLinks.show(); } this.page = parseInt(this.first / this.columns); this.updateNavigators(); this.element.css('left', (-1 * (this.viewport.innerWidth() * this.page))); }, _bindEvents: function() { var $this = this; if(this.eventsBound) { return; } this.prevNav.on('click.puicarousel', function() { if($this.page !== 0) { $this.setPage($this.page - 1); } else if($this.options.circular) { $this.setPage($this.totalPages - 1); } }); this.nextNav.on('click.puicarousel', function() { var lastPage = ($this.page === ($this.totalPages - 1)); if(!lastPage) { $this.setPage($this.page + 1); } else if($this.options.circular) { $this.setPage(0); } }); if($.swipe) { this.element.swipe({ swipe:function(event, direction) { if(direction === 'left') { if($this.page === ($this.totalPages - 1)) { if($this.options.circular) $this.setPage(0); } else { $this.setPage($this.page + 1); } } else if(direction === 'right') { if($this.page === 0) { if($this.options.circular) $this.setPage($this.totalPages - 1); } else { $this.setPage($this.page - 1); } } } }); } if(this.pageLinks.length) { this.pageLinks.on('click.puicarousel', function(e) { $this.setPage($(this).index()); e.preventDefault(); }); } this.header.children('select').on('change.puicarousel', function() { $this.setPage(parseInt($(this).val()) - 1); }); if(this.options.autoplayInterval) { this.options.circular = true; this.startAutoplay(); } if(this.options.responsive) { var resizeNS = 'resize.' + this.id; $(window).off(resizeNS).on(resizeNS, function() { $this.refreshDimensions(); }); } this.eventsBound = true; }, _unbindEvents: function() { this.prevNav.off('click.puicarousel'); this.nextNav.off('click.puicarousel'); if(this.pageLinks.length) { this.pageLinks.off('click.puicarousel'); } this.header.children('select').off('change.puicarousel'); if(this.options.autoplayInterval) { this.stopAutoplay(); } if(this.options.responsive) { $(window).off('resize.' + this.id) } }, updateNavigators: function() { if(!this.options.circular) { if(this.page === 0) { this.prevNav.addClass('ui-state-disabled'); this.nextNav.removeClass('ui-state-disabled'); } else if(this.page === (this.totalPages - 1)) { this.prevNav.removeClass('ui-state-disabled'); this.nextNav.addClass('ui-state-disabled'); } else { this.prevNav.removeClass('ui-state-disabled'); this.nextNav.removeClass('ui-state-disabled'); } } if(this.pageLinks.length) { this.pageLinks.filter('.fa-dot-circle-o').removeClass('fa-dot-circle-o'); this.pageLinks.eq(this.page).addClass('fa-dot-circle-o'); } if(this.dropdown.length) { this.dropdown.val(this.page + 1); } if(this.mobileDropdown.length) { this.mobileDropdown.val(this.page + 1); } }, setPage: function(p) { if(p !== this.page && !this.element.is(':animated')) { var $this = this; this.element.animate({ left: -1 * (this.viewport.innerWidth() * p) ,easing: this.options.easing }, { duration: this.options.effectDuration, easing: this.options.easing, complete: function() { $this.page = p; $this.first = $this.page * $this.columns; $this.updateNavigators(); $this._trigger('pageChange', null, {'page':p}); } }); } }, startAutoplay: function() { var $this = this; this.interval = setInterval(function() { if($this.page === ($this.totalPages - 1)) $this.setPage(0); else $this.setPage($this.page + 1); }, this.options.autoplayInterval); }, stopAutoplay: function() { clearInterval(this.interval); }, _setOption: function(key, value) { if(key === 'datasource') this._updateDatasource(value); else $.Widget.prototype._setOption.apply(this, arguments); }, _createItemContent: function(obj) { if(this.options.template) { var template = this.options.template.html(); Mustache.parse(template); return Mustache.render(template, obj); } else { return this.options.itemContent.call(this, obj); } } }); })(); /** * PrimeUI checkbox widget */ (function() { $.widget("primeui.puicheckbox", { _create: function() { this.element.wrap('
      '); this.container = this.element.parent().parent(); this.box = $('
      ').appendTo(this.container); this.icon = $('').appendTo(this.box); this.disabled = this.element.prop('disabled'); this.label = $('label[for="' + this.element.attr('id') + '"]'); if(this.isChecked()) { this.box.addClass('ui-state-active'); this.icon.addClass('fa fa-fw fa-check'); } if(this.disabled) { this.box.addClass('ui-state-disabled'); } else { this._bindEvents(); } }, _bindEvents: function() { var $this = this; this.box.on('mouseover.puicheckbox', function() { if(!$this.isChecked()) $this.box.addClass('ui-state-hover'); }) .on('mouseout.puicheckbox', function() { $this.box.removeClass('ui-state-hover'); }) .on('click.puicheckbox', function() { $this.toggle(); }); this.element.on('focus.puicheckbox', function() { if($this.isChecked()) { $this.box.removeClass('ui-state-active'); } $this.box.addClass('ui-state-focus'); }) .on('blur.puicheckbox', function() { if($this.isChecked()) { $this.box.addClass('ui-state-active'); } $this.box.removeClass('ui-state-focus'); }) .on('keydown.puicheckbox', function(e) { var keyCode = $.ui.keyCode; if(e.which == keyCode.SPACE) { e.preventDefault(); } }) .on('keyup.puicheckbox', function(e) { var keyCode = $.ui.keyCode; if(e.which == keyCode.SPACE) { $this.toggle(true); e.preventDefault(); } }); this.label.on('click.puicheckbox', function(e) { $this.toggle(); e.preventDefault(); }); }, toggle: function(keypress) { if(this.isChecked()) { this.uncheck(keypress); } else { this.check(keypress); } this._trigger('change', null, this.isChecked()); }, isChecked: function() { return this.element.prop('checked'); }, check: function(activate, silent) { if(!this.isChecked()) { this.element.prop('checked', true); this.icon.addClass('fa fa-fw fa-check'); if(!activate) { this.box.addClass('ui-state-active'); } if(!silent) { this.element.trigger('change'); } } }, uncheck: function() { if(this.isChecked()) { this.element.prop('checked', false); this.box.removeClass('ui-state-active'); this.icon.removeClass('fa fa-fw fa-check'); this.element.trigger('change'); } }, _unbindEvents: function() { this.box.off('mouseover.puicheckbox mouseout.puicheckbox click.puicheckbox'); this.element.off('focus.puicheckbox blur.puicheckbox keydown.puicheckbox keyup.puicheckbox'); if (this.label.length) { this.label.off('click.puicheckbox'); } }, disable: function() { this.box.prop('disabled', true); this.box.attr('aria-disabled', true); this.box.addClass('ui-state-disabled').removeClass('ui-state-hover'); this._unbindEvents(); }, enable: function() { this.box.prop('disabled', false); this.box.attr('aria-disabled', false); this.box.removeClass('ui-state-disabled'); this._bindEvents(); }, _destroy: function() { this._unbindEvents(); this.container.removeClass('ui-chkbox ui-widget'); this.box.remove(); this.element.unwrap().unwrap(); } }); })(); /** * PrimeUI Datagrid Widget */ (function() { $.widget("primeui.puidatagrid", { options: { columns: 3, datasource: null, paginator: null, header: null, footer: null, content: null, lazy: false, template: null }, _create: function() { this.id = this.element.attr('id'); if(!this.id) { this.id = this.element.uniqueId().attr('id'); } this.element.addClass('ui-datagrid ui-widget'); //header if(this.options.header) { this.element.append('
      ' + this.options.header + '
      '); } //content this.content = $('
      ').appendTo(this.element); //footer if(this.options.footer) { this.element.append(''); } //data if(this.options.datasource) { this._initDatasource(); } }, _onDataInit: function(data) { this._onDataUpdate(data); this._initPaginator(); }, _onDataUpdate: function(data) { this.data = data; if(!this.data) { this.data = []; } this.reset(); this._renderData(); }, _onLazyLoad: function(data) { this.data = data; if(!this.data) { this.data = []; } this._renderData(); }, reset: function() { if(this.paginator) { this.paginator.puipaginator('setState', { page: 0, totalRecords: this.options.lazy ? this.options.paginator.totalRecords : this.data.length }); } }, paginate: function() { if(this.options.lazy) { this.options.datasource.call(this, this._onLazyLoad, this._createStateMeta()); } else { this._renderData(); } }, _renderData: function() { if(this.data) { this.content.html(''); var firstNonLazy = this._getFirst(), first = this.options.lazy ? 0 : firstNonLazy, rows = this._getRows(), gridRow = null; for(var i = first; i < (first + rows); i++) { var dataValue = this.data[i]; if(dataValue) { var gridColumn = $('
      ').appendTo(this.content), markup = this._createItemContent(dataValue); gridColumn.append(markup); } } } }, _getFirst: function() { if(this.paginator) { var page = this.paginator.puipaginator('option', 'page'), rows = this.paginator.puipaginator('option', 'rows'); return (page * rows); } else { return 0; } }, _getRows: function() { if(this.options.paginator) return this.paginator ? this.paginator.puipaginator('option', 'rows') : this.options.paginator.rows; else return this.data ? this.data.length : 0; }, _createStateMeta: function() { var state = { first: this._getFirst(), rows: this._getRows() }; return state; }, _initPaginator: function() { var $this = this; if(this.options.paginator) { this.options.paginator.paginate = function(event, state) { $this.paginate(); }; this.options.paginator.totalRecords = this.options.lazy ? this.options.paginator.totalRecords : this.data.length; this.paginator = $('
      ').insertAfter(this.content).puipaginator(this.options.paginator); } }, _initDatasource: function() { if($.isArray(this.options.datasource)) { this._onDataInit(this.options.datasource); } else { if($.type(this.options.datasource) === 'string') { var $this = this, dataURL = this.options.datasource; this.options.datasource = function() { $.ajax({ type: 'GET', url: dataURL, dataType: "json", context: $this, success: function (response) { this._onDataInit(response); } }); }; } if($.type(this.options.datasource) === 'function') { if(this.options.lazy) this.options.datasource.call(this, this._onDataInit, {first:0, rows: this._getRows()}); else this.options.datasource.call(this, this._onDataInit); } } }, _updateDatasource: function(datasource) { this.options.datasource = datasource; if($.isArray(this.options.datasource)) { this._onDataUpdate(this.options.datasource); } else if($.type(this.options.datasource) === 'function') { if(this.options.lazy) this.options.datasource.call(this, this._onDataUpdate, {first:0, rows: this._getRows()}); else this.options.datasource.call(this, this._onDataUpdate); } }, _setOption: function(key, value) { if(key === 'datasource') { this._updateDatasource(value); } else { $.Widget.prototype._setOption.apply(this, arguments); } }, _createItemContent: function(obj) { if(this.options.template) { var templateContent = this.options.template.html(); Mustache.parse(templateContent); return Mustache.render(templateContent, obj); } else { return this.options.content.call(this, obj); } } }); })(); /** * PrimeUI Datascroller Widget */ (function() { $.widget("primeui.puidatascroller", { options: { header: null, buffer: 0.9, chunkSize: 10, datasource: null, lazy: false, content: null, template: null, mode: 'document', loader: null, scrollHeight: null, totalSize: null }, _create: function() { this.id = this.element.attr('id'); if(!this.id) { this.id = this.element.uniqueId().attr('id'); } this.element.addClass('ui-datascroller ui-widget'); if(this.options.header) { this.header = this.element.append('
      ' + this.options.header + '
      ').children('.ui-datascroller-header'); } this.content = this.element.append('
      ').children('.ui-datascroller-content'); this.list = this.content.append('
        ').children('.ui-datascroller-list'); this.loaderContainer = this.content.append('
        ').children('.ui-datascroller-loader'); this.loadStatus = $('
        '); this.loading = false; this.allLoaded = false; this.offset = 0; if(this.options.mode === 'self') { this.element.addClass('ui-datascroller-inline'); if(this.options.scrollHeight) { this.content.css('height', this.options.scrollHeight); } } if(this.options.loader) { this.bindManualLoader(); } else { this.bindScrollListener(); } if(this.options.datasource) { if($.isArray(this.options.datasource)) { this._onDataInit(this.options.datasource); } else { if($.type(this.options.datasource) === 'string') { var $this = this, dataURL = this.options.datasource; this.options.datasource = function() { $.ajax({ type: 'GET', url: dataURL, dataType: "json", context: $this, success: function (response) { this._onDataInit(response); } }); }; } if($.type(this.options.datasource) === 'function') { if(this.options.lazy) this.options.datasource.call(this, this._onLazyLoad, {first:this.offset}); else this.options.datasource.call(this, this._onDataInit); } } } }, _onDataInit: function(data) { this.data = data||[]; this.options.totalSize = this.data.length; this._load(); }, _onLazyLoad: function(data) { this._renderData(data, 0, this.options.chunkSize); this._onloadComplete(); }, bindScrollListener: function() { var $this = this; if(this.options.mode === 'document') { var win = $(window), doc = $(document), $this = this, NS = 'scroll.' + this.id; win.off(NS).on(NS, function () { if(win.scrollTop() >= ((doc.height() * $this.options.buffer) - win.height()) && $this.shouldLoad()) { $this._load(); } }); } else { this.content.on('scroll', function () { var scrollTop = this.scrollTop, scrollHeight = this.scrollHeight, viewportHeight = this.clientHeight; if((scrollTop >= ((scrollHeight * $this.options.buffer) - (viewportHeight))) && $this.shouldLoad()) { $this._load(); } }); } }, bindManualLoader: function() { var $this = this; this.options.loader.on('click.dataScroller', function(e) { $this._load(); e.preventDefault(); }); }, _load: function() { this.loading = true; this.loadStatus.appendTo(this.loaderContainer); if(this.options.loader) { this.options.loader.hide(); } if(this.options.lazy) { this.options.datasource.call(this, this._onLazyLoad, {first: this.offset}); } else { this._renderData(this.data, this.offset, (this.offset + this.options.chunkSize)); this._onloadComplete(); } }, _renderData: function(data, start, end) { if(data && data.length) { for(var i = start; i < end; i++) { var listItem = $('
      • '), content = this._createItemContent(data[i]); listItem.append(content); this.list.append(listItem); } } }, shouldLoad: function() { return (!this.loading && !this.allLoaded); }, _createItemContent: function(obj) { if(this.options.template) { var template = this.options.template.html(); Mustache.parse(template); return Mustache.render(template, obj); } else { return this.options.content.call(this, obj); } }, _onloadComplete: function() { this.offset += this.options.chunkSize; this.loading = false; this.allLoaded = this.offset >= this.options.totalSize; this.loadStatus.remove(); if(this.options.loader && !this.allLoaded) { this.options.loader.show(); } } }); })(); /** * PrimeUI Datatable Widget */ (function() { $.widget("primeui.puidatatable", { options: { columns: null, datasource: null, paginator: null, globalFilter:null, selectionMode: null, caption: null, footer: null, sortField: null, sortOrder: 1, sortMeta: [], sortMode: null, scrollable: false, scrollHeight: null, scrollWidth: null, responsive: false, expandableRows: false, expandedRowContent: null, rowExpandMode: 'multiple', draggableColumns: false, resizableColumns: false, columnResizeMode: 'fit', draggableRows: false, filterDelay: 300, stickyHeader: false, editMode: null, tabindex: 0, emptyMessage: 'No records found', sort: null, rowSelect: null, rowUnselect: null, rowSelectContextMenu: null, rowCollapse: null, rowExpand: null, colReorder: null, colResize: null, rowReorder: null, cellEdit: null }, _create: function() { this.id = this.element.attr('id'); if(!this.id) { this.id = this.element.uniqueId().attr('id'); } this.element.addClass('ui-datatable ui-widget'); if(this.options.responsive) { this.element.addClass('ui-datatable-reflow'); } if(this.options.scrollable) { this._createScrollableDatatable(); } else { this._createRegularDatatable(); } if(this.options.datasource) { if($.isArray(this.options.datasource)) { this._onDataInit(this.options.datasource); } else { if($.type(this.options.datasource) === 'string') { var $this = this, dataURL = this.options.datasource; this.options.datasource = function() { $.ajax({ type: 'GET', url: dataURL, dataType: "json", context: $this, success: function (response) { this._onDataInit(response); } }); }; } if($.type(this.options.datasource) === 'function') { if(this.options.lazy) this.options.datasource.call(this, this._onDataInit, {first:0, rows:this._getRows(), sortField:this.options.sortField, sortOrder:this.options.sortOrder, filters: this._createFilterMap()}); else this.options.datasource.call(this, this._onDataInit); } } } }, _createRegularDatatable: function() { this.tableWrapper = $('
        ').appendTo(this.element); this.table = $('
        ').appendTo(this.tableWrapper); this.thead = this.table.children('thead'); this.tbody = this.table.children('tbody').addClass('ui-datatable-data ui-widget-content'); if(this.containsFooter()) { this.tfoot = this.thead.after('').next(); } }, _createScrollableDatatable: function() { this.element.append('
        ') .append('
        '); this.thead = this.element.find('> .ui-datatable-scrollable-header > .ui-datatable-scrollable-header-box > table > thead'); this.tbody = this.element.find('> .ui-datatable-scrollable-body > table > tbody'); if(this.containsFooter()) { this.element.append(''); this.tfoot = this.element.find('> .ui-datatable-scrollable-footer > .ui-datatable-scrollable-footer-box > table > tfoot'); } }, _initialize: function() { var $this = this; this._initHeader(); this._initFooter(); if(this.options.caption) { this.element.prepend('
        ' + this.options.caption + '
        '); } if(this.options.paginator) { this.options.paginator.paginate = function(event, state) { $this.paginate(); }; this.options.paginator.totalRecords = this.options.lazy ? this.options.paginator.totalRecords : this.data.length; this.paginator = $('
        ').insertAfter(this.tableWrapper).puipaginator(this.options.paginator); if(this.options.paginator.contentLeft) { this.paginator.prepend(this.options.paginator.contentLeft.call()); } if(this.options.paginator.contentRight) { this.paginator.append(this.options.paginator.contentRight.call()); } } if(this.options.footer) { this.element.append(''); } if(this._isSortingEnabled()) { this._initSorting(); } if(this.hasFiltering) { this._initFiltering(); } if(this.options.selectionMode) { this._initSelection(); } if(this.options.expandableRows) { this._initExpandableRows(); } if(this.options.draggableColumns) { this._initDraggableColumns(); } if(this.options.stickyHeader) { this._initStickyHeader(); } if ((this.options.sortField && this.options.sortOrder) || this.options.sortMeta.length) { this.sortByDefault(); } else { this._renderData(); } if(this.options.scrollable) { this._initScrolling(); } if(this.options.resizableColumns) { this._initResizableColumns(); } if(this.options.draggableRows) { this._initDraggableRows(); } if(this.options.editMode) { this._initEditing(); } }, _initHeader: function() { if(this.options.headerRows) { for(var i = 0; i < this.options.headerRows.length; i++) { this._initHeaderColumns(this.options.headerRows[i].columns); } } else if(this.options.columns) { this._initHeaderColumns(this.options.columns); } }, _initFooter: function() { if(this.containsFooter()) { if(this.options.footerRows) { for(var i = 0; i < this.options.footerRows.length; i++) { this._initFooterColumns(this.options.footerRows[i].columns); } } else if(this.options.columns) { this._initFooterColumns(this.options.columns); } } }, _initHeaderColumns: function(columns) { var headerRow = $('').appendTo(this.thead), $this = this; $.each(columns, function(i, col) { var cell = $('').data('field', col.field).uniqueId().appendTo(headerRow); if(col.headerClass) { cell.addClass(col.headerClass); } if(col.headerStyle) { cell.attr('style', col.headerStyle); } if(col.headerText) cell.children('.ui-column-title').text(col.headerText); else if(col.headerContent) cell.children('.ui-column-title').append(col.headerContent.call(this, col)); if(col.rowspan) { cell.attr('rowspan', col.rowspan); } if(col.colspan) { cell.attr('colspan', col.colspan); } if(col.sortable) { cell.addClass('ui-sortable-column') .data('order', 0) .append(''); } if(col.filter) { $this.hasFiltering = true; var filterElement = $('').puiinputtext().data({ 'field': col.field, 'filtermatchmode': col.filterMatchMode||'startsWith' }).appendTo(cell); if(col.filterFunction) { filterElement.on('filter', function(event, dataValue, filterValue) { return col.filterFunction.call($this, dataValue, filterValue); }); } } }); }, _initFooterColumns: function(columns) { var footerRow = $('').appendTo(this.tfoot); $.each(columns, function(i, col) { var cell = $(''); if(col.footerText) { cell.text(col.footerText); } if(col.rowspan) { cell.attr('rowspan', col.rowspan); } if(col.colspan) { cell.attr('colspan', col.colspan); } cell.appendTo(footerRow); }); }, _indicateInitialSortColumn: function(sortField, sortOrder) { var $this = this; $.each(this.sortableColumns, function(i, column) { var $column = $(column), data = $column.data(); if (sortField === data.field) { var sortIcon = $column.children('.ui-sortable-column-icon'); $column.data('order', sortOrder).removeClass('ui-state-hover').addClass('ui-state-active'); if(sortOrder == -1) sortIcon.removeClass('fa-sort fa-sort-asc').addClass('fa-sort-desc'); else if(sortOrder == 1) sortIcon.removeClass('fa-sort fa-sort-desc').addClass('fa-sort-asc'); } }); }, _indicateInitialSortColumns: function() { var $this = this; for(var i = 0; i < this.options.sortMeta.length; i++) { var meta = this.options.sortMeta[i]; this._indicateInitialSortColumn(meta.field, meta.order); } }, _onDataInit: function(data) { this.data = data; if(!this.data) { this.data = []; } this._initialize(); }, _onDataUpdate: function(data) { this.data = data; if(!this.data) { this.data = []; } this.reset(); this._renderData(); }, _onLazyLoad: function(data) { this.data = data; if(!this.data) { this.data = []; } this._renderData(); }, reset: function() { if(this.options.selectionMode) { this.selection = []; } if(this.paginator) { this.paginator.puipaginator('setState', { page: 0, totalRecords: this.options.lazy ? this.options.paginator.totalRecords : this.data.length }); } this.thead.find('> tr > th.ui-sortable-column').data('order', 0).filter('.ui-state-active').removeClass('ui-state-active') .children('span.ui-sortable-column-icon').removeClass('fa-sort-asc fa-sort-desc').addClass('fa-sort'); }, _isMultiSort: function() { if(this.options.sortMode === 'multiple') return true; else return false; }, _resetSortState: function(column) { this.sortableColumns.filter('.ui-state-active').data('order', 0).removeClass('ui-state-active').children('span.ui-sortable-column-icon') .removeClass('fa-sort-asc fa-sort-desc').addClass('fa-sort'); }, _initSorting: function() { var $this = this; this.sortableColumns = this.thead.find('> tr > th.ui-sortable-column'); this.sortableColumns.on('mouseover.puidatatable', function() { var column = $(this); if(!column.hasClass('ui-state-active')) column.addClass('ui-state-hover'); }) .on('mouseout.puidatatable', function() { var column = $(this); if(!column.hasClass('ui-state-active')) column.removeClass('ui-state-hover'); }) .on('click.puidatatable', function(event) { if(!$(event.target).is('th,span')) { return; } var column = $(this), sortField = column.data('field'), order = column.data('order'), sortOrder = (order === 0) ? 1 : (order * -1), sortIcon = column.children('.ui-sortable-column-icon'), metaKey = event.metaKey||event.ctrlKey; if($this._isMultiSort()) { if(metaKey) { $this._addSortMeta({field: sortField, order: sortOrder}); $this.sort(); } else { $this.options.sortMeta = []; $this._addSortMeta({field: sortField, order: sortOrder}); $this._resetSortState(column); $this.sort(); } } else { //update state $this.options.sortField = sortField; $this.options.sortOrder = sortOrder; $this._resetSortState(column); $this.sort(); } //update visuals column.data('order', sortOrder).removeClass('ui-state-hover').addClass('ui-state-active'); if(sortOrder === -1) sortIcon.removeClass('fa-sort fa-sort-asc').addClass('fa-sort-desc'); else if(sortOrder === 1) sortIcon.removeClass('fa-sort fa-sort-desc').addClass('fa-sort-asc'); $this._trigger('sort', event, {'sortOrder': sortOrder, 'sortField': sortField}); }); }, _addSortMeta: function(meta) { var index = -1; for(var i = 0; i < this.options.sortMeta.length; i++) { if(this.options.sortMeta[i].field === meta.field) { index = i; } } if(index >= 0) this.options.sortMeta[index] = meta; else this.options.sortMeta.push(meta); }, paginate: function() { if(this.options.lazy) { this.options.datasource.call(this, this._onLazyLoad, this._createStateMeta()); } else { this._renderData(); } }, _multipleSort: function() { var $this = this; function multisort(data1,data2,sortMeta,index) { var value1 = data1[sortMeta[index].field], value2 = data2[sortMeta[index].field], result = null; if (typeof value1 == 'string' || value1 instanceof String) { if (value1.localeCompare && (value1 != value2)) { return (sortMeta[index].order * value1.localeCompare(value2)); } } else { result = (value1 < value2) ? -1 : 1; } if(value1 == value2) { return (sortMeta.length - 1) > (index) ? (multisort(data1, data2, sortMeta, index + 1)) : 0; } return (sortMeta[index].order * result); } this.data.sort(function (data1,data2) { return multisort(data1, data2, $this.options.sortMeta, 0); }); this._renderData(); }, sort: function() { if(this.options.lazy) { this.options.datasource.call(this, this._onLazyLoad, this._createStateMeta()); } else { if(this._isMultiSort()) this._multipleSort(); else this._singleSort(); } }, _singleSort: function() { var $this = this; this.data.sort(function(data1, data2) { var value1 = data1[$this.options.sortField], value2 = data2[$this.options.sortField], result = null; if (typeof value1 == 'string' || value1 instanceof String) { if ( value1.localeCompare ) { return ($this.options.sortOrder * value1.localeCompare(value2)); } else { if (value1.toLowerCase) { value1 = value1.toLowerCase(); } if (value2.toLowerCase) { value2 = value2.toLowerCase(); } result = (value1 < value2) ? -1 : (value1 > value2) ? 1 : 0; } } else { result = (value1 < value2) ? -1 : (value1 > value2) ? 1 : 0; } return ($this.options.sortOrder * result); }); if(this.paginator) { this.paginator.puipaginator('option', 'page', 0); } this._renderData(); }, sortByField: function(a, b) { var aName = a.name.toLowerCase(); var bName = b.name.toLowerCase(); return ((aName < bName) ? -1 : ((aName > bName) ? 1 : 0)); }, sortByDefault: function() { if(this._isMultiSort()) { if(this.options.sortMeta) { this._indicateInitialSortColumns(); this.sort(); } } else { this._indicateInitialSortColumn(this.options.sortField, this.options.sortOrder); this.sort(); } }, _renderData: function() { this.tbody.html(''); var dataToRender = this.filteredData||this.data; if(dataToRender && dataToRender.length) { var firstNonLazy = this._getFirst(), first = this.options.lazy ? 0 : firstNonLazy, rows = this._getRows(); for(var i = first; i < (first + rows); i++) { var rowData = dataToRender[i]; if(rowData) { var row = $('').appendTo(this.tbody), zebraStyle = (i%2 === 0) ? 'ui-datatable-even' : 'ui-datatable-odd', rowIndex = i; row.addClass(zebraStyle); row.data('rowdata', rowData); if(this.options.selectionMode && this._isSelected(rowData)) { row.addClass("ui-state-highlight"); } for(var j = 0; j < this.options.columns.length; j++) { var column = $('').appendTo(row), columnOptions = this.options.columns[j]; if(columnOptions.bodyClass) { column.addClass(columnOptions.bodyClass); } if(columnOptions.bodyStyle) { column.attr('style', columnOptions.bodyStyle); } if(columnOptions.editor) { column.addClass('ui-editable-column').data({ 'editor': columnOptions.editor, 'rowdata': rowData, 'field': columnOptions.field }); } if(columnOptions.content) { var content = columnOptions.content.call(this, rowData, columnOptions); if($.type(content) === 'string') column.html(content); else column.append(content); } else if(columnOptions.rowToggler) { column.append('
        '); } else if(columnOptions.field) { column.text(rowData[columnOptions.field]); } if(this.options.responsive && columnOptions.headerText) { column.prepend('' + columnOptions.headerText + ''); } } } } } else { var emptyRow = $('').appendTo(this.tbody); var emptyColumn = $('').attr('colspan',this.options.columns.length).appendTo(emptyRow); emptyColumn.html(this.options.emptyMessage); } }, _getFirst: function() { if(this.paginator) { var page = this.paginator.puipaginator('option', 'page'), rows = this.paginator.puipaginator('option', 'rows'); return (page * rows); } else { return 0; } }, _getRows: function() { return this.paginator ? this.paginator.puipaginator('option', 'rows') : (this.data ? this.data.length : 0); }, _isSortingEnabled: function() { var cols = this.options.columns; if(cols) { for(var i = 0; i < cols.length; i++) { if(cols[i].sortable) { return true; } } } return false; }, _initSelection: function() { var $this = this; this.selection = []; this.rowSelector = '> tr.ui-widget-content:not(.ui-datatable-empty-message,.ui-datatable-unselectable)'; //shift key based range selection if(this._isMultipleSelection()) { this.originRowIndex = 0; this.cursorIndex = null; } this.tbody.off('mouseover.puidatatable mouseout.puidatatable mousedown.puidatatable click.puidatatable', this.rowSelector) .on('mouseover.datatable', this.rowSelector, null, function() { var element = $(this); if(!element.hasClass('ui-state-highlight')) { element.addClass('ui-state-hover'); } }) .on('mouseout.datatable', this.rowSelector, null, function() { var element = $(this); if(!element.hasClass('ui-state-highlight')) { element.removeClass('ui-state-hover'); } }) .on('mousedown.datatable', this.rowSelector, null, function() { $this.mousedownOnRow = true; }) .on('click.datatable', this.rowSelector, null, function(e) { $this._onRowClick(e, this); $this.mousedownOnRow = false; }); this._bindSelectionKeyEvents(); }, _onRowClick: function(event, rowElement) { if(!$(event.target).is(':input,:button,a,.ui-c')) { var row = $(rowElement), selected = row.hasClass('ui-state-highlight'), metaKey = event.metaKey||event.ctrlKey, shiftKey = event.shiftKey; this.focusedRow = row; //unselect a selected row if metakey is on if(selected && metaKey) { this.unselectRow(row); } else { //unselect previous selection if this is single selection or multiple one with no keys if(this._isSingleSelection() || (this._isMultipleSelection() && !metaKey && !shiftKey)) { if (this._isMultipleSelection()) { var selections = this.getSelection(); for (var i = 0; i < selections.length; i++) { this._trigger('rowUnselect', null, selections[i]); } } this.unselectAllRows(); } this.selectRow(row, false, event); } PUI.clearSelection(); } }, onRowRightClick: function(event, rowElement) { var row = $(rowElement), selectedData = row.data('rowdata'), selected = row.hasClass('ui-state-highlight'); if(this._isSingleSelection() || !selected) { this.unselectAllRows(); } this.selectRow(row, true); this.dataSelectedByContextMenu = selectedData; this._trigger('rowSelectContextMenu', event, selectedData); PUI.clearSelection(); }, _bindSelectionKeyEvents: function() { var $this = this; this.tbody.attr('tabindex', this.options.tabindex).on('focus', function(e) { //ignore mouse click on row if(!$this.mousedownOnRow) { $this.focusedRow = $this.tbody.children('tr.ui-widget-content').eq(0); $this.focusedRow.addClass('ui-state-hover'); } }) .on('blur', function() { if($this.focusedRow) { $this.focusedRow.removeClass('ui-state-hover'); $this.focusedRow = null; } }) .on('keydown', function(e) { var keyCode = $.ui.keyCode, key = e.which; if($this.focusedRow) { switch(key) { case keyCode.UP: var prevRow = $this.focusedRow.prev('tr.ui-widget-content'); if(prevRow.length) { $this.focusedRow.removeClass('ui-state-hover'); $this.focusedRow = prevRow; $this.focusedRow.addClass('ui-state-hover'); } e.preventDefault(); break; case keyCode.DOWN: var nextRow = $this.focusedRow.next('tr.ui-widget-content'); if(nextRow.length) { $this.focusedRow.removeClass('ui-state-hover'); $this.focusedRow = nextRow; $this.focusedRow.addClass('ui-state-hover'); } e.preventDefault(); break; case keyCode.ENTER: case keyCode.NUMPAD_ENTER: case keyCode.SPACE: e.target = $this.focusedRow.children().eq(0).get(0); $this._onRowClick(e, $this.focusedRow.get(0)); e.preventDefault(); break; default: break; }; } }); }, _isSingleSelection: function() { return this.options.selectionMode === 'single'; }, _isMultipleSelection: function() { return this.options.selectionMode === 'multiple'; }, unselectAllRows: function() { this.tbody.children('tr.ui-state-highlight').removeClass('ui-state-highlight').attr('aria-selected', false); this.selection = []; }, unselectRow: function(row, silent) { var unselectedData = row.data('rowdata'); row.removeClass('ui-state-highlight').attr('aria-selected', false); this._removeSelection(unselectedData); if(!silent) { this._trigger('rowUnselect', null, unselectedData); } }, selectRow: function(row, silent, event) { var selectedData = row.data('rowdata'); row.removeClass('ui-state-hover').addClass('ui-state-highlight').attr('aria-selected', true); this._addSelection(selectedData); if(!silent) { this._trigger('rowSelect', event, selectedData); } }, getSelection: function() { return this.selection; }, _removeSelection: function(rowData) { this.selection = $.grep(this.selection, function(value) { return value !== rowData; }); }, _addSelection: function(rowData) { if(!this._isSelected(rowData)) { this.selection.push(rowData); } }, _isSelected: function(rowData) { return PUI.inArray(this.selection, rowData); }, _initExpandableRows: function() { var $this = this, togglerSelector = '> tr > td > div.ui-row-toggler'; this.tbody.off('click', togglerSelector) .on('click', togglerSelector, null, function() { $this.toggleExpansion($(this)); }) .on('keydown', togglerSelector, null, function(e) { var key = e.which, keyCode = $.ui.keyCode; if((key === keyCode.ENTER||key === keyCode.NUMPAD_ENTER)) { $this.toggleExpansion($(this)); e.preventDefault(); } }); }, toggleExpansion: function(toggler) { var row = toggler.closest('tr'), expanded = toggler.hasClass('fa-chevron-circle-down'); if(expanded) { toggler.addClass('fa-chevron-circle-right').removeClass('fa-chevron-circle-down').attr('aria-expanded', false); this.collapseRow(row); this._trigger('rowCollapse', null, row.data('rowdata')); } else { if(this.options.rowExpandMode === 'single') { this.collapseAllRows(); } toggler.addClass('fa-chevron-circle-down').removeClass('fa-chevron-circle-right').attr('aria-expanded', true); this.loadExpandedRowContent(row); } }, loadExpandedRowContent: function(row) { var expandedRow = $(''); expandedRow.children('td').append(this.options.expandedRowContent.call(this, row.data('rowdata'))); row.addClass('ui-expanded-row').after(expandedRow); this._trigger('rowExpand', null, row.data('rowdata')); }, collapseRow: function(row) { row.removeClass('ui-expanded-row').next('.ui-expanded-row-content').remove(); }, collapseAllRows: function() { var $this = this; this.getExpandedRows().each(function () { var expandedRow = $(this); $this.collapseRow(expandedRow); var columns = expandedRow.children('td'); for (var i = 0; i < columns.length; i++) { var column = columns.eq(i), toggler = column.children('.ui-row-toggler'); if (toggler.length) { toggler.addClass('fa-chevron-circle-right').removeClass('fa-chevron-circle-down'); } } }); }, getExpandedRows: function () { return this.tbody.children('.ui-expanded-row'); }, _createStateMeta: function() { var state = { first: this._getFirst(), rows: this._getRows(), sortField: this.options.sortField, sortOrder: this.options.sortOrder, sortMeta: this.options.sortMeta, filters: this.filterMetaMap }; return state; }, _updateDatasource: function(datasource) { this.options.datasource = datasource; if($.isArray(this.options.datasource)) { this._onDataUpdate(this.options.datasource); } else if($.type(this.options.datasource) === 'function') { if(this.options.lazy) this.options.datasource.call(this, this._onDataUpdate, {first:0, rows: this._getRows(), sortField:this.options.sortField, sortorder:this.options.sortOrder, filters: this._createFilterMap()}); else this.options.datasource.call(this, this._onDataUpdate); } }, _setOption: function(key, value) { if(key === 'datasource') { this._updateDatasource(value); } else { $.Widget.prototype._setOption.apply(this, arguments); } }, _initScrolling: function() { this.scrollHeader = this.element.children('.ui-datatable-scrollable-header'); this.scrollBody = this.element.children('.ui-datatable-scrollable-body'); this.scrollHeaderBox = this.scrollHeader.children('.ui-datatable-scrollable-header-box'); this.headerTable = this.scrollHeaderBox.children('table'); this.bodyTable = this.scrollBody.children('table'); this.percentageScrollHeight = this.options.scrollHeight && (this.options.scrollHeight.indexOf('%') !== -1); this.percentageScrollWidth = this.options.scrollWidth && (this.options.scrollWidth.indexOf('%') !== -1); var $this = this, scrollBarWidth = this.getScrollbarWidth() + 'px'; if(this.options.scrollHeight) { if(this.percentageScrollHeight) this.adjustScrollHeight(); else this.scrollBody.css('max-height', this.options.scrollHeight + 'px'); if(this.hasVerticalOverflow()) { this.scrollHeaderBox.css('margin-right', scrollBarWidth); } } this.fixColumnWidths(); if(this.options.scrollWidth) { if(this.percentageScrollWidth) this.adjustScrollWidth(); else this.setScrollWidth(parseInt(this.options.scrollWidth)); } this.cloneHead(); this.scrollBody.on('scroll.dataTable', function() { var scrollLeft = $this.scrollBody.scrollLeft(); $this.scrollHeaderBox.css('margin-left', -scrollLeft); }); this.scrollHeader.on('scroll.dataTable', function() { $this.scrollHeader.scrollLeft(0); }); var resizeNS = 'resize.' + this.id; $(window).off(resizeNS).on(resizeNS, function() { if($this.element.is(':visible')) { if($this.percentageScrollHeight) $this.adjustScrollHeight(); if($this.percentageScrollWidth) $this.adjustScrollWidth(); } }); }, cloneHead: function() { this.theadClone = this.thead.clone(); this.theadClone.find('th').each(function() { var header = $(this); header.attr('id', header.attr('id') + '_clone'); $(this).children().not('.ui-column-title').remove(); }); this.theadClone.removeAttr('id').addClass('ui-datatable-scrollable-theadclone').height(0).prependTo(this.bodyTable); //align horizontal scroller on keyboard tab if(this.options.scrollWidth) { var clonedSortableColumns = this.theadClone.find('> tr > th.ui-sortable-column'); clonedSortableColumns.each(function() { $(this).data('original', $(this).attr('id').split('_clone')[0]); }); clonedSortableColumns.on('blur.dataTable', function() { $(PUI.escapeClientId($(this).data('original'))).removeClass('ui-state-focus'); }) .on('focus.dataTable', function() { $(PUI.escapeClientId($(this).data('original'))).addClass('ui-state-focus'); }) .on('keydown.dataTable', function(e) { var key = e.which, keyCode = $.ui.keyCode; if((key === keyCode.ENTER||key === keyCode.NUMPAD_ENTER) && $(e.target).is(':not(:input)')) { $(PUI.escapeClientId($(this).data('original'))).trigger('click.dataTable', (e.metaKey||e.ctrlKey)); e.preventDefault(); } }); } }, adjustScrollHeight: function() { var relativeHeight = this.element.parent().innerHeight() * (parseInt(this.options.scrollHeight) / 100), tableHeaderHeight = this.element.children('.ui-datatable-header').outerHeight(true) || 0, tableFooterHeight = this.element.children('.ui-datatable-footer').outerHeight(true) || 0, scrollersHeight = (this.scrollHeader.outerHeight(true) + (this.scrollFooter == undefined ? 0 : this.scrollFooter.outerHeight(true))), paginatorsHeight = this.paginator ? this.paginator.getContainerHeight(true) : 0, height = (relativeHeight - (scrollersHeight + paginatorsHeight + tableHeaderHeight + tableFooterHeight)); this.scrollBody.css('max-height', height + 'px'); }, adjustScrollWidth: function() { var width = parseInt((this.element.parent().innerWidth() * (parseInt(this.options.scrollWidth) / 100))); this.setScrollWidth(width); }, setOuterWidth: function(element, width) { var diff = element.outerWidth() - element.width(); element.width(width - diff); }, setScrollWidth: function(width) { var $this = this; this.element.children('.ui-widget-header').each(function() { $this.setOuterWidth($(this), width); }); this.scrollHeader.width(width); this.scrollBody.css('margin-right', 0).width(width); }, alignScrollBody: function() { var marginRight = this.hasVerticalOverflow() ? this.getScrollbarWidth() + 'px' : '0px'; this.scrollHeaderBox.css('margin-right', marginRight); }, getScrollbarWidth: function() { if(!this.scrollbarWidth) { this.scrollbarWidth = PUI.browser.webkit ? '15' : PUI.calculateScrollbarWidth(); } return this.scrollbarWidth; }, hasVerticalOverflow: function() { return (this.options.scrollHeight && this.bodyTable.outerHeight() > this.scrollBody.outerHeight()) }, restoreScrollState: function() { var scrollState = this.scrollStateHolder.val(), scrollValues = scrollState.split(','); this.scrollBody.scrollLeft(scrollValues[0]); this.scrollBody.scrollTop(scrollValues[1]); }, saveScrollState: function() { var scrollState = this.scrollBody.scrollLeft() + ',' + this.scrollBody.scrollTop(); this.scrollStateHolder.val(scrollState); }, clearScrollState: function() { this.scrollStateHolder.val('0,0'); }, fixColumnWidths: function() { if(!this.columnWidthsFixed) { if(this.options.scrollable) { this.scrollHeaderBox.find('> table > thead > tr > th').each(function() { var headerCol = $(this), width = headerCol.width(); headerCol.width(width); }); } else { this.element.find('> .ui-datatable-tablewrapper > table > thead > tr > th').each(function() { var col = $(this); col.width(col.width()); }); } this.columnWidthsFixed = true; } }, _initDraggableColumns: function() { var $this = this; this.dragIndicatorTop = $('').hide().appendTo(this.element); this.dragIndicatorBottom = $('').hide().appendTo(this.element); this.thead.find('> tr > th').draggable({ appendTo: 'body', opacity: 0.75, cursor: 'move', scope: this.id, cancel: ':input,.ui-column-resizer', drag: function(event, ui) { var droppable = ui.helper.data('droppable-column'); if(droppable) { var droppableOffset = droppable.offset(), topArrowY = droppableOffset.top - 10, bottomArrowY = droppableOffset.top + droppable.height() + 8, arrowX = null; //calculate coordinates of arrow depending on mouse location if(event.originalEvent.pageX >= droppableOffset.left + (droppable.width() / 2)) { var nextDroppable = droppable.next(); if(nextDroppable.length == 1) arrowX = nextDroppable.offset().left - 9; else arrowX = droppable.offset().left + droppable.innerWidth() - 9; ui.helper.data('drop-location', 1); //right } else { arrowX = droppableOffset.left - 9; ui.helper.data('drop-location', -1); //left } $this.dragIndicatorTop.offset({ 'left': arrowX, 'top': topArrowY - 3 }).show(); $this.dragIndicatorBottom.offset({ 'left': arrowX, 'top': bottomArrowY - 3 }).show(); } }, stop: function(event, ui) { //hide dnd arrows $this.dragIndicatorTop.css({ 'left':0, 'top':0 }).hide(); $this.dragIndicatorBottom.css({ 'left':0, 'top':0 }).hide(); }, helper: function() { var header = $(this), helper = $('
        '); helper.width(header.width()); helper.height(header.height()); helper.html(header.html()); return helper.get(0); } }).droppable({ hoverClass:'ui-state-highlight', tolerance:'pointer', scope: this.id, over: function(event, ui) { ui.helper.data('droppable-column', $(this)); }, drop: function(event, ui) { var draggedColumnHeader = ui.draggable, dropLocation = ui.helper.data('drop-location'), droppedColumnHeader = $(this), draggedColumnFooter = null, droppedColumnFooter = null; var draggedCells = $this.tbody.find('> tr:not(.ui-expanded-row-content) > td:nth-child(' + (draggedColumnHeader.index() + 1) + ')'), droppedCells = $this.tbody.find('> tr:not(.ui-expanded-row-content) > td:nth-child(' + (droppedColumnHeader.index() + 1) + ')'); if($this.containsFooter()) { var footerColumns = $this.tfoot.find('> tr > td'), draggedColumnFooter = footerColumns.eq(draggedColumnHeader.index()), droppedColumnFooter = footerColumns.eq(droppedColumnHeader.index()); } //drop right if(dropLocation > 0) { /* TODO :Resizable columns * if($this.options.resizableColumns) { if(droppedColumnHeader.next().length) { droppedColumnHeader.children('span.ui-column-resizer').show(); draggedColumnHeader.children('span.ui-column-resizer').hide(); } }*/ draggedColumnHeader.insertAfter(droppedColumnHeader); draggedCells.each(function(i, item) { $(this).insertAfter(droppedCells.eq(i)); }); if(draggedColumnFooter && droppedColumnFooter) { draggedColumnFooter.insertAfter(droppedColumnFooter); } //sync clone if($this.options.scrollable) { var draggedColumnClone = $(document.getElementById(draggedColumnHeader.attr('id') + '_clone')), droppedColumnClone = $(document.getElementById(droppedColumnHeader.attr('id') + '_clone')); draggedColumnClone.insertAfter(droppedColumnClone); } } //drop left else { draggedColumnHeader.insertBefore(droppedColumnHeader); draggedCells.each(function(i, item) { $(this).insertBefore(droppedCells.eq(i)); }); if(draggedColumnFooter && droppedColumnFooter) { draggedColumnFooter.insertBefore(droppedColumnFooter); } //sync clone if($this.options.scrollable) { var draggedColumnClone = $(document.getElementById(draggedColumnHeader.attr('id') + '_clone')), droppedColumnClone = $(document.getElementById(droppedColumnHeader.attr('id') + '_clone')); draggedColumnClone.insertBefore(droppedColumnClone); } } //fire colReorder event $this._trigger('colReorder', null, { dragIndex: draggedColumnHeader.index(), dropIndex: droppedColumnHeader.index() }); } }); }, containsFooter: function() { if(this.hasFooter === undefined) { this.hasFooter = this.options.footerRows !== undefined; if(!this.hasFooter) { if(this.options.columns) { for(var i = 0; i < this.options.columns.length; i++) { if(this.options.columns[i].footerText !== undefined) { this.hasFooter = true; break; } } } } } return this.hasFooter; }, _initResizableColumns: function() { this.element.addClass('ui-datatable-resizable'); this.thead.find('> tr > th').addClass('ui-resizable-column'); this.resizerHelper = $('
        ').appendTo(this.element); this.addResizers(); var resizers = this.thead.find('> tr > th > span.ui-column-resizer'), $this = this; setTimeout(function() { $this.fixColumnWidths(); }, 5); resizers.draggable({ axis: 'x', start: function(event, ui) { ui.helper.data('originalposition', ui.helper.offset()); var height = $this.options.scrollable ? $this.scrollBody.height() : $this.thead.parent().height() - $this.thead.height() - 1; $this.resizerHelper.height(height); $this.resizerHelper.show(); }, drag: function(event, ui) { $this.resizerHelper.offset({ left: ui.helper.offset().left + ui.helper.width() / 2, top: $this.thead.offset().top + $this.thead.height() }); }, stop: function(event, ui) { ui.helper.css({ 'left': '', 'top': '0px', 'right': '0px' }); $this.resize(event, ui); $this.resizerHelper.hide(); if($this.options.columnResizeMode === 'expand') { setTimeout(function() { $this._trigger('colResize', null, {element: ui.helper.parent()}); }, 5); } else { $this._trigger('colResize', null, {element: ui.helper.parent()}); } if($this.options.stickyHeader) { $this.thead.find('.ui-column-filter').prop('disabled', false); $this.clone = $this.thead.clone(true); $this.cloneContainer.find('thead').remove(); $this.cloneContainer.children('table').append($this.clone); $this.thead.find('.ui-column-filter').prop('disabled', true); } }, containment: this.element }); }, resize: function(event, ui) { var columnHeader, nextColumnHeader, change = null, newWidth = null, nextColumnWidth = null, expandMode = (this.options.columnResizeMode === 'expand'), table = this.thead.parent(), columnHeader = ui.helper.parent(), nextColumnHeader = columnHeader.next(); change = (ui.position.left - ui.originalPosition.left), newWidth = (columnHeader.width() + change), nextColumnWidth = (nextColumnHeader.width() - change); if((newWidth > 15 && nextColumnWidth > 15) || (expandMode && newWidth > 15)) { if(expandMode) { table.width(table.width() + change); setTimeout(function() { columnHeader.width(newWidth); }, 1); } else { columnHeader.width(newWidth); nextColumnHeader.width(nextColumnWidth); } if(this.options.scrollable) { var cloneTable = this.theadClone.parent(), colIndex = columnHeader.index(); if(expandMode) { var $this = this; //body cloneTable.width(cloneTable.width() + change); //footer this.footerTable.width(this.footerTable.width() + change); setTimeout(function() { if($this.hasColumnGroup) { $this.theadClone.find('> tr:first').children('th').eq(colIndex).width(newWidth); //body $this.footerTable.find('> tfoot > tr:first').children('th').eq(colIndex).width(newWidth); //footer } else { $this.theadClone.find(PUI.escapeClientId(columnHeader.attr('id') + '_clone')).width(newWidth); //body $this.footerCols.eq(colIndex).width(newWidth); //footer } }, 1); } else { //body this.theadClone.find(PUI.escapeClientId(columnHeader.attr('id') + '_clone')).width(newWidth); this.theadClone.find(PUI.escapeClientId(nextColumnHeader.attr('id') + '_clone')).width(nextColumnWidth); //footer /*if(this.footerCols.length > 0) { var footerCol = this.footerCols.eq(colIndex), nextFooterCol = footerCol.next(); footerCol.width(newWidth); nextFooterCol.width(nextColumnWidth); }*/ } } } }, addResizers: function() { var resizableColumns = this.thead.find('> tr > th.ui-resizable-column'); resizableColumns.prepend(' '); if(this.options.columnResizeMode === 'fit') { resizableColumns.filter(':last-child').children('span.ui-column-resizer').hide(); } }, _initDraggableRows: function() { var $this = this; this.tbody.sortable({ placeholder: 'ui-datatable-rowordering ui-state-active', cursor: 'move', handle: 'td,span:not(.ui-c)', appendTo: document.body, helper: function(event, ui) { var cells = ui.children(), helper = $('
        '), helperRow = ui.clone(), helperCells = helperRow.children(); for(var i = 0; i < helperCells.length; i++) { helperCells.eq(i).width(cells.eq(i).width()); } helperRow.appendTo(helper.find('tbody')); return helper; }, update: function(event, ui) { $this.syncRowParity(); $this._trigger('rowReorder', null, { fromIndex: ui.item.data('ri'), toIndex: $this._getFirst() + ui.item.index() }); }, change: function(event, ui) { if($this.options.scrollable) { PUI.scrollInView($this.scrollBody, ui.placeholder); } } }); }, syncRowParity: function() { var rows = this.tbody.children('tr.ui-widget-content'); for(var i = this._getFirst(); i < rows.length; i++) { var row = rows.eq(i); row.data('ri', i).removeClass('ui-datatable-even ui-datatable-odd'); if(i % 2 === 0) row.addClass('ui-datatable-even'); else row.addClass('ui-datatable-odd'); } }, getContextMenuSelection: function(data) { return this.dataSelectedByContextMenu; }, _initFiltering: function() { var $this = this; this.filterElements = this.thead.find('.ui-column-filter'); this.filterElements.on('keyup', function() { if($this.filterTimeout) { clearTimeout($this.filterTimeout); } $this.filterTimeout = setTimeout(function() { $this.filter(); $this.filterTimeout = null; }, $this.options.filterDelay); }); if(this.options.globalFilter) { $(this.options.globalFilter).on('keyup.puidatatable', function() { $this.filter(); }); } }, filter: function() { this.filterMetaMap = []; for(var i = 0; i < this.filterElements.length; i++) { var filterElement = this.filterElements.eq(i), filterElementValue = filterElement.val(); this.filterMetaMap.push({ field: filterElement.data('field'), filterMatchMode: filterElement.data('filtermatchmode'), value: filterElementValue.toLowerCase(), element: filterElement }); } if(this.options.lazy) { this.options.datasource.call(this, this._onLazyLoad, this._createStateMeta()); } else { var globalFilterValue = $(this.options.globalFilter).val(); this.filteredData = []; for(var i = 0; i < this.data.length; i++) { var localMatch = true; var globalMatch = false; for(var j = 0; j < this.filterMetaMap.length; j++) { var filterMeta = this.filterMetaMap[j], filterValue = filterMeta.value, filterField = filterMeta.field, dataFieldValue = this.data[i][filterField]; var filterConstraint = this.filterConstraints[filterMeta.filterMatchMode]; //global if(this.options.globalFilter && !globalMatch) { var filterConstraint = this.filterConstraints['contains']; globalMatch = filterConstraint(dataFieldValue, globalFilterValue); } //local if(filterMeta.filterMatchMode === 'custom') { localMatch = filterMeta.element.triggerHandler('filter', [dataFieldValue, filterValue]); } else { var filterConstraint = this.filterConstraints[filterMeta.filterMatchMode]; if(!filterConstraint(dataFieldValue, filterValue)) { localMatch = false; } } if(!localMatch) { break; } } var matches = localMatch; if(this.options.globalFilter) { matches = localMatch && globalMatch; } if(matches) { this.filteredData.push(this.data[i]); } } if(this.filteredData.length === this.data.length) { this.filteredData = null; } if(this.paginator) { this.paginator.puipaginator('option', 'totalRecords', this.filteredData ? this.filteredData.length : this.data ? this.data.length : 0); } this._renderData(); } }, filterConstraints: { startsWith: function(value, filter) { if(filter === undefined || filter === null || $.trim(filter) === '') { return true; } if(value === undefined || value === null) { return false; } return value.toString().toLowerCase().slice(0, filter.length) === filter; }, contains: function(value, filter) { if(filter === undefined || filter === null || $.trim(filter) === '') { return true; } if(value === undefined || value === null) { return false; } return value.toString().toLowerCase().indexOf(filter) !== -1; } }, _initStickyHeader: function() { var table = this.thead.parent(), offset = table.offset(), win = $(window), $this = this, stickyNS = 'scroll.' + this.id, resizeNS = 'resize.sticky-' + this.id; this.cloneContainer = $('
        '); this.clone = this.thead.clone(true); this.cloneContainer.children('table').append(this.clone); this.cloneContainer.css({ position: 'absolute', width: table.outerWidth(), top: offset.top, left: offset.left, 'z-index': ++PUI.zindex }) .appendTo(this.element); win.off(stickyNS).on(stickyNS, function() { var scrollTop = win.scrollTop(), tableOffset = table.offset(); if(scrollTop > tableOffset.top) { $this.cloneContainer.css({ 'position': 'fixed', 'top': '0px' }) .addClass('ui-shadow ui-sticky'); if(scrollTop >= (tableOffset.top + $this.tbody.height())) $this.cloneContainer.hide(); else $this.cloneContainer.show(); } else { $this.cloneContainer.css({ 'position': 'absolute', 'top': tableOffset.top }) .removeClass('ui-shadow ui-sticky'); } }) .off(resizeNS).on(resizeNS, function() { $this.cloneContainer.width(table.outerWidth()); }); //filter support this.thead.find('.ui-column-filter').prop('disabled', true); }, _initEditing: function() { var cellSelector = '> tr > td.ui-editable-column', $this = this; this.tbody.off('click', cellSelector) .on('click', cellSelector, null, function(e) { var cell = $(this); if(!cell.hasClass('ui-cell-editing')) { $this._showCellEditor(cell); e.stopPropagation(); } }); }, _showCellEditor: function(cell) { var editor = this.editors[cell.data('editor')].call(), $this = this; editor.val(cell.data('rowdata')[cell.data('field')]); cell.addClass('ui-cell-editing').html('').append(editor); editor.focus().on('change', function() { $this._onCellEditorChange(cell); }) .on('blur', function() { $this._onCellEditorBlur(cell); }) .on('keydown', function(e) { var key = e.which, keyCode = $.ui.keyCode; if((key === keyCode.ENTER||key === keyCode.NUMPAD_ENTER)) { $(this).trigger('change').trigger('blur'); e.preventDefault(); } else if(key === keyCode.TAB) { if(e.shiftKey) { var prevCell = cell.prevAll('td.ui-editable-column').eq(0); if(!prevCell.length) { prevCell = cell.parent().prev('tr').children('td.ui-editable-column:last'); } if(prevCell.length) { $this._showCellEditor(prevCell); } } else { var nextCell = cell.nextAll('td.ui-editable-column').eq(0); if(!nextCell.length) { nextCell = cell.parent().next('tr').children('td.ui-editable-column').eq(0); } if(nextCell.length) { $this._showCellEditor(nextCell); } } e.preventDefault(); } else if(key === keyCode.ESCAPE) { $this._onCellEditorBlur(cell); } }); }, _onCellEditorChange: function(cell) { var newCellValue = cell.children('.ui-cell-editor').val(); var retVal = this._trigger('cellEdit', null, { oldValue: cell.data('rowdata')[cell.data('field')], newValue: newCellValue, data: cell.data('rowdata'), field: cell.data('field') }); if(retVal !== false) { cell.data('rowdata')[cell.data('field')] = newCellValue; } }, _onCellEditorBlur: function(cell) { cell.removeClass('ui-cell-editing').text(cell.data('rowdata')[cell.data('field')]) .children('.ui-cell-editor').remove(); }, reload: function() { this._updateDatasource(this.options.datasource); }, getPaginator: function() { return this.paginator; }, setTotalRecords: function(val) { this.paginator.puipaginator('option','totalRecords', val); }, _createFilterMap: function() { var filters = null; if(this.filterElements) { filters = {}; for(var i = 0; i < this.filterElements.length; i++) { var filterElement = this.filterElements.eq(i), value = filterElement.val(); if($.trim(value).length) { filters[filterElement.data('field')] = value; } } } return filters; }, editors: { 'input': function() { return $(''); } } }); })(); /** * PrimeUI Dialog Widget */ (function() { $.widget("primeui.puidialog", { options: { draggable: true, resizable: true, location: 'center', minWidth: 150, minHeight: 25, height: 'auto', width: '300px', visible: false, modal: false, showEffect: null, hideEffect: null, effectOptions: {}, effectSpeed: 'normal', closeOnEscape: true, rtl: false, closable: true, minimizable: false, maximizable: false, appendTo: null, buttons: null, responsive: false, title: null, enhanced: false }, _create: function() { this.id = this.element.attr('id'); if(!this.id) { this.id = this.element.uniqueId().attr('id'); } //container if(!this.options.enhanced) { this.element.addClass('ui-dialog ui-widget ui-widget-content ui-helper-hidden ui-corner-all ui-shadow') .contents().wrapAll('
        '); //header var title = this.options.title||this.element.attr('title'); this.element.prepend('
        ' + '' + title + '') .removeAttr('title'); //footer if(this.options.buttons) { this.footer = $('
        ').appendTo(this.element); for(var i = 0; i < this.options.buttons.length; i++) { var buttonMeta = this.options.buttons[i], button = $('').appendTo(this.footer); if(buttonMeta.text) { button.text(buttonMeta.text); } button.puibutton(buttonMeta); } } if(this.options.rtl) { this.element.addClass('ui-dialog-rtl'); } } //elements this.content = this.element.children('.ui-dialog-content'); this.titlebar = this.element.children('.ui-dialog-titlebar'); if(!this.options.enhanced) { if(this.options.closable) { this._renderHeaderIcon('ui-dialog-titlebar-close', 'fa-close'); } if(this.options.maximizable) { this._renderHeaderIcon('ui-dialog-titlebar-maximize', 'fa-sort'); } if(this.options.minimizable) { this._renderHeaderIcon('ui-dialog-titlebar-minimize', 'fa-minus'); } } //icons this.icons = this.titlebar.children('.ui-dialog-titlebar-icon'); this.closeIcon = this.titlebar.children('.ui-dialog-titlebar-close'); this.minimizeIcon = this.titlebar.children('.ui-dialog-titlebar-minimize'); this.maximizeIcon = this.titlebar.children('.ui-dialog-titlebar-maximize'); this.blockEvents = 'focus.puidialog mousedown.puidialog mouseup.puidialog keydown.puidialog keyup.puidialog'; this.parent = this.element.parent(); //size this.element.css({'width': this.options.width, 'height': 'auto'}); this.content.height(this.options.height); //events this._bindEvents(); if(this.options.draggable) { this._setupDraggable(); } if(this.options.resizable) { this._setupResizable(); } if(this.options.appendTo) { this.element.appendTo(this.options.appendTo); } if(this.options.responsive) { this.resizeNS = 'resize.' + this.id; } //docking zone if($(document.body).children('.ui-dialog-docking-zone').length === 0) { $(document.body).append('
        '); } //aria this._applyARIA(); if(this.options.visible) { this.show(); } }, _destroy: function() { //restore dom if(!this.options.enhanced) { this.element.removeClass('ui-dialog ui-widget ui-widget-content ui-helper-hidden ui-corner-all ui-shadow'); if(this.options.buttons) { this.footer.children('button').puibutton('destroy'); this.footer.remove(); } if(this.options.rtl) { this.element.removeClass('ui-dialog-rtl'); } var title = this.titlebar.children('.ui-dialog-title').text()||this.options.title; if(title) { this.element.attr('title', title); } this.titlebar.remove(); this.content.contents().unwrap(); } //remove events this._unbindEvents(); if(this.options.draggable) { this.element.draggable('destroy'); } if(this.options.resizable) { this.element.resizable('destroy'); } if(this.options.appendTo) { this.element.appendTo(this.parent); } this._unbindResizeListener(); if(this.options.modal) { this._disableModality(); } this._removeARIA(); this.element.css({ 'width': 'auto', 'height': 'auto' }); }, _renderHeaderIcon: function(styleClass, icon) { this.titlebar.append('' + ''); }, _enableModality: function() { var $this = this, doc = $(document); this.modality = $('
        ').appendTo(document.body) .css('z-index', this.element.css('z-index') - 1); //Disable tabbing out of modal dialog and stop events from targets outside of dialog doc.on('keydown.puidialog', function(event) { if(event.keyCode == $.ui.keyCode.TAB) { var tabbables = $this.content.find(':tabbable'), first = tabbables.filter(':first'), last = tabbables.filter(':last'); if(event.target === last[0] && !event.shiftKey) { first.focus(1); return false; } else if (event.target === first[0] && event.shiftKey) { last.focus(1); return false; } } }) .bind(this.blockEvents, function(event) { if ($(event.target).zIndex() < $this.element.zIndex()) { return false; } }); }, _disableModality: function() { if(this.modality) { this.modality.remove(); this.modality = null; } $(document).off(this.blockEvents).off('keydown.dialog'); }, show: function() { if(this.element.is(':visible')) { return; } if(!this.positionInitialized) { this._initPosition(); } this._trigger('beforeShow', null); if(this.options.showEffect) { var $this = this; this.element.show(this.options.showEffect, this.options.effectOptions, this.options.effectSpeed, function() { $this._postShow(); }); } else { this.element.show(); this._postShow(); } this._moveToTop(); if(this.options.modal) { this._enableModality(); } }, _postShow: function() { //execute user defined callback this._trigger('afterShow', null); this.element.attr({ 'aria-hidden': false, 'aria-live': 'polite' }); this._applyFocus(); if(this.options.responsive) { this._bindResizeListener(); } }, hide: function() { if(this.element.is(':hidden')) { return; } this._trigger('beforeHide', null); if(this.options.hideEffect) { var _self = this; this.element.hide(this.options.hideEffect, this.options.effectOptions, this.options.effectSpeed, function() { _self._postHide(); }); } else { this.element.hide(); this._postHide(); } if(this.options.modal) { this._disableModality(); } }, _postHide: function() { //execute user defined callback this._trigger('afterHide', null); this.element.attr({ 'aria-hidden': true, 'aria-live': 'off' }); if(this.options.responsive) { this._unbindResizeListener(); } }, _applyFocus: function() { this.element.find(':not(:submit):not(:button):input:visible:enabled:first').focus(); }, _bindEvents: function() { var $this = this; this.element.on('mousedown.puidialog', function(e) { if(!$(e.target).data('ui-widget-overlay')) { $this._moveToTop(); } }); this.icons.mouseover(function() { $(this).addClass('ui-state-hover'); }).mouseout(function() { $(this).removeClass('ui-state-hover'); }); this.closeIcon.on('click.puidialog', function(e) { $this.hide(); $this._trigger('clickClose'); e.preventDefault(); }); this.maximizeIcon.click(function(e) { $this.toggleMaximize(); e.preventDefault(); }); this.minimizeIcon.click(function(e) { $this.toggleMinimize(); e.preventDefault(); }); if(this.options.closeOnEscape) { $(document).on('keydown.dialog_' + this.id, function(e) { var keyCode = $.ui.keyCode, active = parseInt($this.element.css('z-index'), 10) === PUI.zindex; if(e.which === keyCode.ESCAPE && $this.element.is(':visible') && active) { $this.hide(); $this._trigger('hideWithEscape'); } }); } }, _unbindEvents: function() { this.element.off('mousedown.puidialog'); this.icons.off(); $(document).off('keydown.dialog_' + this.id); }, _setupDraggable: function() { this.element.draggable({ cancel: '.ui-dialog-content, .ui-dialog-titlebar-close', handle: '.ui-dialog-titlebar', containment : 'document' }); }, _setupResizable: function() { var $this = this; this.element.resizable({ minWidth : this.options.minWidth, minHeight : this.options.minHeight, alsoResize : this.content, containment: 'document', start: function(event, ui) { $this.element.data('offset', $this.element.offset()); }, stop: function(event, ui) { var offset = $this.element.data('offset'); $this.element.css('position', 'fixed'); $this.element.offset(offset); } }); this.resizers = this.element.children('.ui-resizable-handle'); }, _initPosition: function() { //reset this.element.css({left:0,top:0}); if(/(center|left|top|right|bottom)/.test(this.options.location)) { this.options.location = this.options.location.replace(',', ' '); this.element.position({ my: 'center', at: this.options.location, collision: 'fit', of: window, //make sure dialog stays in viewport using: function(pos) { var l = pos.left < 0 ? 0 : pos.left, t = pos.top < 0 ? 0 : pos.top; $(this).css({ left: l, top: t }); } }); } else { var coords = this.options.position.split(','), x = $.trim(coords[0]), y = $.trim(coords[1]); this.element.offset({ left: x, top: y }); } this.positionInitialized = true; }, _moveToTop: function() { this.element.css('z-index',++PUI.zindex); }, toggleMaximize: function() { if(this.minimized) { this.toggleMinimize(); } if(this.maximized) { this.element.removeClass('ui-dialog-maximized'); this._restoreState(); this.maximizeIcon.removeClass('ui-state-hover'); this.maximized = false; } else { this._saveState(); var win = $(window); this.element.addClass('ui-dialog-maximized').css({ 'width': win.width() - 6, 'height': win.height() }).offset({ top: win.scrollTop(), left: win.scrollLeft() }); //maximize content this.content.css({ width: 'auto', height: 'auto' }); this.maximizeIcon.removeClass('ui-state-hover'); this.maximized = true; this._trigger('maximize'); } }, toggleMinimize: function() { var animate = true, dockingZone = $(document.body).children('.ui-dialog-docking-zone'); if(this.maximized) { this.toggleMaximize(); animate = false; } var $this = this; if(this.minimized) { this.element.appendTo(this.parent).removeClass('ui-dialog-minimized').css({'position':'fixed', 'float':'none'}); this._restoreState(); this.content.show(); this.minimizeIcon.removeClass('ui-state-hover').children('.fa').removeClass('fa-plus').addClass('fa-minus'); this.minimized = false; if(this.options.resizable) { this.resizers.show(); } if(this.footer) { this.footer.show(); } } else { this._saveState(); if(animate) { this.element.effect('transfer', { to: dockingZone, className: 'ui-dialog-minimizing' }, 500, function() { $this._dock(dockingZone); $this.element.addClass('ui-dialog-minimized'); }); } else { this._dock(dockingZone); } } }, _dock: function(zone) { this.element.appendTo(zone).css('position', 'static'); this.element.css({'height':'auto', 'width':'auto', 'float': 'left'}); this.content.hide(); this.minimizeIcon.removeClass('ui-state-hover').children('.fa').removeClass('fa-minus').addClass('fa-plus'); this.minimized = true; if(this.options.resizable) { this.resizers.hide(); } if(this.footer) { this.footer.hide(); } zone.css('z-index',++PUI.zindex); this._trigger('minimize'); }, _saveState: function() { this.state = { width: this.element.width(), height: this.element.height() }; var win = $(window); this.state.offset = this.element.offset(); this.state.windowScrollLeft = win.scrollLeft(); this.state.windowScrollTop = win.scrollTop(); }, _restoreState: function() { this.element.width(this.state.width).height(this.state.height); var win = $(window); this.element.offset({ top: this.state.offset.top + (win.scrollTop() - this.state.windowScrollTop), left: this.state.offset.left + (win.scrollLeft() - this.state.windowScrollLeft) }); }, _applyARIA: function() { this.element.attr({ 'role': 'dialog', 'aria-labelledby': this.element.attr('id') + '_title', 'aria-hidden': !this.options.visible }); this.titlebar.children('a.ui-dialog-titlebar-icon').attr('role', 'button'); }, _removeARIA: function() { this.element.removeAttr('role').removeAttr('aria-labelledby').removeAttr('aria-hidden') .removeAttr('aria-live').removeAttr('aria-hidden'); }, _bindResizeListener: function() { var $this = this; $(window).on(this.resizeNS, function(e) { if(e.target === window) { $this._initPosition(); } }); }, _unbindResizeListener: function() { $(window).off(this.resizeNS); }, _setOption: function(key, value) { if(key === 'visible') { if(value) this.show(); else this.hide(); } else { $.Widget.prototype._setOption.apply(this, arguments); } } }); })(); /** * PrimeUI dropdown widget */ (function() { $.widget("primeui.puidropdown", { options: { effect: 'fade', effectSpeed: 'normal', filter: false, filterMatchMode: 'startsWith', caseSensitiveFilter: false, filterFunction: null, data: null, content: null, scrollHeight: 200, appendTo: 'body', editable: false, value: null, style: null, styleClass: null }, _create: function() { this.id = this.element.attr('id'); if(!this.id) { this.id = this.element.uniqueId().attr('id'); } if(!this.options.enhanced) { if(this.options.data) { if($.isArray(this.options.data)) { this._generateOptionElements(this.options.data); } else { if($.type(this.options.data) === 'function') { this.options.data.call(this, this._onRemoteOptionsLoad); return; } else { if($.type(this.options.data) === 'string') { var $this = this, dataURL = this.options.data; var loader = function() { $.ajax({ type: 'GET', url: dataURL, dataType: "json", context: $this, success: function (response) { this._onRemoteOptionsLoad(response); } }); }; loader.call(this); } } return; } } this._render(); } else { this.choices = this.element.children('option'); this.container = this.element.closest('.ui-dropdown'); this.focusElementContainer = this.container.children('.ui-helper-hidden-accessible:last'); this.focusElement = this.focusElementContainer.children('input'); this.label = this.container.children('.ui-dropdown-label'); this.menuIcon = this.container.children('.ui-dropdown-trigger'); this.panel = this.container.children('.ui-dropdown-panel'); this.itemsWrapper = this.panel.children('.ui-dropdown-items-wrapper'); this.itemsContainer = this.itemsWrapper.children('ul'); this.itemsContainer.addClass('ui-dropdown-items ui-dropdown-list ui-widget-content ui-widget ui-corner-all ui-helper-reset'); this.items = this.itemsContainer.children('li').addClass('ui-dropdown-item ui-dropdown-list-item ui-corner-all'); var $this = this; this.items.each(function(i) { $(this).data('label', $this.choices.eq(i).text()); }); if(this.options.filter) { this.filterContainer = this.panel.children('.ui-dropdown-filter-container'); this.filterInput = this.filterContainer.children('input'); } } this._postRender(); }, _render: function() { this.choices = this.element.children('option'); this.element.attr('tabindex', '-1').wrap('
        ') .wrap('
        '); this.container = this.element.closest('.ui-dropdown'); this.focusElementContainer = $('
        ').appendTo(this.container); this.focusElement = this.focusElementContainer.children('input'); this.label = this.options.editable ? $('') : $('