/*! addEventListener Polyfill ie9- http://stackoverflow.com/a/27790212*/
window.addEventListener=window.addEventListener||function(a,b){window.attachEvent("on"+a,b)},/*! Datenow Polyfill ie9- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now */
Date.now||(Date.now=function(){return(new Date).getTime()}),/*! Object.create monkey patch ie8 http://stackoverflow.com/a/18020326 */
Object.create||(Object.create=function(a,b){function c(){}if("undefined"!=typeof b)throw"The multiple-argument version of Object.create is not provided by this browser and cannot be shimmed.";return c.prototype=a,new c}),/*! https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter */
Array.prototype.filter||(Array.prototype.filter=function(a){"use strict";if(void 0===this||null===this)throw new TypeError;var b=Object(this),c=b.length>>>0;if("function"!=typeof a)throw new TypeError;for(var d=[],e=arguments.length>=2?arguments[1]:void 0,f=0;f>>0;if("function"!=typeof a)throw new TypeError(a+" is not a function");for(arguments.length>1&&(c=b),d=new Array(g),e=0;e0?1:-1)*Math.floor(Math.abs(b)):b},d=Math.pow(2,53)-1,e=function(a){var b=c(a);return Math.min(Math.max(b,0),d)};return function(a){var c=this,d=Object(a);if(null==a)throw new TypeError("Array.from requires an array-like object - not null or undefined");var f,g=arguments.length>1?arguments[1]:void 0;if("undefined"!=typeof g){if(!b(g))throw new TypeError("Array.from: when provided, the second argument must be a function");arguments.length>2&&(f=arguments[2])}for(var h,i=e(d.length),j=b(c)?Object(new c(i)):new Array(i),k=0;kE&&(E=-50),o(this),m.each(function(){var f=a(this);e(f);var g=this,h=g.id,m=-E+"%",o=100+2*E+"%",o={position:"absolute",top:m,left:m,display:"block",width:o,height:o,margin:0,padding:0,background:"#fff",border:0,opacity:0},m=x?{position:"absolute",visibility:"hidden"}:E?o:{position:"absolute",opacity:0},p="checkbox"==g[r]?w.checkboxClass||"icheckbox":w.radioClass||"i"+k,y=a(v+'[for="'+h+'"]').add(f.closest(v)),F=!!w.aria,G=i+"-"+Math.random().toString(36).substr(2,6),H='")[u]("ifCreated").parent().append(w.insert),o=a('').css(o).appendTo(H),f.data(i,{o:w,s:f.attr("style")}).css(m),w.inheritClass&&H[s](g.className||""),w.inheritID&&h&&H.attr("id",i+"-"+h),"static"==H.css("position")&&H.css("position","relative"),b(f,!0,q),y.length&&y.on("click.i mouseover.i mouseout.i touchbegin.i touchend.i",function(c){var d=c[r],e=a(this);if(!g[n]){if("click"==d){if(a(c.target).is("a"))return;b(f,!1,!0)}else C&&(/ut|nd/.test(d)?(H[t](z),e[t](D)):(H[s](z),e[s](D)));if(!x)return!1;c.stopPropagation()}}),f.on("click.i focus.i blur.i keyup.i keydown.i keypress.i",function(a){var b=a[r];return a=a.keyCode,"click"==b?!1:"keydown"==b&&32==a?(g[r]==k&&g[l]||(g[l]?d(f,l):c(f,l)),!1):("keyup"==b&&g[r]==k?!g[l]&&c(f,l):/us|ur/.test(b)&&H["blur"==b?t:s](A),void 0)}),o.on("click mousedown mouseup mouseover mouseout touchbegin.i touchend.i",function(a){var c=a[r],d=/wn|up/.test(c)?B:z;if(!g[n]){if("click"==c?b(f,!1,!0):(/wn|er|in/.test(c)?H[s](d):H[t](d+" "+B),y.length&&C&&d==z&&y[/ut|nd/.test(c)?t:s](D)),!x)return!1;a.stopPropagation()}})})}}(window.jQuery||window.Zepto);
}
/*
* Selecter v3.0.9 - 2014-02-10
* A jQuery plugin for replacing default select elements. Part of the Formstone Library.
* http://formstone.it/selecter/
*
* Copyright 2014 Ben Plum; MIT Licensed
*/
if ( 'function' != typeof(jQuery.fn.selecter) ) {
!function(a,b){"use strict";function c(b){b=a.extend({},x,b||{}),null===w&&(w=a("body"));for(var c=a(this),e=0,f=c.length;f>e;e++)d(c.eq(e),b);return c}function d(b,c){if(!b.hasClass("selecter-element")){c=a.extend({},c,b.data("selecter-options")),c.external&&(c.links=!0);var d=b.find("option, optgroup"),g=d.filter("option"),h=g.filter(":selected"),n=""!==c.label?-1:g.index(h),p=c.links?"nav":"div";c.tabIndex=b[0].tabIndex,b[0].tabIndex=-1,c.multiple=b.prop("multiple"),c.disabled=b.is(":disabled");var q="<"+p+' class="selecter '+c.customClass;v?q+=" mobile":c.cover&&(q+=" cover"),q+=c.multiple?" multiple":" closed",c.disabled&&(q+=" disabled"),q+='" tabindex="'+c.tabIndex+'">',c.multiple||(q+='',q+=a(""),q+='',q+="
",q+=""+p+">",b.addClass("selecter-element").after(q);var s=b.next(".selecter"),u=a.extend({$select:b,$allOptions:d,$options:g,$selecter:s,$selected:s.find(".selecter-selected"),$itemsWrapper:s.find(".selecter-options"),index:-1,guid:t++},c);e(u),o(n,u),void 0!==a.fn.scroller&&u.$itemsWrapper.scroller(),u.$selecter.on("touchstart.selecter click.selecter",".selecter-selected",u,f).on("click.selecter",".selecter-item",u,j).on("close.selecter",u,i).data("selecter",u),u.$select.on("change.selecter",u,k),v||(u.$selecter.on("focus.selecter",u,l).on("blur.selecter",u,m),u.$select.on("focus.selecter",u,function(a){a.data.$selecter.trigger("focus")}))}}function e(b){for(var c="",d=b.links?"a":"span",e=0,f=0,g=b.$allOptions.length;g>f;f++){var h=b.$allOptions.eq(f);if("OPTGROUP"===h[0].tagName)c+=''+h.attr("label")+"";else{var i=h.val();h.attr("value")||h.attr("value",i),c+="<"+d+' class="selecter-item',h.is(":selected")&&""===b.label&&(c+=" selected"),h.is(":disabled")&&(c+=" disabled"),c+='" ',c+=b.links?'href="'+i+'"':'data-value="'+i+'"',c+=">"+a("").text(r(h.text(),b.trim)).html()+""+d+">",e++}}b.$itemsWrapper.html(c),b.$items=b.$selecter.find(".selecter-item")}function f(c){c.preventDefault(),c.stopPropagation();var d=c.data;if(!d.$select.is(":disabled"))if(a(".selecter").not(d.$selecter).trigger("close.selecter",[d]),v){var e=d.$select[0];if(b.document.createEvent){var f=b.document.createEvent("MouseEvents");f.initMouseEvent("mousedown",!1,!0,b,0,0,0,0,0,!1,!1,!1,!1,0,null),e.dispatchEvent(f)}else e.fireEvent&&e.fireEvent("onmousedown")}else d.$selecter.hasClass("closed")?g(c):d.$selecter.hasClass("open")&&i(c)}function g(b){b.preventDefault(),b.stopPropagation();var c=b.data;if(!c.$selecter.hasClass("open")){var d=c.$selecter.offset(),e=w.outerHeight(),f=c.$itemsWrapper.outerHeight(!0),g=c.index>=0?c.$items.eq(c.index).position():{left:0,top:0};d.top+f>e&&c.$selecter.addClass("bottom"),c.$itemsWrapper.show(),c.$selecter.removeClass("closed").addClass("open"),w.on("click.selecter-"+c.guid,":not(.selecter-options)",c,h),void 0!==a.fn.scroller?c.$itemsWrapper.scroller("scroll",c.$itemsWrapper.find(".scroller-content").scrollTop()+g.top,0).scroller("reset"):c.$itemsWrapper.scrollTop(c.$itemsWrapper.scrollTop()+g.top)}}function h(b){b.preventDefault(),b.stopPropagation(),0===a(b.currentTarget).parents(".selecter").length&&i(b)}function i(a){a.preventDefault(),a.stopPropagation();var b=a.data;b.$selecter.hasClass("open")&&(b.$itemsWrapper.hide(),b.$selecter.removeClass("open bottom").addClass("closed"),w.off(".selecter-"+b.guid))}function j(b){b.preventDefault(),b.stopPropagation();var c=a(this),d=b.data;if(!d.$select.is(":disabled")){if(d.$itemsWrapper.is(":visible")){var e=d.$items.index(c);o(e,d),p(d)}d.multiple||i(b)}}function k(b,c){var d=a(this),e=b.data;if(!c&&!e.multiple){var f=e.$options.index(e.$options.filter("[value='"+s(d.val())+"']"));o(f,e),p(e)}}function l(b){b.preventDefault(),b.stopPropagation();var c=b.data;c.$select.is(":disabled")||c.multiple||(c.$selecter.addClass("focus").on("keydown.selecter"+c.guid,c,n),a(".selecter").not(c.$selecter).trigger("close.selecter",[c]))}function m(b){b.preventDefault(),b.stopPropagation();var c=b.data;c.$selecter.removeClass("focus").off("keydown.selecter"+c.guid+" keyup.selecter"+c.guid),a(".selecter").not(c.$selecter).trigger("close.selecter",[c])}function n(b){var c=b.data;if(13===b.keyCode)c.$selecter.hasClass("open")&&(i(b),o(c.index,c)),p(c);else if(!(9===b.keyCode||b.metaKey||b.altKey||b.ctrlKey||b.shiftKey)){b.preventDefault(),b.stopPropagation();var d=c.$items.length-1,e=c.index<0?0:c.index;if(a.inArray(b.keyCode,u?[38,40,37,39]:[38,40])>-1)e+=38===b.keyCode||u&&37===b.keyCode?-1:1,0>e&&(e=0),e>d&&(e=d);else{var f,g,h=String.fromCharCode(b.keyCode).toUpperCase();for(g=c.index+1;d>=g;g++)if(f=c.$options.eq(g).text().charAt(0).toUpperCase(),f===h){e=g;break}if(0>e)for(g=0;d>=g;g++)if(f=c.$options.eq(g).text().charAt(0).toUpperCase(),f===h){e=g;break}}e>=0&&o(e,c)}}function o(a,b){var c=b.$items.eq(a),d=c.hasClass("selected"),e=c.hasClass("disabled");if(!e){if(-1===a&&""!==b.label)b.$selected.html(b.label);else if(d)b.multiple&&(b.$options.eq(a).prop("selected",null),c.removeClass("selected"));else{{var f=c.html();c.data("value")}b.multiple?b.$options.eq(a).prop("selected",!0):(b.$selected.html(f).removeClass("placeholder"),b.$items.filter(".selected").removeClass("selected"),b.$select[0].selectedIndex=a),c.addClass("selected")}(!d||b.multiple)&&(b.index=a)}}function p(a){a.links?q(a):(a.callback.call(a.$selecter,a.$select.val(),a.index),a.$select.trigger("change",[!0]))}function q(a){var c=a.$select.val();a.external?b.open(c):b.location.href=c}function r(a,b){return 0===b?a:a.length>b?a.substring(0,b)+"...":a}function s(a){return a.replace(/([;&,\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g,"\\$1")}var t=0,u=b.navigator.userAgent.toLowerCase().indexOf("firefox")>-1,v=/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(b.navigator.userAgent||b.navigator.vendor||b.opera),w=null,x={callback:a.noop,cover:!1,customClass:"",label:"",external:!1,links:!1,trim:0},y={defaults:function(b){return x=a.extend(x,b||{}),a(this)},disable:function(b){return a(this).each(function(c,d){var e=a(d).next(".selecter").data("selecter");if(e)if("undefined"!=typeof b){var f=e.$items.index(e.$items.filter("[data-value="+b+"]"));e.$items.eq(f).addClass("disabled"),e.$options.eq(f).prop("disabled",!0)}else e.$selecter.hasClass("open")&&e.$selecter.find(".selecter-selected").trigger("click.selecter"),e.$selecter.addClass("disabled"),e.$select.prop("disabled",!0)})},enable:function(b){return a(this).each(function(c,d){var e=a(d).next(".selecter").data("selecter");if(e)if("undefined"!=typeof b){var f=e.$items.index(e.$items.filter("[data-value="+b+"]"));e.$items.eq(f).removeClass("disabled"),e.$options.eq(f).prop("disabled",!1)}else e.$selecter.removeClass("disabled"),e.$select.prop("disabled",!1)})},destroy:function(){return a(this).each(function(b,c){var d=a(c).next(".selecter").data("selecter");d&&(d.$selecter.hasClass("open")&&d.$selecter.find(".selecter-selected").trigger("click.selecter"),void 0!==a.fn.scroller&&d.$selecter.find(".selecter-options").scroller("destroy"),d.$select[0].tabIndex=d.tabIndex,d.$select.off(".selecter").removeClass("selecter-element").show(),d.$selecter.off(".selecter").remove())})},refresh:function(){return a(this).each(function(b,c){var d=a(c).next(".selecter").data("selecter");if(d){var f=d.index;d.$allOptions=d.$select.find("option, optgroup"),d.$options=d.$allOptions.filter("option"),d.index=-1,f=d.$options.index(d.$options.filter(":selected")),e(d),o(f,d)}})}};a.fn.selecter=function(a){return y[a]?y[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?this:c.apply(this,arguments)},a.selecter=function(a){"defaults"===a&&y.defaults.apply(this,Array.prototype.slice.call(arguments,1))}}(jQuery,window);
}
/*
* Stepper v3.0.5 - 2014-02-06
* A jQuery plugin for cross browser number inputs. Part of the Formstone Library.
* http://formstone.it/stepper/
*
* Copyright 2014 Ben Plum; MIT Licensed
*/
if ( 'function' != typeof(jQuery.fn.stepper) ) {
!function(a){"use strict";function b(b){b=a.extend({},k,b||{});for(var d=a(this),e=0,f=d.length;f>e;e++)c(d.eq(e),b);return d}function c(b,c){if(!b.hasClass("stepper-input")){c=a.extend({},c,b.data("stepper-options"));var e=parseFloat(b.attr("min")),f=parseFloat(b.attr("max")),g=parseFloat(b.attr("step"))||1;b.addClass("stepper-input").wrap('').after(''+c.labels.up+''+c.labels.down+"");var h=b.parent(".stepper"),j=a.extend({$stepper:h,$input:b,$arrow:h.find(".stepper-arrow"),min:void 0===typeof e||isNaN(e)?!1:e,max:void 0===typeof f||isNaN(f)?!1:f,step:void 0===typeof g||isNaN(g)?1:g,timer:null},c);j.digits=i(j.step),b.is(":disabled")&&h.addClass("disabled"),h.on("touchstart.stepper mousedown.stepper",".stepper-arrow",j,d).data("stepper",j)}}function d(b){b.preventDefault(),b.stopPropagation(),e(b);var c=b.data;if(!c.$input.is(":disabled")&&!c.$stepper.hasClass("disabled")){var d=a(b.target).hasClass("up")?c.step:-c.step;c.timer=g(c.timer,125,function(){f(c,d,!1)}),f(c,d),a("body").on("touchend.stepper mouseup.stepper",c,e)}}function e(b){b.preventDefault(),b.stopPropagation();var c=b.data;h(c.timer),a("body").off(".stepper")}function f(a,b){var c=parseFloat(a.$input.val()),d=b;void 0===typeof c||isNaN(c)?d=a.min!==!1?a.min:0:a.min!==!1&&ca.max&&(d-=a.step),d!==c&&(d=j(d,a.digits),a.$input.val(d).trigger("change"))}function g(a,b,c){return h(a),setInterval(c,b)}function h(a){a&&(clearInterval(a),a=null)}function i(a){var b=String(a);return b.indexOf(".")>-1?b.length-b.indexOf(".")-1:0}function j(a,b){var c=Math.pow(10,b);return Math.round(a*c)/c}var k={customClass:"",labels:{up:"Up",down:"Down"}},l={defaults:function(b){return k=a.extend(k,b||{}),a(this)},destroy:function(){return a(this).each(function(){var b=a(this).data("stepper");b&&(b.$stepper.off(".stepper").find(".stepper-arrow").remove(),b.$input.unwrap().removeClass("stepper-input"))})},disable:function(){return a(this).each(function(){var b=a(this).data("stepper");b&&(b.$input.attr("disabled","disabled"),b.$stepper.addClass("disabled"))})},enable:function(){return a(this).each(function(){var b=a(this).data("stepper");b&&(b.$input.attr("disabled",null),b.$stepper.removeClass("disabled"))})}};a.fn.stepper=function(a){return l[a]?l[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?this:b.apply(this,arguments)},a.stepper=function(a){"defaults"===a&&l.defaults.apply(this,Array.prototype.slice.call(arguments,1))}}(jQuery,this);
}/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return u.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n=b&&b.split("/"),o=s.map,p=o&&o["*"]||{};if(a&&"."===a.charAt(0))if(b){for(a=a.split("/"),g=a.length-1,s.nodeIdCompat&&w.test(a[g])&&(a[g]=a[g].replace(w,"")),a=n.slice(0,n.length-1).concat(a),k=0;k0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}else 0===a.indexOf("./")&&(a=a.substring(2));if((n||p)&&o){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),n)for(l=n.length;l>0;l-=1)if(e=o[n.slice(0,l).join("/")],e&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&p&&p[d]&&(i=p[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){var d=v.call(arguments,0);return"string"!=typeof d[0]&&1===d.length&&d.push(null),n.apply(b,d.concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){q[a]=b}}function j(a){if(e(r,a)){var c=r[a];delete r[a],t[a]=!0,m.apply(b,c)}if(!e(q,a)&&!e(t,a))throw new Error("No "+a);return q[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return function(){return s&&s.config&&s.config[a]||{}}}var m,n,o,p,q={},r={},s={},t={},u=Object.prototype.hasOwnProperty,v=[].slice,w=/\.js$/;o=function(a,b){var c,d=k(a),e=d[0];return a=d[1],e&&(e=f(e,b),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(b)):f(a,b):(a=f(a,b),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},p={require:function(a){return g(a)},exports:function(a){var b=q[a];return"undefined"!=typeof b?b:q[a]={}},module:function(a){return{id:a,uri:"",exports:q[a],config:l(a)}}},m=function(a,c,d,f){var h,k,l,m,n,s,u=[],v=typeof d;if(f=f||a,"undefined"===v||"function"===v){for(c=!c.length&&d.length?["require","exports","module"]:c,n=0;n0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;hc;c++)a[c].apply(this,b)},c.Observable=d,c.generateChars=function(a){for(var b="",c=0;a>c;c++){var d=Math.floor(36*Math.random());b+=d.toString(36)}return b},c.bind=function(a,b){return function(){a.apply(b,arguments)}},c._convertData=function(a){for(var b in a){var c=b.split("-"),d=a;if(1!==c.length){for(var e=0;e":">",'"':""","'":"'","/":"/"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a(''),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),d[0].className+=" select2-results__message",this.$results.append(d)},c.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c0?b.first().trigger("mouseenter"):a.first().trigger("mouseenter"),this.ensureHighlightVisible()},c.prototype.setClasses=function(){var b=this;this.data.current(function(c){var d=a.map(c,function(a){return a.id.toString()}),e=b.$results.find(".select2-results__option[aria-selected]");e.each(function(){var b=a(this),c=a.data(this,"data"),e=""+c.id;null!=c.element&&c.element.selected||null==c.element&&a.inArray(e,d)>-1?b.attr("aria-selected","true"):b.attr("aria-selected","false")})})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(b){var c=document.createElement("li");c.className="select2-results__option";var d={role:"treeitem","aria-selected":"false"};b.disabled&&(delete d["aria-selected"],d["aria-disabled"]="true"),null==b.id&&delete d["aria-selected"],null!=b._resultId&&(c.id=b._resultId),b.title&&(c.title=b.title),b.children&&(d.role="group",d["aria-label"]=b.text,delete d["aria-selected"]);for(var e in d){var f=d[e];c.setAttribute(e,f)}if(b.children){var g=a(c),h=document.createElement("strong");h.className="select2-results__group";a(h);this.template(b,h);for(var i=[],j=0;j",{"class":"select2-results__options select2-results__options--nested"});m.append(i),g.append(h),g.append(m)}else this.template(b,c);return a.data(c,"data",b),c},c.prototype.bind=function(b,c){var d=this,e=b.id+"-results";this.$results.attr("id",e),b.on("results:all",function(a){d.clear(),d.append(a.data),b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("results:append",function(a){d.append(a.data),b.isOpen()&&d.setClasses()}),b.on("query",function(a){d.hideMessages(),d.showLoading(a)}),b.on("select",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("unselect",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("open",function(){d.$results.attr("aria-expanded","true"),d.$results.attr("aria-hidden","false"),d.setClasses(),d.ensureHighlightVisible()}),b.on("close",function(){d.$results.attr("aria-expanded","false"),d.$results.attr("aria-hidden","true"),d.$results.removeAttr("aria-activedescendant")}),b.on("results:toggle",function(){var a=d.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),b.on("results:select",function(){var a=d.getHighlightedResults();if(0!==a.length){var b=a.data("data");"true"==a.attr("aria-selected")?d.trigger("close",{}):d.trigger("select",{data:b})}}),b.on("results:previous",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a);if(0!==c){var e=c-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top,h=f.offset().top,i=d.$results.scrollTop()+(h-g);0===e?d.$results.scrollTop(0):0>h-g&&d.$results.scrollTop(i)}}),b.on("results:next",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a),e=c+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top+d.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=d.$results.scrollTop()+h-g;0===e?d.$results.scrollTop(0):h>g&&d.$results.scrollTop(i)}}),b.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted")}),b.on("results:message",function(a){d.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=d.$results.scrollTop(),c=d.$results.get(0).scrollHeight-b+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&c<=d.$results.height();e?(d.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(d.$results.scrollTop(d.$results.get(0).scrollHeight-d.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(b){var c=a(this),e=c.data("data");return"true"===c.attr("aria-selected")?void(d.options.get("multiple")?d.trigger("unselect",{originalEvent:b,data:e}):d.trigger("close",{})):void d.trigger("select",{originalEvent:b,data:e})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(b){var c=a(this).data("data");d.getHighlightedResults().removeClass("select2-results__option--highlighted"),d.trigger("results:focus",{data:c,element:a(this)})})},c.prototype.getHighlightedResults=function(){var a=this.$results.find(".select2-results__option--highlighted");return a},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[aria-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),2>=c?this.$results.scrollTop(0):(g>this.$results.outerHeight()||0>g)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b,c);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){var a={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46};return a}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),b.attr("title",this.$element.attr("title")),b.attr("tabindex",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a,b){var d=this,e=(a.id+"-container",a.id+"-results");this.container=a,this.$selection.on("focus",function(a){d.trigger("focus",a)}),this.$selection.on("blur",function(a){d._handleBlur(a)}),this.$selection.on("keydown",function(a){d.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){d.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){d.update(a.data)}),a.on("open",function(){d.$selection.attr("aria-expanded","true"),d.$selection.attr("aria-owns",e),d._attachCloseHandler(a)}),a.on("close",function(){d.$selection.attr("aria-expanded","false"),d.$selection.removeAttr("aria-activedescendant"),d.$selection.removeAttr("aria-owns"),d.$selection.focus(),d._detachCloseHandler(a)}),a.on("enable",function(){d.$selection.attr("tabindex",d._tabindex)}),a.on("disable",function(){d.$selection.attr("tabindex","-1")})},d.prototype._handleBlur=function(b){var c=this;window.setTimeout(function(){document.activeElement==c.$selection[0]||a.contains(c.$selection[0],document.activeElement)||c.trigger("blur",b)},1)},d.prototype._attachCloseHandler=function(b){a(document.body).on("mousedown.select2."+b.id,function(b){var c=a(b.target),d=c.closest(".select2"),e=a(".select2.select2-container--open");e.each(function(){var b=a(this);if(this!=d[0]){var c=b.data("element");c.select2("close")}})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){var c=b.find(".selection");c.append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(a){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c,d){function e(){e.__super__.constructor.apply(this,arguments)}return c.Extend(e,b),e.prototype.render=function(){var a=e.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html(''),a},e.prototype.bind=function(a,b){var c=this;e.__super__.bind.apply(this,arguments);var d=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",d),this.$selection.attr("aria-labelledby",d),this.$selection.on("mousedown",function(a){1===a.which&&c.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(a){}),this.$selection.on("blur",function(a){}),a.on("focus",function(b){a.isOpen()||c.$selection.focus()}),a.on("selection:update",function(a){c.update(a.data)})},e.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},e.prototype.display=function(a,b){var c=this.options.get("templateSelection"),d=this.options.get("escapeMarkup");return d(c(a,b))},e.prototype.selectionContainer=function(){return a("")},e.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.$selection.find(".select2-selection__rendered"),d=this.display(b,c);c.empty().append(d),c.prop("title",b.title||b.text)},e}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(a,b){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html(''),a},d.prototype.bind=function(b,c){var e=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){e.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(b){if(!e.options.get("disabled")){var c=a(this),d=c.parent(),f=d.data("data");e.trigger("unselect",{originalEvent:b,data:f})}})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a,b){var c=this.options.get("templateSelection"),d=this.options.get("escapeMarkup");return d(c(a,b))},d.prototype.selectionContainer=function(){var b=a('×');return b},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d1;if(d||c)return a.call(this,b);this.clear();var e=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(e)},b}),b.define("select2/selection/allowClear",["jquery","../keys"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var c=this.$selection.find(".select2-selection__clear");if(0!==c.length){b.stopPropagation();for(var d=c.data("data"),e=0;e0||0===c.length)){var d=a('×');d.data("data",c),this.$selection.find(".select2-selection__rendered").prepend(d)}},c}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return this._transferTabIndex(),d},d.prototype.bind=function(a,b,d){var e=this;a.call(this,b,d),b.on("open",function(){e.$search.trigger("focus")}),b.on("close",function(){e.$search.val(""),e.$search.removeAttr("aria-activedescendant"),e.$search.trigger("focus")}),b.on("enable",function(){e.$search.prop("disabled",!1),e._transferTabIndex()}),b.on("disable",function(){e.$search.prop("disabled",!0)}),b.on("focus",function(a){e.$search.trigger("focus")}),b.on("results:focus",function(a){e.$search.attr("aria-activedescendant",a.id)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e._handleBlur(a)}),this.$selection.on("keydown",".select2-search--inline",function(a){a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented();var b=a.which;if(b===c.BACKSPACE&&""===e.$search.val()){var d=e.$searchContainer.prev(".select2-selection__choice");if(d.length>0){var f=d.data("data");e.searchRemoveChoice(f),a.preventDefault()}}});var f=document.documentMode,g=f&&11>=f;this.$selection.on("input.searchcheck",".select2-search--inline",function(a){return g?void e.$selection.off("input.search input.searchcheck"):void e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(a){if(g&&"input"===a.type)return void e.$selection.off("input.search input.searchcheck");var b=a.which;b!=c.SHIFT&&b!=c.CTRL&&b!=c.ALT&&b!=c.TAB&&e.handleSearch(a)})},d.prototype._transferTabIndex=function(a){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){var c=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),c&&this.$search.focus()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.$search.val(b.text),this.handleSearch()},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{var b=this.$search.val().length+1;a=.75*b+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){var a={"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"};return a}),b.define("select2/data/base",["../utils"],function(a){function b(a,c){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(a){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(a,b){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(a,b){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),d+=null!=c.id?"-"+c.id.toString():"-"+a.generateChars(4)},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");
if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f=0){var k=f.filter(d(j)),l=this.item(k),m=c.extend(!0,{},j,l),n=this.option(m);k.replaceWith(n)}else{var o=this.option(j);if(j.children){var p=this.convertToOptions(j.children);b.appendMany(o,p)}h.push(o)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(a,b){this.ajaxOptions=this._applyDefaults(b.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),d.__super__.constructor.call(this,a,b)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return c.extend({},a,{q:a.term})},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){d.status&&"0"===d.status||e.trigger("results:message",{message:"errorLoading"})});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url.call(this.$element,a)),"function"==typeof f.data&&(f.data=f.data.call(this.$element,a)),this.ajaxOptions.delay&&null!=a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");void 0!==f&&(this.createTag=f);var g=d.get("insertTag");if(void 0!==g&&(this.insertTag=g),b.call(this,c,d),a.isArray(e))for(var h=0;h0&&b.term.length>this.maximumInputLength?void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;return d.maximumSelectionLength>0&&f>=d.maximumSelectionLength?void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}}):void a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.bind=function(){},c.prototype.position=function(a,b){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a,b){function c(){}return c.prototype.render=function(b){var c=b.call(this),d=a('');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},c.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(b){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val("")}),c.on("focus",function(){c.isOpen()&&e.$search.focus()}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){var b=e.showSearch(a);b?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},c.prototype.handleSearch=function(a){if(!this._keyUpPrevented){var b=this.$search.val();this.trigger("query",{term:b})}this._keyUpPrevented=!1},c.prototype.showSearch=function(a,b){return!0},c}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){var c=e.$results.offset().top+e.$results.outerHeight(!1),d=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1);c+50>=d&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a(''),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(b,c,d){this.$dropdownParent=d.get("dropdownParent")||a(document.body),b.call(this,c,d)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.destroy=function(a){a.call(this),this.$dropdownContainer.remove()},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a(""),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(a){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c,d){var e=this,f="scroll.select2."+d.id,g="resize.select2."+d.id,h="orientationchange.select2."+d.id,i=this.$container.parents().filter(b.hasScroll);i.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),i.on(f,function(b){var c=a(this).data("select2-scroll-position");a(this).scrollTop(c.y)}),a(window).on(f+" "+g+" "+h,function(a){e._positionDropdown(),e._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c,d){var e="scroll.select2."+d.id,f="resize.select2."+d.id,g="orientationchange.select2."+d.id,h=this.$container.parents().filter(b.hasScroll);h.off(e),a(window).off(e+" "+f+" "+g)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=this.$container.offset();f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.topf.bottom+h.height,l={left:f.left,top:g.bottom},m=this.$dropdownParent;"static"===m.css("position")&&(m=m.offsetParent());var n=m.offset();l.top-=n.top,l.left-=n.left,c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-n.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.position="relative",a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(a){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),(null!=l.tokenSeparators||null!=l.tokenizer)&&(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.multiple?l.selectionAdapter=e:l.selectionAdapter=d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){var h=e.children[g],i=c(d,h);null==i&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var j=b(e.text).toUpperCase(),k=b(d.term).toUpperCase();return j.indexOf(k)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)};var E=new D;return E}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(a.prop("dir")?this.options.dir=a.prop("dir"):a.closest("[dir]").prop("dir")?this.options.dir=a.closest("[dir]").prop("dir"):this.options.dir="ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b=b.replace(/(:|\.|\[|\]|,)/g,""),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return 0>=e?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;i>h;h+=1){var j=g[h].replace(/\s/g,""),k=j.match(c);if(null!==k&&k.length>=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this.$element.on("focus.select2",function(a){b.trigger("focus",a)}),this._syncA=c.bind(this._syncAttributes,this),this._syncS=c.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._syncA),a.each(c,b._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",b._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",b._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",b._syncS,!1))},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle","focus"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("focus",function(a){b.focus(a)}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open",{}),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ESC||c===d.TAB||c===d.UP&&b.altKey?(a.close(),b.preventDefault()):c===d.ENTER?(a.trigger("results:select",{}),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle",{}),b.preventDefault()):c===d.UP?(a.trigger("results:previous",{}),b.preventDefault()):c===d.DOWN&&(a.trigger("results:next",{}),b.preventDefault()):(c===d.ENTER||c===d.SPACE||c===d.DOWN&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},e.prototype._syncSubtree=function(a,b){var c=!1,d=this;if(!a||!a.target||"OPTION"===a.target.nodeName||"OPTGROUP"===a.target.nodeName){if(b)if(b.addedNodes&&b.addedNodes.length>0)for(var e=0;e0&&(c=!0);else c=!0;c&&this.dataAdapter.current(function(a){d.trigger("selection:update",{data:a})})}},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(void 0===b&&(b={}),a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||this.trigger("query",{})},e.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},e.prototype.focus=function(a){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),(null==a||0===a.length)&&(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null;
},e.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("jquery-mousewheel",["jquery"],function(a){return a}),b.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults"],function(a,b,c,d){if(null==a.fn.select2){var e=["open","close","destroy"];a.fn.select2=function(b){if(b=b||{},"object"==typeof b)return this.each(function(){var d=a.extend(!0,{},b);new c(a(this),d)}),this;if("string"==typeof b){var d,f=Array.prototype.slice.call(arguments,1);return this.each(function(){var c=a(this).data("select2");null==c&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2."),d=c[b].apply(c,f)}),a.inArray(b,e)>-1?this:d}throw new Error("Invalid arguments for Select2: "+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,c});/*! rangeslider.js - v2.3.0 | (c) 2016 @andreruffert | MIT license | https://github.com/andreruffert/rangeslider.js */
!function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){"use strict";function b(){var a=document.createElement("input");return a.setAttribute("type","range"),"text"!==a.type}function c(a,b){var c=Array.prototype.slice.call(arguments,2);return setTimeout(function(){return a.apply(null,c)},b)}function d(a,b){return b=b||100,function(){if(!a.debouncing){var c=Array.prototype.slice.apply(arguments);a.lastReturnVal=a.apply(window,c),a.debouncing=!0}return clearTimeout(a.debounceTimeout),a.debounceTimeout=setTimeout(function(){a.debouncing=!1},b),a.lastReturnVal}}function e(a){return a&&(0===a.offsetWidth||0===a.offsetHeight||a.open===!1)}function f(a){for(var b=[],c=a.parentNode;e(c);)b.push(c),c=c.parentNode;return b}function g(a,b){function c(a){"undefined"!=typeof a.open&&(a.open=!a.open)}var d=f(a),e=d.length,g=[],h=a[b];if(e){for(var i=0;i'),this.$handle=a(''),this.$range=a('').insertAfter(this.$element).prepend(this.$fill,this.$handle),this.$element.css({position:"absolute",width:"1px",height:"1px",overflow:"hidden",opacity:"0"}),this.handleDown=a.proxy(this.handleDown,this),this.handleMove=a.proxy(this.handleMove,this),this.handleEnd=a.proxy(this.handleEnd,this),this.init();var f=this;this.$window.on("resize."+this.identifier,d(function(){c(function(){f.update(!1,!1)},300)},20)),this.$document.on(this.startEvent,"#"+this.identifier+":not(."+this.options.disabledClass+")",this.handleDown),this.$element.on("change."+this.identifier,function(a,b){if(!b||b.origin!==f.identifier){var c=a.target.value,d=f.getPositionFromValue(c);f.setPosition(d)}})}Number.isNaN=Number.isNaN||function(a){return"number"==typeof a&&a!==a};var k="rangeslider",l=0,m=b(),n={polyfill:!0,orientation:"horizontal",rangeClass:"rangeslider",disabledClass:"rangeslider--disabled",activeClass:"rangeslider--active",horizontalClass:"rangeslider--horizontal",verticalClass:"rangeslider--vertical",fillClass:"rangeslider__fill",handleClass:"rangeslider__handle",startEvent:["mousedown","touchstart","pointerdown"],moveEvent:["mousemove","touchmove","pointermove"],endEvent:["mouseup","touchend","pointerup"]},o={orientation:{horizontal:{dimension:"width",direction:"left",directionStyle:"left",coordinate:"x"},vertical:{dimension:"height",direction:"top",directionStyle:"bottom",coordinate:"y"}}};return j.prototype.init=function(){this.update(!0,!1),this.onInit&&"function"==typeof this.onInit&&this.onInit()},j.prototype.update=function(a,b){a=a||!1,a&&(this.min=h(this.$element[0].getAttribute("min"),0),this.max=h(this.$element[0].getAttribute("max"),100),this.value=h(this.$element[0].value,Math.round(this.min+(this.max-this.min)/2)),this.step=h(this.$element[0].getAttribute("step"),1)),this.handleDimension=g(this.$handle[0],"offset"+i(this.DIMENSION)),this.rangeDimension=g(this.$range[0],"offset"+i(this.DIMENSION)),this.maxHandlePos=this.rangeDimension-this.handleDimension,this.grabPos=this.handleDimension/2,this.position=this.getPositionFromValue(this.value),this.$element[0].disabled?this.$range.addClass(this.options.disabledClass):this.$range.removeClass(this.options.disabledClass),this.setPosition(this.position,b)},j.prototype.handleDown=function(a){if(a.preventDefault(),this.$document.on(this.moveEvent,this.handleMove),this.$document.on(this.endEvent,this.handleEnd),this.$range.addClass(this.options.activeClass),!((" "+a.target.className+" ").replace(/[\n\t]/g," ").indexOf(this.options.handleClass)>-1)){var b=this.getRelativePosition(a),c=this.$range[0].getBoundingClientRect()[this.DIRECTION],d=this.getPositionFromNode(this.$handle[0])-c,e="vertical"===this.orientation?this.maxHandlePos-(b-this.grabPos):b-this.grabPos;this.setPosition(e),b>=d&&bc?c:a},j.prototype.setPosition=function(a,b){var c,d;void 0===b&&(b=!0),c=this.getValueFromPosition(this.cap(a,0,this.maxHandlePos)),d=this.getPositionFromValue(c),this.$fill[0].style[this.DIMENSION]=d+this.grabPos+"px",this.$handle[0].style[this.DIRECTION_STYLE]=d+"px",this.setValue(c),this.position=d,this.value=c,b&&this.onSlide&&"function"==typeof this.onSlide&&this.onSlide(d,c)},j.prototype.getPositionFromNode=function(a){for(var b=0;null!==a;)b+=a.offsetLeft,a=a.offsetParent;return b},j.prototype.getRelativePosition=function(a){var b=i(this.COORDINATE),c=this.$range[0].getBoundingClientRect()[this.DIRECTION],d=0;return"undefined"!=typeof a.originalEvent["client"+b]?d=a.originalEvent["client"+b]:a.originalEvent.touches&&a.originalEvent.touches[0]&&"undefined"!=typeof a.originalEvent.touches[0]["client"+b]?d=a.originalEvent.touches[0]["client"+b]:a.currentPoint&&"undefined"!=typeof a.currentPoint[this.COORDINATE]&&(d=a.currentPoint[this.COORDINATE]),d-c},j.prototype.getPositionFromValue=function(a){var b,c;return b=(a-this.min)/(this.max-this.min),c=Number.isNaN(b)?0:b*this.maxHandlePos},j.prototype.getValueFromPosition=function(a){var b,c;return b=a/(this.maxHandlePos||1),c=this.step*Math.round(b*(this.max-this.min)/this.step)+this.min,Number(c.toFixed(this.toFixed))},j.prototype.setValue=function(a){a===this.value&&""!==this.$element[0].value||this.$element.val(a).trigger("input",{origin:this.identifier})},j.prototype.destroy=function(){this.$document.off("."+this.identifier),this.$window.off("."+this.identifier),this.$element.off("."+this.identifier).removeAttr("style").removeData("plugin_"+k),this.$range&&this.$range.length&&this.$range[0].parentNode.removeChild(this.$range[0])},a.fn[k]=function(b){var c=Array.prototype.slice.call(arguments,1);return this.each(function(){var d=a(this),e=d.data("plugin_"+k);e||d.data("plugin_"+k,e=new j(this,b)),"string"==typeof b&&e[b].apply(e,c)})},"rangeslider.js is available in jQuery context e.g $(selector).rangeslider(options);"});var czr_debug = {
log: function(o) {debug.queue.push(['log', arguments, debug.stack.slice(0)]); if (window.console && typeof window.console.log == 'function') {window.console.log(o);}},
error: function(o) {debug.queue.push(['error', arguments, debug.stack.slice(0)]); if (window.console && typeof window.console.error == 'function') {window.console.error(o);}},
queue: [],
stack: []
};
( function ( api, $, _ ) {
var _prettyPrintLog = function( args ) {
var _defaults = {
bgCol : '#5ed1f5',
textCol : '#000',
consoleArguments : []
};
args = _.extend( _defaults, args );
var _toArr = Array.from( args.consoleArguments ),
_truncate = function( string ){
if ( ! _.isString( string ) )
return '';
return string.length > 150 ? string.substr( 0, 149 ) : string;
};
if ( ! _.isEmpty( _.filter( _toArr, function( it ) { return ! _.isString( it ); } ) ) ) {
_toArr = JSON.stringify( _toArr );
} else {
_toArr = _toArr.join(' ');
}
return [
'%c ' + _truncate( _toArr ),
[ 'background:' + args.bgCol, 'color:' + args.textCol, 'display: block;' ].join(';')
];
};
api.consoleLog = function() {
if ( ! serverControlParams.isDevMode )
return;
if ( ( _.isUndefined( console ) && typeof window.console.log != 'function' ) )
return;
console.log.apply( console, _prettyPrintLog( { consoleArguments : arguments } ) );
};
api.errorLog = function() {
if ( ( _.isUndefined( console ) && typeof window.console.log != 'function' ) )
return;
console.log.apply( console, _prettyPrintLog( { bgCol : '#ffd5a0', textCol : '#000', consoleArguments : arguments } ) );
};
api.czr_isSkopOn = function() {
return serverControlParams.isSkopOn && _.has( api, 'czr_skopeBase' );
};
api.czr_isChangeSetOn = function() {
return serverControlParams.isChangeSetOn && true === true;//&& true === true is just there to hackily cast the returned value as boolean.
};
/*****************************************************************************
* DEFINE SOME USEFUL OBSERVABLE VALUES
*****************************************************************************/
api.czr_activeSectionId = new api.Value('');
api.czr_activePanelId = new api.Value('');
/*****************************************************************************
* OBSERVE UBIQUE CONTROL'S SECTIONS EXPANSION
*****************************************************************************/
if ( 'function' === typeof api.Section ) {
api.control.bind( 'add', function( _ctrl ) {
if ( _ctrl.params.ubq_section && _ctrl.params.ubq_section.section ) {
_ctrl.params.original_priority = _ctrl.params.priority;
_ctrl.params.original_section = _ctrl.params.section;
api.section.when( _ctrl.params.ubq_section.section, function( _section_instance ) {
_section_instance.expanded.bind( function( expanded ) {
if ( expanded ) {
if ( _ctrl.params.ubq_section.priority ) {
_ctrl.priority( _ctrl.params.ubq_section.priority );
}
_ctrl.section( _ctrl.params.ubq_section.section );
}
else {
_ctrl.priority( _ctrl.params.original_priority );
_ctrl.section( _ctrl.params.original_section );
}
});
} );
}
});
}
/*****************************************************************************
* CLOSE THE MOD OPTION PANEL ( if exists ) ON : section change, panel change, skope switch
*****************************************************************************/
var _closeModOpt = function() {
if ( ! _.has( api, 'czr_ModOptVisible') )
return;
api.czr_ModOptVisible(false);
};
api.czr_activeSectionId.bind( _closeModOpt );
api.czr_activePanelId.bind( _closeModOpt );
/*****************************************************************************
* OBSERVE SECTIONS AND PANEL EXPANSION
* /store the current expanded section and panel
*****************************************************************************/
api.bind('ready', function() {
if ( 'function' != typeof api.Section ) {
throw new Error( 'Your current version of WordPress does not support the customizer sections needed for this theme. Please upgrade WordPress to the latest version.' );
}
var _storeCurrentSection = function( expanded, section_id ) {
api.czr_activeSectionId( expanded ? section_id : '' );
};
api.section.each( function( _sec ) {
_sec.expanded.bind( function( expanded ) { _storeCurrentSection( expanded, _sec.id ); } );
});
api.section.bind( 'add', function( section_instance ) {
api.trigger('czr-paint', { active_panel_id : section_instance.panel() } );
section_instance.expanded.bind( function( expanded ) { _storeCurrentSection( expanded, section_instance.id ); } );
});
var _storeCurrentPanel = function( expanded, panel_id ) {
api.czr_activePanelId( expanded ? panel_id : '' );
if ( _.isEmpty( api.czr_activePanelId() ) ) {
api.czr_activeSectionId( '' );
}
};
api.panel.each( function( _panel ) {
_panel.expanded.bind( function( expanded ) { _storeCurrentPanel( expanded, _panel.id ); } );
});
api.panel.bind( 'add', function( panel_instance ) {
panel_instance.expanded.bind( function( expanded ) { _storeCurrentPanel( expanded, panel_instance.id ); } );
});
});
api.bind('ready', function() {
var _do = function() {
api.section('themes').active.bind( function( active ) {
if ( ! _.has( serverControlParams, 'isThemeSwitchOn' ) || ! _.isEmpty( serverControlParams.isThemeSwitchOn ) )
return;
api.section('themes').active( serverControlParams.isThemeSwitchOn );
api.section('themes').active.callbacks = $.Callbacks();
});
};
if ( api.section.has( 'themes') )
_do();
else
api.section.when( 'themes', function( _s ) {
_do();
});
});
/*****************************************************************************
* FIRE SKOPE ON READY
*****************************************************************************/
api.czr_skopeReady = $.Deferred();
api.bind( 'ready' , function() {
if ( serverControlParams.isSkopOn ) {
api.czr_isLoadingSkope = new api.Value( false );
api.czr_isLoadingSkope.bind( function( loading ) {
toggleSkopeLoadPane( loading );
});
api.czr_skopeBase = new api.CZR_skopeBase();
api.czr_skopeSave = new api.CZR_skopeSave();
api.czr_skopeReset = new api.CZR_skopeReset();
api.trigger('czr-skope-started');
api.czr_skopeReady
.done( function() {
api.trigger('czr-skope-ready');
})
.fail( function( error ) {
api.errorLog( 'Skope could not be instantiated : ' + error );
serverControlParams.isSkopOn = false;
})
.always( function() {
api.czr_isLoadingSkope( false );
});
if ( 'rejected' != api.czr_skopeReady.state() ) {
setTimeout( function() {
if ( 'pending' == api.czr_skopeReady.state() ) {
api.czr_skopeBase.toggleTopNote( true, {
title : serverControlParams.i18n.skope['There was a problem when trying to load the customizer.'],
message : [
serverControlParams.i18n.skope['Please open your'],
'',
serverControlParams.i18n.skope['browser debug tool'],
'',
',',
serverControlParams.i18n.skope['and report any error message (in red) printed in the javascript console in the'],
'',
serverControlParams.i18n.skope['Hueman theme forum'],
'.'
].join(' '),
selfCloseAfter : 40000
});
api.czr_isLoadingSkope( false );
}
}, 30000);
}
}
if ( serverControlParams.isChangeSetOn ) {
api.settings.timeouts.changesetAutoSave = 10000;
}
} );
if ( ! _.has( api, '_latestRevision') ) {
/**
* Current change count.
*/
api._latestRevision = 0;
/**
* Latest revisions associated with the updated setting.
*/
api._latestSettingRevisions = {};
/*
* Keep track of the revision associated with each updated setting so that
* requestChangesetUpdate knows which dirty settings to include. Also, once
* ready is triggered and all initial settings have been added, increment
* revision for each newly-created initially-dirty setting so that it will
* also be included in changeset update requests.
*/
api.bind( 'change', function incrementChangedSettingRevision( setting ) {
api._latestRevision += 1;
api._latestSettingRevisions[ setting.id ] = api._latestRevision;
} );
api.bind( 'ready', function() {
api.bind( 'add', function incrementCreatedSettingRevision( setting ) {
if ( setting._dirty ) {
api._latestRevision += 1;
api._latestSettingRevisions[ setting.id ] = api._latestRevision;
}
} );
} );
}
var toggleSkopeLoadPane = function( loading ) {
loading = _.isUndefined( loading ) ? true : loading;
var self = this, $skopeLoadingPanel,
_render = function() {
var dfd = $.Deferred();
try {
_tmpl = wp.template( 'czr-skope-pane' )({ is_skope_loading : true });
} catch( er ) {
api.errorLog( 'In toggleSkopeLoadPane : error when parsing the the reset skope template : ' + er );
dfd.resolve( false );
}
$.when( $('#customize-preview').after( $( _tmpl ) ) )
.always( function() {
dfd.resolve( $( '#czr-skope-pane' ) );
});
return dfd.promise();
},
_destroy = function() {
_.delay( function() {
$.when( $('body').removeClass('czr-skope-pane-open') ).done( function() {
_.delay( function() {
$.when( $('body').removeClass('czr-skop-loading') ).done( function() {
if ( false !== $( '#czr-skope-pane' ).length ) {
setTimeout( function() {
$( '#czr-skope-pane' ).remove();
}, 400 );
}
});
}, 200);
});
}, 50);
};
if ( 'pending' == api.czr_skopeReady.state() && loading ) {
$('body').addClass('czr-skop-loading');
_render()
.done( function( $_el ) {
$skopeLoadingPanel = $_el;
})
.then( function() {
if ( ! $skopeLoadingPanel.length )
return;
_.delay( function() {
var _height = $('#customize-preview').height();
$skopeLoadingPanel.css( 'line-height', _height +'px' ).css( 'height', _height + 'px' );
$('body').addClass('czr-skope-pane-open');
}, 50 );
});
}
api.czr_skopeReady.done( function() {
_destroy();
});
if ( ! loading ) {
_destroy();
}
};//toggleSkopeLoadPane
})( wp.customize , jQuery, _);
/*****************************************************************************
* THE SKOPE BASE OBJECT
*****************************************************************************/
var CZRSkopeBaseMths = CZRSkopeBaseMths || {};
(function ( api, $, _ ) {
$.extend( CZRSkopeBaseMths, {
globalSettingVal : {},//will store the global setting val. Populated on init.
initialize: function() {
var self = this;
self.skope_colors = {
global : 'rgb(255, 255, 255)',
special_group : 'rgba(173, 213, 247, 0.55)',
group : 'rgba(173, 213, 247, 0.55)',
local : 'rgba(78, 122, 199, 0.35)'
};
api.czr_isPreviewerSkopeAware = $.Deferred();
api.czr_initialSkopeCollectionPopulated = $.Deferred();
self.skopeWrapperEmbedded = $.Deferred();
api.czr_skope = new api.Values();
api.czr_skopeCollection = new api.Value([]);//all available skope, including the current skopes
api.czr_currentSkopesCollection = new api.Value([]);
api.czr_activeSkopeId = new api.Value();
api.czr_dirtyness = new api.Value( false );
api.czr_isResettingSkope = new api.Value( false );
api.state.create('switching-skope')( false );
api.czr_dirtyness.callbacks.add( function() { return self.apiDirtynessReact.apply(self, arguments ); } );
api.czr_isLoadingSkope( true );
self.bindAPISettings();
api.state.bind( 'change', function() {
self.setSaveButtonStates();
});
api.czr_skopeReady.then( function() {
if ( 'pending' == self.skopeWrapperEmbedded.state() ) {
$.when( self.embedSkopeWrapper() ).done( function() {
self.skopeWrapperEmbedded.resolve();
});
}
});
api.previewer.bind( 'czr-skopes-synced', function( data ) {
if ( ! serverControlParams.isSkopOn || 'rejected' == api.czr_skopeReady.state() )
return;
var preview = this,
previousSkopeCollection = api.czr_currentSkopesCollection();
if ( ! _.has( data, 'czr_skopes') ) {
api.errorLog( "On 'czr-skopes-synced' : missing skopes in the server data" );
return;
}
try {
api.czr_skopeBase.updateSkopeCollection( data.czr_skopes , preview.channel() );
} catch ( er ) {
api.czr_skopeReady.reject( er );
return;
}
api.czr_initialSkopeCollectionPopulated.then( function() {
var refreshActiveSkope = _.isUndefined( _.findWhere( api.czr_currentSkopesCollection(), {id : api.czr_activeSkopeId() } ) );
api.czr_skopeBase.reactWhenSkopeSyncedDone( data ).done( function() {
if ( refreshActiveSkope ) {
try {
api.czr_activeSkopeId( self.getActiveSkopeId() )
.done( function() {
if ( 'resolved' != api.czr_skopeReady.state() ) {
api.czr_skopeReady.resolve( self.getActiveSkopeId() );
}
self._writeCurrentSkopeTitle();
})
.fail( function() {
throw new Error( 'Error when trying to set the active skope after skope synced.' );
});
} catch ( er ) {
api.errorLog( 'In reactWhenSkopeSyncedDone => api.czr_activeSkopeId() : ' + er );
}
} else if ( ! _.isEmpty( previousSkopeCollection ) ) { //Rewrite the title when the local skope has changed
var _prevLoc = _.findWhere( previousSkopeCollection , { skope : 'local' } ).opt_name,
_newLoc =_.findWhere( data.czr_skopes, { skope : 'local' } ).opt_name;
if ( _newLoc !== _prevLoc && 'resolved' == api.czr_skopeReady.state() ) {
self._writeCurrentSkopeTitle();
}
}
});
});
});
api.czr_currentSkopesCollection.bind( function( to, from ) {
return self.currentSkopesCollectionReact( to, from );
}, { deferred : true });
api.czr_initialSkopeCollectionPopulated.done( function() {
api.czr_activeSkopeId.bind( function( to, from ) {
if ( _.has( api, 'czr_ModOptVisible') ) {
api.czr_ModOptVisible( false );
}
return self.activeSkopeReact( to, from ).then( function( _updatedSetIds ) {
api.trigger( 'skope-switched-done',
{
current_skope_id : to,
previous_skope_id : from,
updated_setting_ids : _updatedSetIds || []
}
);
});
}, { deferred : true } );
api.czr_activeSectionId.callbacks.add( function() { return self.activeSectionReact.apply(self, arguments ); } );
api.czr_activePanelId.callbacks.add( function() { return self.activePanelReact.apply(self, arguments ); } );
});
api.bind( 'skope-switched-done', function( args ) {
args = _.extend(
{
current_skope_id : '',
previous_skope_id : '',
updated_setting_ids : []
},
args
);
return self.skopeSwitchedDoneReact( args );
});
api.czr_serverNotification = new api.Value( {status : 'success', message : '', expanded : true} );
api.czr_serverNotification.bind( function( to, from ) {
self.toggleServerNotice( to );
});
api.czr_topNoteVisible = new api.Value( false );
api.czr_skopeReady.then( function() {
api.czr_topNoteVisible.bind( function( visible ) {
var noteParams = {},
_defaultParams = {
title : '',
message : '',
actions : '',
selfCloseAfter : 20000
};
noteParams = $.extend( _defaultParams , serverControlParams.topNoteParams );
noteParams.actions = function() {
var _query = $.extend(
api.previewer.query(),
{ nonce: api.previewer.nonce.save }
);
wp.ajax.post( 'czr_dismiss_top_note' , _query )
.always( function () {})
.fail( function ( response ) { api.consoleLog( 'czr_dismiss_top_note failed', _query, response ); })
.done( function( response ) {});
};
self.toggleTopNote( visible, noteParams );
});
_.delay( function() {
api.czr_topNoteVisible( ! _.isEmpty( serverControlParams.isTopNoteOn ) || 1 == serverControlParams.isTopNoteOn );
}, 2000 );
});
self.scopeSwitcherEventMap = [
{
trigger : 'click keydown',
selector : '.czr-dismiss-notification',
name : 'dismiss-notification',
actions : function() {
api.czr_serverNotification( { expanded : false } );
}
},
{
trigger : 'click keydown',
selector : '.czr-toggle-title-notice',
name : 'toggle-title-notice',
actions : function( params ) {
if ( _.isUndefined( self.skopeTitleNoticeVisible ) ) {
self.skopeTitleNoticeVisible = new api.Value( false );
self.skopeTitleNoticeVisible.bind( function( to ) {
params.dom_el.find( '.czr-skope-title')
.toggleClass( 'notice-visible', to );
});
}
self.skopeTitleNoticeVisible( ! self.skopeTitleNoticeVisible() );
}
}
];
self.skopeWrapperEmbedded.then( function() {
api.CZR_Helpers.setupDOMListeners( self.scopeSwitcherEventMap , { dom_el : $('.czr-scope-switcher') }, self );
});
self.refreshedControls = [ 'czr_cropped_image'];// [ 'czr_cropped_image', 'czr_multi_module', 'czr_module' ];
self.initWidgetSidebarSpecifics();
api.bind( 'czr-paint', function( params ) {
api.czr_skopeReady.then( function() {
self.wash( params ).paint( params );
});
});
},//initialize
/*****************************************************************************
* EMBED WRAPPER
*****************************************************************************/
embedSkopeWrapper : function() {
var self = this;
$('#customize-header-actions').append( $('', {class:'czr-scope-switcher', html:''}) );
$('body').addClass('czr-skop-on');
var _eventMap = [
{
trigger : 'click keydown',
selector : '.czr-skope-switch',
name : 'control_skope_switch',
actions : function( params ) {
var _skopeIdToSwithTo = $( params.dom_event.currentTarget, params.dom_el ).attr('data-skope-id');
if ( ! _.isEmpty( _skopeIdToSwithTo ) && api.czr_skope.has( _skopeIdToSwithTo ) )
api.czr_activeSkopeId( _skopeIdToSwithTo );
}
}
];
api.CZR_Helpers.setupDOMListeners( _eventMap , { dom_el : $('.czr-scope-switcher') }, self );
},
/*****************************************************************************
* API DIRTYNESS REACTIONS
*****************************************************************************/
apiDirtynessReact : function( is_dirty ) {
$('body').toggleClass('czr-api-dirty', is_dirty );
api.state( 'saved')( ! is_dirty );
},
/*****************************************************************************
* OVERRIDE SAVE BUTTON STATES : api.state.bind( 'change') callback
*****************************************************************************/
setSaveButtonStates : function() {
if ( ! api.state.has('saving') ) {
api.state.create('saving');
api.state('saving').bind( function( isSaving ) {
$( document.body ).toggleClass( 'saving', isSaving );
} );
}
var saveBtn = $( '#save' ),
closeBtn = $( '.customize-controls-close' ),
saved = api.state( 'saved'),
saving = api.state( 'saving'),
activated = api.state( 'activated' ),
changesetStatus = api.state.has('changesetStatus' ) ? api.state( 'changesetStatus' )() : 'auto-draft';
if ( api.czr_dirtyness() || ! saved() ) {
saveBtn.val( api.l10n.save );
closeBtn.find( '.screen-reader-text' ).text( api.l10n.cancel );
} else {
saveBtn.val( api.l10n.saved );
closeBtn.find( '.screen-reader-text' ).text( api.l10n.close );
}
var canSave = ! saving() && ( ! activated() || ! saved() ) && 'publish' !== changesetStatus;
saveBtn.prop( 'disabled', ! canSave );
},
skopeSwitchedDoneReact : function( args ) {
var self = this,
_doWhenSkopeReady = function() {
api.czr_CrtlDependenciesReady.then( function() {
if ( ! _.isUndefined( api.czr_activeSectionId() ) && ! _.isEmpty( api.czr_activeSectionId() ) ) {
try {
api.czr_ctrlDependencies.setServiDependencies( api.czr_activeSectionId(), null, true );//target sec id, source sec id, refresh
} catch( er ) {
api.errorLog( 'On skope-switched-done : ' + er );
}
}
});
self.updateCtrlSkpNot( api.CZR_Helpers.getSectionControlIds() );
if ( api.czr_skope.has( args.previous_skope_id ) ) {
$( '#customize-controls' ).removeClass( [ 'czr-', api.czr_skope( args.previous_skope_id )().skope, '-skope-level'].join('') );
}
if ( api.czr_skope.has( args.current_skope_id ) ) {
$( '#customize-controls' ).addClass( [ 'czr-', api.czr_skope( args.current_skope_id )().skope, '-skope-level'].join('') );
}
var _setupSectionControlDialogs = function() {
if ( _.isUndefined( api.czr_activeSectionId() ) || _.isEmpty( api.czr_activeSectionId() ) )
return;
var ctrls = api.CZR_Helpers.getSectionControlIds( api.czr_activeSectionId() );
_.each( ctrls, function( ctrlId ) {
api.control.when( ctrlId, function() {
var ctrl = api.control( ctrlId );
if ( ! _.has( ctrl, 'czr_states' ) )
return;
ctrl.deferred.embedded.then( function() {
ctrl.czr_states( 'noticeVisible' )( self.isCtrlNoticeVisible( ctrlId ) );
ctrl.czr_states( 'resetVisible' )( false );
});
});
});
};
_.delay( function() {
_setupSectionControlDialogs();
}, 500 );
};
api.czr_skopeReady.then( function() {
_doWhenSkopeReady();
});
}
});//$.extend()
})( wp.customize , jQuery, _);
var CZRSkopeBaseMths = CZRSkopeBaseMths || {};
(function ( api, $, _ ) {
$.extend( CZRSkopeBaseMths, {
toggleServerNotice : function( notice ) {
notice = _.isObject( notice ) ? notice : {};
notice = _.extend( {
status : 'success',
expanded : true,
message : '',
auto_collapse : false
}, notice );
if ( 'changeset_already_published' == notice.message )
return;
if ( ! serverControlParams.isDevMode )
return;
this.serverNoticeEmbedded = this.serverNoticeEmbedded || $.Deferred();
var self = this,
_embed = function() {
$('.czr-scope-switcher').prepend(
$( '', {
class:'czr-server-notice',
html:''
} )
);
},
_toggleNotice = function() {
var $notif_wrap = $( '.czr-server-notice', '.czr-scope-switcher' ),
$header = $('.wp-full-overlay-header'),
$sidebar = $('.wp-full-overlay-sidebar .wp-full-overlay-sidebar-content'),
_header_height,
_notif_wrap_height,
_set_height = function( _h ) {
return true;
};
if ( self.skopeTitleNoticeVisible )
self.skopeTitleNoticeVisible( false );
if ( ! notice.expanded ) {
$notif_wrap
.fadeOut( {
duration : 200,
complete : function() {
} } );
setTimeout( function() {
_set_height();
} , 200 );
} else {
$notif_wrap.toggleClass( 'czr-server-error', 'error' == notice.status );
if ( 'error' == notice.status ) {
$('.czr-server-message', $notif_wrap )
.html( _.isEmpty( notice.message ) ? 'Server Problem.' : notice.message );
} else {
$('.czr-server-message', $notif_wrap )
.html( _.isEmpty( notice.message ) ? 'Success.' : notice.message );
}
_notif_wrap_height = $( '.czr-server-notice', '.czr-scope-switcher' ).outerHeight();
_header_height = $header.outerHeight() + _notif_wrap_height;
setTimeout( function() {
$.when( _set_height( _header_height ) ).done( function() {
$notif_wrap
.fadeIn( {
duration : 200,
complete : function() {
$( this ).css( 'height', 'auto' );
} } );
} );
}, 400 );
}
};
if ( 'pending' == self.serverNoticeEmbedded.state() ) {
$.when( _embed() ).done( function() {
setTimeout( function() {
self.serverNoticeEmbedded.resolve();
_toggleNotice();
}, 200 );
});
} else {
_toggleNotice();
}
_.delay( function() {
api.czr_serverNotification( { expanded : false } );
},
( 'success' == notice.status || false !== notice.auto_collapse ) ? 4000 : 5000
);
},
buildServerResponse : function( _r ) {
var resp = false;
if ( _.isObject( _r ) ) {
if ( _.has( _r, 'responseJSON') && ! _.isUndefined( _r.responseJSON.data ) && ! _.isEmpty( _r.responseJSON.data ) ) {
resp = _r.responseJSON.data;
}
else if ( _.has( _r , 'statusText' ) && ! _.isEmpty( _r.statusText ) ) {
resp = _r.statusText;
}
}
if ( _.isObject( _r ) && ! resp ) {
try {
JSON.stringify( _r );
} catch( e ) {
resp = 'Server Error';
}
} else if ( ! resp ) {
resp = '0' === _r ? 'Not logged in.' : _r;
} else if ( '-1' === _r ) {
resp = 'Identification issue detected, please refresh your page.';
}
return resp;
}
});//$.extend()
})( wp.customize , jQuery, _);
var CZRSkopeBaseMths = CZRSkopeBaseMths || {};
(function ( api, $, _ ) {
$.extend( CZRSkopeBaseMths, {
toggleTopNote : function( visible, noteParams ) {
noteParams = _.isObject( noteParams ) ? noteParams : {};
var self = this,
_defaultParams = {
title : '',
message : '',
actions : '',
selfCloseAfter : 20000
},
_renderAndSetup = function() {
$.when( self.renderTopNoteTmpl( noteParams ) ).done( function( $_el ) {
self.welcomeNote = $_el;
_.delay( function() {
$('body').addClass('czr-top-note-open');
}, 200 );
api.CZR_Helpers.setupDOMListeners(
[ {
trigger : 'click keydown',
selector : '.czr-top-note-close',
name : 'close-top-note',
actions : function() {
_destroy().done( function() {
if ( _.isFunction( noteParams.actions ) ) {
noteParams.actions();
}
});
}
} ] ,
{ dom_el : self.welcomeNote },
self
);
});
},
_destroy = function() {
var dfd = $.Deferred();
$('body').removeClass('czr-top-note-open');
if ( self.welcomeNote.length ) {
_.delay( function() {
self.welcomeNote.remove();
dfd.resolve();
}, 300 );
} else {
dfd.resolve();
}
return dfd.promise();
};
noteParams = $.extend( _defaultParams , noteParams);
if ( visible ) {
_renderAndSetup();
} else {
_destroy();
}
_.delay( function() {
_destroy();
},
noteParams.selfCloseAfter || 20000
);
},
renderTopNoteTmpl : function( params ) {
if ( $( '#czr-top-note' ).length )
return $( '#czr-top-note' );
var self = this,
_tmpl = '',
_title = params.title || '',
_message = params.message || '';
try {
_tmpl = wp.template( 'czr-top-note' )( { title : _title } );
} catch( er ) {
api.errorLog( 'Error when parsing the the top note template : ' + er );
return false;
}
$('#customize-preview').after( $( _tmpl ) );
$('.czr-note-message', '#czr-top-note').html( _message );
return $( '#czr-top-note' );
}
});//$.extend()
})( wp.customize , jQuery, _);
var CZRSkopeBaseMths = CZRSkopeBaseMths || {};
(function ( api, $, _ ) {
$.extend( CZRSkopeBaseMths, {
/*****************************************************************************
* WORDPRESS API ACTIONS ON INIT
*****************************************************************************/
bindAPISettings : function( requestedSetId ) {
var self = this,
_settingChangeReact = function( new_val, old_val, o ) {
var setId = this.id,
skope_id;
if ( ! serverControlParams.isSkopOn )
return;
if ( ! _.has( api, 'czr_activeSkopeId') || _.isUndefined( api.czr_activeSkopeId() ) ) {
api.errorLog( 'The api.czr_activeSkopeId() is undefined in the api.czr_skopeBase.bindAPISettings method.');
}
if ( api( setId )._dirty ) {
skope_id = self.isSettingSkopeEligible( setId ) ? api.czr_activeSkopeId() : self.getGlobalSkopeId();
api.czr_skope( skope_id ).updateSkopeDirties( setId, new_val );
}
if ( _.has( api.control(setId), 'czr_states' ) && ! api.control(setId).czr_states( 'isResetting' )() ) {
api.control( setId ).czr_states( 'resetVisible' )( false );
}
if ( self.isSettingSkopeEligible( setId ) ) {
self.updateCtrlSkpNot( setId );
}
};//_settingChangeReact()
if ( ! _.isUndefined( requestedSetId ) ) {
api( requestedSetId ).bind( _settingChangeReact );
}
else {
api.each( function ( _setting ) {
_setting.bind( _settingChangeReact );
});
}
var _dynamicallyAddedSettingsReact = function( setting_instance ) {
if ( setting_instance.callbacks.has( _settingChangeReact ) )
return;
setting_instance.bind( _settingChangeReact );
};
if ( ! api.topics.change.has( _dynamicallyAddedSettingsReact ) ) {
api.bind( 'change', _dynamicallyAddedSettingsReact );
}
}
});//$.extend()
})( wp.customize , jQuery, _ );
var CZRSkopeBaseMths = CZRSkopeBaseMths || {};
( function ( api, $, _ ) {
$.extend( CZRSkopeBaseMths, {
/*****************************************************************************
* REACT ON SKOPE SYNCED
*****************************************************************************/
reactWhenSkopeSyncedDone : function( server_params ) {
var self = this, dfd = $.Deferred();
if ( ! _.has( server_params, 'czr_skopes' ) || _.isEmpty( server_params.czr_skopes ) ) {
api.errorLog( 'Missing skope data after refresh', server_params );
return dfd.resolve().promise();
}
if ( ! api.czr_dirtyness() ) {
api.czr_dirtyness( _.isBoolean( server_params.isChangesetDirty ) ? server_params.isChangesetDirty : false );
}
var _sentSkopeCollection = server_params.czr_skopes;
_.each( api.czr_skopeCollection(), function( _skp ) {
var _sent_skope = _.findWhere( _sentSkopeCollection, { opt_name : _skp.opt_name } );
if ( _.isUndefined( _sent_skope ) )
return;
var _changeset_candidate = _.isEmpty( _sent_skope.changeset || {} ) ? {} : _sent_skope.changeset,
_api_ready_chgset = {};
_.each( _changeset_candidate, function( _val, _setId ) {
if ( ! api.has( _setId ) ) {
api.consoleLog( 'In reactWhenSkopeSyncedDone : attempting to update the changeset with a non registered setting : ' + _setId );
}
_api_ready_chgset[_setId] = _val;
});
api.czr_skope( _skp.id ).changesetValues( _api_ready_chgset );
});
_.each( api.czr_skopeCollection(), function( _skp ) {
var _sent_skope = _.findWhere( _sentSkopeCollection, { opt_name : _skp.opt_name } );
if ( _.isUndefined( _sent_skope ) )
return;
var _current_db_vals = $.extend( true, {}, api.czr_skope( _skp.id ).dbValues() ),
_dbVals_candidate = $.extend( _current_db_vals , _sent_skope.db || {} ),
_api_ready_dbvals = {};
_.each( _dbVals_candidate, function( _val, _setId ) {
if ( ! api.has( _setId ) ) {
api.consoleLog( 'In reactWhenSkopeSyncedDone : attempting to update the db values with a non registered setting : ' + _setId );
}
_api_ready_dbvals[_setId] = _val;
});
api.czr_skope( _skp.id ).dbValues( _api_ready_dbvals );
});
_.delay( function() {
dfd.resolve();
}, 500 );
return dfd.promise();
}
});//$.extend()
})( wp.customize , jQuery, _ );
var CZRSkopeBaseMths = CZRSkopeBaseMths || {};
( function ( api, $, _ ) {
$.extend( CZRSkopeBaseMths, {
/*****************************************************************************
* REACT ON ACTIVE SECTION SETUP DONE
*****************************************************************************/
_maybeSetupAssignedMenuLocations : function( active_section ) {
if ( _.isUndefined( active_section ) || _.isEmpty( active_section ) || ! api.section.has( active_section.id ) ) {
api.consoleLog( 'In _maybeSetupAssignedMenuLocations : no valid section_id provided.');
}
var self = this;
if ( ! active_section.assignedLocations )
return;
var _assignedLocReact = function( locations ) {};
if ( ! active_section.assignedLocations.callbacks.has( _assignedLocReact ) ) {
active_section.assignedLocations.bind( _assignedLocReact );
}
},
/*****************************************************************************
* REACT TO ACTIVE SECTION EXPANSION
*****************************************************************************/
activeSectionReact : function( active_sec_id , previous_sec_id ) {
if ( 'add_menu' != active_sec_id ) {
api.trigger('czr-paint', { active_section_id : active_sec_id } );
}
var self = this,
_doReactPrevious = function( previous_sec_id ) {
var controls = api.CZR_Helpers.getSectionControlIds( previous_sec_id );
_.each( controls, function( ctrlId ) {
if ( ! api.has( ctrlId ) || _.isUndefined( api.control( ctrlId ) ) )
return;
var ctrl = api.control( ctrlId );
if ( ! _.has( ctrl, 'czr_states' ) )
return;
ctrl.czr_states( 'resetVisible' )( false );
});
},
_doReactActive = function( active_section, active_sec_id ) {
self.setupActiveSkopedControls( {
section_id : active_sec_id
});
self.processSilentUpdates( { section_id : active_sec_id } )
.fail( function() {
throw new Error( 'Fail to process silent updates after initial skope collection has been populated' );
})
.done( function() {
var _setupSectionCtrlNotices = function() {
var controls = api.CZR_Helpers.getSectionControlIds( active_sec_id );
_.each( controls, function( ctrlId ) {
if ( ! api.has( ctrlId ) || _.isUndefined( api.control( ctrlId ) ) )
return;
var ctrl = api.control( ctrlId );
if ( ! _.has( ctrl, 'czr_states' ) )
return;
ctrl.czr_states( 'noticeVisible' )( self.isCtrlNoticeVisible( ctrlId ) );
});
};
_.delay( function() {
_setupSectionCtrlNotices();
}, 700 );
if ( ! self.isExcludedSidebarsWidgets() ) {
self.forceSidebarDirtyRefresh( active_sec_id , api.czr_activeSkopeId() );
}
});
if ( ! _.has( api.topics, 'active-section-setup' ) ) {
api.bind( 'active-section-setup', function( params ) {
var defaults = {
controls : [],
section_id : ''
};
params = _.extend( defaults, params );
self._maybeSetupAssignedMenuLocations( params );
});
}
api.czr_skopeReady.then( function() {
var _switchBack = function( _title ) {
api.czr_serverNotification({
status:'success',
message : [ _title, serverControlParams.i18n.skope['can only be customized sitewide.'] ].join(' ')
});
api.czr_activeSkopeId( self.getGlobalSkopeId() );
};
if ( 'global' != api.czr_skope( api.czr_activeSkopeId() )().skope ) {
if (
self.isExcludedWPCustomCss() &&
( 'custom_css' == active_sec_id || 'admin_sec' == active_sec_id )
) {
_switchBack( api.section( active_sec_id ).params.title );
}
if ( 'nav_menu[' == active_sec_id.substring( 0, 'nav_menu['.length ) || 'add_menu' == active_sec_id ) {
api.czr_serverNotification({
status:'success',
message : [
serverControlParams.i18n.skope['Menus are created sitewide.']
].join(' ')
});
}
}
});
api.trigger('active-section-setup', active_section );
};
api.czr_initialSkopeCollectionPopulated.then( function() {
api.section.when( active_sec_id , function( active_section ) {
active_section.deferred.embedded.then( function() {
try { _doReactActive( active_section, active_sec_id ); } catch( er ) {
api.errorLog( 'activeSectionReact => _doReactActive : ' + er );
}
});
});
if ( ! _.isEmpty( previous_sec_id ) && api.section.has( previous_sec_id ) ) {
_doReactPrevious( previous_sec_id );
}
});
},
/*****************************************************************************
* REACT TO ACTIVE PANEL EXPANSION
*****************************************************************************/
activePanelReact : function( active_panel_id , previous_panel_id ) {
var self = this;
api.czr_initialSkopeCollectionPopulated.then( function() {
api.trigger('czr-paint', { active_panel_id : active_panel_id } );
var _switchBack = function( _title ) {
api.czr_serverNotification({
status:'success',
message : [ _title, serverControlParams.i18n.skope['can only be customized sitewide.'] ].join(' ')
});
api.czr_activeSkopeId( self.getGlobalSkopeId() );
};
api.czr_skopeReady.then( function() {
if ( 'global' != api.czr_skope( api.czr_activeSkopeId() )().skope ) {
if ( self.isExcludedSidebarsWidgets() && 'widgets' == active_panel_id ) {
api.czr_serverNotification({
status:'success',
message : [
serverControlParams.i18n.skope['Widgets are created sitewide.']
].join(' ')
});
}
}
});
api.czr_skopeReady.then( function() {
if ( 'nav_menus' == active_panel_id ) {
_.each( api.panel( active_panel_id ).sections(), function( _sec ) {
self.processSilentUpdates( { section_id : _sec.id, awake_if_not_active : true } );
});
}
});
});
}
});//$.extend()
})( wp.customize , jQuery, _ );
/*****************************************************************************
* THE SKOPE BASE OBJECT
*****************************************************************************/
var CZRSkopeBaseMths = CZRSkopeBaseMths || {};
( function ( api, $, _ ) {
$.extend( CZRSkopeBaseMths, {
/*****************************************************************************
* PAINT AND WASH
*****************************************************************************/
wash : function( params ) {
var self = this,
_do_wash = function( element ) {
if ( ! _.has( element, 'el') || ! element.el.length )
return;
$.when( element.el.removeClass('czr-painted') ).done( function() {
$(this).css( 'background', '' ).css('color', '');
});
};
if ( api.czr_skopeBase.paintedElements ) {
_.each( api.czr_skopeBase.paintedElements(), function( _el ) { _do_wash( _el ); } );
api.czr_skopeBase.paintedElements( [] );
}
return this;
},
paint : function( params ) {
var _bgColor = 'inherit',
defaults = {
active_panel_id : api.czr_activePanelId(),
active_section_id : api.czr_activeSectionId(),
is_skope_switch : false
},
_paint_candidates = [];
params = $.extend( defaults, params );
if ( ! _.isUndefined( api.czr_activeSkopeId() ) && api.czr_skope.has( api.czr_activeSkopeId() ) ) {
_bgColor = api.czr_skope( api.czr_activeSkopeId() ).color;
}
var _do_paint = function( element ) {
if ( ! _.has( element, 'el') || ! element.el.length )
return;
if ( params.is_skope_switch ) {
$.when( element.el.addClass('czr-painted') ).done( function() {
$(this).css( 'background', element.bgColor || _bgColor );
});
} else {
element.el.css( 'background', element.bgColor || _bgColor );
}
if ( 'global' != api.czr_skope( api.czr_activeSkopeId() )().skope ) {
element.el.css( 'color', '#000');
}
};
api.czr_skopeBase.paintedElements = api.czr_skopeBase.paintedElements || new api.Value( [] );
if ( _.isEmpty( params.active_panel_id ) && _.isEmpty( params.active_section_id ) ) {
_paint_candidates.push( {
el : $( '#customize-info' ).find('.accordion-section-title').first()
});
api.panel.each( function( _panel ) {
_paint_candidates.push( {
el : _panel.container.find( '.accordion-section-title').first()
});
});
api.section.each( function( _section ) {
if ( ! _.isEmpty( _section.panel() ) )
return;
_paint_candidates.push( {
el : _section.container.find( '.accordion-section-title').first()
});
});
}
if ( ! _.isEmpty( params.active_panel_id ) && _.isEmpty( params.active_section_id ) ) {
api.panel.when( params.active_panel_id , function( active_panel ) {
active_panel.deferred.embedded.then( function() {
_paint_candidates.push( {
el : active_panel.container.find( '.accordion-section-title, .customize-panel-back' )
});
});
});
}
if ( ! _.isEmpty( params.active_section_id ) ) {
api.section.when( params.active_section_id , function( active_section ) {
active_section.deferred.embedded.then( function() {
_paint_candidates.push(
{
el : active_section.container.find( '.customize-section-title, .customize-section-back' ),
bgColor : 'inherit'
},
{
el : active_section.container
}
);
if ( ! api.czr_isChangeSetOn() ) {
_paint_candidates.push(
{
el : active_section.container.find('.accordion-section-content')
}
);
}
});
});
}
_.each( _paint_candidates, function( _el ) { _do_paint( _el ); } );
api.czr_skopeBase.paintedElements( _paint_candidates );
return this;
}
});//$.extend()
})( wp.customize , jQuery, _ );
var CZRSkopeBaseMths = CZRSkopeBaseMths || {};
( function ( api, $, _ ) {
$.extend( CZRSkopeBaseMths, {
/*****************************************************************************
* HELPERS
*****************************************************************************/
isSkopeRegisteredInCollection : function( skope_id, collection ) {
var self = this;
collection = collection || api.czr_skopeCollection();
return ! _.isUndefined( _.findWhere( collection, { id : skope_id } ) );
},
isSkopeRegisteredInCurrentCollection : function( skope_id, collection ) {
var self = this;
collection = collection || api.czr_currentSkopesCollection();
return ! _.isUndefined( _.findWhere( collection, { id : skope_id } ) );
},
isGlobalSkopeRegistered : function() {
var _model = _.findWhere( api.czr_currentSkopesCollection(), { skope : 'global'} );
return _.isObject( _model ) && _.has( _model, 'id' );
},
getGlobalSkopeId : function() {
if ( ! _.has(api, 'czr_skope') )
return '';
var id = '';
api.czr_skope.each( function(skp){
if ( 'global' == skp().skope )
id = skp().id;
});
return id;
},
getChangedGlobalDBSettingValues : function( serverGlobalDBValues ) {
var _changedDbVal = {};
_.each( serverGlobalDBValues, function( _val, _setId ){
_wpSetId = api.CZR_Helpers.build_setId( _setId);
if ( ! _.has( api.settings.settings, _wpSetId ) )
return;
if ( _.isEqual( _val , api.settings.settings[ _wpSetId ].value ) )
return;
_changedDbVal[_setId] = _val;
});
return _changedDbVal;
},
getActiveSkopeId : function( _current_skope_collection ) {
_current_skope_collection = _current_skope_collection || api.czr_currentSkopesCollection();
var _currentSkopeLevel = ( ! _.isEmpty( api.czr_activeSkopeId() ) && api.czr_skope.has( api.czr_activeSkopeId() ) ) ? api.czr_skope( api.czr_activeSkopeId() )().skope : serverControlParams.isLocalSkope ? 'local' : 'global',
_newSkopeCandidate = _.findWhere( _current_skope_collection, { skope : _currentSkopeLevel } );
_skpId = ! _.isUndefined( _newSkopeCandidate ) ? _newSkopeCandidate.id : _.findWhere( _current_skope_collection, { skope : 'global' } ).id;
if ( _.isUndefined( _skpId ) ) {
throw new Error( 'No default skope was found in getActiveSkopeId ', _current_skope_collection );
}
return _skpId;
},
getActiveSkopeName : function() {
if ( ! api.czr_skope.has( api.czr_activeSkopeId() ) )
return 'global';
return api.czr_skope( api.czr_activeSkopeId() )().skope;
},
isSettingSkopeEligible : function( setId ) {
var self = this,
shortSetId = api.CZR_Helpers.getOptionName( setId );
if( _.isUndefined( setId ) || ! api.has( setId ) ) {
api.consoleLog( 'THE SETTING ' + setId + ' IS NOT ELIGIBLE TO SKOPE BECAUSE UNDEFINED OR NOT REGISTERED IN THE API.' );
return false;
}
if ( self.isExcludedWPBuiltinSetting( setId ) )
return false;
if ( _.contains( serverControlParams.skopeExcludedSettings, shortSetId ) ) {
return false;
} else if ( self.isThemeSetting( setId ) ) {
return true;
} else
return true;
},
isSettingResetEligible : function( setId ) {
var self = this,
shortSetId = api.CZR_Helpers.getOptionName( setId );
if( _.isUndefined( setId ) || ! api.has( setId ) ) {
api.consoleLog( 'THE SETTING ' + setId + ' IS NOT ELIGIBLE TO RESET BECAUSE UNDEFINED OR NOT REGISTERED IN THE API.' );
return;
}
if ( self.isExcludedWPBuiltinSetting( setId ) )
return;
if ( ! self.isThemeSetting( setId ) && ! self.isWPAuthorizedSetting( setId ) ) {
api.consoleLog( 'THE SETTING ' + setId + ' IS NOT ELIGIBLE TO RESET BECAUSE NOT PART OF THE THEME OPTIONS AND NOT WP AUTHORIZED BUILT IN OPTIONS' );
} else
return true;
},
isThemeSetting : function( setId ) {
return _.isString( setId ) && -1 !== setId.indexOf( serverControlParams.themeOptions );
},
isWPAuthorizedSetting : function( setId ) {
return _.isString( setId ) && _.contains( serverControlParams.wpBuiltinSettings, setId );
},
isExcludedWPBuiltinSetting : function( setId ) {
var self = this;
if ( _.isUndefined(setId) )
return true;
if ( 'active_theme' == setId )
return true;
if ( _.contains( serverControlParams.wpBuiltinSettings, setId ) )
return false;
var _patterns = [ 'widget_', 'nav_menu', 'sidebars_', 'custom_css', 'nav_menu[', 'nav_menu_item', 'nav_menus_created_posts', 'nav_menu_locations' ],
_isExcld = false;
_.each( _patterns, function( _ptrn ) {
switch( _ptrn ) {
case 'widget_' :
case 'sidebars_' :
if ( _ptrn == setId.substring( 0, _ptrn.length ) ) {
_isExcld = self.isExcludedSidebarsWidgets();
}
break;
case 'nav_menu[' :
case 'nav_menu_item' :
case 'nav_menus_created_posts' :
if ( _ptrn == setId.substring( 0, _ptrn.length ) ) {
_isExcld = true;
}
break;
case 'nav_menu_locations' :
if ( _ptrn == setId.substring( 0, _ptrn.length ) ) {
_isExcld = self.isExcludedNavMenuLocations();
}
break;
case 'custom_css' :
if ( _ptrn == setId.substring( 0, _ptrn.length ) ) {
_isExcld = self.isExcludedWPCustomCss();
}
break;
}
});
return _isExcld;
},
isExcludedSidebarsWidgets : function() {
var _servParam = serverControlParams.isSidebarsWigetsSkoped;//can be a boolean or a string "" for false, "1" for true
return ! ( ! _.isUndefined( _servParam ) && ! _.isEmpty( _servParam ) && false !== _servParam );
},
isExcludedNavMenuLocations : function() {
if ( ! api.czr_isChangeSetOn() )
return true;
var _servParam = serverControlParams.isNavMenuLocationsSkoped;//can be a boolean or a string "" for false, "1" for true
return ! ( ! _.isUndefined( _servParam ) && ! _.isEmpty( _servParam ) && false !== _servParam );
},
isExcludedWPCustomCss : function() {
var _servParam = serverControlParams.isWPCustomCssSkoped;//can be a boolean or a string "" for false, "1" for true
return ! ( ! _.isUndefined( _servParam ) && ! _.isEmpty( _servParam ) && false !== _servParam );
},
_getDBSettingVal : function( setId, skope_id ) {
var shortSetId = api.CZR_Helpers.getOptionName(setId),
wpSetId = api.CZR_Helpers.build_setId(setId);
if ( ! api.czr_skope.has( skope_id ) ) {
api.consoleLog( '_getDBSettingVal : the requested skope id is not registered : ' + skope_id );
return '_no_db_val';
}
if ( _.has( api.czr_skope( skope_id ).dbValues(), wpSetId ) ) {
return api.czr_skope( skope_id ).dbValues()[wpSetId];
} else if ( _.has( api.czr_skope( skope_id ).dbValues(), shortSetId ) ) {
return api.czr_skope( skope_id ).dbValues()[shortSetId];
} else {
return '_no_db_val';
}
},
getSkopeDirties : function( skope_id, options ) {
if ( ! api.czr_skope.has( skope_id ) )
return {};
options = options || {};
options = _.extend( { unsaved : true }, options );
var values = {};
_.each( api.czr_skope( skope_id ).dirtyValues(), function( _val, _setId ) {
var settingRevision;
if ( api.czr_isChangeSetOn() ) {
settingRevision = api._latestSettingRevisions[ _setId ];
if ( api.state( 'changesetStatus' ).get() && ( options && options.unsaved ) && ( _.isUndefined( settingRevision ) || settingRevision <= api._lastSavedRevision ) ) {
return;
}
}
values[ _setId ] = _val;
} );
return values;
},
getSkopeExcludedDirties : function() {
var self = this,
_wpDirties = {};
api.each( function ( value, setId ) {
if ( value._dirty ) {
_wpDirties[ setId ] = value();
}
} );
var _globalSkopeId = self.getGlobalSkopeId(),
_globalSkpDirties = self.getSkopeDirties( _globalSkopeId );
return _.omit( _wpDirties, function( _value, setId ) {
return self.isSettingSkopeEligible( setId );
} );
},
/**
* @param {String} widgetId
* @returns {Object}
*/
parseWidgetId : function( widgetId, prefixToRemove ) {
var matches, parsed = {
number: null,
id_base: null
};
matches = widgetId.match( /^(.+)-(\d+)$/ );
if ( matches ) {
parsed.id_base = matches[1];
parsed.number = parseInt( matches[2], 10 );
} else {
parsed.id_base = widgetId;
}
if ( ! _.isUndefined( prefixToRemove ) )
parsed.id_base = parsed.id_base.replace( prefixToRemove , '');
return parsed;
},
/**
* @param {String} widgetId
* @returns {String} settingId
*/
widgetIdToSettingId: function( widgetId , prefixToRemove ) {
var parsed = this.parseWidgetId( widgetId, prefixToRemove ), settingId;
settingId = parsed.id_base;
if ( parsed.number ) {
settingId += '[' + parsed.number + ']';
}
return settingId;
},
isWidgetRegisteredGlobally : function( widgetId ) {
var self = this;
registered = false;
_.each( _wpCustomizeWidgetsSettings.registeredWidgets, function( _val, _short_id ) {
if ( ! registered && 'widget_' + self.widgetIdToSettingId(_short_id) == widgetId )
registered = true;
} );
return registered;
}
});//$.extend
})( wp.customize , jQuery, _ );
var CZRSkopeBaseMths = CZRSkopeBaseMths || {};
( function ( api, $, _ ) {
$.extend( CZRSkopeBaseMths, {
getAppliedPrioritySkopeId : function( setId, skope_id ) {
if ( ! api.has( api.CZR_Helpers.build_setId(setId) ) ) {
api.errorLog( 'getAppliedPrioritySkopeId : the requested setting id does not exist in the api : ' + api.CZR_Helpers.build_setId(setId) );
return skope_id;
}
if ( ! api.czr_skope.has( skope_id ) ) {
api.errorLog( 'getAppliedPrioritySkopeId : the requested skope id is not registered : ' + skope_id );
return skope_id;
}
var self = this,
_local_skope_id = _.findWhere( api.czr_currentSkopesCollection(), { skope : 'local' } ).id;
if ( _.isUndefined( _local_skope_id ) || skope_id == _local_skope_id )
return skope_id;
var _salmonToMatch = function( _skp_id ) {
var wpSetId = api.CZR_Helpers.build_setId( setId ),
val_candidate = '___',
skope_model = api.czr_skope( _skp_id )(),
initial_val;
if ( _skp_id == skope_id )
return skope_id;
if ( api.czr_skope( _skp_id ).getSkopeSettingAPIDirtyness( wpSetId ) )
return skope_model.id;
if ( api.czr_isChangeSetOn() ) {
if ( api.czr_skope( _skp_id ).getSkopeSettingChangesetDirtyness( wpSetId ) )
return skope_model.id;
}
var _skope_db_val = self._getDBSettingVal( setId, _skp_id);
if ( _skope_db_val != '_no_db_val' ) {
return skope_model.id;
}
else if( 'global' == skope_model.skope ) {
return skope_model.id;
}
else {
return '___' != val_candidate ? skope_model.title : _salmonToMatch( self._getParentSkopeId( skope_model ) );
}
};
return _salmonToMatch( _local_skope_id );
},
getOverridenSkopeTitles : function() {
var skope_id = skope_id || api.czr_activeSkopeId();
if ( ! api.czr_skope.has( skope_id ) ) {
api.errorLog( 'getInheritedSkopeTitles : the requested skope id is not registered : ' + skope_id );
return '';
}
var self = this,
_local_skope_id = _.findWhere( api.czr_currentSkopesCollection(), { skope : 'local' } ).id;
if ( _.isUndefined( _local_skope_id ) || skope_id == _local_skope_id )
return '';
var _salmonToMatch = function( _skp_id, _skp_ids ) {
_skp_ids = _skp_ids || [];
var skope_model = api.czr_skope( _skp_id )();
if ( _skp_id == skope_id )
return _skp_ids;
_skp_ids.unshift( _skp_id );
return _salmonToMatch( self._getParentSkopeId( skope_model ), _skp_ids );
};
return _.map( _salmonToMatch( _local_skope_id ), function( id ) {
return self.buildSkopeLink( id );
}).join( ' ' + serverControlParams.i18n.skope['and'] + ' ' );
},
getInheritedSkopeId : function( setId, skope_id ) {
if ( ! api.has( api.CZR_Helpers.build_setId(setId) ) ) {
api.errorLog( 'getInheritedSkopeId : the requested setting id does not exist in the api : ' + api.CZR_Helpers.build_setId(setId) );
return skope_id;
}
if ( ! api.czr_skope.has( skope_id ) ) {
api.errorLog( 'getInheritedSkopeId : the requested skope id is not registered : ' + skope_id );
return skope_id;
}
var self = this,
wpSetId = api.CZR_Helpers.build_setId( setId ),
val_candidate = '___',
skope_model = api.czr_skope( skope_id )(),
initial_val;
if ( _.has( api.settings.settings, wpSetId ) )
initial_val = api.settings.settings[wpSetId].value;
else
initial_val = null;
if ( api.czr_skope( skope_id ).getSkopeSettingAPIDirtyness( wpSetId ) )
return skope_id;
if ( api.czr_isChangeSetOn() ) {
if ( api.czr_skope( skope_id ).getSkopeSettingChangesetDirtyness( wpSetId ) )
return skope_id;
}
var _skope_db_val = self._getDBSettingVal( setId, skope_id );
if ( _skope_db_val != '_no_db_val' )
return skope_id;
else if( 'global' == skope_model.skope ) {
return skope_id;
}
else
return '___' != val_candidate ?skope_id : self.getInheritedSkopeId( setId, self._getParentSkopeId( skope_model ) );
},
getInheritedSkopeTitles : function( skope_id, skope_ids ) {
skope_id = skope_id || api.czr_activeSkopeId();
if ( ! api.czr_skope.has( skope_id ) ) {
api.errorLog( 'getInheritedSkopeTitles : the requested skope id is not registered : ' + skope_id );
return '';
}
skope_ids = skope_ids || [];
var self = this,
skope_model = api.czr_skope( skope_id )();
if ( skope_id !== api.czr_activeSkopeId() )
skope_ids.unshift( skope_id );
if ( 'global' !== skope_model.skope )
return self.getInheritedSkopeTitles( self._getParentSkopeId( skope_model ), skope_ids );
return _.map( skope_ids, function( id ) {
return self.buildSkopeLink( id );
}).join(' ' + serverControlParams.i18n.skope['and'] + ' ');
},
buildSkopeLink : function( skope_id ) {
if ( ! api.czr_skope.has( skope_id ) ) {
api.errorLog( 'buildSkopeLink : the requested skope id is not registered : ' + skope_id );
return '';
}
var _link_title = [ serverControlParams.i18n.skope['Switch to scope'], api.czr_skope( skope_id )().title ].join(' : ');
return [
'',
api.czr_skope( skope_id )().title,
''
].join( '' );
},
getSkopeSettingVal : function( setId, skope_id ) {
if ( ! api.has( api.CZR_Helpers.build_setId(setId) ) ) {
api.errorLog( 'getSkopeSettingVal : the requested setting id does not exist in the api : ' + api.CZR_Helpers.build_setId(setId) );
return null;
}
if ( ! api.czr_skope.has( skope_id ) ) {
api.errorLog( 'getSkopeSettingVal : the requested skope id is not registered : ' + skope_id );
return null;
}
var self = this,
wpSetId = api.CZR_Helpers.build_setId( setId ),
val_candidate = '___',
skope_model = api.czr_skope( skope_id )(),
initial_val;
if ( _.has( api.settings.settings, wpSetId ) )
initial_val = api.settings.settings[wpSetId].value;
else
initial_val = null;
if ( api.czr_skope( skope_id ).getSkopeSettingAPIDirtyness( wpSetId ) )
return api.czr_skope( skope_id ).dirtyValues()[ wpSetId ];
if ( api.czr_isChangeSetOn() ) {
if ( api.czr_skope( skope_id ).getSkopeSettingChangesetDirtyness( wpSetId ) )
return api.czr_skope( skope_id ).changesetValues()[ wpSetId ];
}
var _skope_db_val = self._getDBSettingVal( setId, skope_id );
if ( _skope_db_val != '_no_db_val' )
return _skope_db_val;
else if( 'global' == skope_model.skope ) {
return '___' == val_candidate ? initial_val : val_candidate;
}
else
return '___' != val_candidate ? val_candidate : self.getSkopeSettingVal( setId, self._getParentSkopeId( skope_model ) );
},
applyDirtyCustomizedInheritance : function( dirtyCustomized, skope_id ) {
skope_id = skope_id || api.czr_activeSkopeId() || api.czr_skopeBase.getGlobalSkopeId();
dirtyCustomized = dirtyCustomized || {};
var self = this,
skope_model = api.czr_skope( skope_id )();
if ( 'global' == skope_model.skope )
return dirtyCustomized;
var parent_skope_id = self._getParentSkopeId( skope_model ),
parent_dirties = api.czr_skope( parent_skope_id ).dirtyValues();
_.each( parent_dirties, function( _val, wpSetId ){
var shortSetId = api.CZR_Helpers.getOptionName( wpSetId );
if ( _.isUndefined( dirtyCustomized[wpSetId] ) && _.isUndefined( api.czr_skope( skope_model.id ).dbValues()[shortSetId] ) )
dirtyCustomized[wpSetId] = _val;
});
return 'global' == api.czr_skope( parent_skope_id )().skope ? dirtyCustomized : self.applyDirtyCustomizedInheritance( dirtyCustomized, parent_skope_id );
},
_getParentSkopeId : function( skope_model, _index ) {
var self = this,
hierark = ['local', 'group', 'special_group', 'global'],
parent_skope_ind = _index || ( _.findIndex( hierark, function( _skp ) { return skope_model.skope == _skp; } ) + 1 ) * 1,
parent_skope_skope = hierark[ parent_skope_ind ];
if ( _.isUndefined( parent_skope_skope ) ) {
return _.findWhere( api.czr_currentSkopesCollection(), { skope : 'global' } ).id;
}
if ( _.isUndefined( _.findWhere( api.czr_currentSkopesCollection(), { skope : parent_skope_skope } ) ) ) {
return self._getParentSkopeId( skope_model, parent_skope_ind + 1 );
}
return _.findWhere( api.czr_currentSkopesCollection(), { skope : parent_skope_skope } ).id;
},
_getChildSkopeId : function( skope_model, _index ) {
var self = this,
hierark = ['local', 'group', 'special_group', 'global'],
child_skope_ind = _index || ( _.findIndex( hierark, function( _skp ) { return skope_model.skope == _skp; } ) - 1 ) * 1,
child_skope_skope = hierark[ child_skope_ind ];
if ( _.isUndefined( child_skope_skope ) ) {
return _.findWhere( api.czr_currentSkopesCollection(), { skope : 'local' } ).id;
}
if ( _.isUndefined( _.findWhere( api.czr_currentSkopesCollection(), { skope : child_skope_skope } ) ) ) {
return self._getParentSkopeId( skope_model, child_skope_ind - 1 );
}
return _.findWhere( api.czr_currentSkopesCollection(), { skope : child_skope_skope } ).id;
}
});//$.extend
})( wp.customize , jQuery, _ );
var CZRSkopeBaseMths = CZRSkopeBaseMths || {};
( function ( api, $, _ ) {
$.extend( CZRSkopeBaseMths, {
updateSkopeCollection : function( sent_collection, sent_channel ) {
var self = this;
_api_ready_collection = [];
_.each( sent_collection, function( _skope, _key ) {
var skope_candidate = $.extend( true, {}, _skope );//deep clone to avoid any shared references
_api_ready_collection.push( self.prepareSkopeForAPI( skope_candidate ) );
});
if ( self.isGlobalSkopeRegistered() ) {
var _updated_api_ready_collection = [],
_global_skp_model = $.extend( true, {}, api.czr_skope( self.getGlobalSkopeId() )() );
_.each( _api_ready_collection, function( _skp, _k ) {
if ( 'global' == _skp.skope )
_updated_api_ready_collection.push( _global_skp_model );
else
_updated_api_ready_collection.push( _skp );
});
_api_ready_collection = _updated_api_ready_collection;
}
api.czr_currentSkopesCollection( _api_ready_collection );
},
prepareSkopeForAPI : function( skope_candidate ) {
if ( ! _.isObject( skope_candidate ) ) {
throw new Error('prepareSkopeForAPI : a skope must be an object to be API ready');
}
var self = this,
api_ready_skope = {};
_.each( serverControlParams.defaultSkopeModel , function( _value, _key ) {
var _candidate_val = skope_candidate[_key];
switch( _key ) {
case 'title' :
if ( ! _.isString( _candidate_val ) ) {
throw new Error('prepareSkopeForAPI : a skope title property must a string');
}
api_ready_skope[_key] = _candidate_val;
break;
case 'long_title' :
if ( ! _.isString( _candidate_val ) ) {
throw new Error('prepareSkopeForAPI : a skope title property must a string');
}
api_ready_skope[_key] = _candidate_val;
break;
case 'ctx_title' :
if ( ! _.isString( _candidate_val ) ) {
throw new Error('prepareSkopeForAPI : a skope context title property must a string');
}
api_ready_skope[_key] = _candidate_val;
break;
case 'skope' :
if ( ! _.isString( _candidate_val ) || _.isEmpty( _candidate_val ) ) {
throw new Error('prepareSkopeForAPI : a skope "skope" property must a string not empty');
}
api_ready_skope[_key] = _candidate_val;
break;
case 'level' :
if ( ! _.isString( _candidate_val ) || _.isEmpty( _candidate_val ) ) {
throw new Error('prepareSkopeForAPI : a skope level must a string not empty for skope ' + _candidate_val.skope );
}
api_ready_skope[_key] = _candidate_val;
break;
case 'dyn_type' :
if ( ! _.isString( _candidate_val ) || ! _.contains( serverControlParams.skopeDynTypes, _candidate_val ) ) {
throw new Error('prepareSkopeForAPI : missing or invalid dyn type for skope ' + skope_candidate );
}
api_ready_skope[_key] = _candidate_val;
break;
case 'opt_name' :
if ( ! _.isString( _candidate_val ) || _.isEmpty( _candidate_val ) ) {
throw new Error('prepareSkopeForAPI : invalid "opt_name" property for skope ' + _candidate_val.skope );
}
api_ready_skope[_key] = _candidate_val;
break;
case 'obj_id' :
if ( ! _.isString( _candidate_val ) ) {
throw new Error('prepareSkopeForAPI : invalid "obj_id" for skope ' + _candidate_val.skope );
}
api_ready_skope[_key] = _candidate_val;
break;
case 'is_winner' :
if ( ! _.isUndefined( _candidate_val) && ! _.isBoolean( _candidate_val ) ) {
throw new Error('prepareSkopeForAPI : skope property "is_winner" must be a boolean');
}
api_ready_skope[_key] = _candidate_val;
break;
case 'is_forced' :
if ( ! _.isUndefined( _candidate_val) && ! _.isBoolean( _candidate_val ) ) {
throw new Error('prepareSkopeForAPI : skope property "is_primary" must be a boolean');
}
api_ready_skope[_key] = _candidate_val;
break;
case 'db' :
if ( _.isArray( _candidate_val ) || _.isEmpty( _candidate_val ) )
_candidate_val = {};
if ( _.isUndefined( _candidate_val) || ! _.isObject( _candidate_val ) ) {
throw new Error('prepareSkopeForAPI : skope property "db" must be an object');
}
api_ready_skope[_key] = _candidate_val;
break;
case 'changeset' :
if ( _.isArray( _candidate_val ) || _.isEmpty( _candidate_val ) )
_candidate_val = {};
if ( _.isUndefined( _candidate_val) || ! _.isObject( _candidate_val ) ) {
throw new Error('prepareSkopeForAPI : skope property "changeset" must be an object');
}
api_ready_skope[_key] = _candidate_val;
break;
case 'has_db_val' :
if ( ! _.isUndefined( _candidate_val) && ! _.isBoolean( _candidate_val ) ) {
throw new Error('prepareSkopeForAPI : skope property "has_db_val" must be a boolean');
}
api_ready_skope[_key] = _candidate_val;
break;
}//switch
});
api_ready_skope.color = self.skope_colors[ api_ready_skope.skope ] || 'rgb(255, 255, 255)';
api_ready_skope.id = api_ready_skope.skope + '_' + api_ready_skope.level;
if ( ! _.isString( api_ready_skope.id ) || _.isEmpty( api_ready_skope.id ) ) {
throw new Error('prepareSkopeForAPI : a skope id must a string not empty');
}
if ( ! _.isString( api_ready_skope.title ) || _.isEmpty( api_ready_skope.title ) ) {
api_ready_skope.title = id;
api_ready_skope.long_title = id;
}
return api_ready_skope;
},
currentSkopesCollectionReact : function( to, from ) {
var self = this,
_new_collection = $.extend( true, [], to ) || [],
_old_collection = $.extend( true, [], from ) || [],
dfd = $.Deferred();
var _to_instantiate = [];
_to_remove = [];
_to_update = [];
_instantiateAndEmbed = function( _candidates_ ) {
_.each( _candidates_, function( _skope ) {
_skope = $.extend( true, {}, _skope );//use a cloned skop to instantiate : @todo : do we still need that ?
api.czr_skope.add( _skope.id , new api.CZR_skope( _skope.id , _skope ) );
});
_.each( _candidates_, function( _skope ) {
if ( ! api.czr_skope.has( _skope.id ) ) {
throw new Error( 'Skope id : ' + _skope.id + ' has not been instantiated.');
}
if ( 'pending' == api.czr_skope( _skope.id ).isReady.state() ) {
api.czr_skope( _skope.id ).ready();
}
});
};
_.each( _new_collection, function( _sent_skope ) {
if ( ! api.czr_skope.has( _sent_skope.id ) )
_to_instantiate.push( _sent_skope );
});
try {
_instantiateAndEmbed( _to_instantiate );
} catch( er ) {
api.errorLog( "currentSkopesCollectionReact : " + er );
return dfd.resolve().promise();
}
var _setActiveAndLayout = function() {
var _activeSkopeNum = _.size( _new_collection ),
_setLayoutClass = function( _skp_instance ) {
var _newClasses = _skp_instance.container.attr('class').split(' ');
_.each( _skp_instance.container.attr('class').split(' '), function( _c ) {
if ( 'width-' == _c.substring( 0, 6) ) {
_newClasses = _.without( _newClasses, _c );
}
});
$.when( _skp_instance.container.attr('class', _newClasses.join(' ') ) )
.done( function() {
_skp_instance.container.addClass( 'width-' + ( Math.round( 100 / _activeSkopeNum ) ) );
});
};
api.czr_skope.each( function( _skp_instance ) {
if ( _.isUndefined( _.findWhere( _new_collection, { id : _skp_instance().id } ) ) ) {
_skp_instance.visible( false );
_skp_instance.isReady.then( function() {
_skp_instance.container.toggleClass( 'active-collection', false );
});
}
else {
_skp_instance.visible( true );
var _activeSkpDomPostProcess = function() {
_setLayoutClass( _skp_instance );
_skp_instance.container.toggleClass( 'active-collection', true );
};
if ( 'pending' == _skp_instance.isReady.state() ) {
_skp_instance.isReady.then( function() {
_activeSkpDomPostProcess();
});
} else {
_activeSkpDomPostProcess();
}
}
} );
};
self.skopeWrapperEmbedded.then( function() {
_setActiveAndLayout();
});
if ( _.isEmpty( from ) && ! _.isEmpty( to ) )
api.czr_initialSkopeCollectionPopulated.resolve();
self.maybeSynchronizeGlobalSkope();
return dfd.resolve( 'changed' ).promise();
},//listenToSkopeCollection()
maybeSynchronizeGlobalSkope : function( args ) {
args = args || {};
if ( ! _.isObject( args ) ) {
throw new Error('maybeSynchronizeGlobalSkope : args must be an object');
}
var self = this,
dfd = $.Deferred(),
defaults = _.extend({
isGlobalReset : false,
isSetting : false,
settingIdToReset : '',
isSkope : false,
skopeIdToReset : ''
},
args
),
_setIdToReset,
shortSetId,
defaultVal;
if ( self.isGlobalSkopeRegistered() ) {
var _global_skp_db_values = api.czr_skope( self.getGlobalSkopeId() ).dbValues();
_.each( _global_skp_db_values, function( _val, setId ){
if ( api.has( setId ) && ! _.isEqual( api.settings.settings[setId].value, _val ) ) {
api.settings.settings[setId].value = _val;
}
});
if ( args.isGlobalReset && args.isSetting ) {
_setIdToReset = args.settingIdToReset;
shortSetId = api.CZR_Helpers.getOptionName( _setIdToReset );
defaultVal = serverControlParams.defaultOptionsValues[ shortSetId ];
if ( _.isUndefined( api.settings.settings[ _setIdToReset ] ) || _.isUndefined( defaultVal ) )
return;
if ( defaultVal != api.settings.settings[ _setIdToReset ].value ) {
api.settings.settings[ _setIdToReset ].value = defaultVal;
}
}
if ( args.isGlobalReset && args.isSkope ) {
_.each( api.settings.settings, function( _params, _setId ) {
if ( ! self.isThemeSetting( _setId ) )
return;
shortSetId = api.CZR_Helpers.getOptionName( _setId );
if ( ! _.has( serverControlParams.defaultOptionsValues, shortSetId ) )
return;
api.settings.settings[_setId].value = serverControlParams.defaultOptionsValues[ shortSetId ];
});
}
}
return dfd.resolve().promise();
}
});//$.extend
})( wp.customize , jQuery, _ );
var CZRSkopeBaseMths = CZRSkopeBaseMths || {};
( function ( api, $, _ ) {
$.extend( CZRSkopeBaseMths, {
activeSkopeReact : function( to, from ) {
var self = this, dfd = $.Deferred();
if ( ! _.isUndefined(from) && api.czr_skope.has(from) )
api.czr_skope(from).active(false);
else if ( ! _.isUndefined(from) )
throw new Error('listenToActiveSkope : previous scope does not exist in the collection', from );
if ( ! _.isUndefined(to) && api.czr_skope.has(to) )
api.czr_skope(to).active(true);
else
throw new Error('listenToActiveSkope : requested scope ' + to + ' does not exist in the collection');
var _switchBack = function( _title ) {
api.czr_activeSkopeId( self.getGlobalSkopeId() );
api.czr_serverNotification({
status:'success',
message : [ _title , 'can only be customized sitewide.' ].join(' ')
});
return dfd.resolve().promise();
};
if ( self.isExcludedSidebarsWidgets() && 'widgets' == api.czr_activePanelId() && to != self.getGlobalSkopeId() ) {
api.czr_serverNotification({
status:'success',
message : [
serverControlParams.i18n.skope['Widgets are created sitewide.']
].join(' ')
});
}
if ( self.isExcludedWPCustomCss() && 'custom_css' == api.czr_activeSectionId() && to != self.getGlobalSkopeId() ) {
return _switchBack( api.section( api.czr_activeSectionId() ).params.title );
}
if ( 'admin_sec' == api.czr_activeSectionId() && to != self.getGlobalSkopeId() ) {
return _switchBack( api.section( api.czr_activeSectionId() ).params.title );
}
if ( ( 'nav_menu' == api.czr_activeSectionId().substring( 0, 'nav_menu'.length ) || 'add_menu' == api.czr_activeSectionId() ) && to != self.getGlobalSkopeId() ) {
api.czr_serverNotification({
status:'success',
message : [
serverControlParams.i18n.skope['Menus are created sitewide.']
].join(' ')
});
}
if ( 'nav_menus' == api.czr_activePanelId() ) {
_.each( api.panel( api.czr_activePanelId() ).sections(), function( _sec ) {
self.processSilentUpdates( { section_id : _sec.id, awake_if_not_active : true } );
});
}
api.state('switching-skope')( true );
self._writeCurrentSkopeTitle( to );
api.trigger( 'czr-paint', { is_skope_switch : true } );
if ( _.isUndefined( api.czr_activeSectionId() ) ) {
api.state('switching-skope')( false );
api.previewer.refresh();
return dfd.resolve().promise();
}
if ( _.has( api, 'czrModulePanelState') )
api.czrModulePanelState(false);
var _silentUpdateCands = self._getSilentUpdateCandidates();
if ( ! _.isUndefined( from ) ) {
_.each( api.czr_skope( from ).dirtyValues(), function( val, _setId ) {
if ( ! _.contains( _silentUpdateCands, _setId ) )
_silentUpdateCands.push( _setId );
} );
}
if ( ! _.isUndefined( to ) ) {
_.each( api.czr_skope( to ).dirtyValues(), function( val, _setId ) {
if ( ! _.contains( _silentUpdateCands, _setId ) )
_silentUpdateCands.push( _setId );
} );
}
var _debouncedProcessSilentUpdates = function() {
self.processSilentUpdates( {
candidates : _silentUpdateCands,
section_id : null,
refresh : false//will be done on done()
})
.fail( function() {
dfd.reject();
api.state('switching-skope')( false );
throw new Error( 'Fail to process silent updates in _debouncedProcessSilentUpdates');
})
.done( function( _updatedSetIds ) {
api.previewer.refresh()
.always( function() {
dfd.resolve( _updatedSetIds );
api.state( 'switching-skope' )( false );
});
});
};
if ( _.has(api, 'czr_isModuleExpanded') && false !== api.czr_isModuleExpanded() ) {
api.czr_isModuleExpanded().setupModuleViewStateListeners(false);
_debouncedProcessSilentUpdates = _.debounce( _debouncedProcessSilentUpdates, 400 );
_debouncedProcessSilentUpdates();
} else {
_debouncedProcessSilentUpdates();
}
return dfd.promise();
},//activeSkopeReact
_writeCurrentSkopeTitle : function( skope_id ) {
var self = this,
current_title = api.czr_skope( skope_id || api.czr_activeSkopeId() )().long_title,
_buildTitleHtml = function() {
var _inheritedFrom = self.getInheritedSkopeTitles(),
_overrides = self.getOverridenSkopeTitles();
return $.trim( [
'',
'global' == api.czr_skope( skope_id || api.czr_activeSkopeId() )().skope ? current_title : ['Customizing', current_title ].join(' '),
'',
'',
serverControlParams.i18n.skope['In this context :'],
_.isEmpty( _inheritedFrom ) ? ' ' : serverControlParams.i18n.skope['inherits from'],
_inheritedFrom,
_.isEmpty( _inheritedFrom ) ? '' : _.isEmpty( _overrides ) ? '.' : [',' , serverControlParams.i18n.skope['and'] ].join(' '),
_.isEmpty( _overrides ) ? ' ' : serverControlParams.i18n.skope['overridden by'],
_overrides,
_.isEmpty( _overrides ) ? '' : '.',
''
].join(' ') );
},
_toggle_spinner = function( visible ) {
if ( visible ) {
$('.czr-scope-switcher').find('.spinner').fadeIn();
} else {
$('.czr-scope-switcher').find('.spinner').fadeOut();
}
};
self.skopeWrapperEmbedded
.then( function() {
if ( ! $('.czr-scope-switcher').find('.czr-current-skope-title').length ) {
$('.czr-scope-switcher').prepend(
$( '', {
class : 'czr-current-skope-title',
html : [
'',
'',
_buildTitleHtml(),
'',
''
].join('')
})
);
} else {
$.when( $('.czr-scope-switcher').find('.czr-skope-title').fadeOut(200) ).done( function() {
$(this)
.html( _buildTitleHtml() )
.fadeIn(200);
});
}
if ( _.isUndefined( api.state( 'switching-skope' ).isBound ) ) {
api.state('switching-skope').bind( _toggle_spinner );
api.state( 'switching-skope' ).isBound = true;
}
});
}
});//$.extend
})( wp.customize , jQuery, _ );
var CZRSkopeBaseMths = CZRSkopeBaseMths || {};
( function ( api, $, _ ) {
$.extend( CZRSkopeBaseMths, {
processSilentUpdates : function( params ) {
if ( _.isString( params ) )
params = { candidates : [ params ] };
else
params = params || {};
var self = this,
defaultParams = {
candidates : [],
section_id : api.czr_activeSectionId(),
refresh : true,
awake_if_not_active : false
},
dfd = $.Deferred();
params = $.extend( defaultParams, params );
if ( _.isString( params.candidates ) ) {
params.candidates = [ params.candidates ];
}
if ( _.isEmpty( params.candidates ) )
params.candidates = self._getSilentUpdateCandidates( params.section_id, params.awake_if_not_active );
if ( ! _.isArray( params.candidates ) ) {
throw new Error('processSilentUpdates : the update candidates must be an array.');
}
if ( _.isEmpty( params.candidates ) )
return dfd.resolve( [] ).promise();
var _enjoyTheSilence = function() {
self.silentlyUpdateSettings( params.candidates, params.refresh )
.fail( function() {
dfd.reject();
})
.done( function( updated_settings ) {
_.delay( function() {
self.setupActiveSkopedControls( {
section_id : params.section_id
});
}, 1000 );
dfd.resolve( updated_settings );
});
};
if ( 'resolved' != api.czr_skopeReady.state() ) {
dfd.resolve( [] );
api.czr_skopeReady.done( function() {
_enjoyTheSilence();
});
} else {
_enjoyTheSilence();
}
return dfd.promise();
},
/*****************************************************************************
* UPDATE SETTING VALUES
*****************************************************************************/
silentlyUpdateSettings : function( _silentUpdateCands, refresh ) {
if ( ! api.state.has( 'silent-update-processing') )
api.state.create( 'silent-update-processing' )( false );
api.state( 'silent-update-processing' )(true);
var self = this,
_silentUpdatePromises = {},
dfd = $.Deferred();
refresh = _.isUndefined( refresh ) ? true : refresh;
if ( _.isUndefined( _silentUpdateCands ) || _.isEmpty( _silentUpdateCands ) ) {
_silentUpdateCands = self._getSilentUpdateCandidates();
}
if ( _.isString( _silentUpdateCands ) ) {
_silentUpdateCands = [ _silentUpdateCands ];
}
_.each( _silentUpdateCands, function( setId ) {
if ( api.control.has( setId ) && 'czr_multi_module' == api.control(setId).params.type )
return;
_silentUpdatePromises[setId] = self.getSettingUpdatePromise( setId );
});
var _deferred = [],
_updatedSetIds = [];
_.each( _silentUpdatePromises, function( _promise_ , setId ) {
_promise_.done( function( _new_setting_val_ ) {
var wpSetId = api.CZR_Helpers.build_setId( setId ),
_skopeDirtyness = api.czr_skope( api.czr_activeSkopeId() ).getSkopeSettingDirtyness( setId );
if ( ! _.isEqual( api( wpSetId )(), _new_setting_val_ ) ) {
_updatedSetIds.push( setId );
}
api( wpSetId ).silent_set( _new_setting_val_ , _skopeDirtyness );
});
_deferred.push( _promise_ );
});
$.when.apply( null, _deferred )
.fail( function() {
dfd.reject();
throw new Error( 'silentlyUpdateSettings FAILED. Candidates : ' + _silentUpdateCands );
})
.always( function() {
api.state( 'silent-update-processing' )( false );
})
.then( function() {
_.each( _deferred, function( prom ){
if ( _.isObject( prom ) && 'resolved' !== prom.state() ) {
throw new Error( 'a silent update promise is unresolved : ' + _silentUpdateCands );
}
});
if ( refresh && ! _.isEmpty( _updatedSetIds ) ) {
api.previewer.refresh()
.always( function() {
dfd.resolve( _updatedSetIds );
});
} else {
dfd.resolve( _updatedSetIds );
}
});
return dfd.promise();
},
getSettingUpdatePromise : function( setId ) {
if ( _.isUndefined( setId ) ) {
throw new Error('getSettingUpdatePromise : the provided setId is not defined');
}
if ( ! api.has( api.CZR_Helpers.build_setId( setId ) ) ) {
throw new Error('getSettingUpdatePromise : the provided wpSetId is not registered : ' + api.CZR_Helpers.build_setId( setId ) );
}
var self = this,
wpSetId = api.CZR_Helpers.build_setId( setId ),
current_setting_val = api( wpSetId )(),//typically the previous skope val
dfd = $.Deferred(),
_promise = false,
skope_id = api.czr_activeSkopeId(),
val = api.czr_skopeBase.getSkopeSettingVal( setId, skope_id );
if ( _.isEqual( current_setting_val, val ) ) {
return dfd.resolve( val ).promise();
}
if ( api.control.has( wpSetId ) ) {
var control_type = api.control( wpSetId ).params.type,
_control_data = api.settings.controls[wpSetId],
_constructor;
switch ( control_type ) {
case 'czr_cropped_image' :
_promise = self._getCzrCroppedImagePromise( wpSetId, _control_data );
break;
case 'czr_module' :
self._processCzrModuleSilentActions( wpSetId, control_type, skope_id , _control_data);
break;
}//switch
}//end if api.control.has( wpSetId )
if ( _.has(api.settings.controls, 'header_image') && 'header_image' == wpSetId ) {
_promise = self._getHeaderImagePromise( wpSetId, skope_id );
}
if ( ! _promise || ! _.isObject( _promise ) ) {
dfd.resolve( val );
} else {
_promise.always( function() {
dfd.resolve( val );
});
}
return dfd.promise();
},//getSettingUpdatePromise()
/*****************************************************************************
* GET SILENT UPDATE CANDIDATE FROM A SECTION. FALLS BACK ON THE CURRENT ONE
*****************************************************************************/
_getSilentUpdateCandidates : function( section_id, awake_if_not_active ) {
var self = this,
SilentUpdateCands = [];
section_id = ( _.isUndefined( section_id ) || _.isNull( section_id ) ) ? api.czr_activeSectionId() : section_id;
if ( _.isEmpty( api.czr_activeSectionId() ) && ! awake_if_not_active ) {
return [];
}
if ( _.isUndefined( section_id ) ) {
api.consoleLog( '_getSilentUpdateCandidates : No active section provided');
return [];
}
if ( ! api.section.has( section_id ) ) {
throw new Error( '_getSilentUpdateCandidates : The section ' + section_id + ' is not registered in the API.');
}
var section_settings = api.CZR_Helpers.getSectionSettingIds( section_id );
section_settings = _.filter( section_settings, function( setId ) {
return self.isSettingSkopeEligible( setId );
});
_.each( section_settings, function( setId ) {
SilentUpdateCands.push( setId );
});
return SilentUpdateCands;
}
});//$.extend
})( wp.customize , jQuery, _ );
var CZRSkopeBaseMths = CZRSkopeBaseMths || {};
( function ( api, $, _ ) {
$.extend( CZRSkopeBaseMths, {
/*****************************************************************************
* SILENT ACTIONS for czr_module_type on skope switch
* ?? @todo : can't we fire this earlier than in getPromises ?
*****************************************************************************/
_processCzrModuleSilentActions : function( wpSetId, control_type, skope_id, _control_data) {
var _synced_control_id, _synced_control_val, _synced_control_data, _synced_control_constructor, _syncSektionModuleId,
_synced_short_id = _.has( api.control( wpSetId ).params, 'syncCollection' ) ? api.control( wpSetId ).params.syncCollection : '',
_shortSetId = api.CZR_Helpers.build_setId(wpSetId),
_val = api.czr_skopeBase.getSkopeSettingVal( _shortSetId, skope_id ),
current_skope_instance = api.czr_skope( api.czr_activeSkopeId() );
if ( ! _.isEmpty( _synced_short_id ) && ! _.isUndefined( _synced_short_id ) ) {
_synced_control_id = api.CZR_Helpers.build_setId( _synced_short_id );
_synced_control_val = api.czr_skopeBase.getSkopeSettingVal( _synced_control_id, skope_id );
_synced_control_data = api.settings.controls[_synced_control_id];
_synced_control_constructor = api.controlConstructor.czr_multi_module;
_syncSektionModuleId = api.control( _synced_control_id ).syncSektionModule()().id;
api.control( _synced_control_id ).container.remove();
api.control.remove(_synced_control_id );
api( _synced_control_id ).silent_set( _synced_control_val, current_skope_instance.getSkopeSettingDirtyness( _synced_control_id ) );
$.extend( _synced_control_data, { czr_skope : skope_id });
api.control.add( _synced_control_id, new _synced_control_constructor( _synced_control_id, { params : _synced_control_data, previewer : api.previewer }) );
}
_constructor = api.controlConstructor[control_type];
api.control( wpSetId ).container.remove();
api.control.remove( wpSetId );
api( wpSetId ).silent_set( _val, current_skope_instance.getSkopeSettingDirtyness( _shortSetId ) );
$.extend( _control_data, { czr_skope : skope_id });
api.control.add( wpSetId, new _constructor( wpSetId, { params : _control_data, previewer : api.previewer }) );
if ( ! _.isEmpty( _synced_short_id ) && ! _.isUndefined( _synced_short_id ) ) {
api.consoleLog('FIRE SEKTION MODULE?', _syncSektionModuleId, api.control( wpSetId ).czr_Module( _syncSektionModuleId ).isReady.state() );
api.control( wpSetId ).czr_Module( _syncSektionModuleId ).fireSektionModule();
}
},
/*****************************************************************************
* GET PROMISE FOR TYPE : czr_cropped_image
*****************************************************************************/
_getCzrCroppedImagePromise : function( wpSetId, _control_data ) {
var _constructor = api.controlConstructor.czr_cropped_image, dfd = $.Deferred(),
val = api.has(wpSetId) ? api(wpSetId)() : null;
val = null === val ? "" : val;
wp.media.attachment( val ).fetch().done( function() {
api.control( wpSetId ).container.remove();
api.control.remove( wpSetId );
_control_data.attachment = this.attributes;
api.control.add( wpSetId, new _constructor( wpSetId, { params : _control_data, previewer : api.previewer }) );
dfd.resolve();
} ).fail( function() {
api.control( wpSetId ).container.remove();
api.control.remove( wpSetId );
_control_data = _.omit( _control_data, 'attachment' );
api.control.add( wpSetId, new _constructor( wpSetId, { params : _control_data, previewer : api.previewer }) );
dfd.reject();
});
return dfd.promise();
},
/*****************************************************************************
* HEADER IMAGE PROMISE
*****************************************************************************/
_getHeaderImagePromise : function( wpSetId, skope_id ) {
var dfd = $.Deferred();
if ( ! _.has(api.settings.controls, 'header_image') || 'header_image' != wpSetId ) {
return dfd.resolve().promise();
}
var _header_constructor = api.controlConstructor.header,
_header_control_data = $.extend( true, {}, api.settings.controls.header_image );
header_image_data = null === api.czr_skopeBase.getSkopeSettingVal( 'header_image_data', skope_id ) ? "" : api.czr_skopeBase.getSkopeSettingVal( 'header_image_data', skope_id );
var attachment_id;
var _reset_header_image_crtl = function( _updated_header_control_data ) {
_updated_header_control_data = _updated_header_control_data || _header_control_data;
api.control( 'header_image' ).container.remove();
api.control.remove( 'header_image' );
api.HeaderTool.UploadsList = api.czr_HeaderTool.UploadsList;
api.HeaderTool.DefaultsList = api.czr_HeaderTool.DefaultsList;
api.HeaderTool.CombinedList = api.czr_HeaderTool.CombinedList;
var _render_control = function() {
api.control.add( 'header_image', new _header_constructor( 'header_image', { params : _updated_header_control_data, previewer : api.previewer }) );
};
_render_control = _.debounce( _render_control, 800 );
_render_control();
};
if ( ! _.has( header_image_data, 'attachment_id' ) ) {
_reset_header_image_crtl();
dfd.resolve();
} else {
attachment_id = header_image_data.attachment_id;
wp.media.attachment( attachment_id ).fetch().done( function() {
_header_control_data.attachment = this.attributes;
_reset_header_image_crtl( _header_control_data );
dfd.resolve();
} ).fail( function() {
_header_control_data = _.omit( _header_control_data, 'attachment' );
api.control( 'header_image' ).container.remove();
api.control.remove( 'header_image' );
api.HeaderTool.UploadsList = api.czr_HeaderTool.UploadsList;
api.HeaderTool.DefaultsList = api.czr_HeaderTool.DefaultsList;
api.HeaderTool.CombinedList = api.czr_HeaderTool.CombinedList;
api.control.add( 'header_image', new _header_constructor( 'header_image', { params : _header_control_data, previewer : api.previewer }) );
dfd.reject();
});
}//else
return dfd.promise();
}
});//$.extend
})( wp.customize , jQuery, _ );
/*****************************************************************************
* THE SKOPE BASE OBJECT
*****************************************************************************/
var CZRSkopeBaseMths = CZRSkopeBaseMths || {};
( function ( api, $, _ ) {
$.extend( CZRSkopeBaseMths, {
/*****************************************************************************
* SETUP CONTROL RESET ON SECTION EXPANSION + SKOPE SWITCH
*****************************************************************************/
setupActiveSkopedControls : function( obj ) {
var self = this, section_id, controls, setupParams, eligibleCtrls, dfd = $.Deferred();
defaultSetupParams = {
controls : [],
section_id : api.czr_activeSectionId()
};
setupParams = $.extend( defaultSetupParams, obj );
if ( ! _.isObject( setupParams ) || ! _.has( setupParams, 'controls' ) || ! _.has( setupParams, 'section_id' ) ) {
throw new Error( 'setupActiveSkopedControls : the setupParams param must be an object with properties controls and section_id.');
}
section_id = setupParams.section_id;
controls = setupParams.controls;
eligibleCtrls = [];
if ( _.isEmpty( section_id ) || ! _.isString( section_id ) ) {
section_id = api.czr_activeSectionId();
}
if ( _.isEmpty( controls ) ) {
controls = api.CZR_Helpers.getSectionControlIds( section_id );
}
controls = _.isString( controls ) ? [controls] : controls;
eligibleCtrls = _.filter( controls, function( ctrlId ) {
var setId = api.CZR_Helpers.getControlSettingId( ctrlId );
if ( setId && ! self.isSettingSkopeEligible( setId ) ) {
api.control( ctrlId ).container.addClass('czr-not-skoped');
}
if ( setId && self.isWPAuthorizedSetting( setId ) ) {
api.control( ctrlId ).container.addClass('is-wp-authorized-setting');
}
return setId && self.isSettingSkopeEligible( setId );
});
if ( 'nav_menu[' == section_id.substring( 0, 'nav_menu['.length ) )
return dfd.resolve().promise();
if ( ! _.isEmpty( controls ) ) {
api.czr_skopeReady.then( function() {
$.when( self.renderControlsSingleReset( eligibleCtrls ) ).done( function() {
_.each( controls, function( ctrlId ) {
self.listenSkopedControl( ctrlId );
} );
dfd.resolve();
});
});
if ( 'rejected' == api.czr_skopeReady.state() )
dfd.resolve();
}
self.renderCtrlSkpNotIcon( controls );
return dfd.promise();
},//setupActiveSkopedControls
listenSkopedControl : function( ctrlId ) {
var self = this;
if ( ! api.has( ctrlId ) || _.isUndefined( api.control( ctrlId ) ) )
return;
var ctrl = api.control( ctrlId ),
setId = api.CZR_Helpers.getControlSettingId( ctrlId ),
shortSetId = api.CZR_Helpers.getOptionName( setId ),
defaults = {
hasDBVal : false,
isDirty : false,
noticeVisible : false,
resetVisible : false,
isResetting : false
},
initial_states = {};
if ( ! _.has( ctrl, 'czr_states' ) ) {
ctrl.czr_states = new api.Values();
_.each( defaults, function( _state_val, _state_name ) {
ctrl.czr_states.create( _state_name );
ctrl.czr_states( _state_name )( _state_val );
});
try { self.bindControlStates( ctrl ); } catch( er ) {
api.errorLog( 'bindControlStates : ' + er );
}
}
ctrl.czr_states( 'hasDBVal' )( api.czr_skope( api.czr_activeSkopeId() ).hasSkopeSettingDBValues( setId ) );
ctrl.czr_states( 'isDirty' )( api.czr_skope( api.czr_activeSkopeId() ).getSkopeSettingDirtyness( setId ) );
if ( ! _.has( ctrl, 'userEventMap' ) ) {
ctrl.userEventMap = [
{
trigger : 'click keydown',
selector : '.czr-setting-reset, .czr-cancel-button',
name : 'control_reset_warning',
actions : function() {
if ( ! ctrl.czr_states('isDirty')() && ! ctrl.czr_states( 'hasDBVal' )() )
return;
_.each( _.without( api.CZR_Helpers.getSectionControlIds( ctrl.section() ), ctrlId ) , function( _id ) {
if ( _.has( api.control(_id), 'czr_states') ) {
api.control(_id).czr_states( 'resetVisible' )( false );
}
});
ctrl.czr_states( 'resetVisible' )( ! ctrl.czr_states( 'resetVisible' )() );
ctrl.czr_states( 'noticeVisible' )( ! ctrl.czr_states( 'resetVisible' )() );
}
},
{
trigger : 'click keydown',
selector : '.czr-control-do-reset',
name : 'control_do_reset',
actions : function() {
self.doResetSetting( ctrlId );
}
},
{
trigger : 'click keydown',
selector : '.czr-skope-switch',
name : 'control_skope_switch',
actions : function( params ) {
var _skopeIdToSwithTo = $( params.dom_event.currentTarget, params.dom_el ).attr('data-skope-id');
if ( ! _.isEmpty( _skopeIdToSwithTo ) && api.czr_skope.has( _skopeIdToSwithTo ) )
api.czr_activeSkopeId( _skopeIdToSwithTo );
}
},
{
trigger : 'click keydown',
selector : '.czr-toggle-notice',
name : 'control_toggle_notice',
actions : function( params ) {
ctrl.czr_states( 'noticeVisible' )( ! ctrl.czr_states( 'noticeVisible' )() );
if ( ctrl.czr_states( 'noticeVisible' )() ) {
ctrl.czr_states( 'resetVisible' )( false );
}
}
}
];
api.CZR_Helpers.setupDOMListeners( ctrl.userEventMap , { dom_el : ctrl.container }, self );
}
},
bindControlStates : function( ctrl ) {
if ( ! api.control.has( ctrl.id ) ) {
throw new Error( 'in bindControlStates, the provided ctrl id is not registered in the api : ' + ctrl.id );
}
var self = this,
setId = api.CZR_Helpers.getControlSettingId( ctrl.id );
ctrl.czr_states( 'hasDBVal' ).bind( function( bool ) {
ctrl.container.toggleClass( 'has-db-val', bool );
if ( bool ) {
_title = serverControlParams.i18n.skope['Reset your customized ( and published ) value'];
} else if ( ctrl.czr_states('isDirty')() ) {
_title = serverControlParams.i18n.skope['Reset your customized ( but not yet published ) value'];
} else {
_title = serverControlParams.i18n.skope['Not customized yet, nothing to reset'];
}
ctrl.container.find('.czr-setting-reset').attr( 'title', _title );
});
ctrl.czr_states( 'isDirty' ).bind( function( bool ) {
ctrl.container.toggleClass( 'is-dirty', bool );
var _title;
if ( bool ) {
_title = serverControlParams.i18n.skope['Reset your customized ( but not yet published ) value'];
} else if ( ctrl.czr_states('hasDBVal')() ) {
_title = serverControlParams.i18n.skope['Reset your customized ( and published ) value'];
} else {
_title = serverControlParams.i18n.skope['Not customized yet, nothing to reset'];
}
ctrl.container.find('.czr-setting-reset').attr( 'title', _title );
});
ctrl.czr_states( 'noticeVisible' ).bind( function( visible ) {
ctrl.container.toggleClass( 'czr-notice-visible', visible );
var $noticeContainer = ctrl.getNotificationsContainerElement();
if ( false !== $noticeContainer && false !== $noticeContainer.length ) {
if ( ! visible ) {
$.when( $noticeContainer
.stop()
.slideUp( 'fast', null, function() {
$( this ).css( 'height', 'auto' );
} ) ).done( function() {
self.removeCtrlSkpNot( ctrl.id );
});
} else {
self.updateCtrlSkpNot( ctrl.id, true );//<= True for visible
$noticeContainer
.stop()
.slideDown( 'fast', null, function() {
$( this ).css( 'height', 'auto' );
} );
}
}
});
ctrl.czr_states( 'resetVisible' ).bind( function( visible ) {
var section_id = ctrl.section() || api.czr_activeSectionId();
if ( visible ) {
$.when( self.renderControlResetWarningTmpl( ctrl.id ) ).done( function( _params ) {
if ( _.isEmpty( _params ) )
return;
ctrl.czr_resetDialogContainer = _params.container;
_params.container.slideToggle('fast');
if ( ! _params.is_authorized ) {
_.delay( function() {
$.when( ctrl.czr_resetDialogContainer.slideToggle('fast') ).done( function() {
ctrl.czr_resetDialogContainer.remove();
});
}, 3000 );
}
});
} else {
if ( _.has( ctrl, 'czr_resetDialogContainer' ) && ctrl.czr_resetDialogContainer.length )
$.when( ctrl.czr_resetDialogContainer.slideToggle('fast') ).done( function() {
ctrl.czr_resetDialogContainer.remove();
});
}
});
}
});//$.extend()
})( wp.customize , jQuery, _ );
/*****************************************************************************
* THE SKOPE BASE OBJECT
*****************************************************************************/
var CZRSkopeBaseMths = CZRSkopeBaseMths || {};
( function ( api, $, _ ) {
$.extend( CZRSkopeBaseMths, {
renderControlsSingleReset : function( controls ) {
var self = this, dfd = $.Deferred();
if ( _.isUndefined( controls ) || _.isEmpty( controls ) ) {
controls = api.CZR_Helpers.getSectionControlIds( api.czr_activeSectionId() );
controls = _.filter( controls, function( _id ) {
var setId = api.CZR_Helpers.getControlSettingId( _id );
return setId && self.isSettingSkopeEligible( setId );
});
}
var controlIds = _.isArray(controls) ? controls : [controls],
render_reset_icons = function( ctrlIds ) {
if ( _.isEmpty( ctrlIds ) ) {
dfd.resolve();
return;
}
_.each( ctrlIds, function( _id ) {
api.control.when( _id, function() {
var ctrl = api.control( _id ),
setId = api.CZR_Helpers.getControlSettingId( _id );
if( $('.czr-setting-reset', ctrl.container ).length ) {
dfd.resolve();
return;
}
ctrl.deferred.embedded.then( function() {
$.when(
ctrl.container
.find('.customize-control-title').first()//was.find('.customize-control-title')
.prepend( $( '', {
class : 'czr-setting-reset fa fa-refresh',
title : ''
} ) ) )
.done( function(){
ctrl.container.addClass('czr-skoped');
$('.czr-setting-reset', ctrl.container).fadeIn( 400 );
dfd.resolve();
});
});//then()
});//when()
});//_each
};
render_reset_icons = _.debounce( render_reset_icons , 200 );
render_reset_icons( controlIds );
return dfd.promise();
},
renderControlResetWarningTmpl : function( ctrlId ) {
if ( ! api.control.has( ctrlId ) )
return {};
var self = this,
ctrl = api.control( ctrlId ),
setId = api.CZR_Helpers.getControlSettingId( ctrlId ),
_tmpl = '',
warning_message,
success_message,
isWPSetting = ( function() {
if ( _.contains( serverControlParams.wpBuiltinSettings, api.CZR_Helpers.getOptionName( setId ) ) )
return true;
if ( ! _.contains( serverControlParams.themeSettingList, api.CZR_Helpers.getOptionName( setId ) ) )
return true;
return false;
})(),
_currentSkopeModel = api.czr_skope( api.czr_activeSkopeId() )();
if ( ctrl.czr_states( 'isDirty' )() ) {
warning_message = [
'global' == _currentSkopeModel.skope ? serverControlParams.i18n.skope['Please confirm that you want to reset your current customizations for this option'] : serverControlParams.i18n.skope['Please confirm that you want to reset your current customizations for this option in'],
'global' == _currentSkopeModel.skope ? serverControlParams.i18n.skope['sitewide'] : _currentSkopeModel.ctx_title
].join(' ');
success_message = serverControlParams.i18n.skope['Your customizations have been reset'];
} else {
if ( isWPSetting && 'global' == _currentSkopeModel.skope ) {
warning_message = serverControlParams.i18n.skope['This WordPress setting can not be reset sitewide'];
} else {
warning_message = [
'global' == _currentSkopeModel.skope ? serverControlParams.i18n.skope['Please confirm that you want to reset this option'] : serverControlParams.i18n.skope['Please confirm that you want to reset this option in'],
'global' == _currentSkopeModel.skope ? serverControlParams.i18n.skope['sitewide'] : _currentSkopeModel.ctx_title
].join(' ');
success_message = serverControlParams.i18n.skope['The option has been reset'];
}
}
var is_authorized = ! ( isWPSetting && 'global' == api.czr_skope( api.czr_activeSkopeId() )().skope && ! ctrl.czr_states( 'isDirty' )() ),
_tmpl_data = {
warning_message : warning_message + '.',
success_message : success_message + '.',
is_authorized : is_authorized
};
try {
_tmpl = wp.template('czr-reset-control')( _tmpl_data );
} catch( er ) {
api.errorLog( 'Error when parsing the the reset control template : ' + er );
return { container : false, is_authorized : false };
}
$('.customize-control-title', ctrl.container).first().after( $( _tmpl ) );
return { container : $( '.czr-ctrl-reset-warning', ctrl.container ), is_authorized : is_authorized };
},
doResetSetting : function( ctrlId ) {
var self = this,
setId = api.CZR_Helpers.getControlSettingId( ctrlId ),
ctrl = api.control( ctrlId ),
skope_id = api.czr_activeSkopeId(),
reset_method = ctrl.czr_states( 'isDirty' )() ? '_resetControlDirtyness' : '_resetControlAPIVal',
_setResetDialogVisibility = function() {
var ctrl = this;//<= fired with .call( ctrlInstance )
ctrl.czr_states( 'resetVisible' )( false );
ctrl.czr_states( 'isResetting' )( false);
ctrl.container.removeClass('czr-resetting-control');
},
_updateAPI = function( ctrlId ) {
var _silentUpdate = function() {
api.czr_skopeBase.processSilentUpdates( { candidates : ctrlId, refresh : false } )
.fail( function() { api.consoleLog( 'Silent update failed after resetting control : ' + ctrlId ); } )
.done( function() {
api.control.when( ctrlId, function() {
var ctrl = api.control( ctrlId );
$.when( $('.czr-crtl-reset-dialog', ctrl.container ).fadeOut('300') ).done( function() {
$.when( $('.czr-reset-success', ctrl.container ).fadeIn('300') ).done( function( $_el ) {
_.delay( function() {
$.when( $_el.fadeOut('300') ).done( function() {
self.setupActiveSkopedControls( { controls : [ ctrlId ] } ).done( function() {
if ( ctrl.czr_states ) {
_setResetDialogVisibility.call( ctrl );
ctrl.czr_states( 'noticeVisible' )( self.isCtrlNoticeVisible( ctrlId ) );
}
});
});
}, 500 );
});
});
});
});//done()
};//_silentUpdate
self[reset_method](ctrlId)
.done( function() {
api.consoleLog('REFRESH AFTER A SETTING RESET');
api.previewer.refresh()
.fail( function( refresh_data ) {
api.errorLog('Setting reset refresh failed.', refresh_data );
})
.done( function( refresh_data ) {
if ( 'global' == api.czr_skope( skope_id )().skope && '_resetControlAPIVal' == reset_method ) {
var _sentSkopeCollection,
_serverGlobalDbValues = {},
_skope_opt_name = api.czr_skope( skope_id )().opt_name;
if ( ! _.isUndefined( refresh_data.skopesServerData ) && _.has( refresh_data.skopesServerData, 'czr_skopes' ) ) {
_sentSkopeCollection = refresh_data.skopesServerData.czr_skopes;
if ( _.isUndefined( _.findWhere( _sentSkopeCollection, { opt_name : _skope_opt_name } ) ) ) {
_serverGlobalDbValues = _.findWhere( _sentSkopeCollection, { opt_name : _skope_opt_name } ).db || {};
}
}
api.czr_skopeBase.maybeSynchronizeGlobalSkope( { isGlobalReset : true, isSetting : true, settingIdToReset : setId } )
.done( function() {
_silentUpdate();
});
} else {
_silentUpdate();
}
});
});
};//_updateAPI
ctrl.czr_states( 'isResetting' )( true );
ctrl.container.addClass('czr-resetting-control');
api.czr_skopeReset[ ctrl.czr_states( 'isDirty' )() ? 'resetChangeset' : 'resetPublished' ](
{ skope_id : skope_id, setId : setId, is_setting : true } )
.done( function( r ) {
_updateAPI( ctrlId );
})
.fail( function( r ) {
api.errorLog( 'Reset failed', r );
$.when( $('.czr-crtl-reset-dialog', ctrl.container ).fadeOut('300') ).done( function() {
$.when( $('.czr-reset-fail', ctrl.container ).fadeIn('300') ).done( function() {
$('.czr-reset-fail', ctrl.container ).append('' + r + '
');
_.delay( function() {
_setResetDialogVisibility.call( ctrl );
self.setupActiveSkopedControls( { controls : [ ctrlId ] } );
}, 2000 );
});
});
});
},
_resetControlDirtyness : function( ctrlId ) {
var setId = api.CZR_Helpers.getControlSettingId( ctrlId ),
skope_instance = api.czr_skope( api.czr_activeSkopeId() ),
current_dirties = $.extend( true, {}, skope_instance.dirtyValues() ),
new_dirties = {},
current_changeset = $.extend( true, {}, skope_instance.changesetValues() ),
new_changeset = {},
dfd = $.Deferred();
new_dirties = _.omit( current_dirties, setId );
new_changeset = _.omit( current_changeset, setId );
skope_instance.dirtyValues( new_dirties );
skope_instance.changesetValues( new_dirties );
return dfd.resolve().promise();
},
_resetControlAPIVal : function( ctrlId ) {
var setId = api.CZR_Helpers.getControlSettingId( ctrlId ),
current_skope_db = api.czr_skope( api.czr_activeSkopeId() ).dbValues(),
new_skope_db = $.extend( true, {}, current_skope_db ),
dfd = $.Deferred();
if ( _.has( api.control( ctrlId ), 'czr_states') ) {
api.control(ctrlId).czr_states( 'hasDBVal' )( false );
api.czr_skope( api.czr_activeSkopeId() ).dbValues( _.omit( new_skope_db, setId ) );
}
return dfd.resolve().promise();
}
});//$.extend()
})( wp.customize , jQuery, _ );
/*****************************************************************************
* THE SKOPE BASE OBJECT
*****************************************************************************/
var CZRSkopeBaseMths = CZRSkopeBaseMths || {};
( function ( api, $, _ ) {
$.extend( CZRSkopeBaseMths, {
renderCtrlSkpNotIcon : function( controlIdCandidates ) {
var self = this,
controlIds = _.isArray(controlIdCandidates) ? controlIdCandidates : [controlIdCandidates];
_.each( controlIds, function( _id ) {
api.control.when( _id, function() {
var ctrl = api.control( _id );
ctrl.deferred.embedded.then( function() {
if( $('.czr-toggle-notice', ctrl.container ).length )
return;
$.when( ctrl.container
.find('.customize-control-title').first()//was.find('.customize-control-title')
.append( $( '', {
class : 'czr-toggle-notice fa fa-info-circle',
title : serverControlParams.i18n.skope['Display informations about the scope of this option.']
} ) ) )
.done( function(){
$('.czr-toggle-notice', ctrl.container).fadeIn( 400 );
});
});
});
});
},
updateCtrlSkpNot : function( controlIdCandidates, visible ) {
var self = this,
controlIds = _.isArray(controlIdCandidates) ? controlIdCandidates : [controlIdCandidates],
_isSkoped = function( setId ) {
return setId && self.isSettingSkopeEligible( setId );
},//filter only eligible ctrlIds
_generateControlNotice = function( setId, _localSkopeId ) {
var _currentSkopeId = api.czr_activeSkopeId(),
_inheritedFromSkopeId = self.getInheritedSkopeId( setId, _currentSkopeId ),
_overridedBySkopeId = self.getAppliedPrioritySkopeId( setId, _currentSkopeId ),
_html = [],
_isCustomized,
_hasDBVal;
if ( ! _isSkoped( setId ) ) {
_html.push( [
serverControlParams.i18n.skope['This option is always customized sitewide and cannot be reset.']
].join(' ') );
return _html.join(' | ');
}
if ( _inheritedFromSkopeId == _overridedBySkopeId && api.czr_skope.has( _inheritedFromSkopeId ) && _currentSkopeId == _inheritedFromSkopeId ) {
_isCustomized = ! _.isUndefined( api.czr_skope( _currentSkopeId ).dirtyValues()[setId] );
_hasDBVal = ! _.isUndefined( api.czr_skope( _currentSkopeId ).dbValues()[setId] );
if ( _isCustomized ) {
if ( 'global' == api.czr_skope( _inheritedFromSkopeId )().skope ) {
_html.push( [
serverControlParams.i18n.skope['Customized. Will be applied sitewide once published.'],
].join(' ') );
} else {
_html.push( [
serverControlParams.i18n.skope['Customized. Will be applied to'],
'' + api.czr_skope( _inheritedFromSkopeId )().ctx_title + '',
serverControlParams.i18n.skope['once published.']
].join(' ') );
}
} else {
if ( _hasDBVal ) {
if ( 'global' == api.czr_skope( _inheritedFromSkopeId )().skope ) {
_html.push( [
serverControlParams.i18n.skope['Customized and applied sitewide.'],
].join(' ') );
} else {
_html.push( [
serverControlParams.i18n.skope['Customized and applied to'],
'' + api.czr_skope( _inheritedFromSkopeId )().ctx_title + '.' + ''
].join(' ') );
}
} else {
_html.push( serverControlParams.i18n.skope['Default website value applied sitewide.'] );
}
}
}
if ( _inheritedFromSkopeId !== _currentSkopeId && api.czr_skope.has( _inheritedFromSkopeId ) ) {
_isCustomized = ! _.isUndefined( api.czr_skope( _inheritedFromSkopeId ).dirtyValues()[setId] );
_hasDBVal = ! _.isUndefined( api.czr_skope( _inheritedFromSkopeId ).dbValues()[setId] );
if ( ! _isCustomized && ! _hasDBVal ) {
_html.push(
[
serverControlParams.i18n.skope['Default website value.'],
serverControlParams.i18n.skope['You can customize this specifically for'],
'' + api.czr_skope( _currentSkopeId )().ctx_title + '.' + ''
].join(' ')
);
} else {
_html.push(
[
serverControlParams.i18n.skope['Currently inherited from'],
self.buildSkopeLink( _inheritedFromSkopeId ) + '.',
serverControlParams.i18n.skope['You can customize this specifically for'],
'' + api.czr_skope( _currentSkopeId )().ctx_title + '.' + ''
].join(' ')
);
}
}
if ( _overridedBySkopeId !== _currentSkopeId && api.czr_skope.has( _overridedBySkopeId ) ) {
_isCustomized = ! _.isUndefined( api.czr_skope( _overridedBySkopeId ).dirtyValues()[setId] );
_html.push( [
! _isCustomized ? serverControlParams.i18n.skope['The value currently applied to'] : serverControlParams.i18n.skope['The value that will be applied to'],
'' + api.czr_skope( _localSkopeId )().ctx_title + '',
! _isCustomized ? serverControlParams.i18n.skope['is set in'] : serverControlParams.i18n.skope['is customized in'],
self.buildSkopeLink( _overridedBySkopeId ),
serverControlParams.i18n.skope['which has a higher priority than the current option scope'],
'( ' + api.czr_skope( _currentSkopeId )().title + ' ).'
].join(' ') );
}
return _html.join(' | ');
};//_generateControlNotice
_.each( controlIds, function( _id ) {
api.control.when( _id, function() {
var ctrl = api.control( _id ),
setId = api.CZR_Helpers.getControlSettingId( _id ),//get the relevant setting_id for this control
_visible = _.isUndefined( visible ) ? ( ctrl.czr_states && ctrl.czr_states( 'noticeVisible' )() ) : visible;
if ( ! _visible )
return;
ctrl.deferred.embedded.then( function() {
var _localSkopeId = _.findWhere( api.czr_currentSkopesCollection(), { skope : 'local' } ).id,
$noticeContainer = ctrl.getNotificationsContainerElement();
if ( ! $noticeContainer || ! $noticeContainer.length || _.isUndefined( _localSkopeId ) )
return;
try {
_html = _generateControlNotice( setId, _localSkopeId );
} catch ( er ) {
api.errorLog( '_generateControlNotice : ' + er );
}
var $skopeNoticeEl = $( '.czr-skope-notice', $noticeContainer );
if ( $skopeNoticeEl.length ) {
$skopeNoticeEl.html( _html );
} else {
$noticeContainer.append(
[ '', _html ,'' ].join('')
);
}
});
});
});
},//updateCtrlSkpNot
isCtrlNoticeVisible : function( ctrlId ) {
if ( ! api.control.has( ctrlId ) )
return false;
var self = this,
setId = api.CZR_Helpers.getControlSettingId( ctrlId ),//get the relevant setting_id for this control
_currentSkopeId = api.czr_activeSkopeId(),
_overridedBySkopeId = self.getAppliedPrioritySkopeId( setId, _currentSkopeId ),
_isSkoped = function( setId ) {
return setId && self.isSettingSkopeEligible( setId );
};//filter only eligible ctrlIds
if ( 'global' != api.czr_skope( _currentSkopeId )().skope ) {
return true;
} else if ( _overridedBySkopeId !== _currentSkopeId && api.czr_skope.has( _overridedBySkopeId ) ) {
return true;
}
return false;
},
removeCtrlSkpNot : function( controlIdCandidates ) {
var self = this,
controlIds = _.isArray(controlIdCandidates) ? controlIdCandidates : [controlIdCandidates];
_.each( controlIds, function( _id ) {
api.control.when( _id, function() {
var ctrl = api.control( _id );
ctrl.deferred.embedded.then( function() {
var $noticeContainer = ctrl.getNotificationsContainerElement();
if ( ! $noticeContainer || ! $noticeContainer.length )
return;
var $skopeNoticeEl = $( '.czr-skope-notice', $noticeContainer );
if ( $skopeNoticeEl.length )
$skopeNoticeEl.remove();
});
});
});
}
});//$.extend()
})( wp.customize , jQuery, _ );
var CZRSkopeSaveMths = CZRSkopeSaveMths || {};
( function ( api, $, _ ) {
$.extend( CZRSkopeSaveMths, {
initialize: function() {
var self = this;
this.changesetStatus = 'publish';
this.saveBtn = $( '#save' );
},
save: function( args ) {
var self = this,
processing = api.state( 'processing' ),
submitWhenDoneProcessing,
parent = new api.Messenger({
url: api.settings.url.parent,
channel: 'loader',
});//this has to be reinstantiated because not accessible from core
self.globalSaveDeferred = $.Deferred();
self.previewer = api.previewer;
self.globalSkopeId = api.czr_skopeBase.getGlobalSkopeId();
self.saveArgs = args;
if ( args && args.status ) {
self.changesetStatus = args.status;
}
if ( api.state( 'saving' )() ) {
self.globalSaveDeferred.reject( 'already_saving' );
}
var alwaysAfterSubmission = function( response, state ) {
api.state( 'saving' )( false );
api.state( 'processing' ).set( 0 );
self.saveBtn.prop( 'disabled', false );
if ( ! _.isUndefined( response ) && response.setting_validities ) {
api._handleSettingValidities( {
settingValidities: response.setting_validities,
focusInvalidControl: true
} );
}
if ( 'pending' == state ) {
api.czr_serverNotification( { message: response, status : 'error' } );
} else {
}
},
resolveSave = function( params ) {
var response, resolveSaveDfd = $.Deferred();
api.state( 'saving' )( true );
self.fireAllSubmission( params )
.always( function( _response_ ) {
response = _response_.response;
alwaysAfterSubmission( response , this.state() );
})
.fail( function( _response_ ) {
response = _response_.response;
api.consoleLog('ALL SUBMISSIONS FAILED', response );
self.globalSaveDeferred.reject( response );
api.trigger( 'error', response );
resolveSaveDfd.resolve( _response_.hasNewMenu );
})
.done( function( _response_ ) {
response = _response_.response;
api.previewer.refresh( { waitSkopeSynced : true } )
.fail( function( refresh_data ) {
self.globalSaveDeferred.reject( self.previewer, [ response ] );
api.consoleLog('SAVE REFRESH FAIL', refresh_data );
})
.done( function( refresh_data ) {
api.previewer.send( 'saved', response );
response = _.extend( { changeset_status : 'publish' }, response || {} );
if ( api.czr_isChangeSetOn() ) {
var latestRevision = api._latestRevision;
api.state( 'changesetStatus' ).set( response.changeset_status );
if ( 'publish' === response.changeset_status ) {
api.each( function( setting ) {
/*
* Note that the setting revision will be undefined in the case of setting
* values that are marked as dirty when the customizer is loaded, such as
* when applying starter content. All other dirty settings will have an
* associated revision due to their modification triggering a change event.
*/
if ( setting._dirty && ( _.isUndefined( api._latestSettingRevisions[ setting.id ] ) || api._latestSettingRevisions[ setting.id ] <= latestRevision ) ) {
setting._dirty = false;
}
} );
api.state( 'changesetStatus' ).set( '' );
api.settings.changeset.uuid = response.next_changeset_uuid;
parent.send( 'changeset-uuid', api.settings.changeset.uuid );
}
} else {
api.each( function ( value ) {
value._dirty = false;
} );
}
refresh_data = _.extend( {
previewer : refresh_data.previewer || self.previewer,
skopesServerData : refresh_data.skopesServerData || {},
},
refresh_data
);
self.reactWhenSaveDone( refresh_data.skopesServerData );
self.globalSaveDeferred.resolveWith( self.previewer, [ response ] );
api.trigger( 'saved', response || {} );
resolveSaveDfd.resolve( _response_.hasNewMenu );
});
});
return resolveSaveDfd.promise();
};//resolveSave
if ( 0 === processing() ) {
resolveSave().done( function( hasNewMenu ) {
if ( hasNewMenu ) {
resolveSave( { saveGlobal :false, saveSkopes : true } );
}
} );
} else {
submitWhenDoneProcessing = function () {
if ( 0 === processing() ) {
api.state.unbind( 'change', submitWhenDoneProcessing );
resolveSave();
}
};
api.state.bind( 'change', submitWhenDoneProcessing );
}
return self.globalSaveDeferred.promise();
}//save
});//$.extend
})( wp.customize , jQuery, _ );
var CZRSkopeSaveMths = CZRSkopeSaveMths || {};
( function ( api, $, _ ) {
$.extend( CZRSkopeSaveMths, {
getSubmitPromise : function( skope_id ) {
var self = this,
dfd = $.Deferred(),
submittedChanges = {};
if ( _.isEmpty( skope_id ) || ! api.czr_skope.has( skope_id ) ) {
api.consoleLog( 'getSubmitPromise : no skope id requested OR skope_id not registered : ' + skope_id );
return dfd.resolve().promise();
}
var skopeObjectToSubmit = api.czr_skope( skope_id )();
if ( ! api.czr_skope( skope_id ).dirtyness() && skope_id !== self.globalSkopeId ) {
return dfd.resolve().promise();
}
_.each( api.czr_skopeBase.getSkopeDirties( skope_id ) , function( dirtyValue, settingId ) {
submittedChanges[ settingId ] = _.extend(
{ value: dirtyValue }
);
} );
this.submit(
{
skope_id : skope_id,
customize_changeset_data : submittedChanges,//{}
dyn_type : skopeObjectToSubmit.dyn_type
})
.done( function(_resp) {
dfd.resolve( _resp );
} )
.fail( function( _resp ) {
api.consoleLog('GETSUBMIT FAILED PROMISE FOR SKOPE : ', skope_id, _resp );
dfd.reject( _resp );
} );
return dfd.promise();
},//getSubmitPromise
submit : function( params ) {
var self = this,
default_params = {
skope_id : null,
the_dirties : {},
customize_changeset_data : {},
dyn_type : null,
opt_name : null
},
invalidSettings = [],
modifiedWhileSaving = {},
invalidControls,
submit_dfd = $.Deferred();
params = $.extend( default_params, params );
if ( _.isNull( params.skope_id ) ) {
throw new Error( 'OVERRIDEN SAVE::submit : MISSING skope_id');
}
if ( _.isNull( params.the_dirties ) ) {
throw new Error( 'OVERRIDEN SAVE::submit : MISSING the_dirties');
}
/*
* Block saving if there are any settings that are marked as
* invalid from the client (not from the server). Focus on
* the control.
*/
if ( _.has( api, 'Notification') ) {
api.each( function( setting ) {
setting.notifications.each( function( notification ) {
if ( 'error' === notification.type ) {
api.consoleLog('NOTIFICATION ERROR on SUBMIT SAVE' , notification );
}
if ( 'error' === notification.type && ( ! notification.data || ! notification.data.from_server ) ) {
invalidSettings.push( setting.id );
if ( ! settingInvalidities[ setting.id ] ) {
settingInvalidities[ setting.id ] = {};
}
settingInvalidities[ setting.id ][ notification.code ] = notification;
}
} );
} );
invalidControls = api.findControlsForSettings( invalidSettings );
if ( ! _.isEmpty( invalidControls ) ) {
_.values( invalidControls )[0][0].focus();
return submit_dfd.rejectWith( self.previewer, [
{ setting_invalidities: settingInvalidities }
] ).promise();
}
}
var query_params = {
skope_id : params.skope_id,
action : 'save',
the_dirties : params.the_dirties,
dyn_type : params.dyn_type,
opt_name : params.opt_name
};
if ( api.czr_isChangeSetOn() ) {
$.extend( query_params, { excludeCustomizedSaved: false } );
}
/*
* Note that excludeCustomizedSaved is intentionally false so that the entire
* set of customized data will be included if bypassed changeset update.
*/
var query = $.extend( self.previewer.query( query_params ), {
nonce: self.previewer.nonce.save,
customize_changeset_status: self.changesetStatus,
customize_changeset_data : JSON.stringify( params.customize_changeset_data )
} );
if ( api.czr_isChangeSetOn() ) {
if ( self.saveArgs && self.saveArgs.date ) {
query.customize_changeset_date = self.saveArgs.date;
}
if ( self.saveArgs && self.saveArgs.title ) {
query.customize_changeset_title = self.saveArgs.title;
}
}
/*
* Note that the dirty customized values will have already been set in the
* changeset and so technically query.customized could be deleted. However,
* it is remaining here to make sure that any settings that got updated
* quietly which may have not triggered an update request will also get
* included in the values that get saved to the changeset. This will ensure
* that values that get injected via the saved event will be included in
* the changeset. This also ensures that setting values that were invalid
* will get re-validated, perhaps in the case of settings that are invalid
* due to dependencies on other settings.
*/
var request = wp.ajax.post(
'global' !== query.skope ? 'customize_skope_changeset_save' : 'customize_save',
query
);
self.saveBtn.prop( 'disabled', true );
api.trigger( 'save', request );
request.fail( function ( response ) {
api.consoleLog('SUBMIT REQUEST FAIL', params.skope_id, response );
if ( '0' === response ) {
response = 'not_logged_in';
} else if ( '-1' === response ) {
response = 'invalid_nonce';
}
if ( 'invalid_nonce' === response ) {
self.previewer.cheatin();
} else if ( 'not_logged_in' === response ) {
self.previewer.preview.iframe.hide();
self.previewer.login().done( function() {
self.previewer.save();
self.previewer.preview.iframe.show();
} );
}
api.trigger( 'error', response );
submit_dfd.reject( response );
} );
request.done( function( response ) {
submit_dfd.resolve( response );
} );
return submit_dfd.promise();
}//submit()
});//$.extend
})( wp.customize , jQuery, _ );
var CZRSkopeSaveMths = CZRSkopeSaveMths || {};
( function ( api, $, _ ) {
$.extend( CZRSkopeSaveMths, {
fireAllSubmission : function( params ) {
var self = this,
dfd = $.Deferred(),
skopesToSave = [],
_recursiveCallDeferred = $.Deferred(),
_responses_ = {},
_promises = [],
failedPromises = [],
_defaultParams = {
saveGlobal : true,
saveSkopes : true
};
params = $.extend( _defaultParams, params );
_.each( api.czr_skopeCollection(), function( _skp_ ) {
if ( 'global' !== _skp_.skope ) {
skopesToSave.push( _skp_.id );
}
});
var _mayBeresolve = function( _index ) {
if ( ! _.isUndefined( skopesToSave[ _index + 1 ] ) || _promises.length != skopesToSave.length )
return;
if ( _.isEmpty( failedPromises ) ) {
_recursiveCallDeferred.resolve( _responses_ );
} else {
var _buildResponse = function() {
var _failedResponse = [];
_.each( failedPromises, function( _r ) {
_failedResponse.push( api.czr_skopeBase.buildServerResponse( _r ) );
} );
return $.trim( _failedResponse.join( ' | ') );
};
_recursiveCallDeferred.reject( _buildResponse() );
}
return true;
};
var recursiveCall = function( _index ) {
_index = _index || 0;
if ( _.isUndefined( skopesToSave[_index] ) ) {
api.consoleLog( 'Undefined Skope in Save recursive call ', _index, _skopesToUpdate, _skopesToUpdate[_index] );
_recursiveCallDeferred.resolve( _responses_ );
}
self.getSubmitPromise( skopesToSave[ _index ] )
.always( function() { _promises.push( _index ); } )
.fail( function( response ) {
failedPromises.push( response );
api.consoleLog('RECURSIVE PUSH FAIL FOR SKOPE : ', skopesToSave[_index] );
if ( ! _mayBeresolve( _index ) )
recursiveCall( _index + 1 );
} )
.done( function( response ) {
response = response || {};
if ( _.isEmpty( _responses_ ) ) {
_responses_ = response || {};
} else {
_responses_ = $.extend( _responses_ , response );
}
if ( ! _mayBeresolve( _index ) )
recursiveCall( _index + 1 );
} );
return _recursiveCallDeferred.promise();
};
var _globalHasNewMenu = false;
_.each( api.czr_skope('global__all_').dirtyValues(), function( _setDirtVal , _setId ) {
if ( 'nav_menu[' != _setId.substring( 0, 'nav_menu['.length ) )
return;
_globalHasNewMenu = true;
} );
var _submitGlobal = function() {
self.getSubmitPromise( self.globalSkopeId )
.fail( function( r ) {
api.consoleLog('GLOBAL SAVE SUBMIT FAIL', r );
r = api.czr_skopeBase.buildServerResponse( r );
dfd.reject( r );
})
.done( function( r ) {
if ( _.isEmpty( _responses_ ) ) {
_responses_ = r || {};
} else {
_responses_ = $.extend( _responses_ , r );
}
dfd.resolve( { response : _responses_, hasNewMenu : _globalHasNewMenu } );
});
};
if ( _globalHasNewMenu && params.saveGlobal ) {
_submitGlobal();
} else {
if ( params.saveGlobal && params.saveSkopes ) {
recursiveCall()
.fail( function( r ) {
api.consoleLog('RECURSIVE SAVE CALL FAIL', r );
dfd.reject( r );
})
.done( function( r ) {
self.cleanSkopeChangesetMetas().always( function() { _submitGlobal(); } );
});
} else if ( params.saveGlobal && ! params.saveSkopes ) {
_submitGlobal();
} else if ( ! params.saveGlobal && params.saveSkopes ) {
recursiveCall()
.fail( function( r ) {
api.consoleLog('RECURSIVE SAVE CALL FAIL', r );
dfd.reject( r );
})
.done( function( r ) {
if ( _.isEmpty( _responses_ ) ) {
_responses_ = r || {};
} else {
_responses_ = $.extend( _responses_ , r );
}
self.cleanSkopeChangesetMetas().always( function() {
dfd.resolve( { response : _responses_, hasNewMenu : _globalHasNewMenu } );
});
});
}
}//else
return dfd.promise();
},//fireAllSubmissions
cleanSkopeChangesetMetas : function() {
var self = this,
dfd = $.Deferred();
_query = $.extend(
api.previewer.query(),
{ nonce: api.previewer.nonce.save }
);
wp.ajax.post( 'czr_clean_skope_changeset_metas_after_publish' , _query )
.always( function () { dfd.resolve(); })
.fail( function ( response ) { api.consoleLog( 'cleanSkopeChangesetMetas failed', _query, response ); })
.done( function( response ) { api.consoleLog( 'cleanSkopeChangesetMetas done', _query, response ); });
return dfd.promise();
}
});//$.extend
})( wp.customize , jQuery, _ );
var CZRSkopeSaveMths = CZRSkopeSaveMths || {};
( function ( api, $, _ ) {
$.extend( CZRSkopeSaveMths, {
reactWhenSaveDone : function( skopesServerData ) {
var saved_dirties = {};
skopesServerData = _.extend(
{
czr_skopes : [],
isChangesetDirty : false
},
skopesServerData
);
_.each( api.czr_skopeCollection(), function( _skp_ ) {
saved_dirties[ _skp_.opt_name ] = api.czr_skopeBase.getSkopeDirties( _skp_.id );
api.czr_skope( _skp_.id ).dirtyValues( {} );
api.czr_skope( _skp_.id ).changesetValues( {} );
});
var _notSyncedSettings = [],
_sentSkopeCollection = skopesServerData.czr_skopes;
api.consoleLog('REACT WHEN SAVE DONE', saved_dirties, _sentSkopeCollection );
_.each( saved_dirties, function( skp_data, _saved_opt_name ) {
_.each( skp_data, function( _val, _setId ) {
if ( _.isUndefined( _.findWhere( _sentSkopeCollection, { opt_name : _saved_opt_name } ) ) )
return;
if ( ! api.czr_skopeBase.isSettingSkopeEligible( _setId ) )
return;
var sent_skope_db_values = _.findWhere( _sentSkopeCollection, { opt_name : _saved_opt_name } ).db,
sent_skope_level = _.findWhere( _sentSkopeCollection, { opt_name : _saved_opt_name } ).skope,
wpSetId = api.CZR_Helpers.build_setId( _setId ),
shortSetId = api.CZR_Helpers.getOptionName( _setId ),
sent_set_val = sent_skope_db_values[wpSetId];
if ( _.isUndefined( sent_set_val ) && 'global' == sent_skope_level && _val === serverControlParams.defaultOptionsValues[shortSetId] )
return;
if ( _.isUndefined( sent_set_val ) || ! _.isEqual( sent_set_val, _val ) ) {
_notSyncedSettings.push( { opt_name : _saved_opt_name, setId : wpSetId, server_val : sent_set_val, api_val : _val } );
}
});
});
if ( ! _.isEmpty( _notSyncedSettings ) ) {
api.consoleLog('SOME SETTINGS HAVE NOT BEEN PROPERLY SAVED : ', _notSyncedSettings );
} else {
api.consoleLog('ALL RIGHT, SERVER AND API ARE SYNCHRONIZED AFTER SAVE' );
}
api.czr_skopeBase.maybeSynchronizeGlobalSkope();
api.czr_skopeBase.updateCtrlSkpNot( api.CZR_Helpers.getSectionControlIds() );
var _setupSectionCtrlNotices = function() {
var sectionCtrls = api.CZR_Helpers.getSectionControlIds( api.czr_activeSectionId() );
_.each( sectionCtrls, function( ctrlId ) {
if ( ! api.has( ctrlId ) || _.isUndefined( api.control( ctrlId ) ) )
return;
var ctrl = api.control( ctrlId );
if ( ! _.has( ctrl, 'czr_states' ) )
return;
ctrl.czr_states( 'noticeVisible' )( api.czr_skopeBase.isCtrlNoticeVisible( ctrlId ) );
});
};
}
});//$.extend
})( wp.customize , jQuery, _ );
var CZRSkopeResetMths = CZRSkopeResetMths || {};
( function ( api, $, _ ) {
$.extend( CZRSkopeResetMths, {
initialize: function() {
var self = this;
self.previewer = api.previewer;
api.state.create('czr-resetting')(false);
api.state('czr-resetting').bind( function( state ) {
$( document.body ).toggleClass( 'czr-resetting', false !== state );
});
},
resetChangeset : function( args ) {
var dfd = $.Deferred(),
self = this,
processing = api.state( 'processing' ),
submitWhenPossible,
submit_reset,
request,
requestAjaxAction,
query_params,
query,
defaults = {
is_setting : false,
is_skope : false,
skope_id : api.czr_activeSkopeId() || '',
setId : ''
};
args = _.extend( defaults, args );
var skope_id = args.skope_id,
setId = args.setId;
if( ! api.czr_isChangeSetOn() )
return dfd.resolve().promise();
submit_reset = function( skope_id, setId ) {
if ( _.isUndefined( skope_id ) ) {
throw new Error( 'RESET: MISSING skope_id');
}
api.state( 'czr-resetting' )( true );
query_params = {
skope_id : skope_id,
action : 'reset'
};
query = $.extend(
self.previewer.query( query_params ),
{ nonce: self.previewer.nonce.save }
);
if ( args.is_setting ) {
$.extend( query , { setting_id : setId } );
requestAjaxAction = 'czr_changeset_setting_reset';
} else if ( args.is_skope ) {
requestAjaxAction = 'czr_changeset_skope_reset';
} else {
return dfd.reject( 'reset_ajax_action_not_specified' ).promise();
}
wp.ajax.post( requestAjaxAction , query )
.always( function () {
api.state( 'czr-resetting' )( false );
})
.fail( function ( response ) {
if ( '0' === response ) {
response = 'not_logged_in';
} else if ( '-1' === response ) {
response = 'invalid_nonce';
}
if ( 'invalid_nonce' === response ) {
self.previewer.cheatin();
} else if ( 'not_logged_in' === response ) {
self.previewer.preview.iframe.hide();
self.previewer.login().done( function() {
self.resetChangeset( args );
self.previewer.preview.iframe.show();
} );
}
api.consoleLog( requestAjaxAction + ' failed ', query, response );
response = api.czr_skopeBase.buildServerResponse( response );
api.trigger( 'error', response );
api.czr_serverNotification( { message: response, status : 'error' } );
dfd.reject( response );
})
.done( function( response ) {
dfd.resolve( response );
});
};//submit_reset()
if ( 0 === processing() && false === api.state( 'czr-resetting' )() ) {
submit_reset( skope_id, setId );
} else {
submitWhenPossible = function () {
if ( 0 === processing() && false === api.state( 'czr-resetting' )() ) {
api.state.unbind( 'change', submitWhenPossible );
submit_reset( skope_id, setId );
}
};
api.state.bind( 'change', submitWhenPossible );
}
return dfd.promise();
},
resetPublished : function( args ) {
var dfd = $.Deferred(),
self = this,
processing = api.state( 'processing' ),
submitWhenPossible,
submit_reset,
request,
requestAjaxAction,
query_params,
query,
defaults = {
is_setting : false,
is_skope : false,
skope_id : api.czr_activeSkopeId() || '',
setId : ''
};
args = _.extend( defaults, args );
var skope_id = args.skope_id,
setId = args.setId;
submit_reset = function( skope_id, setId ) {
if ( _.isUndefined( skope_id ) ) {
throw new Error( 'RESET: MISSING skope_id');
}
api.state( 'czr-resetting' )( true );
query_params = {
skope_id : skope_id,
action : 'reset'
};
query = $.extend(
self.previewer.query( query_params ),
{ nonce: self.previewer.nonce.save }
);
if ( args.is_setting ) {
$.extend( query , { setting_id : setId } );
requestAjaxAction = 'czr_published_setting_reset';
} else if ( args.is_skope ) {
requestAjaxAction = 'czr_published_skope_reset';
} else {
return dfd.reject( 'reset_ajax_action_not_specified' ).promise();
}
api.consoleLog('in czr_reset submit : ', skope_id, query );
wp.ajax.post( requestAjaxAction , query )
.always( function () {
api.state( 'czr-resetting' )( false );
})
.fail( function ( response ) {
if ( '0' === response ) {
response = 'not_logged_in';
} else if ( '-1' === response ) {
response = 'invalid_nonce';
}
if ( 'invalid_nonce' === response ) {
self.previewer.cheatin();
} else if ( 'not_logged_in' === response ) {
self.previewer.preview.iframe.hide();
self.previewer.login().done( function() {
self.resetChangeset( args );
self.previewer.preview.iframe.show();
} );
}
api.consoleLog( requestAjaxAction + ' failed ', query, response );
response = api.czr_skopeBase.buildServerResponse( response );
api.trigger( 'error', response );
api.czr_serverNotification( { message: response, status : 'error' } );
dfd.reject( response );
})
.done( function( response ) {
dfd.resolve( response );
});
};//submit_reset()
if ( 0 === processing() && false === api.state( 'czr-resetting' )() ) {
submit_reset( skope_id, setId );
} else {
submitWhenPossible = function () {
if ( 0 === processing() && false === api.state( 'czr-resetting' )() ) {
api.state.unbind( 'change', submitWhenPossible );
submit_reset( skope_id, setId );
}
};
api.state.bind( 'change', submitWhenPossible );
}
return dfd.promise();
}
});//$.extend
})( wp.customize , jQuery, _ );
var CZRSkopeBaseMths = CZRSkopeBaseMths || {};
( function ( api, $, _ ) {
$.extend( CZRSkopeBaseMths, {
initWidgetSidebarSpecifics : function() {
var self = this;
if ( ! self.isExcludedSidebarsWidgets() ) {
api.czr_activeSkopeId.bind( function( active_skope ) {
self.forceSidebarDirtyRefresh( api.czr_activeSectionId(), active_skope );
});
}
$( document ).bind( 'widget-added', function( e, $o ) {
if ( self.isExcludedSidebarsWidgets() )
return;
var wgtIdAttr = $o.closest('.customize-control').attr('id'),
wdgtSetId = api.czr_skopeBase.widgetIdToSettingId( wgtIdAttr, 'customize-control-' );
if ( ! api.has( wdgtSetId ) ) {
throw new Error( 'AN ADDED WIDGET COULD NOT BE BOUND IN SKOPE. ' + wdgtSetId);
} else {
self.listenAPISettings( wdgtSetId );
}
});
},
forceSidebarDirtyRefresh : function( active_section, active_skope ) {
var self = this;
if ( self.isExcludedSidebarsWidgets() )
return;
var _save_state = api.state('saved')();
var _debounced = function() {
if ( api.section.has( active_section ) && "sidebar" == api.section(active_section).params.type ) {
var active_skope = active_skope || api.czr_activeSkopeId(),
related_setting_name = 'sidebars_widgets[' + api.section(active_section).params.sidebarId + ']',
related_setting_val = self.getSkopeSettingVal( related_setting_name, active_skope );
api.czr_skope( active_skope ).updateSkopeDirties( related_setting_name, related_setting_val );
api.previewer.refresh( { the_dirties : api.czr_skope( active_skope ).dirtyValues() } )
.done( function() {
api.state('saved')( _save_state );
});
}
};
_debounced = _.debounce( _debounced, 500 );
_debounced();
}
} );//$.extend
})( wp.customize , jQuery, _ );
var CZRSkopeMths = CZRSkopeMths || {};
( function ( api, $, _ ) {
$.extend( CZRSkopeMths, {
/*****************************************************************************
* THE SKOPE MODEL
*****************************************************************************/
initialize: function( skope_id, constructor_options ) {
var skope = this;
api.Value.prototype.initialize.call( skope, null, constructor_options );
skope.isReady = $.Deferred();
skope.embedded = $.Deferred();
skope.el = 'czr-scope-' + skope_id;//@todo replace with a css selector based on the scope name
$.extend( skope, constructor_options || {} );
skope.visible = new api.Value( true );
skope.winner = new api.Value( false ); //is this skope the one that will be applied on front end in the current context?
skope.priority = new api.Value(); //shall this skope always win or respect the default skopes priority
skope.active = new api.Value( false ); //active, inactive. Are we currently customizing this skope ?
skope.dirtyness = new api.Value( false ); //true or false : has this skope been customized ?
skope.skopeResetDialogVisibility = new api.Value( false );
skope.hasDBValues = new api.Value( false );
skope.dirtyValues = new api.Value({});//stores the current customized value.
skope.dbValues = new api.Value({});//stores the latest db values => will be updated on each skope synced event
skope.changesetValues = new api.Value({});//stores the latest changeset values => will be updated on each skope synced eventsynced event
skope.userEventMap = new api.Value( [
{
trigger : 'click keydown',
selector : '.czr-scope-switch, .czr-skp-switch-link',
name : 'skope_switch',
actions : function() {
api.czr_activeSkopeId( skope().id );
}
},
{
trigger : 'click keydown',
selector : '.czr-scope-reset',
name : 'skope_reset_warning',
actions : 'reactOnSkopeResetUserRequest'
}
]);//module.userEventMap
skope.skopeResetDialogVisibility.bind( function( to, from ) {
return skope.skopeResetDialogReact( to );
}, { deferred : true } );
skope.dirtyValues.callbacks.add(function() { return skope.dirtyValuesReact.apply(skope, arguments ); } );
skope.changesetValues.callbacks.add(function() { return skope.changesetValuesReact.apply(skope, arguments ); } );
skope.dbValues.callbacks.add(function() { return skope.dbValuesReact.apply(skope, arguments ); } );
skope.callbacks.add(function() { return skope.skopeReact.apply( skope, arguments ); } );
skope.set( _.omit( constructor_options, function( _v, _key ) {
return _.contains( [ 'db', 'changeset', 'has_db_val' ], _key );
} ) );
skope.setupObservableViewValuesCallbacks();
skope.dirtyness( ! _.isEmpty( constructor_options.changeset ) );
skope.hasDBValues( ! _.isEmpty( constructor_options.db ) );
skope.winner( constructor_options.is_winner );
skope.embedded
.fail( function() {
throw new Error('The container of skope ' + skope().id + ' has not been embededd');
})
.done( function() {
skope.setupDOMListeners( skope.userEventMap() , { dom_el : skope.container } );
skope.isReady.resolve();
});
},//initialize
ready : function() {
var skope = this;
api.czr_skopeBase.skopeWrapperEmbedded.done( function() {
try {
$.when( skope.embedSkopeDialogBox() ).done( function( $_container ){
if ( false !== $_container.length ) {
$_container.css('background-color', skope.color );
skope.container = $_container;
skope.embedded.resolve( $_container );
} else {
skope.embedded.reject();
}
});
} catch( er ) {
api.errorLog( "In skope base : " + er );
skope.embedded.reject();
}
});
},
/*****************************************************************************
* SKOPE API DIRTIES REACTIONS
*****************************************************************************/
dirtyValuesReact : function( to, from ) {
var skope = this;
skope.dirtyness( ! _.isEmpty( to ) );
api.czr_dirtyness( ! _.isEmpty(to) );
var ctrlIdDirtynessToClean = [];
_.each( from, function( _val, _id ) {
if ( _.has( to, _id ) )
return;
ctrlIdDirtynessToClean.push( _id );
});
if ( skope().id == api.czr_activeSkopeId() ) {
_.each( ctrlIdDirtynessToClean , function( setId ) {
if ( ! _.has( api.control( setId ), 'czr_states') )
return;
api.control( setId ).czr_states( 'isDirty' )( false );
});
_.each( to, function( _val, _setId ) {
if ( ! _.has( api.control( _setId ), 'czr_states') )
return;
api.control( _setId ).czr_states( 'isDirty' )( true );
});
}
},
/*****************************************************************************
* SKOPE API CHANGESET REACTIONS
*****************************************************************************/
changesetValuesReact : function( to, from ) {
var skope = this,
_currentServerDirties = $.extend( true, {}, skope.dirtyValues() );
skope.dirtyValues( $.extend( _currentServerDirties, to ) );
},
/*****************************************************************************
* SKOPE DB VALUES REACTIONS
*****************************************************************************/
dbValuesReact : function( to, from ) {
var skope = this;
skope.hasDBValues(
! _.isEmpty(
'global' != skope().skope ?
to :
_.omit( to, function( _val, _id ) {
return ! api.czr_skopeBase.isThemeSetting( _id );
})
)
);
var ctrlIdDbToReset = [];
_.each( from, function( _val, _id ) {
if ( _.has( to, _id ) )
return;
ctrlIdDbToReset.push( _id );
});
if ( skope().id == api.czr_activeSkopeId() ) {
_.each( ctrlIdDbToReset , function( setId ) {
if ( ! _.has( api.control( setId ), 'czr_states') )
return;
api.control( setId ).czr_states( 'hasDBVal' )( false );
});
_.each( to, function( _val, _setId ) {
if ( ! _.has( api.control( _setId ), 'czr_states') )
return;
api.control( _setId ).czr_states( 'hasDBVal' )( true );
});
}
},
/*****************************************************************************
* SKOPE MODEL CHANGES CALLBACKS
*****************************************************************************/
skopeReact : function( to, from ) {
var skope = this,
_current_collection = [],
_new_collection = [];
if ( ! api.czr_skopeBase.isSkopeRegisteredInCollection( to.id ) ) {
_current_collection = $.extend( true, [], api.czr_skopeCollection() );
_current_collection.push( to );
api.czr_skopeCollection( _current_collection );
}
else {
_current_collection = $.extend( true, [], api.czr_skopeCollection() );
_new_collection = _current_collection;
_.each( _current_collection, function( _skope, _key ) {
if ( _skope.id != skope().id )
return;
_new_collection[_key] = to;
});
api.czr_skopeCollection( _new_collection );
}
},
/*****************************************************************************
* VALUES CALLBACKS WHEN SKOPE EMBEDDED AND READY
* => The skope container exists at this stage
*****************************************************************************/
setupObservableViewValuesCallbacks : function() {
var skope = this;
skope.visible.bind( function( is_visible ){
if ( 'pending' == skope.embedded.state() ) {
skope.embedded.done( function() {
skope.container.toggle( is_visible );
});
} else {
skope.container.toggle( is_visible );
}
});
skope.active.bind( function() {
if ( 'pending' == skope.embedded.state() ) {
skope.embedded.done( function() {
skope.activeStateReact.apply( skope, arguments );
});
} else {
skope.activeStateReact.apply( skope, arguments );
}
});
skope.dirtyness.bind( function() {
if ( 'pending' == skope.embedded.state() ) {
skope.embedded.done( function() {
skope.dirtynessReact.apply( skope, arguments );
});
} else {
skope.dirtynessReact.apply( skope, arguments );
}
});
skope.hasDBValues.bind( function() {
if ( 'pending' == skope.embedded.state() ) {
skope.embedded.done( function() {
skope.hasDBValuesReact.apply( skope, arguments );
});
} else {
skope.hasDBValuesReact.apply( skope, arguments );
}
});
skope.winner.bind( function() {
if ( 'pending' == skope.embedded.state() ) {
skope.embedded.done( function() {
skope.winnerReact.apply( skope, arguments );
});
} else {
skope.winnerReact.apply( skope, arguments );
}
});
},//setupObservableViewValuesCallbacks
activeStateReact : function( to, from ){
var skope = this;
skope.container.toggleClass('inactive', ! to ).toggleClass( 'active', to );
$('.czr-scope-switch', skope.container).toggleClass('fa-toggle-on', to).toggleClass('fa-toggle-off', !to);
},
dirtynessReact : function( to, from ) {
var skope = this;
$.when( this.container.toggleClass( 'dirty', to ) ).done( function() {
if ( to )
$( '.czr-scope-reset', skope.container).fadeIn('slow').attr('title', [ serverControlParams.i18n.skope['Reset the current customizations for'], skope().title ].join(' ') );
else if ( ! skope.hasDBValues() )
$( '.czr-scope-reset', skope.container).fadeOut('fast');
});
},
hasDBValuesReact : function( to, from ) {
var skope = this;
$.when( skope.container.toggleClass('has-db-val', to ) ).done( function() {
if ( to ) {
$( '.czr-scope-reset', skope.container)
.fadeIn( 'slow')
.attr( 'title', [
'global' == skope().skope ? serverControlParams.i18n.skope['Reset the theme options published sitewide'] : serverControlParams.i18n.skope['Reset your website published options for'],
'global' == skope().skope ? '' : skope().title
].join(' ') );
}
else if ( ! skope.dirtyness() ) {
$( '.czr-scope-reset', skope.container ).fadeOut('fast');
}
});
},
winnerReact : function( is_winner ) {
var skope = this;
this.container.toggleClass('is_winner', is_winner );
if ( is_winner ) {
_.each( api.czr_currentSkopesCollection(), function( _skope ) {
if ( _skope.id == skope().id )
return;
var _current_model = $.extend( true, {}, _skope );
$.extend( _current_model, { is_winner : false } );
api.czr_skope( _skope.id )( _current_model );
});
}
},
/*****************************************************************************
* HELPERS
*****************************************************************************/
updateSkopeDirties : function( setId, new_val ) {
var skope = this,
shortSetId = api.CZR_Helpers.getOptionName( setId );
if ( ! api.czr_skopeBase.isSettingSkopeEligible( setId ) && 'global' != skope().skope )
return api.czr_skope( api.czr_skopeBase.getGlobalSkopeId() ).updateSkopeDirties( setId, new_val );
var current_dirties = $.extend( true, {}, skope.dirtyValues() ),
_dirtyCustomized = {};
_dirtyCustomized[ setId ] = new_val;
skope.dirtyValues.set( $.extend( current_dirties , _dirtyCustomized ) );
return skope.dirtyValues();
},
getSkopeSettingDirtyness : function( setId ) {
var skope = this;
return skope.getSkopeSettingAPIDirtyness( setId ) || skope.getSkopeSettingChangesetDirtyness( setId );
},
getSkopeSettingAPIDirtyness : function( setId ) {
var skope = this;
return _.has( skope.dirtyValues(), api.CZR_Helpers.build_setId( setId ) );
},
getSkopeSettingChangesetDirtyness : function( setId ) {
var skope = this;
if ( ! api.czr_isChangeSetOn() )
return skope.getSkopeSettingAPIDirtyness( setId );
return _.has( skope.changesetValues(), api.CZR_Helpers.build_setId( setId ) );
},
hasSkopeSettingDBValues : function( setId ) {
var skope = this,
_setId = api.CZR_Helpers.build_setId(setId);
return ! _.isUndefined( api.czr_skope( api.czr_activeSkopeId() ).dbValues()[_setId] );
}
});//$.extend(
})( wp.customize , jQuery, _ );
var CZRSkopeMths = CZRSkopeMths || {};
( function ( api, $, _ ) {
$.extend( CZRSkopeMths, {
embedSkopeDialogBox : function() {
var skope = this,
skope_model = $.extend( true, {}, skope() ),
_tmpl = '';
if ( ! $('#customize-header-actions').find('.czr-scope-switcher').length ) {
throw new Error('The skope switcher wrapper is not printed, the skope can not be embedded.');
}
try {
_tmpl = wp.template('czr-skope')( _.extend( skope_model, { el : skope.el } ) );
} catch( er ) {
api.errorLog( 'Error when parsing the template of a skope' + er );
return false;
}
$('.czr-skopes-wrapper', '#customize-header-actions').append( $( _tmpl ) );
return $( '.' + skope.el , '.czr-skopes-wrapper' );
},
/*****************************************************************************
* RESET
*****************************************************************************/
renderResetWarningTmpl : function() {
var skope = this,
skope_model = $.extend( true, {}, skope() ),
_tmpl = '',
warning_message,
success_message;
if ( skope.dirtyness() ) {
warning_message = [
serverControlParams.i18n.skope['Please confirm that you want to reset your current ( not published ) customizations for'],
skope().ctx_title
].join(' ');
success_message = [
serverControlParams.i18n.skope['Your customizations have been reset for'],
skope().ctx_title
].join(' ');
} else {
warning_message = [
'global' == skope().skope ? serverControlParams.i18n.skope['Please confirm that you want to reset your sitewide published customizations. Note : this will not reset the customizations made in other option scopes'] : serverControlParams.i18n.skope['Please confirm that you want to reset your published customizations for'],
'global' == skope().skope ? '' : skope().ctx_title
].join(' ');
success_message = [
serverControlParams.i18n.skope['Your published customizations have been reset for'],
skope().title
].join(' ');
}
try {
_tmpl = wp.template( 'czr-skope-pane' )(
_.extend( skope_model, {
el : skope.el,
warning_message : warning_message + '.',
success_message : success_message + '.'
} )
);
} catch( er ) {
api.errorLog( 'Error when parsing the the reset skope template : ' + er );
return false;
}
$('#customize-preview').after( $( _tmpl ) );
return $( '#czr-skope-pane' );
},
/*****************************************************************************
* HELPERS
*****************************************************************************/
getEl : function() {
var skope = this;
return $( skope.el, '#customize-header-actions');
}
});//$.extend()
})( wp.customize , jQuery, _ );
var CZRSkopeMths = CZRSkopeMths || {};
( function ( api, $, _ ) {
$.extend( CZRSkopeMths, {
/*****************************************************************************
* RESET
*****************************************************************************/
reactOnSkopeResetUserRequest : function() {
var skope = this,
_fireReaction = function() {
api.state( 'czr-resetting')( true );
if ( api.czr_activeSkopeId() != skope().id ) {
api.czr_activeSkopeId( skope().id )
.done( function() {
skope.skopeResetDialogVisibility( ! skope.skopeResetDialogVisibility() ).done( function() {
api.state( 'czr-resetting')( false );
});
});
} else {
skope.skopeResetDialogVisibility( ! skope.skopeResetDialogVisibility() ).done( function() {
api.state( 'czr-resetting')( false );
});
}
};
if ( ( api.state( 'czr-resetting')() || 0 !== api.state( 'processing' )() ) ) {
api.czr_serverNotification( {
message: 'Slow down, you move too fast !',
status : 'success',
auto_collapse : true
});
return;
}
if ( api.czr_activeSkopeId() != skope().id && api.czr_skope( api.czr_activeSkopeId() ).skopeResetDialogVisibility() ) {
api.czr_skope( api.czr_activeSkopeId() ).skopeResetDialogVisibility( false ).done( function() {
_fireReaction();
});
} else {
_fireReaction();
}
},
skopeResetDialogReact : function( visible ) {
var skope = this, dfd = $.Deferred();
skope.userResetEventMap = skope.userResetEventMap || new api.Value( [
{
trigger : 'click keydown',
selector : '.czr-scope-reset-cancel',
name : 'skope_reset_cancel',
actions : function() {
skope.skopeResetDialogVisibility( ! skope.skopeResetDialogVisibility() );
}
},
{
trigger : 'click keydown',
selector : '.czr-scope-do-reset',
name : 'skope_do_reset',
actions : 'doResetSkopeValues'
}
]
);
if ( visible ) {
api.czr_isResettingSkope( skope().id );
$.when( skope.renderResetWarningTmpl() ).done( function( $_container ) {
skope.resetPanel = $_container;
skope.resetPanel.addClass( skope.dirtyness() ? 'dirty-reset' : 'db-reset' );
skope.setupDOMListeners( skope.userResetEventMap() , { dom_el : skope.resetPanel } );
}).then( function() {
setTimeout( function() {
var _height = $('#customize-preview').height();
skope.resetPanel.css( 'line-height', _height +'px' ).css( 'height', _height + 'px' );
$('body').addClass('czr-skope-pane-open');
}, 50 );
});
} else {
$.when( $('body').removeClass('czr-skope-pane-open') ).done( function() {
if ( _.has( skope, 'resetPanel') && false !== skope.resetPanel.length ) {
setTimeout( function() {
skope.resetPanel.remove();
api.czr_isResettingSkope( false );
}, 300 );
}
});
}
_.delay( function() { dfd.resolve(); }, 350 );
return dfd.promise();
},
doResetSkopeValues : function() {
var skope = this,
skope_id = skope().id,
reset_method = skope.dirtyness() ? '_resetSkopeDirties' : '_resetSkopeAPIValues',
_updateAPI = function() {
var _silentUpdate = function() {
api.czr_skopeBase.processSilentUpdates( { refresh : false } )
.fail( function() { api.consoleLog( 'Silent update failed after resetting skope : ' + skope_id ); } )
.done( function() {
$.when( $('.czr-reset-warning', skope.resetPanel ).fadeOut('300') ).done( function() {
$.when( $('.czr-reset-success', skope.resetPanel ).fadeIn('300') ).done( function() {
_.delay( function() {
api.czr_isResettingSkope( false );
skope.skopeResetDialogVisibility( false );
}, 2000 );
});
});
});
};
skope[reset_method]()
.done( function() {
api.previewer.refresh()
.fail( function( refresh_data ) {
api.consoleLog('SKOPE RESET REFRESH FAILED', refresh_data );
})
.done( function( refresh_data ) {
if ( 'global' == api.czr_skope( skope_id )().skope && '_resetSkopeAPIValues' == reset_method ) {
var _sentSkopeCollection,
_serverGlobalDbValues = {},
_skope_opt_name = api.czr_skope( skope_id )().opt_name;
if ( ! _.isUndefined( refresh_data.skopesServerData ) && _.has( refresh_data.skopesServerData, 'czr_skopes' ) ) {
_sentSkopeCollection = refresh_data.skopesServerData.czr_skopes;
if ( _.isUndefined( _.findWhere( _sentSkopeCollection, { opt_name : _skope_opt_name } ) ) ) {
_serverGlobalDbValues = _.findWhere( _sentSkopeCollection, { opt_name : _skope_opt_name } ).db || {};
}
}
api.czr_skopeBase.maybeSynchronizeGlobalSkope( { isGlobalReset : true, isSkope : true, skopeIdToReset : skope_id } )
.done( function() {
_silentUpdate();
});
} else {
_silentUpdate();
}
});
});
};//_updateAPI
$('body').addClass('czr-resetting-skope');
api.czr_skopeReset[ skope.dirtyness() ? 'resetChangeset' : 'resetPublished' ](
{ skope_id : skope().id, is_skope : true } )
.always( function() {
$('body').removeClass('czr-resetting-skope');//hides the spinner
})
.done( function( r ) {
_updateAPI();
})
.fail( function( r ) {
skope.skopeResetDialogVisibility( false );
api.consoleLog('Skope reset failed', r );
});
},
_resetSkopeDirties : function() {
var skope = this, dfd = $.Deferred();
skope.dirtyValues({});
skope.changesetValues({});
return dfd.resolve().promise();
},
_resetSkopeAPIValues : function() {
var skope = this, dfd = $.Deferred();
skope.dbValues( {} );
return dfd.resolve().promise();
}
});//$.extend(
})( wp.customize , jQuery, _ );
( function ( api, $, _ ) {
/*****************************************************************************
* A "CONTEXT AWARE" SET METHD
*****************************************************************************/
/**
* OVERRIDES BASE api.Value method
* => adds the o {} param, allowing to pass additional contextual informations.
*
* Set the value and trigger all bound callbacks.
*
* @param {object} to New value.
*/
api.Value.prototype.set = function( to, o ) {
var from = this._value, dfd = $.Deferred(), self = this, _promises = [];
to = this._setter.apply( this, arguments );
to = this.validate( to );
args = _.extend( { silent : false }, _.isObject( o ) ? o : {} );
if ( null === to || _.isEqual( from, to ) ) {
return dfd.resolveWith( self, [ to, from, o ] ).promise();
}
this._value = to;
this._dirty = true;
if ( true === args.silent ) {
return dfd.resolveWith( self, [ to, from, o ] ).promise();
}
if ( this._deferreds ) {
_.each( self._deferreds, function( _prom ) {
_promises.push( _prom.apply( null, [ to, from, o ] ) );
});
$.when.apply( null, _promises )
.fail( function() { api.errorLog( 'A deferred callback failed in api.Value::set()'); })
.then( function() {
self.callbacks.fireWith( self, [ to, from, o ] );
dfd.resolveWith( self, [ to, from, o ] );
});
} else {
this.callbacks.fireWith( this, [ to, from, o ] );
return dfd.resolveWith( self, [ to, from, o ] ).promise( self );
}
return dfd.promise( self );
};
api.Value.prototype.bind = function() {
var self = this,
_isDeferred = false,
_cbs = [];
$.each( arguments, function( _key, _arg ) {
if ( ! _isDeferred )
_isDeferred = _.isObject( _arg ) && _arg.deferred;
if ( _.isFunction( _arg ) )
_cbs.push( _arg );
});
if ( _isDeferred ) {
self._deferreds = self._deferreds || [];
_.each( _cbs, function( _cb ) {
if ( ! _.contains( _cb, self._deferreds ) )
self._deferreds.push( _cb );
});
} else {
self.callbacks.add.apply( self.callbacks, arguments );
}
return this;
};
/*****************************************************************************
* A SILENT SET METHOD :
* => keep the dirtyness param unchanged
* => stores the api state before callback calls, and reset it after
* => add an object param to the callback to inform that this is a silent process
* , this is typically used in the overridden api.Setting.preview method
*****************************************************************************/
api.Setting.prototype.silent_set =function( to, dirtyness ) {
var from = this._value,
_save_state = api.state('saved')();
to = this._setter.apply( this, arguments );
to = this.validate( to );
if ( null === to || _.isEqual( from, to ) ) {
return this;
}
this._value = to;
this._dirty = ( _.isUndefined( dirtyness ) || ! _.isBoolean( dirtyness ) ) ? this._dirty : dirtyness;
this.callbacks.fireWith( this, [ to, from, { silent : true } ] );
api.state('saved')( _save_state );
return this;
};
})( wp.customize , jQuery, _ );
( function ( api, $, _ ) {
/*****************************************************************************
* A SKOPE AWARE PREVIEWER QUERY
*****************************************************************************/
api.bind('ready', function() {
if ( ! serverControlParams.isSkopOn )
return;
/**
* Build the query to send along with the Preview request.
*
* @return {object}
*/
var _coreQuery = api.previewer.query;
api.previewer.query = function( queryVars ) {
if ( ! serverControlParams.isSkopOn ) {
return _coreQuery.apply( this );
}
if ( ! _.has( api, 'czr_skope') ) {
api.consoleLog('QUERY : SKOPE IS NOT FULLY READY YEY. FALLING BACK ON CORE QUERY');
return _coreQuery.apply( this );
}
if ( 'pending' == api.czr_initialSkopeCollectionPopulated.state() ) {
api.consoleLog('QUERY : INITIAL SKOPE COLLECTION NOT POPULATED YET. FALLING BACK ON CORE QUERY');
return _coreQuery.apply( this );
}
if ( 'pending' == api.czr_isPreviewerSkopeAware.state() ) {
api.czr_isPreviewerSkopeAware.resolve();
}
if ( ! _.isObject( queryVars ) && 'resolved' == api.czr_initialSkopeCollectionPopulated.state() && 'resolved' == api.czr_initialSkopeCollectionPopulated.state() ) {
return _coreQuery.apply( this );
}
if ( _.isUndefined( queryVars.skope_id ) || ! _.isString( queryVars.skope_id ) ) {
queryVars.skope_id = api.czr_activeSkopeId() || api.czr_skopeBase.getGlobalSkopeId();
}
var globalCustomized = {},
skopeCustomized = {},
_defaults = {
skope_id : null,
action : null,
the_dirties : {},
dyn_type : null,
opt_name : null
},
_to_return;
queryVars = $.extend( _defaults, queryVars );
if ( ! _.isObject( queryVars.the_dirties ) ) {
api.consoleLog('QUERY PARAMS : ', queryVars );
throw new Error( 'QUERY DIRTIES MUST BE AN OBJECT. Requested action : ' + queryVars.action );
}
if ( 'pending' != api.czr_isPreviewerSkopeAware.state() && _.isNull( queryVars.skope_id ) ) {
api.consoleLog('QUERY PARAMS : ', queryVars );
throw new Error( 'OVERRIDEN QUERY : NO SKOPE ID. FALLING BACK ON CORE QUERY. Requested action : ' + queryVars.action );
}
if ( ! _.contains( [ null, 'refresh', 'save', 'reset', 'changeset_update' ], queryVars.action ) ) {
api.consoleLog('QUERY PARAMS : ', queryVars );
throw new Error( 'A REQUESTED QUERY HAS NO AUTHORIZED ACTION. Requested action : ' + queryVars.action );
}
var _getSkopesCustomized = function() {
if ( 'pending' == api.czr_initialSkopeCollectionPopulated.state() )
return {};
var _skpCust = {};
_.each( api.czr_currentSkopesCollection(), function( _skp ) {
if ( 'global' == _skp.skope )
return;
_skpCust[_skp.id] = api.czr_skopeBase.getSkopeDirties( _skp.id );
} );
return _skpCust;
};
if ( _.isNull( queryVars.the_dirties ) || _.isEmpty( queryVars.the_dirties ) ) {
globalCustomized = api.dirtyValues( { unsaved: queryVars.excludeCustomizedSaved || false } );
skopeCustomized = _getSkopesCustomized();
} else {
if ( 'global' == api.czr_skopeBase.getActiveSkopeName() )
globalCustomized = queryVars.the_dirties;
else
skopeCustomized[ api.czr_activeSkopeId() ] = queryVars.the_dirties;
}
switch( queryVars.action ) {
case null :
case 'refresh' :
break;
case 'changeset_update' :
if ( _.isUndefined( queryVars.opt_name ) ) {
throw new Error('Missing opt_name param in the changeset_update query for skope : ' + queryVars.skope_id );
}
break;
case 'save' :
if ( _.isNull( queryVars.dyn_type ) )
queryVars.dyn_type = api.czr_skope( queryVars.skope_id )().dyn_type;//post_meta, term_meta, user_meta, trans, option
if ( _.isNull( queryVars.dyn_type ) || _.isUndefined( queryVars.dyn_type ) ) {
throw new Error( 'QUERY : A SAVE QUERY MUST HAVE A VALID DYN TYPE.' + queryVars.skope_id );
}
break;
case 'reset' :
if ( _.isNull( queryVars.dyn_type ) )
queryVars.dyn_type = api.czr_skope( queryVars.skope_id )().dyn_type;//post_meta, term_meta, user_meta, trans, option
if ( _.isNull( queryVars.dyn_type ) || _.isUndefined( queryVars.dyn_type ) ) {
throw new Error( 'QUERY : A RESET QUERY MUST HAVE A VALID DYN TYPE.' + queryVars.skope_id );
}
break;
}
var _current_skopes = {};
_.each( api.czr_currentSkopesCollection(), function( _skp ) {
_current_skopes[_skp.skope] = { id : _skp.id, opt_name : _skp.opt_name };
});
_to_return = {
wp_customize: 'on',
customized: '{}' == JSON.stringify( globalCustomized ) ? '{\"__not_customized__\"}' : JSON.stringify( globalCustomized ),
skopeCustomized: JSON.stringify( skopeCustomized ),
nonce: this.nonce.preview,
skope: api.czr_skope( queryVars.skope_id )().skope,
level_id: api.czr_skope( queryVars.skope_id )().level,
skope_id: queryVars.skope_id,
dyn_type: queryVars.dyn_type,
opt_name: ! _.isNull( queryVars.opt_name ) ? queryVars.opt_name : api.czr_skope( queryVars.skope_id )().opt_name,
obj_id: api.czr_skope( queryVars.skope_id )().obj_id,
current_skopes: JSON.stringify( _current_skopes ) || {},
channel: this.channel(),
revisionIndex: api._latestRevision
};
if ( api.czr_isChangeSetOn() ) {
_to_return = $.extend( _to_return , {
customize_theme: api.settings.theme.stylesheet,
customize_changeset_uuid: api.settings.changeset.uuid
});
}
else {
_to_return = $.extend( _to_return , {
theme: api.settings.theme.stylesheet
});
}
return _to_return;
};//api.previewer.query
});//api.bind('ready')
})( wp.customize , jQuery, _ );
( function ( api, $, _ ) {
api.bind( 'czr-skope-started', function() {
api.previewer.save = function( args ) {
return api.czr_skopeSave.save();
};
});//api.bind('ready')
})( wp.customize , jQuery, _ );
(function (api, $, _) {
if ( ! serverControlParams.isSkopOn )
return;
/*****************************************************************************
* SYNCHRONIZER AUGMENTED
*****************************************************************************/
api.Element.synchronizer.checkbox.update = function( to ) {
this.element.prop( 'checked', to );
this.element.iCheck('update');
};
var _original = api.Element.synchronizer.val.update;
api.Element.synchronizer.val.update = function(to) {
var self = this,
_modifySynchronizer = function() {
if ( self.element.is('select') ) {
self.element.val(to).trigger('change');
} else if ( self.element.hasClass('wp-color-picker') ) {
self.element.val(to).trigger('change');
}
else {
self.element.val( to );
}
};
if ( serverControlParams.isSkopOn ) {
if ( 'resolved' != api.czr_skopeReady.state() ) {
return _original.call( self, to );
} else {
api.czr_skopeReady.then( function () {
_modifySynchronizer();
});
}
} else {
_modifySynchronizer();
}
};
api.Element.synchronizer.val.refresh = function() {
var syncApiInstance = this;
if ( this.element.is('select') && _.isNull( this.element.val() ) ) {
if ( _.isArray( syncApiInstance() ) )
return [];
else if ( _.isObject( syncApiInstance() ) )
return {};
else
return '';
} else {
return this.element.val();
}
};
})( wp.customize , jQuery, _ );
( function ( api, $, _ ) {
var coreRefresh = api.Previewer.prototype.refresh;
var _new_refresh = function( params ) {
params = _.extend({
waitSkopeSynced : true,
the_dirties : {}
},
params
);
var previewer = this, dfd = $.Deferred();
if ( ! serverControlParams.isSkopOn ) {
return dfd.resolve().promise();
}
if ( ! _.has( api, 'czr_activeSkopeId') || _.isUndefined( api.czr_activeSkopeId() ) ) {
api.consoleLog( 'The api.czr_activeSkopeId() is undefined in the api.previewer._new_refresh() method.');
}
if ( ! _.has( api, 'czr_activeSkopeId') ) {
if ( 'resolved' != api.czr_skopeReady.state() ) {
api.czr_skopeReady.done( function() {
_new_refresh.apply( api.previewer, params );
});
coreRefresh.apply( previewer );
return dfd.resolve().promise();
}
}
previewer.send( 'loading-initiated' );
previewer.abort();
var query_params = api.czr_getSkopeQueryParams({
skope_id : api.czr_activeSkopeId(),
action : 'refresh',
the_dirties : params.the_dirties || {}
});
previewer.loading = new api.PreviewFrame({
url: previewer.url(),
previewUrl: previewer.previewUrl(),
query: previewer.query( query_params ) || {},
container: previewer.container,
signature: 'WP_CUSTOMIZER_SIGNATURE'//will be deprecated in 4.7
});
previewer.settingsModifiedWhileLoading = {};
onSettingChange = function( setting ) {
previewer.settingsModifiedWhileLoading[ setting.id ] = true;
};
api.bind( 'change', onSettingChange );
previewer.loading.always( function() {
api.unbind( 'change', onSettingChange );
} );
if ( ! api.czr_isChangeSetOn() ) {
previewer._previousPreview = previewer._previousPreview || previewer.preview;
}
previewer.loading.done( function( readyData ) {
var loadingFrame = this, onceSynced;
previewer.preview = loadingFrame;
previewer.targetWindow( loadingFrame.targetWindow() );
previewer.channel( loadingFrame.channel() );
onceSynced = function( skopesServerData ) {
loadingFrame.unbind( 'synced', onceSynced );
loadingFrame.unbind( 'czr-skopes-synced', onceSynced );
if ( previewer._previousPreview ) {
previewer._previousPreview.destroy();
} //before WP 4.7
else {
if ( previewer.preview )
previewer.preview.destroy();
}
previewer._previousPreview = previewer.preview;
previewer.deferred.active.resolve();
delete previewer.loading;
api.trigger( 'pre_refresh_done', { previewer : previewer, skopesServerData : skopesServerData || {} } );
dfd.resolve( { previewer : previewer, skopesServerData : skopesServerData || {} } );
};
if ( ! api.czr_isChangeSetOn() ) {
previewer.send( 'sync', {
scroll: previewer.scroll,
settings: api.get()
});
}
if ( params.waitSkopeSynced ) {
loadingFrame.bind( 'czr-skopes-synced', onceSynced );
} else {
loadingFrame.bind( 'synced', onceSynced );
}
previewer.trigger( 'ready', readyData );
});
previewer.loading.fail( function( reason, location ) {
api.consoleLog('LOADING FAILED : ' , arguments );
previewer.send( 'loading-failed' );
if ( ! api.czr_isChangeSetOn() ) {
if ( 'redirect' === reason && location ) {
previewer.previewUrl( location );
}
}
if ( 'logged out' === reason ) {
if ( previewer.preview ) {
previewer.preview.destroy();
delete previewer.preview;
}
previewer.login().done( previewer.refresh );
}
if ( 'cheatin' === reason ) {
previewer.cheatin();
}
dfd.reject( reason );
});
return dfd.promise();
};//_new_refresh()
api.bind( 'czr-skope-started' , function() {
czr_override_refresh_for_skope();
api.Previewer.prototype.refresh = _new_refresh;
});
api.czr_getSkopeQueryParams = function( params ) {
if ( ! api.czr_isChangeSetOn() )
return params;
params = ! _.isObject(params) ? {} : params;
var _action = params.action || 'refresh';
switch( _action ) {
case 'refresh' :
params = $.extend( params, { excludeCustomizedSaved: true } );
break;
}
return params;
};
czr_override_refresh_for_skope = function() {
if ( ! serverControlParams.isSkopOn )
return;
/**
* Refresh the preview.
*/
api.previewer.refresh = function( _params_ ) {
var dfd = $.Deferred();
var _refresh_ = function( params ) {
var refreshOnceProcessingComplete,
isProcessingComplete = function() {
return 0 === api.state( 'processing' ).get();
},
resolveRefresh = function() {
_new_refresh.call( api.previewer, params ).done( function( refresh_data ) {
dfd.resolve( refresh_data );
});
};
if ( isProcessingComplete() ) {
resolveRefresh();
} else {
refreshOnceProcessingComplete = function() {
if ( isProcessingComplete() ) {
resolveRefresh();
api.state( 'processing' ).unbind( refreshOnceProcessingComplete );
}
};
api.state( 'processing' ).bind( refreshOnceProcessingComplete );
}
};
_refresh_ = _.debounce( _refresh_, api.previewer.refreshBuffer );
_refresh_( _params_ );
return dfd.promise();
};
};//czr_override_refresh_for_skope
})( wp.customize , jQuery, _ );
( function ( api, $, _ ) {
if ( ! serverControlParams.isSkopOn )
return;
/**
* Get the dirty setting values.
* Overrides the default method introduced in 4.7
* !! This method only returns the dirties of the global skope !!
*
* @param {object} [options] Options.
* @param {boolean} [options.unsaved=false] Whether only values not saved yet into a changeset will be returned (differential changes).
* @returns {object} Dirty setting values.
*/
api.dirtyValues = function dirtyValues( options ) {
return api.czr_skopeBase.getSkopeDirties( api.czr_skopeBase.getGlobalSkopeId(), options );
};
})( wp.customize , jQuery, _ );
( function ( api, $, _ ) {
if ( ! serverControlParams.isSkopOn || ! api.czr_isChangeSetOn() )
return;
var _original_requestChangesetUpdate = api.requestChangesetUpdate;
/**
* Request updates to the changeset.
* Always calls the original method when the first promise (the skope changeset save) has been executed.
* Returns the $ promise with the set of data from the original method
*
* @param {object} [changes] Mapping of setting IDs to setting params each normally including a value property, or mapping to null.
* If not provided, then the changes will still be obtained from unsaved dirty settings.
* @returns {jQuery.Promise}
*/
api.requestChangesetUpdate = function( changes ) {
var self = this,
dfd = $.Deferred(),
data,
_skopesToUpdate = [],
_promises = [],
_global_skope_changes = changes || {},
failedPromises = [],
_all_skopes_data_ = [],
_recursiveCallDeferred = $.Deferred();
if ( ! serverControlParams.isSkopOn ) {
return _original_requestChangesetUpdate();
}
if ( 0 === api._lastSavedRevision || _.isEmpty( api.state( 'changesetStatus' )() ) ) {
_global_skope_changes = _.extend( _global_skope_changes, {
blogname : { dummy_change : 'dummy_change' }
} );
}
_.each( api.czr_currentSkopesCollection(), function( _skp ) {
if ( 'global' == _skp.skope )
return;
_skopesToUpdate.push( _skp.id );
} );
var _mayBeresolve = function( _index ) {
if ( ! _.isUndefined( _skopesToUpdate[ _index + 1 ] ) || _promises.length != _skopesToUpdate.length )
return;
if ( _.isEmpty( failedPromises ) ) {
_recursiveCallDeferred.resolve( _all_skopes_data_ );
} else {
var _buildResponse = function() {
var _failedResponse = [];
_.each( failedPromises, function( _r ) {
_failedResponse.push( api.czr_skopeBase.buildServerResponse( _r ) );
} );
return $.trim( _failedResponse.join( ' | ') );
};
_recursiveCallDeferred.reject( _buildResponse() );
}
return true;
};
var recursiveCall = function( _index ) {
if ( _.isUndefined( _index ) || ( ( 0 * 0 ) == _index ) ) {
api.state( 'processing' ).set( 1 );
}
_index = _index || 0;
if ( _.isUndefined( _skopesToUpdate[_index] ) ) {
api.consoleLog( 'Undefined Skope in changeset recursive call ', _index, _skopesToUpdate, _skopesToUpdate[_index] );
return _recursiveCallDeferred.resolve( _all_skopes_data_ ).promise();
}
api._requestSkopeChangetsetUpdate( changes, _skopesToUpdate[_index] )
.always( function() { _promises.push( _index ); } )
.fail( function( response ) {
failedPromises.push( response );
api.consoleLog('CHANGESET UPDATE RECURSIVE FAIL FOR SKOPE : ', _skopesToUpdate[_index] );
if ( ! _mayBeresolve( _index ) )
recursiveCall( _index + 1 );
} )
.done( function( _skope_data_ ) {
_all_skopes_data_.push( _skope_data_ );
if ( ! _mayBeresolve( _index ) )
recursiveCall( _index + 1 );
} );
return _recursiveCallDeferred.promise();
};
var _lastSavedRevisionBefore = api._lastSavedRevision;
_original_requestChangesetUpdate( _global_skope_changes )
.fail( function( r ) {
api.consoleLog( 'WP requestChangesetUpdateFail', r, api.czr_skopeBase.buildServerResponse(r) );
api._lastSavedRevision = Math.max( api._latestRevision, api._lastSavedRevision );
api.state( 'processing' ).set( 0 );
dfd.reject( r );
r = api.czr_skopeBase.buildServerResponse(r);
api.czr_serverNotification( { message: r, status : 'error' } );
})
.done( function( wp_original_response ) {
if ( 'pending' == api.czr_initialSkopeCollectionPopulated.state() )
dfd.resolve( wp_original_response );
api._lastSavedRevision = _lastSavedRevisionBefore;
recursiveCall()
.always( function() {
api._lastSavedRevision = Math.max( api._latestRevision, api._lastSavedRevision );
api.state( 'processing' ).set( 0 );
})
.fail( function( r ) {
dfd.reject( r );
api.consoleLog( 'CHANGESET UPDATE RECURSIVE PUSH FAIL', r , _all_skopes_data_ );
api.trigger( 'changeset-error', r );
api.czr_serverNotification( { message: r, status : 'error' } );
} )
.done( function() {
dfd.resolve( wp_original_response );
});
});
return dfd.promise();
};
api._requestSkopeChangetsetUpdate = function( changes, skope_id ) {
if ( _.isUndefined( skope_id ) || ! api.czr_skope.has( skope_id ) ) {
throw new Error( 'In api._requestSkopeChangetsetUpdate() : a valid and registered skope_id must be provided' );
}
var deferred = new $.Deferred(),
request,
submittedChanges = {},
data;
skope_id = skope_id || api.czr_activeSkopeId();
if ( changes ) {
_.extend( submittedChanges, changes );
}
_.each( api.czr_skopeBase.getSkopeDirties( skope_id ) , function( dirtyValue, settingId ) {
if ( ! changes || null !== changes[ settingId ] ) {
submittedChanges[ settingId ] = _.extend(
{},
submittedChanges[ settingId ] || {},
{ value: dirtyValue }
);
}
} );
if ( _.isEmpty( submittedChanges ) ) {
deferred.resolve( {} );
return deferred.promise();
}
if ( api._latestRevision <= api._lastSavedRevision ) {
deferred.resolve( {} );
return deferred.promise();
}
api.trigger( 'skope-changeset-save', submittedChanges );
var queryVars = {
skope_id : skope_id,
action : 'changeset_update',
opt_name : api.czr_skope( skope_id ).opt_name
};
data = api.previewer.query( _.extend( queryVars, { excludeCustomizedSaved: true } ) );
delete data.customized; // Being sent in customize_changeset_data instead.
_.extend( data, {
nonce: api.settings.nonce.save,
customize_changeset_data: JSON.stringify( submittedChanges )
} );
wp.ajax.post( 'customize_skope_changeset_save', data )
.done( function requestChangesetUpdateDone( _data_ ) {
deferred.resolve( _data_ );
} )
.fail( function requestChangesetUpdateFail( _data_ ) {
api.consoleLog('SKOPE CHANGESET FAIL FOR SKOPE ' + _data_.skope_id, _data_ );
deferred.reject( _data_ );
} )
.always( function( _data_ ) {
if ( _data_.setting_validities ) {
api._handleSettingValidities( {
settingValidities: _data_.setting_validities
} );
}
} );
return deferred.promise();
};
})( wp.customize , jQuery, _ );
( function ( api, $, _ ) {
api.Setting.prototype.initialize = function( id, value, options ) {
var setting = this;
api.Value.prototype.initialize.call( setting, value, options );
setting.id = id;
setting.transport = setting.transport || 'refresh';
setting._dirty = options.dirty || false;
setting.notifications = new api.Values({ defaultConstructor: api.Notification });
setting.bind( setting.preview );
};
api.Setting.prototype.preview = function( to, from , data ) {
var setting = this, transport, dfd = $.Deferred();
transport = setting.transport;
if ( serverControlParams.isSkopOn && api.czr_isPreviewerSkopeAware && 'pending' == api.czr_isPreviewerSkopeAware.state() ) {
this.previewer.refresh();
return dfd.resolve( arguments ).promise();
}
if ( ! _.isUndefined( from ) && ! _.isEmpty( from ) && ! _.isNull( from ) ) {
if ( _.isObject( data ) && true === data.not_preview_sent ) {
return dfd.resolve( arguments ).promise();
}
}
if ( _.has( data, 'silent' ) && false !== data.silent )
return dfd.resolve( arguments ).promise();
if ( 'postMessage' === transport && ! api.state( 'previewerAlive' ).get() ) {
transport = 'refresh';
}
if ( 'postMessage' === transport ) {
setting.previewer.send( 'pre_setting', {
set_id : setting.id,
data : data,//<= { module_id : 'string', module : {} } which typically includes the module_id and the module model ( items, mod options )
value : to
});
setting.previewer.send( 'setting', [ setting.id, setting() ] );
dfd.resolve( arguments );
} else if ( 'refresh' === transport ) {
if ( serverControlParams.isSkopOn ) {
setting.previewer.refresh().always( function() {
dfd.resolve( arguments );
});
} else {
setting.previewer.refresh();
dfd.resolve( arguments );
}
}
return dfd.promise();
};//api.Setting.prototype.preview
})( wp.customize , jQuery, _ );
( function ( api, $, _ ) {
/* monkey patch for the content height set */
if ( 'function' == typeof api.Section ) {
var _original_section_initialize = api.Section.prototype.initialize;
api.Section.prototype.initialize = function( id, options ) {
_original_section_initialize.apply( this, [id, options] );
var section = this;
this.expanded.callbacks.add( function( _expanded ) {
if ( ! _expanded )
return;
var container = section.container.closest( '.wp-full-overlay-sidebar-content' ),
content = section.container.find( '.accordion-section-content' );
_resizeContentHeight = function() {
content.css( 'height', container.innerHeight() );
};
_resizeContentHeight();
$( window ).on( 'resize.customizer-section', _.debounce( _resizeContentHeight, 110 ) );
});
};
}
})( wp.customize , jQuery, _ );
(function (api, $, _) {
api.CZR_Helpers = api.CZR_Helpers || {};
api.CZR_Helpers = $.extend( api.CZR_Helpers, {
getControlSettingId : function( control_id, setting_type ) {
setting_type = 'default' || setting_type;
if ( ! api.control.has( control_id ) ) {
api.consoleLog( 'getControlSettingId : The requested control_id is not registered in the api yet : ' + control_id );
return control_id;
}
if ( ! _.has( api.control( control_id ), 'settings' ) || _.isEmpty( api.control( control_id ).settings ) )
return control_id;
if ( ! _.has( api.control( control_id ).settings, setting_type ) ) {
api.consoleLog( 'getControlSettingId : The requested control_id does not have the requested setting type : ' + control_id + ' , ' + setting_type );
return control_id;
}
if ( _.isUndefined( api.control( control_id ).settings[setting_type].id ) ) {
api.consoleLog( 'getControlSettingId : The requested control_id has no setting id assigned : ' + control_id );
return control_id;
}
return api.control( control_id ).settings[setting_type].id;
},
getDocSearchLink : function( text ) {
text = ! _.isString(text) ? '' : text;
var _searchtext = text.replace( / /g, '+'),
_url = [ serverControlParams.docURL, 'search?query=', _searchtext ].join('');
return [
'',
' ',
''
].join('');
},
/*
* @return string
* simple helper to build the setting wp api ready id
*/
build_setId : function ( setId ) {
if ( _.contains( serverControlParams.wpBuiltinSettings, setId ) )
return setId;
if ( ! _.contains( serverControlParams.themeSettingList, setId ) )
return setId;
return -1 == setId.indexOf( serverControlParams.themeOptions ) ? [ serverControlParams.themeOptions +'[' , setId , ']' ].join('') : setId;
},
/*
* @return string
* simple helper to extract the option name from a setting id
*/
getOptionName : function(name) {
var self = this;
if ( -1 == name.indexOf(serverControlParams.themeOptions) )
return name;
return name.replace(/\[|\]/g, '').replace(serverControlParams.themeOptions, '');
},
hasPartRefresh : function( setId ) {
if ( ! _.has( api, 'czr_partials') )
return;
return _.contains( _.map( api.czr_partials(), function( partial, key ) {
return _.contains( partial.settings, setId );
}), true );
},
getSectionControlIds : function( section_id ) {
section_id = section_id || api.czr_activeSectionId();
return ! api.section.has( section_id ) ?
[] :
_.map( api.section( section_id ).controls(), function( _ctrl ) {
return _ctrl.id;
});
},
getSectionSettingIds : function( section_id ) {
section_id = section_id || api.czr_activeSectionId();
if ( ! api.section.has( section_id) )
return;
var self = this,
_sec_settings = [],
_sec_controls = self.getSectionControlIds( section_id );
_.each( _sec_controls, function( ctrlId ) {
_.each( api.control(ctrlId).settings, function( _instance, _k ) {
_sec_settings.push( _instance.id );
});
});
return _sec_settings;
},
capitalize : function( string ) {
if( ! _.isString(string) )
return string;
return string.charAt(0).toUpperCase() + string.slice(1);
},
truncate : function( string, n, useWordBoundary ){
if ( ! _.isString( string ) )
return '';
n = n || 20;
var isTooLong = string.length > n,
s_ = isTooLong ? string.substr(0,n-1) : string;
s_ = (useWordBoundary && isTooLong) ? s_.substr(0,s_.lastIndexOf(' ')) : s_;
return isTooLong ? s_ + '...' : s_;
},
isMultiItemModule : function( module_type, moduleInst ) {
if ( _.isUndefined( module_type ) && ! _.isObject( moduleInst ) )
return;
if ( _.isObject( moduleInst ) && _.has( moduleInst, 'module_type' ) )
module_type = moduleInst.module_type;
else if ( _.isUndefined( module_type ) || _.isNull( module_type ) )
return;
if ( ! _.has( api.czrModuleMap, module_type ) )
return;
return api.czrModuleMap[module_type].crud || api.czrModuleMap[module_type].multi_item || false;
},
isCrudModule : function( module_type, moduleInst ) {
if ( _.isUndefined( module_type ) && ! _.isObject( moduleInst ) )
return;
if ( _.isObject( moduleInst ) && _.has( moduleInst, 'module_type' ) )
module_type = moduleInst.module_type;
else if ( _.isUndefined( module_type ) || _.isNull( module_type ) )
return;
if ( ! _.has( api.czrModuleMap, module_type ) )
return;
return api.czrModuleMap[module_type].crud || false;
},
hasModuleModOpt : function( module_type, moduleInst ) {
if ( _.isUndefined( module_type ) && ! _.isObject( moduleInst ) )
return;
if ( _.isObject( moduleInst ) && _.has( moduleInst, 'module_type' ) )
module_type = moduleInst.module_type;
else if ( _.isUndefined( module_type ) || _.isNull( module_type ) )
return;
if ( ! _.has( api.czrModuleMap, module_type ) )
return;
return api.czrModuleMap[module_type].has_mod_opt || false;
},
setupInputCollectionFromDOM : function() {
var inputParentInst = this;//<= because fired with .call( inputParentInst )
if ( ! _.isFunction( inputParentInst ) ) {
throw new Error( 'setupInputCollectionFromDOM : inputParentInst is not valid.' );
}
var module = inputParentInst.module,
is_mod_opt = _.has( inputParentInst() , 'is_mod_opt' );
if ( _.has( inputParentInst, 'czr_Input') && ! _.isEmpty( inputParentInst.inputCollection() ) )
return;
inputParentInst.czr_Input = new api.Values();
inputParentInst.inputConstructor = is_mod_opt ? module.inputModOptConstructor : module.inputConstructor;
var _defaultInputParentModel = is_mod_opt ? inputParentInst.defaultModOptModel : inputParentInst.defaultItemModel;
if ( _.isEmpty( _defaultInputParentModel ) || _.isUndefined( _defaultInputParentModel ) ) {
throw new Error( 'No default model found in item or mod opt ' + inputParentInst.id + '.' );
}
var inputParentInst_model = $.extend( true, {}, inputParentInst() );
if ( ! _.isObject( inputParentInst_model ) )
inputParentInst_model = _defaultInputParentModel;
else
inputParentInst_model = $.extend( _defaultInputParentModel, inputParentInst_model );
var dom_inputParentInst_model = {};
$( '.' + module.control.css_attr.sub_set_wrapper, inputParentInst.container).each( function( _index ) {
var _id = $(this).find('[data-type]').attr( 'data-type' ),
_value = _.has( inputParentInst_model, _id ) ? inputParentInst_model[ _id ] : '';
if ( _.isUndefined( _id ) || _.isEmpty( _id ) ) {
api.consoleLog( 'setupInputCollectionFromDOM : missing data-type for ' + module.id );
return;
}
if ( ! _.has( inputParentInst_model, _id ) ) {
throw new Error('The item or mod opt property : ' + _id + ' has been found in the DOM but not in the item or mod opt model : '+ inputParentInst.id + '. The input can not be instantiated.');
}
var _inputType = $(this).attr( 'data-input-type' ),
_inputTransport = $(this).attr( 'data-transport' ) || 'inherit',//<= if no specific transport ( refresh or postMessage ) has been defined in the template, inherits the control transport
_inputOptions = _.has( module.inputOptions, _inputType ) ? module.inputOptions[ _inputType ] : {};
inputParentInst.czr_Input.add( _id, new inputParentInst.inputConstructor( _id, {
id : _id,
type : _inputType,
transport : _inputTransport,
input_value : _value,
input_options : _inputOptions,//<= a module can define a specific set of option
container : $(this),
input_parent : inputParentInst,
is_mod_opt : is_mod_opt,
module : module
} ) );
inputParentInst.czr_Input( _id ).ready();
dom_inputParentInst_model[ _id ] = _value;
});//each
inputParentInst.inputCollection( dom_inputParentInst_model );
return inputParentInst;
},
removeInputCollection : function() {
var inputParentInst = this;//<= because fired with .call( inputParentInst )
if ( ! _.isFunction( inputParentInst ) ) {
throw new Error( 'removeInputCollection : inputParentInst is not valid.' );
}
if ( ! _.has( inputParentInst, 'czr_Input') )
return;
inputParentInst.czr_Input.each( function( _input ) {
inputParentInst.czr_Input.remove( _input.id );
});
inputParentInst.inputCollection({});
},
refreshModuleControl : function( wpSetId ) {
var _constructor = api.controlConstructor.czr_module,
_control_type = api.control( wpSetId ).params.type,
_control_data = api.settings.controls[wpSetId];
$.when( api.control( wpSetId ).container.remove() ).done( function() {
api.control.remove( wpSetId );
api.control.add( wpSetId, new _constructor( wpSetId, { params : _control_data, previewer : api.previewer }) );
});
},
hexToRgb : function( hex ) {
var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
try {
hex = hex.replace(shorthandRegex, function(m, r, g, b) {
return r + r + g + g + b + b;
});
} catch( er ) {
api.errorLog( 'Error in Helpers::hexToRgb : ' + er );
return hex;
}
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec( hex );
result = result ? [
parseInt(result[1], 16),//r
parseInt(result[2], 16),//g
parseInt(result[3], 16)//b
] : [];
return 'rgb(' + result.join(',') + ')';
},
rgbToHex : function ( r, g, b ) {
var componentToHex = function(c) {
var hex = c.toString(16);
return hex.length == 1 ? "0" + hex : hex;
};
return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b);
}
});//$.extend
})( wp.customize , jQuery, _);
(function (api, $, _) {
api.CZR_Helpers = api.CZR_Helpers || {};
api.CZR_Helpers = $.extend( api.CZR_Helpers, {
addActions : function( event_map, new_events, instance ) {
var control = this;
instance = instance || control;
instance[event_map] = instance[event_map] || [];
new_event_map = _.clone( instance[event_map] );
instance[event_map] = _.union( new_event_map, ! _.isArray(new_events) ? [new_events] : new_events );
},
doActions : function( action, $dom_el, obj ) {
$dom_el.trigger( action, obj );
},
setupDOMListeners : function( event_map , args, instance ) {
var control = this,
_defaultArgs = {
model : {},
dom_el : {}
};
instance = instance || control;
if ( ! _.isArray( event_map ) ) {
api.errorLog( 'setupDomListeners : event_map should be an array', args );
return;
}
if ( ! _.isObject( args ) ) {
api.errorLog( 'setupDomListeners : args should be an object', event_map );
return;
}
args = _.extend( _defaultArgs, args );
if ( ! args.dom_el instanceof jQuery || 1 != args.dom_el.length ) {
api.errorLog( 'setupDomListeners : dom element should be an existing dom element', args );
return;
}
_.map( event_map , function( _event ) {
if ( ! _.isString( _event.selector ) || _.isEmpty( _event.selector ) ) {
api.errorLog( 'setupDOMListeners : selector must be a string not empty. Aborting setup of action(s) : ' + _event.actions.join(',') );
return;
}
if ( ! _.isString( _event.selector ) || _.isEmpty( _event.selector ) ) {
api.errorLog( 'setupDOMListeners : selector must be a string not empty. Aborting setup of action(s) : ' + _event.actions.join(',') );
return;
}
args.dom_el.on( _event.trigger , _event.selector, function( e, event_params ) {
e.stopPropagation();
if ( api.utils.isKeydownButNotEnterEvent( e ) ) {
return;
}
e.preventDefault(); // Keep this AFTER the key filter above
var actionsParams = $.extend( true, {}, args );
if ( _.has( actionsParams, 'model') && _.has( actionsParams.model, 'id') ) {
if ( _.has( instance, 'get' ) )
actionsParams.model = instance();
else
actionsParams.model = instance.getModel( actionsParams.model.id );
}
$.extend( actionsParams, { event : _event, dom_event : e } );
$.extend( actionsParams, event_params );
if ( ! _.has( actionsParams, 'event' ) || ! _.has( actionsParams.event, 'actions' ) ) {
api.errorLog( 'executeEventActionChain : missing obj.event or obj.event.actions' );
return;
}
try { control.executeEventActionChain( actionsParams, instance ); } catch( er ) {
api.errorLog( 'In setupDOMListeners : problem when trying to fire actions : ' + actionsParams.event.actions );
api.errorLog( 'Error : ' + er );
}
});//.on()
});//_.map()
},//setupDomListeners
executeEventActionChain : function( args, instance ) {
var control = this;
if ( 'function' === typeof( args.event.actions ) )
return args.event.actions.call( instance, args );
if ( ! _.isArray( args.event.actions ) )
args.event.actions = [ args.event.actions ];
var _break = false;
_.map( args.event.actions, function( _cb ) {
if ( _break )
return;
if ( 'function' != typeof( instance[ _cb ] ) ) {
throw new Error( 'executeEventActionChain : the action : ' + _cb + ' has not been found when firing event : ' + args.event.selector );
}
var $_dom_el = ( _.has(args, 'dom_el') && -1 != args.dom_el.length ) ? args.dom_el : control.container;
$_dom_el.trigger( 'before_' + _cb, _.omit( args, 'event' ) );
var _cb_return = instance[ _cb ].call( instance, args );
if ( false === _cb_return )
_break = true;
$_dom_el.trigger( 'after_' + _cb, _.omit( args, 'event' ) );
});//_.map
}
});//$.extend
})( wp.customize , jQuery, _);
(function (api, $, _) {
api.czr_wpQueryDataReady = $.Deferred();
api.czr_wpQueryInfos = api.czr_wpQueryInfos || new api.Value();
api.czr_partials = api.czr_partials || new api.Value();
/*****************************************************************************
* CAPTURE PREVIEW INFORMATIONS ON REFRESH + REACT TO THEM
*****************************************************************************/
api.bind( 'ready', function() {
api.previewer.bind('houston-widget-settings', function(data) {
var _candidates = _.filter( data.registeredSidebars, function( sb ) {
return ! _.findWhere( _wpCustomizeWidgetsSettings.registeredSidebars, { id: sb.id } );
});
var _inactives = _.filter( data.registeredSidebars, function( sb ) {
return ! _.has( data.renderedSidebars, sb.id );
});
_inactives = _.map( _inactives, function(obj) {
return obj.id;
});
var _registered = _.map( data.registeredSidebars, function(obj) {
return obj.id;
});
api.czr_widgetZoneSettings = api.czr_widgetZoneSettings || new api.Value();//will store all widget zones data sent by preview as an observable object
api.czr_widgetZoneSettings.set( {
actives : data.renderedSidebars,
inactives : _inactives,
registered : _registered,
candidates : _candidates,
available_locations : data.availableWidgetLocations//built server side
} );
});
/* WP CONDITIONAL TAGS => stores and observes the WP conditional tags sent by the preview */
api.previewer.bind( 'czr-query-data-ready', function( data ) {
api.czr_wpQueryInfos( data );
if ( 'pending' == api.czr_wpQueryDataReady.state() ) {
api.czr_wpQueryDataReady.resolve( data );
}
});
api.previewer.bind( 'czr-partial-refresh-data', function( data ) {
api.czr_partials.set( data );
});
api.previewer.bind( 'czr-partial-refresh-done', function( data ) {
if ( ! _.has( data, 'set_id' ) )
return;
var setId = api.CZR_Helpers.build_setId( data.set_id );
if ( ! api.has( setId ) )
return;
var ctrlId = api.CZR_Helpers.getControlSettingId( setId );
if ( ! api.control.has( ctrlId ) )
return;
api.control( ctrlId ).trigger( 'czr-partial-refresh-done' );
});
});//api.bind('ready')
})( wp.customize , jQuery, _ );var CZRInputMths = CZRInputMths || {};
( function ( api, $, _ ) {
$.extend( CZRInputMths , {
initialize: function( name, options ) {
if ( _.isUndefined( options.input_parent ) || _.isEmpty(options.input_parent) ) {
throw new Error('No input_parent assigned to input ' + options.id + '. Aborting');
}
if ( _.isUndefined(options.module ) ) {
throw new Error('No module assigned to input ' + options.id + '. Aborting');
}
api.Value.prototype.initialize.call( this, null, options );
var input = this;
$.extend( input, options || {} );
input.isReady = $.Deferred();
if ( ! _.isUndefined(options.input_value) ) {
input.set( options.input_value );
}
if ( api.czrInputMap && _.has( api.czrInputMap, input.type ) ) {
var _meth = api.czrInputMap[ input.type ];
if ( _.isFunction( input[_meth]) ) {
input[_meth]( options.input_options || null );
}
} else {
api.consoleLog('Warning an input : ' + input.id + ' has no corresponding method defined in api.czrInputMap.');
}
var trigger_map = {
text : 'keyup',
textarea : 'keyup',
password : 'keyup',
color : 'colorpickerchange',
range : 'input propertychange'
};
input.input_event_map = [
{
trigger : $.trim( ['change', trigger_map[input.type] || '' ].join(' ') ),//was 'propertychange change click keyup input',//colorpickerchange is a custom colorpicker event @see method setupColorPicker => otherwise we don't
selector : 'input[data-type], select[data-type], textarea[data-type]',
name : 'set_input_value',
actions : function( obj ) {
if ( ! _.has( input.input_parent, 'syncElements') || ! _.has( input.input_parent.syncElements, input.id ) ) {
throw new Error('WARNING : THE INPUT ' + input.id + ' HAS NO SYNCED ELEMENT.');
}
}//was 'updateInput'
}
];
input.visible = new api.Value( true );
input.isReady.done( function() {
input.visible.bind( function( visible ) {
if ( visible )
input.container.stop( true, true ).slideDown( 200 );
else
input.container.stop( true, true ).slideUp( 200 );
});
});
input.enabled = new api.Value( true );
input.isReady.done( function() {
input.enabled.bind( function( enabled ) {
input.container.toggleClass( 'disabled', ! enabled );
});
});
},
ready : function() {
var input = this;
input.setupDOMListeners( input.input_event_map , { dom_el : input.container }, input );
input.callbacks.add( function() { return input.inputReact.apply( input, arguments ); } );
$.when( input.setupSynchronizer() ).done( function() {
input.isReady.resolve( input );
} );
},
setupSynchronizer: function() {
var input = this,
input_parent = input.input_parent,
$_input_el = input.container.find('[data-type]'),
is_textarea = input.container.find('[data-type]').is('textarea');
if ( is_textarea ) {
throw new Error('TO DO : THE TEXTAREA INPUT ARE NOT READY IN THE SYNCHRONIZER!');
}
var syncElement = new api.Element( $_input_el );
input_parent.syncElements = input_parent.syncElements || {};
input_parent.syncElements[input.id] = syncElement;//adds the input syncElement to the collection
syncElement.sync( input );//sync with the input instance
syncElement.set( input() );
},
inputReact : function( to, from, data ) {
var input = this,
_current_input_parent = input.input_parent(),
_new_model = _.clone( _current_input_parent ),//initialize it to the current value
_isPreItemInput = input.is_preItemInput;
if ( ! input.enabled() )
return;
_new_model = ( ! _.isObject(_new_model) || _.isEmpty(_new_model) ) ? {} : _new_model;
_new_model[ input.id ] = to;
input.input_parent.set( _new_model, {
input_changed : input.id,
input_transport : input.transport,
not_preview_sent : 'postMessage' === input.transport//<= this parameter set to true will prevent the setting to be sent to the preview ( @see api.Setting.prototype.preview override ). This is useful to decide if a specific input should refresh or not the preview.
} );
if ( ! _isPreItemInput ) {
input.input_parent.trigger( input.id + ':changed', to );
if ( ! _.isEmpty( from ) || ! _.isUndefined( from ) && 'postMessage' === input.transport ) {
input.module.sendInputToPreview( {
input_id : input.id,
input_parent_id : input.input_parent.id,
to : to,
from : from
} );
}
}
},
/*-----------------------------------------
SOME DEFAULT CALLBACKS
------------------------------------------*/
setupColorPicker : function() {
var input = this;
input.container.find('input').iris( {
palettes: true,
hide:false,
change : function( e, o ) {
$(this).val( o.color.toString() ).trigger('colorpickerchange').trigger('change');
}
});
},
setupSelect : function() {
var input = this;
$('select', input.container ).not('.no-selecter-js')
.each( function() {
$(this).selecter({
});
});
},
setupIcheck : function( obj ) {
var input = this;
$( 'input[type=checkbox]', input.container ).each( function(e) {
if ( 0 !== $(this).closest('div[class^="icheckbox"]').length )
return;
$(this).iCheck({
checkboxClass: 'icheckbox_flat-grey',
checkedClass: 'checked',
radioClass: 'iradio_flat-grey',
})
.on( 'ifChanged', function(e){
$(this).val( false === $(this).is(':checked') ? 0 : 1 );
$(e.currentTarget).trigger('change');
});
});
},
setupStepper : function( obj ) {
var input = this;
$('input[type="number"]',input.container ).each( function( e ) {
$(this).stepper();
});
},
setupRangeSlider : function( options ) {
var input = this,
$handle,
_updateHandle = function(el, val) {
el.textContent = val + "%";
};
$( input.container ).find('input').rangeslider( {
polyfill: false,
rangeClass: 'rangeslider',
disabledClass: 'rangeslider--disabled',
horizontalClass: 'rangeslider--horizontal',
verticalClass: 'rangeslider--vertical',
fillClass: 'rangeslider__fill',
handleClass: 'rangeslider__handle',
onInit: function() {
$handle = $('.rangeslider__handle', this.$range);
$('.rangeslider__handle', this.$range);
_updateHandle( $handle[0], this.value );
},
} ).on('input', function() {
_updateHandle( $handle[0], this.value );
});
}
});//$.extend
})( wp.customize , jQuery, _ );var CZRInputMths = CZRInputMths || {};
( function ( api, $, _ ) {
$.extend( CZRInputMths , {
setupImageUploader : function() {
var input = this,
_model = input();
input.attachment = {};
if ( ! input.container )
return this;
this.tmplRendered = $.Deferred();
this.setupContentRendering( _model, {} );
this.tmplRendered.done( function(){
input.czrImgUploaderBinding();
});
},
setupContentRendering : function( to, from) {
var input = this, _attachment;
if ( ( input.attachment.id != to ) && from !== to ) {
if ( ! to ) {
input.attachment = {};
input.renderImageUploaderTemplate();
}
_attachment = wp.media.attachment( to );
if ( _.isObject( _attachment ) && _.has( _attachment, 'attributes' ) && _.has( _attachment.attributes, 'sizes' ) ) {
input.attachment = _attachment.attributes;
input.renderImageUploaderTemplate();
} else {
wp.media.attachment( to ).fetch().done( function() {
input.attachment = this.attributes;
input.renderImageUploaderTemplate();
});
}
}//Standard reaction, the image has been updated by the user or init
else if ( ! input.attachment.id || input.attachment.id === to ) {
input.renderImageUploaderTemplate();
}
},
czrImgUploaderBinding : function() {
var input = this;
_.bindAll( input, 'czrImgUploadRemoveFile', 'czrImgUploadOpenFrame', 'czrImgUploadSelect');
input.container.on( 'click keydown', '.upload-button', input.czrImgUploadOpenFrame );
input.container.on( 'click keydown', '.thumbnail-image img', input.czrImgUploadOpenFrame );
input.container.on( 'click keydown', '.remove-button', input.czrImgUploadRemoveFile );
input.bind( input.id + ':changed', function( to, from ){
input.tmplRendered = $.Deferred();
input.setupContentRendering(to,from);
});
},
/**
* Open the media modal.
*/
czrImgUploadOpenFrame: function( event ) {
if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
return;
}
event.preventDefault();
if ( ! this.frame ) {
this.czrImgUploadInitFrame();
}
this.frame.open();
},
/**
* Create a media modal select frame, and store it so the instance can be reused when needed.
*/
czrImgUploadInitFrame: function() {
var input = this,
button_labels = this.getUploaderLabels();
input.frame = wp.media({
button: {
text: button_labels.frame_button
},
states: [
new wp.media.controller.Library({
title: button_labels.frame_title,
library: wp.media.query({ type: 'image' }),
multiple: false,
date: false
})
]
});
input.frame.on( 'select', input.czrImgUploadSelect );
},
/**
* Called when the "Remove" link is clicked. Empties the setting.
*
* @param {object} event jQuery Event object
*/
czrImgUploadRemoveFile: function( event ) {
var input = this;
if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
return;
}
event.preventDefault();
input.attachment = {};
input.set('');
},
/**
* Callback handler for when an attachment is selected in the media modal.
* Gets the selected image information, and sets it within the input.
*/
czrImgUploadSelect: function() {
var node,
input = this,
attachment = input.frame.state().get( 'selection' ).first().toJSON(), // Get the attachment from the modal frame.
mejsSettings = window._wpmejsSettings || {};
input.attachment = attachment;
input.set(attachment.id);
},
renderImageUploaderTemplate: function() {
var input = this;
if ( 0 === $( '#tmpl-czr-input-img-uploader-view-content' ).length )
return;
var view_template = wp.template('czr-input-img-uploader-view-content');
if ( ! view_template || ! input.container )
return;
var $_view_el = input.container.find('.' + input.module.control.css_attr.img_upload_container );
if ( ! $_view_el.length )
return;
var _template_params = {
button_labels : input.getUploaderLabels(),
settings : input.id,
attachment : input.attachment,
canUpload : true
};
$_view_el.html( view_template( _template_params) );
input.tmplRendered.resolve();
input.container.trigger( input.id + ':content_rendered' );
return true;
},
getUploaderLabels : function() {
var _ts = serverControlParams.i18n,
_map = {
'select' : _ts.select_image,
'change' : _ts.change_image,
'remove' : _ts.remove_image,
'default' : _ts.default_image,
'placeholder' : _ts.placeholder_image,
'frame_title' : _ts.frame_title_image,
'frame_button': _ts.frame_button_image
};
_.each( _map, function( ts_string, key ) {
if ( _.isUndefined( ts_string ) ) {
var input = this;
api.errorLog( 'A translated string is missing ( ' + key + ' ) for the image uploader input in module : ' + input.module.id );
return '';
}
});
return _map;
}
});//$.extend
})( wp.customize , jQuery, _ );/* Fix caching, select2 default one seems to not correctly work, or it doesn't what I think it should */
var CZRInputMths = CZRInputMths || {};
( function ( api, $, _ ) {
$.extend( CZRInputMths , {
setupContentPicker: function( wpObjectTypes ) {
var input = this,
_event_map = [];
/* Dummy for the prototype purpose */
$.extend( {
post : '',
taxonomy : ''
}, _.isObject( wpObjectTypes ) ? wpObjectTypes : {} );
input.wpObjectTypes = wpObjectTypes;
/* Methodize this or use a template */
input.container.find('.czr-input').append('');
_event_map = [
{
trigger : 'change',
selector : 'select[data-select-type]',
name : 'set_input_value',
actions : function( obj ){
var $_changed_input = $( obj.dom_event.currentTarget, obj.dom_el ),
_raw_val = $( $_changed_input, obj.dom_el ).select2( 'data' ),
_val_candidate = {},
_default = {
id : '',
type_label : '',
title : '',
object_type : '',
url : ''
};
_raw_val = _.isArray( _raw_val ) ? _raw_val[0] : _raw_val;
if ( ! _.isObject( _raw_val ) || _.isEmpty( _raw_val ) ) {
api.errorLog( 'Content Picker Input : the picked value should be an object not empty.');
return;
}
_.each( _default, function( val, k ){
if ( '_custom_' !== _raw_val.id ) {
if ( ! _.has( _raw_val, k ) || _.isEmpty( _raw_val[ k ] ) ) {
api.errorLog( 'content_picker : missing input param : ' + k );
return;
}
}
_val_candidate[ k ] = _raw_val[ k ];
} );
input.set( _val_candidate );
}
}
];
input.setupDOMListeners( _event_map , { dom_el : input.container }, input );
input.isReady.done( function() {
input.setupContentSelecter();
});
},
setupContentSelecter : function() {
var input = this;
if ( ! _.isEmpty( input() ) ) {
var _attributes = {
value : input().id || '',
title : input().title || '',
selected : "selected"
};
input.container.find('select').append( $( '