Files
Batflat/themes/admin/js/selectator.min.js
2018-03-12 13:23:44 +01:00

9 lines
16 KiB
JavaScript

/*
Selectator jQuery Plugin
version 3.1, 30.04.2017
by Ingi P. Jacobsen (Faroe Media) & Sruu.pl
The MIT License (MIT)
*/
!function(a){"use strict";a.selectator=function(b,c){var d={prefix:"selectator_",width:"100%",height:"auto",optionsHeight:"158px",useDimmer:!1,useSearch:!0,useOnMobile:!1,showAllOptionsOnFocus:!1,selectFirstOptionOnSearch:!0,keepOpen:!1,submitCallback:function(){},load:null,delay:0,minSearchLength:0,valueField:"value",textField:"text",searchFields:["value","text"],placeholder:"",render:{selected_item:function(a,b){var c="";return void 0!==a.left&&(c+='<div class="'+e.options.prefix+'selected_item_left">'+a.left+"</div>"),void 0!==a.right&&(c+='<div class="'+e.options.prefix+'selected_item_right">'+a.right+"</div>"),c+='<div class="'+e.options.prefix+'selected_item_title">'+(void 0!==a.text?b(a.text):"")+"</div>",void 0!==a.subtitle&&(c+='<div class="'+e.options.prefix+'selected_item_subtitle">'+b(a.subtitle)+"</div>"),c+='<div class="'+e.options.prefix+'selected_item_remove">x</div>'},option:function(a,b){var c="";return void 0!==a.left&&(c+='<div class="'+e.options.prefix+'option_left">'+a.left+"</div>"),void 0!==a.right&&(c+='<div class="'+e.options.prefix+'option_right">'+a.right+"</div>"),c+='<div class="'+e.options.prefix+'option_title">'+(void 0!==a.text?b(a.text):"")+"</div>",void 0!==a.subtitle&&(c+='<div class="'+e.options.prefix+'option_subtitle">'+b(a.subtitle)+"</div>"),c}},labels:{search:"Search..."}},e=this;e.options={},e.$source_element=a(b),e.$container_element=null,e.$selecteditems_element=null,e.$input_element=null,e.$textlength_element=null,e.$options_element=null,e.usefilterResults=!0;var f=void 0===e.$source_element.attr("multiple"),g=!f,h=e.$source_element.is(":disabled"),i=/Mobi/i.test(navigator.userAgent),j=!1,k=!0,l=null,m={backspace:8,tab:9,enter:13,shift:16,ctrl:17,alt:18,capslock:20,escape:27,pageup:33,pagedown:34,end:35,home:36,left:37,up:38,right:39,down:40};e.init=function(){if(e.options=a.extend(!0,{},d,c),a.each(e.$source_element.data(),function(a,b){"selectator"==a.substring(0,10)&&(e.options[a.substring(10,11).toLowerCase()+a.substring(11)]=b)}),e.options.searchFields="string"==typeof e.options.searchFields?e.options.searchFields.split(" "):e.options.searchFields,e.$source_element.find("option").each(function(){a(this).data("value",this.value),a(this).data("text",this.text)}),j=null!==e.options.load,e.options.useDimmer&&0===a("#"+e.options.prefix+"dimmer").length){var b=a(document.createElement("div"));b.attr("id",e.options.prefix+"dimmer"),b.hide(),a(document.body).prepend(b)}e.$source_element.addClass("selectator"),e.$source_element.attr("placeholder")&&(e.options.placeholder=e.$source_element.attr("placeholder")),e.$container_element=a(document.createElement("div")),void 0!==e.$source_element.attr("id")&&e.$container_element.attr("id",e.options.prefix+e.$source_element.attr("id")),e.$container_element.addClass(e.options.prefix+"element "+(g?"multiple ":"single ")+"options-hidden"),e.options.useSearch||e.$container_element.addClass("disable_search"),h&&e.$container_element.addClass("disabled"),e.$container_element.css({width:e.options.width,minHeight:"auto"===e.options.height?e.$source_element.css("height"):e.options.height,padding:e.$source_element.css("padding"),"flex-grow":e.$source_element.css("flex-grow"),position:"relative"}),"element"===e.options.height&&e.$container_element.css({height:e.$source_element.outerHeight()+"px"}),e.$textlength_element=a(document.createElement("span")),e.$textlength_element.addClass(e.options.prefix+"textlength"),e.$textlength_element.css({position:"absolute",visibility:"hidden"}),e.$container_element.append(e.$textlength_element),e.$selecteditems_element=a(document.createElement("div")),e.$selecteditems_element.addClass(e.options.prefix+"selected_items"),e.$container_element.append(e.$selecteditems_element),e.$input_element=a(document.createElement("input")),e.$input_element.addClass(e.options.prefix+"input"),e.$input_element.attr("tabindex",e.$source_element.attr("tabindex")),e.options.useSearch?f?e.$input_element.attr("placeholder",e.options.labels.search):(""!=e.options.placeholder&&e.$input_element.attr("placeholder",e.options.placeholder),e.$input_element.width(20)):(e.$input_element.attr("readonly",!0),e.$input_element.css({width:"0px",height:"0px",overflow:"hidden",border:0,padding:0,position:"absolute"})),e.$input_element.attr("autocomplete","false"),e.$container_element.append(e.$input_element),e.$options_element=a(document.createElement("ul")),e.$options_element.addClass(e.options.prefix+"options"),e.$options_element.css("max-height",e.options.optionsHeight),e.$container_element.append(e.$options_element),e.$source_element.after(e.$container_element),e.$source_element.hide(),"undefined"!=typeof Scrollator&&e.$options_element.scrollator({zIndex:1001,customClass:"ease_preventOverlay"}),e.$source_element.change(function(){o()}),e.$container_element.not(".disabled").on("focus",function(){e.$input_element.focus(),e.$input_element.trigger("focus")}),e.$container_element.not(".disabled").on("mousedown",function(a){if(a.preventDefault(),e.$input_element.focus(),e.$input_element.trigger("focus"),e.$input_element[0].setSelectionRange)e.$input_element[0].setSelectionRange(e.$input_element.val().length,e.$input_element.val().length);else if(e.$input_element[0].createTextRange){var b=e.$input_element[0].createTextRange();b.collapse(!0),b.moveEnd("character",e.$input_element.val().length),b.moveStart("character",e.$input_element.val().length),b.select()}}),e.$container_element.not(".disabled").on("click",function(){e.$input_element.focus(),e.$input_element.trigger("focus")}),e.$container_element.not(".disabled").on("dblclick",function(){e.$input_element.select(),e.$input_element.trigger("focus")}),e.$input_element.on("keydown",function(a){var b=a.keyCode||a.which,c=null,d=null;switch(b){case m.up:a.preventDefault(),t(),c=e.$options_element.find(".active"),0!==c.length?(d=c.prevUntil("."+e.options.prefix+"option:visible").add(c).first().prev("."+e.options.prefix+"option:visible"),c.removeClass("active"),d.addClass("active")):e.$options_element.find("."+e.options.prefix+"option").filter(":visible").last().addClass("active"),v();break;case m.down:a.preventDefault(),t(),c=e.$options_element.find(".active"),0!==c.length?(d=c.nextUntil("."+e.options.prefix+"option:visible").add(c).last().next("."+e.options.prefix+"option:visible"),c.removeClass("active"),d.addClass("active")):e.$options_element.find("."+e.options.prefix+"option").filter(":visible").first().addClass("active"),v();break;case m.escape:a.preventDefault();break;case m.enter:a.preventDefault(),c=e.$options_element.find(".active"),0!==c.length?w():""!==e.$input_element.val()&&e.options.submitCallback(e.$input_element.val()),n();break;case m.backspace:e.options.useSearch?(""===e.$input_element.val()&&g&&e.$source_element.find("option:selected").length&&(e.$source_element.find("option:selected").last()[0].removeAttribute("selected"),e.$source_element.find("option:selected").last()[0].selected=!1,e.$source_element.trigger("change"),o()),n()):a.preventDefault();break;default:n()}}),e.$input_element.on("keyup",function(a){a.preventDefault(),a.stopPropagation();var b=a.which;switch(b){case m.escape:u();break;case m.enter:e.options.keepOpen||u();break;case m.left:case m.right:case m.up:case m.down:case m.tab:case m.shift:break;default:r()}!e.$container_element.hasClass("options-hidden")||b!==m.left&&b!==m.right&&b!==m.up&&b!==m.down||t(),n()}),e.$input_element.on("focus",function(){e.$container_element.addClass("focused"),(f||e.options.showAllOptionsOnFocus||!e.options.useSearch)&&t()}),e.$input_element.on("blur",function(){e.$container_element.removeClass("focused"),u()}),e.$container_element.not(".disabled").on("mouseup","."+e.options.prefix+"selected_item_remove",function(){var b=a(this).closest("."+e.options.prefix+"selected_item").data("source_item_element");b.removeAttribute("selected"),b.selected=!1,f&&e.$source_element.find('[value=""]').length&&(e.$source_element.find('[value=""]')[0].selected=!0,e.$source_element.find('[value=""]')[0].removeAttribute("selected")),e.$source_element.trigger("change"),s(e.usefilterResults),p(),o()}),e.$container_element.on("mouseover","."+e.options.prefix+"option",function(){e.$options_element.find(".active").removeClass("active"),a(this).addClass("active")}),e.$container_element.on("mousedown","."+e.options.prefix+"option",function(a){a.preventDefault(),a.stopPropagation()}),e.$container_element.on("mouseup","."+e.options.prefix+"option",function(){w()}),e.$container_element.on("click","."+e.options.prefix+"option",function(a){a.stopPropagation()}),e.options.$source_element=e.$source_element,e.options.$container_element=e.$container_element,e.options.$selecteditems_element=e.$selecteditems_element,e.options.$input_element=e.$input_element,e.options.$textlength_element=e.$textlength_element,e.options.$options_element=e.$options_element,p(),o(),n()};var n=function(){if(g){e.$textlength_element.text(""===e.$input_element.val()&&""!==e.options.placeholder?e.options.placeholder:e.$input_element.val());var a=e.$textlength_element.width()>e.$container_element.width()-30?e.$container_element.width()-30:e.$textlength_element.width()+30;e.$input_element.css({width:a+"px"})}},o=function(){e.$selecteditems_element.empty(),e.$source_element.find("option").each(function(){var b=a(this);if(this.selected){var c=a(document.createElement("div"));c.data("source_item_element",this),c.addClass(e.options.prefix+"selected_item"),c.addClass(e.options.prefix+"value_"+b.val().replace(/\W/g,"")),void 0!==b.attr("class")&&c.addClass(b.attr("class"));var d={value:this.value,text:this.text};a.each(this.attributes,function(){this.specified&&(d[this.name.replace("data-","")]=this.value)}),a.extend(d,a(this).data("item_data")),c.append(e.options.render.selected_item(d,x)),!f||""!=d[e.options.valueField]&&void 0!==d[e.options.valueField]&&0!==e.$source_element.find('[value=""]').length||c.find("."+e.options.prefix+"selected_item_remove").remove(),e.$selecteditems_element.append(c)}}),f&&(""==e.options.placeholder||""!==e.$source_element.val()&&null!==e.$source_element.val()?e.$selecteditems_element.find("."+e.options.prefix+"placeholder").remove():(e.$selecteditems_element.empty(),e.$selecteditems_element.append('<div class="'+e.options.prefix+'placeholder">'+e.options.placeholder+"</div>")))},p=function(){e.$options_element.empty();var b=[];e.$source_element.children().each(function(){if("optgroup"===a(this).prop("tagName").toLowerCase()){var c=a(this);if(0!==c.children("option").length){var d=[];c.children("option").each(function(){d.push({type:"option",text:a(this).html(),element:this})}),b.push({type:"group",text:c.attr("label"),options:d,element:c})}}else b.push({type:"option",text:a(this).html(),element:this})}),a(b).each(function(){if("group"===this.type){var b=a(document.createElement("li"));b.addClass(e.options.prefix+"group"),void 0!==a(this.element).attr("class")&&b.addClass(a(this.element).attr("class")),b.html(a(this.element).attr("label")),e.$options_element.append(b),a(this.options).each(function(){var a=q.call(this.element,!0);e.$options_element.append(a)})}else{var c=q.call(this.element,!1);e.$options_element.append(c)}}),s(e.usefilterResults)},q=function(b){var c=a(document.createElement("li"));c.data("source_option_element",this),c.addClass(e.options.prefix+"option"),c.addClass(e.options.prefix+"value_"+a(this).val().replace(/\W/g,"")),b&&c.addClass(e.options.prefix+"group_option"),this.selected&&c.addClass("active"),void 0!==a(this).attr("class")&&c.addClass(a(this).attr("class"));var d={value:this.value,text:this.text};return a.each(this.attributes,function(){this.specified&&(d[this.name.replace("data-","")]=this.value)}),a.extend(d,a(this).data("item_data")),g&&this.selected&&c.hide(),c.append(e.options.render.option(d,x)),c},r=function(){clearTimeout(l),l=setTimeout(function(){e.$container_element.addClass("loading"),j?e.options.load(e.$input_element.val(),function(b,c){if(e.usefilterResults=void 0!==c&&c,e.$source_element.children("option").not(":selected").not('[value=""]').remove(),void 0!==b){var d=[];if(a.each(e.$source_element.children("option:selected"),function(a,b){d.push(b.value)}),f&&0===e.$source_element.find('[value=""]').length&&e.$source_element.prepend(a('<option value="">&nbsp;</option>')),e.$input_element.val().replace(/\s/g,"").length>=e.options.minSearchLength)for(var g=0;g<b.length;g++){var h=b[g];if(-1===a.inArray(h[e.options.valueField]+"",d)){var i=a('<option value="'+h[e.options.valueField]+'">'+h[e.options.textField]+"</option>");e.$source_element.append(i),i.data("item_data",h)}}}p(),e.$container_element.removeClass("loading"),s(e.usefilterResults)}):(e.$container_element.removeClass("loading"),s(e.usefilterResults))},e.options.delay)},s=function(b){b=void 0!==b&&b;var c=e.$input_element.val().replace(/\s/g,"").length<e.options.minSearchLength;k=!1;var d=e.$input_element.val().toLowerCase();e.$options_element.find("."+e.options.prefix+"option").each(function(){var g=a(this),h=g.data("source_option_element"),i=a(h),j=!1;a.each(e.options.searchFields,function(a,b){if(void 0!==i.data(b)&&-1!==i.data(b).toString().toLowerCase().indexOf(d))return j=!0,!1}),!b&&!h.selected||b&&(!h.selected||f)&&(e.options.useSearch&&(c||j||""===i.val())||!e.options.useSearch)?(g.show(),k=k||!0):g.hide()}),e.$options_element.find("."+e.options.prefix+"group").each(function(){var b=a(this),c=!1;b.nextUntil("."+e.options.prefix+"group").each(function(){if("none"!=a(this).css("display"))return c=!0,!1}),c?b.show():b.hide()}),t(),g&&(e.$options_element.find(".active").removeClass("active"),c||e.$options_element.find("."+e.options.prefix+"option").filter(":visible").first().addClass("active"))},t=function(){!e.$input_element.is(":focus")||!k&&!f||e.$options_element.is(":empty")&&!e.options.useSearch?u():(e.$container_element.removeClass("options-hidden").addClass("options-visible"),e.options.useDimmer&&a("#"+e.options.prefix+"dimmer").show(),setTimeout(function(){e.$options_element.css("top",e.$container_element.outerHeight()+(g?0:e.$input_element.outerHeight())-1+"px"),"undefined"!=typeof Scrollator&&e.$options_element.data("scrollator").show()},1),v())},u=function(){e.$container_element.removeClass("options-visible").addClass("options-hidden"),"undefined"!=typeof Scrollator&&e.$options_element.data("scrollator").hide(),e.options.useDimmer&&a("#"+e.options.prefix+"dimmer").hide()},v=function(){var a=e.$options_element.find("."+e.options.prefix+"option.active");a.length>0&&e.$options_element.scrollTop(e.$options_element.scrollTop()+a.position().top-e.$options_element.height()/2+a.height()/2)},w=function(){var a=e.$options_element.find(".active");a.data("source_option_element").selected=!0,a.data("source_option_element").removeAttribute("selected"),e.$source_element.trigger("change"),e.options.keepOpen||e.$input_element.val(""),s(e.usefilterResults),o(),n(),j&&!e.options.keepOpen&&(e.$source_element.children("option").not(":selected").not('[value=""]').remove(),p(),u()),e.options.keepOpen||u()},x=function(a){return(a+"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")};e.refresh=function(){o()},e.destroy=function(){e.$container_element.remove(),a.removeData(b,"selectator"),e.$source_element.show(),0===a("."+e.options.prefix+"element").length&&a("#"+e.options.prefix+"dimmer").remove()},e.init(),!e.options.useOnMobile&&i&&e.destroy()},a.fn.selectator=function(b){var c=void 0!==b?b:{};return this.each(function(){var b=a(this);if("object"==typeof c){if(void 0===b.data("selectator")){var d=new a.selectator(this,c);b.data("selectator",d)}}else b.data("selectator")[c]?b.data("selectator")[c].apply(this,Array.prototype.slice.call(arguments,1)):a.error("Method "+c+" does not exist in $.selectator")})}}(jQuery);