diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a2eaf9e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+*~
+.DS_Store
+.svn
+.cvs
+*.bak
+*.swp
\ No newline at end of file
diff --git a/assets/css/wpbb-admin-style.css b/assets/css/wpbb-admin-style.css
new file mode 100644
index 0000000..4fcf6c1
--- /dev/null
+++ b/assets/css/wpbb-admin-style.css
@@ -0,0 +1,127 @@
+.wpbb-fields [class*="wpbb-col-"] {
+ float: left;
+ padding-left: 5px;
+ padding-right: 5px;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+.wpbb-col-1 { width: 8.333333333%; }
+.wpbb-col-2 { width: 16.666666667%; }
+.wpbb-col-3 { width: 25%; }
+.wpbb-col-4 { width: 33.333333333%; }
+.wpbb-col-5 { width: 41.666666667%; }
+.wpbb-col-6 { width: 50%; }
+.wpbb-col-7 { width: 58.333333333%; }
+.wpbb-col-8 { width: 66.666666667%; }
+.wpbb-col-9 { width: 75%; }
+.wpbb-col-10 { width: 83.333333333%; }
+.wpbb-col-11 { width: 91.666666667%; }
+.wpbb-col-12 { width: 100%; }
+
+.wpbb-fields__field {
+ margin-bottom: 16px;
+ border-bottom: 1px solid #EEEEEE;
+ padding-bottom: 16px;
+}
+.wpbb-fields input[type=text],
+.wpbb-fields select,
+.wpbb-fields textarea,
+.wpbb-fields input[type=email],
+.wpbb-fields input[type=number] {
+ width: 100%;
+}
+.wpbb-fields textarea {
+ min-height: 100px;
+}
+.wpbb-fields label {
+ margin-bottom: 16px;
+ display: block;
+ margin-top: 0;
+ font-weight: 700;
+}
+.wpbb-field-checkbox label {
+ display: inline;
+ margin-right: 8px;
+ vertical-align: baseline;
+}
+.wpbb-field__description {
+ margin-top: 2px;
+ font-style: italic;
+ color: #AAAAAA;
+}
+.wpbb-clearfix {
+ display: block;
+ clear: both;
+}
+
+.wp-broadbean_page_wpbb_settings .wpbb-settings-col,
+.wp-broadbean_page_wpbb_settings .wpbb-cta-col {
+ float: left;
+}
+.wp-broadbean_page_wpbb_settings .wpbb-settings-col {
+ width: 55%;
+ margin-right: 3%;
+}
+.wpbb-cta-col {
+ width: 40% !important;
+ min-width: 40% !important;
+}
+.wpbb-cta-box__title {
+ border-bottom: 1px solid #eee;
+ font-size: 14px;
+ padding: 8px 12px;
+ margin: 0;
+ line-height: 1.4;
+}
+.wpbb-cta-box__content {
+ padding: 6px 10px 16px;
+}
+.wpbb-settings-col .description {
+ max-width: 60%;
+}
+@media all and ( max-width: 1400px ) {
+ .wpbb-settings-col .description {
+ max-width: 80%;
+ }
+}
+
+
+img.hd-logo {
+ margin-top: 16px;
+}
+.wpbb-getting-started li {
+ line-height: 1.4;
+}
+.wpbb-getting-started ul {
+ margin-top: 8px;
+}
+
+.wpbb-plugin-info code {
+ word-break: break-word;
+}
+.mc-field-group label {
+ display: block;
+ font-weight: 700;
+ margin-bottom: 8px;
+}
+.mc-field-group .email {
+ width: 98%;
+}
+
+
+@media all and ( max-width: 950px ) {
+ .wpbb-fields [class*="wpbb-col-"] {
+ width: 100%;
+ }
+ .wpbb-settings-col,
+ .wpbb-cta-col {
+ float: none;
+ width: 96% !important;
+ min-width: 96% !important;
+ margin-right: 0;
+ }
+ .wpbb-settings-col .description {
+ max-width: 100%;
+ }
+}
\ No newline at end of file
diff --git a/assets/js/jquery-validate.js b/assets/js/jquery-validate.js
new file mode 100644
index 0000000..60918fb
--- /dev/null
+++ b/assets/js/jquery-validate.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.0 - 11/28/2018
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2018 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."));var c=a.data(this[0],"validator");return c?c:(this.attr("novalidate","novalidate"),c=new a.validator(b,this[0]),a.data(this[0],"validator",c),c.settings.onsubmit&&(this.on("click.validate",":submit",function(b){c.submitButton=b.currentTarget,a(this).hasClass("cancel")&&(c.cancelSubmit=!0),void 0!==a(this).attr("formnovalidate")&&(c.cancelSubmit=!0)}),this.on("submit.validate",function(b){function d(){var d,e;return c.submitButton&&(c.settings.submitHandler||c.formSubmitted)&&(d=a(" ").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),!(c.settings.submitHandler&&!c.settings.debug)||(e=c.settings.submitHandler.call(c,c.currentForm,b),d&&d.remove(),void 0!==e&&e)}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c,d;return a(this[0]).is("form")?b=this.validate().form():(d=[],b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b,b||(d=d.concat(c.errorList))}),c.errorList=d),b},rules:function(b,c){var d,e,f,g,h,i,j=this[0],k="undefined"!=typeof this.attr("contenteditable")&&"false"!==this.attr("contenteditable");if(null!=j&&(!j.form&&k&&(j.form=this.closest("form")[0],j.name=this.attr("name")),null!=j.form)){if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(a,b){i[b]=f[b],delete f[b]}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g)),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}}),a.extend(a.expr.pseudos||a.expr[":"],{blank:function(b){return!a.trim(""+a(b).val())},filled:function(b){var c=a(b).val();return null!==c&&!!a.trim(""+c)},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:void 0===c?b:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",pendingClass:"pending",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(b,c){var d=[16,17,18,20,35,36,37,38,39,40,45,144,225];9===c.which&&""===this.elementValue(b)||a.inArray(c.keyCode,d)!==-1||(b.name in this.submitted||b.name in this.invalid)&&this.element(b)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}."),step:a.validator.format("Please enter a multiple of {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");if(!this.form&&c&&(this.form=a(this).closest("form")[0],this.name=a(this).attr("name")),d===this.form){var e=a.data(this.form,"validator"),f="on"+b.type.replace(/^validate/,""),g=e.settings;g[f]&&!a(this).is(g.ignore)&&g[f].call(e,this,b)}}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.currentForm,e=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){e[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).on("focusin.validate focusout.validate keyup.validate",":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox'], [contenteditable], [type='button']",b).on("click.validate","select, option, [type='radio'], [type='checkbox']",b),this.settings.invalidHandler&&a(this.currentForm).on("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c,d,e=this.clean(b),f=this.validationTargetFor(e),g=this,h=!0;return void 0===f?delete this.invalid[e.name]:(this.prepareElement(f),this.currentElements=a(f),d=this.groups[f.name],d&&a.each(this.groups,function(a,b){b===d&&a!==f.name&&(e=g.validationTargetFor(g.clean(g.findByName(a))),e&&e.name in g.invalid&&(g.currentElements.push(e),h=g.check(e)&&h))}),c=this.check(f)!==!1,h=h&&c,c?this.invalid[f.name]=!1:this.invalid[f.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),a(b).attr("aria-invalid",!c)),h},showErrors:function(b){if(b){var c=this;a.extend(this.errorMap,b),this.errorList=a.map(this.errorMap,function(a,b){return{message:a,element:c.findByName(b)[0]}}),this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors();var b=this.elements().removeData("previousValue").removeAttr("aria-invalid");this.resetElements(b)},resetElements:function(a){var b;if(this.settings.unhighlight)for(b=0;a[b];b++)this.settings.unhighlight.call(this,a[b],this.settings.errorClass,""),this.findByName(a[b].name).removeClass(this.settings.validClass);else a.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)void 0!==a[b]&&null!==a[b]&&a[b]!==!1&&c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find("input, select, textarea, [contenteditable]").not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){var d=this.name||a(this).attr("name"),e="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");return!d&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),e&&(this.form=a(this).closest("form")[0],this.name=d),this.form===b.currentForm&&(!(d in c||!b.objectLength(a(this).rules()))&&(c[d]=!0,!0))})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([])},reset:function(){this.resetInternals(),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d,e=a(b),f=b.type,g="undefined"!=typeof e.attr("contenteditable")&&"false"!==e.attr("contenteditable");return"radio"===f||"checkbox"===f?this.findByName(b.name).filter(":checked").val():"number"===f&&"undefined"!=typeof b.validity?b.validity.badInput?"NaN":e.val():(c=g?e.text():e.val(),"file"===f?"C:\\fakepath\\"===c.substr(0,12)?c.substr(12):(d=c.lastIndexOf("/"),d>=0?c.substr(d+1):(d=c.lastIndexOf("\\"),d>=0?c.substr(d+1):c)):"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f,g=a(b).rules(),h=a.map(g,function(a,b){return b}).length,i=!1,j=this.elementValue(b);"function"==typeof g.normalizer?f=g.normalizer:"function"==typeof this.settings.normalizer&&(f=this.settings.normalizer),f&&(j=f.call(b,j),delete g.normalizer);for(d in g){e={method:d,parameters:g[d]};try{if(c=a.validator.methods[d].call(this,j,b,e.parameters),"dependency-mismatch"===c&&1===h){i=!0;continue}if(i=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(k){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",k),k instanceof TypeError&&(k.message+=". Exception occurred when checking element "+b.id+", check the '"+e.method+"' method."),k}}if(!i)return this.objectLength(g)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;aWarning: No message defined for "+b.name+""),e=/\$?\{(\d+)\}/g;return"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),d},formatAndAdd:function(a,b){var c=this.defaultMessage(a,b);this.errorList.push({message:c,element:a,method:b.method}),this.errorMap[a.name]=c,this.submitted[a.name]=c},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g,h=this.errorsFor(b),i=this.idOrName(b),j=a(b).attr("aria-describedby");h.length?(h.removeClass(this.settings.validClass).addClass(this.settings.errorClass),h.html(c)):(h=a("<"+this.settings.errorElement+">").attr("id",i+"-error").addClass(this.settings.errorClass).html(c||""),d=h,this.settings.wrapper&&(d=h.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement.call(this,d,a(b)):d.insertAfter(b),h.is("label")?h.attr("for",i):0===h.parents("label[for='"+this.escapeCssMeta(i)+"']").length&&(f=h.attr("id"),j?j.match(new RegExp("\\b"+this.escapeCssMeta(f)+"\\b"))||(j+=" "+f):j=f,a(b).attr("aria-describedby",j),e=this.groups[b.name],e&&(g=this,a.each(g.groups,function(b,c){c===e&&a("[name='"+g.escapeCssMeta(b)+"']",g.currentForm).attr("aria-describedby",h.attr("id"))})))),!c&&this.settings.success&&(h.text(""),"string"==typeof this.settings.success?h.addClass(this.settings.success):this.settings.success(h,b)),this.toShow=this.toShow.add(h)},errorsFor:function(b){var c=this.escapeCssMeta(this.idOrName(b)),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+this.escapeCssMeta(d).replace(/\s+/g,", #")),this.errors().filter(e)},escapeCssMeta:function(a){return a.replace(/([\\!"#$%&'()*+,.\/:;<=>?@\[\]^`{|}~])/g,"\\$1")},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+this.escapeCssMeta(b)+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return!this.dependTypes[typeof a]||this.dependTypes[typeof a](a,b)},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},startRequest:function(b){this.pending[b.name]||(this.pendingRequest++,a(b).addClass(this.settings.pendingClass),this.pending[b.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass),c&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(a(this.currentForm).submit(),this.submitButton&&a("input:hidden[name='"+this.submitButton.name+"']",this.currentForm).remove(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(b,c){return c="string"==typeof c&&c||"remote",a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,{method:c})})},destroy:function(){this.resetForm(),a(this.currentForm).off(".validate").removeData("validator").find(".validate-equalTo-blur").off(".validate-equalTo").removeClass("validate-equalTo-blur").find(".validate-lessThan-blur").off(".validate-lessThan").removeClass("validate-lessThan-blur").find(".validate-lessThanEqual-blur").off(".validate-lessThanEqual").removeClass("validate-lessThanEqual-blur").find(".validate-greaterThanEqual-blur").off(".validate-greaterThanEqual").removeClass("validate-greaterThanEqual-blur").find(".validate-greaterThan-blur").off(".validate-greaterThan").removeClass("validate-greaterThan-blur")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},normalizeAttributeRule:function(a,b,c,d){/min|max|step/.test(c)&&(null===b||/number|range|text/.test(b))&&(d=Number(d),isNaN(d)&&(d=void 0)),d||0===d?a[c]=d:b===c&&"range"!==b&&(a[c]=!0)},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),this.normalizeAttributeRule(e,g,c,d);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),""===d&&(d=!0),this.normalizeAttributeRule(e,g,c,d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0===e.param||e.param:(a.data(c.form,"validator").resetElements(a(c)),delete b[d])}}),a.each(b,function(d,e){b[d]=a.isFunction(e)&&"normalizer"!==d?e(c):e}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var c;b[this]&&(a.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(c=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(c[0]),Number(c[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:void 0!==b&&null!==b&&b.length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[\/?#]\S*)?$/i.test(a)},date:function(){var a=!1;return function(b,c){return a||(a=!0,this.settings.debug&&window.console&&console.warn("The `date` method is deprecated and will be removed in version '2.0.0'.\nPlease don't use it, since it relies on the Date constructor, which\nbehaves very differently across browsers and locales. Use `dateISO`\ninstead or one of the locale specific methods in `localizations/`\nand `additional-methods.js`.")),this.optional(c)||!/Invalid|NaN/.test(new Date(b).toString())}}(),dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},minlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d},maxlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e<=d},rangelength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d[0]&&e<=d[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||a<=c},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},step:function(b,c,d){var e,f=a(c).attr("type"),g="Step attribute on input type "+f+" is not supported.",h=["text","number","range"],i=new RegExp("\\b"+f+"\\b"),j=f&&!i.test(h.join()),k=function(a){var b=(""+a).match(/(?:\.(\d+))?$/);return b&&b[1]?b[1].length:0},l=function(a){return Math.round(a*Math.pow(10,e))},m=!0;if(j)throw new Error(g);return e=k(d),(k(b)>e||l(b)%l(d)!==0)&&(m=!1),this.optional(c)||m},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-equalTo-blur").length&&e.addClass("validate-equalTo-blur").on("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d,e){if(this.optional(c))return"dependency-mismatch";e="string"==typeof e&&e||"remote";var f,g,h,i=this.previousValue(c,e);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),i.originalMessage=i.originalMessage||this.settings.messages[c.name][e],this.settings.messages[c.name][e]=i.message,d="string"==typeof d&&{url:d}||d,h=a.param(a.extend({data:b},d.data)),i.old===h?i.valid:(i.old=h,f=this,this.startRequest(c),g={},g[c.name]=b,a.ajax(a.extend(!0,{mode:"abort",port:"validate"+c.name,dataType:"json",data:g,context:f.currentForm,success:function(a){var d,g,h,j=a===!0||"true"===a;f.settings.messages[c.name][e]=i.originalMessage,j?(h=f.formSubmitted,f.resetInternals(),f.toHide=f.errorsFor(c),f.formSubmitted=h,f.successList.push(c),f.invalid[c.name]=!1,f.showErrors()):(d={},g=a||f.defaultMessage(c,{method:e,parameters:b}),d[c.name]=i.message=g,f.invalid[c.name]=!0,f.showErrors(d)),i.valid=j,f.stopRequest(c,j)}},d)),"pending")}}});var b,c={};return a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,d){var e=a.port;"abort"===a.mode&&(c[e]&&c[e].abort(),c[e]=d)}):(b=a.ajax,a.ajax=function(d){var e=("mode"in d?d:a.ajaxSettings).mode,f=("port"in d?d:a.ajaxSettings).port;return"abort"===e?(c[f]&&c[f].abort(),c[f]=b.apply(this,arguments),c[f]):b.apply(this,arguments)}),a});
\ No newline at end of file
diff --git a/assets/js/validation.js b/assets/js/validation.js
new file mode 100644
index 0000000..b24f0e6
--- /dev/null
+++ b/assets/js/validation.js
@@ -0,0 +1,14 @@
+/*
+ * Uses jquery.validate to validate the page form
+ */
+jQuery(document).ready(
+ function($) {
+ // validate the application form when it is submitted
+ $("#wpbb-application-form").validate({
+ errorClass: "wpbb-field-error",
+ errorPlacement: function( error, element ) {
+ error.appendTo( element.parent().parent() );
+ }
+ });
+ }
+);
\ No newline at end of file
diff --git a/css/form-style.css b/css/form-style.css
deleted file mode 100755
index 8602840..0000000
--- a/css/form-style.css
+++ /dev/null
@@ -1,37 +0,0 @@
-.message {
- text-align: left;
- background-color: #fbfbfb;
- border-left: 3px solid #7ad03a;
- padding: 2%;
-}
-#error, .error {
- border-color: #C00;
- color: #C00;
-}
-#wpbb-application-form .wpbb-input {
- clear: both;
- margin-bottom: 2%;
-}
-#wpbb-application-form .wpbb-input label {
- display: block;
- margin-bottom: 1%;
-}
-#wpbb-application-form .wpbb-input .wpbb-text-input {
- padding: 1%;
- border: 0;
- border: 1px solid #dddddd;
- display: block;
- width: 100%;
-}
-p.wpbb_description {
- font-size: 90%;
- font-style: italic;
-}
-
-#wpbb-application-form label.error {
- display: none;
-}
-label.require:after {
- content: " *";
- color: #C00;
-}
\ No newline at end of file
diff --git a/functions/admin/admin-menus.php b/functions/admin/admin-menus.php
deleted file mode 100644
index 994cbc1..0000000
--- a/functions/admin/admin-menus.php
+++ /dev/null
@@ -1,55 +0,0 @@
- 'Settings',
- 'cap' => 'manage_options',
- 'slug' => 'wpbb_broadbean_settings',
- 'callback' => 'wpbb_settings_page_content'
- );
-
- /* return the modified submenus */
- return $submenus;
-
-}
-
-add_filter( 'wpbb_admin_sub_menus', 'wpbb_add_settings_menu', 99 );
-
-/**
- * function wpbb_add_taxonomy_sub_menus()
- * adds all the menus for the plugins registered taxonmies under the main plugin admin menu
- * @hooked - wpbb_admin_sub_menus 99
- * @param (array) $submenus is the existing array of plugin submenus to add
- * @return (array) $submneus is the modified array of submenus to add
- */
-function wpbb_add_taxonomy_sub_menus( $submenus ) {
-
- /* get the plugins regsitered taxonomies */
- $taxonomies = wpbb_get_registered_taxonomies();
-
- /* loop through each taxonomy */
- foreach( $taxonomies as $taxonomy ) {
-
- /* add the settings menu to any other added menus */
- $submenus[ $taxonomy[ 'taxonomy_name' ] ] = array(
- 'label' => $taxonomy[ 'menu_label' ],
- 'cap' => 'edit_others_posts',
- 'slug' => 'edit-tags.php?taxonomy=' . $taxonomy[ 'taxonomy_name' ],
- );
-
- } // end taxonomy loop through
-
- /* return the modified submenus */
- return $submenus;
-
-}
-
-add_filter( 'wpbb_admin_sub_menus', 'wpbb_add_taxonomy_sub_menus', 20 );
\ No newline at end of file
diff --git a/functions/admin/admin.php b/functions/admin/admin.php
deleted file mode 100755
index 5dcf70f..0000000
--- a/functions/admin/admin.php
+++ /dev/null
@@ -1,482 +0,0 @@
-
-
- taxonomy;
-
- $taxonomies = wpbb_get_registered_taxonomies();
-
- foreach ($taxonomies as $taxonomy) {
- /* if the current screen taxonomy is a SEN taxonomy */
- if( $wpbb_taxonomy == $taxonomy['taxonomy_name'] ) {
-
- /* set the parent file slug to the sen main page */
- $parent_file = 'wp_broadbean_home';
-
- }
- }
-
- /* return the new parent file */
- return $parent_file;
-
-}
-add_action( 'parent_file', 'wpbb_tax_menu_correction' );
-
-/**
- * Function wpbb_register_settings()
- * Register the settings for this plugin. Just a username and a
- * password for authenticating.
- */
-function wpbb_register_default_settings() {
-
- /* build array of setttings to register */
- $wpbb_registered_settings = apply_filters( 'wpbb_registered_settings', array() );
-
- /* loop through registered settings array */
- foreach( $wpbb_registered_settings as $wpbb_registered_setting ) {
-
- /* register a setting for the username */
- register_setting( 'wpbb_settings', $wpbb_registered_setting );
-
- }
-
-}
-
-add_action( 'admin_init', 'wpbb_register_default_settings' );
-
-/**
- * Function wpbb_admin_page_content()
- * Builds the content for the admin settings page.
- */
-function wpbb_settings_page_content() {
-
- ?>
-
-
-
-
-
-
-
-
Edit the WP Broadbean plugin settings below:
-
-
-
-
-
-
-
-
-
-
-
- Version:
- Written by:
- Website: WP Broadbean Plugin
-
-
- If you find WP Broadbean useful then please rate it on the plugin repository .
-
-
-
-
-
-
-
-
Highrise Digital Managed Integrations
-
-
-
-
At Highrise Digital we have integrated a number of WordPress sites with Broadbean and as a result we can provide a fully managed integration, handling everything for you.
-
Integrate Broadbean Now
-
-
-
-
-
- post_type ) {
-
- /* set the new text for the title box */
- $title = 'Job Title';
-
- /* if the current screen is our job application post type */
- } elseif( 'wpbb_application' == $wpbb_screen->post_type ) {
-
- /* set the new text for the title box */
- $title = 'Applicant Name';
-
- }
-
- /* return our new text */
- return apply_filters( 'wpbb_post_title_text', $title, $wpbb_screen );
-
-}
-
-add_filter( 'enter_title_here', 'wpbb_change_title_text' );
-
-/**
- * Function wpbb_job_post_editor_content()
- * Pre-fills the post editor on jobs with instructional text.
- */
-function wpbb_job_post_editor_content( $content ) {
-
- /* check we are on the job post type */
- if( wpbb_job_post_type_name() != wpbb_get_current_post_type() )
- return;
-
- $content = "Replace this text with the long description of the job.";
-
- return apply_filters( 'wpbb_post_editor_text', $content );
-}
-
-add_filter( 'default_content', 'wpbb_job_post_editor_content' );
-
-/**
- * Function wpbb_get_current_admin_post_type()
- * Returns the post type of a post in the admin.
- */
-function wpbb_get_current_admin_post_type() {
-
- global $post, $typenow, $current_screen;
-
- /* we have a post so we can just get the post type from that */
- if ( $post && $post->post_type )
- return $post->post_type;
-
- /* check the global $typenow - set in admin.php */
- elseif( $typenow )
- return $typenow;
-
- /* check the global $current_screen object - set in sceen.php */
- elseif( $current_screen && $current_screen->post_type )
- return $current_screen->post_type;
-
- /* lastly check the post_type querystring */
- elseif( isset( $_REQUEST[ 'post_type' ] ) )
- return sanitize_key( $_REQUEST[ 'post_type' ] );
-
- /* we do not know the post type! */
- return null;
-
-}
-
-/**
- * Function wpbb_job_short_description_meta_box()
- * Change html output of the excerpt box, removing the paragraph
- * of instruction text.
- */
-function wpbb_job_short_description_meta_box( $post ) {
-
- ?>
-
-
- 'Feed Username',
- 'name' => 'wpbb_username',
- 'type' => 'text',
- 'description' => 'Choose a username for your feed. Please note once you have set this, it should not be edited here or your feed may break.'
- );
-
- $settings[ 'wpbb_password' ] = array(
- 'label' => 'Feed Password',
- 'name' => 'wpbb_password',
- 'type' => 'text',
- 'description' => 'Choose a password for your feed. Please note once you have set this, it should not be edited here or your feed may break.'
- );
-
- $settings[ 'wpbb_apply_page_id' ] = array(
- 'label' => 'Apply Page',
- 'name' => 'wpbb_apply_page_id',
- 'type' => 'select',
- 'description' => 'Choose which page to use for your application form. An application form is added after the pages content once the page is chosen here.',
- 'options' => wpbb_page_dropdown_array()
- );
-
- $settings['wpbb_remove_application_attachments'] = array(
- 'label' => 'Remove application attachments',
- 'name' => 'wpbb_remove_application_attachments',
- 'type' => 'select',
- 'description' => __( 'Highly recommended to be set to yes as it prevents application attachments being stored on this server. Once processed and sent to Broadbean they are then deleted.', 'wpbroadbean' ),
- 'options' => array(
- array(
- 'name' => 'No',
- 'value' => false,
- ),
- array(
- 'name' => 'Yes',
- 'value' => true,
- ),
- ),
- );
-
- $settings['wpbb_remove_application_posts'] = array(
- 'label' => 'Remove applications',
- 'name' => 'wpbb_remove_application_posts',
- 'type' => 'select',
- 'description' => __( 'Highly recommended to be set to yes as it prevents application data being stored on this server. Once processed and sent to Broadbean they are then deleted. Both this setting and the one above should be set to yes to keep application data out of WordPress.', 'wpbroadbean' ),
- 'options' => array(
- array(
- 'name' => 'No',
- 'value' => false,
- ),
- array(
- 'name' => 'Yes',
- 'value' => true,
- ),
- ),
- );
-
- $settings['wpbb_hide_job_data_on_single_job'] = array(
- 'label' => 'Hide Job Data',
- 'name' => 'wpbb_hide_job_data',
- 'type' => 'select',
- 'description' => __( 'Choosing yes means the plugin will not output the job data on each job page.', 'wpbroadbeab' ),
- 'options' => array(
- array(
- 'name' => 'No',
- 'value' => false,
- ),
- array(
- 'name' => 'Yes',
- 'value' => true,
- ),
- ),
- );
-
- return $settings;
-
-}
-
-add_filter( 'wpbb_settings_output', 'wpbb_create_default_settings_output' );
diff --git a/functions/admin/metaboxes.php b/functions/admin/metaboxes.php
deleted file mode 100755
index db8424e..0000000
--- a/functions/admin/metaboxes.php
+++ /dev/null
@@ -1,156 +0,0 @@
- 'Job Information',
- 'id' => 'wpbb_job_info',
- 'pages' => array(
- wpbb_job_post_type_name()
- ),
- 'context' => 'normal',
- 'priority' => 'high',
- 'fields' => wpbb_get_job_fields()
- );
-
- $meta_boxes[ 'application_information' ] = array(
- 'title' => 'Application Information',
- 'id' => 'wpbb_application_info',
- 'pages' => array( 'wpbb_application' ),
- 'context' => 'normal',
- 'priority' => 'high',
- 'fields' => apply_filters(
- 'wpbb_application_metabox_fields',
- array(
- 'reference' => array(
- 'name' => 'Job Reference/ID',
- 'desc' => 'This is the job reference or ID for the job applied for.',
- 'id' => '_wpbb_job_reference',
- 'cols' => 6,
- 'type' => 'text'
- ),
- 'email' => array(
- 'name' => 'Email Address',
- 'desc' => 'This is the email address of the person applying for this job.',
- 'id' => '_wpbb_applicant_email',
- 'cols' => 6,
- 'type' => 'text'
- ),
- )
- )
- );
-
- return $meta_boxes;
-}
-
-add_filter( 'cmb_meta_boxes', 'wpbb_metaboxes' );
-
-/**
- *
- */
-function wpbb_maybe_add_application_attachments( $fields ) {
-
- // if we are not removing application attachments
- if( false === wpbb_maybe_remove_application_attachments() ) {
-
- // add application attachments field
- $fields[ 'attachments' ] = array(
- 'name' => 'Application Attachments',
- 'desc' => 'Attachments to this Application are listed below.',
- 'id' => '_wpbb_applicant_attachments',
- 'cols' => 12,
- 'type' => 'attachments'
- );
-
- }
-
- return $fields;
-
-}
-
-add_filter( 'wpbb_application_metabox_fields', 'wpbb_maybe_add_application_attachments' );
-
-/**
- * create our own custom meta box field for showing attachments
- */
-class Attachments_Field extends CMB_Field {
-
- public function html() {
-
- /* get the post ID from the url as we are editing a post */
- if( isset( $_GET[ 'post' ] ) ) {
- $post_id = absint( $_GET[ 'post' ] );
- }
-
- /* check we have a post id */
- if( ! empty( $post_id ) ) {
-
- /* get the attachment posts for this post */
- $attachments = new WP_Query(
- array(
- 'post_type' => 'attachment',
- 'post_parent' => $post_id,
- 'post_status' => 'inherit',
- 'posts_per_page' => -1
- )
- );
-
- /* check we have attachments */
- if( $attachments->have_posts() ) {
-
- ?>
-
-
-
-
-
- have_posts() ) : $attachments->the_post();
-
- /* get the attachment URL */
- $url = wp_get_attachment_url( get_the_ID() );
-
- ?>
-
- >
-
-
-
-
-
-
-
- ' . esc_html__( 'Error: No job exists with this job reference.', 'wpbroadbean' ) . '
' . $content;
-
- }
-
- /* get the contact email and broadbean tracking email for this job */
- $contact_email = get_post_meta( $job_post, '_wpbb_job_contact_email', true );
- $bb_email = get_post_meta( $job_post, '_wpbb_job_broadbean_application_email', true );
-
- /* check whether the form has already been posted */
- if( ! isset( $_POST[ 'wpbb_submit' ] ) ) {
-
- /* start the form */
- $form = '';
-
- /* form has been posted */
- } else {
-
- /* set a string to store all messages in */
- $wpbb_message_output = array();
-
- /* get any messages */
- global $wpbb_messages;
-
- /* run messages through a filter so devs can alter them */
- $wpbb_messages = apply_filters(
- 'wpbb_application_form_messages',
- $wpbb_messages
- );
-
- /* if we have some messages to loop through */
- if( ! empty( $wpbb_messages ) ) {
-
- /* loop through each message adding to string */
- foreach( $wpbb_messages as $key => $message ) {
-
- $wpbb_message_output[] = '' . esc_html( $message[ 'message' ] ) . '
';
- }
-
- }
-
- /* prevent undefined variable */
- $form = '';
-
- }
-
- /* no job ref was passed in the query string */
- } else {
-
- $form = apply_filters(
- 'wpbb_application_form_no_form_error',
- 'Error: No job reference detected!
'
- );
-
- }
-
- /* have we any message */
- if( ! empty( $wpbb_message_output ) ) {
-
- $wpbb_message_string = '';
-
- /* loop through each message */
- foreach( $wpbb_message_output as $message_output ) {
-
- /* add message to our string */
- $wpbb_message_string .= $message_output;
-
- }
-
- $wpbb_message_string .= '
';
-
- /* no messages */
- } else {
-
- /* set an empty string for messages */
- $wpbb_message_string = '';
-
- }
-
- /* make the form markup filterable */
- $form = apply_filters(
- 'wpbb_application_form_html',
- $form,
- $job_id
- );
-
- /* add message to the form content */
- $form = $form . $wpbb_message_string;
-
- /* check we have something in our form variable */
- if( empty( $form ) )
- return $content;
-
- /* return the form with content */
- return $content . $form;
-
-}
-
-add_filter( 'the_content', 'wpbb_application_form' );
-
-/**
- * function wpbb_application_processing()
- * process the application form submitted creating an application post
- * @param (int) $job_ref is the job reference for the job being applied for
- */
-function wpbb_application_processing() {
-
- /* if this is the admin then bail early */
- if( is_admin() ) {
- return;
- }
-
- /* check whether the form has already been posted */
- if( isset( $_POST[ 'wpbb_submit' ] ) ) {
-
- /* lets sanitize the posted data */
- $applicant_name = sanitize_text_field( $_POST[ 'wpbb_name' ] );
- $applicant_message = wp_kses_post( $_POST[ 'wpbb_message' ] );
- $application_job_ref = sanitize_text_field( $_POST[ 'wpbb_job_reference' ] );
- $applicant_email = sanitize_email( $_POST[ 'wpbb_email' ] );
-
- /* get the post for this job reference */
- $job_post = wpbb_get_job_by_reference( sanitize_text_field( $_GET[ 'job_id' ] ) );
-
- /* store message on success/failure in this array */
- global $wpbb_messages;
- $wpbb_messages = array();
-
- /* check that the wp_handle_upload function is loaded */
- if ( ! function_exists( 'wp_handle_upload' ) )
- require_once( ABSPATH . 'wp-admin/includes/file.php' );
-
- /* get the uploaded file information */
- $wpbb_uploaded_file = $_FILES[ 'wpbb_file' ];
-
- /* check that the $_FILES var is an array */
- if( ! is_array( $wpbb_uploaded_file ) ) {
-
- /* add an error message */
- $wpbb_messages[ 'attachment_failed' ] = array(
- 'type' => 'error',
- 'message' => 'Error: File attachment failed.'
- );
-
- /* go no further as file type not allowed */
- return;
-
- }
-
- /* sanitize the uploaded file name */
- $wpbb_uploaded_file_name = sanitize_text_field( $wpbb_uploaded_file[ 'name' ] );
-
- /* check we have a file to upload */
- if( $wpbb_uploaded_file_name != '' ) {
-
- /* set overides to make it work */
- $wpbb_upload_overrides = array( 'test_form' => false );
-
- /* upload the file to wp uploads dir */
- $wpbb_moved_file = wp_handle_upload( $wpbb_uploaded_file, $wpbb_upload_overrides );
-
- /* get file type of the uploaded file */
- $wpbb_filetype = wp_check_filetype( $wpbb_moved_file[ 'url' ], null );
-
- /* generate array of allowed mime types */
- $wpbb_allowed_mime_types = apply_filters(
- 'wpbb_application_allowed_file_types',
- array(
- 'pdf' => 'application/pdf',
- 'word' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
- 'word_old' => 'application/msword',
- 'pages' => 'application/vnd.apple.pages',
- 'open_text' => 'application/vnd.oasis.opendocument.text',
- 'rich_text' => 'application/rtf',
- 'text' => 'text/plain'
- )
- );
-
- /* check uploaded file is in allowed mime types array */
- if( ! in_array( $wpbb_filetype[ 'type' ], $wpbb_allowed_mime_types) ) {
-
- /* add an error message */
- $wpbb_messages[ 'cv_type_failed' ] = array(
- 'type' => 'error',
- 'message' => esc_html__( 'Error: CV is not an allowed file type.', 'wpbroadbean' ),
- );
-
- /* go no further as file type not allowed */
- return;
-
- }
-
- }
-
- /* get the wp upload directory */
- $wpbb_wp_upload_dir = wp_upload_dir();
-
- /* setup the attachment data */
- $wpbb_attachment = array(
- 'post_mime_type' => $wpbb_filetype[ 'type' ],
- 'post_title' => preg_replace('/\.[^.]+$/', '', $wpbb_uploaded_file_name ),
- 'post_content' => '',
- 'guid' => $wpbb_wp_upload_dir[ 'url' ] . '/' . basename( $wpbb_moved_file[ 'file' ] ),
- 'post_status' => 'private'
- );
-
- /* insert the application post */
- $wpbb_application_id = wp_insert_post(
- apply_filters(
- 'wpbb_insert_application_args',
- array(
- 'post_type' => 'wpbb_application',
- 'post_title' => esc_html( $applicant_name ),
- 'post_status' => 'draft',
- 'post_content' => $applicant_message
- )
- )
- );
-
- /* check the application post has been added */
- if( $wpbb_application_id != 0 ) {
-
- /* set the post meta data (custom fields) */
- add_post_meta( $wpbb_application_id, '_wpbb_job_reference', $application_job_ref, true );
- add_post_meta( $wpbb_application_id, '_wpbb_applicant_email', $applicant_email, true );
-
- /* check we have a file to attach */
- if( $wpbb_uploaded_file_name != '' ) {
-
- /* add the attachment from the uploaded file */
- $wpbb_attach_id = wp_insert_attachment( $wpbb_attachment, $wpbb_moved_file[ 'file' ], $wpbb_application_id );
- require_once( ABSPATH . 'wp-admin/includes/image.php' );
- $wpbb_attach_data = wp_generate_attachment_metadata( $wpbb_attach_id, $wpbb_moved_file[ 'file' ] );
- wp_update_attachment_metadata( $wpbb_attach_id, $wpbb_attach_data );
-
- }
-
- /* add an error message */
- $wpbb_messages[ 'application_success' ] = array(
- 'type' => 'success',
- 'message' => esc_html__( 'Thank you. Your application has been received.', 'wpbroadbean' ),
- );
-
- } // end check application post added
-
- /* add filter below to allow / force mail to send as html */
- add_filter( 'wp_mail_content_type', 'wpbb_text_html_email_type' );
-
- /* get the post object for the job being applied for */
- $job_post = get_post( $job_post );
-
- /* build the content of the email */
- $wpbb_email_content = '
-
- ' . $applicant_name . ' has completed an application for ' . $job_post->the_title . ' which has the job reference of ' . $application_job_ref . '. The applicants email address is ' . $applicant_email. '. Below is a summary of their responses:
-
-
- Applicant Name: ' . esc_html( get_the_title( $wpbb_application_id ) ) . '
- Applicant Email Address: ' . esc_html( get_post_meta( $wpbb_application_id, '_wpbb_applicant_email', true ) ) . '
- Job Title: ' . esc_html( get_the_title( $job_post->ID ) ) . '
- Job Reference: ' . esc_html( get_post_meta( $job_post->ID, '_wpbb_job_reference', true ) ) . '
- Job Permalink: ' . esc_url( get_permalink( $job_post->ID ) ) . '
- Application Edit Link
-
- ' . wpautop( $applicant_message ) . '
-
- Email sent by WP Broadbean WordPress plugin .
-
- ';
-
- /* set up the mail variables */
- $wpbb_mail_subject = 'New Job Application Submitted - ' . esc_html( get_the_title( $wpbb_application_id ) );
- $wpbb_email_headers = array();
- $wpbb_email_headers[] = 'From: ' . esc_html( $applicant_name ) . ' <' . $applicant_email . '>';
-
- /**
- * set the content of the email as a variable
- * this is made filterable and is passed the job post object being applied for
- * along with the application post id
- * devs can use this filter to change the contents of the email sent
- */
- $wpbb_mail_content = wpbb_generate_email_content( apply_filters( 'wpbb_application_email_content', $wpbb_email_content, $job_post, $wpbb_application_id ) );
-
- /* setup an array for recipients */
- $wpbb_mail_recipients = array();
-
- /* get the contact email */
- $wpbb_contact_email = get_post_meta( $job_post->ID, '_wpbb_job_contact_email', true );
-
- /* if we have a contact email add it to the recipients array */
- if( $wpbb_contact_email != '' ) {
- $wpbb_mail_recipients[] = sanitize_email( $wpbb_contact_email );
- }
-
- /* get the tracking email */
- $wpbb_tracking_email = get_post_meta( $job_post->ID, '_wpbb_job_broadbean_application_email', true );
-
- /* if we have a tracking email add it to the recipients array */
- if ( $wpbb_tracking_email != '' ) {
- $wpbb_mail_recipients[] = sanitize_email( $wpbb_tracking_email );
- }
-
- /* set attachments - the cv */
- $wpbb_attachments = array( $wpbb_wp_upload_dir[ 'path' ] . '/' . basename( $wpbb_moved_file[ 'file' ] ) );
-
- /* send the mail */
- $wpbb_send_email = wp_mail(
- apply_filters( 'wpbb_application_email_recipients', $wpbb_mail_recipients, $wpbb_application_id, $job_post ),
- apply_filters( 'wpbb_application_email_subject', $wpbb_mail_subject, $wpbb_application_id, $job_post ),
- apply_filters( 'wpbb_application_email_content', $wpbb_mail_content, $wpbb_application_id, $job_post ),
- apply_filters( 'wpbb_application_email_headers', $wpbb_email_headers, $wpbb_application_id, $job_post ),
- apply_filters( 'wpbb_application_email_attachments', $wpbb_attachments, $wpbb_application_id, $job_post )
- );
-
- /* remove filter below to allow / force mail to send as html */
- remove_filter( 'wp_mail_content_type', 'wpbb_text_html_email_type' );
-
- /**
- * @hook wpbb_after_application_form_processing
- * @param int $wpbb_application_id the application post id of the application submitted
- * @param obj $job_post the post object for the job being applied for
- */
- do_action( 'wpbb_after_application_form_processing', $wpbb_application_id, $job_post, $wpbb_attach_id );
-
- } // end if form posted
-
-}
-
-add_action( 'wp', 'wpbb_application_processing', 10 );
-
-/**
- * Removes application attachments and applications posts once sent to broadbean.
- *
- * @param integer $application_post_id The post ID of the application created.
- * @param WP_Post $job_post The post object for the job applied for.
- * @param integer $attachment_id The post ID of the attachment post created, for the application attachment.
- */
-function wpbb_remove_application_post( $application_post_id, $job_post, $attachment_id ) {
-
- // should we remove the application cv just uploaded
- if ( true === wpbb_maybe_remove_application_attachments() ) {
-
- // lets remove the file that was just uploaded
- $attachment_deleted = wp_delete_attachment( $attachment_id, true );
-
- }
-
- // should we remove the application post just created
- if ( true === wpbb_maybe_remove_application_post() ) {
-
- // lets remove the file that was just uploaded
- $application_deleted = wp_delete_post( $application_post_id, true );
-
- }
-
-}
-add_action( 'wpbb_after_application_form_processing', 'wpbb_remove_application_post', 10, 3 );
diff --git a/functions/default-fields.php b/functions/default-fields.php
deleted file mode 100644
index ce57a00..0000000
--- a/functions/default-fields.php
+++ /dev/null
@@ -1,208 +0,0 @@
- 'the label given to the field used in the admin',
- * 'id' => 'meta key used when saving the data as post meta',
- * 'type' => 'input type to use for outputting the metabox e.g. text, select, textarea etc.
- * 'options' => 'an array of value/name options for select box types
- * 'bb_field' => 'the XML node which should be used from the Broadbean XML field to populate this field with data
- * 'cols' => 'used for layout in the admin meta box - 12 column grid
- * 'desc' => 'a field description shown in the meta box under the field
- * )
- */
-function wpbb_add_default_fields( $fields ) {
-
- /* add our default fields to the array */
- $fields[ 'reference' ] = array(
- 'name' => 'Job Reference',
- 'id' => '_wpbb_job_reference',
- 'bb_field' => 'job_reference',
- 'type' => 'text',
- 'cols' => 12,
- 'desc' => 'Enter the unique job reference/ID.',
- 'show_on_frontend' => true
- );
-
- /**
- * add salary fields
- */
-
- $fields[ 'salary' ] = array(
- 'name' => 'Salary',
- 'id' => '_wpbb_job_salary',
- 'bb_field' => 'salary',
- 'type' => 'text',
- 'cols' => 6,
- 'show_on_frontend' => true
- );
-
- $fields[ 'salary_benefits' ] = array(
- 'name' => 'Salary Benefits',
- 'id' => '_wpbb_job_salary_benefits',
- 'bb_field' => 'salary_benefits',
- 'type' => 'text',
- 'cols' => 6,
- 'show_on_frontend' => false
- );
-
- $fields[ 'salary_per' ] = array(
- 'name' => 'Salary per',
- 'id' => '_wpbb_job_salary_per',
- 'bb_field' => 'salary_per',
- 'type' => 'select',
- 'options' => array(
- 'zero' => 'Select',
- 'hour' => 'Hour',
- 'week' => 'Week',
- 'month' => 'Month',
- 'annum' => 'Year',
- ),
- 'cols' => 6,
- 'show_on_frontend' => true
- );
-
- $fields[ 'salary_currency' ] = array(
- 'name' => 'Salary Currency',
- 'id' => '_wpbb_job_salary_currency',
- 'bb_field' => 'salary_currency',
- 'type' => 'select',
- 'options' => array(
- 'zero' => 'Select',
- 'GBP' => 'GBP',
- 'EUR' => 'Euro',
- ),
- 'cols' => 6,
- 'show_on_frontend' => false
- );
-
- $fields[ 'salary_form' ] = array(
- 'name' => 'Salary From',
- 'id' => '_wpbb_job_salary_from',
- 'bb_field' => 'salary_from',
- 'type' => 'text',
- 'cols' => 6,
- 'show_on_frontend' => false
- );
-
- $fields[ 'salary_to' ] = array(
- 'name' => 'Salary To',
- 'id' => '_wpbb_job_salary_to',
- 'bb_field' => 'salary_to',
- 'type' => 'text',
- 'cols' => 6,
- 'show_on_frontend' => false
- );
-
- /**
- * add contact fields
- */
-
- $fields[ 'contact_name' ] = array(
- 'name' => 'Contact Name',
- 'id' => '_wpbb_job_contact_name',
- 'bb_field' => 'contact_name',
- 'desc' => 'Add the name of the person overseeing this job here.',
- 'type' => 'text',
- 'cols' => 6,
- 'show_on_frontend' => false
- );
-
- $fields[ 'contact_email' ] = array(
- 'name' => 'Contact Email',
- 'id' => '_wpbb_job_contact_email',
- 'bb_field' => 'contact_email',
- 'desc' => 'Add the name of the person overseeing this job here.',
- 'type' => 'text',
- 'cols' => 6,
- 'show_on_frontend' => false
- );
-
- $fields[ 'contact_telephone' ] = array(
- 'name' => 'Contact Tel.',
- 'id' => '_wpbb_job_contact_tel',
- 'bb_field' => 'contact_telephone',
- 'desc' => 'Add the tel no. of the person overseeing this job here.',
- 'type' => 'text',
- 'cols' => 6,
- 'show_on_frontend' => false
- );
-
- $fields[ 'contact_url' ] = array(
- 'name' => 'Contact URL',
- 'id' => '_wpbb_job_contact_url',
- 'bb_field' => 'contact_url',
- 'desc' => 'Add the URL for contact about this job.',
- 'type' => 'text',
- 'cols' => 6,
- 'show_on_frontend' => false
- );
-
- /**
- * add application fields
- */
-
- $fields[ 'application_email' ] = array(
- 'name' => 'Application Email',
- 'id' => '_wpbb_job_broadbean_application_email',
- 'bb_field' => 'application_email',
- 'desc' => 'This is the tracking email used to track applications for this job.',
- 'type' => 'text',
- 'readonly' => true,
- 'cols' => 6,
- 'show_on_frontend' => false
- );
-
- $fields[ 'application_url' ] = array(
- 'name' => 'Application URL',
- 'id' => '_wpbb_job_broadbean_application_url',
- 'bb_field' => 'application_url',
- 'desc' => 'This is the application url, used only if clients should not apply on this site.',
- 'type' => 'text',
- 'readonly' => true,
- 'cols' => 6,
- 'show_on_frontend' => false
- );
-
- /**
- * add misc job fields
- */
-
- $fields[ 'days_to_advertise' ] = array(
- 'name' => 'Days to Advertise',
- 'id' => '_wpbb_job_days_to_advertise',
- 'bb_field' => 'days_to_advertise',
- 'type' => 'text',
- 'cols' => 4,
- 'show_on_frontend' => false
- );
-
- $fields[ 'job_duration' ] = array(
- 'name' => 'Job Duration',
- 'id' => '_wpbb_job_duration',
- 'bb_field' => 'job_duration',
- 'type' => 'text',
- 'cols' => 4,
- 'show_on_frontend' => true
- );
-
- $fields[ 'job_startdate' ] = array(
- 'name' => 'Job Start Date',
- 'id' => '_wpbb_job_start_date',
- 'bb_field' => 'job_startdate',
- 'type' => 'text',
- 'cols' => 4,
- 'show_on_frontend' => true
- );
-
- return $fields;
-
-}
-
-add_filter( 'wpbb_job_fields', 'wpbb_add_default_fields', 10 );
\ No newline at end of file
diff --git a/functions/email-functions.php b/functions/email-functions.php
deleted file mode 100755
index 631fc28..0000000
--- a/functions/email-functions.php
+++ /dev/null
@@ -1,94 +0,0 @@
-
-
-
-
-
- Latest Newsletter
-
-
-
-
-
-
-
- - v<%= pkg.version %> - <%= grunt.template.today("yyyy-mm-dd") %>\n' +
- '<%= pkg.homepage ? " * " + pkg.homepage + "\\n" : "" %>' +
- ' * Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author %>;' + ' License: <%= pkg.license %>\n' +
- ' */',
- cssmin: {
- combine: {
- options: {
- banner: '<%= banner %>'
- },
- files: {
- 'css/dist/cmb.min.css': [ 'css/src/layout.css', 'css/src/generic.css', 'css/src/repeatable.css', 'css/src/group.css', 'css/src/file.css', 'css/src/misc-fields.css' ]
- }
- }
- }
- });
-
- // These plugins provide necessary tasks.
- grunt.loadNpmTasks('grunt-contrib-cssmin');
-
- // Default task.
- grunt.registerTask('default', [ 'cssmin' ] );
-
-};
diff --git a/functions/metaboxes/class.cmb-meta-box.php b/functions/metaboxes/class.cmb-meta-box.php
deleted file mode 100755
index f5b3af5..0000000
--- a/functions/metaboxes/class.cmb-meta-box.php
+++ /dev/null
@@ -1,349 +0,0 @@
-_meta_box = $meta_box;
-
- if ( empty( $this->_meta_box['id'] ) )
- $this->_meta_box['id'] = sanitize_title( $this->_meta_box['title'] );
-
- $upload = false;
-
- foreach ( $meta_box['fields'] as $field ) {
- if ( $field['type'] == 'file' || $field['type'] == 'file_list' ) {
- $upload = true;
- break;
- }
- }
-
- add_action( 'dbx_post_advanced', array( &$this, 'init_fields_for_post' ) );
- add_action( 'cmb_init_fields', array( &$this, 'init_fields' ) );
-
- global $pagenow;
-
- if ( $upload && in_array( $pagenow, array( 'page.php', 'page-new.php', 'post.php', 'post-new.php' ) ) )
- add_action( 'admin_head', array( &$this, 'add_post_enctype' ) );
-
- add_action( 'admin_menu', array( &$this, 'add' ) );
- add_action( 'save_post', array( &$this, 'save_for_post' ) );
- add_action( 'cmb_save_fields', array( &$this, 'save' ) );
-
- add_action( 'admin_enqueue_scripts', array( &$this, 'enqueue_scripts' ) );
- add_action( 'admin_enqueue_scripts', array( &$this, 'enqueue_styles' ) );
-
- add_filter( 'cmb_show_on', array( &$this, 'add_for_id' ), 10, 2 );
- add_filter( 'cmb_show_on', array( &$this, 'add_for_page_template' ), 10, 2 );
-
- }
-
- public function init_fields( $post_id = 0 ) {
-
- foreach ( $this->_meta_box['fields'] as $key => $field ) {
-
- $values = array();
-
- // Set up blank or default values for empty ones
- //
- $defaults = array(
- 'name' => '',
- 'desc' => '',
- 'std' => '',
- 'cols' => 12
- );
-
- $field = wp_parse_args( $field, $defaults );
-
- if ( 'file' == $field['type'] && ! isset( $field['allow'] ) )
- $field['allow'] = array( 'url', 'attachment' );
-
- if ( 'file' == $field['type'] && ! isset( $field['save_id'] ) )
- $field['save_id'] = false;
-
- $field['name_attr'] = $field['id'];
- $class = _cmb_field_class_for_type( $field['type'] );
-
- if ( ! empty( $this->_meta_box['repeatable'] ) )
- $field['repeatable'] = true;
-
-
- // Else if we are on a post edit screen
- elseif ( $post_id )
- $values = (array) get_post_meta( $post_id, $field['id'], false );
-
-
- $this->fields[] = new $class( $field['id'], $field['name'], (array) $values, $field );
-
- }
-
- }
-
- public function init_fields_for_post() {
-
- global $post, $temp_ID;
-
- // Get the current ID
- if( isset( $_GET['post'] ) )
- $post_id = $_GET['post'];
-
- elseif( isset( $_POST['post_ID'] ) )
- $post_id = $_POST['post_ID'];
-
- elseif ( ! empty( $post->ID ) )
- $post_id = $post->ID;
-
- if ( is_page() || ! isset( $post_id ) )
- return false;
-
- $this->init_fields( (int) $post_id );
-
- }
-
- function enqueue_scripts() {
-
- wp_enqueue_script( 'cmb-scripts', trailingslashit( CMB_URL ) . 'js/cmb.js', array( 'jquery' ) );
-
- foreach ( $this->fields as $field )
- $field->enqueue_scripts();
-
- }
-
- function enqueue_styles() {
-
- $suffix = CMB_DEV ? '' : '.min';
-
- if ( version_compare( get_bloginfo( 'version' ), '3.7', '>' ) )
- wp_enqueue_style( 'cmb-styles', trailingslashit( CMB_URL ) . "css/dist/cmb$suffix.css" );
- else
- wp_enqueue_style( 'cmb-styles', trailingslashit( CMB_URL ) . 'css/legacy.css' );
-
- foreach ( $this->fields as $field )
- $field->enqueue_styles();
-
- }
-
- function add_post_enctype() { ?>
-
-
-
- _meta_box['context'] = empty($this->_meta_box['context']) ? 'normal' : $this->_meta_box['context'];
- $this->_meta_box['priority'] = empty($this->_meta_box['priority']) ? 'low' : $this->_meta_box['priority'];
-
- // Backwards compatablilty.
- if ( isset( $this->_meta_box['show_on']['key'] ) ) {
- $this->_meta_box['show_on'][ $this->_meta_box['show_on']['key'] ] = $this->_meta_box['show_on']['value'];
- unset( $this->_meta_box['show_on']['key'] );
- unset( $this->_meta_box['show_on']['value'] );
- }
-
- foreach ( (array) $this->_meta_box['pages'] as $page )
- if ( apply_filters( 'cmb_show_on', true, $this->_meta_box ) )
- add_meta_box( $this->_meta_box['id'], $this->_meta_box['title'], array(&$this, 'show'), $page, $this->_meta_box['context'], $this->_meta_box['priority'] ) ;
-
- }
-
- /**
- * Show On Filters
- * Use the 'cmb_show_on' filter to further refine the conditions under which a metabox is displayed.
- * Below you can limit it by ID and page template
- */
-
- // Add for ID
- function add_for_id( $display, $meta_box ) {
-
- $post_id = isset( $_GET['post'] ) ? $_GET['post'] : null;
-
- if ( ! $post_id )
- $post_id = isset( $_POST['post_id'] ) ? $_POST['post_id'] : null;
-
- if ( ! $post_id || ! isset( $meta_box['show_on']['id'] ) )
- return $display;
-
-
-
- // If value isn't an array, turn it into one
- $meta_box['show_on']['id'] = ! is_array( $meta_box['show_on']['id'] ) ? array( $meta_box['show_on']['id'] ) : $meta_box['show_on']['id'];
-
- return in_array( $post_id, $meta_box['show_on']['id'] );
-
- }
-
- // Add for Page Template
- function add_for_page_template( $display, $meta_box ) {
-
- $post_id = isset( $_GET['post'] ) ? $_GET['post'] : null;
-
- if ( ! $post_id )
- $post_id = isset( $_POST['post_id'] ) ? $_POST['post_id'] : null;
-
- if ( ! $post_id || ! isset( $meta_box['show_on']['page-template'] ) )
- return $display;
-
- // Get current template
- $current_template = get_post_meta( $post_id, '_wp_page_template', true );
-
- // If value isn't an array, turn it into one
- $meta_box['show_on']['page-template'] = !is_array( $meta_box['show_on']['page-template'] ) ? array( $meta_box['show_on']['page-template'] ) : $meta_box['show_on']['page-template'];
-
- return in_array( $current_template, $meta_box['show_on']['page-template'] );
-
- }
-
- // Show fields
- function show() { ?>
-
-
-
- fields );
-
- }
-
- /**
- * Layout an array of fields, depending on their 'cols' property.
- *
- * This is a static method so other fields can use it that rely on sub fields
- *
- * @param CMB_Field[] $fields
- */
- static function layout_fields( array $fields ) { ?>
-
-
-
- $value ) {
-
- if ( false !== strpos( $key, 'cmb-group-x' ) || false !== strpos( $key, 'cmb-field-x' ) )
- unset( $values[$key] );
-
- elseif ( is_array( $value ) )
- $values[$key] = $this->strip_repeatable( $value );
-
- }
-
- return $values;
- }
-
- // Save data from metabox
- function save( $post_id = 0 ) {
-
- // verify nonce
- if ( ! isset( $_POST['wp_meta_box_nonce'] ) || ! wp_verify_nonce( $_POST['wp_meta_box_nonce'], basename( __FILE__ ) ) )
- return $post_id;
-
- foreach ( $this->_meta_box['fields'] as $field ) {
-
- // verify this meta box was shown on the page
- if ( ! isset( $_POST['_cmb_present_' . $field['id'] ] ) )
- continue;
-
- if ( isset( $_POST[$field['id']] ) )
- $value = (array) $_POST[$field['id']];
- else
- $value = array();
-
- $value = $this->strip_repeatable( $value );
-
- if ( ! $class = _cmb_field_class_for_type( $field['type'] ) ) {
- do_action('cmb_save_' . $field['type'], $field, $value);
- }
-
- if ( !empty( $this->_meta_box['repeatable'] ) )
- $field['repeatable'] = true;
-
- $field_obj = new $class( $field['id'], $field['name'], $value, $field );
- $field_obj->save( $post_id, $value );
-
- }
-
- // If we are not on a post, need to refresh the field objects to reflect new values, as we do not get a redirect
- if ( ! $post_id ) {
- $this->fields = array();
- $this->init_fields();
- }
- }
-
- // Save the on save_post hook
- function save_for_post( $post_id ) {
-
- // check autosave
- if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
- return $post_id;
-
- $this->save( $post_id );
-
- }
-}
diff --git a/functions/metaboxes/classes.fields.php b/functions/metaboxes/classes.fields.php
deleted file mode 100755
index 0b05f2c..0000000
--- a/functions/metaboxes/classes.fields.php
+++ /dev/null
@@ -1,1439 +0,0 @@
-id = $name;
- $this->name = $name . '[]';
- $this->title = $title;
-
- $this->args = wp_parse_args( $args, array(
- 'repeatable' => false,
- 'std' => '',
- 'default' => '',
- 'show_label' => false,
- 'taxonomy' => '',
- 'hide_empty' => false,
- 'data_delegate' => null,
- 'options' => array(),
- 'cols' => '12',
- 'style' => '',
- 'class' => '',
- 'readonly' => false,
- 'disabled' => false
- )
- );
-
- if ( ! empty( $this->args['std'] ) && empty( $this->args['default'] ) ) {
- $this->args['default'] = $this->args['std'];
- _deprecated_argument( 'CMB_Field', "'std' is deprecated, use 'default instead'", '0.9' );
- }
-
- if ( ! empty( $this->args['options'] ) && is_array( reset( $this->args['options'] ) ) ) {
-
- $re_format = array();
-
- foreach ( $this->args['options'] as $option )
- $re_format[$option['value']] = $option['name'];
-
- $this->args['options'] = $re_format;
- }
-
- // If the field has a custom value populator callback
- if ( ! empty( $args['values_callback'] ) )
- $this->values = call_user_func( $args['values_callback'], get_the_id() );
- else
- $this->values = $values;
-
- $this->value = reset( $this->values );
-
- $this->description = ! empty( $this->args['desc'] ) ? $this->args['desc'] : '';
-
- }
-
- /**
- * Enqueue all scripts required by the field.
- *
- * @uses wp_enqueue_script()
- */
- public function enqueue_scripts() {
- }
-
- /**
- * Enqueue all styles required by the field.
- *
- * @uses wp_enqueue_style()
- */
- public function enqueue_styles() {
- }
-
- /**
- * Output the field input ID attribute.
- *
- * If multiple inputs are required for a single field,
- * use the append parameter to add unique identifier.
- *
- * @param string $append
- * @return null
- */
- public function id_attr( $append = null ) {
-
- printf( 'id="%s"', esc_attr( $this->get_the_id_attr( $append ) ) );
-
- }
-
- /**
- * Output the for attribute for the field.
- *
- *
- *
- * If multiple inputs are required for a single field,
- * use the append parameter to add unique identifier.
- *
- * @param string $append
- * @return null
- */
- public function get_the_id_attr( $append = null ) {
-
- $id = $this->id;
-
- if ( isset( $this->parent ) ) {
- $parent_id = preg_replace( '/cmb\-field\-(\d|x)+/', 'cmb-group-$1', $this->parent->get_the_id_attr() );
- $id = $parent_id . '[' . $id . ']';
- }
-
- $id .= '-cmb-field-' . $this->field_index;
-
- if ( ! is_null( $append ) )
- $id .= '-' . $append;
-
- $id = str_replace( array( '[', ']', '--' ), '-', $id );
-
- return $id;
-
- }
-
- /**
- * Return the field input ID attribute value.
- *
- * If multiple inputs are required for a single field,
- * use the append parameter to add unique identifier.
- *
- * @param string $append
- * @return string id attribute value.
- */
- public function for_attr( $append = null ) {
-
- printf( 'for="%s"', esc_attr( $this->get_the_id_attr( $append ) ) );
-
- }
-
- public function name_attr( $append = null ) {
-
- printf( 'name="%s"', esc_attr( $this->get_the_name_attr( $append ) ) );
-
- }
-
- public function get_the_name_attr( $append = null ) {
-
- $name = str_replace( '[]', '', $this->name );
-
- if ( isset( $this->parent ) ) {
- $parent_name = preg_replace( '/cmb\-field\-(\d|x)+/', 'cmb-group-$1', $this->parent->get_the_name_attr() );
- $name = $parent_name . '[' . $name . ']';
- }
-
- $name .= "[cmb-field-$this->field_index]";
-
- if ( ! is_null( $append ) )
- $name .= $append;
-
- return $name;
-
- }
-
- public function class_attr( $classes = '' ) {
-
- if ( $classes = implode( ' ', array_map( 'sanitize_html_class', array_filter( array_unique( explode( ' ', $classes . ' ' . $this->args['class'] ) ) ) ) ) ) { ?>
-
- class=""
-
- get_the_id_attr() ); // JS friendly ID
-
- }
-
- public function boolean_attr( $attrs = array() ) {
-
- if ( $this->args['readonly'] )
- $attrs[] = 'readonly';
-
- if ( $this->args['disabled'] )
- $attrs[] = 'disabled';
-
- $attrs = array_filter( array_unique( $attrs ) );
-
- foreach ( $attrs as $attr )
- echo esc_html( $attr ) . '="' . esc_attr( $attr ) . '"';
-
- }
-
- /**
- * Check if this field has a data delegate set
- *
- * @return boolean
- */
- public function has_data_delegate() {
- return (bool) $this->args['data_delegate'];
- }
-
- /**
- * Get the array of data from the data delegate
- *
- * @return array mixed
- */
- protected function get_delegate_data() {
-
- if ( $this->args['data_delegate'] )
- return call_user_func_array( $this->args['data_delegate'], array( $this ) );
-
- return array();
-
- }
-
- public function get_value() {
- return ( $this->value || $this->value === '0' ) ? $this->value : $this->args['default'];
- }
-
- public function &get_values() {
- return $this->values;
- }
-
- public function set_values( array $values ) {
-
- $this->values = $values;
-
- unset( $this->value );
-
- }
-
- public function parse_save_values() {}
-
- public function parse_save_value() {}
-
- /**
- * @todo this surely only works for posts
- * @todo why do values need to be passed in, they can already be passed in on construct
- */
- public function save( $post_id, $values ) {
-
- // Don't save readonly values.
- if ( $this->args['readonly'] )
- return;
-
- $this->values = $values;
- $this->parse_save_values();
-
- // Allow override from args
- if ( ! empty( $this->args['save_callback'] ) ) {
-
- call_user_func( $this->args['save_callback'], $this->values, $post_id );
-
- return;
-
- }
-
- // If we are not on a post edit screen
- if ( ! $post_id )
- return;
-
- delete_post_meta( $post_id, $this->id );
-
- foreach( $this->values as $v ) {
-
- $this->value = $v;
- $this->parse_save_value();
-
- if ( $this->value || $this->value === '0' )
- add_post_meta( $post_id, $this->id, $this->value );
-
- }
- }
-
- public function title() {
-
- if ( $this->title ) { ?>
-
-
- for_attr(); ?>>
- title ); ?>
-
-
-
- description ) { ?>
-
- description ); ?>
-
- get_values() && ! $this->args['repeatable'] )
- $values = array( '' );
- else
- $values = $this->get_values();
-
- $this->title();
-
- $this->description();
-
- $i = 0;
- foreach ( $values as $key => $value ) {
-
- $this->field_index = $i;
- $this->value = $value; ?>
-
-
-
- args['repeatable'] ) : ?>
- ×
-
-
- html(); ?>
-
-
-
- args['repeatable'] ) {
-
- $this->field_index = 'x'; // x used to distinguish hidden fields.
- $this->value = ''; ?>
-
-
-
- args['repeatable'] ) : ?>
- × Remove Group
-
-
- html(); ?>
-
-
-
-
-
-
-
- id_attr(); ?> boolean_attr(); ?> class_attr(); ?> name_attr(); ?> value="get_value() ); ?>" />
-
- args['class'] .= ' cmb_text_small';
-
- parent::html();
-
- }
-}
-
-/**
- * Field for image upload / file updoad.
- *
- * @todo ability to set image size (preview image) from caller
- */
-class CMB_File_Field extends CMB_Field {
-
- function enqueue_scripts() {
-
- parent::enqueue_scripts();
- wp_enqueue_media();
- wp_enqueue_script( 'cmb-file-upload', trailingslashit( CMB_URL ) . 'js/file-upload.js', array( 'jquery', 'cmb-scripts' ) );
-
- }
-
- public function html() {
-
- $args = wp_parse_args( $this->args, array(
- 'library-type' => array( 'video', 'audio', 'text', 'application' )
- ) );
-
- if ( $this->get_value() ) {
- $src = wp_mime_type_icon( $this->get_value() );
- $size = getimagesize($src);
- $icon_img = ' ';
- }
-
- $data_type = ( ! empty( $args['library-type'] ) ? implode( ',', $args['library-type'] ) : null );
-
- ?>
-
- >
-
-
-
-
-
-
-
-
-
- get_value() ) : ?>
-
-
-
-
- get_value() ) ) ); ?>
-
-
-
-
-
-
-
-
-
-
-
name_attr(); ?> value="value ); ?>" />
-
-
-
- args = wp_parse_args( $this->args, array(
- 'size' => 'thumbnail',
- 'library-type' => array( 'image' ),
- 'show_size' => false
- ) );
-
- if ( $this->get_value() )
- $image = wp_get_attachment_image_src( $this->get_value(), $args['size'], true );
-
- // Convert size arg to array of width, height, crop.
- $size = $this->parse_image_size( $args['size'] );
-
- // Inline styles.
- $styles = sprintf( 'width: %1$dpx; height: %2$dpx; line-height: %2$dpx', intval( $size['width'] ), intval( $size['height'] ) );
- $placeholder_styles = sprintf( 'width: %dpx; height: %dpx;', intval( $size['width'] ) - 8, intval( $size['height'] ) - 8 );
-
- $data_type = ( ! empty( $args['library-type'] ) ? implode( ',', $args['library-type'] ) : null );
-
- ?>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
name_attr(); ?> value="value ); ?>" />
-
-
-
- get_option( $size . '_size_w' ),
- 'height' => get_option( $size . '_size_h' ),
- 'crop' => get_option( $size . '_crop' )
- );
- }
-
- // Handle string for additional image sizes
- global $_wp_additional_image_sizes;
- if ( is_string( $size ) && isset( $_wp_additional_image_sizes[$size] ) ) {
- return array(
- 'width' => $_wp_additional_image_sizes[$size]['width'],
- 'height' => $_wp_additional_image_sizes[$size]['height'],
- 'crop' => $_wp_additional_image_sizes[$size]['crop']
- );
- }
-
- // Handle default WP size format.
- if ( is_array( $size ) && isset( $size[0] ) && isset( $size[1] ) )
- $size = array( 'width' => $size[0], 'height' => $size[0] );
-
- return wp_parse_args( $size, array(
- 'width' => get_option( 'thumbnail_size_w' ),
- 'height' => get_option( 'thumbnail_size_h' ),
- 'crop' => get_option( 'thumbnail_crop' )
- ) );
-
- }
-
- /**
- * Ajax callback for outputing an image src based on post data.
- *
- * @return null
- */
- static function request_image_ajax_callback() {
-
- if ( ! ( isset( $_POST['nonce'] ) && wp_verify_nonce( $_POST['nonce'], 'cmb-file-upload-nonce' ) ) )
- return;
-
- $id = intval( $_POST['id'] );
-
- $size = array(
- intval( $_POST['width'] ),
- intval( $_POST['height'] ),
- 'crop' => (bool) $_POST['crop']
- );
-
- $image = wp_get_attachment_image_src( $id, $size );
- echo reset( $image );
-
- die(); // this is required to return a proper result
- }
-
-}
-add_action( 'wp_ajax_cmb_request_image', array( 'CMB_Image_Field', 'request_image_ajax_callback' ) );
-
-/**
- * Standard text meta box for a URL.
- *
- */
-class CMB_URL_Field extends CMB_Field {
-
- public function html() { ?>
-
- id_attr(); ?> boolean_attr(); ?> class_attr( 'cmb_text_url code' ); ?> name_attr(); ?> value="value ) ); ?>" />
-
-
-
- id_attr(); ?> boolean_attr(); ?> class_attr( 'cmb_text_small cmb_datepicker' ); ?> type="text" name_attr(); ?> value="value ); ?>" />
-
-
-
- id_attr(); ?> boolean_attr(); ?> class_attr( 'cmb_text_small cmb_timepicker' ); ?> type="text" name_attr(); ?> value="value ); ?>"/>
-
-
-
- id_attr(); ?> boolean_attr(); ?> class_attr( 'cmb_text_small cmb_datepicker' ); ?> type="text" name_attr(); ?> value="value ? esc_attr( date( 'm\/d\/Y', $this->value ) ) : '' ?>" />
-
- values as &$value )
- $value = strtotime( $value );
-
- sort( $this->values );
-
- }
-
-}
-
-/**
- * Date picker for date and time (seperate fields) box.
- *
- */
-class CMB_Datetime_Timestamp_Field extends CMB_Field {
-
- public function enqueue_scripts() {
-
- parent::enqueue_scripts();
-
- wp_enqueue_style( 'cmb-jquery-ui', trailingslashit( CMB_URL ) . 'css/jquery-ui.css', '1.10.3' );
-
- wp_enqueue_script( 'cmb-timepicker', trailingslashit( CMB_URL ) . 'js/jquery.timePicker.min.js', array( 'jquery', 'cmb-scripts' ) );
- wp_enqueue_script( 'cmb-datetime', trailingslashit( CMB_URL ) . 'js/field.datetime.js', array( 'jquery', 'jquery-ui-core', 'jquery-ui-datepicker', 'cmb-scripts' ) );
- }
-
- public function html() { ?>
-
- id_attr('date'); ?> boolean_attr(); ?> class_attr( 'cmb_text_small cmb_datepicker' ); ?> type="text" name_attr( '[date]' ); ?> value="value ? esc_attr( date( 'm\/d\/Y', $this->value ) ) : '' ?>" />
- id_attr('time'); ?> boolean_attr(); ?> class_attr( 'cmb_text_small cmb_timepicker' ); ?> type="text" name_attr( '[time]' ); ?> value="value ? esc_attr( date( 'h:i A', $this->value ) ) : '' ?>" />
-
- values as $key => &$value ) {
- if ( empty( $value['date'] ) )
- unset( $this->values[$key] );
- else
- $value = strtotime( $value['date'] . ' ' . $value['time'] );
- }
-
- $this->values = array_filter( $this->values );
- sort( $this->values );
-
- parent::parse_save_values();
-
- }
-
-}
-
-/**
- * Standard text field.
- *
- * Args:
- * - int "rows" - number of rows in the
- */
-class CMB_Textarea_Field extends CMB_Field {
-
- public function html() { ?>
-
- id_attr(); ?> boolean_attr(); ?> class_attr(); ?> rows="args['rows'] ) ? esc_attr( $this->args['rows'] ) : 4; ?>" name_attr(); ?>>value ); ?>
-
-
- */
-class CMB_Textarea_Field_Code extends CMB_Textarea_Field {
-
- public function html() {
-
- $this->args['class'] .= ' code';
-
- parent::html();
-
- }
-
-}
-
-/**
- * Colour picker
- *
- */
-class CMB_Color_Picker extends CMB_Field {
-
- public function enqueue_scripts() {
-
- parent::enqueue_scripts();
-
- wp_enqueue_script( 'cmb-colorpicker', trailingslashit( CMB_URL ) . 'js/field.colorpicker.js', array( 'jquery', 'wp-color-picker', 'cmb-scripts' ) );
- wp_enqueue_style( 'wp-color-picker' );
- }
-
- public function html() { ?>
-
- id_attr(); ?> boolean_attr(); ?> class_attr( 'cmb_colorpicker cmb_text_small' ); ?> type="text" name_attr(); ?> value="get_value() ); ?>" />
-
- has_data_delegate() )
- $this->args['options'] = $this->get_delegate_data(); ?>
-
- args['options'] as $key => $value ): ?>
-
- id_attr( 'item-' . $key ); ?> boolean_attr(); ?> class_attr(); ?> type="radio" name_attr(); ?> value="" get_value() ); ?> />
- for_attr( 'item-' . $key ); ?> style="margin-right: 20px;">
-
-
-
-
-
-
-
- id_attr(); ?> boolean_attr(); ?> class_attr(); ?> type="checkbox" name_attr(); ?> value="1" get_value() ); ?> />
- for_attr(); ?>>args['name'] ); ?>
-
-
-
-
-
- title ); ?>
-
-
-
- get_the_id_attr();
- $name = $this->get_the_name_attr();
-
- $field_id = $this->get_js_id();
-
- printf( '', $id, $name, $field_id );
-
- if ( $this->is_placeholder() ) {
-
- // For placeholder, output the markup for the editor in a JS var.
- ob_start();
- $this->args['options']['textarea_name'] = 'cmb-placeholder-name-' . $field_id;
- wp_editor( '', 'cmb-placeholder-id-' . $field_id, $this->args['options'] );
- $editor = ob_get_clean();
- $editor = str_replace( array( "\n", "\r" ), "", $editor );
- $editor = str_replace( array( "'" ), '"', $editor );
-
- ?>
-
-
-
- args['options']['textarea_name'] = $name;
- echo wp_editor( $this->get_value(), $id, $this->args['options'] );
-
- }
-
- echo '
';
-
- }
-
- /**
- * Check if this is a placeholder field.
- * Either the field itself, or because it is part of a repeatable group.
- *
- * @return bool
- */
- public function is_placeholder() {
-
- if ( isset( $this->parent ) && ! is_int( $this->parent->field_index ) )
- return true;
-
- else return ! is_int( $this->field_index );
-
- }
-
-}
-
-/**
- * Standard select field.
- *
- * @supports "data_delegate"
- * @args
- * 'options' => array Array of options to show in the select, optionally use data_delegate instead
- * 'allow_none' => bool Allow no option to be selected (will palce a "None" at the top of the select)
- * 'multiple' => bool whether multiple can be selected
- */
-class CMB_Select extends CMB_Field {
-
- public function __construct() {
-
- $args = func_get_args();
-
- call_user_func_array( array( 'parent', '__construct' ), $args );
-
- $this->args = wp_parse_args( $this->args, array( 'multiple' => false ) );
-
- }
-
- public function parse_save_values(){
-
- if ( isset( $this->parent ) && isset( $this->args['multiple'] ) && $this->args['multiple'] )
- $this->values = array( $this->values );
-
- }
-
- public function get_options() {
-
- if ( $this->has_data_delegate() )
- $this->args['options'] = $this->get_delegate_data();
-
- return $this->args['options'];
- }
-
- public function enqueue_scripts() {
-
- parent::enqueue_scripts();
-
- wp_enqueue_script( 'select2', trailingslashit( CMB_URL ) . 'js/select2/select2.js', array( 'jquery' ) );
- wp_enqueue_script( 'field-select', trailingslashit( CMB_URL ) . 'js/field.select.js', array( 'jquery', 'select2', 'cmb-scripts' ) );
- }
-
- public function enqueue_styles() {
-
- parent::enqueue_styles();
-
- wp_enqueue_style( 'select2', trailingslashit( CMB_URL ) . 'js/select2/select2.css' );
- }
-
- public function html() {
-
- if ( $this->has_data_delegate() )
- $this->args['options'] = $this->get_delegate_data();
-
- $this->output_field();
-
- $this->output_script();
-
- }
-
- public function output_field() {
-
- $val = (array) $this->get_value();
-
- $name = $this->get_the_name_attr();
- $name .= ! empty( $this->args['multiple'] ) ? '[]' : null;
-
- ?>
-
- id_attr(); ?>
- boolean_attr(); ?>
-
- get_js_id() ) ); ?>
- args['multiple'] ) ? 'multiple' : '' ?>
- class="cmb_select"
- style="width: 100%"
- >
-
- args['allow_none'] ) ) : ?>
-
-
-
- args['options'] as $value => $name ): ?>
- value="">
-
-
-
-
-
-
-
-
- args['data_delegate'] = array( $this, 'get_delegate_data' );
-
- }
-
- public function get_delegate_data() {
-
- $terms = $this->get_terms();
-
- $term_options = array();
-
- foreach ( $terms as $term )
- $term_options[$term->term_id] = $term->name;
-
- return $term_options;
-
- }
-
- private function get_terms() {
-
- return get_terms( $this->args['taxonomy'], array( 'hide_empty' => $this->args['hide_empty'] ) );
-
- }
-
-}
-
-/**
- * Post Select field.
- *
- * @supports "data_delegate"
- * @args
- * 'options' => array Array of options to show in the select, optionally use data_delegate instead
- * 'allow_none' => bool Allow no option to be selected (will palce a "None" at the top of the select)
- * 'multiple' => bool whether multiple can be selected
- */
-class CMB_Post_Select extends CMB_Select {
-
- public function __construct() {
-
- $args = func_get_args();
-
- call_user_func_array( array( 'parent', '__construct' ), $args );
-
- $this->args = wp_parse_args( $this->args, array( 'use_ajax' => false, 'ajax_url' => '' ) );
-
- $this->args['query'] = isset( $this->args['query'] ) ? $this->args['query'] : array();
-
- if ( ! $this->args['use_ajax'] ) {
-
- $this->args['data_delegate'] = array( $this, 'get_delegate_data' );
-
- } else {
-
- $this->args['ajax_url'] = admin_url( 'admin-ajax.php' );
- $this->args['ajax_args'] = wp_parse_args( $this->args['query'] );
-
- }
-
- }
-
- public function get_delegate_data() {
-
- $data = array();
-
- foreach ( $this->get_posts() as $post_id )
- $data[$post_id] = get_the_title( $post_id );
-
- return $data;
-
- }
-
- private function get_posts() {
-
- $this->args['query']['fields'] = 'ids';
- $query = new WP_Query( $this->args['query'] );
-
- return isset( $query->posts ) ? $query->posts : array();
-
- }
-
- public function parse_save_value() {
-
- // AJAX multi select2 data is submitted as a string of comma separated post IDs.
- // If empty, set to false instead of empty array to ensure the meta entry is deleted.
- if ( $this->args['ajax_url'] && $this->args['multiple'] ) {
- $this->value = ( ! empty( $this->value ) ) ? explode( ',', $this->value ) : false;
- }
-
- }
-
- public function output_field() {
-
- // If AJAX, must use input type not standard select.
- if ( $this->args['ajax_url'] ) :
-
- ?>
-
- id_attr(); ?>
- value ) ) ); ?>
- get_the_name_attr() ) ); ?>
- get_js_id() ) ); ?>
- boolean_attr(); ?>
- class="cmb_select"
- style="width: 100%"
- />
-
-
-
-
-
- 0, 'posts' => array() ) );
- exit;
- }
-
- $args['fields'] = 'ids'; // Only need to retrieve post IDs.
-
- $query = new WP_Query( $args );
-
- $json = array( 'total' => $query->found_posts, 'posts' => array() );
-
- foreach ( $query->posts as $post_id )
- array_push( $json['posts'], array( 'id' => $post_id, 'text' => get_the_title( $post_id ) ) );
-
- echo json_encode( $json );
-
- exit;
-
-}
-add_action( 'wp_ajax_cmb_post_select', 'cmb_ajax_post_select' );
-
-/**
- * Field to group child fieids
- * pass $args[fields] array for child fields
- * pass $args['repeatable'] for cloing all child fields (set)
- *
- * @todo remove global $post reference, somehow
- */
-class CMB_Group_Field extends CMB_Field {
-
- static $added_js;
- private $fields = array();
-
- function __construct() {
-
- $args = func_get_args(); // you can't just put func_get_args() into a function as a parameter
- call_user_func_array( array( 'parent', '__construct' ), $args );
-
- if ( ! empty( $this->args['fields'] ) ) {
- foreach ( $this->args['fields'] as $f ) {
-
- $field_value = isset( $this->value[$f['id']] ) ? $this->value[$f['id']] : '';
- $f['uid'] = $f['id'];
-
- $class = _cmb_field_class_for_type( $f['type'] );
- $f['show_label'] = true;
-
- // Todo support for repeatable fields in groups
- $this->add_field( new $class( $f['uid'], $f['name'], (array) $field_value, $f ) );
-
- }
- }
-
- }
-
- public function enqueue_scripts() {
-
- parent::enqueue_scripts();
-
- foreach ( $this->args['fields'] as $f ) {
-
- $class = _cmb_field_class_for_type( $f['type'] );
- $field = new $class( '', '', array(), $f );
- $field->enqueue_scripts();
- }
- }
-
- public function enqueue_styles() {
-
- parent::enqueue_styles();
-
- foreach ( $this->args['fields'] as $f ) {
- $class = _cmb_field_class_for_type( $f['type'] );
- $field = new $class( '', '', array(), $f );
- $field->enqueue_styles();
- }
-
- }
-
- public function display() {
-
- global $post;
-
- $field = $this->args;
-
- $this->title();
- $this->description();
-
- $i = 0;
- foreach ( $this->get_values() as $value ) {
-
- $this->field_index = $i;
- $this->value = $value;
-
- ?>
-
-
- html(); ?>
-
-
- args['repeatable'] ) {
-
- $this->field_index = 'x'; // x used to distinguish hidden fields.
- $this->value = ''; ?>
-
-
-
- html(); ?>
-
-
-
-
-
- get_fields();
- $value = $this->value;
-
- if ( ! empty( $value ) ) {
- foreach ( $value as $field_id => $field_value ) {
- if ( ! empty( $field_value ) && ! empty( $fields[$field_id] ) )
- $fields[$field_id]->set_values( (array) $field_value );
- else if ( ! empty( $fields[$field_id] ) )
- $fields[$field_id]->set_values( array() );
- }
- } else {
- foreach ( $fields as &$field ) {
- $field->set_values( array() );
- }
- }
-
- ?>
-
- args['repeatable'] ) : ?>
- × Remove Group
-
-
-
-
- get_fields();
- $values = &$this->get_values();
-
- foreach ( $values as &$group_value ) {
- foreach ( $group_value as $field_id => &$field_value ) {
-
- if ( ! isset( $fields[$field_id] ) ) {
- $field_value = array();
- continue;
- }
-
- $field = $fields[$field_id];
- $field->values = $field_value;
- $field->parse_save_values();
-
- $field_value = $field->get_values();
-
- // if the field is a repeatable field, store the whole array of them, if it's not repeatble,
- // just store the first (and only) one directly
- if ( ! $field->args['repeatable'] )
- $field_value = reset( $field_value );
- }
- }
-
- }
-
- public function add_field( CMB_Field $field ) {
- $field->parent = $this;
- $this->fields[$field->id] = $field;
- }
-
- public function &get_fields() {
- return $this->fields;
- }
-
- public function set_values( array $values ) {
-
- $this->values = $values;
- $fields = &$this->get_fields();
-
- foreach ( $values as $value ) {
- foreach ( $value as $field_id => $field_value ) {
- $fields[$field_id]->set_values( (array) $field_value );
- }
- }
-
- }
-
-}
\ No newline at end of file
diff --git a/functions/metaboxes/css/dist/cmb.css b/functions/metaboxes/css/dist/cmb.css
deleted file mode 100755
index d28ab5c..0000000
--- a/functions/metaboxes/css/dist/cmb.css
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * CMB Styles
- *
- * This file is used for development only and is loaded when CMB_DEV is defined as true.
- * cmb.min.css is generated by the Grunt build process.
- */
-
-@import '../src/layout.css';
-@import '../src/generic.css';
-
-/** Features **/
-@import '../src/repeatable.css';
-
-/** Fields **/
-@import '../src/group.css';
-@import '../src/file.css';
-@import '../src/misc-fields.css';
\ No newline at end of file
diff --git a/functions/metaboxes/css/dist/cmb.min.css b/functions/metaboxes/css/dist/cmb.min.css
deleted file mode 100755
index 6068eea..0000000
--- a/functions/metaboxes/css/dist/cmb.min.css
+++ /dev/null
@@ -1,6 +0,0 @@
-/**
- * Custom-Meta-Boxes - v0.1.0-beta - 2013-12-01
- * https://github.com/humanmade/Custom-Meta-Boxes/
- * Copyright (c) 2013 Human Made Limited; License: GPL
- */
-.cmb_metabox .field{padding:16px 0;border-bottom:1px solid #DFDFDF}.cmb-row:last-child>[class*=cmb-cell-]>.field{border-bottom:0}.postbox>.inside>.cmb_metabox{margin:-10px 0}.cmb_metabox .cmb-row{overflow:hidden;margin:0 -5px;zoom:1}.cmb_metabox .cmb-row:after,.cmb_metabox .cmb-row:before{content:"";display:table}.cmb_metabox .cmb-row:after{clear:both}.cmb_metabox [class*=cmb-cell-]{float:left;padding:0 5px;-moz-box-sizing:border-box;box-sizing:border-box}.cmb_metabox .cmb-cell-1{width:8.333333333%}.cmb_metabox .cmb-cell-2{width:16.666666667%}.cmb_metabox .cmb-cell-3{width:25%}.cmb_metabox .cmb-cell-4{width:33.333333333%}.cmb_metabox .cmb-cell-5{width:41.666666667%}.cmb_metabox .cmb-cell-6{width:50%}.cmb_metabox .cmb-cell-7{width:58.333333333%}.cmb_metabox .cmb-cell-8{width:66.666666667%}.cmb_metabox .cmb-cell-9{width:75%}.cmb_metabox .cmb-cell-10{width:83.333333333%}.cmb_metabox .cmb-cell-11{width:91.666666667%}.cmb_metabox .cmb-cell-12{width:100%}@media all and (max-width:850px){.cmb_metabox [class*=cmb-cell-]{width:100%}}.cmb_metabox .field-item{position:relative}.cmb_metabox_description{color:#AAA;font-style:italic;margin:0 0 16px!important}.cmb_metabox input[type=text],.cmb_metabox select,.cmb_metabox textarea{width:100%}.cmb_metabox input.cmb_text_small{width:100px}.cmb_metabox input.cmb_text_medium{width:230px;margin-right:15px}.cmb_metabox input[type=checkbox],.cmb_metabox input[type=radio]{margin:0 5px 0 0;padding:0}.cmb_metabox .field-title{margin-bottom:16px;margin-top:0;font-weight:700}.cmb_metabox .field-title label{vertical-align:baseline}.cmb_metabox .field.repeatable>.field-item{padding-right:30px;margin-bottom:10px}.cmb_metabox .repeat-field{display:block!important;clear:both}.CMB_Date_Field.repeatable .field-item,.CMB_Date_Timestamp_Field.repeatable .field-item,.CMB_Datetime_Timestamp_Field.repeatable .field-item,.CMB_Text_Small_Field.repeatable .field-item,.CMB_Time_Field.repeatable .field-item{float:left;clear:both}.cmb-delete-field{display:inline-block;text-decoration:none;font-size:11px;line-height:20px;height:22px;width:22px;margin:0;padding:0;cursor:pointer;border-width:1px;border-style:solid;-webkit-border-radius:3px;-webkit-appearance:none;border-radius:3px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#555;border-color:#ccc;background:#f7f7f7;-webkit-box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);vertical-align:top;position:absolute;top:3px;right:0;text-indent:100%;overflow:hidden;white-space:nowrap}.cmb-delete-field:active,.cmb-delete-field:focus,.cmb-delete-field:hover{background:#fafafa;border-color:#999;color:#222}.cmb-delete-field .cmb-delete-field-icon{content:' ';display:block;position:absolute;height:8px;width:8px;top:50%;left:50%;margin-top:-4px;margin-left:-4px;background-image:url( '../../images/cmb-icon-remove.png');background-repeat:no-repeat;text-indent:8px;overflow:hidden}@media only screen and (-webkit-min-device-pixel-ratio :1.5),only screen and (min-device-pixel-ratio :1.5){.cmb-delete-field .cmb-delete-field-icon{background-image:url( '../../images/cmb-icon-remove@2x.png');background-size:8px 8px}}* Group **/ .cmb_metabox .CMB_Group_Field>.field-title{font-size:1.5em;clear:left;color:#464646;font-family:HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",sans-serif;font-weight:lighter}.cmb_metabox .CMB_Group_Field>.field-title h2{margin:8px 5px!important}.cmb_metabox .CMB_Group_Field.repeatable>.field-item{padding:30px 10px 0;margin-bottom:16px;border:1px solid #DDD;background:#FAFAFA;position:relative}.cmb_metabox .CMB_Group_Field.repeatable>.field-item:before{content:' ';display:block;position:absolute;top:0;left:0;right:0;height:33px;border-bottom:1px solid #DDD}.cmb_metabox .CMB_Group_Field.repeatable>.field-item>.cmb-delete-field{top:5px;right:5px;width:auto;text-indent:0;padding-left:24px;padding-right:8px;height:22px;line-height:20px;font-size:11px}.cmb_metabox .CMB_Group_Field.repeatable>.field-item>.cmb-delete-field .cmb-delete-field-icon{left:12px}.CMB_File_Field .field-item,.CMB_Image_Field .field-item{float:left;margin:0 16px 16px 0!important;text-align:center;padding:0!important;z-index:1}.cmb-file-wrap{position:relative;overflow:hidden;width:150px;height:150px;line-height:150px}.cmb-file-wrap-placeholder{content:' ';position:absolute;top:0;left:0;display:block;height:142px;width:142px;border:4px dashed #DDD;z-index:-1}.cmb-file-wrap-placeholder .dimensions{line-height:normal;position:absolute;bottom:10px;right:10px;font-size:18px;font-weight:700;opacity:.2}.cmb-file-holder{position:relative;overflow:hidden;box-shadow:inset 0 0 15px rgba(0,0,0,.1),inset 0 0 0 1px rgba(0,0,0,.05);background:#eee;width:100%;height:100%}.cmb-file-holder.type-file img{position:absolute;top:43%;margin-top:-30px;left:50%;margin-left:-23px}.cmb-file-holder.type-img img{width:100%;height:auto;margin-top:0;vertical-align:top}.cmb-file-holder.type-img::after{content:'';display:block;position:absolute;top:0;left:0;right:0;bottom:0;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);overflow:hidden;z-index:1}.cmb-file-name{position:absolute;left:0;right:0;bottom:0;line-height:1.4;overflow:hidden;max-height:100%;word-wrap:break-word;text-align:center;font-weight:700;background:rgba(255,255,255,.8);box-shadow:inset 0 0 0 1px rgba(0,0,0,.15)}.cmb-file-name strong{padding:5px 10px;display:block}.CMB_File_Field .cmb-delete-field,.CMB_Image_Field .cmb-delete-field{z-index:10;top:10px;right:10px}.CMB_File_Field .cmb-remove-file,.CMB_Image_Field .cmb-remove-file{position:absolute;z-index:1;top:5px;right:5px}.CMB_File_Field.repeatable .cmb-remove-file,.CMB_Image_Field.repeatable .cmb-remove-file{display:none!important}.cmb-file-wrap .cmb-file-upload{vertical-align:middle}.cmb-loading::before{content:' ';display:block;background:url( '../../images/wpspin.gif' ) no-repeat;width:16px;height:16px;position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}@media only screen and (-webkit-min-device-pixel-ratio :1.5),only screen and (min-device-pixel-ratio :1.5){.cmb-loading::before{background-image:url( '../../images/wpspin-2x.gif');background-size:16px 16px}}.CMB_Title .field-title{margin:8px 0!important}.CMB_Title h2{margin:0!important;padding:0!important}.CMB_Color_Picker .field-item{float:left;clear:both}.CMB_Color_Picker:after,.CMB_Color_Picker:before{content:"";display:table}.CMB_Color_Picker:after{clear:both}.CMB_Color_Picker{zoom:1}div.time-picker{position:absolute;height:191px;width:4em;overflow:auto;background:#fff;border:1px solid #aaa;z-index:99;margin:0}div.time-picker-12hours{width:6em}div.time-picker ul{list-style-type:none;margin:0;padding:0}div.time-picker li{cursor:pointer;height:10px;font:12px/1 Helvetica,Arial,sans-serif;padding:4px 3px}div.time-picker li.selected{background:#0063CE;color:#fff}.cmb_metabox input.cmb_timepicker{width:100px;margin-right:0}.CMB_Datetime_Timestamp_Field input+input{margin-left:4px}.cmb_select{width:100%}.select2-offscreen{display:none}
\ No newline at end of file
diff --git a/functions/metaboxes/css/legacy.css b/functions/metaboxes/css/legacy.css
deleted file mode 100755
index ede43d8..0000000
--- a/functions/metaboxes/css/legacy.css
+++ /dev/null
@@ -1,206 +0,0 @@
-/**
- * CMB Styling
- */
-.cmb_metabox tr td, table.cmb_metabox tr th { vertical-align: top; padding: 5px; }
-.cmb_metabox th { text-align: right; font-weight:bold;}
-.cmb_metabox th label { margin-top:5px; display:block;}
-div.cmb_metabox_description { color: #AAA; font-style: italic; margin: 2px 0 16px !important;}
-span.cmb_metabox_description { color: #AAA; font-style: italic;}
-.cmb_metabox input,
-.cmb_metabox textarea { font-size:12px; padding: 5px; margin: 0; }
-.cmb_metabox input[type=text], table.cmb_metabox textarea, table.cmb_metabox select { width: 100%; }
-.cmb_metabox textarea.cmb_textarea_code,
-.cmb_metabox textarea.cmb_textarea { vertical-align: top; margin: 0; }
-.cmb_metabox textarea.cmb_textarea_code { font-family: Consolas,Monaco,monospace; line-height: 16px; }
-.cmb_metabox input.cmb_text_small { width: 100px; }
-.cmb_metabox input.cmb_timepicker { width: 100px; margin-right: 0;}
-.cmb_metabox input.cmb_text_money { width: 90px; margin-right: 15px;}
-.cmb_metabox input.cmb_text_medium { width: 230px; margin-right: 15px;}
-.cmb_metabox input.cmb_upload_file { width: 65%; }
-.cmb_metabox li { font-size:12px; margin: 1px 0 5px 0; line-height: 16px; }
-.cmb_metabox ul { padding-top:5px; margin: 0; }
-.cmb_metabox select { font-size:12px; margin-top: 3px;}
-.cmb_metabox input:focus, table.cmb_metabox textarea:focus { background: #fffff8;}
-.cmb_metabox_title { margin: 0 0 5px 0; padding: 5px 0 0 0; font: italic 24px/35px Georgia,"Times New Roman","Bitstream Charter",Times,serif;}
-.cmb_radio_inline { padding: 4px 0 0 0;}
-.cmb_radio_inline_option {display: inline; padding-right: 18px;}
-.cmb_metabox input[type="radio"] { margin: 0 5px 0 0; padding: 0;}
-.cmb_metabox input[type="checkbox"] { margin: 0 5px 0 0; padding: 0;}
-.cmb_metabox .mceIframeContainer {background:#FFF;}
-.cmb_metabox .meta_mce {width:97%;}
-.cmb_metabox .meta_mce textarea {width:100%;}
-.cmb_metabox .cmb_upload_status { margin: 10px 0 0 0;}
-.cmb_metabox .cmb_upload_status .img_status { position: relative; }
-.cmb_metabox .cmb_upload_status .img_status img { border:1px solid #DFDFDF; background: #FAFAFA; max-width:350px; padding: 5px; -moz-border-radius: 2px; border-radius: 2px;}
-.cmb_remove_file_button { text-indent: -9999px; background: url(../images/ico-delete.png); width: 16px; height: 16px; position: absolute; top: -5px; left: -5px;}
-/* Sidebar placement adjustments */
-.inner-sidebar table.cmb_metabox input[type=text], table.cmb_metabox textarea { width: 100%; }
-.inner-sidebar table.cmb_metabox .cmb_upload_status .img_status img { width: 90%; }
-
-/**
- * Timepicker
- */
-div.time-picker { position: absolute; height: 191px; width:4em; /* needed for IE */ overflow: auto; background: #fff; border: 1px solid #aaa; z-index: 99; margin: 0; }
-div.time-picker-12hours { width:6em; /* needed for IE */ }
-div.time-picker ul { list-style-type: none; margin: 0; padding: 0; }
-div.time-picker li { cursor: pointer; height: 10px; font: 12px/1 Helvetica, Arial, sans-serif; padding: 4px 3px; }
-div.time-picker li.selected { background: #0063CE; color: #fff; }
-
-.field { margin-bottom: 8px; }
-.field-title { margin-bottom: 8px; margin-top: 0; font-weight: bold; }
-#poststuff .field-title h2 { margin: 0 !important; }
-
- .field.repeatable .field-item {
- padding-right: 25px;
- margin-bottom: 8px;
- }
-
-.cmb-delete-field {
- position: absolute;
- top: 6px;
- right: 0;
- width: 16px;
- height: 16px;
- padding-left: 0;
- padding-right: 0;
- text-indent: 26px;
- overflow: hidden;
- white-space: nowrap;
- padding: 0;
- font-size: 20px;
- line-height: 20px;
- text-align: center;
- text-decoration: none;
- color: #464646;
- cursor: pointer;
- border-width: 0;
- border-radius: 3px;
- border: 1px solid #fff;
- box-shadow: 0 0 0 1px rgba(0,0,0,0.3);
- background: #f3f3f3;
- background-image: -webkit-gradient(linear,left top,left bottom,from(#fefefe),to(#f4f4f4));
- background-image: -webkit-linear-gradient(top,#fefefe,#f4f4f4);
- background-image: -moz-linear-gradient(top,#fefefe,#f4f4f4);
- background-image: -o-linear-gradient(top,#fefefe,#f4f4f4);
- background-image: linear-gradient(to bottom,#fefefe,#f4f4f4);
-}
-
-.cmb-delete-field:hover,
-.cmb-delete-field:focus,
-.cmb-delete-field:active {
- box-shadow: 0 0 0 1px rgba(0,0,0,0.6);
-}
-
-.cmb-delete-field .cmb-delete-field-icon {
- content: ' ';
- display: block;
- position: absolute;
- height: 8px;
- width: 8px;
- top: 50%;
- left: 50%;
- margin-top: -4px;
- margin-left: -4px;
- background-image: url( '../images/cmb-icon-remove.png');
- background-repeat: no-repeat;
-}
-
-@media only screen and (-webkit-min-device-pixel-ratio : 1.5), only screen and (min-device-pixel-ratio : 1.5) {
-
- .cmb-delete-field .cmb-delete-field-icon {
- background-image: url( '../images/cmb-icon-remove@2x.png');
- background-size: 8px 8px;
- }
-
-}
-
-#poststuff .field-title h2 { margin: 0 !important; }
-
- .field.repeatable .field-item { padding-right: 25px; margin-bottom: 8px; }
-.ui-icon.delete-field { position: absolute; top: 6px; right: 0; cursor: pointer; opacity: 0.75; }
-.ui-icon.delete-field:hover { opacity: 1; }
-button.repeat-field { display: block !important; clear: both; }
-
-.CMB_Text_Small_Field.repeatable .field-item,
-.CMB_Date_Field.repeatable .field-item,
-.CMB_Time_Field.repeatable .field-item,
-.CMB_Date_Timestamp_Field.repeatable .field-item,
-.CMB_Date_Timestamp_Field.repeatable .field-item,
-.CMB_Datetime_Timestamp_Field.repeatable .field-item {
- float: left; clear: both;
-}
-.CMB_Datetime_Timestamp_Field input + input { margin-left: 4px; }
-
-#poststuff .CMB_Group_Field h2 { padding: 0; margin: 8px 5px; }
-.CMB_Group_Field.repeatable > .field-item { padding: 0 9px; margin-bottom: 16px ; border: 1px solid #DDD; background: #ECECEC; border-radius: 3px; }
-.CMB_Group_Field .cmb_element { display: block; height: 0; }
-.CMB_Group_Field .cmb_element .ui-state-default { /*display: none;*/ margin-right: -3px; margin-top: -5px; }
-
-.CMB_Group_Field > .field-title {
- margin-top: 20px;
- font-size: 1.5em;
- margin-top: 10px;
- margin-bottom: 10px;
- padding: 0 0 3px;
- clear: left;
- color: #464646;
- font-family: "HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",sans-serif;
- font-weight: lighter;
-}
-
-
-.CMB_Group_Field.repeatable > .field-item {
- padding: 0 9px;
- margin-bottom: 16px;
- border: 1px solid #DDD;
- background: #ECECEC;
- border-radius: 3px;
- position: relative;
-}
-
-.CMB_Group_Field .group > .cmb-delete-field {
- top: 0;
- right: -3px;
- width: auto;
- height: auto;
- padding: 2px 5px 2px 20px;
- text-indent: 0;
- font-size: 12px;
- line-height: 14px;
-}
-
-.CMB_Group_Field .group > .cmb-delete-field .cmb-delete-field-icon {
- left: 10px;
- text-indent: 100%;
- overflow: hidden;
-}
-
-
-.CMB_File_Field .field-item,
-.CMB_Image_Field .field-item { float: left; margin: 0 8px 8px 0 !important; text-align: center; padding: 0 !important; z-index: 1; }
-.cmb-file-wrap { position: relative; overflow: hidden; width: 150px; height: 150px; line-height: 150px; }
-.cmb-file-wrap-placeholder { content: ' '; position: absolute; top: 0; left: 0; display: block; height: 142px; width: 142px; border: 4px dashed #DDD; z-index: -1; }
-.cmb-file-wrap-placeholder .dimensions { line-height: normal; position: absolute; bottom: 10px; right: 10px; font-size: 18px; font-weight: bold; opacity: 0.2;}
-.cmb-file-holder { position: relative; overflow: hidden; box-shadow: inset 0 0 15px rgba(0,0,0,0.1),inset 0 0 0 1px rgba(0,0,0,0.05); background: #eee; width: 100%; height: 100%; }
-.cmb-file-holder.type-file img { position: absolute; top: 43%; margin-top: -30px; left: 50%; margin-left: -23px; }
-.cmb-file-holder.type-img img { width: 100%; height: auto; margin-top: 0; vertical-align: top; }
-.cmb-file-holder.type-img::after { content: ''; display: block; position: absolute; top: 0; left: 0; right: 0; bottom: 0; box-shadow: inset 0 0 0 1px rgba(0,0,0,0.1); overflow: hidden; z-index: 1; }
-.cmb-file-name { position: absolute; left: 0; right: 0; bottom: 0; line-height: 1.4; overflow: hidden; max-height: 100%; word-wrap: break-word; text-align: center; font-weight: bold; background: rgba(255,255,255,0.8); box-shadow: inset 0 0 0 1px rgba(0,0,0,0.15); }
-.cmb-file-name strong { padding: 5px 10px; display: block;}
-.CMB_File_Field .cmb-delete-field,
-.CMB_Image_Field .cmb-delete-field { z-index: 10; top: 10px; right: 10px; }
-.CMB_File_Field .cmb-remove-file,
-.CMB_Image_Field .cmb-remove-file { position: absolute; z-index: 1; top: 5px; right: 5px; }
-.CMB_File_Field.repeatable .cmb-remove-file,
-.CMB_Image_Field.repeatable .cmb-remove-file { display: none !important; }
-
-
-.CMB_Color_Picker .field-item { float: left; clear: both; }
-.CMB_Color_Picker .iris-picker .iris-slider-offset { width: auto; height: auto; border: none; background: transparent; margin: 0; /*top: 4px !important; bottom: 5px !important;*/ border-radius: 0; }
-.CMB_Color_Picker .iris-picker .iris-strip .ui-slider-handle { margin-bottom: 0; }
-.CMB_Color_Picker .iris-picker .iris-strip .ui-slider-handle:focus { outline: none; }
-
-.cmb-loading::before { content: ' '; display: block; background: url( '../images/wpspin.gif' ) no-repeat; width: 16px; height: 16px; position: absolute; top: 50%; left: 50%; margin-top: -8px; margin-left: -8px; }
-@media only screen and (-webkit-min-device-pixel-ratio : 1.5), only screen and (min-device-pixel-ratio : 1.5) {
- .cmb-loading::before { background-image: url( '../images/wpspin-2x.gif'); background-size: 16px 16px; }
-}
\ No newline at end of file
diff --git a/functions/metaboxes/css/src/file.css b/functions/metaboxes/css/src/file.css
deleted file mode 100755
index 9ba796e..0000000
--- a/functions/metaboxes/css/src/file.css
+++ /dev/null
@@ -1,142 +0,0 @@
-
-.CMB_File_Field .field-item,
-.CMB_Image_Field .field-item {
- float: left;
- margin: 0 16px 16px 0 !important;
- text-align: center;
- padding: 0 !important;
- z-index: 1;
-}
-
-.cmb-file-wrap {
- position: relative;
- overflow: hidden;
- width: 150px;
- height: 150px;
- line-height: 150px;
-}
-
-.cmb-file-wrap-placeholder {
- content: ' ';
- position: absolute;
- top: 0;
- left: 0;
- display: block;
- height: 142px;
- width: 142px;
- border: 4px dashed #DDD;
- z-index: -1;
-}
-
-.cmb-file-wrap-placeholder .dimensions {
- line-height: normal;
- position: absolute;
- bottom: 10px;
- right: 10px;
- font-size: 18px;
- font-weight: bold;
- opacity: 0.2;
-}
-
-.cmb-file-holder {
- position: relative;
- overflow: hidden;
- box-shadow: inset 0 0 15px rgba(0,0,0,0.1), inset 0 0 0 1px rgba(0,0,0,0.05);
- background: #eee;
- width: 100%;
- height: 100%;
-}
-
-.cmb-file-holder.type-file img {
- position: absolute;
- top: 43%;
- margin-top: -30px;
- left: 50%;
- margin-left: -23px;
-}
-
-.cmb-file-holder.type-img img {
- width: 100%;
- height: auto;
- margin-top: 0;
- vertical-align: top;
-}
-
-.cmb-file-holder.type-img::after {
- content: '';
- display: block;
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- box-shadow: inset 0 0 0 1px rgba(0,0,0,0.1);
- overflow: hidden;
- z-index: 1;
-}
-
-.cmb-file-name {
- position: absolute;
- left: 0;
- right: 0;
- bottom: 0;
- line-height: 1.4;
- overflow: hidden;
- max-height: 100%;
- word-wrap: break-word;
- text-align: center;
- font-weight: bold;
- background: rgba(255,255,255,0.8);
- box-shadow: inset 0 0 0 1px rgba(0,0,0,0.15);
-}
-
-.cmb-file-name strong {
- padding: 5px 10px;
- display: block;
-}
-
-.CMB_File_Field .cmb-delete-field,
-.CMB_Image_Field .cmb-delete-field {
- z-index: 10;
- top: 10px;
- right: 10px;
-}
-
-.CMB_File_Field .cmb-remove-file,
-.CMB_Image_Field .cmb-remove-file {
- position: absolute;
- z-index: 1;
- top: 5px;
- right: 5px;
-}
-
-.CMB_File_Field.repeatable .cmb-remove-file,
-.CMB_Image_Field.repeatable .cmb-remove-file {
- display: none !important;
-}
-
-.cmb-file-wrap .cmb-file-upload {
- vertical-align: middle;
-}
-
-.cmb-loading::before {
- content: ' ';
- display: block;
- background: url( '../../images/wpspin.gif' ) no-repeat;
- width: 16px;
- height: 16px;
- position: absolute;
- top: 50%;
- left: 50%;
- margin-top: -8px;
- margin-left: -8px;
-}
-
-@media only screen and (-webkit-min-device-pixel-ratio : 1.5), only screen and (min-device-pixel-ratio : 1.5) {
-
- .cmb-loading::before {
- background-image: url( '../../images/wpspin-2x.gif');
- background-size: 16px 16px;
- }
-
-}
\ No newline at end of file
diff --git a/functions/metaboxes/css/src/generic.css b/functions/metaboxes/css/src/generic.css
deleted file mode 100755
index 3e4843c..0000000
--- a/functions/metaboxes/css/src/generic.css
+++ /dev/null
@@ -1,45 +0,0 @@
-.cmb_metabox .field-item {
- position: relative;
-}
-
-.cmb_metabox_description {
- color: #AAA;
- font-style: italic;
- margin: 0 0 16px !important;
-}
-
-.cmb_metabox input[type=text],
-.cmb_metabox textarea,
-.cmb_metabox select {
- width: 100%;
-}
-
-.cmb_metabox input.cmb_text_small {
- width: 100px;
-}
-
-.cmb_metabox input.cmb_text_medium {
- width: 230px;
- margin-right: 15px;
-}
-
-.cmb_metabox input[type="radio"] {
- margin: 0 5px 0 0;
- padding: 0;
-}
-
-.cmb_metabox input[type="checkbox"] {
- margin: 0 5px 0 0;
- padding: 0;
-}
-
-.cmb_metabox .field-title {
- margin-top: -4px;
- margin-bottom: 16px;
- margin-top: 0;
- font-weight: bold;
-}
-
-.cmb_metabox .field-title label {
- vertical-align: baseline;
-}
\ No newline at end of file
diff --git a/functions/metaboxes/css/src/group.css b/functions/metaboxes/css/src/group.css
deleted file mode 100755
index 79af333..0000000
--- a/functions/metaboxes/css/src/group.css
+++ /dev/null
@@ -1,48 +0,0 @@
-* Group **/
-
-.cmb_metabox .CMB_Group_Field > .field-title {
- font-size: 1.5em;
- clear: left;
- color: #464646;
- font-family: "HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",sans-serif;
- font-weight: lighter;
-}
-
-.cmb_metabox .CMB_Group_Field > .field-title h2 {
- margin: 8px 5px !important;
-}
-
-.cmb_metabox .CMB_Group_Field.repeatable > .field-item {
- padding: 30px 10px 0;
- margin-bottom: 16px;
- border: 1px solid #DDD;
- background: #FAFAFA;
- position: relative;
-}
-
-.cmb_metabox .CMB_Group_Field.repeatable > .field-item:before {
- content: ' ';
- display: block;
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- height: 33px;
- border-bottom: 1px solid #DDDDDD;
-}
-
-.cmb_metabox .CMB_Group_Field.repeatable > .field-item > .cmb-delete-field {
- top: 5px;
- right: 5px;
- width: auto;
- text-indent: 0;
- padding-left: 24px;
- padding-right: 8px;
- height: 22px;
- line-height: 20px;
- font-size: 11px;
-}
-
-.cmb_metabox .CMB_Group_Field.repeatable > .field-item > .cmb-delete-field .cmb-delete-field-icon {
- left: 12px;
-}
\ No newline at end of file
diff --git a/functions/metaboxes/css/src/layout.css b/functions/metaboxes/css/src/layout.css
deleted file mode 100755
index 1fbde74..0000000
--- a/functions/metaboxes/css/src/layout.css
+++ /dev/null
@@ -1,56 +0,0 @@
-/** CMB Layout **/
-
-.cmb_metabox .field {
- padding: 16px 0;
- border-bottom: 1px solid #DFDFDF;
-}
-
-.cmb-row:last-child > [class*="cmb-cell-"] > .field {
- border-bottom: 0;
-}
-
-/* Neaten up the margins when metaboxes are within the standard postbox. */
-.postbox > .inside > .cmb_metabox {
- margin: -10px 0;
-}
-
-.cmb_metabox .cmb-row {
- overflow: hidden;
- margin: 0 -5px;
- zoom: 1;
-}
-
-.cmb_metabox .cmb-row:before,
-.cmb_metabox .cmb-row:after {
- content: "";
- display: table;
-}
-.cmb_metabox .cmb-row:after {
- clear: both;
-}
-
-.cmb_metabox [class*="cmb-cell-"] {
- float: left;
- padding: 0 5px;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-
-.cmb_metabox .cmb-cell-1 { width: 8.333333333%; }
-.cmb_metabox .cmb-cell-2 { width: 16.666666667%; }
-.cmb_metabox .cmb-cell-3 { width: 25%; }
-.cmb_metabox .cmb-cell-4 { width: 33.333333333%; }
-.cmb_metabox .cmb-cell-5 { width: 41.666666667%; }
-.cmb_metabox .cmb-cell-6 { width: 50%; }
-.cmb_metabox .cmb-cell-7 { width: 58.333333333%; }
-.cmb_metabox .cmb-cell-8 { width: 66.666666667%; }
-.cmb_metabox .cmb-cell-9 { width: 75%; }
-.cmb_metabox .cmb-cell-10 { width: 83.333333333%; }
-.cmb_metabox .cmb-cell-11 { width: 91.666666667%; }
-.cmb_metabox .cmb-cell-12 { width: 100%; }
-
-@media all and ( max-width: 850px ) {
-
- .cmb_metabox [class*="cmb-cell-"] { width: 100%; }
-
-}
diff --git a/functions/metaboxes/css/src/misc-fields.css b/functions/metaboxes/css/src/misc-fields.css
deleted file mode 100755
index bc66bdc..0000000
--- a/functions/metaboxes/css/src/misc-fields.css
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * Title Field
- */
-.CMB_Title .field-title {
- margin: 8px 0 !important;
-}
-
-.CMB_Title h2 {
- margin: 0 !important;
- padding: 0 !important;
-}
-
-
-/**
- * Color Picker
- */
-.CMB_Color_Picker .field-item {
- float: left;
- clear: both;
-}
-
-.CMB_Color_Picker:before,
-.CMB_Color_Picker:after {
- content: "";
- display: table;
-}
-
-.CMB_Color_Picker:after {
- clear: both;
-}
-
-.CMB_Color_Picker {
- zoom: 1;
-}
-
-
-/**
- * Timepicker
- */
-div.time-picker { position: absolute; height: 191px; width:4em; /* needed for IE */ overflow: auto; background: #fff; border: 1px solid #aaa; z-index: 99; margin: 0; }
-div.time-picker-12hours { width:6em; /* needed for IE */ }
-div.time-picker ul { list-style-type: none; margin: 0; padding: 0; }
-div.time-picker li { cursor: pointer; height: 10px; font: 12px/1 Helvetica, Arial, sans-serif; padding: 4px 3px; }
-div.time-picker li.selected { background: #0063CE; color: #fff; }
-
-.cmb_metabox input.cmb_timepicker {
- width: 100px;
- margin-right: 0;
-}
-
-.CMB_Datetime_Timestamp_Field input + input {
- margin-left: 4px;
-}
-
-/**
- * Select Fields
- */
-
-.cmb_select {
- width: 100%;
-}
-
-.select2-offscreen {
- display: none;
-}
diff --git a/functions/metaboxes/css/src/repeatable.css b/functions/metaboxes/css/src/repeatable.css
deleted file mode 100755
index e88bf3a..0000000
--- a/functions/metaboxes/css/src/repeatable.css
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- * Repeatable
- */
-
-.cmb_metabox .field.repeatable > .field-item {
- padding-right: 30px;
- margin-bottom: 10px;
- }
-
-.cmb_metabox .repeat-field {
- display: block !important;
- clear: both;
-}
-
-.CMB_Text_Small_Field.repeatable .field-item,
-.CMB_Date_Field.repeatable .field-item,
-.CMB_Time_Field.repeatable .field-item,
-.CMB_Date_Timestamp_Field.repeatable .field-item,
-.CMB_Date_Timestamp_Field.repeatable .field-item,
-.CMB_Datetime_Timestamp_Field.repeatable .field-item {
- float: left; clear: both;
-}
-
-.cmb-delete-field {
- display: inline-block;
- text-decoration: none;
- font-size: 11px;
- line-height: 20px;
- height: 22px;
- width: 22px;
- margin: 0;
- padding: 0;
- cursor: pointer;
- border-width: 1px;
- border-style: solid;
- -webkit-border-radius: 3px;
- -webkit-appearance: none;
- border-radius: 3px;
- white-space: nowrap;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- color: #555;
- border-color: #ccc;
- background: #f7f7f7;
- -webkit-box-shadow: inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);
- box-shadow: inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);
- vertical-align: top;
- position: absolute;
- top: 3px;
- right: 0;
- text-indent: 100%;
- overflow: hidden;
- white-space: nowrap;
-}
-
-.cmb-delete-field:hover,
-.cmb-delete-field:focus,
-.cmb-delete-field:active {
- background: #fafafa;
- border-color: #999;
- color: #222;
-}
-
-.cmb-delete-field .cmb-delete-field-icon {
- content: ' ';
- display: block;
- position: absolute;
- height: 8px;
- width: 8px;
- top: 50%;
- left: 50%;
- margin-top: -4px;
- margin-left: -4px;
- background-image: url( '../../images/cmb-icon-remove.png');
- background-repeat: no-repeat;
- text-indent: 8px;
- overflow: hidden;
-}
-
-@media only screen and (-webkit-min-device-pixel-ratio : 1.5), only screen and (min-device-pixel-ratio : 1.5) {
-
- .cmb-delete-field .cmb-delete-field-icon {
- background-image: url( '../../images/cmb-icon-remove@2x.png');
- background-size: 8px 8px;
- }
-
-}
\ No newline at end of file
diff --git a/functions/metaboxes/css/vendor/jquery-ui/images/animated-overlay.gif b/functions/metaboxes/css/vendor/jquery-ui/images/animated-overlay.gif
deleted file mode 100755
index d441f75..0000000
Binary files a/functions/metaboxes/css/vendor/jquery-ui/images/animated-overlay.gif and /dev/null differ
diff --git a/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png b/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png
deleted file mode 100755
index 87f812d..0000000
Binary files a/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png and /dev/null differ
diff --git a/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png b/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png
deleted file mode 100755
index 4cb0d6d..0000000
Binary files a/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png and /dev/null differ
diff --git a/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png b/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png
deleted file mode 100755
index bfe8974..0000000
Binary files a/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png and /dev/null differ
diff --git a/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png b/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png
deleted file mode 100755
index 168a182..0000000
Binary files a/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png and /dev/null differ
diff --git a/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_glass_75_dadada_1x400.png b/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_glass_75_dadada_1x400.png
deleted file mode 100755
index 25bf099..0000000
Binary files a/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_glass_75_dadada_1x400.png and /dev/null differ
diff --git a/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png b/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png
deleted file mode 100755
index c5dc70a..0000000
Binary files a/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png and /dev/null differ
diff --git a/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png b/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png
deleted file mode 100755
index bf1f164..0000000
Binary files a/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png and /dev/null differ
diff --git a/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png
deleted file mode 100755
index 11c1841..0000000
Binary files a/functions/metaboxes/css/vendor/jquery-ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png and /dev/null differ
diff --git a/functions/metaboxes/css/vendor/jquery-ui/images/ui-icons_222222_256x240.png b/functions/metaboxes/css/vendor/jquery-ui/images/ui-icons_222222_256x240.png
deleted file mode 100755
index 2943302..0000000
Binary files a/functions/metaboxes/css/vendor/jquery-ui/images/ui-icons_222222_256x240.png and /dev/null differ
diff --git a/functions/metaboxes/css/vendor/jquery-ui/images/ui-icons_2e83ff_256x240.png b/functions/metaboxes/css/vendor/jquery-ui/images/ui-icons_2e83ff_256x240.png
deleted file mode 100755
index 25dfde1..0000000
Binary files a/functions/metaboxes/css/vendor/jquery-ui/images/ui-icons_2e83ff_256x240.png and /dev/null differ
diff --git a/functions/metaboxes/css/vendor/jquery-ui/images/ui-icons_454545_256x240.png b/functions/metaboxes/css/vendor/jquery-ui/images/ui-icons_454545_256x240.png
deleted file mode 100755
index 0063819..0000000
Binary files a/functions/metaboxes/css/vendor/jquery-ui/images/ui-icons_454545_256x240.png and /dev/null differ
diff --git a/functions/metaboxes/css/vendor/jquery-ui/images/ui-icons_888888_256x240.png b/functions/metaboxes/css/vendor/jquery-ui/images/ui-icons_888888_256x240.png
deleted file mode 100755
index 53aaf6f..0000000
Binary files a/functions/metaboxes/css/vendor/jquery-ui/images/ui-icons_888888_256x240.png and /dev/null differ
diff --git a/functions/metaboxes/css/vendor/jquery-ui/images/ui-icons_cd0a0a_256x240.png b/functions/metaboxes/css/vendor/jquery-ui/images/ui-icons_cd0a0a_256x240.png
deleted file mode 100755
index 145e3d3..0000000
Binary files a/functions/metaboxes/css/vendor/jquery-ui/images/ui-icons_cd0a0a_256x240.png and /dev/null differ
diff --git a/functions/metaboxes/css/vendor/jquery-ui/jquery-ui.css b/functions/metaboxes/css/vendor/jquery-ui/jquery-ui.css
deleted file mode 100755
index 29931f0..0000000
--- a/functions/metaboxes/css/vendor/jquery-ui/jquery-ui.css
+++ /dev/null
@@ -1,1175 +0,0 @@
-/*! jQuery UI - v1.10.2 - 2013-03-14
-* http://jqueryui.com
-* Includes: jquery.ui.core.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
-* Copyright 2013 jQuery Foundation and other contributors Licensed MIT */
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden {
- display: none;
-}
-.ui-helper-hidden-accessible {
- border: 0;
- clip: rect(0 0 0 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
-}
-.ui-helper-reset {
- margin: 0;
- padding: 0;
- border: 0;
- outline: 0;
- line-height: 1.3;
- text-decoration: none;
- font-size: 100%;
- list-style: none;
-}
-.ui-helper-clearfix:before,
-.ui-helper-clearfix:after {
- content: "";
- display: table;
- border-collapse: collapse;
-}
-.ui-helper-clearfix:after {
- clear: both;
-}
-.ui-helper-clearfix {
- min-height: 0; /* support: IE7 */
-}
-.ui-helper-zfix {
- width: 100%;
- height: 100%;
- top: 0;
- left: 0;
- position: absolute;
- opacity: 0;
- filter:Alpha(Opacity=0);
-}
-
-.ui-front {
- z-index: 100;
-}
-
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-disabled {
- cursor: default !important;
-}
-
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
- display: block;
- text-indent: -99999px;
- overflow: hidden;
- background-repeat: no-repeat;
-}
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Overlays */
-.ui-widget-overlay {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
-}
-.ui-accordion .ui-accordion-header {
- display: block;
- cursor: pointer;
- position: relative;
- margin-top: 2px;
- padding: .5em .5em .5em .7em;
- min-height: 0; /* support: IE7 */
-}
-.ui-accordion .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-noicons {
- padding-left: .7em;
-}
-.ui-accordion .ui-accordion-icons .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
- position: absolute;
- left: .5em;
- top: 50%;
- margin-top: -8px;
-}
-.ui-accordion .ui-accordion-content {
- padding: 1em 2.2em;
- border-top: 0;
- overflow: auto;
-}
-.ui-autocomplete {
- position: absolute;
- top: 0;
- left: 0;
- cursor: default;
-}
-.ui-button {
- display: inline-block;
- position: relative;
- padding: 0;
- line-height: normal;
- margin-right: .1em;
- cursor: pointer;
- vertical-align: middle;
- text-align: center;
- overflow: visible; /* removes extra width in IE */
-}
-.ui-button,
-.ui-button:link,
-.ui-button:visited,
-.ui-button:hover,
-.ui-button:active {
- text-decoration: none;
-}
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
- width: 2.2em;
-}
-/* button elements seem to need a little more width */
-button.ui-button-icon-only {
- width: 2.4em;
-}
-.ui-button-icons-only {
- width: 3.4em;
-}
-button.ui-button-icons-only {
- width: 3.7em;
-}
-
-/* button text element */
-.ui-button .ui-button-text {
- display: block;
- line-height: normal;
-}
-.ui-button-text-only .ui-button-text {
- padding: .4em 1em;
-}
-.ui-button-icon-only .ui-button-text,
-.ui-button-icons-only .ui-button-text {
- padding: .4em;
- text-indent: -9999999px;
-}
-.ui-button-text-icon-primary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 1em .4em 2.1em;
-}
-.ui-button-text-icon-secondary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 2.1em .4em 1em;
-}
-.ui-button-text-icons .ui-button-text {
- padding-left: 2.1em;
- padding-right: 2.1em;
-}
-/* no icon support for input elements, provide padding by default */
-input.ui-button {
- padding: .4em 1em;
-}
-
-/* button icon element(s) */
-.ui-button-icon-only .ui-icon,
-.ui-button-text-icon-primary .ui-icon,
-.ui-button-text-icon-secondary .ui-icon,
-.ui-button-text-icons .ui-icon,
-.ui-button-icons-only .ui-icon {
- position: absolute;
- top: 50%;
- margin-top: -8px;
-}
-.ui-button-icon-only .ui-icon {
- left: 50%;
- margin-left: -8px;
-}
-.ui-button-text-icon-primary .ui-button-icon-primary,
-.ui-button-text-icons .ui-button-icon-primary,
-.ui-button-icons-only .ui-button-icon-primary {
- left: .5em;
-}
-.ui-button-text-icon-secondary .ui-button-icon-secondary,
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
- right: .5em;
-}
-
-/* button sets */
-.ui-buttonset {
- margin-right: 7px;
-}
-.ui-buttonset .ui-button {
- margin-left: 0;
- margin-right: -.3em;
-}
-
-/* workarounds */
-/* reset extra padding in Firefox, see h5bp.com/l */
-input.ui-button::-moz-focus-inner,
-button.ui-button::-moz-focus-inner {
- border: 0;
- padding: 0;
-}
-.ui-datepicker {
- width: 17em;
- padding: .2em .2em 0;
- display: none;
-}
-.ui-datepicker .ui-datepicker-header {
- position: relative;
- padding: .2em 0;
-}
-.ui-datepicker .ui-datepicker-prev,
-.ui-datepicker .ui-datepicker-next {
- position: absolute;
- top: 2px;
- width: 1.8em;
- height: 1.8em;
-}
-.ui-datepicker .ui-datepicker-prev-hover,
-.ui-datepicker .ui-datepicker-next-hover {
- top: 1px;
-}
-.ui-datepicker .ui-datepicker-prev {
- left: 2px;
-}
-.ui-datepicker .ui-datepicker-next {
- right: 2px;
-}
-.ui-datepicker .ui-datepicker-prev-hover {
- left: 1px;
-}
-.ui-datepicker .ui-datepicker-next-hover {
- right: 1px;
-}
-.ui-datepicker .ui-datepicker-prev span,
-.ui-datepicker .ui-datepicker-next span {
- display: block;
- position: absolute;
- left: 50%;
- margin-left: -8px;
- top: 50%;
- margin-top: -8px;
-}
-.ui-datepicker .ui-datepicker-title {
- margin: 0 2.3em;
- line-height: 1.8em;
- text-align: center;
-}
-.ui-datepicker .ui-datepicker-title select {
- font-size: 1em;
- margin: 1px 0;
-}
-.ui-datepicker select.ui-datepicker-month-year {
- width: 100%;
-}
-.ui-datepicker select.ui-datepicker-month,
-.ui-datepicker select.ui-datepicker-year {
- width: 49%;
-}
-.ui-datepicker table {
- width: 100%;
- font-size: .9em;
- border-collapse: collapse;
- margin: 0 0 .4em;
-}
-.ui-datepicker th {
- padding: .7em .3em;
- text-align: center;
- font-weight: bold;
- border: 0;
-}
-.ui-datepicker td {
- border: 0;
- padding: 1px;
-}
-.ui-datepicker td span,
-.ui-datepicker td a {
- display: block;
- padding: .2em;
- text-align: right;
- text-decoration: none;
-}
-.ui-datepicker .ui-datepicker-buttonpane {
- background-image: none;
- margin: .7em 0 0 0;
- padding: 0 .2em;
- border-left: 0;
- border-right: 0;
- border-bottom: 0;
-}
-.ui-datepicker .ui-datepicker-buttonpane button {
- float: right;
- margin: .5em .2em .4em;
- cursor: pointer;
- padding: .2em .6em .3em .6em;
- width: auto;
- overflow: visible;
-}
-.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
- float: left;
-}
-
-/* with multiple calendars */
-.ui-datepicker.ui-datepicker-multi {
- width: auto;
-}
-.ui-datepicker-multi .ui-datepicker-group {
- float: left;
-}
-.ui-datepicker-multi .ui-datepicker-group table {
- width: 95%;
- margin: 0 auto .4em;
-}
-.ui-datepicker-multi-2 .ui-datepicker-group {
- width: 50%;
-}
-.ui-datepicker-multi-3 .ui-datepicker-group {
- width: 33.3%;
-}
-.ui-datepicker-multi-4 .ui-datepicker-group {
- width: 25%;
-}
-.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
- border-left-width: 0;
-}
-.ui-datepicker-multi .ui-datepicker-buttonpane {
- clear: left;
-}
-.ui-datepicker-row-break {
- clear: both;
- width: 100%;
- font-size: 0;
-}
-
-/* RTL support */
-.ui-datepicker-rtl {
- direction: rtl;
-}
-.ui-datepicker-rtl .ui-datepicker-prev {
- right: 2px;
- left: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-next {
- left: 2px;
- right: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-prev:hover {
- right: 1px;
- left: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-next:hover {
- left: 1px;
- right: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane {
- clear: right;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane button {
- float: left;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
-.ui-datepicker-rtl .ui-datepicker-group {
- float: right;
-}
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
- border-right-width: 0;
- border-left-width: 1px;
-}
-.ui-dialog {
- position: absolute;
- top: 0;
- left: 0;
- padding: .2em;
- outline: 0;
-}
-.ui-dialog .ui-dialog-titlebar {
- padding: .4em 1em;
- position: relative;
-}
-.ui-dialog .ui-dialog-title {
- float: left;
- margin: .1em 0;
- white-space: nowrap;
- width: 90%;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.ui-dialog .ui-dialog-titlebar-close {
- position: absolute;
- right: .3em;
- top: 50%;
- width: 21px;
- margin: -10px 0 0 0;
- padding: 1px;
- height: 20px;
-}
-.ui-dialog .ui-dialog-content {
- position: relative;
- border: 0;
- padding: .5em 1em;
- background: none;
- overflow: auto;
-}
-.ui-dialog .ui-dialog-buttonpane {
- text-align: left;
- border-width: 1px 0 0 0;
- background-image: none;
- margin-top: .5em;
- padding: .3em 1em .5em .4em;
-}
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
- float: right;
-}
-.ui-dialog .ui-dialog-buttonpane button {
- margin: .5em .4em .5em 0;
- cursor: pointer;
-}
-.ui-dialog .ui-resizable-se {
- width: 12px;
- height: 12px;
- right: -5px;
- bottom: -5px;
- background-position: 16px 16px;
-}
-.ui-draggable .ui-dialog-titlebar {
- cursor: move;
-}
-.ui-menu {
- list-style: none;
- padding: 2px;
- margin: 0;
- display: block;
- outline: none;
-}
-.ui-menu .ui-menu {
- margin-top: -3px;
- position: absolute;
-}
-.ui-menu .ui-menu-item {
- margin: 0;
- padding: 0;
- width: 100%;
-}
-.ui-menu .ui-menu-divider {
- margin: 5px -2px 5px -2px;
- height: 0;
- font-size: 0;
- line-height: 0;
- border-width: 1px 0 0 0;
-}
-.ui-menu .ui-menu-item a {
- text-decoration: none;
- display: block;
- padding: 2px .4em;
- line-height: 1.5;
- min-height: 0; /* support: IE7 */
- font-weight: normal;
-}
-.ui-menu .ui-menu-item a.ui-state-focus,
-.ui-menu .ui-menu-item a.ui-state-active {
- font-weight: normal;
- margin: -1px;
-}
-
-.ui-menu .ui-state-disabled {
- font-weight: normal;
- margin: .4em 0 .2em;
- line-height: 1.5;
-}
-.ui-menu .ui-state-disabled a {
- cursor: default;
-}
-
-/* icon support */
-.ui-menu-icons {
- position: relative;
-}
-.ui-menu-icons .ui-menu-item a {
- position: relative;
- padding-left: 2em;
-}
-
-/* left-aligned */
-.ui-menu .ui-icon {
- position: absolute;
- top: .2em;
- left: .2em;
-}
-
-/* right-aligned */
-.ui-menu .ui-menu-icon {
- position: static;
- float: right;
-}
-.ui-progressbar {
- height: 2em;
- text-align: left;
- overflow: hidden;
-}
-.ui-progressbar .ui-progressbar-value {
- margin: -1px;
- height: 100%;
-}
-.ui-progressbar .ui-progressbar-overlay {
- background: url("images/animated-overlay.gif");
- height: 100%;
- filter: alpha(opacity=25);
- opacity: 0.25;
-}
-.ui-progressbar-indeterminate .ui-progressbar-value {
- background-image: none;
-}
-.ui-resizable {
- position: relative;
-}
-.ui-resizable-handle {
- position: absolute;
- font-size: 0.1px;
- display: block;
-}
-.ui-resizable-disabled .ui-resizable-handle,
-.ui-resizable-autohide .ui-resizable-handle {
- display: none;
-}
-.ui-resizable-n {
- cursor: n-resize;
- height: 7px;
- width: 100%;
- top: -5px;
- left: 0;
-}
-.ui-resizable-s {
- cursor: s-resize;
- height: 7px;
- width: 100%;
- bottom: -5px;
- left: 0;
-}
-.ui-resizable-e {
- cursor: e-resize;
- width: 7px;
- right: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-w {
- cursor: w-resize;
- width: 7px;
- left: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-se {
- cursor: se-resize;
- width: 12px;
- height: 12px;
- right: 1px;
- bottom: 1px;
-}
-.ui-resizable-sw {
- cursor: sw-resize;
- width: 9px;
- height: 9px;
- left: -5px;
- bottom: -5px;
-}
-.ui-resizable-nw {
- cursor: nw-resize;
- width: 9px;
- height: 9px;
- left: -5px;
- top: -5px;
-}
-.ui-resizable-ne {
- cursor: ne-resize;
- width: 9px;
- height: 9px;
- right: -5px;
- top: -5px;
-}
-.ui-selectable-helper {
- position: absolute;
- z-index: 100;
- border: 1px dotted black;
-}
-.ui-slider {
- position: relative;
- text-align: left;
-}
-.ui-slider .ui-slider-handle {
- position: absolute;
- z-index: 2;
- width: 1.2em;
- height: 1.2em;
- cursor: default;
-}
-.ui-slider .ui-slider-range {
- position: absolute;
- z-index: 1;
- font-size: .7em;
- display: block;
- border: 0;
- background-position: 0 0;
-}
-
-/* For IE8 - See #6727 */
-.ui-slider.ui-state-disabled .ui-slider-handle,
-.ui-slider.ui-state-disabled .ui-slider-range {
- filter: inherit;
-}
-
-.ui-slider-horizontal {
- height: .8em;
-}
-.ui-slider-horizontal .ui-slider-handle {
- top: -.3em;
- margin-left: -.6em;
-}
-.ui-slider-horizontal .ui-slider-range {
- top: 0;
- height: 100%;
-}
-.ui-slider-horizontal .ui-slider-range-min {
- left: 0;
-}
-.ui-slider-horizontal .ui-slider-range-max {
- right: 0;
-}
-
-.ui-slider-vertical {
- width: .8em;
- height: 100px;
-}
-.ui-slider-vertical .ui-slider-handle {
- left: -.3em;
- margin-left: 0;
- margin-bottom: -.6em;
-}
-.ui-slider-vertical .ui-slider-range {
- left: 0;
- width: 100%;
-}
-.ui-slider-vertical .ui-slider-range-min {
- bottom: 0;
-}
-.ui-slider-vertical .ui-slider-range-max {
- top: 0;
-}
-.ui-spinner {
- position: relative;
- display: inline-block;
- overflow: hidden;
- padding: 0;
- vertical-align: middle;
-}
-.ui-spinner-input {
- border: none;
- background: none;
- color: inherit;
- padding: 0;
- margin: .2em 0;
- vertical-align: middle;
- margin-left: .4em;
- margin-right: 22px;
-}
-.ui-spinner-button {
- width: 16px;
- height: 50%;
- font-size: .5em;
- padding: 0;
- margin: 0;
- text-align: center;
- position: absolute;
- cursor: default;
- display: block;
- overflow: hidden;
- right: 0;
-}
-/* more specificity required here to overide default borders */
-.ui-spinner a.ui-spinner-button {
- border-top: none;
- border-bottom: none;
- border-right: none;
-}
-/* vertical centre icon */
-.ui-spinner .ui-icon {
- position: absolute;
- margin-top: -8px;
- top: 50%;
- left: 0;
-}
-.ui-spinner-up {
- top: 0;
-}
-.ui-spinner-down {
- bottom: 0;
-}
-
-/* TR overrides */
-.ui-spinner .ui-icon-triangle-1-s {
- /* need to fix icons sprite */
- background-position: -65px -16px;
-}
-.ui-tabs {
- position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
- padding: .2em;
-}
-.ui-tabs .ui-tabs-nav {
- margin: 0;
- padding: .2em .2em 0;
-}
-.ui-tabs .ui-tabs-nav li {
- list-style: none;
- float: left;
- position: relative;
- top: 0;
- margin: 1px .2em 0 0;
- border-bottom-width: 0;
- padding: 0;
- white-space: nowrap;
-}
-.ui-tabs .ui-tabs-nav li a {
- float: left;
- padding: .5em 1em;
- text-decoration: none;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active {
- margin-bottom: -1px;
- padding-bottom: 1px;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active a,
-.ui-tabs .ui-tabs-nav li.ui-state-disabled a,
-.ui-tabs .ui-tabs-nav li.ui-tabs-loading a {
- cursor: text;
-}
-.ui-tabs .ui-tabs-nav li a, /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
-.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a {
- cursor: pointer;
-}
-.ui-tabs .ui-tabs-panel {
- display: block;
- border-width: 0;
- padding: 1em 1.4em;
- background: none;
-}
-.ui-tooltip {
- padding: 8px;
- position: absolute;
- z-index: 9999;
- max-width: 300px;
- -webkit-box-shadow: 0 0 5px #aaa;
- box-shadow: 0 0 5px #aaa;
-}
-body .ui-tooltip {
- border-width: 2px;
-}
-
-/* Component containers
-----------------------------------*/
-.ui-widget {
- font-family: Verdana,Arial,sans-serif;
- font-size: 1.1em;
-}
-.ui-widget .ui-widget {
- font-size: 1em;
-}
-.ui-widget input,
-.ui-widget select,
-.ui-widget textarea,
-.ui-widget button {
- font-family: Verdana,Arial,sans-serif;
- font-size: 1em;
-}
-.ui-widget-content {
- border: 1px solid #aaaaaa;
- background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;
- color: #222222;
-}
-.ui-widget-content a {
- color: #222222;
-}
-.ui-widget-header {
- border: 1px solid #aaaaaa;
- background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;
- color: #222222;
- font-weight: bold;
-}
-.ui-widget-header a {
- color: #222222;
-}
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default {
- border: 1px solid #d3d3d3;
- background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;
- font-weight: normal;
- color: #555555;
-}
-.ui-state-default a,
-.ui-state-default a:link,
-.ui-state-default a:visited {
- color: #555555;
- text-decoration: none;
-}
-.ui-state-hover,
-.ui-widget-content .ui-state-hover,
-.ui-widget-header .ui-state-hover,
-.ui-state-focus,
-.ui-widget-content .ui-state-focus,
-.ui-widget-header .ui-state-focus {
- border: 1px solid #999999;
- background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;
- font-weight: normal;
- color: #212121;
-}
-.ui-state-hover a,
-.ui-state-hover a:hover,
-.ui-state-hover a:link,
-.ui-state-hover a:visited {
- color: #212121;
- text-decoration: none;
-}
-.ui-state-active,
-.ui-widget-content .ui-state-active,
-.ui-widget-header .ui-state-active {
- border: 1px solid #aaaaaa;
- background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;
- font-weight: normal;
- color: #212121;
-}
-.ui-state-active a,
-.ui-state-active a:link,
-.ui-state-active a:visited {
- color: #212121;
- text-decoration: none;
-}
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight,
-.ui-widget-content .ui-state-highlight,
-.ui-widget-header .ui-state-highlight {
- border: 1px solid #fcefa1;
- background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;
- color: #363636;
-}
-.ui-state-highlight a,
-.ui-widget-content .ui-state-highlight a,
-.ui-widget-header .ui-state-highlight a {
- color: #363636;
-}
-.ui-state-error,
-.ui-widget-content .ui-state-error,
-.ui-widget-header .ui-state-error {
- border: 1px solid #cd0a0a;
- background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;
- color: #cd0a0a;
-}
-.ui-state-error a,
-.ui-widget-content .ui-state-error a,
-.ui-widget-header .ui-state-error a {
- color: #cd0a0a;
-}
-.ui-state-error-text,
-.ui-widget-content .ui-state-error-text,
-.ui-widget-header .ui-state-error-text {
- color: #cd0a0a;
-}
-.ui-priority-primary,
-.ui-widget-content .ui-priority-primary,
-.ui-widget-header .ui-priority-primary {
- font-weight: bold;
-}
-.ui-priority-secondary,
-.ui-widget-content .ui-priority-secondary,
-.ui-widget-header .ui-priority-secondary {
- opacity: .7;
- filter:Alpha(Opacity=70);
- font-weight: normal;
-}
-.ui-state-disabled,
-.ui-widget-content .ui-state-disabled,
-.ui-widget-header .ui-state-disabled {
- opacity: .35;
- filter:Alpha(Opacity=35);
- background-image: none;
-}
-.ui-state-disabled .ui-icon {
- filter:Alpha(Opacity=35); /* For IE8 - See #6059 */
-}
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
- width: 16px;
- height: 16px;
-}
-.ui-icon,
-.ui-widget-content .ui-icon {
- background-image: url(images/ui-icons_222222_256x240.png);
-}
-.ui-widget-header .ui-icon {
- background-image: url(images/ui-icons_222222_256x240.png);
-}
-.ui-state-default .ui-icon {
- background-image: url(images/ui-icons_888888_256x240.png);
-}
-.ui-state-hover .ui-icon,
-.ui-state-focus .ui-icon {
- background-image: url(images/ui-icons_454545_256x240.png);
-}
-.ui-state-active .ui-icon {
- background-image: url(images/ui-icons_454545_256x240.png);
-}
-.ui-state-highlight .ui-icon {
- background-image: url(images/ui-icons_2e83ff_256x240.png);
-}
-.ui-state-error .ui-icon,
-.ui-state-error-text .ui-icon {
- background-image: url(images/ui-icons_cd0a0a_256x240.png);
-}
-
-/* positioning */
-.ui-icon-blank { background-position: 16px 16px; }
-.ui-icon-carat-1-n { background-position: 0 0; }
-.ui-icon-carat-1-ne { background-position: -16px 0; }
-.ui-icon-carat-1-e { background-position: -32px 0; }
-.ui-icon-carat-1-se { background-position: -48px 0; }
-.ui-icon-carat-1-s { background-position: -64px 0; }
-.ui-icon-carat-1-sw { background-position: -80px 0; }
-.ui-icon-carat-1-w { background-position: -96px 0; }
-.ui-icon-carat-1-nw { background-position: -112px 0; }
-.ui-icon-carat-2-n-s { background-position: -128px 0; }
-.ui-icon-carat-2-e-w { background-position: -144px 0; }
-.ui-icon-triangle-1-n { background-position: 0 -16px; }
-.ui-icon-triangle-1-ne { background-position: -16px -16px; }
-.ui-icon-triangle-1-e { background-position: -32px -16px; }
-.ui-icon-triangle-1-se { background-position: -48px -16px; }
-.ui-icon-triangle-1-s { background-position: -64px -16px; }
-.ui-icon-triangle-1-sw { background-position: -80px -16px; }
-.ui-icon-triangle-1-w { background-position: -96px -16px; }
-.ui-icon-triangle-1-nw { background-position: -112px -16px; }
-.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
-.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
-.ui-icon-arrow-1-n { background-position: 0 -32px; }
-.ui-icon-arrow-1-ne { background-position: -16px -32px; }
-.ui-icon-arrow-1-e { background-position: -32px -32px; }
-.ui-icon-arrow-1-se { background-position: -48px -32px; }
-.ui-icon-arrow-1-s { background-position: -64px -32px; }
-.ui-icon-arrow-1-sw { background-position: -80px -32px; }
-.ui-icon-arrow-1-w { background-position: -96px -32px; }
-.ui-icon-arrow-1-nw { background-position: -112px -32px; }
-.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
-.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
-.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
-.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
-.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
-.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
-.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
-.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
-.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
-.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
-.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
-.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
-.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
-.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
-.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
-.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
-.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
-.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
-.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
-.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
-.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
-.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
-.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
-.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
-.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
-.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
-.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
-.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
-.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
-.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
-.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
-.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
-.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
-.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
-.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
-.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
-.ui-icon-arrow-4 { background-position: 0 -80px; }
-.ui-icon-arrow-4-diag { background-position: -16px -80px; }
-.ui-icon-extlink { background-position: -32px -80px; }
-.ui-icon-newwin { background-position: -48px -80px; }
-.ui-icon-refresh { background-position: -64px -80px; }
-.ui-icon-shuffle { background-position: -80px -80px; }
-.ui-icon-transfer-e-w { background-position: -96px -80px; }
-.ui-icon-transferthick-e-w { background-position: -112px -80px; }
-.ui-icon-folder-collapsed { background-position: 0 -96px; }
-.ui-icon-folder-open { background-position: -16px -96px; }
-.ui-icon-document { background-position: -32px -96px; }
-.ui-icon-document-b { background-position: -48px -96px; }
-.ui-icon-note { background-position: -64px -96px; }
-.ui-icon-mail-closed { background-position: -80px -96px; }
-.ui-icon-mail-open { background-position: -96px -96px; }
-.ui-icon-suitcase { background-position: -112px -96px; }
-.ui-icon-comment { background-position: -128px -96px; }
-.ui-icon-person { background-position: -144px -96px; }
-.ui-icon-print { background-position: -160px -96px; }
-.ui-icon-trash { background-position: -176px -96px; }
-.ui-icon-locked { background-position: -192px -96px; }
-.ui-icon-unlocked { background-position: -208px -96px; }
-.ui-icon-bookmark { background-position: -224px -96px; }
-.ui-icon-tag { background-position: -240px -96px; }
-.ui-icon-home { background-position: 0 -112px; }
-.ui-icon-flag { background-position: -16px -112px; }
-.ui-icon-calendar { background-position: -32px -112px; }
-.ui-icon-cart { background-position: -48px -112px; }
-.ui-icon-pencil { background-position: -64px -112px; }
-.ui-icon-clock { background-position: -80px -112px; }
-.ui-icon-disk { background-position: -96px -112px; }
-.ui-icon-calculator { background-position: -112px -112px; }
-.ui-icon-zoomin { background-position: -128px -112px; }
-.ui-icon-zoomout { background-position: -144px -112px; }
-.ui-icon-search { background-position: -160px -112px; }
-.ui-icon-wrench { background-position: -176px -112px; }
-.ui-icon-gear { background-position: -192px -112px; }
-.ui-icon-heart { background-position: -208px -112px; }
-.ui-icon-star { background-position: -224px -112px; }
-.ui-icon-link { background-position: -240px -112px; }
-.ui-icon-cancel { background-position: 0 -128px; }
-.ui-icon-plus { background-position: -16px -128px; }
-.ui-icon-plusthick { background-position: -32px -128px; }
-.ui-icon-minus { background-position: -48px -128px; }
-.ui-icon-minusthick { background-position: -64px -128px; }
-.ui-icon-close { background-position: -80px -128px; }
-.ui-icon-closethick { background-position: -96px -128px; }
-.ui-icon-key { background-position: -112px -128px; }
-.ui-icon-lightbulb { background-position: -128px -128px; }
-.ui-icon-scissors { background-position: -144px -128px; }
-.ui-icon-clipboard { background-position: -160px -128px; }
-.ui-icon-copy { background-position: -176px -128px; }
-.ui-icon-contact { background-position: -192px -128px; }
-.ui-icon-image { background-position: -208px -128px; }
-.ui-icon-video { background-position: -224px -128px; }
-.ui-icon-script { background-position: -240px -128px; }
-.ui-icon-alert { background-position: 0 -144px; }
-.ui-icon-info { background-position: -16px -144px; }
-.ui-icon-notice { background-position: -32px -144px; }
-.ui-icon-help { background-position: -48px -144px; }
-.ui-icon-check { background-position: -64px -144px; }
-.ui-icon-bullet { background-position: -80px -144px; }
-.ui-icon-radio-on { background-position: -96px -144px; }
-.ui-icon-radio-off { background-position: -112px -144px; }
-.ui-icon-pin-w { background-position: -128px -144px; }
-.ui-icon-pin-s { background-position: -144px -144px; }
-.ui-icon-play { background-position: 0 -160px; }
-.ui-icon-pause { background-position: -16px -160px; }
-.ui-icon-seek-next { background-position: -32px -160px; }
-.ui-icon-seek-prev { background-position: -48px -160px; }
-.ui-icon-seek-end { background-position: -64px -160px; }
-.ui-icon-seek-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.ui-icon-seek-first { background-position: -80px -160px; }
-.ui-icon-stop { background-position: -96px -160px; }
-.ui-icon-eject { background-position: -112px -160px; }
-.ui-icon-volume-off { background-position: -128px -160px; }
-.ui-icon-volume-on { background-position: -144px -160px; }
-.ui-icon-power { background-position: 0 -176px; }
-.ui-icon-signal-diag { background-position: -16px -176px; }
-.ui-icon-signal { background-position: -32px -176px; }
-.ui-icon-battery-0 { background-position: -48px -176px; }
-.ui-icon-battery-1 { background-position: -64px -176px; }
-.ui-icon-battery-2 { background-position: -80px -176px; }
-.ui-icon-battery-3 { background-position: -96px -176px; }
-.ui-icon-circle-plus { background-position: 0 -192px; }
-.ui-icon-circle-minus { background-position: -16px -192px; }
-.ui-icon-circle-close { background-position: -32px -192px; }
-.ui-icon-circle-triangle-e { background-position: -48px -192px; }
-.ui-icon-circle-triangle-s { background-position: -64px -192px; }
-.ui-icon-circle-triangle-w { background-position: -80px -192px; }
-.ui-icon-circle-triangle-n { background-position: -96px -192px; }
-.ui-icon-circle-arrow-e { background-position: -112px -192px; }
-.ui-icon-circle-arrow-s { background-position: -128px -192px; }
-.ui-icon-circle-arrow-w { background-position: -144px -192px; }
-.ui-icon-circle-arrow-n { background-position: -160px -192px; }
-.ui-icon-circle-zoomin { background-position: -176px -192px; }
-.ui-icon-circle-zoomout { background-position: -192px -192px; }
-.ui-icon-circle-check { background-position: -208px -192px; }
-.ui-icon-circlesmall-plus { background-position: 0 -208px; }
-.ui-icon-circlesmall-minus { background-position: -16px -208px; }
-.ui-icon-circlesmall-close { background-position: -32px -208px; }
-.ui-icon-squaresmall-plus { background-position: -48px -208px; }
-.ui-icon-squaresmall-minus { background-position: -64px -208px; }
-.ui-icon-squaresmall-close { background-position: -80px -208px; }
-.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
-.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
-.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
-.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
-.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
-.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Corner radius */
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-left,
-.ui-corner-tl {
- border-top-left-radius: 4px;
-}
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-right,
-.ui-corner-tr {
- border-top-right-radius: 4px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-left,
-.ui-corner-bl {
- border-bottom-left-radius: 4px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-right,
-.ui-corner-br {
- border-bottom-right-radius: 4px;
-}
-
-/* Overlays */
-.ui-widget-overlay {
- background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;
- opacity: .3;
- filter: Alpha(Opacity=30);
-}
-.ui-widget-shadow {
- margin: -8px 0 0 -8px;
- padding: 8px;
- background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;
- opacity: .3;
- filter: Alpha(Opacity=30);
- border-radius: 8px;
-}
diff --git a/functions/metaboxes/css/vendor/jquery-ui/jquery-ui.min.css b/functions/metaboxes/css/vendor/jquery-ui/jquery-ui.min.css
deleted file mode 100755
index 572a6a9..0000000
--- a/functions/metaboxes/css/vendor/jquery-ui/jquery-ui.min.css
+++ /dev/null
@@ -1,5 +0,0 @@
-/*! jQuery UI - v1.10.2 - 2013-03-14
-* http://jqueryui.com
-* Includes: jquery.ui.core.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
-* Copyright 2013 jQuery Foundation and other contributors Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;min-height:0}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:21px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:0;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:0}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:400}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:400;margin:-1px}.ui-menu .ui-state-disabled{font-weight:400;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url(images/animated-overlay.gif);height:100%;filter:alpha(opacity=25);opacity:.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:0;background:0;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:0;border-bottom:0;border-right:0}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-tabs-loading a{cursor:text}.ui-tabs .ui-tabs-nav li a,.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:0}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #999;background:#dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_888888_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_2e83ff_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_cd0a0a_256x240.png)}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}
\ No newline at end of file
diff --git a/functions/metaboxes/css/vendor/jquery-ui/jquery.ui.theme.css b/functions/metaboxes/css/vendor/jquery-ui/jquery.ui.theme.css
deleted file mode 100755
index 3210fc7..0000000
--- a/functions/metaboxes/css/vendor/jquery-ui/jquery.ui.theme.css
+++ /dev/null
@@ -1,406 +0,0 @@
-/*!
- * jQuery UI CSS Framework 1.10.2
- * http://jqueryui.com
- *
- * Copyright 2013 jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Theming/API
- *
- * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
- */
-
-
-/* Component containers
-----------------------------------*/
-.ui-widget {
- font-family: Verdana,Arial,sans-serif;
- font-size: 1.1em;
-}
-.ui-widget .ui-widget {
- font-size: 1em;
-}
-.ui-widget input,
-.ui-widget select,
-.ui-widget textarea,
-.ui-widget button {
- font-family: Verdana,Arial,sans-serif;
- font-size: 1em;
-}
-.ui-widget-content {
- border: 1px solid #aaaaaa;
- background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;
- color: #222222;
-}
-.ui-widget-content a {
- color: #222222;
-}
-.ui-widget-header {
- border: 1px solid #aaaaaa;
- background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;
- color: #222222;
- font-weight: bold;
-}
-.ui-widget-header a {
- color: #222222;
-}
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default {
- border: 1px solid #d3d3d3;
- background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;
- font-weight: normal;
- color: #555555;
-}
-.ui-state-default a,
-.ui-state-default a:link,
-.ui-state-default a:visited {
- color: #555555;
- text-decoration: none;
-}
-.ui-state-hover,
-.ui-widget-content .ui-state-hover,
-.ui-widget-header .ui-state-hover,
-.ui-state-focus,
-.ui-widget-content .ui-state-focus,
-.ui-widget-header .ui-state-focus {
- border: 1px solid #999999;
- background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;
- font-weight: normal;
- color: #212121;
-}
-.ui-state-hover a,
-.ui-state-hover a:hover,
-.ui-state-hover a:link,
-.ui-state-hover a:visited {
- color: #212121;
- text-decoration: none;
-}
-.ui-state-active,
-.ui-widget-content .ui-state-active,
-.ui-widget-header .ui-state-active {
- border: 1px solid #aaaaaa;
- background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;
- font-weight: normal;
- color: #212121;
-}
-.ui-state-active a,
-.ui-state-active a:link,
-.ui-state-active a:visited {
- color: #212121;
- text-decoration: none;
-}
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight,
-.ui-widget-content .ui-state-highlight,
-.ui-widget-header .ui-state-highlight {
- border: 1px solid #fcefa1;
- background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;
- color: #363636;
-}
-.ui-state-highlight a,
-.ui-widget-content .ui-state-highlight a,
-.ui-widget-header .ui-state-highlight a {
- color: #363636;
-}
-.ui-state-error,
-.ui-widget-content .ui-state-error,
-.ui-widget-header .ui-state-error {
- border: 1px solid #cd0a0a;
- background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;
- color: #cd0a0a;
-}
-.ui-state-error a,
-.ui-widget-content .ui-state-error a,
-.ui-widget-header .ui-state-error a {
- color: #cd0a0a;
-}
-.ui-state-error-text,
-.ui-widget-content .ui-state-error-text,
-.ui-widget-header .ui-state-error-text {
- color: #cd0a0a;
-}
-.ui-priority-primary,
-.ui-widget-content .ui-priority-primary,
-.ui-widget-header .ui-priority-primary {
- font-weight: bold;
-}
-.ui-priority-secondary,
-.ui-widget-content .ui-priority-secondary,
-.ui-widget-header .ui-priority-secondary {
- opacity: .7;
- filter:Alpha(Opacity=70);
- font-weight: normal;
-}
-.ui-state-disabled,
-.ui-widget-content .ui-state-disabled,
-.ui-widget-header .ui-state-disabled {
- opacity: .35;
- filter:Alpha(Opacity=35);
- background-image: none;
-}
-.ui-state-disabled .ui-icon {
- filter:Alpha(Opacity=35); /* For IE8 - See #6059 */
-}
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
- width: 16px;
- height: 16px;
-}
-.ui-icon,
-.ui-widget-content .ui-icon {
- background-image: url(images/ui-icons_222222_256x240.png);
-}
-.ui-widget-header .ui-icon {
- background-image: url(images/ui-icons_222222_256x240.png);
-}
-.ui-state-default .ui-icon {
- background-image: url(images/ui-icons_888888_256x240.png);
-}
-.ui-state-hover .ui-icon,
-.ui-state-focus .ui-icon {
- background-image: url(images/ui-icons_454545_256x240.png);
-}
-.ui-state-active .ui-icon {
- background-image: url(images/ui-icons_454545_256x240.png);
-}
-.ui-state-highlight .ui-icon {
- background-image: url(images/ui-icons_2e83ff_256x240.png);
-}
-.ui-state-error .ui-icon,
-.ui-state-error-text .ui-icon {
- background-image: url(images/ui-icons_cd0a0a_256x240.png);
-}
-
-/* positioning */
-.ui-icon-blank { background-position: 16px 16px; }
-.ui-icon-carat-1-n { background-position: 0 0; }
-.ui-icon-carat-1-ne { background-position: -16px 0; }
-.ui-icon-carat-1-e { background-position: -32px 0; }
-.ui-icon-carat-1-se { background-position: -48px 0; }
-.ui-icon-carat-1-s { background-position: -64px 0; }
-.ui-icon-carat-1-sw { background-position: -80px 0; }
-.ui-icon-carat-1-w { background-position: -96px 0; }
-.ui-icon-carat-1-nw { background-position: -112px 0; }
-.ui-icon-carat-2-n-s { background-position: -128px 0; }
-.ui-icon-carat-2-e-w { background-position: -144px 0; }
-.ui-icon-triangle-1-n { background-position: 0 -16px; }
-.ui-icon-triangle-1-ne { background-position: -16px -16px; }
-.ui-icon-triangle-1-e { background-position: -32px -16px; }
-.ui-icon-triangle-1-se { background-position: -48px -16px; }
-.ui-icon-triangle-1-s { background-position: -64px -16px; }
-.ui-icon-triangle-1-sw { background-position: -80px -16px; }
-.ui-icon-triangle-1-w { background-position: -96px -16px; }
-.ui-icon-triangle-1-nw { background-position: -112px -16px; }
-.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
-.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
-.ui-icon-arrow-1-n { background-position: 0 -32px; }
-.ui-icon-arrow-1-ne { background-position: -16px -32px; }
-.ui-icon-arrow-1-e { background-position: -32px -32px; }
-.ui-icon-arrow-1-se { background-position: -48px -32px; }
-.ui-icon-arrow-1-s { background-position: -64px -32px; }
-.ui-icon-arrow-1-sw { background-position: -80px -32px; }
-.ui-icon-arrow-1-w { background-position: -96px -32px; }
-.ui-icon-arrow-1-nw { background-position: -112px -32px; }
-.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
-.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
-.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
-.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
-.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
-.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
-.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
-.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
-.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
-.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
-.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
-.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
-.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
-.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
-.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
-.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
-.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
-.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
-.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
-.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
-.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
-.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
-.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
-.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
-.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
-.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
-.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
-.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
-.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
-.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
-.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
-.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
-.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
-.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
-.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
-.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
-.ui-icon-arrow-4 { background-position: 0 -80px; }
-.ui-icon-arrow-4-diag { background-position: -16px -80px; }
-.ui-icon-extlink { background-position: -32px -80px; }
-.ui-icon-newwin { background-position: -48px -80px; }
-.ui-icon-refresh { background-position: -64px -80px; }
-.ui-icon-shuffle { background-position: -80px -80px; }
-.ui-icon-transfer-e-w { background-position: -96px -80px; }
-.ui-icon-transferthick-e-w { background-position: -112px -80px; }
-.ui-icon-folder-collapsed { background-position: 0 -96px; }
-.ui-icon-folder-open { background-position: -16px -96px; }
-.ui-icon-document { background-position: -32px -96px; }
-.ui-icon-document-b { background-position: -48px -96px; }
-.ui-icon-note { background-position: -64px -96px; }
-.ui-icon-mail-closed { background-position: -80px -96px; }
-.ui-icon-mail-open { background-position: -96px -96px; }
-.ui-icon-suitcase { background-position: -112px -96px; }
-.ui-icon-comment { background-position: -128px -96px; }
-.ui-icon-person { background-position: -144px -96px; }
-.ui-icon-print { background-position: -160px -96px; }
-.ui-icon-trash { background-position: -176px -96px; }
-.ui-icon-locked { background-position: -192px -96px; }
-.ui-icon-unlocked { background-position: -208px -96px; }
-.ui-icon-bookmark { background-position: -224px -96px; }
-.ui-icon-tag { background-position: -240px -96px; }
-.ui-icon-home { background-position: 0 -112px; }
-.ui-icon-flag { background-position: -16px -112px; }
-.ui-icon-calendar { background-position: -32px -112px; }
-.ui-icon-cart { background-position: -48px -112px; }
-.ui-icon-pencil { background-position: -64px -112px; }
-.ui-icon-clock { background-position: -80px -112px; }
-.ui-icon-disk { background-position: -96px -112px; }
-.ui-icon-calculator { background-position: -112px -112px; }
-.ui-icon-zoomin { background-position: -128px -112px; }
-.ui-icon-zoomout { background-position: -144px -112px; }
-.ui-icon-search { background-position: -160px -112px; }
-.ui-icon-wrench { background-position: -176px -112px; }
-.ui-icon-gear { background-position: -192px -112px; }
-.ui-icon-heart { background-position: -208px -112px; }
-.ui-icon-star { background-position: -224px -112px; }
-.ui-icon-link { background-position: -240px -112px; }
-.ui-icon-cancel { background-position: 0 -128px; }
-.ui-icon-plus { background-position: -16px -128px; }
-.ui-icon-plusthick { background-position: -32px -128px; }
-.ui-icon-minus { background-position: -48px -128px; }
-.ui-icon-minusthick { background-position: -64px -128px; }
-.ui-icon-close { background-position: -80px -128px; }
-.ui-icon-closethick { background-position: -96px -128px; }
-.ui-icon-key { background-position: -112px -128px; }
-.ui-icon-lightbulb { background-position: -128px -128px; }
-.ui-icon-scissors { background-position: -144px -128px; }
-.ui-icon-clipboard { background-position: -160px -128px; }
-.ui-icon-copy { background-position: -176px -128px; }
-.ui-icon-contact { background-position: -192px -128px; }
-.ui-icon-image { background-position: -208px -128px; }
-.ui-icon-video { background-position: -224px -128px; }
-.ui-icon-script { background-position: -240px -128px; }
-.ui-icon-alert { background-position: 0 -144px; }
-.ui-icon-info { background-position: -16px -144px; }
-.ui-icon-notice { background-position: -32px -144px; }
-.ui-icon-help { background-position: -48px -144px; }
-.ui-icon-check { background-position: -64px -144px; }
-.ui-icon-bullet { background-position: -80px -144px; }
-.ui-icon-radio-on { background-position: -96px -144px; }
-.ui-icon-radio-off { background-position: -112px -144px; }
-.ui-icon-pin-w { background-position: -128px -144px; }
-.ui-icon-pin-s { background-position: -144px -144px; }
-.ui-icon-play { background-position: 0 -160px; }
-.ui-icon-pause { background-position: -16px -160px; }
-.ui-icon-seek-next { background-position: -32px -160px; }
-.ui-icon-seek-prev { background-position: -48px -160px; }
-.ui-icon-seek-end { background-position: -64px -160px; }
-.ui-icon-seek-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.ui-icon-seek-first { background-position: -80px -160px; }
-.ui-icon-stop { background-position: -96px -160px; }
-.ui-icon-eject { background-position: -112px -160px; }
-.ui-icon-volume-off { background-position: -128px -160px; }
-.ui-icon-volume-on { background-position: -144px -160px; }
-.ui-icon-power { background-position: 0 -176px; }
-.ui-icon-signal-diag { background-position: -16px -176px; }
-.ui-icon-signal { background-position: -32px -176px; }
-.ui-icon-battery-0 { background-position: -48px -176px; }
-.ui-icon-battery-1 { background-position: -64px -176px; }
-.ui-icon-battery-2 { background-position: -80px -176px; }
-.ui-icon-battery-3 { background-position: -96px -176px; }
-.ui-icon-circle-plus { background-position: 0 -192px; }
-.ui-icon-circle-minus { background-position: -16px -192px; }
-.ui-icon-circle-close { background-position: -32px -192px; }
-.ui-icon-circle-triangle-e { background-position: -48px -192px; }
-.ui-icon-circle-triangle-s { background-position: -64px -192px; }
-.ui-icon-circle-triangle-w { background-position: -80px -192px; }
-.ui-icon-circle-triangle-n { background-position: -96px -192px; }
-.ui-icon-circle-arrow-e { background-position: -112px -192px; }
-.ui-icon-circle-arrow-s { background-position: -128px -192px; }
-.ui-icon-circle-arrow-w { background-position: -144px -192px; }
-.ui-icon-circle-arrow-n { background-position: -160px -192px; }
-.ui-icon-circle-zoomin { background-position: -176px -192px; }
-.ui-icon-circle-zoomout { background-position: -192px -192px; }
-.ui-icon-circle-check { background-position: -208px -192px; }
-.ui-icon-circlesmall-plus { background-position: 0 -208px; }
-.ui-icon-circlesmall-minus { background-position: -16px -208px; }
-.ui-icon-circlesmall-close { background-position: -32px -208px; }
-.ui-icon-squaresmall-plus { background-position: -48px -208px; }
-.ui-icon-squaresmall-minus { background-position: -64px -208px; }
-.ui-icon-squaresmall-close { background-position: -80px -208px; }
-.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
-.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
-.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
-.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
-.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
-.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Corner radius */
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-left,
-.ui-corner-tl {
- border-top-left-radius: 4px;
-}
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-right,
-.ui-corner-tr {
- border-top-right-radius: 4px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-left,
-.ui-corner-bl {
- border-bottom-left-radius: 4px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-right,
-.ui-corner-br {
- border-bottom-right-radius: 4px;
-}
-
-/* Overlays */
-.ui-widget-overlay {
- background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;
- opacity: .3;
- filter: Alpha(Opacity=30);
-}
-.ui-widget-shadow {
- margin: -8px 0 0 -8px;
- padding: 8px;
- background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;
- opacity: .3;
- filter: Alpha(Opacity=30);
- border-radius: 8px;
-}
diff --git a/functions/metaboxes/custom-meta-boxes.php b/functions/metaboxes/custom-meta-boxes.php
deleted file mode 100755
index b085d0e..0000000
--- a/functions/metaboxes/custom-meta-boxes.php
+++ /dev/null
@@ -1,174 +0,0 @@
- 'CMB_Text_Field',
- 'text_small' => 'CMB_Text_Small_Field',
- 'text_url' => 'CMB_URL_Field',
- 'url' => 'CMB_URL_Field',
- 'radio' => 'CMB_Radio_Field',
- 'checkbox' => 'CMB_Checkbox',
- 'file' => 'CMB_File_Field',
- 'image' => 'CMB_Image_Field',
- 'wysiwyg' => 'CMB_wysiwyg',
- 'textarea' => 'CMB_Textarea_Field',
- 'textarea_code' => 'CMB_Textarea_Field_Code',
- 'select' => 'CMB_Select',
- 'taxonomy_select' => 'CMB_Taxonomy',
- 'post_select' => 'CMB_Post_Select',
- 'date' => 'CMB_Date_Field',
- 'date_unix' => 'CMB_Date_Timestamp_Field',
- 'datetime_unix' => 'CMB_Datetime_Timestamp_Field',
- 'time' => 'CMB_Time_Field',
- 'colorpicker' => 'CMB_Color_Picker',
- 'title' => 'CMB_Title',
- 'group' => 'CMB_Group_Field',
- ) );
-
-}
-
-/**
- * Get a field class by type
- *
- * @param string $type
- * @return string $class, or false if not found.
- */
-function _cmb_field_class_for_type( $type ) {
-
- $map = _cmb_available_fields();
-
- if ( isset( $map[$type] ) )
- return $map[$type];
-
- return false;
-
-}
-
-/**
- * For the order of repeatable fields to be guaranteed, orderby meta_id needs to be set.
- * Note usermeta has a different meta_id column name.
- *
- * TODO
- * This is far from ideal as we are doing this on EVERY SINGLE QUERY.
- * But... no other way to modify this query, or re-order in PHP.
- * There is a trac ticket + patch that will fix this. http://core.trac.wordpress.org/ticket/25511
- *
- * @param string $query
- * @return string $query
- */
-function cmb_fix_meta_query_order($query) {
-
- $pattern = '/^SELECT (post_id|user_id), meta_key, meta_value FROM \w* WHERE post_id IN \([\d|,]*\)$/';
-
- if (
- 0 === strpos( $query, "SELECT post_id, meta_key, meta_value" ) &&
- preg_match( $pattern, $query, $matches )
- ) {
-
- if ( isset( $matches[1] ) && 'user_id' == $matches[1] )
- $meta_id_column = 'umeta_id';
- else
- $meta_id_column = 'meta_id';
-
- $meta_query_orderby = ' ORDER BY ' . $meta_id_column;
-
- if ( false === strpos( $query, $meta_query_orderby ) )
- $query .= $meta_query_orderby;
-
- }
-
- return $query;
-
-}
-
-if ( version_compare( get_bloginfo( 'version' ), '3.7', '<=' ) )
- add_filter( 'query', 'cmb_fix_meta_query_order', 1 );
diff --git a/functions/metaboxes/example-functions.php b/functions/metaboxes/example-functions.php
deleted file mode 100755
index 530425b..0000000
--- a/functions/metaboxes/example-functions.php
+++ /dev/null
@@ -1,104 +0,0 @@
- 'field-1', 'name' => 'Text input field', 'type' => 'text' ),
- array( 'id' => 'field-2', 'name' => 'Read-only text input field', 'type' => 'text', 'readonly' => true, 'default' => 'READ ONLY' ),
- array( 'id' => 'field-3', 'name' => 'Repeatable text input field', 'type' => 'text', 'desc' => 'Add up to 5 fields.', 'repeatable' => true, 'repeatable_max' => 5 ),
-
- array( 'id' => 'field-4', 'name' => 'Small text input field', 'type' => 'text_small' ),
- array( 'id' => 'field-5', 'name' => 'URL field', 'type' => 'url' ),
-
- array( 'id' => 'field-6', 'name' => 'Radio input field', 'type' => 'radio', 'options' => array( 'Option 1', 'Option 2' ) ),
- array( 'id' => 'field-7', 'name' => 'Checkbox field', 'type' => 'checkbox' ),
-
- array( 'id' => 'field-8', 'name' => 'WYSIWYG field', 'type' => 'wysiwyg', 'options' => array( 'editor_height' => '100' ) ),
-
- array( 'id' => 'field-9', 'name' => 'Textarea field', 'type' => 'textarea' ),
- array( 'id' => 'field-10', 'name' => 'Code textarea field', 'type' => 'textarea_code' ),
-
- array( 'id' => 'field-11', 'name' => 'File field', 'type' => 'file', 'file_type' => 'image', 'repeatable' => 1, 'sortable' => 1 ),
- array( 'id' => 'field-12', 'name' => 'Image upload field', 'type' => 'image', 'repeatable' => true, 'show_size' => true ),
-
- array( 'id' => 'field-13', 'name' => 'Select field', 'type' => 'select', 'options' => array( 'option-1' => 'Option 1', 'option-2' => 'Option 2', 'option-3' => 'Option 3' ), 'allow_none' => true ),
- array( 'id' => 'field-14', 'name' => 'Select field', 'type' => 'select', 'options' => array( 'option-1' => 'Option 1', 'option-2' => 'Option 2', 'option-3' => 'Option 3' ), 'multiple' => true ),
- array( 'id' => 'field-15', 'name' => 'Select taxonomy field', 'type' => 'taxonomy_select', 'taxonomy' => 'category' ),
- array( 'id' => 'field-15b', 'name' => 'Select taxonomy field', 'type' => 'taxonomy_select', 'taxonomy' => 'category', 'multiple' => true ),
- array( 'id' => 'field-16', 'name' => 'Post select field', 'type' => 'post_select', 'use_ajax' => false, 'query' => array( 'cat' => 1 ) ),
- array( 'id' => 'field-17', 'name' => 'Post select field (AJAX)', 'type' => 'post_select', 'use_ajax' => true ),
- array( 'id' => 'field-17b', 'name' => 'Post select field (AJAX)', 'type' => 'post_select', 'use_ajax' => true, 'query' => array( 'posts_per_page' => 8 ), 'multiple' => true ),
-
- array( 'id' => 'field-18', 'name' => 'Date input field', 'type' => 'date' ),
- array( 'id' => 'field-19', 'name' => 'Time input field', 'type' => 'time' ),
- array( 'id' => 'field-20', 'name' => 'Date (unix) input field', 'type' => 'date_unix' ),
- array( 'id' => 'field-21', 'name' => 'Date & Time (unix) input field', 'type' => 'datetime_unix' ),
-
- array( 'id' => 'field-22', 'name' => 'Color', 'type' => 'colorpicker' ),
-
- array( 'id' => 'field-24', 'name' => 'Title Field', 'type' => 'title' ),
-
- );
-
- $meta_boxes[] = array(
- 'title' => 'CMB Test - all fields',
- 'pages' => 'post',
- 'fields' => $fields
- );
-
- // Examples of Groups and Columns
-
- $groups_and_cols = array(
- array( 'id' => 'gac-1', 'name' => 'Text input field', 'type' => 'text', 'cols' => 4 ),
- array( 'id' => 'gac-2', 'name' => 'Text input field', 'type' => 'text', 'cols' => 4 ),
- array( 'id' => 'gac-3', 'name' => 'Text input field', 'type' => 'text', 'cols' => 4 ),
- array( 'id' => 'gac-4', 'name' => 'Group (4 columns)', 'type' => 'group', 'cols' => 4, 'fields' => array(
- array( 'id' => 'gac-4-f-1', 'name' => 'Textarea field', 'type' => 'textarea' )
- ) ),
- array( 'id' => 'gac-5', 'name' => 'Group (8 columns)', 'type' => 'group', 'cols' => 8, 'fields' => array(
- array( 'id' => 'gac-4-f-1', 'name' => 'Text input field', 'type' => 'text' ),
- array( 'id' => 'gac-4-f-2', 'name' => 'Text input field', 'type' => 'text' ),
- ) ),
- );
-
- $meta_boxes[] = array(
- 'title' => 'Groups and Columns',
- 'pages' => 'post',
- 'fields' => $groups_and_cols
- );
-
- // Example of repeatable group. Using all fields.
- // For this example, copy fields from $fields, update I
- $group_fields = $fields;
- foreach ( $group_fields as &$field ) {
- $field['id'] = str_replace( 'field', 'gfield', $field['id'] );
- }
-
- $meta_boxes[] = array(
- 'title' => 'CMB Test - group (all fields)',
- 'pages' => 'post',
- 'fields' => array(
- array(
- 'id' => 'gp',
- 'name' => 'My Repeatable Group',
- 'type' => 'group',
- 'repeatable' => true,
- 'sortable' => true,
- 'fields' => $group_fields,
- 'desc' => 'This is the group description.'
- )
- )
- );
-
- return $meta_boxes;
-
-}
-add_filter( 'cmb_meta_boxes', 'cmb_sample_metaboxes' );
diff --git a/functions/metaboxes/fields-anywhere.php b/functions/metaboxes/fields-anywhere.php
deleted file mode 100755
index 08bb2c8..0000000
--- a/functions/metaboxes/fields-anywhere.php
+++ /dev/null
@@ -1,92 +0,0 @@
-id;
-
- $hidden = get_hidden_meta_boxes( $screen );
-
- $i = 0;
-
- do {
- // Grab the ones the user has manually sorted. Pull them out of their previous context/priority and into the one the user chose
-
- if ( ! $already_sorted && $sorted = get_user_option( "meta-box-order_$page" ) )
- foreach ( $sorted as $box_context => $ids )
- foreach ( explode(',', $ids ) as $id )
- if ( $id && 'dashboard_browser_nag' !== $id )
- add_meta_box( $id, null, null, $screen, $box_context, 'sorted' );
-
- $already_sorted = true;
-
- if ( ! isset( $wp_meta_boxes ) || ! isset( $wp_meta_boxes[$page] ) || ! isset( $wp_meta_boxes[$page][$context] ) )
- break;
-
- foreach ( array( 'high', 'sorted', 'core', 'default', 'low' ) as $priority ) {
-
- if ( isset( $wp_meta_boxes[$page][$context][$priority] ) ) {
-
- foreach ( (array) $wp_meta_boxes[$page][$context][$priority] as $box ) {
-
- if ( false == $box || ! $box['title'] )
- continue;
-
- $i++;
-
- $hidden_class = in_array($box['id'], $hidden) ? ' hide-if-js' : ''; ?>
-
-
-
-
-
-
-
- .field-item > .cmb-delete-field, > .field-item > .group > .cmb-delete-field' ).show();
-
- if ( typeof( max ) === 'undefined' )
- return false;
-
- // Disable the add new field button?
- if ( count >= parseInt( max, 10 ) )
- addBtn.attr( 'disabled', 'disabled' );
- else
- addBtn.removeAttr( 'disabled' );
-
- if ( count > parseInt( max, 10 ) )
- return true;
-
- },
-
- addCallbackForInit: function( callback ) {
-
- this._initCallbacks.push( callback )
-
- },
-
- /**
- * Fire init callbacks.
- * Called when CMB has been set up.
- */
- doneInit: function() {
-
- var _this = this,
- callbacks = CMB._initCallbacks;
-
- if ( callbacks ) {
- for ( var a = 0; a < callbacks.length; a++) {
- callbacks[a]();
- }
- }
-
- },
-
- addCallbackForClonedField: function( fieldName, callback ) {
-
- if ( jQuery.isArray( fieldName ) )
- for ( var i = 0; i < fieldName.length; i++ )
- CMB.addCallbackForClonedField( fieldName[i], callback );
-
- this._clonedFieldCallbacks[fieldName] = this._clonedFieldCallbacks[fieldName] ? this._clonedFieldCallbacks[fieldName] : []
- this._clonedFieldCallbacks[fieldName].push( callback )
-
- },
-
- /**
- * Fire clonedField callbacks.
- * Called when a field has been cloned.
- */
- clonedField: function( el ) {
-
- // also check child elements
- el.add( el.find( 'div[data-class]' ) ).each( function( i, el ) {
-
- el = jQuery( el )
- var callbacks = CMB._clonedFieldCallbacks[el.attr( 'data-class') ]
-
- if ( callbacks )
- for ( var a = 0; a < callbacks.length; a++ )
- callbacks[a]( el );
-
- })
- },
-
- addCallbackForDeletedField: function( fieldName, callback ) {
-
- if ( jQuery.isArray( fieldName ) )
- for ( var i = 0; i < fieldName.length; i++ )
- CMB._deletedFieldCallbacks( fieldName[i], callback );
-
- this._deletedFieldCallbacks[fieldName] = this._deletedFieldCallbacks[fieldName] ? this._deletedFieldCallbacks[fieldName] : []
- this._deletedFieldCallbacks[fieldName].push( callback )
-
- },
-
- /**
- * Fire deletedField callbacks.
- * Called when a field has been cloned.
- */
- deletedField: function( el ) {
-
- // also check child elements
- el.add( el.find( 'div[data-class]' ) ).each( function(i, el) {
-
- el = jQuery( el )
- var callbacks = CMB._deletedFieldCallbacks[el.attr( 'data-class') ]
-
- if ( callbacks )
- for ( var a = 0; a < callbacks.length; a++ )
- callbacks[a]( el )
-
- })
- }
-
-}
-
-jQuery(document).ready( function() {
-
- CMB.init();
-
-});
diff --git a/functions/metaboxes/js/field-wysiwyg.js b/functions/metaboxes/js/field-wysiwyg.js
deleted file mode 100755
index ceaafb6..0000000
--- a/functions/metaboxes/js/field-wysiwyg.js
+++ /dev/null
@@ -1,66 +0,0 @@
-CMB.addCallbackForDeletedField( 'CMB_wysiwyg', function( el ) {
-
- // Destroy WYSIWYG editors instances.
- el.find( '.cmb-wysiwyg textarea' ).each( function() {
- var instance = tinyMCE.get( jQuery(this).attr('id') );
- if ( typeof( instance ) !== 'undefined' )
- instance.remove();
- } );
-
-} );
-
-CMB.addCallbackForClonedField( 'CMB_wysiwyg', function( newT ) {
-
- newT.find( '.cmb-wysiwyg' ).each( function (i) {
-
- var el, id, name, ed, dom, i, fieldId, nameRegex, idRegex;
-
- el = jQuery(this);
- id = el.attr( 'data-id' );
- name = el.attr( 'data-name' );
- ed = tinyMCE.get(id);
- fieldId = el.attr('data-field-id'); //Field identifier, not including field/group index.,
-
- if ( ed )
- return;
-
- nameRegex = new RegExp( 'cmb-placeholder-name-' + fieldId, 'g' );
- idRegex = new RegExp( 'cmb-placeholder-id-' + fieldId, 'g' );
-
- // Placeholder markup for the new wysiwyg is stored as a prop on var cmb_wysiwyg_editors
- // Copy, update ids & names & insert.
- el.html( cmb_wysiwyg_editors[fieldId].replace( nameRegex, name ).replace( idRegex, id ) );
-
- // If no settings for this field. Clone from placeholder.
- if ( typeof( tinyMCEPreInit.mceInit[ id ] ) === 'undefined' ) {
- var newSettings = jQuery.extend( {}, tinyMCEPreInit.mceInit[ 'cmb-placeholder-id-' + fieldId ] );
- for ( var prop in newSettings )
- if ( 'string' === typeof( newSettings[prop] ) )
- newSettings[prop] = newSettings[prop].replace( idRegex, id ).replace( nameRegex, name );
- tinyMCEPreInit.mceInit[ id ] = newSettings;
- }
-
- // If no Quicktag settings for this field. Clone from placeholder.
- if ( typeof( tinyMCEPreInit.qtInit[ id ] ) === 'undefined' ) {
- var newQTS = jQuery.extend( {}, tinyMCEPreInit.qtInit[ 'cmb-placeholder-id-' + fieldId ] );
- for ( var prop in newQTS )
- if ( 'string' === typeof( newQTS[prop] ) )
- newQTS[prop] = newQTS[prop].replace( idRegex, id ).replace( nameRegex, name );
- tinyMCEPreInit.qtInit[ id ] = newQTS;
- }
-
- var mode = el.find('.wp-editor-wrap').hasClass('tmce-active') ? 'tmce' : 'html';
-
- // If current mode is visual, create the tinyMCE.
- if ( 'tmce' === mode ) {
- var ed = new tinymce.Editor( id, tinyMCEPreInit.mceInit[id] );
- ed.render();
- }
-
- // Init Quicktags.
- QTags.instances[0] = undefined;
- try { quicktags( tinyMCEPreInit.qtInit[id] ); } catch(e){}
-
- } );
-
-} );
\ No newline at end of file
diff --git a/functions/metaboxes/js/field.colorpicker.js b/functions/metaboxes/js/field.colorpicker.js
deleted file mode 100755
index 01bd32b..0000000
--- a/functions/metaboxes/js/field.colorpicker.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- * ColorPickers
- */
-
-CMB.addCallbackForInit( function() {
-
- // Colorpicker
- jQuery('input:text.cmb_colorpicker').wpColorPicker();
-
-} );
-
-CMB.addCallbackForClonedField( 'CMB_Color_Picker', function( newT ) {
-
- // Reinitialize colorpickers
- newT.find('.wp-color-result').remove();
- newT.find('input:text.cmb_colorpicker').wpColorPicker();
-
-} );
diff --git a/functions/metaboxes/js/field.datetime.js b/functions/metaboxes/js/field.datetime.js
deleted file mode 100755
index 7636563..0000000
--- a/functions/metaboxes/js/field.datetime.js
+++ /dev/null
@@ -1,47 +0,0 @@
-
-/**
- * Date & Time Fields
- */
-
-CMB.addCallbackForClonedField( ['CMB_Date_Field', 'CMB_Time_Field', 'CMB_Date_Timestamp_Field', 'CMB_Datetime_Timestamp_Field' ], function( newT ) {
-
- // Reinitialize all the datepickers
- newT.find( '.cmb_datepicker' ).each(function () {
- jQuery(this).attr( 'id', '' ).removeClass( 'hasDatepicker' ).removeData( 'datepicker' ).unbind().datepicker();
- });
-
- // Reinitialize all the timepickers.
- newT.find('.cmb_timepicker' ).each(function () {
- jQuery(this).timePicker({
- startTime: "00:00",
- endTime: "23:30",
- show24Hours: false,
- separator: ':',
- step: 30
- });
- });
-
-} );
-
-CMB.addCallbackForInit( function() {
-
- // Datepicker
- jQuery('.cmb_datepicker').each(function () {
- jQuery(this).datepicker();
- });
-
- // Wrap date picker in class to narrow the scope of jQuery UI CSS and prevent conflicts
- jQuery("#ui-datepicker-div").wrap('
');
-
- // Timepicker
- jQuery('.cmb_timepicker').each(function () {
- jQuery(this).timePicker({
- startTime: "00:00",
- endTime: "23:30",
- show24Hours: false,
- separator: ':',
- step: 30
- });
- } );
-
-});
\ No newline at end of file
diff --git a/functions/metaboxes/js/field.select.js b/functions/metaboxes/js/field.select.js
deleted file mode 100755
index 8a6c729..0000000
--- a/functions/metaboxes/js/field.select.js
+++ /dev/null
@@ -1,29 +0,0 @@
-var cmbSelectInit = function() {
-
- jQuery( '.cmb_select' ).each( function() {
-
- var el = jQuery(this);
- var fieldID = el.attr( 'data-field-id'); // JS Friendly ID
-
- // If fieldID is set
- // If fieldID options exist
- // If Element is not hidden template field.
- // If elemnt has not already been initialized.
- if ( fieldID && fieldID in window.cmb_select_fields && el.is( ':visible' ) && ! el.hasClass( 'select2-added' ) ) {
-
- // Get options for this field.
- options = window.cmb_select_fields[fieldID];
-
- el.addClass( 'select2-added' ).select2( options );
-
- }
-
- })
-
-};
-
-// Hook this in for all the required fields.
-CMB.addCallbackForInit( cmbSelectInit );
-CMB.addCallbackForClonedField( 'CMB_Select', cmbSelectInit );
-CMB.addCallbackForClonedField( 'CMB_Post_Select', cmbSelectInit );
-CMB.addCallbackForClonedField( 'CMB_Taxonomy', cmbSelectInit );
diff --git a/functions/metaboxes/js/file-upload.js b/functions/metaboxes/js/file-upload.js
deleted file mode 100755
index d03d0a4..0000000
--- a/functions/metaboxes/js/file-upload.js
+++ /dev/null
@@ -1,129 +0,0 @@
-jQuery( document ).ready( function() {
-
- jQuery( document ).on( 'click', '.cmb-file-upload', function(e) {
-
- e.preventDefault();
-
- var link = jQuery( this );
- var container = jQuery( this ).parent();
-
- var frameArgs = {
- multiple: false,
- title: 'Select File',
- }
-
- library = container.attr( 'data-type' ).split(',');
- if ( library.length > 0 )
- frameArgs.library = { type: library }
-
- var CMB_Frame = wp.media( frameArgs );
-
- CMB_Frame.on( 'select', function() {
-
- var selection = CMB_Frame.state().get('selection'),
- model = selection.first(),
- fileHolder = container.find( '.cmb-file-holder' );
-
- jQuery( container ).find( '.cmb-file-upload-input' ).val( model.id );
-
- link.hide(); // Hide 'add media' button
-
- CMB_Frame.close();
-
- fileHolder.html( '' );
- fileHolder.show();
- fileHolder.siblings( '.cmb-remove-file' ).show();
-
- var fieldType = container.closest( '.field-item' ).attr( 'data-class' );
-
- if ( 'CMB_Image_Field' === fieldType ) {
-
- var data = {
- action: 'cmb_request_image',
- id: model.attributes.id,
- width: container.width(),
- height: container.height(),
- crop: fileHolder.attr('data-crop'),
- nonce: link.attr( 'data-nonce' )
- }
-
- fileHolder.addClass( 'cmb-loading' );
-
- jQuery.post( ajaxurl, data, function( src ) {
- // Insert image
- jQuery( ' ', { src: src } ).prependTo( fileHolder );
- fileHolder.removeClass( 'cmb-loading' );
- }).fail( function() {
- // Fallback - insert full size image.
- jQuery( ' ', { src: model.attributes.url } ).prependTo( fileHolder );
- fileHolder.removeClass( 'cmb-loading' );
- });
-
- } else {
-
- jQuery( ' ', { src: model.attributes.icon } ).prependTo( fileHolder );
- fileHolder.append( jQuery('
').html( '' + model.attributes.filename + ' ' ) );
-
- }
-
- });
-
- CMB_Frame.open();
-
- } );
-
- jQuery( document ).on( 'click', '.cmb-remove-file', function(e) {
-
- e.preventDefault();
-
- var container = jQuery( this ).parent().parent();
-
- container.find( '.cmb-file-holder' ).html( '' ).hide();
- container.find( '.cmb-file-upload-input' ).val( '' );
- container.find( '.cmb-file-upload' ).show().css( 'display', 'inline-block' );
- container.find( '.cmb-remove-file' ).hide();
-
- } );
-
- /**
- * Recalculate the dimensions of the file upload field.
- * It should never be larger than the available width.
- * It should maintain the aspect ratio of the original field.
- * It should recalculate when resized.
- * @return {[type]} [description]
- */
- var recalculateFileFieldSize = function() {
-
- jQuery( '.cmb-file-wrap' ).each( function() {
-
- var el = jQuery(this),
- container = el.closest( '.postbox' ),
- width = container.width() - 12 - 10 - 10,
- ratio = el.height() / el.width();
-
- if ( el.attr( 'data-original-width' ) )
- el.width( el.attr( 'data-original-width' ) );
- else
- el.attr( 'data-original-width', el.width() );
-
- if ( el.attr( 'data-original-height' ) )
- el.height( el.attr( 'data-original-height' ) );
- else
- el.attr( 'data-original-height', el.height() );
-
- if ( el.width() > width ) {
- el.width( width );
- el.find( '.cmb-file-wrap-placeholder' ).width( width - 8 );
- el.height( width * ratio );
- el.css( 'line-height', ( width * ratio ) + 'px' );
- el.find( '.cmb-file-wrap-placeholder' ).height( ( width * ratio ) - 8 );
- }
-
-
- } );
- }
-
- recalculateFileFieldSize();
- jQuery(window).resize( recalculateFileFieldSize );
-
-} );
\ No newline at end of file
diff --git a/functions/metaboxes/js/jquery.timePicker.min.js b/functions/metaboxes/js/jquery.timePicker.min.js
deleted file mode 100755
index a883ce5..0000000
--- a/functions/metaboxes/js/jquery.timePicker.min.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * A time picker for jQuery
- *
- * Dual licensed under the MIT and GPL licenses.
- * Copyright (c) 2009 Anders Fajerson and 2013 Dennis Burke
- * @name timePicker
- * @author Anders Fajerson (http://perifer.se)
- * @example $("#mytime").timePicker();
- * @example $("#mytime").timePicker({step:30, startTime:"15:00", endTime:"18:00"});
- *
- * Based on timePicker by Sam Collet (http://www.texotela.co.uk/code/jquery/timepicker/)
- *
- * Options:
- * step: # of minutes to step the time by
- * startTime: beginning of the range of acceptable times
- * endTime: end of the range of acceptable times
- * separator: separator string to use between hours and minutes (e.g. ':')
- * show24Hours: use a 24-hour scheme
- */
-(function(e){"use strict";function n(t,n,r){t.value=e(n).text();e(t).change();t.focus();r.hide()}function r(e,t){var n=e.getHours();var r=t.show24Hours?n:(n+11)%12+1;var s=e.getMinutes();return i(r)+t.separator+i(s)+(t.show24Hours?"":n<12?" am":" pm")}function i(e){return(e<10?"0":"")+e}function s(e,t){return typeof e==="object"?u(e):o(e,t)}function o(e,t){if(e){e=a(e,t);var n=e.split(t.separator);var r=parseFloat(n[0]);var i=parseFloat(n[1]);if(!t.show24Hours){if(r===12&&e.indexOf("am")!==-1){r=0}else if(r!==12&&e.indexOf("pm")!==-1){r+=12}}var s=new Date(0,0,0,r,i,0);return u(s)}return null}function u(e){e.setFullYear(2001);e.setMonth(0);e.setDate(0);return e}function a(e,t){var n,r,i,s,o,u;if(t.show24Hours){return e}if(e){r=e.toLowerCase().replace(/\s*/g,"");if(n=/^(\d{1,2})(a|p)m*$/.exec(r)){if(parseInt(n[1],10)<12){return""+n[1]+":00"+n[2]+"m"}}else if(i=/^(\d{1,2}):(\d{1,2})(a|p)m*$/.exec(r)){s=parseInt(i[1],10);o=parseInt(i[2],10);u=i[3]+"m";if(s<12||o<59){return""+s+":"+(o>=10?o:o+"0")+u}}else if(i=/^(\d{1,2}):(\d{1,2})$/.exec(r)){s=parseInt(i[1],10);o=parseInt(i[2],10);u="am";if(s<=24&&o<=59){if(s>=12){s=s-12;u="pm"}if(s===0){s=12}return s+":"+o+u}}}}var t={init:function(t){var n=e.extend({},e.fn.timePicker.defaults,t);return this.each(function(){e.timePicker(this,n)})},destroy:function(){return this.each(function(){if(this.timePicker){var t=e(this).data("timepickerdiv");e(this).data("timepickerdiv","");e("#"+t).remove();delete this.timePicker}})}};e.timePicker=function(t,n){try{var r=e(t)[0];return r.timePicker||(r.timePicker=new e._timePicker(r,n))}catch(i){throw"timepicker must be called on an element"}};e.timePicker.version="0.4.0";e._timePicker=function(t,i){var f=false;var l=false;var c=s(i.startTime,i);var h=s(i.endTime,i);var p=i.defaultSelected?s(i.defaultSelected,i):c;var d="selected";var v="li."+d;var m="tp"+(new Date).getTime();e(t).attr("autocomplete","off");e(t).data("timepickerdiv",m);var g=[];var y=new Date(c);while(y<=h){g[g.length]=r(y,i);y=new Date(y.setMinutes(y.getMinutes()+i.step))}var b=e('
');var w=e("");for(var E=0;E"+g[E]+"")}b.append(w);b.appendTo("body").hide();b.mouseover(function(){f=true}).mouseout(function(){f=false});e("li",w).mouseover(function(){if(!l){e(v,b).removeClass(d);e(this).addClass(d)}}).mousedown(function(){f=true}).click(function(){n(t,this,b,i);f=false});var S=function(){if(b.is(":visible")){return false}e("li",b).removeClass(d);var n=e(t).offset();b.css({top:n.top+t.offsetHeight,left:n.left});b.show();var s=t.value?o(t.value,i):p;var a=c.getHours()*60+c.getMinutes();var f=s.getHours()*60+s.getMinutes()-a;var l=Math.round(f/i.step);var v=u(new Date(0,0,0,0,l*i.step+a,0));v=co+b[0].offsetHeight){b[0].scrollTop=o+a.offsetHeight}}else{s.removeClass(d);a=e("li:first",w).addClass(d)[0];b[0].scrollTop=0}break;case 13:if(b.is(":visible")){var f=e(v,w)[0];n(t,f,b,i);r.preventDefault()}break;case 27:b.hide();break}});e(t).keyup(function(){l=false});this.getTime=function(){return o(t.value,i)};this.setTime=function(n){t.value=r(s(n,i),i);e(t).change()}};e.fn.timePicker=function(n){if(t[n]){return t[n].apply(this,Array.prototype.slice.call(arguments,1))}else if(typeof n==="object"||!n){return t.init.apply(this,arguments)}else{e.error("Method "+n+" does not exist on jQuery.tooltip")}};e.fn.timePicker.defaults={step:30,startTime:new Date(0,0,0,0,0,0),endTime:new Date(0,0,0,23,30,0),defaultSelected:null,separator:":",show24Hours:true}})(jQuery)
\ No newline at end of file
diff --git a/functions/metaboxes/js/select2/LICENSE b/functions/metaboxes/js/select2/LICENSE
deleted file mode 100755
index 0247cc7..0000000
--- a/functions/metaboxes/js/select2/LICENSE
+++ /dev/null
@@ -1,18 +0,0 @@
-Copyright 2014 Igor Vaynberg
-
-Version: @@ver@@ Timestamp: @@timestamp@@
-
-This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
-General Public License version 2 (the "GPL License"). You may choose either license to govern your
-use of this software only upon the condition that you accept all of the terms of either the Apache
-License or the GPL License.
-
-You may obtain a copy of the Apache License and the GPL License at:
-
-http://www.apache.org/licenses/LICENSE-2.0
-http://www.gnu.org/licenses/gpl-2.0.html
-
-Unless required by applicable law or agreed to in writing, software distributed under the Apache License
-or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
-either express or implied. See the Apache License and the GPL License for the specific language governing
-permissions and limitations under the Apache License and the GPL License.
diff --git a/functions/metaboxes/js/select2/README.md b/functions/metaboxes/js/select2/README.md
deleted file mode 100755
index 2c7d2a0..0000000
--- a/functions/metaboxes/js/select2/README.md
+++ /dev/null
@@ -1,99 +0,0 @@
-Select2
-=======
-
-Select2 is a jQuery-based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.
-
-To get started, checkout examples and documentation at http://ivaynberg.github.com/select2
-
-Use cases
----------
-
-* Enhancing native selects with search.
-* Enhancing native selects with a better multi-select interface.
-* Loading data from JavaScript: easily load items via ajax and have them searchable.
-* Nesting optgroups: native selects only support one level of nested. Select2 does not have this restriction.
-* Tagging: ability to add new items on the fly.
-* Working with large, remote datasets: ability to partially load a dataset based on the search term.
-* Paging of large datasets: easy support for loading more pages when the results are scrolled to the end.
-* Templating: support for custom rendering of results and selections.
-
-Browser compatibility
----------------------
-* IE 8+
-* Chrome 8+
-* Firefox 10+
-* Safari 3+
-* Opera 10.6+
-
-Usage
------
-You can source Select2 directly from a [CDN like JSDliver](http://www.jsdelivr.com/#!select2), [download it from this GitHub repo](https://github.com/ivaynberg/select2/tags), or use one of the integrations below.
-
-Integrations
-------------
-
-* [Wicket-Select2](https://github.com/ivaynberg/wicket-select2) (Java / [Apache Wicket](http://wicket.apache.org))
-* [select2-rails](https://github.com/argerim/select2-rails) (Ruby on Rails)
-* [AngularUI](http://angular-ui.github.com/#directives-select2) ([AngularJS](angularjs.org))
-* [Django](https://github.com/applegrew/django-select2)
-* [Symfony](https://github.com/19Gerhard85/sfSelect2WidgetsPlugin)
-* [Symfony2](https://github.com/avocode/FormExtensions)
-* [Bootstrap 2](https://github.com/t0m/select2-bootstrap-css) and [Bootstrap 3](https://github.com/t0m/select2-bootstrap-css/tree/bootstrap3) (CSS skins)
-* [Meteor](https://github.com/nate-strauser/meteor-select2) (modern reactive JavaScript framework; + [Bootstrap 3 skin](https://github.com/esperadomedia/meteor-select2-bootstrap3-css/))
-* [Meteor](https://jquery-select2.meteor.com)
-* [Yii 2.x](http://demos.krajee.com/widgets#select2)
-* [Yii 1.x](https://github.com/tonybolzan/yii-select2)
-* [AtmosphereJS](https://atmospherejs.com/package/jquery-select2)
-
-### Example Integrations
-
-* [Knockout.js](https://github.com/ivaynberg/select2/wiki/Knockout.js-Integration)
-* [Socket.IO](https://github.com/ivaynberg/select2/wiki/Socket.IO-Integration)
-* [PHP](https://github.com/ivaynberg/select2/wiki/PHP-Example)
-* [.Net MVC] (https://github.com/ivaynberg/select2/wiki/.Net-MVC-Example)
-
-Internationalization (i18n)
----------------------------
-
-Select2 supports multiple languages by simply including the right language JS
-file (`select2_locale_it.js`, `select2_locale_nl.js`, etc.) after `select2.js`.
-
-Missing a language? Just copy `select2_locale_en.js.template`, translate
-it, and make a pull request back to Select2 here on GitHub.
-
-Bug tracker
------------
-
-Have a bug? Please create an issue here on GitHub!
-
-https://github.com/ivaynberg/select2/issues
-
-Mailing list
-------------
-
-Have a question? Ask on our mailing list!
-
-select2@googlegroups.com
-
-https://groups.google.com/d/forum/select2
-
-
-Copyright and license
----------------------
-
-Copyright 2012 Igor Vaynberg
-
-This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
-General Public License version 2 (the "GPL License"). You may choose either license to govern your
-use of this software only upon the condition that you accept all of the terms of either the Apache
-License or the GPL License.
-
-You may obtain a copy of the Apache License and the GPL License in the LICENSE file, or at:
-
-http://www.apache.org/licenses/LICENSE-2.0
-http://www.gnu.org/licenses/gpl-2.0.html
-
-Unless required by applicable law or agreed to in writing, software distributed under the Apache License
-or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
-either express or implied. See the Apache License and the GPL License for the specific language governing
-permissions and limitations under the Apache License and the GPL License.
diff --git a/functions/metaboxes/js/select2/bower.json b/functions/metaboxes/js/select2/bower.json
deleted file mode 100755
index d659504..0000000
--- a/functions/metaboxes/js/select2/bower.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "name": "select2",
- "version": "3.5.1",
- "main": ["select2.js", "select2.css", "select2.png", "select2x2.png", "select2-spinner.gif"],
- "dependencies": {
- "jquery": ">= 1.7.1"
- }
-}
diff --git a/functions/metaboxes/js/select2/component.json b/functions/metaboxes/js/select2/component.json
deleted file mode 100755
index 65e4e45..0000000
--- a/functions/metaboxes/js/select2/component.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
- "name": "select2",
- "repo": "ivaynberg/select2",
- "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
- "version": "3.5.1",
- "demo": "http://ivaynberg.github.io/select2/",
- "keywords": [
- "jquery"
- ],
- "main": "select2.js",
- "styles": [
- "select2.css",
- "select2-bootstrap.css"
- ],
- "scripts": [
- "select2.js",
- "select2_locale_ar.js",
- "select2_locale_bg.js",
- "select2_locale_ca.js",
- "select2_locale_cs.js",
- "select2_locale_da.js",
- "select2_locale_de.js",
- "select2_locale_el.js",
- "select2_locale_es.js",
- "select2_locale_et.js",
- "select2_locale_eu.js",
- "select2_locale_fa.js",
- "select2_locale_fi.js",
- "select2_locale_fr.js",
- "select2_locale_gl.js",
- "select2_locale_he.js",
- "select2_locale_hr.js",
- "select2_locale_hu.js",
- "select2_locale_id.js",
- "select2_locale_is.js",
- "select2_locale_it.js",
- "select2_locale_ja.js",
- "select2_locale_ka.js",
- "select2_locale_ko.js",
- "select2_locale_lt.js",
- "select2_locale_lv.js",
- "select2_locale_mk.js",
- "select2_locale_ms.js",
- "select2_locale_nl.js",
- "select2_locale_no.js",
- "select2_locale_pl.js",
- "select2_locale_pt-BR.js",
- "select2_locale_pt-PT.js",
- "select2_locale_ro.js",
- "select2_locale_ru.js",
- "select2_locale_sk.js",
- "select2_locale_sv.js",
- "select2_locale_th.js",
- "select2_locale_tr.js",
- "select2_locale_uk.js",
- "select2_locale_vi.js",
- "select2_locale_zh-CN.js",
- "select2_locale_zh-TW.js"
- ],
- "images": [
- "select2-spinner.gif",
- "select2.png",
- "select2x2.png"
- ],
- "license": "MIT"
-}
diff --git a/functions/metaboxes/js/select2/composer.json b/functions/metaboxes/js/select2/composer.json
deleted file mode 100755
index a0a4602..0000000
--- a/functions/metaboxes/js/select2/composer.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "name":
- "ivaynberg/select2",
- "description": "Select2 is a jQuery based replacement for select boxes.",
- "version": "3.5.1",
- "type": "component",
- "homepage": "http://ivaynberg.github.io/select2/",
- "license": "Apache-2.0",
- "require": {
- "robloach/component-installer": "*",
- "components/jquery": ">=1.7.1"
- },
- "extra": {
- "component": {
- "scripts": [
- "select2.js"
- ],
- "files": [
- "select2.js",
- "select2_locale_*.js",
- "select2.css",
- "select2-bootstrap.css",
- "select2-spinner.gif",
- "select2.png",
- "select2x2.png"
- ]
- }
- }
-}
diff --git a/functions/metaboxes/js/select2/package.json b/functions/metaboxes/js/select2/package.json
deleted file mode 100755
index 23ba85b..0000000
--- a/functions/metaboxes/js/select2/package.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "name" : "Select2",
- "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
- "homepage": "http://ivaynberg.github.io/select2",
- "author": "Igor Vaynberg",
- "repository": {"type": "git", "url": "git://github.com/ivaynberg/select2.git"},
- "main": "select2.js",
- "version": "3.5.1",
- "jspm": {
- "main": "select2",
- "files": ["select2.js", "select2.png", "select2.css", "select2-spinner.gif"],
- "shim": {
- "select2": {
- "imports": ["jquery", "./select2.css!"],
- "exports": "$"
- }
- },
- "buildConfig": { "uglify": true }
- }
-}
diff --git a/functions/metaboxes/js/select2/release.sh b/functions/metaboxes/js/select2/release.sh
deleted file mode 100755
index 0d2e279..0000000
--- a/functions/metaboxes/js/select2/release.sh
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/bin/bash
-set -e
-
-echo -n "Enter the version for this release: "
-
-read ver
-
-if [ ! $ver ]; then
- echo "Invalid version."
- exit
-fi
-
-name="select2"
-js="$name.js"
-mini="$name.min.js"
-css="$name.css"
-release="$name-$ver"
-tag="$ver"
-branch="build-$ver"
-curbranch=`git branch | grep "*" | sed "s/* //"`
-timestamp=$(date)
-tokens="s/@@ver@@/$ver/g;s/\@@timestamp@@/$timestamp/g"
-remote="github"
-
-echo "Pulling from origin"
-
-git pull
-
-echo "Updating Version Identifiers"
-
-sed -E -e "s/\"version\": \"([0-9\.]+)\",/\"version\": \"$ver\",/g" -i -- bower.json select2.jquery.json component.json composer.json package.json
-
-git add bower.json
-git add select2.jquery.json
-git add component.json
-git add composer.json
-git add package.json
-
-git commit -m "modified version identifiers in descriptors for release $ver"
-git push
-
-git branch "$branch"
-git checkout "$branch"
-
-echo "Tokenizing..."
-
-find . -name "$js" | xargs -I{} sed -e "$tokens" -i -- {}
-find . -name "$css" | xargs -I{} sed -e "$tokens" -i -- {}
-
-sed -e "s/latest/$ver/g" -i -- bower.json
-
-git add "$js"
-git add "$css"
-
-echo "Minifying..."
-
-echo "/*" > "$mini"
-cat LICENSE | sed "$tokens" >> "$mini"
-echo "*/" >> "$mini"
-
-curl -s \
- --data-urlencode "js_code@$js" \
- http://marijnhaverbeke.nl/uglifyjs \
- >> "$mini"
-
-git add "$mini"
-
-git commit -m "release $ver"
-
-echo "Tagging..."
-git tag -a "$tag" -m "tagged version $ver"
-git push "$remote" --tags
-
-echo "Cleaning Up..."
-
-git checkout "$curbranch"
-git branch -D "$branch"
-
-echo "Done"
diff --git a/functions/metaboxes/js/select2/select2-bootstrap.css b/functions/metaboxes/js/select2/select2-bootstrap.css
deleted file mode 100755
index 3b83f0a..0000000
--- a/functions/metaboxes/js/select2/select2-bootstrap.css
+++ /dev/null
@@ -1,87 +0,0 @@
-.form-control .select2-choice {
- border: 0;
- border-radius: 2px;
-}
-
-.form-control .select2-choice .select2-arrow {
- border-radius: 0 2px 2px 0;
-}
-
-.form-control.select2-container {
- height: auto !important;
- padding: 0;
-}
-
-.form-control.select2-container.select2-dropdown-open {
- border-color: #5897FB;
- border-radius: 3px 3px 0 0;
-}
-
-.form-control .select2-container.select2-dropdown-open .select2-choices {
- border-radius: 3px 3px 0 0;
-}
-
-.form-control.select2-container .select2-choices {
- border: 0 !important;
- border-radius: 3px;
-}
-
-.control-group.warning .select2-container .select2-choice,
-.control-group.warning .select2-container .select2-choices,
-.control-group.warning .select2-container-active .select2-choice,
-.control-group.warning .select2-container-active .select2-choices,
-.control-group.warning .select2-dropdown-open.select2-drop-above .select2-choice,
-.control-group.warning .select2-dropdown-open.select2-drop-above .select2-choices,
-.control-group.warning .select2-container-multi.select2-container-active .select2-choices {
- border: 1px solid #C09853 !important;
-}
-
-.control-group.warning .select2-container .select2-choice div {
- border-left: 1px solid #C09853 !important;
- background: #FCF8E3 !important;
-}
-
-.control-group.error .select2-container .select2-choice,
-.control-group.error .select2-container .select2-choices,
-.control-group.error .select2-container-active .select2-choice,
-.control-group.error .select2-container-active .select2-choices,
-.control-group.error .select2-dropdown-open.select2-drop-above .select2-choice,
-.control-group.error .select2-dropdown-open.select2-drop-above .select2-choices,
-.control-group.error .select2-container-multi.select2-container-active .select2-choices {
- border: 1px solid #B94A48 !important;
-}
-
-.control-group.error .select2-container .select2-choice div {
- border-left: 1px solid #B94A48 !important;
- background: #F2DEDE !important;
-}
-
-.control-group.info .select2-container .select2-choice,
-.control-group.info .select2-container .select2-choices,
-.control-group.info .select2-container-active .select2-choice,
-.control-group.info .select2-container-active .select2-choices,
-.control-group.info .select2-dropdown-open.select2-drop-above .select2-choice,
-.control-group.info .select2-dropdown-open.select2-drop-above .select2-choices,
-.control-group.info .select2-container-multi.select2-container-active .select2-choices {
- border: 1px solid #3A87AD !important;
-}
-
-.control-group.info .select2-container .select2-choice div {
- border-left: 1px solid #3A87AD !important;
- background: #D9EDF7 !important;
-}
-
-.control-group.success .select2-container .select2-choice,
-.control-group.success .select2-container .select2-choices,
-.control-group.success .select2-container-active .select2-choice,
-.control-group.success .select2-container-active .select2-choices,
-.control-group.success .select2-dropdown-open.select2-drop-above .select2-choice,
-.control-group.success .select2-dropdown-open.select2-drop-above .select2-choices,
-.control-group.success .select2-container-multi.select2-container-active .select2-choices {
- border: 1px solid #468847 !important;
-}
-
-.control-group.success .select2-container .select2-choice div {
- border-left: 1px solid #468847 !important;
- background: #DFF0D8 !important;
-}
diff --git a/functions/metaboxes/js/select2/select2-spinner.gif b/functions/metaboxes/js/select2/select2-spinner.gif
deleted file mode 100755
index 5b33f7e..0000000
Binary files a/functions/metaboxes/js/select2/select2-spinner.gif and /dev/null differ
diff --git a/functions/metaboxes/js/select2/select2.css b/functions/metaboxes/js/select2/select2.css
deleted file mode 100755
index c88e73e..0000000
--- a/functions/metaboxes/js/select2/select2.css
+++ /dev/null
@@ -1,704 +0,0 @@
-/*
-Version: 3.5.1 Timestamp: Tue Jul 22 18:58:56 EDT 2014
-*/
-.select2-container {
- margin: 0;
- position: relative;
- display: inline-block;
- /* inline-block for ie7 */
- zoom: 1;
- *display: inline;
- vertical-align: middle;
-}
-
-.select2-container,
-.select2-drop,
-.select2-search,
-.select2-search input {
- /*
- Force border-box so that % widths fit the parent
- container without overlap because of margin/padding.
- More Info : http://www.quirksmode.org/css/box.html
- */
- -webkit-box-sizing: border-box; /* webkit */
- -moz-box-sizing: border-box; /* firefox */
- box-sizing: border-box; /* css3 */
-}
-
-.select2-container .select2-choice {
- display: block;
- height: 26px;
- padding: 0 0 0 8px;
- overflow: hidden;
- position: relative;
-
- border: 1px solid #aaa;
- white-space: nowrap;
- line-height: 26px;
- color: #444;
- text-decoration: none;
-
- border-radius: 4px;
-
- background-clip: padding-box;
-
- -webkit-touch-callout: none;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-
- background-color: #fff;
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));
- background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);
- background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);
- background-image: linear-gradient(to top, #eee 0%, #fff 50%);
-}
-
-html[dir="rtl"] .select2-container .select2-choice {
- padding: 0 8px 0 0;
-}
-
-.select2-container.select2-drop-above .select2-choice {
- border-bottom-color: #aaa;
-
- border-radius: 0 0 4px 4px;
-
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff));
- background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 90%);
- background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 90%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);
- background-image: linear-gradient(to bottom, #eee 0%, #fff 90%);
-}
-
-.select2-container.select2-allowclear .select2-choice .select2-chosen {
- margin-right: 42px;
-}
-
-.select2-container .select2-choice > .select2-chosen {
- margin-right: 26px;
- display: block;
- overflow: hidden;
-
- white-space: nowrap;
-
- text-overflow: ellipsis;
- float: none;
- width: auto;
-}
-
-html[dir="rtl"] .select2-container .select2-choice > .select2-chosen {
- margin-left: 26px;
- margin-right: 0;
-}
-
-.select2-container .select2-choice abbr {
- display: none;
- width: 12px;
- height: 12px;
- position: absolute;
- right: 24px;
- top: 8px;
-
- font-size: 1px;
- text-decoration: none;
-
- border: 0;
- background: url('select2.png') right top no-repeat;
- cursor: pointer;
- outline: 0;
-}
-
-.select2-container.select2-allowclear .select2-choice abbr {
- display: inline-block;
-}
-
-.select2-container .select2-choice abbr:hover {
- background-position: right -11px;
- cursor: pointer;
-}
-
-.select2-drop-mask {
- border: 0;
- margin: 0;
- padding: 0;
- position: fixed;
- left: 0;
- top: 0;
- min-height: 100%;
- min-width: 100%;
- height: auto;
- width: auto;
- opacity: 0;
- z-index: 9998;
- /* styles required for IE to work */
- background-color: #fff;
- filter: alpha(opacity=0);
-}
-
-.select2-drop {
- width: 100%;
- margin-top: -1px;
- position: absolute;
- z-index: 9999;
- top: 100%;
-
- background: #fff;
- color: #000;
- border: 1px solid #aaa;
- border-top: 0;
-
- border-radius: 0 0 4px 4px;
-
- -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
- box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
-}
-
-.select2-drop.select2-drop-above {
- margin-top: 1px;
- border-top: 1px solid #aaa;
- border-bottom: 0;
-
- border-radius: 4px 4px 0 0;
-
- -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
- box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
-}
-
-.select2-drop-active {
- border: 1px solid #5897fb;
- border-top: none;
-}
-
-.select2-drop.select2-drop-above.select2-drop-active {
- border-top: 1px solid #5897fb;
-}
-
-.select2-drop-auto-width {
- border-top: 1px solid #aaa;
- width: auto;
-}
-
-.select2-drop-auto-width .select2-search {
- padding-top: 4px;
-}
-
-.select2-container .select2-choice .select2-arrow {
- display: inline-block;
- width: 18px;
- height: 100%;
- position: absolute;
- right: 0;
- top: 0;
-
- border-left: 1px solid #aaa;
- border-radius: 0 4px 4px 0;
-
- background-clip: padding-box;
-
- background: #ccc;
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
- background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
- background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0);
- background-image: linear-gradient(to top, #ccc 0%, #eee 60%);
-}
-
-html[dir="rtl"] .select2-container .select2-choice .select2-arrow {
- left: 0;
- right: auto;
-
- border-left: none;
- border-right: 1px solid #aaa;
- border-radius: 4px 0 0 4px;
-}
-
-.select2-container .select2-choice .select2-arrow b {
- display: block;
- width: 100%;
- height: 100%;
- background: url('select2.png') no-repeat 0 1px;
-}
-
-html[dir="rtl"] .select2-container .select2-choice .select2-arrow b {
- background-position: 2px 1px;
-}
-
-.select2-search {
- display: inline-block;
- width: 100%;
- min-height: 26px;
- margin: 0;
- padding-left: 4px;
- padding-right: 4px;
-
- position: relative;
- z-index: 10000;
-
- white-space: nowrap;
-}
-
-.select2-search input {
- width: 100%;
- height: auto !important;
- min-height: 26px;
- padding: 4px 20px 4px 5px;
- margin: 0;
-
- outline: 0;
- font-family: sans-serif;
- font-size: 1em;
-
- border: 1px solid #aaa;
- border-radius: 0;
-
- -webkit-box-shadow: none;
- box-shadow: none;
-
- background: #fff url('select2.png') no-repeat 100% -22px;
- background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
- background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
- background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
- background: url('select2.png') no-repeat 100% -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
-}
-
-html[dir="rtl"] .select2-search input {
- padding: 4px 5px 4px 20px;
-
- background: #fff url('select2.png') no-repeat -37px -22px;
- background: url('select2.png') no-repeat -37px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
- background: url('select2.png') no-repeat -37px -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
- background: url('select2.png') no-repeat -37px -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
- background: url('select2.png') no-repeat -37px -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
-}
-
-.select2-drop.select2-drop-above .select2-search input {
- margin-top: 4px;
-}
-
-.select2-search input.select2-active {
- background: #fff url('select2-spinner.gif') no-repeat 100%;
- background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
- background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
- background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
- background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
-}
-
-.select2-container-active .select2-choice,
-.select2-container-active .select2-choices {
- border: 1px solid #5897fb;
- outline: none;
-
- -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
- box-shadow: 0 0 5px rgba(0, 0, 0, .3);
-}
-
-.select2-dropdown-open .select2-choice {
- border-bottom-color: transparent;
- -webkit-box-shadow: 0 1px 0 #fff inset;
- box-shadow: 0 1px 0 #fff inset;
-
- border-bottom-left-radius: 0;
- border-bottom-right-radius: 0;
-
- background-color: #eee;
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee));
- background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%);
- background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
- background-image: linear-gradient(to top, #fff 0%, #eee 50%);
-}
-
-.select2-dropdown-open.select2-drop-above .select2-choice,
-.select2-dropdown-open.select2-drop-above .select2-choices {
- border: 1px solid #5897fb;
- border-top-color: transparent;
-
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee));
- background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%);
- background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
- background-image: linear-gradient(to bottom, #fff 0%, #eee 50%);
-}
-
-.select2-dropdown-open .select2-choice .select2-arrow {
- background: transparent;
- border-left: none;
- filter: none;
-}
-html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow {
- border-right: none;
-}
-
-.select2-dropdown-open .select2-choice .select2-arrow b {
- background-position: -18px 1px;
-}
-
-html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow b {
- background-position: -16px 1px;
-}
-
-.select2-hidden-accessible {
- border: 0;
- clip: rect(0 0 0 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
-}
-
-/* results */
-.select2-results {
- max-height: 200px;
- padding: 0 0 0 4px;
- margin: 4px 4px 4px 0;
- position: relative;
- overflow-x: hidden;
- overflow-y: auto;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-}
-
-html[dir="rtl"] .select2-results {
- padding: 0 4px 0 0;
- margin: 4px 0 4px 4px;
-}
-
-.select2-results ul.select2-result-sub {
- margin: 0;
- padding-left: 0;
-}
-
-.select2-results li {
- list-style: none;
- display: list-item;
- background-image: none;
-}
-
-.select2-results li.select2-result-with-children > .select2-result-label {
- font-weight: bold;
-}
-
-.select2-results .select2-result-label {
- padding: 3px 7px 4px;
- margin: 0;
- cursor: pointer;
-
- min-height: 1em;
-
- -webkit-touch-callout: none;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-}
-
-.select2-results-dept-1 .select2-result-label { padding-left: 20px }
-.select2-results-dept-2 .select2-result-label { padding-left: 40px }
-.select2-results-dept-3 .select2-result-label { padding-left: 60px }
-.select2-results-dept-4 .select2-result-label { padding-left: 80px }
-.select2-results-dept-5 .select2-result-label { padding-left: 100px }
-.select2-results-dept-6 .select2-result-label { padding-left: 110px }
-.select2-results-dept-7 .select2-result-label { padding-left: 120px }
-
-.select2-results .select2-highlighted {
- background: #3875d7;
- color: #fff;
-}
-
-.select2-results li em {
- background: #feffde;
- font-style: normal;
-}
-
-.select2-results .select2-highlighted em {
- background: transparent;
-}
-
-.select2-results .select2-highlighted ul {
- background: #fff;
- color: #000;
-}
-
-.select2-results .select2-no-results,
-.select2-results .select2-searching,
-.select2-results .select2-ajax-error,
-.select2-results .select2-selection-limit {
- background: #f4f4f4;
- display: list-item;
- padding-left: 5px;
-}
-
-/*
-disabled look for disabled choices in the results dropdown
-*/
-.select2-results .select2-disabled.select2-highlighted {
- color: #666;
- background: #f4f4f4;
- display: list-item;
- cursor: default;
-}
-.select2-results .select2-disabled {
- background: #f4f4f4;
- display: list-item;
- cursor: default;
-}
-
-.select2-results .select2-selected {
- display: none;
-}
-
-.select2-more-results.select2-active {
- background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%;
-}
-
-.select2-results .select2-ajax-error {
- background: rgba(255, 50, 50, .2);
-}
-
-.select2-more-results {
- background: #f4f4f4;
- display: list-item;
-}
-
-/* disabled styles */
-
-.select2-container.select2-container-disabled .select2-choice {
- background-color: #f4f4f4;
- background-image: none;
- border: 1px solid #ddd;
- cursor: default;
-}
-
-.select2-container.select2-container-disabled .select2-choice .select2-arrow {
- background-color: #f4f4f4;
- background-image: none;
- border-left: 0;
-}
-
-.select2-container.select2-container-disabled .select2-choice abbr {
- display: none;
-}
-
-
-/* multiselect */
-
-.select2-container-multi .select2-choices {
- height: auto !important;
- height: 1%;
- margin: 0;
- padding: 0 5px 0 0;
- position: relative;
-
- border: 1px solid #aaa;
- cursor: text;
- overflow: hidden;
-
- background-color: #fff;
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff));
- background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%);
- background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%);
- background-image: linear-gradient(to bottom, #eee 1%, #fff 15%);
-}
-
-html[dir="rtl"] .select2-container-multi .select2-choices {
- padding: 0 0 0 5px;
-}
-
-.select2-locked {
- padding: 3px 5px 3px 5px !important;
-}
-
-.select2-container-multi .select2-choices {
- min-height: 26px;
-}
-
-.select2-container-multi.select2-container-active .select2-choices {
- border: 1px solid #5897fb;
- outline: none;
-
- -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
- box-shadow: 0 0 5px rgba(0, 0, 0, .3);
-}
-.select2-container-multi .select2-choices li {
- float: left;
- list-style: none;
-}
-html[dir="rtl"] .select2-container-multi .select2-choices li
-{
- float: right;
-}
-.select2-container-multi .select2-choices .select2-search-field {
- margin: 0;
- padding: 0;
- white-space: nowrap;
-}
-
-.select2-container-multi .select2-choices .select2-search-field input {
- padding: 5px;
- margin: 1px 0;
-
- font-family: sans-serif;
- font-size: 100%;
- color: #666;
- outline: 0;
- border: 0;
- -webkit-box-shadow: none;
- box-shadow: none;
- background: transparent !important;
-}
-
-.select2-container-multi .select2-choices .select2-search-field input.select2-active {
- background: #fff url('select2-spinner.gif') no-repeat 100% !important;
-}
-
-.select2-default {
- color: #999 !important;
-}
-
-.select2-container-multi .select2-choices .select2-search-choice {
- padding: 3px 5px 3px 18px;
- margin: 3px 0 3px 5px;
- position: relative;
-
- line-height: 13px;
- color: #333;
- cursor: default;
- border: 1px solid #aaaaaa;
-
- border-radius: 3px;
-
- -webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
- box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
-
- background-clip: padding-box;
-
- -webkit-touch-callout: none;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-
- background-color: #e4e4e4;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0);
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee));
- background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
- background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
- background-image: linear-gradient(to top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
-}
-html[dir="rtl"] .select2-container-multi .select2-choices .select2-search-choice
-{
- margin: 3px 5px 3px 0;
- padding: 3px 18px 3px 5px;
-}
-.select2-container-multi .select2-choices .select2-search-choice .select2-chosen {
- cursor: default;
-}
-.select2-container-multi .select2-choices .select2-search-choice-focus {
- background: #d4d4d4;
-}
-
-.select2-search-choice-close {
- display: block;
- width: 12px;
- height: 13px;
- position: absolute;
- right: 3px;
- top: 4px;
-
- font-size: 1px;
- outline: none;
- background: url('select2.png') right top no-repeat;
-}
-html[dir="rtl"] .select2-search-choice-close {
- right: auto;
- left: 3px;
-}
-
-.select2-container-multi .select2-search-choice-close {
- left: 3px;
-}
-
-html[dir="rtl"] .select2-container-multi .select2-search-choice-close {
- left: auto;
- right: 2px;
-}
-
-.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {
- background-position: right -11px;
-}
-.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {
- background-position: right -11px;
-}
-
-/* disabled styles */
-.select2-container-multi.select2-container-disabled .select2-choices {
- background-color: #f4f4f4;
- background-image: none;
- border: 1px solid #ddd;
- cursor: default;
-}
-
-.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {
- padding: 3px 5px 3px 5px;
- border: 1px solid #ddd;
- background-image: none;
- background-color: #f4f4f4;
-}
-
-.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close { display: none;
- background: none;
-}
-/* end multiselect */
-
-
-.select2-result-selectable .select2-match,
-.select2-result-unselectable .select2-match {
- text-decoration: underline;
-}
-
-.select2-offscreen, .select2-offscreen:focus {
- clip: rect(0 0 0 0) !important;
- width: 1px !important;
- height: 1px !important;
- border: 0 !important;
- margin: 0 !important;
- padding: 0 !important;
- overflow: hidden !important;
- position: absolute !important;
- outline: 0 !important;
- left: 0px !important;
- top: 0px !important;
-}
-
-.select2-display-none {
- display: none;
-}
-
-.select2-measure-scrollbar {
- position: absolute;
- top: -10000px;
- left: -10000px;
- width: 100px;
- height: 100px;
- overflow: scroll;
-}
-
-/* Retina-ize icons */
-
-@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 2dppx) {
- .select2-search input,
- .select2-search-choice-close,
- .select2-container .select2-choice abbr,
- .select2-container .select2-choice .select2-arrow b {
- background-image: url('select2x2.png') !important;
- background-repeat: no-repeat !important;
- background-size: 60px 40px !important;
- }
-
- .select2-search input {
- background-position: 100% -21px !important;
- }
-}
diff --git a/functions/metaboxes/js/select2/select2.jquery.json b/functions/metaboxes/js/select2/select2.jquery.json
deleted file mode 100755
index 469c4aa..0000000
--- a/functions/metaboxes/js/select2/select2.jquery.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "name": "select2",
- "title": "Select2",
- "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
- "keywords": [
- "select",
- "autocomplete",
- "typeahead",
- "dropdown",
- "multiselect",
- "tag",
- "tagging"
- ],
- "version": "3.5.1",
- "author": {
- "name": "Igor Vaynberg",
- "url": "https://github.com/ivaynberg"
- },
- "licenses": [
- {
- "type": "Apache",
- "url": "http://www.apache.org/licenses/LICENSE-2.0"
- },
- {
- "type": "GPL v2",
- "url": "http://www.gnu.org/licenses/gpl-2.0.html"
- }
- ],
- "bugs": "https://github.com/ivaynberg/select2/issues",
- "homepage": "http://ivaynberg.github.com/select2",
- "docs": "http://ivaynberg.github.com/select2/",
- "download": "https://github.com/ivaynberg/select2/tags",
- "dependencies": {
- "jquery": ">=1.7.1"
- }
-}
diff --git a/functions/metaboxes/js/select2/select2.js b/functions/metaboxes/js/select2/select2.js
deleted file mode 100755
index 7116cd7..0000000
--- a/functions/metaboxes/js/select2/select2.js
+++ /dev/null
@@ -1,3508 +0,0 @@
-/*
-Copyright 2012 Igor Vaynberg
-
-Version: 3.5.1 Timestamp: Tue Jul 22 18:58:56 EDT 2014
-
-This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
-General Public License version 2 (the "GPL License"). You may choose either license to govern your
-use of this software only upon the condition that you accept all of the terms of either the Apache
-License or the GPL License.
-
-You may obtain a copy of the Apache License and the GPL License at:
-
- http://www.apache.org/licenses/LICENSE-2.0
- http://www.gnu.org/licenses/gpl-2.0.html
-
-Unless required by applicable law or agreed to in writing, software distributed under the
-Apache License or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
-CONDITIONS OF ANY KIND, either express or implied. See the Apache License and the GPL License for
-the specific language governing permissions and limitations under the Apache License and the GPL License.
-*/
-(function ($) {
- if(typeof $.fn.each2 == "undefined") {
- $.extend($.fn, {
- /*
- * 4-10 times faster .each replacement
- * use it carefully, as it overrides jQuery context of element on each iteration
- */
- each2 : function (c) {
- var j = $([0]), i = -1, l = this.length;
- while (
- ++i < l
- && (j.context = j[0] = this[i])
- && c.call(j[0], i, j) !== false //"this"=DOM, i=index, j=jQuery object
- );
- return this;
- }
- });
- }
-})(jQuery);
-
-(function ($, undefined) {
- "use strict";
- /*global document, window, jQuery, console */
-
- if (window.Select2 !== undefined) {
- return;
- }
-
- var KEY, AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer,
- lastMousePosition={x:0,y:0}, $document, scrollBarDimensions,
-
- KEY = {
- TAB: 9,
- ENTER: 13,
- ESC: 27,
- SPACE: 32,
- LEFT: 37,
- UP: 38,
- RIGHT: 39,
- DOWN: 40,
- SHIFT: 16,
- CTRL: 17,
- ALT: 18,
- PAGE_UP: 33,
- PAGE_DOWN: 34,
- HOME: 36,
- END: 35,
- BACKSPACE: 8,
- DELETE: 46,
- isArrow: function (k) {
- k = k.which ? k.which : k;
- switch (k) {
- case KEY.LEFT:
- case KEY.RIGHT:
- case KEY.UP:
- case KEY.DOWN:
- return true;
- }
- return false;
- },
- isControl: function (e) {
- var k = e.which;
- switch (k) {
- case KEY.SHIFT:
- case KEY.CTRL:
- case KEY.ALT:
- return true;
- }
-
- if (e.metaKey) return true;
-
- return false;
- },
- isFunctionKey: function (k) {
- k = k.which ? k.which : k;
- return k >= 112 && k <= 123;
- }
- },
- MEASURE_SCROLLBAR_TEMPLATE = "
",
-
- DIACRITICS = {"\u24B6":"A","\uFF21":"A","\u00C0":"A","\u00C1":"A","\u00C2":"A","\u1EA6":"A","\u1EA4":"A","\u1EAA":"A","\u1EA8":"A","\u00C3":"A","\u0100":"A","\u0102":"A","\u1EB0":"A","\u1EAE":"A","\u1EB4":"A","\u1EB2":"A","\u0226":"A","\u01E0":"A","\u00C4":"A","\u01DE":"A","\u1EA2":"A","\u00C5":"A","\u01FA":"A","\u01CD":"A","\u0200":"A","\u0202":"A","\u1EA0":"A","\u1EAC":"A","\u1EB6":"A","\u1E00":"A","\u0104":"A","\u023A":"A","\u2C6F":"A","\uA732":"AA","\u00C6":"AE","\u01FC":"AE","\u01E2":"AE","\uA734":"AO","\uA736":"AU","\uA738":"AV","\uA73A":"AV","\uA73C":"AY","\u24B7":"B","\uFF22":"B","\u1E02":"B","\u1E04":"B","\u1E06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24B8":"C","\uFF23":"C","\u0106":"C","\u0108":"C","\u010A":"C","\u010C":"C","\u00C7":"C","\u1E08":"C","\u0187":"C","\u023B":"C","\uA73E":"C","\u24B9":"D","\uFF24":"D","\u1E0A":"D","\u010E":"D","\u1E0C":"D","\u1E10":"D","\u1E12":"D","\u1E0E":"D","\u0110":"D","\u018B":"D","\u018A":"D","\u0189":"D","\uA779":"D","\u01F1":"DZ","\u01C4":"DZ","\u01F2":"Dz","\u01C5":"Dz","\u24BA":"E","\uFF25":"E","\u00C8":"E","\u00C9":"E","\u00CA":"E","\u1EC0":"E","\u1EBE":"E","\u1EC4":"E","\u1EC2":"E","\u1EBC":"E","\u0112":"E","\u1E14":"E","\u1E16":"E","\u0114":"E","\u0116":"E","\u00CB":"E","\u1EBA":"E","\u011A":"E","\u0204":"E","\u0206":"E","\u1EB8":"E","\u1EC6":"E","\u0228":"E","\u1E1C":"E","\u0118":"E","\u1E18":"E","\u1E1A":"E","\u0190":"E","\u018E":"E","\u24BB":"F","\uFF26":"F","\u1E1E":"F","\u0191":"F","\uA77B":"F","\u24BC":"G","\uFF27":"G","\u01F4":"G","\u011C":"G","\u1E20":"G","\u011E":"G","\u0120":"G","\u01E6":"G","\u0122":"G","\u01E4":"G","\u0193":"G","\uA7A0":"G","\uA77D":"G","\uA77E":"G","\u24BD":"H","\uFF28":"H","\u0124":"H","\u1E22":"H","\u1E26":"H","\u021E":"H","\u1E24":"H","\u1E28":"H","\u1E2A":"H","\u0126":"H","\u2C67":"H","\u2C75":"H","\uA78D":"H","\u24BE":"I","\uFF29":"I","\u00CC":"I","\u00CD":"I","\u00CE":"I","\u0128":"I","\u012A":"I","\u012C":"I","\u0130":"I","\u00CF":"I","\u1E2E":"I","\u1EC8":"I","\u01CF":"I","\u0208":"I","\u020A":"I","\u1ECA":"I","\u012E":"I","\u1E2C":"I","\u0197":"I","\u24BF":"J","\uFF2A":"J","\u0134":"J","\u0248":"J","\u24C0":"K","\uFF2B":"K","\u1E30":"K","\u01E8":"K","\u1E32":"K","\u0136":"K","\u1E34":"K","\u0198":"K","\u2C69":"K","\uA740":"K","\uA742":"K","\uA744":"K","\uA7A2":"K","\u24C1":"L","\uFF2C":"L","\u013F":"L","\u0139":"L","\u013D":"L","\u1E36":"L","\u1E38":"L","\u013B":"L","\u1E3C":"L","\u1E3A":"L","\u0141":"L","\u023D":"L","\u2C62":"L","\u2C60":"L","\uA748":"L","\uA746":"L","\uA780":"L","\u01C7":"LJ","\u01C8":"Lj","\u24C2":"M","\uFF2D":"M","\u1E3E":"M","\u1E40":"M","\u1E42":"M","\u2C6E":"M","\u019C":"M","\u24C3":"N","\uFF2E":"N","\u01F8":"N","\u0143":"N","\u00D1":"N","\u1E44":"N","\u0147":"N","\u1E46":"N","\u0145":"N","\u1E4A":"N","\u1E48":"N","\u0220":"N","\u019D":"N","\uA790":"N","\uA7A4":"N","\u01CA":"NJ","\u01CB":"Nj","\u24C4":"O","\uFF2F":"O","\u00D2":"O","\u00D3":"O","\u00D4":"O","\u1ED2":"O","\u1ED0":"O","\u1ED6":"O","\u1ED4":"O","\u00D5":"O","\u1E4C":"O","\u022C":"O","\u1E4E":"O","\u014C":"O","\u1E50":"O","\u1E52":"O","\u014E":"O","\u022E":"O","\u0230":"O","\u00D6":"O","\u022A":"O","\u1ECE":"O","\u0150":"O","\u01D1":"O","\u020C":"O","\u020E":"O","\u01A0":"O","\u1EDC":"O","\u1EDA":"O","\u1EE0":"O","\u1EDE":"O","\u1EE2":"O","\u1ECC":"O","\u1ED8":"O","\u01EA":"O","\u01EC":"O","\u00D8":"O","\u01FE":"O","\u0186":"O","\u019F":"O","\uA74A":"O","\uA74C":"O","\u01A2":"OI","\uA74E":"OO","\u0222":"OU","\u24C5":"P","\uFF30":"P","\u1E54":"P","\u1E56":"P","\u01A4":"P","\u2C63":"P","\uA750":"P","\uA752":"P","\uA754":"P","\u24C6":"Q","\uFF31":"Q","\uA756":"Q","\uA758":"Q","\u024A":"Q","\u24C7":"R","\uFF32":"R","\u0154":"R","\u1E58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1E5A":"R","\u1E5C":"R","\u0156":"R","\u1E5E":"R","\u024C":"R","\u2C64":"R","\uA75A":"R","\uA7A6":"R","\uA782":"R","\u24C8":"S","\uFF33":"S","\u1E9E":"S","\u015A":"S","\u1E64":"S","\u015C":"S","\u1E60":"S","\u0160":"S","\u1E66":"S","\u1E62":"S","\u1E68":"S","\u0218":"S","\u015E":"S","\u2C7E":"S","\uA7A8":"S","\uA784":"S","\u24C9":"T","\uFF34":"T","\u1E6A":"T","\u0164":"T","\u1E6C":"T","\u021A":"T","\u0162":"T","\u1E70":"T","\u1E6E":"T","\u0166":"T","\u01AC":"T","\u01AE":"T","\u023E":"T","\uA786":"T","\uA728":"TZ","\u24CA":"U","\uFF35":"U","\u00D9":"U","\u00DA":"U","\u00DB":"U","\u0168":"U","\u1E78":"U","\u016A":"U","\u1E7A":"U","\u016C":"U","\u00DC":"U","\u01DB":"U","\u01D7":"U","\u01D5":"U","\u01D9":"U","\u1EE6":"U","\u016E":"U","\u0170":"U","\u01D3":"U","\u0214":"U","\u0216":"U","\u01AF":"U","\u1EEA":"U","\u1EE8":"U","\u1EEE":"U","\u1EEC":"U","\u1EF0":"U","\u1EE4":"U","\u1E72":"U","\u0172":"U","\u1E76":"U","\u1E74":"U","\u0244":"U","\u24CB":"V","\uFF36":"V","\u1E7C":"V","\u1E7E":"V","\u01B2":"V","\uA75E":"V","\u0245":"V","\uA760":"VY","\u24CC":"W","\uFF37":"W","\u1E80":"W","\u1E82":"W","\u0174":"W","\u1E86":"W","\u1E84":"W","\u1E88":"W","\u2C72":"W","\u24CD":"X","\uFF38":"X","\u1E8A":"X","\u1E8C":"X","\u24CE":"Y","\uFF39":"Y","\u1EF2":"Y","\u00DD":"Y","\u0176":"Y","\u1EF8":"Y","\u0232":"Y","\u1E8E":"Y","\u0178":"Y","\u1EF6":"Y","\u1EF4":"Y","\u01B3":"Y","\u024E":"Y","\u1EFE":"Y","\u24CF":"Z","\uFF3A":"Z","\u0179":"Z","\u1E90":"Z","\u017B":"Z","\u017D":"Z","\u1E92":"Z","\u1E94":"Z","\u01B5":"Z","\u0224":"Z","\u2C7F":"Z","\u2C6B":"Z","\uA762":"Z","\u24D0":"a","\uFF41":"a","\u1E9A":"a","\u00E0":"a","\u00E1":"a","\u00E2":"a","\u1EA7":"a","\u1EA5":"a","\u1EAB":"a","\u1EA9":"a","\u00E3":"a","\u0101":"a","\u0103":"a","\u1EB1":"a","\u1EAF":"a","\u1EB5":"a","\u1EB3":"a","\u0227":"a","\u01E1":"a","\u00E4":"a","\u01DF":"a","\u1EA3":"a","\u00E5":"a","\u01FB":"a","\u01CE":"a","\u0201":"a","\u0203":"a","\u1EA1":"a","\u1EAD":"a","\u1EB7":"a","\u1E01":"a","\u0105":"a","\u2C65":"a","\u0250":"a","\uA733":"aa","\u00E6":"ae","\u01FD":"ae","\u01E3":"ae","\uA735":"ao","\uA737":"au","\uA739":"av","\uA73B":"av","\uA73D":"ay","\u24D1":"b","\uFF42":"b","\u1E03":"b","\u1E05":"b","\u1E07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24D2":"c","\uFF43":"c","\u0107":"c","\u0109":"c","\u010B":"c","\u010D":"c","\u00E7":"c","\u1E09":"c","\u0188":"c","\u023C":"c","\uA73F":"c","\u2184":"c","\u24D3":"d","\uFF44":"d","\u1E0B":"d","\u010F":"d","\u1E0D":"d","\u1E11":"d","\u1E13":"d","\u1E0F":"d","\u0111":"d","\u018C":"d","\u0256":"d","\u0257":"d","\uA77A":"d","\u01F3":"dz","\u01C6":"dz","\u24D4":"e","\uFF45":"e","\u00E8":"e","\u00E9":"e","\u00EA":"e","\u1EC1":"e","\u1EBF":"e","\u1EC5":"e","\u1EC3":"e","\u1EBD":"e","\u0113":"e","\u1E15":"e","\u1E17":"e","\u0115":"e","\u0117":"e","\u00EB":"e","\u1EBB":"e","\u011B":"e","\u0205":"e","\u0207":"e","\u1EB9":"e","\u1EC7":"e","\u0229":"e","\u1E1D":"e","\u0119":"e","\u1E19":"e","\u1E1B":"e","\u0247":"e","\u025B":"e","\u01DD":"e","\u24D5":"f","\uFF46":"f","\u1E1F":"f","\u0192":"f","\uA77C":"f","\u24D6":"g","\uFF47":"g","\u01F5":"g","\u011D":"g","\u1E21":"g","\u011F":"g","\u0121":"g","\u01E7":"g","\u0123":"g","\u01E5":"g","\u0260":"g","\uA7A1":"g","\u1D79":"g","\uA77F":"g","\u24D7":"h","\uFF48":"h","\u0125":"h","\u1E23":"h","\u1E27":"h","\u021F":"h","\u1E25":"h","\u1E29":"h","\u1E2B":"h","\u1E96":"h","\u0127":"h","\u2C68":"h","\u2C76":"h","\u0265":"h","\u0195":"hv","\u24D8":"i","\uFF49":"i","\u00EC":"i","\u00ED":"i","\u00EE":"i","\u0129":"i","\u012B":"i","\u012D":"i","\u00EF":"i","\u1E2F":"i","\u1EC9":"i","\u01D0":"i","\u0209":"i","\u020B":"i","\u1ECB":"i","\u012F":"i","\u1E2D":"i","\u0268":"i","\u0131":"i","\u24D9":"j","\uFF4A":"j","\u0135":"j","\u01F0":"j","\u0249":"j","\u24DA":"k","\uFF4B":"k","\u1E31":"k","\u01E9":"k","\u1E33":"k","\u0137":"k","\u1E35":"k","\u0199":"k","\u2C6A":"k","\uA741":"k","\uA743":"k","\uA745":"k","\uA7A3":"k","\u24DB":"l","\uFF4C":"l","\u0140":"l","\u013A":"l","\u013E":"l","\u1E37":"l","\u1E39":"l","\u013C":"l","\u1E3D":"l","\u1E3B":"l","\u017F":"l","\u0142":"l","\u019A":"l","\u026B":"l","\u2C61":"l","\uA749":"l","\uA781":"l","\uA747":"l","\u01C9":"lj","\u24DC":"m","\uFF4D":"m","\u1E3F":"m","\u1E41":"m","\u1E43":"m","\u0271":"m","\u026F":"m","\u24DD":"n","\uFF4E":"n","\u01F9":"n","\u0144":"n","\u00F1":"n","\u1E45":"n","\u0148":"n","\u1E47":"n","\u0146":"n","\u1E4B":"n","\u1E49":"n","\u019E":"n","\u0272":"n","\u0149":"n","\uA791":"n","\uA7A5":"n","\u01CC":"nj","\u24DE":"o","\uFF4F":"o","\u00F2":"o","\u00F3":"o","\u00F4":"o","\u1ED3":"o","\u1ED1":"o","\u1ED7":"o","\u1ED5":"o","\u00F5":"o","\u1E4D":"o","\u022D":"o","\u1E4F":"o","\u014D":"o","\u1E51":"o","\u1E53":"o","\u014F":"o","\u022F":"o","\u0231":"o","\u00F6":"o","\u022B":"o","\u1ECF":"o","\u0151":"o","\u01D2":"o","\u020D":"o","\u020F":"o","\u01A1":"o","\u1EDD":"o","\u1EDB":"o","\u1EE1":"o","\u1EDF":"o","\u1EE3":"o","\u1ECD":"o","\u1ED9":"o","\u01EB":"o","\u01ED":"o","\u00F8":"o","\u01FF":"o","\u0254":"o","\uA74B":"o","\uA74D":"o","\u0275":"o","\u01A3":"oi","\u0223":"ou","\uA74F":"oo","\u24DF":"p","\uFF50":"p","\u1E55":"p","\u1E57":"p","\u01A5":"p","\u1D7D":"p","\uA751":"p","\uA753":"p","\uA755":"p","\u24E0":"q","\uFF51":"q","\u024B":"q","\uA757":"q","\uA759":"q","\u24E1":"r","\uFF52":"r","\u0155":"r","\u1E59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1E5B":"r","\u1E5D":"r","\u0157":"r","\u1E5F":"r","\u024D":"r","\u027D":"r","\uA75B":"r","\uA7A7":"r","\uA783":"r","\u24E2":"s","\uFF53":"s","\u00DF":"s","\u015B":"s","\u1E65":"s","\u015D":"s","\u1E61":"s","\u0161":"s","\u1E67":"s","\u1E63":"s","\u1E69":"s","\u0219":"s","\u015F":"s","\u023F":"s","\uA7A9":"s","\uA785":"s","\u1E9B":"s","\u24E3":"t","\uFF54":"t","\u1E6B":"t","\u1E97":"t","\u0165":"t","\u1E6D":"t","\u021B":"t","\u0163":"t","\u1E71":"t","\u1E6F":"t","\u0167":"t","\u01AD":"t","\u0288":"t","\u2C66":"t","\uA787":"t","\uA729":"tz","\u24E4":"u","\uFF55":"u","\u00F9":"u","\u00FA":"u","\u00FB":"u","\u0169":"u","\u1E79":"u","\u016B":"u","\u1E7B":"u","\u016D":"u","\u00FC":"u","\u01DC":"u","\u01D8":"u","\u01D6":"u","\u01DA":"u","\u1EE7":"u","\u016F":"u","\u0171":"u","\u01D4":"u","\u0215":"u","\u0217":"u","\u01B0":"u","\u1EEB":"u","\u1EE9":"u","\u1EEF":"u","\u1EED":"u","\u1EF1":"u","\u1EE5":"u","\u1E73":"u","\u0173":"u","\u1E77":"u","\u1E75":"u","\u0289":"u","\u24E5":"v","\uFF56":"v","\u1E7D":"v","\u1E7F":"v","\u028B":"v","\uA75F":"v","\u028C":"v","\uA761":"vy","\u24E6":"w","\uFF57":"w","\u1E81":"w","\u1E83":"w","\u0175":"w","\u1E87":"w","\u1E85":"w","\u1E98":"w","\u1E89":"w","\u2C73":"w","\u24E7":"x","\uFF58":"x","\u1E8B":"x","\u1E8D":"x","\u24E8":"y","\uFF59":"y","\u1EF3":"y","\u00FD":"y","\u0177":"y","\u1EF9":"y","\u0233":"y","\u1E8F":"y","\u00FF":"y","\u1EF7":"y","\u1E99":"y","\u1EF5":"y","\u01B4":"y","\u024F":"y","\u1EFF":"y","\u24E9":"z","\uFF5A":"z","\u017A":"z","\u1E91":"z","\u017C":"z","\u017E":"z","\u1E93":"z","\u1E95":"z","\u01B6":"z","\u0225":"z","\u0240":"z","\u2C6C":"z","\uA763":"z","\u0386":"\u0391","\u0388":"\u0395","\u0389":"\u0397","\u038A":"\u0399","\u03AA":"\u0399","\u038C":"\u039F","\u038E":"\u03A5","\u03AB":"\u03A5","\u038F":"\u03A9","\u03AC":"\u03B1","\u03AD":"\u03B5","\u03AE":"\u03B7","\u03AF":"\u03B9","\u03CA":"\u03B9","\u0390":"\u03B9","\u03CC":"\u03BF","\u03CD":"\u03C5","\u03CB":"\u03C5","\u03B0":"\u03C5","\u03C9":"\u03C9","\u03C2":"\u03C3"};
-
- $document = $(document);
-
- nextUid=(function() { var counter=1; return function() { return counter++; }; }());
-
-
- function reinsertElement(element) {
- var placeholder = $(document.createTextNode(''));
-
- element.before(placeholder);
- placeholder.before(element);
- placeholder.remove();
- }
-
- function stripDiacritics(str) {
- // Used 'uni range + named function' from http://jsperf.com/diacritics/18
- function match(a) {
- return DIACRITICS[a] || a;
- }
-
- return str.replace(/[^\u0000-\u007E]/g, match);
- }
-
- function indexOf(value, array) {
- var i = 0, l = array.length;
- for (; i < l; i = i + 1) {
- if (equal(value, array[i])) return i;
- }
- return -1;
- }
-
- function measureScrollbar () {
- var $template = $( MEASURE_SCROLLBAR_TEMPLATE );
- $template.appendTo('body');
-
- var dim = {
- width: $template.width() - $template[0].clientWidth,
- height: $template.height() - $template[0].clientHeight
- };
- $template.remove();
-
- return dim;
- }
-
- /**
- * Compares equality of a and b
- * @param a
- * @param b
- */
- function equal(a, b) {
- if (a === b) return true;
- if (a === undefined || b === undefined) return false;
- if (a === null || b === null) return false;
- // Check whether 'a' or 'b' is a string (primitive or object).
- // The concatenation of an empty string (+'') converts its argument to a string's primitive.
- if (a.constructor === String) return a+'' === b+''; // a+'' - in case 'a' is a String object
- if (b.constructor === String) return b+'' === a+''; // b+'' - in case 'b' is a String object
- return false;
- }
-
- /**
- * Splits the string into an array of values, trimming each value. An empty array is returned for nulls or empty
- * strings
- * @param string
- * @param separator
- */
- function splitVal(string, separator) {
- var val, i, l;
- if (string === null || string.length < 1) return [];
- val = string.split(separator);
- for (i = 0, l = val.length; i < l; i = i + 1) val[i] = $.trim(val[i]);
- return val;
- }
-
- function getSideBorderPadding(element) {
- return element.outerWidth(false) - element.width();
- }
-
- function installKeyUpChangeEvent(element) {
- var key="keyup-change-value";
- element.on("keydown", function () {
- if ($.data(element, key) === undefined) {
- $.data(element, key, element.val());
- }
- });
- element.on("keyup", function () {
- var val= $.data(element, key);
- if (val !== undefined && element.val() !== val) {
- $.removeData(element, key);
- element.trigger("keyup-change");
- }
- });
- }
-
-
- /**
- * filters mouse events so an event is fired only if the mouse moved.
- *
- * filters out mouse events that occur when mouse is stationary but
- * the elements under the pointer are scrolled.
- */
- function installFilteredMouseMove(element) {
- element.on("mousemove", function (e) {
- var lastpos = lastMousePosition;
- if (lastpos === undefined || lastpos.x !== e.pageX || lastpos.y !== e.pageY) {
- $(e.target).trigger("mousemove-filtered", e);
- }
- });
- }
-
- /**
- * Debounces a function. Returns a function that calls the original fn function only if no invocations have been made
- * within the last quietMillis milliseconds.
- *
- * @param quietMillis number of milliseconds to wait before invoking fn
- * @param fn function to be debounced
- * @param ctx object to be used as this reference within fn
- * @return debounced version of fn
- */
- function debounce(quietMillis, fn, ctx) {
- ctx = ctx || undefined;
- var timeout;
- return function () {
- var args = arguments;
- window.clearTimeout(timeout);
- timeout = window.setTimeout(function() {
- fn.apply(ctx, args);
- }, quietMillis);
- };
- }
-
- function installDebouncedScroll(threshold, element) {
- var notify = debounce(threshold, function (e) { element.trigger("scroll-debounced", e);});
- element.on("scroll", function (e) {
- if (indexOf(e.target, element.get()) >= 0) notify(e);
- });
- }
-
- function focus($el) {
- if ($el[0] === document.activeElement) return;
-
- /* set the focus in a 0 timeout - that way the focus is set after the processing
- of the current event has finished - which seems like the only reliable way
- to set focus */
- window.setTimeout(function() {
- var el=$el[0], pos=$el.val().length, range;
-
- $el.focus();
-
- /* make sure el received focus so we do not error out when trying to manipulate the caret.
- sometimes modals or others listeners may steal it after its set */
- var isVisible = (el.offsetWidth > 0 || el.offsetHeight > 0);
- if (isVisible && el === document.activeElement) {
-
- /* after the focus is set move the caret to the end, necessary when we val()
- just before setting focus */
- if(el.setSelectionRange)
- {
- el.setSelectionRange(pos, pos);
- }
- else if (el.createTextRange) {
- range = el.createTextRange();
- range.collapse(false);
- range.select();
- }
- }
- }, 0);
- }
-
- function getCursorInfo(el) {
- el = $(el)[0];
- var offset = 0;
- var length = 0;
- if ('selectionStart' in el) {
- offset = el.selectionStart;
- length = el.selectionEnd - offset;
- } else if ('selection' in document) {
- el.focus();
- var sel = document.selection.createRange();
- length = document.selection.createRange().text.length;
- sel.moveStart('character', -el.value.length);
- offset = sel.text.length - length;
- }
- return { offset: offset, length: length };
- }
-
- function killEvent(event) {
- event.preventDefault();
- event.stopPropagation();
- }
- function killEventImmediately(event) {
- event.preventDefault();
- event.stopImmediatePropagation();
- }
-
- function measureTextWidth(e) {
- if (!sizer){
- var style = e[0].currentStyle || window.getComputedStyle(e[0], null);
- sizer = $(document.createElement("div")).css({
- position: "absolute",
- left: "-10000px",
- top: "-10000px",
- display: "none",
- fontSize: style.fontSize,
- fontFamily: style.fontFamily,
- fontStyle: style.fontStyle,
- fontWeight: style.fontWeight,
- letterSpacing: style.letterSpacing,
- textTransform: style.textTransform,
- whiteSpace: "nowrap"
- });
- sizer.attr("class","select2-sizer");
- $("body").append(sizer);
- }
- sizer.text(e.val());
- return sizer.width();
- }
-
- function syncCssClasses(dest, src, adapter) {
- var classes, replacements = [], adapted;
-
- classes = $.trim(dest.attr("class"));
-
- if (classes) {
- classes = '' + classes; // for IE which returns object
-
- $(classes.split(/\s+/)).each2(function() {
- if (this.indexOf("select2-") === 0) {
- replacements.push(this);
- }
- });
- }
-
- classes = $.trim(src.attr("class"));
-
- if (classes) {
- classes = '' + classes; // for IE which returns object
-
- $(classes.split(/\s+/)).each2(function() {
- if (this.indexOf("select2-") !== 0) {
- adapted = adapter(this);
-
- if (adapted) {
- replacements.push(adapted);
- }
- }
- });
- }
-
- dest.attr("class", replacements.join(" "));
- }
-
-
- function markMatch(text, term, markup, escapeMarkup) {
- var match=stripDiacritics(text.toUpperCase()).indexOf(stripDiacritics(term.toUpperCase())),
- tl=term.length;
-
- if (match<0) {
- markup.push(escapeMarkup(text));
- return;
- }
-
- markup.push(escapeMarkup(text.substring(0, match)));
- markup.push("");
- markup.push(escapeMarkup(text.substring(match, match + tl)));
- markup.push(" ");
- markup.push(escapeMarkup(text.substring(match + tl, text.length)));
- }
-
- function defaultEscapeMarkup(markup) {
- var replace_map = {
- '\\': '\',
- '&': '&',
- '<': '<',
- '>': '>',
- '"': '"',
- "'": ''',
- "/": '/'
- };
-
- return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
- return replace_map[match];
- });
- }
-
- /**
- * Produces an ajax-based query function
- *
- * @param options object containing configuration parameters
- * @param options.params parameter map for the transport ajax call, can contain such options as cache, jsonpCallback, etc. see $.ajax
- * @param options.transport function that will be used to execute the ajax request. must be compatible with parameters supported by $.ajax
- * @param options.url url for the data
- * @param options.data a function(searchTerm, pageNumber, context) that should return an object containing query string parameters for the above url.
- * @param options.dataType request data type: ajax, jsonp, other datatypes supported by jQuery's $.ajax function or the transport function if specified
- * @param options.quietMillis (optional) milliseconds to wait before making the ajaxRequest, helps debounce the ajax function if invoked too often
- * @param options.results a function(remoteData, pageNumber, query) that converts data returned form the remote request to the format expected by Select2.
- * The expected format is an object containing the following keys:
- * results array of objects that will be used as choices
- * more (optional) boolean indicating whether there are more results available
- * Example: {results:[{id:1, text:'Red'},{id:2, text:'Blue'}], more:true}
- */
- function ajax(options) {
- var timeout, // current scheduled but not yet executed request
- handler = null,
- quietMillis = options.quietMillis || 100,
- ajaxUrl = options.url,
- self = this;
-
- return function (query) {
- window.clearTimeout(timeout);
- timeout = window.setTimeout(function () {
- var data = options.data, // ajax data function
- url = ajaxUrl, // ajax url string or function
- transport = options.transport || $.fn.select2.ajaxDefaults.transport,
- // deprecated - to be removed in 4.0 - use params instead
- deprecated = {
- type: options.type || 'GET', // set type of request (GET or POST)
- cache: options.cache || false,
- jsonpCallback: options.jsonpCallback||undefined,
- dataType: options.dataType||"json"
- },
- params = $.extend({}, $.fn.select2.ajaxDefaults.params, deprecated);
-
- data = data ? data.call(self, query.term, query.page, query.context) : null;
- url = (typeof url === 'function') ? url.call(self, query.term, query.page, query.context) : url;
-
- if (handler && typeof handler.abort === "function") { handler.abort(); }
-
- if (options.params) {
- if ($.isFunction(options.params)) {
- $.extend(params, options.params.call(self));
- } else {
- $.extend(params, options.params);
- }
- }
-
- $.extend(params, {
- url: url,
- dataType: options.dataType,
- data: data,
- success: function (data) {
- // TODO - replace query.page with query so users have access to term, page, etc.
- // added query as third paramter to keep backwards compatibility
- var results = options.results(data, query.page, query);
- query.callback(results);
- },
- error: function(jqXHR, textStatus, errorThrown){
- var results = {
- hasError: true,
- jqXHR: jqXHR,
- textStatus: textStatus,
- errorThrown: errorThrown,
- };
-
- query.callback(results);
- }
- });
- handler = transport.call(self, params);
- }, quietMillis);
- };
- }
-
- /**
- * Produces a query function that works with a local array
- *
- * @param options object containing configuration parameters. The options parameter can either be an array or an
- * object.
- *
- * If the array form is used it is assumed that it contains objects with 'id' and 'text' keys.
- *
- * If the object form is used it is assumed that it contains 'data' and 'text' keys. The 'data' key should contain
- * an array of objects that will be used as choices. These objects must contain at least an 'id' key. The 'text'
- * key can either be a String in which case it is expected that each element in the 'data' array has a key with the
- * value of 'text' which will be used to match choices. Alternatively, text can be a function(item) that can extract
- * the text.
- */
- function local(options) {
- var data = options, // data elements
- dataText,
- tmp,
- text = function (item) { return ""+item.text; }; // function used to retrieve the text portion of a data item that is matched against the search
-
- if ($.isArray(data)) {
- tmp = data;
- data = { results: tmp };
- }
-
- if ($.isFunction(data) === false) {
- tmp = data;
- data = function() { return tmp; };
- }
-
- var dataItem = data();
- if (dataItem.text) {
- text = dataItem.text;
- // if text is not a function we assume it to be a key name
- if (!$.isFunction(text)) {
- dataText = dataItem.text; // we need to store this in a separate variable because in the next step data gets reset and data.text is no longer available
- text = function (item) { return item[dataText]; };
- }
- }
-
- return function (query) {
- var t = query.term, filtered = { results: [] }, process;
- if (t === "") {
- query.callback(data());
- return;
- }
-
- process = function(datum, collection) {
- var group, attr;
- datum = datum[0];
- if (datum.children) {
- group = {};
- for (attr in datum) {
- if (datum.hasOwnProperty(attr)) group[attr]=datum[attr];
- }
- group.children=[];
- $(datum.children).each2(function(i, childDatum) { process(childDatum, group.children); });
- if (group.children.length || query.matcher(t, text(group), datum)) {
- collection.push(group);
- }
- } else {
- if (query.matcher(t, text(datum), datum)) {
- collection.push(datum);
- }
- }
- };
-
- $(data().results).each2(function(i, datum) { process(datum, filtered.results); });
- query.callback(filtered);
- };
- }
-
- // TODO javadoc
- function tags(data) {
- var isFunc = $.isFunction(data);
- return function (query) {
- var t = query.term, filtered = {results: []};
- var result = isFunc ? data(query) : data;
- if ($.isArray(result)) {
- $(result).each(function () {
- var isObject = this.text !== undefined,
- text = isObject ? this.text : this;
- if (t === "" || query.matcher(t, text)) {
- filtered.results.push(isObject ? this : {id: this, text: this});
- }
- });
- query.callback(filtered);
- }
- };
- }
-
- /**
- * Checks if the formatter function should be used.
- *
- * Throws an error if it is not a function. Returns true if it should be used,
- * false if no formatting should be performed.
- *
- * @param formatter
- */
- function checkFormatter(formatter, formatterName) {
- if ($.isFunction(formatter)) return true;
- if (!formatter) return false;
- if (typeof(formatter) === 'string') return true;
- throw new Error(formatterName +" must be a string, function, or falsy value");
- }
-
- /**
- * Returns a given value
- * If given a function, returns its output
- *
- * @param val string|function
- * @param context value of "this" to be passed to function
- * @returns {*}
- */
- function evaluate(val, context) {
- if ($.isFunction(val)) {
- var args = Array.prototype.slice.call(arguments, 2);
- return val.apply(context, args);
- }
- return val;
- }
-
- function countResults(results) {
- var count = 0;
- $.each(results, function(i, item) {
- if (item.children) {
- count += countResults(item.children);
- } else {
- count++;
- }
- });
- return count;
- }
-
- /**
- * Default tokenizer. This function uses breaks the input on substring match of any string from the
- * opts.tokenSeparators array and uses opts.createSearchChoice to create the choice object. Both of those
- * two options have to be defined in order for the tokenizer to work.
- *
- * @param input text user has typed so far or pasted into the search field
- * @param selection currently selected choices
- * @param selectCallback function(choice) callback tho add the choice to selection
- * @param opts select2's opts
- * @return undefined/null to leave the current input unchanged, or a string to change the input to the returned value
- */
- function defaultTokenizer(input, selection, selectCallback, opts) {
- var original = input, // store the original so we can compare and know if we need to tell the search to update its text
- dupe = false, // check for whether a token we extracted represents a duplicate selected choice
- token, // token
- index, // position at which the separator was found
- i, l, // looping variables
- separator; // the matched separator
-
- if (!opts.createSearchChoice || !opts.tokenSeparators || opts.tokenSeparators.length < 1) return undefined;
-
- while (true) {
- index = -1;
-
- for (i = 0, l = opts.tokenSeparators.length; i < l; i++) {
- separator = opts.tokenSeparators[i];
- index = input.indexOf(separator);
- if (index >= 0) break;
- }
-
- if (index < 0) break; // did not find any token separator in the input string, bail
-
- token = input.substring(0, index);
- input = input.substring(index + separator.length);
-
- if (token.length > 0) {
- token = opts.createSearchChoice.call(this, token, selection);
- if (token !== undefined && token !== null && opts.id(token) !== undefined && opts.id(token) !== null) {
- dupe = false;
- for (i = 0, l = selection.length; i < l; i++) {
- if (equal(opts.id(token), opts.id(selection[i]))) {
- dupe = true; break;
- }
- }
-
- if (!dupe) selectCallback(token);
- }
- }
- }
-
- if (original!==input) return input;
- }
-
- function cleanupJQueryElements() {
- var self = this;
-
- $.each(arguments, function (i, element) {
- self[element].remove();
- self[element] = null;
- });
- }
-
- /**
- * Creates a new class
- *
- * @param superClass
- * @param methods
- */
- function clazz(SuperClass, methods) {
- var constructor = function () {};
- constructor.prototype = new SuperClass;
- constructor.prototype.constructor = constructor;
- constructor.prototype.parent = SuperClass.prototype;
- constructor.prototype = $.extend(constructor.prototype, methods);
- return constructor;
- }
-
- AbstractSelect2 = clazz(Object, {
-
- // abstract
- bind: function (func) {
- var self = this;
- return function () {
- func.apply(self, arguments);
- };
- },
-
- // abstract
- init: function (opts) {
- var results, search, resultsSelector = ".select2-results";
-
- // prepare options
- this.opts = opts = this.prepareOpts(opts);
-
- this.id=opts.id;
-
- // destroy if called on an existing component
- if (opts.element.data("select2") !== undefined &&
- opts.element.data("select2") !== null) {
- opts.element.data("select2").destroy();
- }
-
- this.container = this.createContainer();
-
- this.liveRegion = $("", {
- role: "status",
- "aria-live": "polite"
- })
- .addClass("select2-hidden-accessible")
- .appendTo(document.body);
-
- this.containerId="s2id_"+(opts.element.attr("id") || "autogen"+nextUid());
- this.containerEventName= this.containerId
- .replace(/([.])/g, '_')
- .replace(/([;&,\-\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1');
- this.container.attr("id", this.containerId);
-
- this.container.attr("title", opts.element.attr("title"));
-
- this.body = $("body");
-
- syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
-
- this.container.attr("style", opts.element.attr("style"));
- this.container.css(evaluate(opts.containerCss, this.opts.element));
- this.container.addClass(evaluate(opts.containerCssClass, this.opts.element));
-
- this.elementTabIndex = this.opts.element.attr("tabindex");
-
- // swap container for the element
- this.opts.element
- .data("select2", this)
- .attr("tabindex", "-1")
- .before(this.container)
- .on("click.select2", killEvent); // do not leak click events
-
- this.container.data("select2", this);
-
- this.dropdown = this.container.find(".select2-drop");
-
- syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
-
- this.dropdown.addClass(evaluate(opts.dropdownCssClass, this.opts.element));
- this.dropdown.data("select2", this);
- this.dropdown.on("click", killEvent);
-
- this.results = results = this.container.find(resultsSelector);
- this.search = search = this.container.find("input.select2-input");
-
- this.queryCount = 0;
- this.resultsPage = 0;
- this.context = null;
-
- // initialize the container
- this.initContainer();
-
- this.container.on("click", killEvent);
-
- installFilteredMouseMove(this.results);
-
- this.dropdown.on("mousemove-filtered", resultsSelector, this.bind(this.highlightUnderEvent));
- this.dropdown.on("touchstart touchmove touchend", resultsSelector, this.bind(function (event) {
- this._touchEvent = true;
- this.highlightUnderEvent(event);
- }));
- this.dropdown.on("touchmove", resultsSelector, this.bind(this.touchMoved));
- this.dropdown.on("touchstart touchend", resultsSelector, this.bind(this.clearTouchMoved));
-
- // Waiting for a click event on touch devices to select option and hide dropdown
- // otherwise click will be triggered on an underlying element
- this.dropdown.on('click', this.bind(function (event) {
- if (this._touchEvent) {
- this._touchEvent = false;
- this.selectHighlighted();
- }
- }));
-
- installDebouncedScroll(80, this.results);
- this.dropdown.on("scroll-debounced", resultsSelector, this.bind(this.loadMoreIfNeeded));
-
- // do not propagate change event from the search field out of the component
- $(this.container).on("change", ".select2-input", function(e) {e.stopPropagation();});
- $(this.dropdown).on("change", ".select2-input", function(e) {e.stopPropagation();});
-
- // if jquery.mousewheel plugin is installed we can prevent out-of-bounds scrolling of results via mousewheel
- if ($.fn.mousewheel) {
- results.mousewheel(function (e, delta, deltaX, deltaY) {
- var top = results.scrollTop();
- if (deltaY > 0 && top - deltaY <= 0) {
- results.scrollTop(0);
- killEvent(e);
- } else if (deltaY < 0 && results.get(0).scrollHeight - results.scrollTop() + deltaY <= results.height()) {
- results.scrollTop(results.get(0).scrollHeight - results.height());
- killEvent(e);
- }
- });
- }
-
- installKeyUpChangeEvent(search);
- search.on("keyup-change input paste", this.bind(this.updateResults));
- search.on("focus", function () { search.addClass("select2-focused"); });
- search.on("blur", function () { search.removeClass("select2-focused");});
-
- this.dropdown.on("mouseup", resultsSelector, this.bind(function (e) {
- if ($(e.target).closest(".select2-result-selectable").length > 0) {
- this.highlightUnderEvent(e);
- this.selectHighlighted(e);
- }
- }));
-
- // trap all mouse events from leaving the dropdown. sometimes there may be a modal that is listening
- // for mouse events outside of itself so it can close itself. since the dropdown is now outside the select2's
- // dom it will trigger the popup close, which is not what we want
- // focusin can cause focus wars between modals and select2 since the dropdown is outside the modal.
- this.dropdown.on("click mouseup mousedown touchstart touchend focusin", function (e) { e.stopPropagation(); });
-
- this.nextSearchTerm = undefined;
-
- if ($.isFunction(this.opts.initSelection)) {
- // initialize selection based on the current value of the source element
- this.initSelection();
-
- // if the user has provided a function that can set selection based on the value of the source element
- // we monitor the change event on the element and trigger it, allowing for two way synchronization
- this.monitorSource();
- }
-
- if (opts.maximumInputLength !== null) {
- this.search.attr("maxlength", opts.maximumInputLength);
- }
-
- var disabled = opts.element.prop("disabled");
- if (disabled === undefined) disabled = false;
- this.enable(!disabled);
-
- var readonly = opts.element.prop("readonly");
- if (readonly === undefined) readonly = false;
- this.readonly(readonly);
-
- // Calculate size of scrollbar
- scrollBarDimensions = scrollBarDimensions || measureScrollbar();
-
- this.autofocus = opts.element.prop("autofocus");
- opts.element.prop("autofocus", false);
- if (this.autofocus) this.focus();
-
- this.search.attr("placeholder", opts.searchInputPlaceholder);
- },
-
- // abstract
- destroy: function () {
- var element=this.opts.element, select2 = element.data("select2"), self = this;
-
- this.close();
-
- if (element.length && element[0].detachEvent) {
- element.each(function () {
- this.detachEvent("onpropertychange", self._sync);
- });
- }
- if (this.propertyObserver) {
- this.propertyObserver.disconnect();
- this.propertyObserver = null;
- }
- this._sync = null;
-
- if (select2 !== undefined) {
- select2.container.remove();
- select2.liveRegion.remove();
- select2.dropdown.remove();
- element
- .removeClass("select2-offscreen")
- .removeData("select2")
- .off(".select2")
- .prop("autofocus", this.autofocus || false);
- if (this.elementTabIndex) {
- element.attr({tabindex: this.elementTabIndex});
- } else {
- element.removeAttr("tabindex");
- }
- element.show();
- }
-
- cleanupJQueryElements.call(this,
- "container",
- "liveRegion",
- "dropdown",
- "results",
- "search"
- );
- },
-
- // abstract
- optionToData: function(element) {
- if (element.is("option")) {
- return {
- id:element.prop("value"),
- text:element.text(),
- element: element.get(),
- css: element.attr("class"),
- disabled: element.prop("disabled"),
- locked: equal(element.attr("locked"), "locked") || equal(element.data("locked"), true)
- };
- } else if (element.is("optgroup")) {
- return {
- text:element.attr("label"),
- children:[],
- element: element.get(),
- css: element.attr("class")
- };
- }
- },
-
- // abstract
- prepareOpts: function (opts) {
- var element, select, idKey, ajaxUrl, self = this;
-
- element = opts.element;
-
- if (element.get(0).tagName.toLowerCase() === "select") {
- this.select = select = opts.element;
- }
-
- if (select) {
- // these options are not allowed when attached to a select because they are picked up off the element itself
- $.each(["id", "multiple", "ajax", "query", "createSearchChoice", "initSelection", "data", "tags"], function () {
- if (this in opts) {
- throw new Error("Option '" + this + "' is not allowed for Select2 when attached to a element.");
- }
- });
- }
-
- opts = $.extend({}, {
- populateResults: function(container, results, query) {
- var populate, id=this.opts.id, liveRegion=this.liveRegion;
-
- populate=function(results, container, depth) {
-
- var i, l, result, selectable, disabled, compound, node, label, innerContainer, formatted;
-
- results = opts.sortResults(results, container, query);
-
- // collect the created nodes for bulk append
- var nodes = [];
- for (i = 0, l = results.length; i < l; i = i + 1) {
-
- result=results[i];
-
- disabled = (result.disabled === true);
- selectable = (!disabled) && (id(result) !== undefined);
-
- compound=result.children && result.children.length > 0;
-
- node=$(" ");
- node.addClass("select2-results-dept-"+depth);
- node.addClass("select2-result");
- node.addClass(selectable ? "select2-result-selectable" : "select2-result-unselectable");
- if (disabled) { node.addClass("select2-disabled"); }
- if (compound) { node.addClass("select2-result-with-children"); }
- node.addClass(self.opts.formatResultCssClass(result));
- node.attr("role", "presentation");
-
- label=$(document.createElement("div"));
- label.addClass("select2-result-label");
- label.attr("id", "select2-result-label-" + nextUid());
- label.attr("role", "option");
-
- formatted=opts.formatResult(result, label, query, self.opts.escapeMarkup);
- if (formatted!==undefined) {
- label.html(formatted);
- node.append(label);
- }
-
-
- if (compound) {
-
- innerContainer=$("");
- innerContainer.addClass("select2-result-sub");
- populate(result.children, innerContainer, depth+1);
- node.append(innerContainer);
- }
-
- node.data("select2-data", result);
- nodes.push(node[0]);
- }
-
- // bulk append the created nodes
- container.append(nodes);
- liveRegion.text(opts.formatMatches(results.length));
- };
-
- populate(results, container, 0);
- }
- }, $.fn.select2.defaults, opts);
-
- if (typeof(opts.id) !== "function") {
- idKey = opts.id;
- opts.id = function (e) { return e[idKey]; };
- }
-
- if ($.isArray(opts.element.data("select2Tags"))) {
- if ("tags" in opts) {
- throw "tags specified as both an attribute 'data-select2-tags' and in options of Select2 " + opts.element.attr("id");
- }
- opts.tags=opts.element.data("select2Tags");
- }
-
- if (select) {
- opts.query = this.bind(function (query) {
- var data = { results: [], more: false },
- term = query.term,
- children, placeholderOption, process;
-
- process=function(element, collection) {
- var group;
- if (element.is("option")) {
- if (query.matcher(term, element.text(), element)) {
- collection.push(self.optionToData(element));
- }
- } else if (element.is("optgroup")) {
- group=self.optionToData(element);
- element.children().each2(function(i, elm) { process(elm, group.children); });
- if (group.children.length>0) {
- collection.push(group);
- }
- }
- };
-
- children=element.children();
-
- // ignore the placeholder option if there is one
- if (this.getPlaceholder() !== undefined && children.length > 0) {
- placeholderOption = this.getPlaceholderOption();
- if (placeholderOption) {
- children=children.not(placeholderOption);
- }
- }
-
- children.each2(function(i, elm) { process(elm, data.results); });
-
- query.callback(data);
- });
- // this is needed because inside val() we construct choices from options and their id is hardcoded
- opts.id=function(e) { return e.id; };
- } else {
- if (!("query" in opts)) {
-
- if ("ajax" in opts) {
- ajaxUrl = opts.element.data("ajax-url");
- if (ajaxUrl && ajaxUrl.length > 0) {
- opts.ajax.url = ajaxUrl;
- }
- opts.query = ajax.call(opts.element, opts.ajax);
- } else if ("data" in opts) {
- opts.query = local(opts.data);
- } else if ("tags" in opts) {
- opts.query = tags(opts.tags);
- if (opts.createSearchChoice === undefined) {
- opts.createSearchChoice = function (term) { return {id: $.trim(term), text: $.trim(term)}; };
- }
- if (opts.initSelection === undefined) {
- opts.initSelection = function (element, callback) {
- var data = [];
- $(splitVal(element.val(), opts.separator)).each(function () {
- var obj = { id: this, text: this },
- tags = opts.tags;
- if ($.isFunction(tags)) tags=tags();
- $(tags).each(function() { if (equal(this.id, obj.id)) { obj = this; return false; } });
- data.push(obj);
- });
-
- callback(data);
- };
- }
- }
- }
- }
- if (typeof(opts.query) !== "function") {
- throw "query function not defined for Select2 " + opts.element.attr("id");
- }
-
- if (opts.createSearchChoicePosition === 'top') {
- opts.createSearchChoicePosition = function(list, item) { list.unshift(item); };
- }
- else if (opts.createSearchChoicePosition === 'bottom') {
- opts.createSearchChoicePosition = function(list, item) { list.push(item); };
- }
- else if (typeof(opts.createSearchChoicePosition) !== "function") {
- throw "invalid createSearchChoicePosition option must be 'top', 'bottom' or a custom function";
- }
-
- return opts;
- },
-
- /**
- * Monitor the original element for changes and update select2 accordingly
- */
- // abstract
- monitorSource: function () {
- var el = this.opts.element, observer, self = this;
-
- el.on("change.select2", this.bind(function (e) {
- if (this.opts.element.data("select2-change-triggered") !== true) {
- this.initSelection();
- }
- }));
-
- this._sync = this.bind(function () {
-
- // sync enabled state
- var disabled = el.prop("disabled");
- if (disabled === undefined) disabled = false;
- this.enable(!disabled);
-
- var readonly = el.prop("readonly");
- if (readonly === undefined) readonly = false;
- this.readonly(readonly);
-
- syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
- this.container.addClass(evaluate(this.opts.containerCssClass, this.opts.element));
-
- syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
- this.dropdown.addClass(evaluate(this.opts.dropdownCssClass, this.opts.element));
-
- });
-
- // IE8-10 (IE9/10 won't fire propertyChange via attachEventListener)
- if (el.length && el[0].attachEvent) {
- el.each(function() {
- this.attachEvent("onpropertychange", self._sync);
- });
- }
-
- // safari, chrome, firefox, IE11
- observer = window.MutationObserver || window.WebKitMutationObserver|| window.MozMutationObserver;
- if (observer !== undefined) {
- if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; }
- this.propertyObserver = new observer(function (mutations) {
- $.each(mutations, self._sync);
- });
- this.propertyObserver.observe(el.get(0), { attributes:true, subtree:false });
- }
- },
-
- // abstract
- triggerSelect: function(data) {
- var evt = $.Event("select2-selecting", { val: this.id(data), object: data, choice: data });
- this.opts.element.trigger(evt);
- return !evt.isDefaultPrevented();
- },
-
- /**
- * Triggers the change event on the source element
- */
- // abstract
- triggerChange: function (details) {
-
- details = details || {};
- details= $.extend({}, details, { type: "change", val: this.val() });
- // prevents recursive triggering
- this.opts.element.data("select2-change-triggered", true);
- this.opts.element.trigger(details);
- this.opts.element.data("select2-change-triggered", false);
-
- // some validation frameworks ignore the change event and listen instead to keyup, click for selects
- // so here we trigger the click event manually
- this.opts.element.click();
-
- // ValidationEngine ignores the change event and listens instead to blur
- // so here we trigger the blur event manually if so desired
- if (this.opts.blurOnChange)
- this.opts.element.blur();
- },
-
- //abstract
- isInterfaceEnabled: function()
- {
- return this.enabledInterface === true;
- },
-
- // abstract
- enableInterface: function() {
- var enabled = this._enabled && !this._readonly,
- disabled = !enabled;
-
- if (enabled === this.enabledInterface) return false;
-
- this.container.toggleClass("select2-container-disabled", disabled);
- this.close();
- this.enabledInterface = enabled;
-
- return true;
- },
-
- // abstract
- enable: function(enabled) {
- if (enabled === undefined) enabled = true;
- if (this._enabled === enabled) return;
- this._enabled = enabled;
-
- this.opts.element.prop("disabled", !enabled);
- this.enableInterface();
- },
-
- // abstract
- disable: function() {
- this.enable(false);
- },
-
- // abstract
- readonly: function(enabled) {
- if (enabled === undefined) enabled = false;
- if (this._readonly === enabled) return;
- this._readonly = enabled;
-
- this.opts.element.prop("readonly", enabled);
- this.enableInterface();
- },
-
- // abstract
- opened: function () {
- return (this.container) ? this.container.hasClass("select2-dropdown-open") : false;
- },
-
- // abstract
- positionDropdown: function() {
- var $dropdown = this.dropdown,
- offset = this.container.offset(),
- height = this.container.outerHeight(false),
- width = this.container.outerWidth(false),
- dropHeight = $dropdown.outerHeight(false),
- $window = $(window),
- windowWidth = $window.width(),
- windowHeight = $window.height(),
- viewPortRight = $window.scrollLeft() + windowWidth,
- viewportBottom = $window.scrollTop() + windowHeight,
- dropTop = offset.top + height,
- dropLeft = offset.left,
- enoughRoomBelow = dropTop + dropHeight <= viewportBottom,
- enoughRoomAbove = (offset.top - dropHeight) >= $window.scrollTop(),
- dropWidth = $dropdown.outerWidth(false),
- enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight,
- aboveNow = $dropdown.hasClass("select2-drop-above"),
- bodyOffset,
- above,
- changeDirection,
- css,
- resultsListNode;
-
- // always prefer the current above/below alignment, unless there is not enough room
- if (aboveNow) {
- above = true;
- if (!enoughRoomAbove && enoughRoomBelow) {
- changeDirection = true;
- above = false;
- }
- } else {
- above = false;
- if (!enoughRoomBelow && enoughRoomAbove) {
- changeDirection = true;
- above = true;
- }
- }
-
- //if we are changing direction we need to get positions when dropdown is hidden;
- if (changeDirection) {
- $dropdown.hide();
- offset = this.container.offset();
- height = this.container.outerHeight(false);
- width = this.container.outerWidth(false);
- dropHeight = $dropdown.outerHeight(false);
- viewPortRight = $window.scrollLeft() + windowWidth;
- viewportBottom = $window.scrollTop() + windowHeight;
- dropTop = offset.top + height;
- dropLeft = offset.left;
- dropWidth = $dropdown.outerWidth(false);
- enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight;
- $dropdown.show();
-
- // fix so the cursor does not move to the left within the search-textbox in IE
- this.focusSearch();
- }
-
- if (this.opts.dropdownAutoWidth) {
- resultsListNode = $('.select2-results', $dropdown)[0];
- $dropdown.addClass('select2-drop-auto-width');
- $dropdown.css('width', '');
- // Add scrollbar width to dropdown if vertical scrollbar is present
- dropWidth = $dropdown.outerWidth(false) + (resultsListNode.scrollHeight === resultsListNode.clientHeight ? 0 : scrollBarDimensions.width);
- dropWidth > width ? width = dropWidth : dropWidth = width;
- dropHeight = $dropdown.outerHeight(false);
- enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight;
- }
- else {
- this.container.removeClass('select2-drop-auto-width');
- }
-
- //console.log("below/ droptop:", dropTop, "dropHeight", dropHeight, "sum", (dropTop+dropHeight)+" viewport bottom", viewportBottom, "enough?", enoughRoomBelow);
- //console.log("above/ offset.top", offset.top, "dropHeight", dropHeight, "top", (offset.top-dropHeight), "scrollTop", this.body.scrollTop(), "enough?", enoughRoomAbove);
-
- // fix positioning when body has an offset and is not position: static
- if (this.body.css('position') !== 'static') {
- bodyOffset = this.body.offset();
- dropTop -= bodyOffset.top;
- dropLeft -= bodyOffset.left;
- }
-
- if (!enoughRoomOnRight) {
- dropLeft = offset.left + this.container.outerWidth(false) - dropWidth;
- }
-
- css = {
- left: dropLeft,
- width: width
- };
-
- if (above) {
- css.top = offset.top - dropHeight;
- css.bottom = 'auto';
- this.container.addClass("select2-drop-above");
- $dropdown.addClass("select2-drop-above");
- }
- else {
- css.top = dropTop;
- css.bottom = 'auto';
- this.container.removeClass("select2-drop-above");
- $dropdown.removeClass("select2-drop-above");
- }
- css = $.extend(css, evaluate(this.opts.dropdownCss, this.opts.element));
-
- $dropdown.css(css);
- },
-
- // abstract
- shouldOpen: function() {
- var event;
-
- if (this.opened()) return false;
-
- if (this._enabled === false || this._readonly === true) return false;
-
- event = $.Event("select2-opening");
- this.opts.element.trigger(event);
- return !event.isDefaultPrevented();
- },
-
- // abstract
- clearDropdownAlignmentPreference: function() {
- // clear the classes used to figure out the preference of where the dropdown should be opened
- this.container.removeClass("select2-drop-above");
- this.dropdown.removeClass("select2-drop-above");
- },
-
- /**
- * Opens the dropdown
- *
- * @return {Boolean} whether or not dropdown was opened. This method will return false if, for example,
- * the dropdown is already open, or if the 'open' event listener on the element called preventDefault().
- */
- // abstract
- open: function () {
-
- if (!this.shouldOpen()) return false;
-
- this.opening();
-
- // Only bind the document mousemove when the dropdown is visible
- $document.on("mousemove.select2Event", function (e) {
- lastMousePosition.x = e.pageX;
- lastMousePosition.y = e.pageY;
- });
-
- return true;
- },
-
- /**
- * Performs the opening of the dropdown
- */
- // abstract
- opening: function() {
- var cid = this.containerEventName,
- scroll = "scroll." + cid,
- resize = "resize."+cid,
- orient = "orientationchange."+cid,
- mask;
-
- this.container.addClass("select2-dropdown-open").addClass("select2-container-active");
-
- this.clearDropdownAlignmentPreference();
-
- if(this.dropdown[0] !== this.body.children().last()[0]) {
- this.dropdown.detach().appendTo(this.body);
- }
-
- // create the dropdown mask if doesn't already exist
- mask = $("#select2-drop-mask");
- if (mask.length == 0) {
- mask = $(document.createElement("div"));
- mask.attr("id","select2-drop-mask").attr("class","select2-drop-mask");
- mask.hide();
- mask.appendTo(this.body);
- mask.on("mousedown touchstart click", function (e) {
- // Prevent IE from generating a click event on the body
- reinsertElement(mask);
-
- var dropdown = $("#select2-drop"), self;
- if (dropdown.length > 0) {
- self=dropdown.data("select2");
- if (self.opts.selectOnBlur) {
- self.selectHighlighted({noFocus: true});
- }
- self.close();
- e.preventDefault();
- e.stopPropagation();
- }
- });
- }
-
- // ensure the mask is always right before the dropdown
- if (this.dropdown.prev()[0] !== mask[0]) {
- this.dropdown.before(mask);
- }
-
- // move the global id to the correct dropdown
- $("#select2-drop").removeAttr("id");
- this.dropdown.attr("id", "select2-drop");
-
- // show the elements
- mask.show();
-
- this.positionDropdown();
- this.dropdown.show();
- this.positionDropdown();
-
- this.dropdown.addClass("select2-drop-active");
-
- // attach listeners to events that can change the position of the container and thus require
- // the position of the dropdown to be updated as well so it does not come unglued from the container
- var that = this;
- this.container.parents().add(window).each(function () {
- $(this).on(resize+" "+scroll+" "+orient, function (e) {
- if (that.opened()) that.positionDropdown();
- });
- });
-
-
- },
-
- // abstract
- close: function () {
- if (!this.opened()) return;
-
- var cid = this.containerEventName,
- scroll = "scroll." + cid,
- resize = "resize."+cid,
- orient = "orientationchange."+cid;
-
- // unbind event listeners
- this.container.parents().add(window).each(function () { $(this).off(scroll).off(resize).off(orient); });
-
- this.clearDropdownAlignmentPreference();
-
- $("#select2-drop-mask").hide();
- this.dropdown.removeAttr("id"); // only the active dropdown has the select2-drop id
- this.dropdown.hide();
- this.container.removeClass("select2-dropdown-open").removeClass("select2-container-active");
- this.results.empty();
-
- // Now that the dropdown is closed, unbind the global document mousemove event
- $document.off("mousemove.select2Event");
-
- this.clearSearch();
- this.search.removeClass("select2-active");
- this.opts.element.trigger($.Event("select2-close"));
- },
-
- /**
- * Opens control, sets input value, and updates results.
- */
- // abstract
- externalSearch: function (term) {
- this.open();
- this.search.val(term);
- this.updateResults(false);
- },
-
- // abstract
- clearSearch: function () {
-
- },
-
- //abstract
- getMaximumSelectionSize: function() {
- return evaluate(this.opts.maximumSelectionSize, this.opts.element);
- },
-
- // abstract
- ensureHighlightVisible: function () {
- var results = this.results, children, index, child, hb, rb, y, more, topOffset;
-
- index = this.highlight();
-
- if (index < 0) return;
-
- if (index == 0) {
-
- // if the first element is highlighted scroll all the way to the top,
- // that way any unselectable headers above it will also be scrolled
- // into view
-
- results.scrollTop(0);
- return;
- }
-
- children = this.findHighlightableChoices().find('.select2-result-label');
-
- child = $(children[index]);
-
- topOffset = (child.offset() || {}).top || 0;
-
- hb = topOffset + child.outerHeight(true);
-
- // if this is the last child lets also make sure select2-more-results is visible
- if (index === children.length - 1) {
- more = results.find("li.select2-more-results");
- if (more.length > 0) {
- hb = more.offset().top + more.outerHeight(true);
- }
- }
-
- rb = results.offset().top + results.outerHeight(true);
- if (hb > rb) {
- results.scrollTop(results.scrollTop() + (hb - rb));
- }
- y = topOffset - results.offset().top;
-
- // make sure the top of the element is visible
- if (y < 0 && child.css('display') != 'none' ) {
- results.scrollTop(results.scrollTop() + y); // y is negative
- }
- },
-
- // abstract
- findHighlightableChoices: function() {
- return this.results.find(".select2-result-selectable:not(.select2-disabled):not(.select2-selected)");
- },
-
- // abstract
- moveHighlight: function (delta) {
- var choices = this.findHighlightableChoices(),
- index = this.highlight();
-
- while (index > -1 && index < choices.length) {
- index += delta;
- var choice = $(choices[index]);
- if (choice.hasClass("select2-result-selectable") && !choice.hasClass("select2-disabled") && !choice.hasClass("select2-selected")) {
- this.highlight(index);
- break;
- }
- }
- },
-
- // abstract
- highlight: function (index) {
- var choices = this.findHighlightableChoices(),
- choice,
- data;
-
- if (arguments.length === 0) {
- return indexOf(choices.filter(".select2-highlighted")[0], choices.get());
- }
-
- if (index >= choices.length) index = choices.length - 1;
- if (index < 0) index = 0;
-
- this.removeHighlight();
-
- choice = $(choices[index]);
- choice.addClass("select2-highlighted");
-
- // ensure assistive technology can determine the active choice
- this.search.attr("aria-activedescendant", choice.find(".select2-result-label").attr("id"));
-
- this.ensureHighlightVisible();
-
- this.liveRegion.text(choice.text());
-
- data = choice.data("select2-data");
- if (data) {
- this.opts.element.trigger({ type: "select2-highlight", val: this.id(data), choice: data });
- }
- },
-
- removeHighlight: function() {
- this.results.find(".select2-highlighted").removeClass("select2-highlighted");
- },
-
- touchMoved: function() {
- this._touchMoved = true;
- },
-
- clearTouchMoved: function() {
- this._touchMoved = false;
- },
-
- // abstract
- countSelectableResults: function() {
- return this.findHighlightableChoices().length;
- },
-
- // abstract
- highlightUnderEvent: function (event) {
- var el = $(event.target).closest(".select2-result-selectable");
- if (el.length > 0 && !el.is(".select2-highlighted")) {
- var choices = this.findHighlightableChoices();
- this.highlight(choices.index(el));
- } else if (el.length == 0) {
- // if we are over an unselectable item remove all highlights
- this.removeHighlight();
- }
- },
-
- // abstract
- loadMoreIfNeeded: function () {
- var results = this.results,
- more = results.find("li.select2-more-results"),
- below, // pixels the element is below the scroll fold, below==0 is when the element is starting to be visible
- page = this.resultsPage + 1,
- self=this,
- term=this.search.val(),
- context=this.context;
-
- if (more.length === 0) return;
- below = more.offset().top - results.offset().top - results.height();
-
- if (below <= this.opts.loadMorePadding) {
- more.addClass("select2-active");
- this.opts.query({
- element: this.opts.element,
- term: term,
- page: page,
- context: context,
- matcher: this.opts.matcher,
- callback: this.bind(function (data) {
-
- // ignore a response if the select2 has been closed before it was received
- if (!self.opened()) return;
-
-
- self.opts.populateResults.call(this, results, data.results, {term: term, page: page, context:context});
- self.postprocessResults(data, false, false);
-
- if (data.more===true) {
- more.detach().appendTo(results).text(evaluate(self.opts.formatLoadMore, self.opts.element, page+1));
- window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
- } else {
- more.remove();
- }
- self.positionDropdown();
- self.resultsPage = page;
- self.context = data.context;
- this.opts.element.trigger({ type: "select2-loaded", items: data });
- })});
- }
- },
-
- /**
- * Default tokenizer function which does nothing
- */
- tokenize: function() {
-
- },
-
- /**
- * @param initial whether or not this is the call to this method right after the dropdown has been opened
- */
- // abstract
- updateResults: function (initial) {
- var search = this.search,
- results = this.results,
- opts = this.opts,
- data,
- self = this,
- input,
- term = search.val(),
- lastTerm = $.data(this.container, "select2-last-term"),
- // sequence number used to drop out-of-order responses
- queryNumber;
-
- // prevent duplicate queries against the same term
- if (initial !== true && lastTerm && equal(term, lastTerm)) return;
-
- $.data(this.container, "select2-last-term", term);
-
- // if the search is currently hidden we do not alter the results
- if (initial !== true && (this.showSearchInput === false || !this.opened())) {
- return;
- }
-
- function postRender() {
- search.removeClass("select2-active");
- self.positionDropdown();
- if (results.find('.select2-no-results,.select2-selection-limit,.select2-searching').length) {
- self.liveRegion.text(results.text());
- }
- else {
- self.liveRegion.text(self.opts.formatMatches(results.find('.select2-result-selectable').length));
- }
- }
-
- function render(html) {
- results.html(html);
- postRender();
- }
-
- queryNumber = ++this.queryCount;
-
- var maxSelSize = this.getMaximumSelectionSize();
- if (maxSelSize >=1) {
- data = this.data();
- if ($.isArray(data) && data.length >= maxSelSize && checkFormatter(opts.formatSelectionTooBig, "formatSelectionTooBig")) {
- render("" + evaluate(opts.formatSelectionTooBig, opts.element, maxSelSize) + " ");
- return;
- }
- }
-
- if (search.val().length < opts.minimumInputLength) {
- if (checkFormatter(opts.formatInputTooShort, "formatInputTooShort")) {
- render("" + evaluate(opts.formatInputTooShort, opts.element, search.val(), opts.minimumInputLength) + " ");
- } else {
- render("");
- }
- if (initial && this.showSearch) this.showSearch(true);
- return;
- }
-
- if (opts.maximumInputLength && search.val().length > opts.maximumInputLength) {
- if (checkFormatter(opts.formatInputTooLong, "formatInputTooLong")) {
- render("" + evaluate(opts.formatInputTooLong, opts.element, search.val(), opts.maximumInputLength) + " ");
- } else {
- render("");
- }
- return;
- }
-
- if (opts.formatSearching && this.findHighlightableChoices().length === 0) {
- render("" + evaluate(opts.formatSearching, opts.element) + " ");
- }
-
- search.addClass("select2-active");
-
- this.removeHighlight();
-
- // give the tokenizer a chance to pre-process the input
- input = this.tokenize();
- if (input != undefined && input != null) {
- search.val(input);
- }
-
- this.resultsPage = 1;
-
- opts.query({
- element: opts.element,
- term: search.val(),
- page: this.resultsPage,
- context: null,
- matcher: opts.matcher,
- callback: this.bind(function (data) {
- var def; // default choice
-
- // ignore old responses
- if (queryNumber != this.queryCount) {
- return;
- }
-
- // ignore a response if the select2 has been closed before it was received
- if (!this.opened()) {
- this.search.removeClass("select2-active");
- return;
- }
-
- // handle ajax error
- if(data.hasError !== undefined && checkFormatter(opts.formatAjaxError, "formatAjaxError")) {
- render("" + evaluate(opts.formatAjaxError, opts.element, data.jqXHR, data.textStatus, data.errorThrown) + " ");
- return;
- }
-
- // save context, if any
- this.context = (data.context===undefined) ? null : data.context;
- // create a default choice and prepend it to the list
- if (this.opts.createSearchChoice && search.val() !== "") {
- def = this.opts.createSearchChoice.call(self, search.val(), data.results);
- if (def !== undefined && def !== null && self.id(def) !== undefined && self.id(def) !== null) {
- if ($(data.results).filter(
- function () {
- return equal(self.id(this), self.id(def));
- }).length === 0) {
- this.opts.createSearchChoicePosition(data.results, def);
- }
- }
- }
-
- if (data.results.length === 0 && checkFormatter(opts.formatNoMatches, "formatNoMatches")) {
- render("" + evaluate(opts.formatNoMatches, opts.element, search.val()) + " ");
- return;
- }
-
- results.empty();
- self.opts.populateResults.call(this, results, data.results, {term: search.val(), page: this.resultsPage, context:null});
-
- if (data.more === true && checkFormatter(opts.formatLoadMore, "formatLoadMore")) {
- results.append("" + opts.escapeMarkup(evaluate(opts.formatLoadMore, opts.element, this.resultsPage)) + " ");
- window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
- }
-
- this.postprocessResults(data, initial);
-
- postRender();
-
- this.opts.element.trigger({ type: "select2-loaded", items: data });
- })});
- },
-
- // abstract
- cancel: function () {
- this.close();
- },
-
- // abstract
- blur: function () {
- // if selectOnBlur == true, select the currently highlighted option
- if (this.opts.selectOnBlur)
- this.selectHighlighted({noFocus: true});
-
- this.close();
- this.container.removeClass("select2-container-active");
- // synonymous to .is(':focus'), which is available in jquery >= 1.6
- if (this.search[0] === document.activeElement) { this.search.blur(); }
- this.clearSearch();
- this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
- },
-
- // abstract
- focusSearch: function () {
- focus(this.search);
- },
-
- // abstract
- selectHighlighted: function (options) {
- if (this._touchMoved) {
- this.clearTouchMoved();
- return;
- }
- var index=this.highlight(),
- highlighted=this.results.find(".select2-highlighted"),
- data = highlighted.closest('.select2-result').data("select2-data");
-
- if (data) {
- this.highlight(index);
- this.onSelect(data, options);
- } else if (options && options.noFocus) {
- this.close();
- }
- },
-
- // abstract
- getPlaceholder: function () {
- var placeholderOption;
- return this.opts.element.attr("placeholder") ||
- this.opts.element.attr("data-placeholder") || // jquery 1.4 compat
- this.opts.element.data("placeholder") ||
- this.opts.placeholder ||
- ((placeholderOption = this.getPlaceholderOption()) !== undefined ? placeholderOption.text() : undefined);
- },
-
- // abstract
- getPlaceholderOption: function() {
- if (this.select) {
- var firstOption = this.select.children('option').first();
- if (this.opts.placeholderOption !== undefined ) {
- //Determine the placeholder option based on the specified placeholderOption setting
- return (this.opts.placeholderOption === "first" && firstOption) ||
- (typeof this.opts.placeholderOption === "function" && this.opts.placeholderOption(this.select));
- } else if ($.trim(firstOption.text()) === "" && firstOption.val() === "") {
- //No explicit placeholder option specified, use the first if it's blank
- return firstOption;
- }
- }
- },
-
- /**
- * Get the desired width for the container element. This is
- * derived first from option `width` passed to select2, then
- * the inline 'style' on the original element, and finally
- * falls back to the jQuery calculated element width.
- */
- // abstract
- initContainerWidth: function () {
- function resolveContainerWidth() {
- var style, attrs, matches, i, l, attr;
-
- if (this.opts.width === "off") {
- return null;
- } else if (this.opts.width === "element"){
- return this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px';
- } else if (this.opts.width === "copy" || this.opts.width === "resolve") {
- // check if there is inline style on the element that contains width
- style = this.opts.element.attr('style');
- if (style !== undefined) {
- attrs = style.split(';');
- for (i = 0, l = attrs.length; i < l; i = i + 1) {
- attr = attrs[i].replace(/\s/g, '');
- matches = attr.match(/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i);
- if (matches !== null && matches.length >= 1)
- return matches[1];
- }
- }
-
- if (this.opts.width === "resolve") {
- // next check if css('width') can resolve a width that is percent based, this is sometimes possible
- // when attached to input type=hidden or elements hidden via css
- style = this.opts.element.css('width');
- if (style.indexOf("%") > 0) return style;
-
- // finally, fallback on the calculated width of the element
- return (this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px');
- }
-
- return null;
- } else if ($.isFunction(this.opts.width)) {
- return this.opts.width();
- } else {
- return this.opts.width;
- }
- };
-
- var width = resolveContainerWidth.call(this);
- if (width !== null) {
- this.container.css("width", width);
- }
- }
- });
-
- SingleSelect2 = clazz(AbstractSelect2, {
-
- // single
-
- createContainer: function () {
- var container = $(document.createElement("div")).attr({
- "class": "select2-container"
- }).html([
- "",
- " ",
- " ",
- " ",
- " ",
- " ",
- "",
- "
",
- " ",
- " ",
- "
",
- "
",
- "
"].join(""));
- return container;
- },
-
- // single
- enableInterface: function() {
- if (this.parent.enableInterface.apply(this, arguments)) {
- this.focusser.prop("disabled", !this.isInterfaceEnabled());
- }
- },
-
- // single
- opening: function () {
- var el, range, len;
-
- if (this.opts.minimumResultsForSearch >= 0) {
- this.showSearch(true);
- }
-
- this.parent.opening.apply(this, arguments);
-
- if (this.showSearchInput !== false) {
- // IE appends focusser.val() at the end of field :/ so we manually insert it at the beginning using a range
- // all other browsers handle this just fine
-
- this.search.val(this.focusser.val());
- }
- if (this.opts.shouldFocusInput(this)) {
- this.search.focus();
- // move the cursor to the end after focussing, otherwise it will be at the beginning and
- // new text will appear *before* focusser.val()
- el = this.search.get(0);
- if (el.createTextRange) {
- range = el.createTextRange();
- range.collapse(false);
- range.select();
- } else if (el.setSelectionRange) {
- len = this.search.val().length;
- el.setSelectionRange(len, len);
- }
- }
-
- // initializes search's value with nextSearchTerm (if defined by user)
- // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter
- if(this.search.val() === "") {
- if(this.nextSearchTerm != undefined){
- this.search.val(this.nextSearchTerm);
- this.search.select();
- }
- }
-
- this.focusser.prop("disabled", true).val("");
- this.updateResults(true);
- this.opts.element.trigger($.Event("select2-open"));
- },
-
- // single
- close: function () {
- if (!this.opened()) return;
- this.parent.close.apply(this, arguments);
-
- this.focusser.prop("disabled", false);
-
- if (this.opts.shouldFocusInput(this)) {
- this.focusser.focus();
- }
- },
-
- // single
- focus: function () {
- if (this.opened()) {
- this.close();
- } else {
- this.focusser.prop("disabled", false);
- if (this.opts.shouldFocusInput(this)) {
- this.focusser.focus();
- }
- }
- },
-
- // single
- isFocused: function () {
- return this.container.hasClass("select2-container-active");
- },
-
- // single
- cancel: function () {
- this.parent.cancel.apply(this, arguments);
- this.focusser.prop("disabled", false);
-
- if (this.opts.shouldFocusInput(this)) {
- this.focusser.focus();
- }
- },
-
- // single
- destroy: function() {
- $("label[for='" + this.focusser.attr('id') + "']")
- .attr('for', this.opts.element.attr("id"));
- this.parent.destroy.apply(this, arguments);
-
- cleanupJQueryElements.call(this,
- "selection",
- "focusser"
- );
- },
-
- // single
- initContainer: function () {
-
- var selection,
- container = this.container,
- dropdown = this.dropdown,
- idSuffix = nextUid(),
- elementLabel;
-
- if (this.opts.minimumResultsForSearch < 0) {
- this.showSearch(false);
- } else {
- this.showSearch(true);
- }
-
- this.selection = selection = container.find(".select2-choice");
-
- this.focusser = container.find(".select2-focusser");
-
- // add aria associations
- selection.find(".select2-chosen").attr("id", "select2-chosen-"+idSuffix);
- this.focusser.attr("aria-labelledby", "select2-chosen-"+idSuffix);
- this.results.attr("id", "select2-results-"+idSuffix);
- this.search.attr("aria-owns", "select2-results-"+idSuffix);
-
- // rewrite labels from original element to focusser
- this.focusser.attr("id", "s2id_autogen"+idSuffix);
-
- elementLabel = $("label[for='" + this.opts.element.attr("id") + "']");
-
- this.focusser.prev()
- .text(elementLabel.text())
- .attr('for', this.focusser.attr('id'));
-
- // Ensure the original element retains an accessible name
- var originalTitle = this.opts.element.attr("title");
- this.opts.element.attr("title", (originalTitle || elementLabel.text()));
-
- this.focusser.attr("tabindex", this.elementTabIndex);
-
- // write label for search field using the label from the focusser element
- this.search.attr("id", this.focusser.attr('id') + '_search');
-
- this.search.prev()
- .text($("label[for='" + this.focusser.attr('id') + "']").text())
- .attr('for', this.search.attr('id'));
-
- this.search.on("keydown", this.bind(function (e) {
- if (!this.isInterfaceEnabled()) return;
-
- // filter 229 keyCodes (input method editor is processing key input)
- if (229 == e.keyCode) return;
-
- if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
- // prevent the page from scrolling
- killEvent(e);
- return;
- }
-
- switch (e.which) {
- case KEY.UP:
- case KEY.DOWN:
- this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
- killEvent(e);
- return;
- case KEY.ENTER:
- this.selectHighlighted();
- killEvent(e);
- return;
- case KEY.TAB:
- this.selectHighlighted({noFocus: true});
- return;
- case KEY.ESC:
- this.cancel(e);
- killEvent(e);
- return;
- }
- }));
-
- this.search.on("blur", this.bind(function(e) {
- // a workaround for chrome to keep the search field focussed when the scroll bar is used to scroll the dropdown.
- // without this the search field loses focus which is annoying
- if (document.activeElement === this.body.get(0)) {
- window.setTimeout(this.bind(function() {
- if (this.opened()) {
- this.search.focus();
- }
- }), 0);
- }
- }));
-
- this.focusser.on("keydown", this.bind(function (e) {
- if (!this.isInterfaceEnabled()) return;
-
- if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {
- return;
- }
-
- if (this.opts.openOnEnter === false && e.which === KEY.ENTER) {
- killEvent(e);
- return;
- }
-
- if (e.which == KEY.DOWN || e.which == KEY.UP
- || (e.which == KEY.ENTER && this.opts.openOnEnter)) {
-
- if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) return;
-
- this.open();
- killEvent(e);
- return;
- }
-
- if (e.which == KEY.DELETE || e.which == KEY.BACKSPACE) {
- if (this.opts.allowClear) {
- this.clear();
- }
- killEvent(e);
- return;
- }
- }));
-
-
- installKeyUpChangeEvent(this.focusser);
- this.focusser.on("keyup-change input", this.bind(function(e) {
- if (this.opts.minimumResultsForSearch >= 0) {
- e.stopPropagation();
- if (this.opened()) return;
- this.open();
- }
- }));
-
- selection.on("mousedown touchstart", "abbr", this.bind(function (e) {
- if (!this.isInterfaceEnabled()) return;
- this.clear();
- killEventImmediately(e);
- this.close();
- this.selection.focus();
- }));
-
- selection.on("mousedown touchstart", this.bind(function (e) {
- // Prevent IE from generating a click event on the body
- reinsertElement(selection);
-
- if (!this.container.hasClass("select2-container-active")) {
- this.opts.element.trigger($.Event("select2-focus"));
- }
-
- if (this.opened()) {
- this.close();
- } else if (this.isInterfaceEnabled()) {
- this.open();
- }
-
- killEvent(e);
- }));
-
- dropdown.on("mousedown touchstart", this.bind(function() {
- if (this.opts.shouldFocusInput(this)) {
- this.search.focus();
- }
- }));
-
- selection.on("focus", this.bind(function(e) {
- killEvent(e);
- }));
-
- this.focusser.on("focus", this.bind(function(){
- if (!this.container.hasClass("select2-container-active")) {
- this.opts.element.trigger($.Event("select2-focus"));
- }
- this.container.addClass("select2-container-active");
- })).on("blur", this.bind(function() {
- if (!this.opened()) {
- this.container.removeClass("select2-container-active");
- this.opts.element.trigger($.Event("select2-blur"));
- }
- }));
- this.search.on("focus", this.bind(function(){
- if (!this.container.hasClass("select2-container-active")) {
- this.opts.element.trigger($.Event("select2-focus"));
- }
- this.container.addClass("select2-container-active");
- }));
-
- this.initContainerWidth();
- this.opts.element.addClass("select2-offscreen");
- this.setPlaceholder();
-
- },
-
- // single
- clear: function(triggerChange) {
- var data=this.selection.data("select2-data");
- if (data) { // guard against queued quick consecutive clicks
- var evt = $.Event("select2-clearing");
- this.opts.element.trigger(evt);
- if (evt.isDefaultPrevented()) {
- return;
- }
- var placeholderOption = this.getPlaceholderOption();
- this.opts.element.val(placeholderOption ? placeholderOption.val() : "");
- this.selection.find(".select2-chosen").empty();
- this.selection.removeData("select2-data");
- this.setPlaceholder();
-
- if (triggerChange !== false){
- this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
- this.triggerChange({removed:data});
- }
- }
- },
-
- /**
- * Sets selection based on source element's value
- */
- // single
- initSelection: function () {
- var selected;
- if (this.isPlaceholderOptionSelected()) {
- this.updateSelection(null);
- this.close();
- this.setPlaceholder();
- } else {
- var self = this;
- this.opts.initSelection.call(null, this.opts.element, function(selected){
- if (selected !== undefined && selected !== null) {
- self.updateSelection(selected);
- self.close();
- self.setPlaceholder();
- self.nextSearchTerm = self.opts.nextSearchTerm(selected, self.search.val());
- }
- });
- }
- },
-
- isPlaceholderOptionSelected: function() {
- var placeholderOption;
- if (this.getPlaceholder() === undefined) return false; // no placeholder specified so no option should be considered
- return ((placeholderOption = this.getPlaceholderOption()) !== undefined && placeholderOption.prop("selected"))
- || (this.opts.element.val() === "")
- || (this.opts.element.val() === undefined)
- || (this.opts.element.val() === null);
- },
-
- // single
- prepareOpts: function () {
- var opts = this.parent.prepareOpts.apply(this, arguments),
- self=this;
-
- if (opts.element.get(0).tagName.toLowerCase() === "select") {
- // install the selection initializer
- opts.initSelection = function (element, callback) {
- var selected = element.find("option").filter(function() { return this.selected && !this.disabled });
- // a single select box always has a value, no need to null check 'selected'
- callback(self.optionToData(selected));
- };
- } else if ("data" in opts) {
- // install default initSelection when applied to hidden input and data is local
- opts.initSelection = opts.initSelection || function (element, callback) {
- var id = element.val();
- //search in data by id, storing the actual matching item
- var match = null;
- opts.query({
- matcher: function(term, text, el){
- var is_match = equal(id, opts.id(el));
- if (is_match) {
- match = el;
- }
- return is_match;
- },
- callback: !$.isFunction(callback) ? $.noop : function() {
- callback(match);
- }
- });
- };
- }
-
- return opts;
- },
-
- // single
- getPlaceholder: function() {
- // if a placeholder is specified on a single select without a valid placeholder option ignore it
- if (this.select) {
- if (this.getPlaceholderOption() === undefined) {
- return undefined;
- }
- }
-
- return this.parent.getPlaceholder.apply(this, arguments);
- },
-
- // single
- setPlaceholder: function () {
- var placeholder = this.getPlaceholder();
-
- if (this.isPlaceholderOptionSelected() && placeholder !== undefined) {
-
- // check for a placeholder option if attached to a select
- if (this.select && this.getPlaceholderOption() === undefined) return;
-
- this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(placeholder));
-
- this.selection.addClass("select2-default");
-
- this.container.removeClass("select2-allowclear");
- }
- },
-
- // single
- postprocessResults: function (data, initial, noHighlightUpdate) {
- var selected = 0, self = this, showSearchInput = true;
-
- // find the selected element in the result list
-
- this.findHighlightableChoices().each2(function (i, elm) {
- if (equal(self.id(elm.data("select2-data")), self.opts.element.val())) {
- selected = i;
- return false;
- }
- });
-
- // and highlight it
- if (noHighlightUpdate !== false) {
- if (initial === true && selected >= 0) {
- this.highlight(selected);
- } else {
- this.highlight(0);
- }
- }
-
- // hide the search box if this is the first we got the results and there are enough of them for search
-
- if (initial === true) {
- var min = this.opts.minimumResultsForSearch;
- if (min >= 0) {
- this.showSearch(countResults(data.results) >= min);
- }
- }
- },
-
- // single
- showSearch: function(showSearchInput) {
- if (this.showSearchInput === showSearchInput) return;
-
- this.showSearchInput = showSearchInput;
-
- this.dropdown.find(".select2-search").toggleClass("select2-search-hidden", !showSearchInput);
- this.dropdown.find(".select2-search").toggleClass("select2-offscreen", !showSearchInput);
- //add "select2-with-searchbox" to the container if search box is shown
- $(this.dropdown, this.container).toggleClass("select2-with-searchbox", showSearchInput);
- },
-
- // single
- onSelect: function (data, options) {
-
- if (!this.triggerSelect(data)) { return; }
-
- var old = this.opts.element.val(),
- oldData = this.data();
-
- this.opts.element.val(this.id(data));
- this.updateSelection(data);
-
- this.opts.element.trigger({ type: "select2-selected", val: this.id(data), choice: data });
-
- this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());
- this.close();
-
- if ((!options || !options.noFocus) && this.opts.shouldFocusInput(this)) {
- this.focusser.focus();
- }
-
- if (!equal(old, this.id(data))) {
- this.triggerChange({ added: data, removed: oldData });
- }
- },
-
- // single
- updateSelection: function (data) {
-
- var container=this.selection.find(".select2-chosen"), formatted, cssClass;
-
- this.selection.data("select2-data", data);
-
- container.empty();
- if (data !== null) {
- formatted=this.opts.formatSelection(data, container, this.opts.escapeMarkup);
- }
- if (formatted !== undefined) {
- container.append(formatted);
- }
- cssClass=this.opts.formatSelectionCssClass(data, container);
- if (cssClass !== undefined) {
- container.addClass(cssClass);
- }
-
- this.selection.removeClass("select2-default");
-
- if (this.opts.allowClear && this.getPlaceholder() !== undefined) {
- this.container.addClass("select2-allowclear");
- }
- },
-
- // single
- val: function () {
- var val,
- triggerChange = false,
- data = null,
- self = this,
- oldData = this.data();
-
- if (arguments.length === 0) {
- return this.opts.element.val();
- }
-
- val = arguments[0];
-
- if (arguments.length > 1) {
- triggerChange = arguments[1];
- }
-
- if (this.select) {
- this.select
- .val(val)
- .find("option").filter(function() { return this.selected }).each2(function (i, elm) {
- data = self.optionToData(elm);
- return false;
- });
- this.updateSelection(data);
- this.setPlaceholder();
- if (triggerChange) {
- this.triggerChange({added: data, removed:oldData});
- }
- } else {
- // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
- if (!val && val !== 0) {
- this.clear(triggerChange);
- return;
- }
- if (this.opts.initSelection === undefined) {
- throw new Error("cannot call val() if initSelection() is not defined");
- }
- this.opts.element.val(val);
- this.opts.initSelection(this.opts.element, function(data){
- self.opts.element.val(!data ? "" : self.id(data));
- self.updateSelection(data);
- self.setPlaceholder();
- if (triggerChange) {
- self.triggerChange({added: data, removed:oldData});
- }
- });
- }
- },
-
- // single
- clearSearch: function () {
- this.search.val("");
- this.focusser.val("");
- },
-
- // single
- data: function(value) {
- var data,
- triggerChange = false;
-
- if (arguments.length === 0) {
- data = this.selection.data("select2-data");
- if (data == undefined) data = null;
- return data;
- } else {
- if (arguments.length > 1) {
- triggerChange = arguments[1];
- }
- if (!value) {
- this.clear(triggerChange);
- } else {
- data = this.data();
- this.opts.element.val(!value ? "" : this.id(value));
- this.updateSelection(value);
- if (triggerChange) {
- this.triggerChange({added: value, removed:data});
- }
- }
- }
- }
- });
-
- MultiSelect2 = clazz(AbstractSelect2, {
-
- // multi
- createContainer: function () {
- var container = $(document.createElement("div")).attr({
- "class": "select2-container select2-container-multi"
- }).html([
- "",
- ""].join(""));
- return container;
- },
-
- // multi
- prepareOpts: function () {
- var opts = this.parent.prepareOpts.apply(this, arguments),
- self=this;
-
- // TODO validate placeholder is a string if specified
-
- if (opts.element.get(0).tagName.toLowerCase() === "select") {
- // install the selection initializer
- opts.initSelection = function (element, callback) {
-
- var data = [];
-
- element.find("option").filter(function() { return this.selected && !this.disabled }).each2(function (i, elm) {
- data.push(self.optionToData(elm));
- });
- callback(data);
- };
- } else if ("data" in opts) {
- // install default initSelection when applied to hidden input and data is local
- opts.initSelection = opts.initSelection || function (element, callback) {
- var ids = splitVal(element.val(), opts.separator);
- //search in data by array of ids, storing matching items in a list
- var matches = [];
- opts.query({
- matcher: function(term, text, el){
- var is_match = $.grep(ids, function(id) {
- return equal(id, opts.id(el));
- }).length;
- if (is_match) {
- matches.push(el);
- }
- return is_match;
- },
- callback: !$.isFunction(callback) ? $.noop : function() {
- // reorder matches based on the order they appear in the ids array because right now
- // they are in the order in which they appear in data array
- var ordered = [];
- for (var i = 0; i < ids.length; i++) {
- var id = ids[i];
- for (var j = 0; j < matches.length; j++) {
- var match = matches[j];
- if (equal(id, opts.id(match))) {
- ordered.push(match);
- matches.splice(j, 1);
- break;
- }
- }
- }
- callback(ordered);
- }
- });
- };
- }
-
- return opts;
- },
-
- // multi
- selectChoice: function (choice) {
-
- var selected = this.container.find(".select2-search-choice-focus");
- if (selected.length && choice && choice[0] == selected[0]) {
-
- } else {
- if (selected.length) {
- this.opts.element.trigger("choice-deselected", selected);
- }
- selected.removeClass("select2-search-choice-focus");
- if (choice && choice.length) {
- this.close();
- choice.addClass("select2-search-choice-focus");
- this.opts.element.trigger("choice-selected", choice);
- }
- }
- },
-
- // multi
- destroy: function() {
- $("label[for='" + this.search.attr('id') + "']")
- .attr('for', this.opts.element.attr("id"));
- this.parent.destroy.apply(this, arguments);
-
- cleanupJQueryElements.call(this,
- "searchContainer",
- "selection"
- );
- },
-
- // multi
- initContainer: function () {
-
- var selector = ".select2-choices", selection;
-
- this.searchContainer = this.container.find(".select2-search-field");
- this.selection = selection = this.container.find(selector);
-
- var _this = this;
- this.selection.on("click", ".select2-search-choice:not(.select2-locked)", function (e) {
- //killEvent(e);
- _this.search[0].focus();
- _this.selectChoice($(this));
- });
-
- // rewrite labels from original element to focusser
- this.search.attr("id", "s2id_autogen"+nextUid());
-
- this.search.prev()
- .text($("label[for='" + this.opts.element.attr("id") + "']").text())
- .attr('for', this.search.attr('id'));
-
- this.search.on("input paste", this.bind(function() {
- if (this.search.attr('placeholder') && this.search.val().length == 0) return;
- if (!this.isInterfaceEnabled()) return;
- if (!this.opened()) {
- this.open();
- }
- }));
-
- this.search.attr("tabindex", this.elementTabIndex);
-
- this.keydowns = 0;
- this.search.on("keydown", this.bind(function (e) {
- if (!this.isInterfaceEnabled()) return;
-
- ++this.keydowns;
- var selected = selection.find(".select2-search-choice-focus");
- var prev = selected.prev(".select2-search-choice:not(.select2-locked)");
- var next = selected.next(".select2-search-choice:not(.select2-locked)");
- var pos = getCursorInfo(this.search);
-
- if (selected.length &&
- (e.which == KEY.LEFT || e.which == KEY.RIGHT || e.which == KEY.BACKSPACE || e.which == KEY.DELETE || e.which == KEY.ENTER)) {
- var selectedChoice = selected;
- if (e.which == KEY.LEFT && prev.length) {
- selectedChoice = prev;
- }
- else if (e.which == KEY.RIGHT) {
- selectedChoice = next.length ? next : null;
- }
- else if (e.which === KEY.BACKSPACE) {
- if (this.unselect(selected.first())) {
- this.search.width(10);
- selectedChoice = prev.length ? prev : next;
- }
- } else if (e.which == KEY.DELETE) {
- if (this.unselect(selected.first())) {
- this.search.width(10);
- selectedChoice = next.length ? next : null;
- }
- } else if (e.which == KEY.ENTER) {
- selectedChoice = null;
- }
-
- this.selectChoice(selectedChoice);
- killEvent(e);
- if (!selectedChoice || !selectedChoice.length) {
- this.open();
- }
- return;
- } else if (((e.which === KEY.BACKSPACE && this.keydowns == 1)
- || e.which == KEY.LEFT) && (pos.offset == 0 && !pos.length)) {
-
- this.selectChoice(selection.find(".select2-search-choice:not(.select2-locked)").last());
- killEvent(e);
- return;
- } else {
- this.selectChoice(null);
- }
-
- if (this.opened()) {
- switch (e.which) {
- case KEY.UP:
- case KEY.DOWN:
- this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
- killEvent(e);
- return;
- case KEY.ENTER:
- this.selectHighlighted();
- killEvent(e);
- return;
- case KEY.TAB:
- this.selectHighlighted({noFocus:true});
- this.close();
- return;
- case KEY.ESC:
- this.cancel(e);
- killEvent(e);
- return;
- }
- }
-
- if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e)
- || e.which === KEY.BACKSPACE || e.which === KEY.ESC) {
- return;
- }
-
- if (e.which === KEY.ENTER) {
- if (this.opts.openOnEnter === false) {
- return;
- } else if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {
- return;
- }
- }
-
- this.open();
-
- if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
- // prevent the page from scrolling
- killEvent(e);
- }
-
- if (e.which === KEY.ENTER) {
- // prevent form from being submitted
- killEvent(e);
- }
-
- }));
-
- this.search.on("keyup", this.bind(function (e) {
- this.keydowns = 0;
- this.resizeSearch();
- })
- );
-
- this.search.on("blur", this.bind(function(e) {
- this.container.removeClass("select2-container-active");
- this.search.removeClass("select2-focused");
- this.selectChoice(null);
- if (!this.opened()) this.clearSearch();
- e.stopImmediatePropagation();
- this.opts.element.trigger($.Event("select2-blur"));
- }));
-
- this.container.on("click", selector, this.bind(function (e) {
- if (!this.isInterfaceEnabled()) return;
- if ($(e.target).closest(".select2-search-choice").length > 0) {
- // clicked inside a select2 search choice, do not open
- return;
- }
- this.selectChoice(null);
- this.clearPlaceholder();
- if (!this.container.hasClass("select2-container-active")) {
- this.opts.element.trigger($.Event("select2-focus"));
- }
- this.open();
- this.focusSearch();
- e.preventDefault();
- }));
-
- this.container.on("focus", selector, this.bind(function () {
- if (!this.isInterfaceEnabled()) return;
- if (!this.container.hasClass("select2-container-active")) {
- this.opts.element.trigger($.Event("select2-focus"));
- }
- this.container.addClass("select2-container-active");
- this.dropdown.addClass("select2-drop-active");
- this.clearPlaceholder();
- }));
-
- this.initContainerWidth();
- this.opts.element.addClass("select2-offscreen");
-
- // set the placeholder if necessary
- this.clearSearch();
- },
-
- // multi
- enableInterface: function() {
- if (this.parent.enableInterface.apply(this, arguments)) {
- this.search.prop("disabled", !this.isInterfaceEnabled());
- }
- },
-
- // multi
- initSelection: function () {
- var data;
- if (this.opts.element.val() === "" && this.opts.element.text() === "") {
- this.updateSelection([]);
- this.close();
- // set the placeholder if necessary
- this.clearSearch();
- }
- if (this.select || this.opts.element.val() !== "") {
- var self = this;
- this.opts.initSelection.call(null, this.opts.element, function(data){
- if (data !== undefined && data !== null) {
- self.updateSelection(data);
- self.close();
- // set the placeholder if necessary
- self.clearSearch();
- }
- });
- }
- },
-
- // multi
- clearSearch: function () {
- var placeholder = this.getPlaceholder(),
- maxWidth = this.getMaxSearchWidth();
-
- if (placeholder !== undefined && this.getVal().length === 0 && this.search.hasClass("select2-focused") === false) {
- this.search.val(placeholder).addClass("select2-default");
- // stretch the search box to full width of the container so as much of the placeholder is visible as possible
- // we could call this.resizeSearch(), but we do not because that requires a sizer and we do not want to create one so early because of a firefox bug, see #944
- this.search.width(maxWidth > 0 ? maxWidth : this.container.css("width"));
- } else {
- this.search.val("").width(10);
- }
- },
-
- // multi
- clearPlaceholder: function () {
- if (this.search.hasClass("select2-default")) {
- this.search.val("").removeClass("select2-default");
- }
- },
-
- // multi
- opening: function () {
- this.clearPlaceholder(); // should be done before super so placeholder is not used to search
- this.resizeSearch();
-
- this.parent.opening.apply(this, arguments);
-
- this.focusSearch();
-
- // initializes search's value with nextSearchTerm (if defined by user)
- // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter
- if(this.search.val() === "") {
- if(this.nextSearchTerm != undefined){
- this.search.val(this.nextSearchTerm);
- this.search.select();
- }
- }
-
- this.updateResults(true);
- if (this.opts.shouldFocusInput(this)) {
- this.search.focus();
- }
- this.opts.element.trigger($.Event("select2-open"));
- },
-
- // multi
- close: function () {
- if (!this.opened()) return;
- this.parent.close.apply(this, arguments);
- },
-
- // multi
- focus: function () {
- this.close();
- this.search.focus();
- },
-
- // multi
- isFocused: function () {
- return this.search.hasClass("select2-focused");
- },
-
- // multi
- updateSelection: function (data) {
- var ids = [], filtered = [], self = this;
-
- // filter out duplicates
- $(data).each(function () {
- if (indexOf(self.id(this), ids) < 0) {
- ids.push(self.id(this));
- filtered.push(this);
- }
- });
- data = filtered;
-
- this.selection.find(".select2-search-choice").remove();
- $(data).each(function () {
- self.addSelectedChoice(this);
- });
- self.postprocessResults();
- },
-
- // multi
- tokenize: function() {
- var input = this.search.val();
- input = this.opts.tokenizer.call(this, input, this.data(), this.bind(this.onSelect), this.opts);
- if (input != null && input != undefined) {
- this.search.val(input);
- if (input.length > 0) {
- this.open();
- }
- }
-
- },
-
- // multi
- onSelect: function (data, options) {
-
- if (!this.triggerSelect(data) || data.text === "") { return; }
-
- this.addSelectedChoice(data);
-
- this.opts.element.trigger({ type: "selected", val: this.id(data), choice: data });
-
- // keep track of the search's value before it gets cleared
- this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());
-
- this.clearSearch();
- this.updateResults();
-
- if (this.select || !this.opts.closeOnSelect) this.postprocessResults(data, false, this.opts.closeOnSelect===true);
-
- if (this.opts.closeOnSelect) {
- this.close();
- this.search.width(10);
- } else {
- if (this.countSelectableResults()>0) {
- this.search.width(10);
- this.resizeSearch();
- if (this.getMaximumSelectionSize() > 0 && this.val().length >= this.getMaximumSelectionSize()) {
- // if we reached max selection size repaint the results so choices
- // are replaced with the max selection reached message
- this.updateResults(true);
- } else {
- // initializes search's value with nextSearchTerm and update search result
- if(this.nextSearchTerm != undefined){
- this.search.val(this.nextSearchTerm);
- this.updateResults();
- this.search.select();
- }
- }
- this.positionDropdown();
- } else {
- // if nothing left to select close
- this.close();
- this.search.width(10);
- }
- }
-
- // since its not possible to select an element that has already been
- // added we do not need to check if this is a new element before firing change
- this.triggerChange({ added: data });
-
- if (!options || !options.noFocus)
- this.focusSearch();
- },
-
- // multi
- cancel: function () {
- this.close();
- this.focusSearch();
- },
-
- addSelectedChoice: function (data) {
- var enableChoice = !data.locked,
- enabledItem = $(
- "" +
- "
" +
- " " +
- " "),
- disabledItem = $(
- "" +
- "
" +
- " ");
- var choice = enableChoice ? enabledItem : disabledItem,
- id = this.id(data),
- val = this.getVal(),
- formatted,
- cssClass;
-
- formatted=this.opts.formatSelection(data, choice.find("div"), this.opts.escapeMarkup);
- if (formatted != undefined) {
- choice.find("div").replaceWith(""+formatted+"
");
- }
- cssClass=this.opts.formatSelectionCssClass(data, choice.find("div"));
- if (cssClass != undefined) {
- choice.addClass(cssClass);
- }
-
- if(enableChoice){
- choice.find(".select2-search-choice-close")
- .on("mousedown", killEvent)
- .on("click dblclick", this.bind(function (e) {
- if (!this.isInterfaceEnabled()) return;
-
- this.unselect($(e.target));
- this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
- killEvent(e);
- this.close();
- this.focusSearch();
- })).on("focus", this.bind(function () {
- if (!this.isInterfaceEnabled()) return;
- this.container.addClass("select2-container-active");
- this.dropdown.addClass("select2-drop-active");
- }));
- }
-
- choice.data("select2-data", data);
- choice.insertBefore(this.searchContainer);
-
- val.push(id);
- this.setVal(val);
- },
-
- // multi
- unselect: function (selected) {
- var val = this.getVal(),
- data,
- index;
- selected = selected.closest(".select2-search-choice");
-
- if (selected.length === 0) {
- throw "Invalid argument: " + selected + ". Must be .select2-search-choice";
- }
-
- data = selected.data("select2-data");
-
- if (!data) {
- // prevent a race condition when the 'x' is clicked really fast repeatedly the event can be queued
- // and invoked on an element already removed
- return;
- }
-
- var evt = $.Event("select2-removing");
- evt.val = this.id(data);
- evt.choice = data;
- this.opts.element.trigger(evt);
-
- if (evt.isDefaultPrevented()) {
- return false;
- }
-
- while((index = indexOf(this.id(data), val)) >= 0) {
- val.splice(index, 1);
- this.setVal(val);
- if (this.select) this.postprocessResults();
- }
-
- selected.remove();
-
- this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
- this.triggerChange({ removed: data });
-
- return true;
- },
-
- // multi
- postprocessResults: function (data, initial, noHighlightUpdate) {
- var val = this.getVal(),
- choices = this.results.find(".select2-result"),
- compound = this.results.find(".select2-result-with-children"),
- self = this;
-
- choices.each2(function (i, choice) {
- var id = self.id(choice.data("select2-data"));
- if (indexOf(id, val) >= 0) {
- choice.addClass("select2-selected");
- // mark all children of the selected parent as selected
- choice.find(".select2-result-selectable").addClass("select2-selected");
- }
- });
-
- compound.each2(function(i, choice) {
- // hide an optgroup if it doesn't have any selectable children
- if (!choice.is('.select2-result-selectable')
- && choice.find(".select2-result-selectable:not(.select2-selected)").length === 0) {
- choice.addClass("select2-selected");
- }
- });
-
- if (this.highlight() == -1 && noHighlightUpdate !== false){
- self.highlight(0);
- }
-
- //If all results are chosen render formatNoMatches
- if(!this.opts.createSearchChoice && !choices.filter('.select2-result:not(.select2-selected)').length > 0){
- if(!data || data && !data.more && this.results.find(".select2-no-results").length === 0) {
- if (checkFormatter(self.opts.formatNoMatches, "formatNoMatches")) {
- this.results.append("" + evaluate(self.opts.formatNoMatches, self.opts.element, self.search.val()) + " ");
- }
- }
- }
-
- },
-
- // multi
- getMaxSearchWidth: function() {
- return this.selection.width() - getSideBorderPadding(this.search);
- },
-
- // multi
- resizeSearch: function () {
- var minimumWidth, left, maxWidth, containerLeft, searchWidth,
- sideBorderPadding = getSideBorderPadding(this.search);
-
- minimumWidth = measureTextWidth(this.search) + 10;
-
- left = this.search.offset().left;
-
- maxWidth = this.selection.width();
- containerLeft = this.selection.offset().left;
-
- searchWidth = maxWidth - (left - containerLeft) - sideBorderPadding;
-
- if (searchWidth < minimumWidth) {
- searchWidth = maxWidth - sideBorderPadding;
- }
-
- if (searchWidth < 40) {
- searchWidth = maxWidth - sideBorderPadding;
- }
-
- if (searchWidth <= 0) {
- searchWidth = minimumWidth;
- }
-
- this.search.width(Math.floor(searchWidth));
- },
-
- // multi
- getVal: function () {
- var val;
- if (this.select) {
- val = this.select.val();
- return val === null ? [] : val;
- } else {
- val = this.opts.element.val();
- return splitVal(val, this.opts.separator);
- }
- },
-
- // multi
- setVal: function (val) {
- var unique;
- if (this.select) {
- this.select.val(val);
- } else {
- unique = [];
- // filter out duplicates
- $(val).each(function () {
- if (indexOf(this, unique) < 0) unique.push(this);
- });
- this.opts.element.val(unique.length === 0 ? "" : unique.join(this.opts.separator));
- }
- },
-
- // multi
- buildChangeDetails: function (old, current) {
- var current = current.slice(0),
- old = old.slice(0);
-
- // remove intersection from each array
- for (var i = 0; i < current.length; i++) {
- for (var j = 0; j < old.length; j++) {
- if (equal(this.opts.id(current[i]), this.opts.id(old[j]))) {
- current.splice(i, 1);
- if(i>0){
- i--;
- }
- old.splice(j, 1);
- j--;
- }
- }
- }
-
- return {added: current, removed: old};
- },
-
-
- // multi
- val: function (val, triggerChange) {
- var oldData, self=this;
-
- if (arguments.length === 0) {
- return this.getVal();
- }
-
- oldData=this.data();
- if (!oldData.length) oldData=[];
-
- // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
- if (!val && val !== 0) {
- this.opts.element.val("");
- this.updateSelection([]);
- this.clearSearch();
- if (triggerChange) {
- this.triggerChange({added: this.data(), removed: oldData});
- }
- return;
- }
-
- // val is a list of ids
- this.setVal(val);
-
- if (this.select) {
- this.opts.initSelection(this.select, this.bind(this.updateSelection));
- if (triggerChange) {
- this.triggerChange(this.buildChangeDetails(oldData, this.data()));
- }
- } else {
- if (this.opts.initSelection === undefined) {
- throw new Error("val() cannot be called if initSelection() is not defined");
- }
-
- this.opts.initSelection(this.opts.element, function(data){
- var ids=$.map(data, self.id);
- self.setVal(ids);
- self.updateSelection(data);
- self.clearSearch();
- if (triggerChange) {
- self.triggerChange(self.buildChangeDetails(oldData, self.data()));
- }
- });
- }
- this.clearSearch();
- },
-
- // multi
- onSortStart: function() {
- if (this.select) {
- throw new Error("Sorting of elements is not supported when attached to . Attach to instead.");
- }
-
- // collapse search field into 0 width so its container can be collapsed as well
- this.search.width(0);
- // hide the container
- this.searchContainer.hide();
- },
-
- // multi
- onSortEnd:function() {
-
- var val=[], self=this;
-
- // show search and move it to the end of the list
- this.searchContainer.show();
- // make sure the search container is the last item in the list
- this.searchContainer.appendTo(this.searchContainer.parent());
- // since we collapsed the width in dragStarted, we resize it here
- this.resizeSearch();
-
- // update selection
- this.selection.find(".select2-search-choice").each(function() {
- val.push(self.opts.id($(this).data("select2-data")));
- });
- this.setVal(val);
- this.triggerChange();
- },
-
- // multi
- data: function(values, triggerChange) {
- var self=this, ids, old;
- if (arguments.length === 0) {
- return this.selection
- .children(".select2-search-choice")
- .map(function() { return $(this).data("select2-data"); })
- .get();
- } else {
- old = this.data();
- if (!values) { values = []; }
- ids = $.map(values, function(e) { return self.opts.id(e); });
- this.setVal(ids);
- this.updateSelection(values);
- this.clearSearch();
- if (triggerChange) {
- this.triggerChange(this.buildChangeDetails(old, this.data()));
- }
- }
- }
- });
-
- $.fn.select2 = function () {
-
- var args = Array.prototype.slice.call(arguments, 0),
- opts,
- select2,
- method, value, multiple,
- allowedMethods = ["val", "destroy", "opened", "open", "close", "focus", "isFocused", "container", "dropdown", "onSortStart", "onSortEnd", "enable", "disable", "readonly", "positionDropdown", "data", "search"],
- valueMethods = ["opened", "isFocused", "container", "dropdown"],
- propertyMethods = ["val", "data"],
- methodsMap = { search: "externalSearch" };
-
- this.each(function () {
- if (args.length === 0 || typeof(args[0]) === "object") {
- opts = args.length === 0 ? {} : $.extend({}, args[0]);
- opts.element = $(this);
-
- if (opts.element.get(0).tagName.toLowerCase() === "select") {
- multiple = opts.element.prop("multiple");
- } else {
- multiple = opts.multiple || false;
- if ("tags" in opts) {opts.multiple = multiple = true;}
- }
-
- select2 = multiple ? new window.Select2["class"].multi() : new window.Select2["class"].single();
- select2.init(opts);
- } else if (typeof(args[0]) === "string") {
-
- if (indexOf(args[0], allowedMethods) < 0) {
- throw "Unknown method: " + args[0];
- }
-
- value = undefined;
- select2 = $(this).data("select2");
- if (select2 === undefined) return;
-
- method=args[0];
-
- if (method === "container") {
- value = select2.container;
- } else if (method === "dropdown") {
- value = select2.dropdown;
- } else {
- if (methodsMap[method]) method = methodsMap[method];
-
- value = select2[method].apply(select2, args.slice(1));
- }
- if (indexOf(args[0], valueMethods) >= 0
- || (indexOf(args[0], propertyMethods) >= 0 && args.length == 1)) {
- return false; // abort the iteration, ready to return first matched value
- }
- } else {
- throw "Invalid arguments to select2 plugin: " + args;
- }
- });
- return (value === undefined) ? this : value;
- };
-
- // plugin defaults, accessible to users
- $.fn.select2.defaults = {
- width: "copy",
- loadMorePadding: 0,
- closeOnSelect: true,
- openOnEnter: true,
- containerCss: {},
- dropdownCss: {},
- containerCssClass: "",
- dropdownCssClass: "",
- formatResult: function(result, container, query, escapeMarkup) {
- var markup=[];
- markMatch(result.text, query.term, markup, escapeMarkup);
- return markup.join("");
- },
- formatSelection: function (data, container, escapeMarkup) {
- return data ? escapeMarkup(data.text) : undefined;
- },
- sortResults: function (results, container, query) {
- return results;
- },
- formatResultCssClass: function(data) {return data.css;},
- formatSelectionCssClass: function(data, container) {return undefined;},
- minimumResultsForSearch: 0,
- minimumInputLength: 0,
- maximumInputLength: null,
- maximumSelectionSize: 0,
- id: function (e) { return e == undefined ? null : e.id; },
- matcher: function(term, text) {
- return stripDiacritics(''+text).toUpperCase().indexOf(stripDiacritics(''+term).toUpperCase()) >= 0;
- },
- separator: ",",
- tokenSeparators: [],
- tokenizer: defaultTokenizer,
- escapeMarkup: defaultEscapeMarkup,
- blurOnChange: false,
- selectOnBlur: false,
- adaptContainerCssClass: function(c) { return c; },
- adaptDropdownCssClass: function(c) { return null; },
- nextSearchTerm: function(selectedObject, currentSearchTerm) { return undefined; },
- searchInputPlaceholder: '',
- createSearchChoicePosition: 'top',
- shouldFocusInput: function (instance) {
- // Attempt to detect touch devices
- var supportsTouchEvents = (('ontouchstart' in window) ||
- (navigator.msMaxTouchPoints > 0));
-
- // Only devices which support touch events should be special cased
- if (!supportsTouchEvents) {
- return true;
- }
-
- // Never focus the input if search is disabled
- if (instance.opts.minimumResultsForSearch < 0) {
- return false;
- }
-
- return true;
- }
- };
-
- $.fn.select2.locales = [];
-
- $.fn.select2.locales['en'] = {
- formatMatches: function (matches) { if (matches === 1) { return "One result is available, press enter to select it."; } return matches + " results are available, use up and down arrow keys to navigate."; },
- formatNoMatches: function () { return "No matches found"; },
- formatAjaxError: function (jqXHR, textStatus, errorThrown) { return "Loading failed"; },
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " or more character" + (n == 1 ? "" : "s"); },
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1 ? "" : "s"); },
- formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); },
- formatLoadMore: function (pageNumber) { return "Loading more results…"; },
- formatSearching: function () { return "Searching…"; },
- };
-
- $.extend($.fn.select2.defaults, $.fn.select2.locales['en']);
-
- $.fn.select2.ajaxDefaults = {
- transport: $.ajax,
- params: {
- type: "GET",
- cache: false,
- dataType: "json"
- }
- };
-
- // exports
- window.Select2 = {
- query: {
- ajax: ajax,
- local: local,
- tags: tags
- }, util: {
- debounce: debounce,
- markMatch: markMatch,
- escapeMarkup: defaultEscapeMarkup,
- stripDiacritics: stripDiacritics
- }, "class": {
- "abstract": AbstractSelect2,
- "single": SingleSelect2,
- "multi": MultiSelect2
- }
- };
-
-}(jQuery));
diff --git a/functions/metaboxes/js/select2/select2.min.js b/functions/metaboxes/js/select2/select2.min.js
deleted file mode 100755
index 1d3ee49..0000000
--- a/functions/metaboxes/js/select2/select2.min.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
-Copyright 2014 Igor Vaynberg
-
-Version: 3.5.1 Timestamp: Tue Jul 22 18:58:56 EDT 2014
-
-This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
-General Public License version 2 (the "GPL License"). You may choose either license to govern your
-use of this software only upon the condition that you accept all of the terms of either the Apache
-License or the GPL License.
-
-You may obtain a copy of the Apache License and the GPL License at:
-
-http://www.apache.org/licenses/LICENSE-2.0
-http://www.gnu.org/licenses/gpl-2.0.html
-
-Unless required by applicable law or agreed to in writing, software distributed under the Apache License
-or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
-either express or implied. See the Apache License and the GPL License for the specific language governing
-permissions and limitations under the Apache License and the GPL License.
-*/
-!function(a){"undefined"==typeof a.fn.each2&&a.extend(a.fn,{each2:function(b){for(var c=a([0]),d=-1,e=this.length;++dc;c+=1)if(r(a,b[c]))return c;return-1}function q(){var b=a(l);b.appendTo("body");var c={width:b.width()-b[0].clientWidth,height:b.height()-b[0].clientHeight};return b.remove(),c}function r(a,c){return a===c?!0:a===b||c===b?!1:null===a||null===c?!1:a.constructor===String?a+""==c+"":c.constructor===String?c+""==a+"":!1}function s(b,c){var d,e,f;if(null===b||b.length<1)return[];for(d=b.split(c),e=0,f=d.length;f>e;e+=1)d[e]=a.trim(d[e]);return d}function t(a){return a.outerWidth(!1)-a.width()}function u(c){var d="keyup-change-value";c.on("keydown",function(){a.data(c,d)===b&&a.data(c,d,c.val())}),c.on("keyup",function(){var e=a.data(c,d);e!==b&&c.val()!==e&&(a.removeData(c,d),c.trigger("keyup-change"))})}function v(c){c.on("mousemove",function(c){var d=i;(d===b||d.x!==c.pageX||d.y!==c.pageY)&&a(c.target).trigger("mousemove-filtered",c)})}function w(a,c,d){d=d||b;var e;return function(){var b=arguments;window.clearTimeout(e),e=window.setTimeout(function(){c.apply(d,b)},a)}}function x(a,b){var c=w(a,function(a){b.trigger("scroll-debounced",a)});b.on("scroll",function(a){p(a.target,b.get())>=0&&c(a)})}function y(a){a[0]!==document.activeElement&&window.setTimeout(function(){var d,b=a[0],c=a.val().length;a.focus();var e=b.offsetWidth>0||b.offsetHeight>0;e&&b===document.activeElement&&(b.setSelectionRange?b.setSelectionRange(c,c):b.createTextRange&&(d=b.createTextRange(),d.collapse(!1),d.select()))},0)}function z(b){b=a(b)[0];var c=0,d=0;if("selectionStart"in b)c=b.selectionStart,d=b.selectionEnd-c;else if("selection"in document){b.focus();var e=document.selection.createRange();d=document.selection.createRange().text.length,e.moveStart("character",-b.value.length),c=e.text.length-d}return{offset:c,length:d}}function A(a){a.preventDefault(),a.stopPropagation()}function B(a){a.preventDefault(),a.stopImmediatePropagation()}function C(b){if(!h){var c=b[0].currentStyle||window.getComputedStyle(b[0],null);h=a(document.createElement("div")).css({position:"absolute",left:"-10000px",top:"-10000px",display:"none",fontSize:c.fontSize,fontFamily:c.fontFamily,fontStyle:c.fontStyle,fontWeight:c.fontWeight,letterSpacing:c.letterSpacing,textTransform:c.textTransform,whiteSpace:"nowrap"}),h.attr("class","select2-sizer"),a("body").append(h)}return h.text(b.val()),h.width()}function D(b,c,d){var e,g,f=[];e=a.trim(b.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each2(function(){0===this.indexOf("select2-")&&f.push(this)})),e=a.trim(c.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each2(function(){0!==this.indexOf("select2-")&&(g=d(this),g&&f.push(g))})),b.attr("class",f.join(" "))}function E(a,b,c,d){var e=o(a.toUpperCase()).indexOf(o(b.toUpperCase())),f=b.length;return 0>e?(c.push(d(a)),void 0):(c.push(d(a.substring(0,e))),c.push(""),c.push(d(a.substring(e,e+f))),c.push(" "),c.push(d(a.substring(e+f,a.length))),void 0)}function F(a){var b={"\\":"\","&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};return String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})}function G(c){var d,e=null,f=c.quietMillis||100,g=c.url,h=this;return function(i){window.clearTimeout(d),d=window.setTimeout(function(){var d=c.data,f=g,j=c.transport||a.fn.select2.ajaxDefaults.transport,k={type:c.type||"GET",cache:c.cache||!1,jsonpCallback:c.jsonpCallback||b,dataType:c.dataType||"json"},l=a.extend({},a.fn.select2.ajaxDefaults.params,k);d=d?d.call(h,i.term,i.page,i.context):null,f="function"==typeof f?f.call(h,i.term,i.page,i.context):f,e&&"function"==typeof e.abort&&e.abort(),c.params&&(a.isFunction(c.params)?a.extend(l,c.params.call(h)):a.extend(l,c.params)),a.extend(l,{url:f,dataType:c.dataType,data:d,success:function(a){var b=c.results(a,i.page,i);i.callback(b)},error:function(a,b,c){var d={hasError:!0,jqXHR:a,textStatus:b,errorThrown:c};i.callback(d)}}),e=j.call(h,l)},f)}}function H(b){var d,e,c=b,f=function(a){return""+a.text};a.isArray(c)&&(e=c,c={results:e}),a.isFunction(c)===!1&&(e=c,c=function(){return e});var g=c();return g.text&&(f=g.text,a.isFunction(f)||(d=g.text,f=function(a){return a[d]})),function(b){var g,d=b.term,e={results:[]};return""===d?(b.callback(c()),void 0):(g=function(c,e){var h,i;if(c=c[0],c.children){h={};for(i in c)c.hasOwnProperty(i)&&(h[i]=c[i]);h.children=[],a(c.children).each2(function(a,b){g(b,h.children)}),(h.children.length||b.matcher(d,f(h),c))&&e.push(h)}else b.matcher(d,f(c),c)&&e.push(c)},a(c().results).each2(function(a,b){g(b,e.results)}),b.callback(e),void 0)}}function I(c){var d=a.isFunction(c);return function(e){var f=e.term,g={results:[]},h=d?c(e):c;a.isArray(h)&&(a(h).each(function(){var a=this.text!==b,c=a?this.text:this;(""===f||e.matcher(f,c))&&g.results.push(a?this:{id:this,text:this})}),e.callback(g))}}function J(b,c){if(a.isFunction(b))return!0;if(!b)return!1;if("string"==typeof b)return!0;throw new Error(c+" must be a string, function, or falsy value")}function K(b,c){if(a.isFunction(b)){var d=Array.prototype.slice.call(arguments,2);return b.apply(c,d)}return b}function L(b){var c=0;return a.each(b,function(a,b){b.children?c+=L(b.children):c++}),c}function M(a,c,d,e){var h,i,j,k,l,f=a,g=!1;if(!e.createSearchChoice||!e.tokenSeparators||e.tokenSeparators.length<1)return b;for(;;){for(i=-1,j=0,k=e.tokenSeparators.length;k>j&&(l=e.tokenSeparators[j],i=a.indexOf(l),!(i>=0));j++);if(0>i)break;if(h=a.substring(0,i),a=a.substring(i+l.length),h.length>0&&(h=e.createSearchChoice.call(this,h,c),h!==b&&null!==h&&e.id(h)!==b&&null!==e.id(h))){for(g=!1,j=0,k=c.length;k>j;j++)if(r(e.id(h),e.id(c[j]))){g=!0;break}g||d(h)}}return f!==a?a:void 0}function N(){var b=this;a.each(arguments,function(a,c){b[c].remove(),b[c]=null})}function O(b,c){var d=function(){};return d.prototype=new b,d.prototype.constructor=d,d.prototype.parent=b.prototype,d.prototype=a.extend(d.prototype,c),d}if(window.Select2===b){var c,d,e,f,g,h,j,k,i={x:0,y:0},c={TAB:9,ENTER:13,ESC:27,SPACE:32,LEFT:37,UP:38,RIGHT:39,DOWN:40,SHIFT:16,CTRL:17,ALT:18,PAGE_UP:33,PAGE_DOWN:34,HOME:36,END:35,BACKSPACE:8,DELETE:46,isArrow:function(a){switch(a=a.which?a.which:a){case c.LEFT:case c.RIGHT:case c.UP:case c.DOWN:return!0}return!1},isControl:function(a){var b=a.which;switch(b){case c.SHIFT:case c.CTRL:case c.ALT:return!0}return a.metaKey?!0:!1},isFunctionKey:function(a){return a=a.which?a.which:a,a>=112&&123>=a}},l="
",m={"\u24b6":"A","\uff21":"A","\xc0":"A","\xc1":"A","\xc2":"A","\u1ea6":"A","\u1ea4":"A","\u1eaa":"A","\u1ea8":"A","\xc3":"A","\u0100":"A","\u0102":"A","\u1eb0":"A","\u1eae":"A","\u1eb4":"A","\u1eb2":"A","\u0226":"A","\u01e0":"A","\xc4":"A","\u01de":"A","\u1ea2":"A","\xc5":"A","\u01fa":"A","\u01cd":"A","\u0200":"A","\u0202":"A","\u1ea0":"A","\u1eac":"A","\u1eb6":"A","\u1e00":"A","\u0104":"A","\u023a":"A","\u2c6f":"A","\ua732":"AA","\xc6":"AE","\u01fc":"AE","\u01e2":"AE","\ua734":"AO","\ua736":"AU","\ua738":"AV","\ua73a":"AV","\ua73c":"AY","\u24b7":"B","\uff22":"B","\u1e02":"B","\u1e04":"B","\u1e06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24b8":"C","\uff23":"C","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\xc7":"C","\u1e08":"C","\u0187":"C","\u023b":"C","\ua73e":"C","\u24b9":"D","\uff24":"D","\u1e0a":"D","\u010e":"D","\u1e0c":"D","\u1e10":"D","\u1e12":"D","\u1e0e":"D","\u0110":"D","\u018b":"D","\u018a":"D","\u0189":"D","\ua779":"D","\u01f1":"DZ","\u01c4":"DZ","\u01f2":"Dz","\u01c5":"Dz","\u24ba":"E","\uff25":"E","\xc8":"E","\xc9":"E","\xca":"E","\u1ec0":"E","\u1ebe":"E","\u1ec4":"E","\u1ec2":"E","\u1ebc":"E","\u0112":"E","\u1e14":"E","\u1e16":"E","\u0114":"E","\u0116":"E","\xcb":"E","\u1eba":"E","\u011a":"E","\u0204":"E","\u0206":"E","\u1eb8":"E","\u1ec6":"E","\u0228":"E","\u1e1c":"E","\u0118":"E","\u1e18":"E","\u1e1a":"E","\u0190":"E","\u018e":"E","\u24bb":"F","\uff26":"F","\u1e1e":"F","\u0191":"F","\ua77b":"F","\u24bc":"G","\uff27":"G","\u01f4":"G","\u011c":"G","\u1e20":"G","\u011e":"G","\u0120":"G","\u01e6":"G","\u0122":"G","\u01e4":"G","\u0193":"G","\ua7a0":"G","\ua77d":"G","\ua77e":"G","\u24bd":"H","\uff28":"H","\u0124":"H","\u1e22":"H","\u1e26":"H","\u021e":"H","\u1e24":"H","\u1e28":"H","\u1e2a":"H","\u0126":"H","\u2c67":"H","\u2c75":"H","\ua78d":"H","\u24be":"I","\uff29":"I","\xcc":"I","\xcd":"I","\xce":"I","\u0128":"I","\u012a":"I","\u012c":"I","\u0130":"I","\xcf":"I","\u1e2e":"I","\u1ec8":"I","\u01cf":"I","\u0208":"I","\u020a":"I","\u1eca":"I","\u012e":"I","\u1e2c":"I","\u0197":"I","\u24bf":"J","\uff2a":"J","\u0134":"J","\u0248":"J","\u24c0":"K","\uff2b":"K","\u1e30":"K","\u01e8":"K","\u1e32":"K","\u0136":"K","\u1e34":"K","\u0198":"K","\u2c69":"K","\ua740":"K","\ua742":"K","\ua744":"K","\ua7a2":"K","\u24c1":"L","\uff2c":"L","\u013f":"L","\u0139":"L","\u013d":"L","\u1e36":"L","\u1e38":"L","\u013b":"L","\u1e3c":"L","\u1e3a":"L","\u0141":"L","\u023d":"L","\u2c62":"L","\u2c60":"L","\ua748":"L","\ua746":"L","\ua780":"L","\u01c7":"LJ","\u01c8":"Lj","\u24c2":"M","\uff2d":"M","\u1e3e":"M","\u1e40":"M","\u1e42":"M","\u2c6e":"M","\u019c":"M","\u24c3":"N","\uff2e":"N","\u01f8":"N","\u0143":"N","\xd1":"N","\u1e44":"N","\u0147":"N","\u1e46":"N","\u0145":"N","\u1e4a":"N","\u1e48":"N","\u0220":"N","\u019d":"N","\ua790":"N","\ua7a4":"N","\u01ca":"NJ","\u01cb":"Nj","\u24c4":"O","\uff2f":"O","\xd2":"O","\xd3":"O","\xd4":"O","\u1ed2":"O","\u1ed0":"O","\u1ed6":"O","\u1ed4":"O","\xd5":"O","\u1e4c":"O","\u022c":"O","\u1e4e":"O","\u014c":"O","\u1e50":"O","\u1e52":"O","\u014e":"O","\u022e":"O","\u0230":"O","\xd6":"O","\u022a":"O","\u1ece":"O","\u0150":"O","\u01d1":"O","\u020c":"O","\u020e":"O","\u01a0":"O","\u1edc":"O","\u1eda":"O","\u1ee0":"O","\u1ede":"O","\u1ee2":"O","\u1ecc":"O","\u1ed8":"O","\u01ea":"O","\u01ec":"O","\xd8":"O","\u01fe":"O","\u0186":"O","\u019f":"O","\ua74a":"O","\ua74c":"O","\u01a2":"OI","\ua74e":"OO","\u0222":"OU","\u24c5":"P","\uff30":"P","\u1e54":"P","\u1e56":"P","\u01a4":"P","\u2c63":"P","\ua750":"P","\ua752":"P","\ua754":"P","\u24c6":"Q","\uff31":"Q","\ua756":"Q","\ua758":"Q","\u024a":"Q","\u24c7":"R","\uff32":"R","\u0154":"R","\u1e58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1e5a":"R","\u1e5c":"R","\u0156":"R","\u1e5e":"R","\u024c":"R","\u2c64":"R","\ua75a":"R","\ua7a6":"R","\ua782":"R","\u24c8":"S","\uff33":"S","\u1e9e":"S","\u015a":"S","\u1e64":"S","\u015c":"S","\u1e60":"S","\u0160":"S","\u1e66":"S","\u1e62":"S","\u1e68":"S","\u0218":"S","\u015e":"S","\u2c7e":"S","\ua7a8":"S","\ua784":"S","\u24c9":"T","\uff34":"T","\u1e6a":"T","\u0164":"T","\u1e6c":"T","\u021a":"T","\u0162":"T","\u1e70":"T","\u1e6e":"T","\u0166":"T","\u01ac":"T","\u01ae":"T","\u023e":"T","\ua786":"T","\ua728":"TZ","\u24ca":"U","\uff35":"U","\xd9":"U","\xda":"U","\xdb":"U","\u0168":"U","\u1e78":"U","\u016a":"U","\u1e7a":"U","\u016c":"U","\xdc":"U","\u01db":"U","\u01d7":"U","\u01d5":"U","\u01d9":"U","\u1ee6":"U","\u016e":"U","\u0170":"U","\u01d3":"U","\u0214":"U","\u0216":"U","\u01af":"U","\u1eea":"U","\u1ee8":"U","\u1eee":"U","\u1eec":"U","\u1ef0":"U","\u1ee4":"U","\u1e72":"U","\u0172":"U","\u1e76":"U","\u1e74":"U","\u0244":"U","\u24cb":"V","\uff36":"V","\u1e7c":"V","\u1e7e":"V","\u01b2":"V","\ua75e":"V","\u0245":"V","\ua760":"VY","\u24cc":"W","\uff37":"W","\u1e80":"W","\u1e82":"W","\u0174":"W","\u1e86":"W","\u1e84":"W","\u1e88":"W","\u2c72":"W","\u24cd":"X","\uff38":"X","\u1e8a":"X","\u1e8c":"X","\u24ce":"Y","\uff39":"Y","\u1ef2":"Y","\xdd":"Y","\u0176":"Y","\u1ef8":"Y","\u0232":"Y","\u1e8e":"Y","\u0178":"Y","\u1ef6":"Y","\u1ef4":"Y","\u01b3":"Y","\u024e":"Y","\u1efe":"Y","\u24cf":"Z","\uff3a":"Z","\u0179":"Z","\u1e90":"Z","\u017b":"Z","\u017d":"Z","\u1e92":"Z","\u1e94":"Z","\u01b5":"Z","\u0224":"Z","\u2c7f":"Z","\u2c6b":"Z","\ua762":"Z","\u24d0":"a","\uff41":"a","\u1e9a":"a","\xe0":"a","\xe1":"a","\xe2":"a","\u1ea7":"a","\u1ea5":"a","\u1eab":"a","\u1ea9":"a","\xe3":"a","\u0101":"a","\u0103":"a","\u1eb1":"a","\u1eaf":"a","\u1eb5":"a","\u1eb3":"a","\u0227":"a","\u01e1":"a","\xe4":"a","\u01df":"a","\u1ea3":"a","\xe5":"a","\u01fb":"a","\u01ce":"a","\u0201":"a","\u0203":"a","\u1ea1":"a","\u1ead":"a","\u1eb7":"a","\u1e01":"a","\u0105":"a","\u2c65":"a","\u0250":"a","\ua733":"aa","\xe6":"ae","\u01fd":"ae","\u01e3":"ae","\ua735":"ao","\ua737":"au","\ua739":"av","\ua73b":"av","\ua73d":"ay","\u24d1":"b","\uff42":"b","\u1e03":"b","\u1e05":"b","\u1e07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24d2":"c","\uff43":"c","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\xe7":"c","\u1e09":"c","\u0188":"c","\u023c":"c","\ua73f":"c","\u2184":"c","\u24d3":"d","\uff44":"d","\u1e0b":"d","\u010f":"d","\u1e0d":"d","\u1e11":"d","\u1e13":"d","\u1e0f":"d","\u0111":"d","\u018c":"d","\u0256":"d","\u0257":"d","\ua77a":"d","\u01f3":"dz","\u01c6":"dz","\u24d4":"e","\uff45":"e","\xe8":"e","\xe9":"e","\xea":"e","\u1ec1":"e","\u1ebf":"e","\u1ec5":"e","\u1ec3":"e","\u1ebd":"e","\u0113":"e","\u1e15":"e","\u1e17":"e","\u0115":"e","\u0117":"e","\xeb":"e","\u1ebb":"e","\u011b":"e","\u0205":"e","\u0207":"e","\u1eb9":"e","\u1ec7":"e","\u0229":"e","\u1e1d":"e","\u0119":"e","\u1e19":"e","\u1e1b":"e","\u0247":"e","\u025b":"e","\u01dd":"e","\u24d5":"f","\uff46":"f","\u1e1f":"f","\u0192":"f","\ua77c":"f","\u24d6":"g","\uff47":"g","\u01f5":"g","\u011d":"g","\u1e21":"g","\u011f":"g","\u0121":"g","\u01e7":"g","\u0123":"g","\u01e5":"g","\u0260":"g","\ua7a1":"g","\u1d79":"g","\ua77f":"g","\u24d7":"h","\uff48":"h","\u0125":"h","\u1e23":"h","\u1e27":"h","\u021f":"h","\u1e25":"h","\u1e29":"h","\u1e2b":"h","\u1e96":"h","\u0127":"h","\u2c68":"h","\u2c76":"h","\u0265":"h","\u0195":"hv","\u24d8":"i","\uff49":"i","\xec":"i","\xed":"i","\xee":"i","\u0129":"i","\u012b":"i","\u012d":"i","\xef":"i","\u1e2f":"i","\u1ec9":"i","\u01d0":"i","\u0209":"i","\u020b":"i","\u1ecb":"i","\u012f":"i","\u1e2d":"i","\u0268":"i","\u0131":"i","\u24d9":"j","\uff4a":"j","\u0135":"j","\u01f0":"j","\u0249":"j","\u24da":"k","\uff4b":"k","\u1e31":"k","\u01e9":"k","\u1e33":"k","\u0137":"k","\u1e35":"k","\u0199":"k","\u2c6a":"k","\ua741":"k","\ua743":"k","\ua745":"k","\ua7a3":"k","\u24db":"l","\uff4c":"l","\u0140":"l","\u013a":"l","\u013e":"l","\u1e37":"l","\u1e39":"l","\u013c":"l","\u1e3d":"l","\u1e3b":"l","\u017f":"l","\u0142":"l","\u019a":"l","\u026b":"l","\u2c61":"l","\ua749":"l","\ua781":"l","\ua747":"l","\u01c9":"lj","\u24dc":"m","\uff4d":"m","\u1e3f":"m","\u1e41":"m","\u1e43":"m","\u0271":"m","\u026f":"m","\u24dd":"n","\uff4e":"n","\u01f9":"n","\u0144":"n","\xf1":"n","\u1e45":"n","\u0148":"n","\u1e47":"n","\u0146":"n","\u1e4b":"n","\u1e49":"n","\u019e":"n","\u0272":"n","\u0149":"n","\ua791":"n","\ua7a5":"n","\u01cc":"nj","\u24de":"o","\uff4f":"o","\xf2":"o","\xf3":"o","\xf4":"o","\u1ed3":"o","\u1ed1":"o","\u1ed7":"o","\u1ed5":"o","\xf5":"o","\u1e4d":"o","\u022d":"o","\u1e4f":"o","\u014d":"o","\u1e51":"o","\u1e53":"o","\u014f":"o","\u022f":"o","\u0231":"o","\xf6":"o","\u022b":"o","\u1ecf":"o","\u0151":"o","\u01d2":"o","\u020d":"o","\u020f":"o","\u01a1":"o","\u1edd":"o","\u1edb":"o","\u1ee1":"o","\u1edf":"o","\u1ee3":"o","\u1ecd":"o","\u1ed9":"o","\u01eb":"o","\u01ed":"o","\xf8":"o","\u01ff":"o","\u0254":"o","\ua74b":"o","\ua74d":"o","\u0275":"o","\u01a3":"oi","\u0223":"ou","\ua74f":"oo","\u24df":"p","\uff50":"p","\u1e55":"p","\u1e57":"p","\u01a5":"p","\u1d7d":"p","\ua751":"p","\ua753":"p","\ua755":"p","\u24e0":"q","\uff51":"q","\u024b":"q","\ua757":"q","\ua759":"q","\u24e1":"r","\uff52":"r","\u0155":"r","\u1e59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1e5b":"r","\u1e5d":"r","\u0157":"r","\u1e5f":"r","\u024d":"r","\u027d":"r","\ua75b":"r","\ua7a7":"r","\ua783":"r","\u24e2":"s","\uff53":"s","\xdf":"s","\u015b":"s","\u1e65":"s","\u015d":"s","\u1e61":"s","\u0161":"s","\u1e67":"s","\u1e63":"s","\u1e69":"s","\u0219":"s","\u015f":"s","\u023f":"s","\ua7a9":"s","\ua785":"s","\u1e9b":"s","\u24e3":"t","\uff54":"t","\u1e6b":"t","\u1e97":"t","\u0165":"t","\u1e6d":"t","\u021b":"t","\u0163":"t","\u1e71":"t","\u1e6f":"t","\u0167":"t","\u01ad":"t","\u0288":"t","\u2c66":"t","\ua787":"t","\ua729":"tz","\u24e4":"u","\uff55":"u","\xf9":"u","\xfa":"u","\xfb":"u","\u0169":"u","\u1e79":"u","\u016b":"u","\u1e7b":"u","\u016d":"u","\xfc":"u","\u01dc":"u","\u01d8":"u","\u01d6":"u","\u01da":"u","\u1ee7":"u","\u016f":"u","\u0171":"u","\u01d4":"u","\u0215":"u","\u0217":"u","\u01b0":"u","\u1eeb":"u","\u1ee9":"u","\u1eef":"u","\u1eed":"u","\u1ef1":"u","\u1ee5":"u","\u1e73":"u","\u0173":"u","\u1e77":"u","\u1e75":"u","\u0289":"u","\u24e5":"v","\uff56":"v","\u1e7d":"v","\u1e7f":"v","\u028b":"v","\ua75f":"v","\u028c":"v","\ua761":"vy","\u24e6":"w","\uff57":"w","\u1e81":"w","\u1e83":"w","\u0175":"w","\u1e87":"w","\u1e85":"w","\u1e98":"w","\u1e89":"w","\u2c73":"w","\u24e7":"x","\uff58":"x","\u1e8b":"x","\u1e8d":"x","\u24e8":"y","\uff59":"y","\u1ef3":"y","\xfd":"y","\u0177":"y","\u1ef9":"y","\u0233":"y","\u1e8f":"y","\xff":"y","\u1ef7":"y","\u1e99":"y","\u1ef5":"y","\u01b4":"y","\u024f":"y","\u1eff":"y","\u24e9":"z","\uff5a":"z","\u017a":"z","\u1e91":"z","\u017c":"z","\u017e":"z","\u1e93":"z","\u1e95":"z","\u01b6":"z","\u0225":"z","\u0240":"z","\u2c6c":"z","\ua763":"z","\u0386":"\u0391","\u0388":"\u0395","\u0389":"\u0397","\u038a":"\u0399","\u03aa":"\u0399","\u038c":"\u039f","\u038e":"\u03a5","\u03ab":"\u03a5","\u038f":"\u03a9","\u03ac":"\u03b1","\u03ad":"\u03b5","\u03ae":"\u03b7","\u03af":"\u03b9","\u03ca":"\u03b9","\u0390":"\u03b9","\u03cc":"\u03bf","\u03cd":"\u03c5","\u03cb":"\u03c5","\u03b0":"\u03c5","\u03c9":"\u03c9","\u03c2":"\u03c3"};j=a(document),g=function(){var a=1;return function(){return a++}}(),d=O(Object,{bind:function(a){var b=this;return function(){a.apply(b,arguments)}},init:function(c){var d,e,f=".select2-results";this.opts=c=this.prepareOpts(c),this.id=c.id,c.element.data("select2")!==b&&null!==c.element.data("select2")&&c.element.data("select2").destroy(),this.container=this.createContainer(),this.liveRegion=a("",{role:"status","aria-live":"polite"}).addClass("select2-hidden-accessible").appendTo(document.body),this.containerId="s2id_"+(c.element.attr("id")||"autogen"+g()),this.containerEventName=this.containerId.replace(/([.])/g,"_").replace(/([;&,\-\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g,"\\$1"),this.container.attr("id",this.containerId),this.container.attr("title",c.element.attr("title")),this.body=a("body"),D(this.container,this.opts.element,this.opts.adaptContainerCssClass),this.container.attr("style",c.element.attr("style")),this.container.css(K(c.containerCss,this.opts.element)),this.container.addClass(K(c.containerCssClass,this.opts.element)),this.elementTabIndex=this.opts.element.attr("tabindex"),this.opts.element.data("select2",this).attr("tabindex","-1").before(this.container).on("click.select2",A),this.container.data("select2",this),this.dropdown=this.container.find(".select2-drop"),D(this.dropdown,this.opts.element,this.opts.adaptDropdownCssClass),this.dropdown.addClass(K(c.dropdownCssClass,this.opts.element)),this.dropdown.data("select2",this),this.dropdown.on("click",A),this.results=d=this.container.find(f),this.search=e=this.container.find("input.select2-input"),this.queryCount=0,this.resultsPage=0,this.context=null,this.initContainer(),this.container.on("click",A),v(this.results),this.dropdown.on("mousemove-filtered",f,this.bind(this.highlightUnderEvent)),this.dropdown.on("touchstart touchmove touchend",f,this.bind(function(a){this._touchEvent=!0,this.highlightUnderEvent(a)})),this.dropdown.on("touchmove",f,this.bind(this.touchMoved)),this.dropdown.on("touchstart touchend",f,this.bind(this.clearTouchMoved)),this.dropdown.on("click",this.bind(function(){this._touchEvent&&(this._touchEvent=!1,this.selectHighlighted())})),x(80,this.results),this.dropdown.on("scroll-debounced",f,this.bind(this.loadMoreIfNeeded)),a(this.container).on("change",".select2-input",function(a){a.stopPropagation()}),a(this.dropdown).on("change",".select2-input",function(a){a.stopPropagation()}),a.fn.mousewheel&&d.mousewheel(function(a,b,c,e){var f=d.scrollTop();e>0&&0>=f-e?(d.scrollTop(0),A(a)):0>e&&d.get(0).scrollHeight-d.scrollTop()+e<=d.height()&&(d.scrollTop(d.get(0).scrollHeight-d.height()),A(a))}),u(e),e.on("keyup-change input paste",this.bind(this.updateResults)),e.on("focus",function(){e.addClass("select2-focused")}),e.on("blur",function(){e.removeClass("select2-focused")}),this.dropdown.on("mouseup",f,this.bind(function(b){a(b.target).closest(".select2-result-selectable").length>0&&(this.highlightUnderEvent(b),this.selectHighlighted(b))})),this.dropdown.on("click mouseup mousedown touchstart touchend focusin",function(a){a.stopPropagation()}),this.nextSearchTerm=b,a.isFunction(this.opts.initSelection)&&(this.initSelection(),this.monitorSource()),null!==c.maximumInputLength&&this.search.attr("maxlength",c.maximumInputLength);var h=c.element.prop("disabled");h===b&&(h=!1),this.enable(!h);var i=c.element.prop("readonly");i===b&&(i=!1),this.readonly(i),k=k||q(),this.autofocus=c.element.prop("autofocus"),c.element.prop("autofocus",!1),this.autofocus&&this.focus(),this.search.attr("placeholder",c.searchInputPlaceholder)},destroy:function(){var a=this.opts.element,c=a.data("select2"),d=this;this.close(),a.length&&a[0].detachEvent&&a.each(function(){this.detachEvent("onpropertychange",d._sync)}),this.propertyObserver&&(this.propertyObserver.disconnect(),this.propertyObserver=null),this._sync=null,c!==b&&(c.container.remove(),c.liveRegion.remove(),c.dropdown.remove(),a.removeClass("select2-offscreen").removeData("select2").off(".select2").prop("autofocus",this.autofocus||!1),this.elementTabIndex?a.attr({tabindex:this.elementTabIndex}):a.removeAttr("tabindex"),a.show()),N.call(this,"container","liveRegion","dropdown","results","search")},optionToData:function(a){return a.is("option")?{id:a.prop("value"),text:a.text(),element:a.get(),css:a.attr("class"),disabled:a.prop("disabled"),locked:r(a.attr("locked"),"locked")||r(a.data("locked"),!0)}:a.is("optgroup")?{text:a.attr("label"),children:[],element:a.get(),css:a.attr("class")}:void 0},prepareOpts:function(c){var d,e,f,h,i=this;if(d=c.element,"select"===d.get(0).tagName.toLowerCase()&&(this.select=e=c.element),e&&a.each(["id","multiple","ajax","query","createSearchChoice","initSelection","data","tags"],function(){if(this in c)throw new Error("Option '"+this+"' is not allowed for Select2 when attached to a element.")}),c=a.extend({},{populateResults:function(d,e,f){var h,j=this.opts.id,k=this.liveRegion;h=function(d,e,l){var m,n,o,p,q,r,s,t,u,v;d=c.sortResults(d,e,f);var w=[];for(m=0,n=d.length;n>m;m+=1)o=d[m],q=o.disabled===!0,p=!q&&j(o)!==b,r=o.children&&o.children.length>0,s=a(" "),s.addClass("select2-results-dept-"+l),s.addClass("select2-result"),s.addClass(p?"select2-result-selectable":"select2-result-unselectable"),q&&s.addClass("select2-disabled"),r&&s.addClass("select2-result-with-children"),s.addClass(i.opts.formatResultCssClass(o)),s.attr("role","presentation"),t=a(document.createElement("div")),t.addClass("select2-result-label"),t.attr("id","select2-result-label-"+g()),t.attr("role","option"),v=c.formatResult(o,t,f,i.opts.escapeMarkup),v!==b&&(t.html(v),s.append(t)),r&&(u=a(""),u.addClass("select2-result-sub"),h(o.children,u,l+1),s.append(u)),s.data("select2-data",o),w.push(s[0]);e.append(w),k.text(c.formatMatches(d.length))},h(e,d,0)}},a.fn.select2.defaults,c),"function"!=typeof c.id&&(f=c.id,c.id=function(a){return a[f]}),a.isArray(c.element.data("select2Tags"))){if("tags"in c)throw"tags specified as both an attribute 'data-select2-tags' and in options of Select2 "+c.element.attr("id");c.tags=c.element.data("select2Tags")}if(e?(c.query=this.bind(function(a){var f,g,h,c={results:[],more:!1},e=a.term;h=function(b,c){var d;b.is("option")?a.matcher(e,b.text(),b)&&c.push(i.optionToData(b)):b.is("optgroup")&&(d=i.optionToData(b),b.children().each2(function(a,b){h(b,d.children)}),d.children.length>0&&c.push(d))},f=d.children(),this.getPlaceholder()!==b&&f.length>0&&(g=this.getPlaceholderOption(),g&&(f=f.not(g))),f.each2(function(a,b){h(b,c.results)}),a.callback(c)}),c.id=function(a){return a.id}):"query"in c||("ajax"in c?(h=c.element.data("ajax-url"),h&&h.length>0&&(c.ajax.url=h),c.query=G.call(c.element,c.ajax)):"data"in c?c.query=H(c.data):"tags"in c&&(c.query=I(c.tags),c.createSearchChoice===b&&(c.createSearchChoice=function(b){return{id:a.trim(b),text:a.trim(b)}}),c.initSelection===b&&(c.initSelection=function(b,d){var e=[];a(s(b.val(),c.separator)).each(function(){var b={id:this,text:this},d=c.tags;a.isFunction(d)&&(d=d()),a(d).each(function(){return r(this.id,b.id)?(b=this,!1):void 0}),e.push(b)}),d(e)}))),"function"!=typeof c.query)throw"query function not defined for Select2 "+c.element.attr("id");if("top"===c.createSearchChoicePosition)c.createSearchChoicePosition=function(a,b){a.unshift(b)};else if("bottom"===c.createSearchChoicePosition)c.createSearchChoicePosition=function(a,b){a.push(b)};else if("function"!=typeof c.createSearchChoicePosition)throw"invalid createSearchChoicePosition option must be 'top', 'bottom' or a custom function";return c},monitorSource:function(){var d,c=this.opts.element,e=this;c.on("change.select2",this.bind(function(){this.opts.element.data("select2-change-triggered")!==!0&&this.initSelection()})),this._sync=this.bind(function(){var a=c.prop("disabled");a===b&&(a=!1),this.enable(!a);var d=c.prop("readonly");d===b&&(d=!1),this.readonly(d),D(this.container,this.opts.element,this.opts.adaptContainerCssClass),this.container.addClass(K(this.opts.containerCssClass,this.opts.element)),D(this.dropdown,this.opts.element,this.opts.adaptDropdownCssClass),this.dropdown.addClass(K(this.opts.dropdownCssClass,this.opts.element))}),c.length&&c[0].attachEvent&&c.each(function(){this.attachEvent("onpropertychange",e._sync)}),d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,d!==b&&(this.propertyObserver&&(delete this.propertyObserver,this.propertyObserver=null),this.propertyObserver=new d(function(b){a.each(b,e._sync)}),this.propertyObserver.observe(c.get(0),{attributes:!0,subtree:!1}))},triggerSelect:function(b){var c=a.Event("select2-selecting",{val:this.id(b),object:b,choice:b});return this.opts.element.trigger(c),!c.isDefaultPrevented()},triggerChange:function(b){b=b||{},b=a.extend({},b,{type:"change",val:this.val()}),this.opts.element.data("select2-change-triggered",!0),this.opts.element.trigger(b),this.opts.element.data("select2-change-triggered",!1),this.opts.element.click(),this.opts.blurOnChange&&this.opts.element.blur()},isInterfaceEnabled:function(){return this.enabledInterface===!0},enableInterface:function(){var a=this._enabled&&!this._readonly,b=!a;return a===this.enabledInterface?!1:(this.container.toggleClass("select2-container-disabled",b),this.close(),this.enabledInterface=a,!0)},enable:function(a){a===b&&(a=!0),this._enabled!==a&&(this._enabled=a,this.opts.element.prop("disabled",!a),this.enableInterface())},disable:function(){this.enable(!1)},readonly:function(a){a===b&&(a=!1),this._readonly!==a&&(this._readonly=a,this.opts.element.prop("readonly",a),this.enableInterface())},opened:function(){return this.container?this.container.hasClass("select2-dropdown-open"):!1},positionDropdown:function(){var t,u,v,w,x,b=this.dropdown,c=this.container.offset(),d=this.container.outerHeight(!1),e=this.container.outerWidth(!1),f=b.outerHeight(!1),g=a(window),h=g.width(),i=g.height(),j=g.scrollLeft()+h,l=g.scrollTop()+i,m=c.top+d,n=c.left,o=l>=m+f,p=c.top-f>=g.scrollTop(),q=b.outerWidth(!1),r=j>=n+q,s=b.hasClass("select2-drop-above");s?(u=!0,!p&&o&&(v=!0,u=!1)):(u=!1,!o&&p&&(v=!0,u=!0)),v&&(b.hide(),c=this.container.offset(),d=this.container.outerHeight(!1),e=this.container.outerWidth(!1),f=b.outerHeight(!1),j=g.scrollLeft()+h,l=g.scrollTop()+i,m=c.top+d,n=c.left,q=b.outerWidth(!1),r=j>=n+q,b.show(),this.focusSearch()),this.opts.dropdownAutoWidth?(x=a(".select2-results",b)[0],b.addClass("select2-drop-auto-width"),b.css("width",""),q=b.outerWidth(!1)+(x.scrollHeight===x.clientHeight?0:k.width),q>e?e=q:q=e,f=b.outerHeight(!1),r=j>=n+q):this.container.removeClass("select2-drop-auto-width"),"static"!==this.body.css("position")&&(t=this.body.offset(),m-=t.top,n-=t.left),r||(n=c.left+this.container.outerWidth(!1)-q),w={left:n,width:e},u?(w.top=c.top-f,w.bottom="auto",this.container.addClass("select2-drop-above"),b.addClass("select2-drop-above")):(w.top=m,w.bottom="auto",this.container.removeClass("select2-drop-above"),b.removeClass("select2-drop-above")),w=a.extend(w,K(this.opts.dropdownCss,this.opts.element)),b.css(w)},shouldOpen:function(){var b;return this.opened()?!1:this._enabled===!1||this._readonly===!0?!1:(b=a.Event("select2-opening"),this.opts.element.trigger(b),!b.isDefaultPrevented())},clearDropdownAlignmentPreference:function(){this.container.removeClass("select2-drop-above"),this.dropdown.removeClass("select2-drop-above")},open:function(){return this.shouldOpen()?(this.opening(),j.on("mousemove.select2Event",function(a){i.x=a.pageX,i.y=a.pageY}),!0):!1},opening:function(){var f,b=this.containerEventName,c="scroll."+b,d="resize."+b,e="orientationchange."+b;this.container.addClass("select2-dropdown-open").addClass("select2-container-active"),this.clearDropdownAlignmentPreference(),this.dropdown[0]!==this.body.children().last()[0]&&this.dropdown.detach().appendTo(this.body),f=a("#select2-drop-mask"),0==f.length&&(f=a(document.createElement("div")),f.attr("id","select2-drop-mask").attr("class","select2-drop-mask"),f.hide(),f.appendTo(this.body),f.on("mousedown touchstart click",function(b){n(f);var d,c=a("#select2-drop");c.length>0&&(d=c.data("select2"),d.opts.selectOnBlur&&d.selectHighlighted({noFocus:!0}),d.close(),b.preventDefault(),b.stopPropagation())})),this.dropdown.prev()[0]!==f[0]&&this.dropdown.before(f),a("#select2-drop").removeAttr("id"),this.dropdown.attr("id","select2-drop"),f.show(),this.positionDropdown(),this.dropdown.show(),this.positionDropdown(),this.dropdown.addClass("select2-drop-active");var g=this;this.container.parents().add(window).each(function(){a(this).on(d+" "+c+" "+e,function(){g.opened()&&g.positionDropdown()})})},close:function(){if(this.opened()){var b=this.containerEventName,c="scroll."+b,d="resize."+b,e="orientationchange."+b;this.container.parents().add(window).each(function(){a(this).off(c).off(d).off(e)}),this.clearDropdownAlignmentPreference(),a("#select2-drop-mask").hide(),this.dropdown.removeAttr("id"),this.dropdown.hide(),this.container.removeClass("select2-dropdown-open").removeClass("select2-container-active"),this.results.empty(),j.off("mousemove.select2Event"),this.clearSearch(),this.search.removeClass("select2-active"),this.opts.element.trigger(a.Event("select2-close"))}},externalSearch:function(a){this.open(),this.search.val(a),this.updateResults(!1)},clearSearch:function(){},getMaximumSelectionSize:function(){return K(this.opts.maximumSelectionSize,this.opts.element)},ensureHighlightVisible:function(){var c,d,e,f,g,h,i,j,b=this.results;if(d=this.highlight(),!(0>d)){if(0==d)return b.scrollTop(0),void 0;c=this.findHighlightableChoices().find(".select2-result-label"),e=a(c[d]),j=(e.offset()||{}).top||0,f=j+e.outerHeight(!0),d===c.length-1&&(i=b.find("li.select2-more-results"),i.length>0&&(f=i.offset().top+i.outerHeight(!0))),g=b.offset().top+b.outerHeight(!0),f>g&&b.scrollTop(b.scrollTop()+(f-g)),h=j-b.offset().top,0>h&&"none"!=e.css("display")&&b.scrollTop(b.scrollTop()+h)}},findHighlightableChoices:function(){return this.results.find(".select2-result-selectable:not(.select2-disabled):not(.select2-selected)")},moveHighlight:function(b){for(var c=this.findHighlightableChoices(),d=this.highlight();d>-1&&d=c.length&&(b=c.length-1),0>b&&(b=0),this.removeHighlight(),d=a(c[b]),d.addClass("select2-highlighted"),this.search.attr("aria-activedescendant",d.find(".select2-result-label").attr("id")),this.ensureHighlightVisible(),this.liveRegion.text(d.text()),e=d.data("select2-data"),e&&this.opts.element.trigger({type:"select2-highlight",val:this.id(e),choice:e}),void 0)},removeHighlight:function(){this.results.find(".select2-highlighted").removeClass("select2-highlighted")},touchMoved:function(){this._touchMoved=!0},clearTouchMoved:function(){this._touchMoved=!1},countSelectableResults:function(){return this.findHighlightableChoices().length},highlightUnderEvent:function(b){var c=a(b.target).closest(".select2-result-selectable");if(c.length>0&&!c.is(".select2-highlighted")){var d=this.findHighlightableChoices();this.highlight(d.index(c))}else 0==c.length&&this.removeHighlight()},loadMoreIfNeeded:function(){var c,a=this.results,b=a.find("li.select2-more-results"),d=this.resultsPage+1,e=this,f=this.search.val(),g=this.context;0!==b.length&&(c=b.offset().top-a.offset().top-a.height(),c<=this.opts.loadMorePadding&&(b.addClass("select2-active"),this.opts.query({element:this.opts.element,term:f,page:d,context:g,matcher:this.opts.matcher,callback:this.bind(function(c){e.opened()&&(e.opts.populateResults.call(this,a,c.results,{term:f,page:d,context:g}),e.postprocessResults(c,!1,!1),c.more===!0?(b.detach().appendTo(a).text(K(e.opts.formatLoadMore,e.opts.element,d+1)),window.setTimeout(function(){e.loadMoreIfNeeded()},10)):b.remove(),e.positionDropdown(),e.resultsPage=d,e.context=c.context,this.opts.element.trigger({type:"select2-loaded",items:c}))})})))},tokenize:function(){},updateResults:function(c){function m(){d.removeClass("select2-active"),h.positionDropdown(),e.find(".select2-no-results,.select2-selection-limit,.select2-searching").length?h.liveRegion.text(e.text()):h.liveRegion.text(h.opts.formatMatches(e.find(".select2-result-selectable").length))}function n(a){e.html(a),m()}var g,i,l,d=this.search,e=this.results,f=this.opts,h=this,j=d.val(),k=a.data(this.container,"select2-last-term");if((c===!0||!k||!r(j,k))&&(a.data(this.container,"select2-last-term",j),c===!0||this.showSearchInput!==!1&&this.opened())){l=++this.queryCount;var o=this.getMaximumSelectionSize();if(o>=1&&(g=this.data(),a.isArray(g)&&g.length>=o&&J(f.formatSelectionTooBig,"formatSelectionTooBig")))return n(""+K(f.formatSelectionTooBig,f.element,o)+" "),void 0;if(d.val().length"+K(f.formatInputTooShort,f.element,d.val(),f.minimumInputLength)+""):n(""),c&&this.showSearch&&this.showSearch(!0),void 0;if(f.maximumInputLength&&d.val().length>f.maximumInputLength)return J(f.formatInputTooLong,"formatInputTooLong")?n(""+K(f.formatInputTooLong,f.element,d.val(),f.maximumInputLength)+" "):n(""),void 0;f.formatSearching&&0===this.findHighlightableChoices().length&&n(""+K(f.formatSearching,f.element)+" "),d.addClass("select2-active"),this.removeHighlight(),i=this.tokenize(),i!=b&&null!=i&&d.val(i),this.resultsPage=1,f.query({element:f.element,term:d.val(),page:this.resultsPage,context:null,matcher:f.matcher,callback:this.bind(function(g){var i;if(l==this.queryCount){if(!this.opened())return this.search.removeClass("select2-active"),void 0;if(g.hasError!==b&&J(f.formatAjaxError,"formatAjaxError"))return n(""+K(f.formatAjaxError,f.element,g.jqXHR,g.textStatus,g.errorThrown)+" "),void 0;if(this.context=g.context===b?null:g.context,this.opts.createSearchChoice&&""!==d.val()&&(i=this.opts.createSearchChoice.call(h,d.val(),g.results),i!==b&&null!==i&&h.id(i)!==b&&null!==h.id(i)&&0===a(g.results).filter(function(){return r(h.id(this),h.id(i))}).length&&this.opts.createSearchChoicePosition(g.results,i)),0===g.results.length&&J(f.formatNoMatches,"formatNoMatches"))return n(""+K(f.formatNoMatches,f.element,d.val())+" "),void 0;e.empty(),h.opts.populateResults.call(this,e,g.results,{term:d.val(),page:this.resultsPage,context:null}),g.more===!0&&J(f.formatLoadMore,"formatLoadMore")&&(e.append(""+f.escapeMarkup(K(f.formatLoadMore,f.element,this.resultsPage))+" "),window.setTimeout(function(){h.loadMoreIfNeeded()},10)),this.postprocessResults(g,c),m(),this.opts.element.trigger({type:"select2-loaded",items:g})}})})}},cancel:function(){this.close()},blur:function(){this.opts.selectOnBlur&&this.selectHighlighted({noFocus:!0}),this.close(),this.container.removeClass("select2-container-active"),this.search[0]===document.activeElement&&this.search.blur(),this.clearSearch(),this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus")},focusSearch:function(){y(this.search)},selectHighlighted:function(a){if(this._touchMoved)return this.clearTouchMoved(),void 0;var b=this.highlight(),c=this.results.find(".select2-highlighted"),d=c.closest(".select2-result").data("select2-data");d?(this.highlight(b),this.onSelect(d,a)):a&&a.noFocus&&this.close()},getPlaceholder:function(){var a;return this.opts.element.attr("placeholder")||this.opts.element.attr("data-placeholder")||this.opts.element.data("placeholder")||this.opts.placeholder||((a=this.getPlaceholderOption())!==b?a.text():b)},getPlaceholderOption:function(){if(this.select){var c=this.select.children("option").first();if(this.opts.placeholderOption!==b)return"first"===this.opts.placeholderOption&&c||"function"==typeof this.opts.placeholderOption&&this.opts.placeholderOption(this.select);if(""===a.trim(c.text())&&""===c.val())return c}},initContainerWidth:function(){function c(){var c,d,e,f,g,h;if("off"===this.opts.width)return null;if("element"===this.opts.width)return 0===this.opts.element.outerWidth(!1)?"auto":this.opts.element.outerWidth(!1)+"px";if("copy"===this.opts.width||"resolve"===this.opts.width){if(c=this.opts.element.attr("style"),c!==b)for(d=c.split(";"),f=0,g=d.length;g>f;f+=1)if(h=d[f].replace(/\s/g,""),e=h.match(/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i),null!==e&&e.length>=1)return e[1];return"resolve"===this.opts.width?(c=this.opts.element.css("width"),c.indexOf("%")>0?c:0===this.opts.element.outerWidth(!1)?"auto":this.opts.element.outerWidth(!1)+"px"):null}return a.isFunction(this.opts.width)?this.opts.width():this.opts.width}var d=c.call(this);null!==d&&this.container.css("width",d)}}),e=O(d,{createContainer:function(){var b=a(document.createElement("div")).attr({"class":"select2-container"}).html([""," "," "," "," "," ",""].join(""));return b},enableInterface:function(){this.parent.enableInterface.apply(this,arguments)&&this.focusser.prop("disabled",!this.isInterfaceEnabled())},opening:function(){var c,d,e;this.opts.minimumResultsForSearch>=0&&this.showSearch(!0),this.parent.opening.apply(this,arguments),this.showSearchInput!==!1&&this.search.val(this.focusser.val()),this.opts.shouldFocusInput(this)&&(this.search.focus(),c=this.search.get(0),c.createTextRange?(d=c.createTextRange(),d.collapse(!1),d.select()):c.setSelectionRange&&(e=this.search.val().length,c.setSelectionRange(e,e))),""===this.search.val()&&this.nextSearchTerm!=b&&(this.search.val(this.nextSearchTerm),this.search.select()),this.focusser.prop("disabled",!0).val(""),this.updateResults(!0),this.opts.element.trigger(a.Event("select2-open"))},close:function(){this.opened()&&(this.parent.close.apply(this,arguments),this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus())},focus:function(){this.opened()?this.close():(this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus())},isFocused:function(){return this.container.hasClass("select2-container-active")},cancel:function(){this.parent.cancel.apply(this,arguments),this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus()},destroy:function(){a("label[for='"+this.focusser.attr("id")+"']").attr("for",this.opts.element.attr("id")),this.parent.destroy.apply(this,arguments),N.call(this,"selection","focusser")},initContainer:function(){var b,h,d=this.container,e=this.dropdown,f=g();this.opts.minimumResultsForSearch<0?this.showSearch(!1):this.showSearch(!0),this.selection=b=d.find(".select2-choice"),this.focusser=d.find(".select2-focusser"),b.find(".select2-chosen").attr("id","select2-chosen-"+f),this.focusser.attr("aria-labelledby","select2-chosen-"+f),this.results.attr("id","select2-results-"+f),this.search.attr("aria-owns","select2-results-"+f),this.focusser.attr("id","s2id_autogen"+f),h=a("label[for='"+this.opts.element.attr("id")+"']"),this.focusser.prev().text(h.text()).attr("for",this.focusser.attr("id"));var i=this.opts.element.attr("title");this.opts.element.attr("title",i||h.text()),this.focusser.attr("tabindex",this.elementTabIndex),this.search.attr("id",this.focusser.attr("id")+"_search"),this.search.prev().text(a("label[for='"+this.focusser.attr("id")+"']").text()).attr("for",this.search.attr("id")),this.search.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()&&229!=a.keyCode){if(a.which===c.PAGE_UP||a.which===c.PAGE_DOWN)return A(a),void 0;switch(a.which){case c.UP:case c.DOWN:return this.moveHighlight(a.which===c.UP?-1:1),A(a),void 0;case c.ENTER:return this.selectHighlighted(),A(a),void 0;case c.TAB:return this.selectHighlighted({noFocus:!0}),void 0;case c.ESC:return this.cancel(a),A(a),void 0}}})),this.search.on("blur",this.bind(function(){document.activeElement===this.body.get(0)&&window.setTimeout(this.bind(function(){this.opened()&&this.search.focus()}),0)})),this.focusser.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()&&a.which!==c.TAB&&!c.isControl(a)&&!c.isFunctionKey(a)&&a.which!==c.ESC){if(this.opts.openOnEnter===!1&&a.which===c.ENTER)return A(a),void 0;if(a.which==c.DOWN||a.which==c.UP||a.which==c.ENTER&&this.opts.openOnEnter){if(a.altKey||a.ctrlKey||a.shiftKey||a.metaKey)return;return this.open(),A(a),void 0}return a.which==c.DELETE||a.which==c.BACKSPACE?(this.opts.allowClear&&this.clear(),A(a),void 0):void 0}})),u(this.focusser),this.focusser.on("keyup-change input",this.bind(function(a){if(this.opts.minimumResultsForSearch>=0){if(a.stopPropagation(),this.opened())return;this.open()}})),b.on("mousedown touchstart","abbr",this.bind(function(a){this.isInterfaceEnabled()&&(this.clear(),B(a),this.close(),this.selection.focus())})),b.on("mousedown touchstart",this.bind(function(c){n(b),this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.opened()?this.close():this.isInterfaceEnabled()&&this.open(),A(c)})),e.on("mousedown touchstart",this.bind(function(){this.opts.shouldFocusInput(this)&&this.search.focus()})),b.on("focus",this.bind(function(a){A(a)})),this.focusser.on("focus",this.bind(function(){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active")})).on("blur",this.bind(function(){this.opened()||(this.container.removeClass("select2-container-active"),this.opts.element.trigger(a.Event("select2-blur")))})),this.search.on("focus",this.bind(function(){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active")})),this.initContainerWidth(),this.opts.element.addClass("select2-offscreen"),this.setPlaceholder()},clear:function(b){var c=this.selection.data("select2-data");if(c){var d=a.Event("select2-clearing");if(this.opts.element.trigger(d),d.isDefaultPrevented())return;var e=this.getPlaceholderOption();this.opts.element.val(e?e.val():""),this.selection.find(".select2-chosen").empty(),this.selection.removeData("select2-data"),this.setPlaceholder(),b!==!1&&(this.opts.element.trigger({type:"select2-removed",val:this.id(c),choice:c}),this.triggerChange({removed:c}))}},initSelection:function(){if(this.isPlaceholderOptionSelected())this.updateSelection(null),this.close(),this.setPlaceholder();else{var c=this;this.opts.initSelection.call(null,this.opts.element,function(a){a!==b&&null!==a&&(c.updateSelection(a),c.close(),c.setPlaceholder(),c.nextSearchTerm=c.opts.nextSearchTerm(a,c.search.val()))})}},isPlaceholderOptionSelected:function(){var a;return this.getPlaceholder()===b?!1:(a=this.getPlaceholderOption())!==b&&a.prop("selected")||""===this.opts.element.val()||this.opts.element.val()===b||null===this.opts.element.val()},prepareOpts:function(){var b=this.parent.prepareOpts.apply(this,arguments),c=this;return"select"===b.element.get(0).tagName.toLowerCase()?b.initSelection=function(a,b){var d=a.find("option").filter(function(){return this.selected&&!this.disabled});b(c.optionToData(d))}:"data"in b&&(b.initSelection=b.initSelection||function(c,d){var e=c.val(),f=null;b.query({matcher:function(a,c,d){var g=r(e,b.id(d));return g&&(f=d),g},callback:a.isFunction(d)?function(){d(f)}:a.noop})}),b},getPlaceholder:function(){return this.select&&this.getPlaceholderOption()===b?b:this.parent.getPlaceholder.apply(this,arguments)},setPlaceholder:function(){var a=this.getPlaceholder();if(this.isPlaceholderOptionSelected()&&a!==b){if(this.select&&this.getPlaceholderOption()===b)return;this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(a)),this.selection.addClass("select2-default"),this.container.removeClass("select2-allowclear")}},postprocessResults:function(a,b,c){var d=0,e=this;if(this.findHighlightableChoices().each2(function(a,b){return r(e.id(b.data("select2-data")),e.opts.element.val())?(d=a,!1):void 0}),c!==!1&&(b===!0&&d>=0?this.highlight(d):this.highlight(0)),b===!0){var g=this.opts.minimumResultsForSearch;g>=0&&this.showSearch(L(a.results)>=g)}},showSearch:function(b){this.showSearchInput!==b&&(this.showSearchInput=b,this.dropdown.find(".select2-search").toggleClass("select2-search-hidden",!b),this.dropdown.find(".select2-search").toggleClass("select2-offscreen",!b),a(this.dropdown,this.container).toggleClass("select2-with-searchbox",b))},onSelect:function(a,b){if(this.triggerSelect(a)){var c=this.opts.element.val(),d=this.data();this.opts.element.val(this.id(a)),this.updateSelection(a),this.opts.element.trigger({type:"select2-selected",val:this.id(a),choice:a}),this.nextSearchTerm=this.opts.nextSearchTerm(a,this.search.val()),this.close(),b&&b.noFocus||!this.opts.shouldFocusInput(this)||this.focusser.focus(),r(c,this.id(a))||this.triggerChange({added:a,removed:d})}},updateSelection:function(a){var d,e,c=this.selection.find(".select2-chosen");this.selection.data("select2-data",a),c.empty(),null!==a&&(d=this.opts.formatSelection(a,c,this.opts.escapeMarkup)),d!==b&&c.append(d),e=this.opts.formatSelectionCssClass(a,c),e!==b&&c.addClass(e),this.selection.removeClass("select2-default"),this.opts.allowClear&&this.getPlaceholder()!==b&&this.container.addClass("select2-allowclear")},val:function(){var a,c=!1,d=null,e=this,f=this.data();if(0===arguments.length)return this.opts.element.val();if(a=arguments[0],arguments.length>1&&(c=arguments[1]),this.select)this.select.val(a).find("option").filter(function(){return this.selected}).each2(function(a,b){return d=e.optionToData(b),!1}),this.updateSelection(d),this.setPlaceholder(),c&&this.triggerChange({added:d,removed:f});else{if(!a&&0!==a)return this.clear(c),void 0;if(this.opts.initSelection===b)throw new Error("cannot call val() if initSelection() is not defined");this.opts.element.val(a),this.opts.initSelection(this.opts.element,function(a){e.opts.element.val(a?e.id(a):""),e.updateSelection(a),e.setPlaceholder(),c&&e.triggerChange({added:a,removed:f})})}},clearSearch:function(){this.search.val(""),this.focusser.val("")},data:function(a){var c,d=!1;return 0===arguments.length?(c=this.selection.data("select2-data"),c==b&&(c=null),c):(arguments.length>1&&(d=arguments[1]),a?(c=this.data(),this.opts.element.val(a?this.id(a):""),this.updateSelection(a),d&&this.triggerChange({added:a,removed:c})):this.clear(d),void 0)}}),f=O(d,{createContainer:function(){var b=a(document.createElement("div")).attr({"class":"select2-container select2-container-multi"}).html(["",""].join(""));return b},prepareOpts:function(){var b=this.parent.prepareOpts.apply(this,arguments),c=this;return"select"===b.element.get(0).tagName.toLowerCase()?b.initSelection=function(a,b){var d=[];a.find("option").filter(function(){return this.selected&&!this.disabled}).each2(function(a,b){d.push(c.optionToData(b))}),b(d)}:"data"in b&&(b.initSelection=b.initSelection||function(c,d){var e=s(c.val(),b.separator),f=[];b.query({matcher:function(c,d,g){var h=a.grep(e,function(a){return r(a,b.id(g))}).length;return h&&f.push(g),h},callback:a.isFunction(d)?function(){for(var a=[],c=0;c0||(this.selectChoice(null),this.clearPlaceholder(),this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.open(),this.focusSearch(),b.preventDefault()))})),this.container.on("focus",b,this.bind(function(){this.isInterfaceEnabled()&&(this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active"),this.dropdown.addClass("select2-drop-active"),this.clearPlaceholder())})),this.initContainerWidth(),this.opts.element.addClass("select2-offscreen"),this.clearSearch()},enableInterface:function(){this.parent.enableInterface.apply(this,arguments)&&this.search.prop("disabled",!this.isInterfaceEnabled())},initSelection:function(){if(""===this.opts.element.val()&&""===this.opts.element.text()&&(this.updateSelection([]),this.close(),this.clearSearch()),this.select||""!==this.opts.element.val()){var c=this;this.opts.initSelection.call(null,this.opts.element,function(a){a!==b&&null!==a&&(c.updateSelection(a),c.close(),c.clearSearch())})}},clearSearch:function(){var a=this.getPlaceholder(),c=this.getMaxSearchWidth();a!==b&&0===this.getVal().length&&this.search.hasClass("select2-focused")===!1?(this.search.val(a).addClass("select2-default"),this.search.width(c>0?c:this.container.css("width"))):this.search.val("").width(10)},clearPlaceholder:function(){this.search.hasClass("select2-default")&&this.search.val("").removeClass("select2-default")},opening:function(){this.clearPlaceholder(),this.resizeSearch(),this.parent.opening.apply(this,arguments),this.focusSearch(),""===this.search.val()&&this.nextSearchTerm!=b&&(this.search.val(this.nextSearchTerm),this.search.select()),this.updateResults(!0),this.opts.shouldFocusInput(this)&&this.search.focus(),this.opts.element.trigger(a.Event("select2-open"))},close:function(){this.opened()&&this.parent.close.apply(this,arguments)},focus:function(){this.close(),this.search.focus()},isFocused:function(){return this.search.hasClass("select2-focused")},updateSelection:function(b){var c=[],d=[],e=this;a(b).each(function(){p(e.id(this),c)<0&&(c.push(e.id(this)),d.push(this))}),b=d,this.selection.find(".select2-search-choice").remove(),a(b).each(function(){e.addSelectedChoice(this)}),e.postprocessResults()},tokenize:function(){var a=this.search.val();a=this.opts.tokenizer.call(this,a,this.data(),this.bind(this.onSelect),this.opts),null!=a&&a!=b&&(this.search.val(a),a.length>0&&this.open())},onSelect:function(a,c){this.triggerSelect(a)&&""!==a.text&&(this.addSelectedChoice(a),this.opts.element.trigger({type:"selected",val:this.id(a),choice:a}),this.nextSearchTerm=this.opts.nextSearchTerm(a,this.search.val()),this.clearSearch(),this.updateResults(),(this.select||!this.opts.closeOnSelect)&&this.postprocessResults(a,!1,this.opts.closeOnSelect===!0),this.opts.closeOnSelect?(this.close(),this.search.width(10)):this.countSelectableResults()>0?(this.search.width(10),this.resizeSearch(),this.getMaximumSelectionSize()>0&&this.val().length>=this.getMaximumSelectionSize()?this.updateResults(!0):this.nextSearchTerm!=b&&(this.search.val(this.nextSearchTerm),this.updateResults(),this.search.select()),this.positionDropdown()):(this.close(),this.search.width(10)),this.triggerChange({added:a}),c&&c.noFocus||this.focusSearch())},cancel:function(){this.close(),this.focusSearch()},addSelectedChoice:function(c){var j,k,d=!c.locked,e=a("
"),f=a("
"),g=d?e:f,h=this.id(c),i=this.getVal();j=this.opts.formatSelection(c,g.find("div"),this.opts.escapeMarkup),j!=b&&g.find("div").replaceWith(""+j+"
"),k=this.opts.formatSelectionCssClass(c,g.find("div")),k!=b&&g.addClass(k),d&&g.find(".select2-search-choice-close").on("mousedown",A).on("click dblclick",this.bind(function(b){this.isInterfaceEnabled()&&(this.unselect(a(b.target)),this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus"),A(b),this.close(),this.focusSearch())})).on("focus",this.bind(function(){this.isInterfaceEnabled()&&(this.container.addClass("select2-container-active"),this.dropdown.addClass("select2-drop-active"))})),g.data("select2-data",c),g.insertBefore(this.searchContainer),i.push(h),this.setVal(i)},unselect:function(b){var d,e,c=this.getVal();if(b=b.closest(".select2-search-choice"),0===b.length)throw"Invalid argument: "+b+". Must be .select2-search-choice";if(d=b.data("select2-data")){var f=a.Event("select2-removing");if(f.val=this.id(d),f.choice=d,this.opts.element.trigger(f),f.isDefaultPrevented())return!1;for(;(e=p(this.id(d),c))>=0;)c.splice(e,1),this.setVal(c),this.select&&this.postprocessResults();return b.remove(),this.opts.element.trigger({type:"select2-removed",val:this.id(d),choice:d}),this.triggerChange({removed:d}),!0}},postprocessResults:function(a,b,c){var d=this.getVal(),e=this.results.find(".select2-result"),f=this.results.find(".select2-result-with-children"),g=this;e.each2(function(a,b){var c=g.id(b.data("select2-data"));p(c,d)>=0&&(b.addClass("select2-selected"),b.find(".select2-result-selectable").addClass("select2-selected"))}),f.each2(function(a,b){b.is(".select2-result-selectable")||0!==b.find(".select2-result-selectable:not(.select2-selected)").length||b.addClass("select2-selected")}),-1==this.highlight()&&c!==!1&&g.highlight(0),!this.opts.createSearchChoice&&!e.filter(".select2-result:not(.select2-selected)").length>0&&(!a||a&&!a.more&&0===this.results.find(".select2-no-results").length)&&J(g.opts.formatNoMatches,"formatNoMatches")&&this.results.append(""+K(g.opts.formatNoMatches,g.opts.element,g.search.val())+" ")},getMaxSearchWidth:function(){return this.selection.width()-t(this.search)},resizeSearch:function(){var a,b,c,d,e,f=t(this.search);a=C(this.search)+10,b=this.search.offset().left,c=this.selection.width(),d=this.selection.offset().left,e=c-(b-d)-f,a>e&&(e=c-f),40>e&&(e=c-f),0>=e&&(e=a),this.search.width(Math.floor(e))},getVal:function(){var a;return this.select?(a=this.select.val(),null===a?[]:a):(a=this.opts.element.val(),s(a,this.opts.separator))},setVal:function(b){var c;this.select?this.select.val(b):(c=[],a(b).each(function(){p(this,c)<0&&c.push(this)}),this.opts.element.val(0===c.length?"":c.join(this.opts.separator)))},buildChangeDetails:function(a,b){for(var b=b.slice(0),a=a.slice(0),c=0;c0&&c--,a.splice(d,1),d--);return{added:b,removed:a}},val:function(c,d){var e,f=this;if(0===arguments.length)return this.getVal();if(e=this.data(),e.length||(e=[]),!c&&0!==c)return this.opts.element.val(""),this.updateSelection([]),this.clearSearch(),d&&this.triggerChange({added:this.data(),removed:e}),void 0;if(this.setVal(c),this.select)this.opts.initSelection(this.select,this.bind(this.updateSelection)),d&&this.triggerChange(this.buildChangeDetails(e,this.data()));else{if(this.opts.initSelection===b)throw new Error("val() cannot be called if initSelection() is not defined");this.opts.initSelection(this.opts.element,function(b){var c=a.map(b,f.id);f.setVal(c),f.updateSelection(b),f.clearSearch(),d&&f.triggerChange(f.buildChangeDetails(e,f.data()))})}this.clearSearch()},onSortStart:function(){if(this.select)throw new Error("Sorting of elements is not supported when attached to . Attach to instead.");this.search.width(0),this.searchContainer.hide()},onSortEnd:function(){var b=[],c=this;this.searchContainer.show(),this.searchContainer.appendTo(this.searchContainer.parent()),this.resizeSearch(),this.selection.find(".select2-search-choice").each(function(){b.push(c.opts.id(a(this).data("select2-data")))}),this.setVal(b),this.triggerChange()},data:function(b,c){var e,f,d=this;return 0===arguments.length?this.selection.children(".select2-search-choice").map(function(){return a(this).data("select2-data")}).get():(f=this.data(),b||(b=[]),e=a.map(b,function(a){return d.opts.id(a)}),this.setVal(e),this.updateSelection(b),this.clearSearch(),c&&this.triggerChange(this.buildChangeDetails(f,this.data())),void 0)}}),a.fn.select2=function(){var d,e,f,g,h,c=Array.prototype.slice.call(arguments,0),i=["val","destroy","opened","open","close","focus","isFocused","container","dropdown","onSortStart","onSortEnd","enable","disable","readonly","positionDropdown","data","search"],j=["opened","isFocused","container","dropdown"],k=["val","data"],l={search:"externalSearch"};return this.each(function(){if(0===c.length||"object"==typeof c[0])d=0===c.length?{}:a.extend({},c[0]),d.element=a(this),"select"===d.element.get(0).tagName.toLowerCase()?h=d.element.prop("multiple"):(h=d.multiple||!1,"tags"in d&&(d.multiple=h=!0)),e=h?new window.Select2["class"].multi:new window.Select2["class"].single,e.init(d);else{if("string"!=typeof c[0])throw"Invalid arguments to select2 plugin: "+c;if(p(c[0],i)<0)throw"Unknown method: "+c[0];if(g=b,e=a(this).data("select2"),e===b)return;if(f=c[0],"container"===f?g=e.container:"dropdown"===f?g=e.dropdown:(l[f]&&(f=l[f]),g=e[f].apply(e,c.slice(1))),p(c[0],j)>=0||p(c[0],k)>=0&&1==c.length)return!1}}),g===b?this:g},a.fn.select2.defaults={width:"copy",loadMorePadding:0,closeOnSelect:!0,openOnEnter:!0,containerCss:{},dropdownCss:{},containerCssClass:"",dropdownCssClass:"",formatResult:function(a,b,c,d){var e=[];return E(a.text,c.term,e,d),e.join("")},formatSelection:function(a,c,d){return a?d(a.text):b},sortResults:function(a){return a},formatResultCssClass:function(a){return a.css},formatSelectionCssClass:function(){return b},minimumResultsForSearch:0,minimumInputLength:0,maximumInputLength:null,maximumSelectionSize:0,id:function(a){return a==b?null:a.id},matcher:function(a,b){return o(""+b).toUpperCase().indexOf(o(""+a).toUpperCase())>=0},separator:",",tokenSeparators:[],tokenizer:M,escapeMarkup:F,blurOnChange:!1,selectOnBlur:!1,adaptContainerCssClass:function(a){return a},adaptDropdownCssClass:function(){return null},nextSearchTerm:function(){return b},searchInputPlaceholder:"",createSearchChoicePosition:"top",shouldFocusInput:function(a){var b="ontouchstart"in window||navigator.msMaxTouchPoints>0;return b?a.opts.minimumResultsForSearch<0?!1:!0:!0}},a.fn.select2.locales=[],a.fn.select2.locales.en={formatMatches:function(a){return 1===a?"One result is available, press enter to select it.":a+" results are available, use up and down arrow keys to navigate."
-},formatNoMatches:function(){return"No matches found"},formatAjaxError:function(){return"Loading failed"},formatInputTooShort:function(a,b){var c=b-a.length;return"Please enter "+c+" or more character"+(1==c?"":"s")},formatInputTooLong:function(a,b){var c=a.length-b;return"Please delete "+c+" character"+(1==c?"":"s")},formatSelectionTooBig:function(a){return"You can only select "+a+" item"+(1==a?"":"s")},formatLoadMore:function(){return"Loading more results\u2026"},formatSearching:function(){return"Searching\u2026"}},a.extend(a.fn.select2.defaults,a.fn.select2.locales.en),a.fn.select2.ajaxDefaults={transport:a.ajax,params:{type:"GET",cache:!1,dataType:"json"}},window.Select2={query:{ajax:G,local:H,tags:I},util:{debounce:w,markMatch:E,escapeMarkup:F,stripDiacritics:o},"class":{"abstract":d,single:e,multi:f}}}}(jQuery);
\ No newline at end of file
diff --git a/functions/metaboxes/js/select2/select2.png b/functions/metaboxes/js/select2/select2.png
deleted file mode 100755
index 1d804ff..0000000
Binary files a/functions/metaboxes/js/select2/select2.png and /dev/null differ
diff --git a/functions/metaboxes/js/select2/select2x2.png b/functions/metaboxes/js/select2/select2x2.png
deleted file mode 100755
index 4bdd5c9..0000000
Binary files a/functions/metaboxes/js/select2/select2x2.png and /dev/null differ
diff --git a/functions/metaboxes/languages/cmb-fi.mo b/functions/metaboxes/languages/cmb-fi.mo
deleted file mode 100755
index e0869ee..0000000
Binary files a/functions/metaboxes/languages/cmb-fi.mo and /dev/null differ
diff --git a/functions/metaboxes/languages/cmb-fi.po b/functions/metaboxes/languages/cmb-fi.po
deleted file mode 100755
index d51de58..0000000
--- a/functions/metaboxes/languages/cmb-fi.po
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright (C) 2013
-# This file is distributed under the same license as the package.
-msgid ""
-msgstr ""
-"Project-Id-Version: Custom Meta Boxes 1.0 - Beta 1\n"
-"Report-Msgid-Bugs-To: http://wordpress.org/tag/Custom-Meta-Boxes\n"
-"POT-Creation-Date: 2013-10-09 18:24:44+00:00\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"PO-Revision-Date: 2013-10-09 21:31+0200\n"
-"Last-Translator: Daniel Koskinen \n"
-"Language-Team: Daniel Koskinen \n"
-"X-Generator: Poedit 1.5.7\n"
-"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"Language: Finnish\n"
-"X-Poedit-SourceCharset: UTF-8\n"
-
-#: classes.fields.php:365 classes.fields.php:1423
-msgid "Add New"
-msgstr "Lisää uusi"
-
-#: classes.fields.php:466
-msgid "Allowed Image Files"
-msgstr "Sallitut kuvatiedostot"
-
-#: classes.fields.php:494
-msgid "Drag & Drop files"
-msgstr "Raahaa ja pudota tiedostot"
-
-#: classes.fields.php:517
-msgid "Remove"
-msgstr "Poista"
-
-#: classes.fields.php:524
-msgid "or"
-msgstr "tai"
-
-#: classes.fields.php:525
-msgid "Select Files"
-msgstr "Valitse tiedostot"
-
-#: classes.fields.php:1051
-msgctxt "select field"
-msgid "None"
-msgstr "Ei mitään"
-
-#: classes.fields.php:1072
-msgid "Type to search"
-msgstr "Hae"
diff --git a/functions/metaboxes/languages/cmb.pot b/functions/metaboxes/languages/cmb.pot
deleted file mode 100755
index 5b216fc..0000000
--- a/functions/metaboxes/languages/cmb.pot
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright (C) 2013
-# This file is distributed under the same license as the package.
-msgid ""
-msgstr ""
-"Project-Id-Version: 1.0 - Beta 1\n"
-"Report-Msgid-Bugs-To: http://wordpress.org/tag/Custom-Meta-Boxes\n"
-"POT-Creation-Date: 2013-10-09 18:24:44+00:00\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"PO-Revision-Date: 2013-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME \n"
-"Language-Team: LANGUAGE \n"
-
-#: classes.fields.php:365 classes.fields.php:1423
-msgid "Add New"
-msgstr ""
-
-#: classes.fields.php:466
-msgid "Allowed Image Files"
-msgstr ""
-
-#: classes.fields.php:494
-msgid "Drag & Drop files"
-msgstr ""
-
-#: classes.fields.php:517
-msgid "Remove"
-msgstr ""
-
-#: classes.fields.php:524
-msgid "or"
-msgstr ""
-
-#: classes.fields.php:525
-msgid "Select Files"
-msgstr ""
-
-#: classes.fields.php:1051
-msgctxt "select field"
-msgid "None"
-msgstr ""
-
-#: classes.fields.php:1072
-msgid "Type to search"
-msgstr ""
\ No newline at end of file
diff --git a/functions/metaboxes/package.json b/functions/metaboxes/package.json
deleted file mode 100755
index a6c0854..0000000
--- a/functions/metaboxes/package.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "name": "Custom-Meta-Boxes",
- "version": "0.1.0-beta",
- "description": "Custom Meta Boxes is a framework for easily adding custom fields to the WordPress post edit page.",
- "homepage": "https://github.com/humanmade/Custom-Meta-Boxes/",
- "repository": {
- "type": "git",
- "url": "git://github.com/humanmade/Custom-Meta-Boxes.git"
- },
- "author": "Human Made Limited",
- "license": "GPL",
- "readmeFilename": "readme.md",
- "gitHead": "c94fbd6ddd89684e18670968c02abc383c640224",
- "bugs": {
- "url": "https://github.com/humanmade/Custom-Meta-Boxes/issues"
- },
- "devDependencies": {
- "grunt": "~0.4.2",
- "grunt-contrib-cssmin": "~0.7.0"
- }
-}
diff --git a/functions/metaboxes/phpunit.xml b/functions/metaboxes/phpunit.xml
deleted file mode 100755
index 72da531..0000000
--- a/functions/metaboxes/phpunit.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
- ./tests/
-
-
-
\ No newline at end of file
diff --git a/functions/metaboxes/readme.md b/functions/metaboxes/readme.md
deleted file mode 100755
index ee2e5f7..0000000
--- a/functions/metaboxes/readme.md
+++ /dev/null
@@ -1,43 +0,0 @@
-# HM Custom Meta Boxes for WordPress
-
-Custom Meta Boxes is a framework for easily adding custom fields to the WordPress post edit page.
-
-It includes several field types including WYSIWYG, media upload and dates ([see wiki for a full list](https://github.com/humanmade/Custom-Meta-Boxes/wiki)). It also supports repeatable and grouped fields.
-
-This project is aimed at developers and is easily extended and customised. It takes a highly modular, Object Orientated approach, with each field as an extension of the CMB_Field abstract class.
-
-The framework also features a basic layout engine for fields, allowing you to align fields to a simple 12 column grid.
-
-![Overview](https://f.cloud.github.com/assets/494927/386456/1ea0d6f6-a6a7-11e2-88ab-ce6497c2b757.png)
-
-## Usage
-
-* Include the custom-meta-boxes.php framework file.
- * In your theme: include the CMB directory to your theme directory, and add `require_once( 'Custom-Meta-Boxes/custom-meta-boxes.php' );` to functions.php
- * As an MU Plugin: [Refer to the WordPress Codex here for more information](http://codex.wordpress.org/Must_Use_Plugins)
-* Filter `cmb_meta_boxes` to add your own meta boxes. [The wiki has more details and example code](https://github.com/humanmade/Custom-Meta-Boxes/wiki/Create-a-Meta-Box)
-
-## Help
-
-* For more information, including example code for usage of each field and instructions on how to create your own fields, refer to the [Wiki](https://github.com/humanmade/Custom-Meta-Boxes/wiki/).
-* Not covered in the Wiki? Need more help? Get in touch. support@humanmade.co.uk
-* Found a bug? Feature requests? [Create an issue - Thanks!](https://github.com/humanmade/Custom-Meta-Boxes/issues/new)
-
-## About
-
-This plugin is maintained by [Human Made Limited](http://hmn.md)
-
-It began as a fork of [Custom Meta Boxes](https://github.com/jaredatch/Custom-Metaboxes-and-Fields-for-WordPress), but is no longer compatible.
-
-## Known Issues
-* Some fields do not work well as repeatable fields.
-* Some fields do not work well in repeatable groups.
-
-## To Do
-* Make hooking / registering nicer.
-
-
-## Contribution Guidelines ##
-
-See [CONTRIBUTING.md](https://github.com/humanmade/Custom-Meta-Boxes/blob/master/CONTRIBUTING.md)
-
diff --git a/functions/metaboxes/tests/bootstrap.php b/functions/metaboxes/tests/bootstrap.php
deleted file mode 100755
index af22551..0000000
--- a/functions/metaboxes/tests/bootstrap.php
+++ /dev/null
@@ -1,10 +0,0 @@
-old_wp_scripts = isset( $GLOBALS['wp_scripts'] ) ? $GLOBALS['wp_scripts'] : null;
- $GLOBALS['wp_scripts'] = new WP_Scripts();
- $GLOBALS['wp_scripts']->default_version = get_bloginfo( 'version' );
- }
-
- function tearDown() {
- $GLOBALS['wp_scripts'] = $this->old_wp_scripts;
- parent::tearDown();
- }
-
- /**
- * Test that all required scripts & styles are correctly loaded.
- */
- function testDateFieldAssets() {
-
- $field = new CMB_Date_Field( 'foo', 'Title', array() );
-
- // Register CMB-Scripts as this is a dependency.
- wp_register_script( 'cmb-scripts', trailingslashit( CMB_URL ) . 'js/cmb.js', array( 'jquery' ) );
-
- $field->enqueue_scripts();
- $field->enqueue_styles();
-
- $scripts_output = get_echo( 'wp_print_scripts' );
- $styles_output = get_echo( 'wp_print_styles' );
-
- // Scripts
- $this->assertContains( '/js/field.datetime.js', $scripts_output );
- $this->assertContains( '/js/cmb.js', $scripts_output );
- $this->assertContains( site_url() . '/wp-includes/js/jquery/ui/jquery.ui.core.min.js', $scripts_output );
- $this->assertContains( site_url() . '/wp-includes/js/jquery/ui/jquery.ui.datepicker.min.js', $scripts_output );
-
- // Styles
- $this->assertContains( 'css/vendor/jquery-ui/jquery-ui.css', $styles_output );
-
- }
-
- function testTimeFieldAssets() {
-
- $field = new CMB_Time_Field( 'foo', 'Title', array() );
-
- // Register CMB-Scripts as this is a dependency.
- wp_enqueue_script( 'cmb-scripts', trailingslashit( CMB_URL ) . 'js/cmb.js', array( 'jquery' ) );
-
- $field->enqueue_scripts();
-
- $scripts_output = get_echo( 'wp_print_scripts' );
-
- // Scripts
- $this->assertContains( CMB_URL . '/js/cmb.js', $scripts_output );
- $this->assertContains( CMB_URL . '/js/jquery.timePicker.min.js', $scripts_output );
- $this->assertContains( CMB_URL . '/js/field.datetime.js', $scripts_output );
-
- }
-
- function testDateTimestampFieldAssets() {
-
- $field = new CMB_Date_Timestamp_Field( 'foo', 'Title', array() );
-
- // Register CMB-Scripts as this is a dependency.
- wp_enqueue_script( 'cmb-scripts', trailingslashit( CMB_URL ) . 'js/cmb.js', array( 'jquery' ) );
-
- $field->enqueue_scripts();
-
- $scripts_output = get_echo( 'wp_print_scripts' );
-
- // Scripts
- $this->assertContains( CMB_URL . '/js/cmb.js', $scripts_output );
- $this->assertContains( CMB_URL . '/js/jquery.timePicker.min.js', $scripts_output );
- $this->assertContains( CMB_URL . '/js/field.datetime.js', $scripts_output );
-
- }
-
- function testDatetimeTimestampFieldAssets() {
-
- $field = new CMB_Datetime_Timestamp_Field( 'foo', 'Title', array() );
-
- // Register CMB-Scripts as this is a dependency.
- wp_enqueue_script( 'cmb-scripts', trailingslashit( CMB_URL ) . 'js/cmb.js', array( 'jquery' ) );
-
- $field->enqueue_scripts();
-
- $scripts_output = get_echo( 'wp_print_scripts' );
-
- // Scripts
- $this->assertContains( CMB_URL . '/js/cmb.js', $scripts_output );
- $this->assertContains( CMB_URL . '/js/jquery.timePicker.min.js', $scripts_output );
- $this->assertContains( CMB_URL . '/js/field.datetime.js', $scripts_output );
-
- }
-
-}
\ No newline at end of file
diff --git a/functions/metaboxes/tests/testField.php b/functions/metaboxes/tests/testField.php
deleted file mode 100755
index 7c92a41..0000000
--- a/functions/metaboxes/tests/testField.php
+++ /dev/null
@@ -1,114 +0,0 @@
- $this->author_id,
- 'post_status' => 'publish',
- 'post_content' => rand_str(),
- 'post_title' => rand_str(),
- 'tax_input' => array( 'post_tag' => 'tag1,tag2', 'ctax' => 'cterm1,cterm2' ),
- 'post_type' => $post_type
- )
- );
-
- // fetch the post
- $this->post = get_post( $id );
-
- }
-
- function tearDown() {
- unset( $this->post );
- wp_delete_post( $this->post_id, true );
- parent::tearDown();
- }
-
- function testGetValues() {
-
- // Single Value
- $field = new CMB_Text_Field( 'foo', 'Title', array( 1 ) );
- $this->assertEquals( $field->get_values(), array( 1 ) );
-
- // Multiple Values - eg repeatable.
- $field = new CMB_Text_Field( 'foo', 'Title', array( 1, 2 ), array( 'repeatable' => true ) );
- $this->assertEquals( $field->get_values(), array( 1, 2 ) );
-
- }
-
- function testSaveValues() {
-
- $field = new CMB_Text_Field( 'foo', 'Title', array( 1 ) );
-
- if ( ! $this->post )
- $this->markTestSkipped( 'Post not found' );
-
- $field->save( $this->post->ID, array( 1 ) );
-
- $meta = get_post_meta( $this->post->ID, 'foo', false );
-
- $this->assertEquals( $meta, array( 1 ) );
-
- }
-
- function testSaveValuesOnRepeatable() {
-
- $field = new CMB_Text_Field( 'foo', 'Title', array( 1, 2 ), array( 'repeatable' => true ) );
-
- if ( ! $this->post )
- $this->markTestSkipped( 'Post not found' );
-
- $field->save( $this->post->ID, array( 1, 2 ) );
-
- $meta = get_post_meta( $this->post->ID, 'foo', false );
-
- $this->assertEquals( $meta, array( 1, 2 ) );
-
- }
-
- function testIdAttrValue() {
-
- $field = new CMB_Text_Field( 'foo', 'Text', array( 1, 2 ) );
-
- // Standard use of ID attribute
- $id_attr = $field->get_the_id_attr();
- $this->assertEquals( $id_attr, 'foo-cmb-field-0' );
-
- // Using append
- $id_attr = $field->get_the_id_attr( 'bar' );
- $this->assertEquals( $id_attr, 'foo-cmb-field-0-bar' );
-
- // Repeatable
- $field->field_index = 1;
- $id_attr = $field->get_the_id_attr();
- $this->assertEquals( $id_attr, 'foo-cmb-field-1' );
-
- }
-
- function testNameAttrValue() {
-
- $field = new CMB_Text_Field( 'foo', 'Text', array( 1, 2 ) );
-
- // Standard use of ID attribute
- $id_attr = $field->get_the_name_attr();
- $this->assertEquals( $id_attr, 'foo[cmb-field-0]' );
-
- // Using append
- $id_attr = $field->get_the_name_attr( '[bar]' );
- $this->assertEquals( $id_attr, 'foo[cmb-field-0][bar]' );
-
- // Repeatable
- $field->field_index = 1;
- $id_attr = $field->get_the_name_attr();
- $this->assertEquals( $id_attr, 'foo[cmb-field-1]' );
-
- }
-
-}
\ No newline at end of file
diff --git a/functions/metaboxes/tests/testGroupField.php b/functions/metaboxes/tests/testGroupField.php
deleted file mode 100755
index 3287be0..0000000
--- a/functions/metaboxes/tests/testGroupField.php
+++ /dev/null
@@ -1,126 +0,0 @@
- true ) );
-
- $group->add_field( $field1 );
- $group->add_field( $field2 );
-
- $this->assertArrayHasKey( 'foo', $group->get_fields() );
- $this->assertArrayHasKey( 'bar', $group->get_fields() );
-
- }
-
- function testGetValues() {
-
- $group = new CMB_Group_Field( 'group', 'Group Title', array() );
- $field1 = new CMB_Text_Field( 'foo', 'Title', array() );
- $field2 = new CMB_Text_Field( 'bar', 'Title', array() );
-
- $group->add_field( $field1 );
- $group->add_field( $field2 );
-
- $group->values = $values = array(
- 'group' => array(
- 'foo' => array( 1, 2 ),
- 'bar' => array( 3, 4 )
- )
- );
-
- $this->assertEquals( $group->get_values(), $values );
-
- }
-
- function testParseSaveValues() {
-
- $group = new CMB_Group_Field( 'group', 'Group Title', array() );
- $field1 = new CMB_Text_Field( 'foo', 'Title', array( 1 ) );
- $field2 = new CMB_Text_Field( 'bar', 'Title', array( 2, 3 ), array( 'repeatable' => true ) );
-
- $group->add_field( $field1 );
- $group->add_field( $field2 );
-
- $group->set_values( array(
- 'group' => array(
- 'foo' => array( 1 ),
- 'bar' => array( 2, 3 )
- ),
- ) );
-
- $expected = array(
- 'group' => array(
- 'foo' => 1,
- 'bar' => array( 2, 3 )
- )
- );
-
- $group->parse_save_values();
-
- $this->assertEquals( $group->get_values(), $expected );
-
- }
-
- function testFieldNameAttrValue() {
-
- $group = new CMB_Group_Field( 'group', 'Group Title', array() );
- $field1 = new CMB_Text_Field( 'foo', 'Title', array( 1, 2 ) );
-
- $group->add_field( $field1 );
-
- // Standard use of ID attribute
- $id_attr = $field1->get_the_name_attr();
- $this->assertEquals( $id_attr, 'group[cmb-group-0][foo][cmb-field-0]' );
-
- // Using append
- $id_attr = $field1->get_the_name_attr( '[bar]' );
- $this->assertEquals( $id_attr, 'group[cmb-group-0][foo][cmb-field-0][bar]' );
-
- // Test repeatable group.
- $group->field_index = 1;
- $id_attr = $field1->get_the_name_attr();
- $this->assertEquals( $id_attr, 'group[cmb-group-1][foo][cmb-field-0]' );
- $group->field_index = 0; // Unset
-
- // Test repeatable field within group.
- $field1->field_index = 1;
- $id_attr = $field1->get_the_name_attr();
- $this->assertEquals( $id_attr, 'group[cmb-group-0][foo][cmb-field-1]' );
- $field1->field_index = 0; // Unset
-
- }
-
- function testFieldIdAttrValue() {
-
- $group = new CMB_Group_Field( 'group', 'Group Title', array() );
- $field1 = new CMB_Text_Field( 'foo', 'Title', array( 1, 2 ) );
-
- $group->add_field( $field1 );
-
- // Standard use of ID attribute
- $id_attr = $field1->get_the_id_attr();
- $this->assertEquals( $id_attr, 'group-cmb-group-0-foo-cmb-field-0' );
-
- // Using append
- $id_attr = $field1->get_the_id_attr( 'bar' );
- $this->assertEquals( $id_attr, 'group-cmb-group-0-foo-cmb-field-0-bar' );
-
- // Test repeatable group.
- $group->field_index = 1;
- $id_attr = $field1->get_the_id_attr();
- $this->assertEquals( $id_attr, 'group-cmb-group-1-foo-cmb-field-0' );
- $group->field_index = 0; // Unset
-
- // Test repeatable field within group.
- $field1->field_index = 1;
- $id_attr = $field1->get_the_id_attr();
- $this->assertEquals( $id_attr, 'group-cmb-group-0-foo-cmb-field-1' );
- $field1->field_index = 0; // Unset
-
- }
-
-}
\ No newline at end of file
diff --git a/functions/post-types.php b/functions/post-types.php
deleted file mode 100755
index f47ef45..0000000
--- a/functions/post-types.php
+++ /dev/null
@@ -1,79 +0,0 @@
- array(
- 'name' => _x( 'Jobs', 'post type general name' ),
- 'singular_name' => _x( 'Job', 'post type singular name' ),
- 'add_new' => _x( 'Add New', 'Job' ),
- 'add_new_item' => __( 'Add New Job' ),
- 'edit_item' => __( 'Edit Job' ),
- 'new_item' => __( 'New Job' ),
- 'view_item' => __( 'View Job' ),
- 'search_items' => __( 'Search Jobs' ),
- 'not_found' => __( 'No Jobs found' ),
- 'not_found_in_trash' => __( 'No Jobs found in Trash' ),
- 'parent_item_colon' => '',
- 'menu_name' => 'Jobs'
- ),
- 'public' => true,
- 'menu_position' => 95,
- 'supports' => array(
- 'title',
- 'editor',
- 'excerpt'
- ),
- 'query_var' => true,
- 'rewrite' => array(
- 'slug' => 'jobs',
- 'with_front' => false
- ),
- 'has_archive' => true,
- 'show_in_menu' => 'wp_broadbean_home' // shows the post type below wp broadbean home
- )
- );
-
- /* registers the application post type */
- register_post_type(
- 'wpbb_application',array(
- 'labels' => array(
- 'name' => _x( 'Applications', 'post type general name' ),
- 'singular_name' => _x( 'Application', 'post type singular name' ),
- 'add_new' => _x( 'Add New', 'Application' ),
- 'add_new_item' => __( 'Add New Application' ),
- 'edit_item' => __( 'Edit Application' ),
- 'new_item' => __( 'New Application' ),
- 'view_item' => __( 'View Application' ),
- 'search_items' => __( 'Search Applications' ),
- 'not_found' => __( 'No Applications found' ),
- 'not_found_in_trash' => __( 'No Applications found in Trash' ),
- 'parent_item_colon' => '',
- 'menu_name' => 'Applications'
- ),
- 'public' => false,
- 'show_ui' => true,
- 'exclude_from_search' => true,
- 'menu_position' => 99,
- 'supports' => array(
- 'title',
- 'editor'
- ),
- 'query_var' => true,
- 'rewrite' => array(
- 'slug' => 'applications',
- 'with_front' => false
- ),
- 'has_archive' => false,
- 'show_in_menu' => 'wp_broadbean_home' // shows the post type below wp broadbean home
- )
- );
-
-}
-
-add_action( 'init', 'wpbb_register_post_types', 5 );
\ No newline at end of file
diff --git a/functions/taxonomies.php b/functions/taxonomies.php
deleted file mode 100755
index 9adcfe9..0000000
--- a/functions/taxonomies.php
+++ /dev/null
@@ -1,108 +0,0 @@
-
-***************************************************************/
-function wpbb_get_registered_taxonomies() {
-
- $taxonomies = array(
- 'job_type' => array(
- 'taxonomy_name' => 'wpbb_job_type',
- 'bb_field' => 'job_type',
- 'plural' => 'Job Types',
- 'singular' => 'Job Type',
- 'slug' => 'job-type',
- 'menu_label' => 'Types',
- 'hierarchical' => true,
- 'show_admin_column' => true,
- 'show_on_frontend' => true
- ),
- 'job_location' => array(
- 'taxonomy_name' => 'wpbb_job_location',
- 'bb_field' => 'job_location',
- 'plural' => 'Job Locations',
- 'singular' => 'Job Location',
- 'slug' => 'job-location',
- 'menu_label' => 'Locations',
- 'hierarchical' => true,
- 'show_admin_column' => true,
- 'show_on_frontend' => true
- ),
- 'job_industry' => array(
- 'taxonomy_name' => 'wpbb_job_industry',
- 'bb_field' => 'job_industry',
- 'plural' => 'Job Industries',
- 'singular' => 'Job Industry',
- 'slug' => 'job-industry',
- 'menu_label' => 'Industries',
- 'hierarchical' => true,
- 'show_admin_column' => true,
- 'show_on_frontend' => true
- ),
- 'job_skill' => array(
- 'taxonomy_name' => 'wpbb_job_skill',
- 'bb_field' => 'job_skills',
- 'plural' => 'Job Skills',
- 'singular' => 'Job Skill',
- 'slug' => 'job-skill',
- 'menu_label' => 'Skills',
- 'hierarchical' => false,
- 'show_admin_column' => true,
- 'show_on_frontend' => true
- ),
-
- );
-
- /* allow developers to add additional custom taxonomies */
- return apply_filters( 'wpbb_registered_taxonomies', $taxonomies );
-
-}
-
-/***************************************************************
-* Function wpbb_register_taxonomies()
-* Register the necessary custom taxonomies for the plugin.
-***************************************************************/
-function wpbb_register_taxonomies() {
-
- /* get the taxonomies that are registered with the plugin */
- $taxonomies = wpbb_get_registered_taxonomies();
-
- /* for each taxonomy returned, register it as a custom taxonomy */
- foreach ($taxonomies as $taxonomy) {
-
- register_taxonomy(
- $taxonomy['taxonomy_name'], // taxonomy name
- wpbb_job_post_type_name(), // post type for this taxonomy
- array(
- 'labels' => apply_filters( $taxonomy['taxonomy_name'] . '_labels',
- array(
- 'name' => _x( $taxonomy['plural'], 'taxonomy general name' ),
- 'singular_name' => _x( $taxonomy['singular'], 'taxonomy singular name' ),
- 'search_items' => __( 'Search ' . $taxonomy['plural'] ),
- 'all_items' => __( 'All ' . $taxonomy['plural'] ),
- 'parent_item' => __( 'Parent ' . $taxonomy['singular'] ),
- 'parent_item_colon' => __( 'Parent ' . $taxonomy['singular'] . ':' ),
- 'edit_item' => __( 'Edit ' . $taxonomy['singular'] ),
- 'update_item' => __( 'Update ' . $taxonomy['singular'] ),
- 'add_new_item' => __( 'Add New ' . $taxonomy['singular'] ),
- 'new_item_name' => __( 'New ' . $taxonomy['singular'] . ' Name' ),
- 'menu_name' => __( $taxonomy['plural'] ),
- )
- ),
- 'hierarchical' => $taxonomy['hierarchical'],
- 'sort' => true,
- 'rewrite' => array(
- 'slug' => $taxonomy['slug']
- ),
- 'show_admin_column' => $taxonomy['show_admin_column'],
- )
- );
-
- } // end foreach
-
-}
-
-add_action( 'init', 'wpbb_register_taxonomies', 10 );
\ No newline at end of file
diff --git a/functions/wpbb-functions.php b/functions/wpbb-functions.php
deleted file mode 100644
index 34ba0fc..0000000
--- a/functions/wpbb-functions.php
+++ /dev/null
@@ -1,625 +0,0 @@
- sanitize_title( $wpbb_taxonomy_term )
- )
- );
-
- /* check if the taxonomy is hierarchical */
- if( $taxonomy[ 'hierarchical' ] == true ) {
-
- /* add to term id to our terms array */
- $wpbb_tax_terms[] = $new_term['term_id'];
-
- } else {
-
- /* get the term name from its id */
- $new_term_obj = get_term_by(
- 'id',
- $new_term['term_id'],
- $taxonomy[ 'taxonomy_name' ]
- );
-
- /* add the term name to our terms array */
- $wpbb_tax_terms[] = $new_term_obj->name;
-
- }
-
- }
-
- }
-
-
- } // end loop through each term
-
- return $wpbb_tax_terms;
-}
-
-/**
- * Calculate Job Expiry Date
- * takes today's date and calculates a future date
- * by adding the number of days that the Broadbean data
- * has provided as the number of days to advertise
- */
-function wpbb_calculate_job_expiry_date( $days_to_advertise ) {
-
- /* make sure the number if days provided is an integer */
- $days_to_advertise = (int) $days_to_advertise;
-
- /* return the expiry date of a job according to the days to advertise provided in the bb feed */
- return Date( 'y-m-d', strtotime( "+{$days_to_advertise} days" ) );
-
-}
-
-/**
- * function wpbb_job_post_type_name()
- * returns the name of the custom post type for jobs
- * allows developers to use a different custom post type for jobs
- * rather than the post type that comes with the plugin
- */
-function wpbb_job_post_type_name() {
-
- return apply_filters( 'wpbb_job_post_type', 'wpbb_job' );
-
-}
-
-/**
- * Function wpbb_get_current_post_type()
- * Returns the post type of the current post in wp admin.
- */
-function wpbb_get_current_post_type() {
-
- global $post, $typenow, $current_screen;
-
- /* we have a post so we can just get the post type from that */
- if ( $post && $post->post_type )
- return $post->post_type;
-
- /* check the global $typenow - set in admin.php */
- elseif( $typenow )
- return $typenow;
-
- /* check the global $current_screen object - set in sceen.php */
- elseif( $current_screen && $current_screen->post_type )
- return $current_screen->post_type;
-
- /* lastly check the post_type querystring */
- elseif( isset( $_REQUEST['post_type'] ) )
- return sanitize_key( $_REQUEST['post_type'] );
-
- /* we do not know the post type! */
- return null;
-
-}
-
-/**
- * Function wpbb_get_apply_url()
- * Returns the apply link for a job.
- */
-function wpbb_get_apply_url( $post_id = '' ) {
-
- global $post;
-
- /* if there is not post id provided use current post id */
- if( empty( $post_id ) )
- $post_id = $post->ID;
-
- /* check current post is a job post */
- if( wpbb_job_post_type_name() != get_post_type( $post_id ) )
- return;
-
- /* get the page id for the apply now page from settings */
- $wpbb_apply_page_id = get_option( 'wpbb_apply_page_id' );
-
- /**
- * set some filterable query args
- * devs can use this filter to add other query args to the application url
- * this could be used to pre-populate the form with content
- */
- $wpbb_apply_query_args = apply_filters(
- 'wpbb_apply_query_args',
- array(
- 'job_id' => get_post_meta( $post_id, '_wpbb_job_reference', true )
- ),
- $post_id
- );
-
- /* build apply link from url */
- $wpbb_apply_link = add_query_arg( $wpbb_apply_query_args, get_permalink( $wpbb_apply_page_id ) );
-
- /**
- * return the apply url
- * devs can filter this to use different URL e.g. a gravity form page etc.
- */
- return esc_url( apply_filters( 'wpbb_apply_url', $wpbb_apply_link, $post_id ) );
-
-}
-
-/**
- * Function wpbb_apply_button()
- * Outputs the apply now button after the loop on job single posts
- */
-function wpbb_apply_button( $content ) {
-
- global $post;
-
- /* check this is a single job post */
- if( ! is_singular( wpbb_job_post_type_name() ) )
- return $content;
-
- return $content . 'Apply Now
';
-
-}
-
-add_filter( 'the_content', 'wpbb_apply_button', 90 );
-
-/**
- * function wpbb_page_dropdown_array()
- * Creates an array of pages to use in a select list.
- */
-function wpbb_page_dropdown_array() {
-
- /* set args for getting pages */
- $wpbb_pages_args = array(
- 'post_type' => 'page',
- 'posts_per_page' => -1,
- );
-
- /* get the pages */
- $wpbb_pages = get_posts( $wpbb_pages_args );
-
- /* check we have pages */
- if( empty( $wpbb_pages ) )
- return false;
-
- /* create array to store our pages arrays in */
- $wpbb_pages_array = array(
- array(
- 'name' => 'Choose a Page',
- 'value' => 'zero',
- ),
- );
-
- /* loop through each page */
- foreach( $wpbb_pages as $wpbb_page ) {
-
- /* setup the posts data to get access to post functions */
- setup_postdata( $wpbb_page );
-
- /* push page id and name into pages array */
- $wpbb_pages_array[] = array(
- 'name' => $wpbb_page->post_title,
- 'value' => $wpbb_page->ID,
- );
-
- }
-
- return $wpbb_pages_array;
-
-}
-
-/**
- * function wpbb_job_salary_currency_symbol()
- * Returns the currency symbol for the current jobs salary.
- */
-function wpbb_job_salary_currency_symbol( $post_id = '' ) {
-
- global $post;
-
- /* use current post id if none given */
- if( empty( $post_id ) )
- $post_id = $post->ID;
-
- /* get the salary currency value */
- $wpbb_salary_currency = get_post_meta( $post_id, '_wpbb_job_salary_currency', true );
-
- /* switch statement for which currency */
- switch( $wpbb_salary_currency ) {
-
- case 'gbp' :
-
- /* set currency symbol to pound sterling */
- $wpbb_salary_currency_symbol = '£';
-
- /* break out of switch */
- break;
-
- case 'eur' :
-
- /* set currency symbol to euro */
- $wpbb_salary_currency_symbol = '€';
-
- /* break out of switch */
- break;
-
- default :
-
- /* set currency symbol to pound sterling */
- $wpbb_salary_currency_symbol = '£';
-
- }
-
- return $wpbb_salary_currency_symbol;
-
-}
-
-/**
- * function wpbb_get_job_salary()
- * Gets the salary for the current job, checking whether there is
- * a salary range and whehter it is per year, month etc.
- */
-function wpbb_get_job_salary( $post_id = '' ) {
-
- global $post;
-
- /* use current post id if none given */
- if( empty( $post_id ) )
- $post_id = $post->ID;
-
- /* get salary meta for this job */
- $wpbb_salary = get_post_meta( $post_id, '_wpbb_job_salary', true );
- $wpbb_salary_per = get_post_meta( $post_id, '_wpbb_job_salary_per', true );
-
- /* set string to return for output */
- $wpbb_salary_output = wpbb_job_salary_currency_symbol( $post_id ) . number_format( $wpbb_salary ) . '/' . $wpbb_salary_per;
-
- return apply_filters( 'wpbb_job_salary_html', $wpbb_salary_output, $post_id );
-
-}
-
-/**
- * function wpbb_get_field()
- * gets the value of a meta box field for a wpbb post
- * @param (string) $field is the name of the field to return
- * @param (int) $post_id is the id of the post for which to look for the field in - defaults to current loop post
- * @param (string) $prefix is the prefix to use for the custom field key. Defaults to _wpbb_
- * return (string) $field the value of the field
- */
-function wpbb_get_field( $field, $post_id = '', $prefix = '_wpbb_' ) {
-
- global $post;
-
- /* if no post id is provided use the current post id in the loop */
- if( empty( $post_id ) )
- $post_id = $post->ID;
-
- /* if we have no field name passed go no further */
- if( empty( $field ) )
- return false;
-
- /* build the meta key to return the value for */
- $key = $prefix . $field;
-
- /* gete the post meta value for this field name of meta key */
- $field = get_post_meta( $post_id, $key, true );
-
- return apply_filters( 'wpbb_field_value', $field );
-
-}
-
-/**
- * function wpbb_get_job_by_reference()
- * gets the job post id for a job given its reference
- * @param (string) $job_ref is the job refrerence to check by
- * @return (int/false) $post_id returns the post of the job if a job exists with that reference or false
- */
-function wpbb_get_job_by_reference( $job_ref ) {
-
- /* get posts according to args above */
- $wpbb_jobs = new WP_Query(
- apply_filters(
- 'wpbb_get_job_by_reference_args',
- array(
- 'post_type' => wpbb_job_post_type_name(),
- 'post_status' => 'publish',
- 'meta_key' => '_wpbb_job_reference',
- 'meta_value' => $job_ref,
- 'fields' => 'ids'
- )
- )
- );
-
- // get the post ids into an array
- $wpbb_jobs = $wpbb_jobs->posts;
-
- // reset the query
- wp_reset_query();
-
- // return the post id of the found job
- return apply_filters( 'wpbb_get_job_by_reference', array_shift( $wpbb_jobs ), $job_ref );
-
-}
-
-/**
- * function wpbb_job_fields_output()
- * adds the job fields to the bottom of the job post content
- * @param (string) @content is the current content of the job post
- */
-function wpbb_job_fields_output( $content ) {
-
- // are we hiding job data.
- $show_job_data = wpbb_hide_job_data();
-
- // if we are not outputing job data - bail early.
- if ( false !== $show_job_data ) {
- return $content;
- }
-
- /* only carry on if we are on a single job post view */
- if( ! is_singular( wpbb_job_post_type_name() ) )
- return $content;
-
- global $post;
-
- /**
- * now we need to handle the job fields that should be outputted for this job
- * lets start by getting all the job fields as an array
- */
- $wpbb_job_fields = wpbb_get_job_fields();
-
- /* check we have any fields */
- if( ! empty( $wpbb_job_fields ) ) {
-
- /* how many field have we got to output */
- $field_count = count( $wpbb_job_fields );
-
- /* lets setup some markup */
- $output = '';
-
- /* start a counter */
- $counter = 1;
-
- /**
- * we need to loop through each of these fields
- * start a loop to loop through each field
- */
- foreach( $wpbb_job_fields as $field ) {
-
- /* check whether this is front end output field - if not move to the next field */
- if( $field[ 'show_on_frontend' ] == false )
- continue;
-
- /* build a field class to use for this field */
- $class = 'wpbb-job-field wpbb-job-field-' . $counter . ' ' . $field[ 'bb_field' ];
-
- /* check if this is the last field */
- if( $counter == $field_count ) {
-
- /* add to our class */
- $class .= ' last-field';
-
- }
-
- /* start the markup with a field wrapper div */
- $output .= '
';
-
- $output .= '
' . esc_html( $field[ 'name' ] ) . ': ' . ucfirst( get_post_meta( $post->ID, $field[ 'id' ], true ) ) . '
';
-
- /* close out the field markup */
- $output .= '
';
-
- /* increment the counter */
- $counter++;
-
- }
-
- /* close out the markup */
- $output .= '
';
-
- /* check we have markup to output */
- if( ! empty( $output ) )
- return $content . apply_filters( 'wpbb_job_fields_output', $output, $post->ID );
-
- }
-
- return $content;
-
-}
-
-add_filter( 'the_content', 'wpbb_job_fields_output', 20 );
-
-/**
- * function wpbb_job_terms_output()
- * adds the job terms from registered wpbb taxonomies to the bottom of the job post content
- * @param (string) @content is the current content of the job post
- */
-function wpbb_job_terms_output( $content ) {
-
- // are we hiding job data.
- $show_job_data = wpbb_hide_job_data();
-
- // if we are not outputing job data - bail early.
- if ( false !== $show_job_data ) {
- return $content;
- }
-
- global $post;
-
- /* only carry on if we are on a single job post view */
- if( ! is_singular( wpbb_job_post_type_name() ) )
- return $content;
-
- /* get the registered wpbb taxonomies */
- $taxonomies = wpbb_get_registered_taxonomies();
-
- /* check we have any taxonomies to deal with */
- if( ! empty( $taxonomies ) ) {
-
- /* how many field have we got to output */
- $tax_count = count( $taxonomies );
-
- /* lets setup some markup */
- $output = '';
-
- /* start a counter */
- $counter = 1;
-
- /**
- * we need to loop through each of these taxonomies
- * start a loop to loop through each field
- */
- foreach( $taxonomies as $tax ) {
-
- /* check whether this is front end output tax - if not move to the next taxonomy */
- if( $tax[ 'show_on_frontend' ] == false )
- continue;
-
- /* build a field class to use for this field */
- $class = 'wpbb-job-tax wpbb-job-tax-' . $counter . ' ' . $tax[ 'bb_field' ];
-
- /* check if this is the last field */
- if( $counter == $tax_count ) {
-
- /* add to our class */
- $class .= ' last-tax';
-
- }
-
- $output .= get_the_term_list(
- $post->ID,
- $tax[ 'taxonomy_name' ],
- '
' . esc_html( $tax[ 'singular' ] ) . ': ',
- ', ',
- '
'
- );
-
- /* increment the counter */
- $counter++;
-
- }
-
- /* close out the markup */
- $output .= '
';
-
- /* check we have markup to output */
- if( ! empty( $output ) )
- return $content . apply_filters( 'wpbb_job_taxonomies_output', $output, $post->ID );
-
- }
-
-}
-
-add_filter( 'the_content', 'wpbb_job_terms_output', 30 );
-
-/**
- * function wpbb_get_setting()
- *
- * gets a named plugin settings returning its value
- * @param mixed key name to retrieve - this is the key of the stored option
- * @return mixed the value of the key
- */
-function wpbb_get_setting( $name = '' ) {
-
- /* if no name is passed */
- if( empty( $name ) ) {
- return false;
- }
-
- /* get the option */
- $setting = get_option( 'wpbb_' . $name );
-
- /* check we have a value returned */
- if( empty( $setting ) ) {
- return false;
- }
-
- return apply_filters( 'wpbb_get_setting', $setting );
-
-}
-
-/**
- * returns string for use when setting wp_mail content type
- */
-function wpbb_text_html_email_type() {
- return 'text/html';
-}
-
-/**
- * Get status of storing the application attachments.
- */
-function wpbb_maybe_remove_application_attachments() {
- return apply_filters( 'wpbb_remove_application_attachments_after_send', boolval( get_option( 'wpbb_remove_application_attachments', true ) ) );
-}
-
-/**
- * Get status of storing the application posts.
- */
-function wpbb_maybe_remove_application_post() {
- return apply_filters( 'wpbb_remove_application_post_after_send', boolval( get_option( 'wpbb_remove_application_posts' ) ) );
-}
-
-/**
- * Get status of whether we should be hiding the job data on a job post template.
- */
-function wpbb_hide_job_data() {
- return apply_filters( 'wpbb_hide_job_data', boolval( get_option( 'wpbb_hide_job_data' ) ) );
-}
diff --git a/inbox.php b/inbox.php
deleted file mode 100644
index 06de2ec..0000000
--- a/inbox.php
+++ /dev/null
@@ -1,297 +0,0 @@
-username ) != $wpbb_username || wp_strip_all_tags( (string) $wpbb_xml_params->password != $wpbb_password ) ) {
-
- /* username and/or password are not correct, show an error message and stop file loading any further */
- wp_die( __( 'Error: Sorry username and/or password are not valid.', 'wpbroadbean' ) );
-
-
-} // if end username/password authenticate
-
-// we are authenticated now and therefore we need to check what to do are we adding a job or deleting a job.
-if ( strtolower( wp_strip_all_tags( (string) $wpbb_xml_params->command ) ) === 'add' ) {
-
- // get the job post id of the job being added - if it already exitsts.
- $existing_job_post_id = wpbb_get_job_by_reference( (string) $wpbb_xml_params->job_reference );
-
- // first check no other job already in the system has this job reference.
- if ( false !== $existing_job_post_id ) {
-
- // we have no job in the system already with this job reference. Check if we are allowing job updates.
- if ( false === apply_filters( 'wpbb_allow_job_updates', true ) ) {
-
- // there is already a job in the system with this job reference fail and tell the user why.
- wp_die( esc_html__( 'Error: Oops, this job was not added, as a job with this jobs job reference already exists and job updates are not allowed on this site.', 'wpbroadbean' ) );
-
- }
- }
-
- /**
- * We are good to go in terms of adding the job to the system
- * lets start by handling the jobs taxonomies
- * get a list of all the wpbb registered taxonomies
- * once this has run all the terms to add to this job are stored in the array named $wpbb_tax_terms
- */
- $wpbb_taxonomies = wpbb_get_registered_taxonomies();
-
- /* set up holding array */
- $wpbb_tax_terms = array();
-
- /**
- * Loop through each of the taxonomies we have preparing it for adding to the post
- */
- foreach ( $wpbb_taxonomies as $taxonomy ) {
-
- /* if no tax terms sent - continue */
- if ( '' === $wpbb_xml_params->{ $taxonomy['bb_field'] } ) {
- continue;
- }
-
- /* add the prepared terms to our terms array */
- $wpbb_tax_terms[ $taxonomy['bb_field'] ] = wpbb_prepare_terms( $wpbb_xml_params->{ $taxonomy['bb_field'] }, $taxonomy );
-
- }
-
- // create an array of arguments to insert the new job post with.
- $wpbb_insert_job_post_args = array(
- 'post_type' => wpbb_job_post_type_name(),
- 'post_title' => wp_strip_all_tags( (string) $wpbb_xml_params->job_title ),
- 'post_content' => wp_kses( $wpbb_xml_params->job_description, wp_kses_allowed_html( 'post' ) ),
- 'post_excerpt' => wp_kses_post( $wpbb_xml_params->short_description ),
- 'post_status' => 'publish',
- );
-
- // if we have an existing job post id.
- if ( 0 !== $existing_job_post_id ) {
-
- // set the post id in the insert jobs args array so that the post gets updated and not added.
- $wpbb_insert_job_post_args['ID'] = $existing_job_post_id;
-
- }
-
- /**
- * Lets now insert the actual post into wordpress
- * uses the wp_insert_post function to do this
- * if this works it will return the post id of the job added
- */
- $wpbb_job_post_id = wp_insert_post(
- apply_filters(
- 'wpbb_insert_job_post_args',
- $wpbb_insert_job_post_args,
- $wpbb_xml_params
- )
- );
-
- /**
- * Lets check that the job was added
- * checking for a job id present in the variable
- */
- if ( 0 !== $wpbb_job_post_id ) {
-
- /**
- * If wpbb logging is set to true the plugin will save the raw incoming XML feed
- * as post meta for this job with the key being _wpbb_raw_bb_feed
- * it also add the date before the XML output.
- */
- if ( true === $wpbb_logging ) {
-
- $wpbb_debug_content = array();
-
- /* combine the XML with the current date stamp */
- $wpbb_debug_content['sent_date'] = date( 'd:m:Y H:i:s' );
- $wpbb_debug_content['sent_xml'] = $wpbb_xml_content;
-
- /* lets save the raw posted data in post meta for this job */
- add_post_meta(
- $wpbb_job_post_id, // this is id of the job we have just added.
- '_wpbb_raw_bb_feed', // this is the meta key to store the post meta in.
- $wpbb_debug_content, // this is value to store - sent from broadbean.
- true
- );
-
- } // End if().
-
- /**
- * Job was added successfully
- * start by looping through the tax terms ids to add to this job
- */
- foreach ( $wpbb_taxonomies as $taxonomy ) {
-
- /* if no tax terms sent - continue */
- if ( '' === $wpbb_xml_params->{ $taxonomy['bb_field'] } ) {
- continue;
- }
-
- wp_set_post_terms(
- $wpbb_job_post_id,
- $wpbb_tax_terms[ $taxonomy['bb_field'] ],
- $taxonomy['taxonomy_name']
- );
-
- /**
- * @hook wpbb_job_term_added
- * fires after the term has been added
- * @param (int) $wpbb_job_post_id is the post id for the added job
- * @param (string) $wpbb_tax_term term to be added
- * @param (array) $taxonomy taxonomy of the term
- */
- do_action( 'wpbb_job_term_added', $wpbb_job_post_id, $wpbb_tax_terms[ $taxonomy['bb_field'] ], $taxonomy['taxonomy_name'] );
-
- } // End foreach().
-
- /**
- * Now we need to handle the job fields that should be added to this job
- * lets start by getting all the job fields as an array
- */
- $wpbb_job_fields = wpbb_get_job_fields();
-
- /* check we have any fields */
- if ( ! empty( $wpbb_job_fields ) ) {
-
- /**
- * We need to loop through each of these fields
- * using info stored in the array we need to add each field to the job
- * start a loop to loop through each field
- */
- foreach ( $wpbb_job_fields as $field ) {
-
- /**
- * We cannot carry on if this field does not have a bb_field array element
- * lets check it is present and if not move onto the next field
- */
- if ( empty( $field['bb_field'] ) ) {
- continue;
- }
-
- /**
- * Check that the XML tag containing the bb_field is actually set to something
- * i.e. do we have data sent to actually store
- */
- if ( ! empty( $wpbb_xml_params->{ $field['bb_field'] } ) ) {
-
- // lets add the sent data as post meta for this job.
- add_post_meta(
- $wpbb_job_post_id, // this is id of the job we have just added.
- $field['id'], // this is the meta key to store the post meta in.
- wp_strip_all_tags( (string) $wpbb_xml_params->{ $field['bb_field'] } ), // this is value to store - sent from.broadbean.
- true
- );
-
- /**
- * @hook wpbb_job_field_added
- * fires after the field/meta has been added
- * @param (int) $wpbb_job_post_id is the post id for the added job
- * @param (string) $field[ 'id' ] is the post meta key for this field
- * @param (string) $wpbb_xml_params->{ $field[ 'bb_field' ] } the value of the meta key
- */
- do_action( 'wpbb_job_field_added', $wpbb_job_post_id, $field['id'], (string) $wpbb_xml_params->{ $field['bb_field'] } );
-
- } // End if().
- } // End foreach().
- } // End if().
-
- /**
- * Job has been added now
- * @hook - wpbb_job_added
- */
- do_action( 'wpbb_job_added', $wpbb_job_post_id, $wpbb_xml_params );
-
- /**
- * Everything appears to have worked
- * therefore lets output a success message
- */
- echo apply_filters( 'wpbb_job_added_success_message', 'Success: This Job has been added and has a post ID of ' . $wpbb_job_post_id . '. The permalink to this job is: ' . get_permalink( $wpbb_job_post_id ) );
-
- /**
- * wp_insert_post returned zero
- * this means the post was not added
- */
- } else {
-
- /* output a error to the indicate the problem */
- esc_html_e( 'Error: There was an error, the job was not published.', 'wpbroadbean' );
-
- } // End if().
-
-/**
- * we are not adding a job
- * are we deleting one then?
- */
-} elseif ( strtolower( wp_strip_all_tags( (string) $wpbb_xml_params->command ) ) === 'delete' ) {
-
- /**
- * we are therefore deleting a job from the system
- * we will used the job reference for the job to delete to first find
- * the job in wordpress
- */
- $job_post = wpbb_get_job_by_reference( (string) $wpbb_xml_params->job_reference );
-
- /* check we have a job with that reference to delete */
- if( $job_post != false ) {
-
- /* setup string of deleted posts */
- $wpbb_deleted_posts = 'Post or posts deleted. The following post or posts were deleted: ';
-
- /* delete the post */
- $deleted = wp_delete_post( $job_post );
-
- /* add to delete posts string */
- $wpbb_deleted_posts .= $job_post . ' | Job Reference: ' . $wpbb_xml_params->job_reference;
-
- /* output confirmation message */
- echo $wpbb_deleted_posts . '
';
-
- } // end if have job with this reference
-
-/**
- * so we are not adding a job
- * we are not deleting a job
- * therefore the command sent must be wrong - must be one of add/delete
- */
-} else {
-
- /* output an error message indicating the problem */
- wp_die( __( 'Error: Unknown . Must be either add or delete.' ) );
-
-} // end if adding or deleting a job
-
-/* stop any further loading */
-die();
\ No newline at end of file
diff --git a/inc/.DS_Store b/inc/.DS_Store
new file mode 100644
index 0000000..e9a358c
Binary files /dev/null and b/inc/.DS_Store differ
diff --git a/inc/admin-menus/add-menus.php b/inc/admin-menus/add-menus.php
new file mode 100644
index 0000000..b3ced0c
--- /dev/null
+++ b/inc/admin-menus/add-menus.php
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 'candidate_name',
+ 'name' => __( 'Name', 'wpbroadbean' ),
+ 'desc' => __( 'Please enter your full name.', 'wpbroadbean' ),
+ 'input_type' => 'text',
+ 'required' => true,
+ 'order' => 10,
+ );
+
+ /* add the candidate email field */
+ $fields['candidate_email'] = array(
+ 'id' => 'candidate_email',
+ 'name' => __( 'Email', 'wpbroadbean' ),
+ 'input_type' => 'email',
+ 'desc' => __( 'Enter a valid email address.', 'wpbroadbean' ),
+ 'sanitization_cb' => 'sanitize_email',
+ 'required' => true,
+ 'order' => 20,
+ );
+
+ /* add the candidate message field */
+ $fields['message'] = array(
+ 'id' => 'message',
+ 'name' => __( 'Cover Letter', 'wpbroadbean' ),
+ 'input_type' => 'textarea',
+ 'desc' => __( 'Add your cover letter for supporting information here.', 'wpbroadbean' ),
+ 'sanitization_cb' => 'sanitize_textarea_field',
+ 'required' => true,
+ 'options' => array(
+ 'media_buttons' => false,
+ 'textarea_rows' => 10,
+ ),
+ 'order' => 30,
+ );
+
+ /* add the cv file upload field */
+ $fields['cv'] = array(
+ 'id' => 'cv',
+ 'name' => __( 'Upload a CV', 'wpbroadbean' ),
+ 'type' => 'list_attachments',
+ 'input_type' => 'file',
+ 'required' => true,
+ 'options' => array(
+ 'allowed_file_types' => array(
+ 'pdf' => 'application/pdf',
+ 'word' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+ 'word_old' => 'application/msword',
+ 'pages' => 'application/vnd.apple.pages',
+ 'open_text' => 'application/vnd.oasis.opendocument.text',
+ 'rich_text' => 'application/rtf',
+ 'text' => 'text/plain',
+ ),
+ ),
+ 'desc' => __( 'Upload your CV to accompany your application for this job.', 'wpbroadbean' ),
+ 'order' => 40,
+ );
+
+ // add the consent checkbox.
+ $fields['consent'] = array(
+ 'id' => 'consent',
+ 'name' => __( 'Consent', 'wpbroadbean' ),
+ 'input_type' => 'checkbox',
+ 'desc' => sprintf(
+ wp_kses_post( 'Please tick this box to consent to us using your data. How we use your data is outlined in our privacy policy ', 'wpbroadbean' ),
+ get_privacy_policy_url()
+ ),
+ 'sanitization_cb' => 'absint',
+ 'required' => true,
+ 'order' => 50,
+ );
+
+ /* return the modified fields array */
+ return $fields;
+
+}
+
+add_filter( 'wpbb_application_fields', 'wpbb_add_default_application_fields', 10, 1 );
+
+// if this function does not already exist.
+if ( ! function_exists( 'wpbb_application_form_field_text' ) ) {
+
+ /**
+ * Renders the application for text field.
+ *
+ * @param array $field the field array for this field being output.
+ */
+ function wpbb_application_form_field_text( $field ) {
+
+ /**
+ * Fire an action before the field is output.
+ */
+ do_action( 'wpbb_before_application_field_output', $field );
+
+ ?>
+
+ * ' : '' ); ?>
+ />
+
+
+
+ * ' : '' ); ?>
+ />
+
+
+
+ *' : '' ); ?>
+ />
+
+
+
+ *' : '' ); ?>
+ >
+
+
+
+ *' : '' ); ?>
+ />
+
+
+
+ value="1" />
+ *' : '' ); ?>
+
+
+
+
+
+
+
+ ' . $field['desc'] . '' );
+
+ }
+ }
+
+}
+
+add_action( 'wpbb_after_application_field_output', 'wpbb_output_application_field_description', 10, 1 );
+
+/**
+ * Sends the email notifications when applications are submitted. Sends tracking back to Broadbean.
+ *
+ * @param integer $application_id The post ID of the newly created application.
+ * @param array $attachment_ids An array of any attachment IDs added to the application.
+ */
+function wpbb_send_application_email_notification( $application_id, $attachment_ids ) {
+
+ // get the job id for the job this application applied for.
+ $job_id = get_post_meta( $application_id, 'job_post_id', true );
+
+ // get the applicant tracking email for the job this application was against.
+ $tracking_email = wpbb_get_job_applicant_tracking_email( $job_id );
+
+ // create an array of the information to include in this notification, about the application.
+ $notification_data = apply_filters(
+ 'wpbb_application_email_data',
+ array(),
+ $application_id,
+ $attachment_ids,
+ $job_id
+ );
+
+ // setup array for fill with data for the email.
+ $recipients = array();
+ $headers = array();
+ $attachments = array();
+
+ // build the email content using the view template.
+ $notification_content = wpbb_load_view( 'application-email', $notification_data );
+
+ // if we have a tracking email - add it to the recipients array.
+ $recipients['applicant_tracking_email'] = $tracking_email;
+
+ // get the applicants name and email address.
+ $name = wpbb_get_application_applicant_name( $application_id );
+ $email = wpbb_get_application_applicant_email( $application_id );
+
+ // add the from email header.
+ $headers['from'] = 'From: ' . esc_html( $name ) . ' <' . $email . '>';
+
+ // get an array of all the attachments for this application.
+ $application_attachments = get_attached_media(
+ apply_filters( 'wpbb_application_attachment_mime_type', 'application' ),
+ $application_id
+ );
+
+ // if we have attachments.
+ if ( ! empty( $application_attachments ) ) {
+
+ // loop through each media item.
+ foreach ( $application_attachments as $attachment ) {
+
+ // add the attachment file path to the email attachments array.
+ $attachments[] = get_attached_file( $attachment->ID );
+
+ }
+ }
+
+ // set the notification subject.
+ $subject = __( 'New Job Application Submitted', 'wpbroadbean' );
+
+ // allow all the notification parts to be filtered.
+ $recipients = apply_filters( 'wpbb_default_notification_recipients', $recipients, $application_id, $attachment_ids, $job_id );
+ $headers = apply_filters( 'wpbb_default_notification_recipients', $headers, $application_id, $attachment_ids, $job_id );
+ $attachments = apply_filters( 'wpbb_default_notification_recipients', $attachments, $application_id, $attachment_ids, $job_id );
+ $notification_content = apply_filters( 'wpbb_default_notification_content', $notification_content, $application_id, $attachment_ids, $job_id );
+
+ // set the email content type to html.
+ add_filter( 'wp_mail_content_type', 'wpbb_text_html_email_type' );
+
+ // finally - send the notification email.
+ $send_notification = wp_mail(
+ $recipients,
+ $subject,
+ $notification_content,
+ $headers,
+ $attachments
+ );
+
+ // reset the html email content type - clean up after ourselves!
+ remove_filter( 'wp_mail_content_type', 'wpbb_text_html_email_type' );
+
+ // if the email sent successfully.
+ if ( false !== $send_notification ) {
+
+ /**
+ * Fire an action which runs once the notification is sent.
+ */
+ do_action( 'wpbb_default_notification_sent', $application_id, $job_id );
+
+ }
+
+}
+
+add_action( 'wpbb_application_processing_complete', 'wpbb_send_application_email_notification', 10, 2 );
+
+/**
+ * Sets the array of data to be included in the application email.
+ *
+ * @param array $data The array of data to include.
+ * @param integer $application_id The post ID of the application.
+ * @param array $attachment_ids An array of attachment IDs.
+ * @return array The modifed array of data.
+ */
+function wpbb_set_application_email_data( $data, $application_id, $attachment_ids, $job_id ) {
+
+ // get the application fields.
+ $application_fields = wpbb_get_application_fields();
+
+ // if we have no fields.
+ if ( empty( $application_fields ) ) {
+ return $data;
+ }
+
+ // if the application fields array includes a CV upload field.
+ if ( isset( $application_fields['cv'] ) ) {
+
+ // remove it from the array.
+ unset( $application_fields['cv'] );
+
+ }
+
+ // loop through each field.
+ foreach ( $application_fields as $application_field ) {
+
+ // add this field to the data array.
+ $data[ $application_field['id'] ] = array(
+ 'label' => $application_field['name'],
+ 'value' => get_post_meta( $application_id, $application_field['id'], true ),
+ );
+
+ }
+
+ // add the job title applied for.
+ $data['job_post_title'] = array(
+ 'label' => __( 'Job Applied for Title', 'wpbroadbean' ),
+ 'value' => get_the_title( $job_id ),
+ );
+
+ // add the job post permalink for the job applied for.
+ $data['job_post_url'] = array(
+ 'label' => __( 'Job Applied for URL', 'wpbroadbean' ),
+ 'value' => get_permalink( $job_id ),
+ );
+
+ return $data;
+
+}
+
+add_filter( 'wpbb_application_email_data', 'wpbb_set_application_email_data', 10, 3 );
+
+/**
+ * Removes the application created and the attachments.
+ *
+ * @param integer $application_id The post ID of the application post.
+ * @param array $attachment_ids An array of attachment IDs for attachments addded to the application.
+ */
+function wpbb_remove_application( $application_id, $attachment_ids ) {
+
+ // if we have attachments to remove from this application.
+ if ( ! empty( $attachment_ids ) ) {
+
+ // loop through each attachment.
+ foreach ( $attachment_ids as $attachment_id ) {
+
+ // delete the attachment.
+ wp_delete_attachment( $attachment_id, true );
+
+ }
+ }
+
+ // delete the application post.
+ wp_delete_post( $application_id, true );
+
+}
+
+add_action( 'wpbb_application_processing_complete', 'wpbb_remove_application', 20, 2 );
diff --git a/inc/applications/application-form.php b/inc/applications/application-form.php
new file mode 100644
index 0000000..c8338a3
--- /dev/null
+++ b/inc/applications/application-form.php
@@ -0,0 +1,166 @@
+' . esc_html( $message ) . '' );
+ }
+
+ // if form is not yet posted.
+ if ( ! isset( $_POST['wpbb_application_data']['submit'] ) ) {
+
+ /* build an array of data to pass to our view */
+ $application_form_data = apply_filters(
+ 'wpbb_application_form_data_array',
+ array(
+ 'post_id' => $job_id,
+ )
+ );
+
+ /* load the view to handle outputting the application form */
+ $html = wpbb_load_view( 'application-form', $application_form_data );
+
+ } else { // form has been posted.
+
+ /* set a string to store all messages in */
+ $wpbb_message_output = array();
+
+ /* get any messages */
+ global $wpbb_messages;
+
+ /* run messages through a filter so devs can alter them */
+ $wpbb_messages = apply_filters(
+ 'wpbb_application_form_messages',
+ $wpbb_messages
+ );
+
+ /* if we have some messages to loop through */
+ if ( ! empty( $wpbb_messages ) ) {
+
+ /* loop through each message adding to string */
+ foreach ( $wpbb_messages as $key => $message ) {
+ $wpbb_message_output[] = '' . esc_html( $message['message'] ) . '
';
+ }
+ }
+
+ // add the post ID to the messages array.
+ $wpbb_message_output['post_id'] = $job_id;
+
+ $html = wpbb_load_view( 'messages', $wpbb_message_output );
+
+ } // End if().
+
+ // return the form html output.
+ return $html;
+
+}
+
+/**
+ * Echos the job application form for a given job id.
+ *
+ * @param integer $job_id The job post ID to return the form for.
+ * @return mixed The markup for the application form for the given job id or an empty string.
+ */
+function wpbb_job_application_form( $job_id = 0 ) {
+ echo wpbb_get_job_application_form( $job_id );
+}
+
+/**
+ * Outputs a job application after the post content on a single job view.
+ *
+ * @param string $content The current content of the post.
+ * @return string The content of the post with the application form appended.
+ */
+function wpbb_job_application_form_output( $content ) {
+
+ // if this is not a single job view.
+ if ( ! is_singular( wpbb_job_post_type_name() ) ) {
+ return $content;
+ }
+
+ // get the form HTML for this current job.
+ global $post;
+ $form_html = wpbb_get_job_application_form( $post->ID );
+
+ // return the original content and the form html.
+ return $content . $form_html;
+
+}
+
+add_filter( 'the_content', 'wpbb_job_application_form_output', 20, 1 );
+
+/**
+ * Outputs the markup for the application form fields.
+ *
+ * @param array $data an array of data passed about the current job applying for.
+ */
+function wpbb_output_application_form_fields( $data ) {
+
+ // add a nonce field to the form.
+ wp_nonce_field( 'wpbb_application_nonce_action', 'wpbb_application_nonce_field' );
+
+ /* get the application form fields */
+ $fields = wpbb_get_application_fields();
+
+ /* check we have fields to action */
+ if ( ! empty( $fields ) ) {
+
+ // create an array of defaults for application fields.
+ $defaults = array(
+ 'id' => '',
+ 'name' => '',
+ 'desc' => '',
+ 'input_type' => 'text',
+ 'required' => true,
+ 'order' => 10,
+ 'validation_string' => __( 'This is a required field.', 'wpbroadbean' ),
+ );
+
+ /* loop through each field */
+ foreach ( $fields as $field ) {
+
+ // parse the field args with the defaults.
+ $field = wp_parse_args( $field, $defaults );
+
+ // create a filterable array of classes for this field.
+ $classes = apply_filters(
+ 'wpbb_application_form_field_classes',
+ array(
+ 'wpbb-application-field',
+ 'wpbb-application-field-' . esc_attr( $field['input_type'] ),
+ ),
+ $field
+ );
+
+ ?>
+
+
+
+
+
+ 'error',
+ 'message' => __( 'Error: Nonce problem.', 'wpbroadbean' ),
+ );
+
+ // go no further as application not added.
+ return;
+
+ }
+
+ // if the form has been posted.
+ if ( ! isset( $_POST['wpbb_application_data'] ) ) {
+ return;
+ }
+
+ // store our posted data array.
+ $application_data = $_POST['wpbb_application_data'];
+
+ // sanitize the job post id for which this application was made against.
+ $job_post_id = absint( $post->ID );
+
+ // create a title for the application - based on the current timestamp.
+ $application_title = time();
+
+ // insert the new application post for this entry - temporarily of course!.
+ $application_post_id = wp_insert_post(
+ apply_filters(
+ 'wpbb_insert_application_post_args',
+ array(
+ 'post_type' => 'wpbb_application',
+ 'post_title' => sanitize_text_field( $application_title ),
+ 'post_status' => 'draft',
+ ),
+ $application_data
+ )
+ );
+
+ // check the application post was created.
+ if ( 0 === $application_post_id ) {
+
+ // add an error message.
+ $wpbb_messages['application_not_saved'] = array(
+ 'type' => 'error',
+ 'message' => __( 'Error: Application could not be saved.', 'wpbroadbean' ),
+ );
+
+ // go no further as application not added.
+ return;
+
+ } else {
+
+ // add an success message.
+ $wpbb_messages['application_saved'] = array(
+ 'type' => 'success',
+ 'message' => __( 'Success: Application received.', 'wpbroadbean' ),
+ );
+
+ }
+
+ // get all the registered application fields.
+ $fields = wpbb_get_application_fields();
+
+ // if we have application fields, there must be fields in the form to process.
+ if ( ! empty( $fields ) ) {
+
+ // create an array of attachment ids.
+ $attachment_ids = array();
+
+ // loop through each field.
+ foreach ( $fields as $field ) {
+
+ // if this is a file upload field.
+ if ( 'file' === $field['input_type'] ) {
+
+ // action uploading the file and attaching to the application post.
+ $attachment_ids[] = wpbb_action_file_upload_field( $application_post_id, $field );
+
+ } else {
+
+ // find this field in our posted data.
+ $field_value = $application_data[ $field['id'] ];
+
+ // check if we have a sanitization callback.
+ if ( ! isset( $field['sanitization_cb'] ) ) {
+
+ // set a default sanitization callback function.
+ $field['sanitization_cb'] = 'sanitize_text_field';
+
+ }
+
+ // sanitize the posted field value.
+ $field_value = call_user_func( $field['sanitization_cb'], $field_value );
+
+ // update the value as post meta to the created application post type.
+ $field_added = update_post_meta( $application_post_id, $field['id'], $field_value );
+
+ // if the field failed to add.
+ if ( false === $field_added ) {
+
+ // add an error message.
+ $wpbb_messages['application_field_not_saved'] = array(
+ 'type' => 'error',
+ 'message' => sprintf(
+ /* Translators: 1: Field name or label */
+ __( 'Error: %s could not be added to the application.', 'wpbroadbean' ),
+ $field['name']
+ ),
+ );
+
+ } // End if().
+ } // End if().
+ } // End foreach().
+ } // End if().
+
+ // save the job id of the job being applied for with the application.
+ update_post_meta( $application_post_id, 'job_post_id', absint( $post->ID ) );
+
+ /**
+ * Fires after the application processing is completed.
+ *
+ * @param integer $application_post_id The newly created application post id.
+ * @param array $attachment_ids An array of the application attachment ids - uploaded files.
+ *
+ * @hooked wpbb_send_application_email_notification - 10.
+ * @hooked wpbb_remove_application - 20.
+ */
+ do_action( 'wpbb_application_processing_complete', $application_post_id, $attachment_ids );
+
+}
+
+add_action( 'wp', 'wpbb_process_application_form' );
diff --git a/inc/endpoint.php b/inc/endpoint.php
new file mode 100644
index 0000000..76299b3
--- /dev/null
+++ b/inc/endpoint.php
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+ ' . sprintf( __( 'Broadbean integration by %s', 'wpbroadbean' ), 'Highrise Digital ' ) . ' ';
+
+ }
+ }
+
+ return $content;
+
+}
+
+add_filter( 'the_content', 'wpbb_maybe_add_plugin_credit', 99 );
+
+/**
+ * Adds the job field descriptions under the fields.
+ *
+ * @param array $field The field array.
+ */
+function wpbb_add_job_field_descriptions( $field ) {
+
+ ?>
+
+ ID );
+
+ // if this attachment does not have a parent.
+ if ( 0 === $attachment->post_parent ) {
+ return $attachment_link;
+ }
+
+ // if the parent post type if not an application.
+ if ( 'wpbb_application' !== get_post_type( $attachment->post_parent ) ) {
+ return $attachment_link;
+ }
+
+ // return the attachment link.
+ return '';
+
+}
+
+add_filter( 'prepend_attachment', 'wpbb_remove_application_attachment_content_links', 10, 1 );
+
+/**
+ * Outputs the job data - meta and terms.
+ *
+ * @param string $content The current job post content.
+ * @return string The modified job post content.
+ */
+function wpbb_ouput_job_meta_data( $content ) {
+
+ // if this is a not a singular job post.
+ if ( ! is_singular( wpbb_job_post_type_name() ) ) {
+ return $content;
+ }
+
+ // if we should not be showing this then just return the unmodifed content.
+ if ( true === wpbb_hide_job_data_output() ) {
+ return $content;
+ }
+
+ global $post;
+
+ // get the job meta data.
+ $data = wpbb_get_job_meta_data(
+ array(
+ 'post_id' => $post->ID,
+ )
+ );
+
+ // return the post content along with the meta data.
+ return $content . $data;
+
+}
+
+add_filter( 'the_content', 'wpbb_ouput_job_meta_data', 10, 1 );
+
+/**
+ * Alters the post enter title here text for jobs.
+ *
+ * @param string $title The current title placeholder text.
+ * @return string The new title placeholder text.
+ */
+function wpbb_change_job_post_title_text( $title ) {
+
+ // get the current screen we are viewing in the admin.
+ $screen = get_current_screen();
+
+ // if the current screen is our job post type.
+ if ( wpbb_job_post_type_name() === $screen->post_type ) {
+
+ // set the new text for the title box.
+ $title = __( 'Job Title', 'wpbroadbean' );
+
+ }
+
+ /* return our new text */
+ return apply_filters( 'wpbb_post_title_text', $title, $wpbb_screen );
+
+}
+
+add_filter( 'enter_title_here', 'wpbb_change_job_post_title_text' );
diff --git a/inc/functions.php b/inc/functions.php
new file mode 100644
index 0000000..ea184c9
--- /dev/null
+++ b/inc/functions.php
@@ -0,0 +1,835 @@
+ sanitize_title( $wpbb_taxonomy_term ),
+ )
+ );
+
+ // check if the taxonomy is hierarchical.
+ if ( true === $taxonomy['hierarchical'] ) {
+
+ // add to term id to our terms array.
+ $wpbb_tax_terms[] = $new_term['term_id'];
+
+ } else {
+
+ // get the term name from its id.
+ $new_term_obj = get_term_by(
+ 'id',
+ $new_term['term_id'],
+ $taxonomy['taxonomy_name']
+ );
+
+ /* add the term name to our terms array */
+ $wpbb_tax_terms[] = $new_term_obj->name;
+
+ }
+ }
+ } // End if().
+ } // End foreach().
+
+ return $wpbb_tax_terms;
+
+}
+
+/**
+ * Gets the class to be added to a job fields wrapper div.
+ *
+ * @param array $field an array of data about a job field - as used when it was registered.
+ * @return string classes to add to the class attr of the div.
+ */
+function wpbb_get_input_field_wrapper_class( $field ) {
+
+ // array to fill with classes.
+ $classes = array( 'wpbb-job-fields__field' );
+
+ // default the type for this field to text if not supplied.
+ $type = ! empty( $field['type'] ) ? $field['type'] : 'text';
+
+ // add the type class to the array.
+ $classes[] = 'wpbb-job-field-' . $type;
+
+ // default the columns for this field to 12 if not supplied.
+ $columns = ! empty( $field['cols'] ) ? $field['cols'] : '12';
+
+ // add the columns to the classes array.
+ $classes[] = 'wpbb-col-' . $columns;
+
+ // return the column class string.
+ return apply_filters( 'wpbb_input_field_wrapper_class', implode( ' ', $classes ), $field );
+
+}
+
+/**
+ * Gets the class that will be added to a job field input.
+ *
+ * @param array $field an array of data about the job field - as used when it was registered.
+ * @return string classes to add to the class attr of the input.
+ */
+function wpbb_get_input_field_class( $field ) {
+
+ // if the field has no type - default to text.
+ if ( ! isset( $field['type'] ) ) {
+ $field['type'] = 'text';
+ }
+
+ // build an array to fill with classes which includes the class for input type.
+ $classes = array( 'wpbb-input' );
+
+ // if this field has a class.
+ if ( isset( $field['classes'] ) ) {
+
+ // if the classes are an array.
+ if ( is_array( $field['classes'] ) ) {
+
+ // loop through each class.
+ foreach ( $field['classes'] as $class ) {
+
+ // add to classes array.
+ $classes[] = $class;
+
+ }
+ }
+ }
+
+ return apply_filters( 'wpbb_input_field_class', implode( ' ', $classes ), $field );
+
+}
+
+/**
+ * Gets the input name for a given job field.
+ *
+ * @param array $field an array of data about the job field - as used when it was registered.
+ * @return string the input name to use that would go in the input name attr.
+ */
+function wpbb_get_input_field_name( $field ) {
+
+ // if the field has no name - use its id.
+ if ( ! isset( $field['name'] ) ) {
+ $field['name'] = $field['id'];
+ }
+
+ return apply_filters( 'wpbb_input_field_name', $field['name'], $field );
+
+}
+
+/**
+ * Gets the input placeholder for a given job fields.
+ *
+ * @param array $field an array of data about the job field - as used when it was registered.
+ * @return string the input placeholder to use that would go in the input placeholder attr.
+ */
+function wpbb_get_input_field_placeholder( $field ) {
+
+ // if the field has no placeholder - use its id.
+ if ( ! isset( $field['placeholder'] ) ) {
+ $field['placeholder'] = '';
+ }
+
+ return apply_filters( 'wpbb_input_field_placeholder', $field['placeholder'], $field );
+
+}
+
+/**
+ * Sorts array of 2 levels on the second level key of order.
+ *
+ * @param mixed $a The first value to compare.
+ * @param mixed $b The second value to compare.
+ * @return mixed Either 0 if the values match or 1 or -1 if they are different.
+ */
+function wpbb_array_sort_by_second_level_order_key( $a, $b ) {
+
+ // if first array does not have an order parameter.
+ if ( empty( $a['order'] ) ) {
+
+ // set order to default to 10.
+ $a['order'] = 10;
+
+ }
+
+ // if second array does not have an order parameter.
+ if ( empty( $b['order'] ) ) {
+
+ // set order to default to 10.
+ $b['order'] = 10;
+
+ }
+
+ // if the first array element is the same as the next.
+ if ( $a['order'] === $b['order'] ) {
+ return 0;
+ }
+
+ // return -1 is the first array element is less than the second, otherwise return 1.
+ return ( $a['order'] < $b['order'] ) ? -1 : 1;
+
+}
+
+/**
+ * Gets the job post id for the specified job reference.
+ *
+ * @param string $job_ref the job reference to find the job post id of.
+ * @return mixed null if no job found with that reference.
+ * post id of the job found if a job is found with that reference.
+ */
+function wpbb_get_job_by_reference( $job_ref = 0 ) {
+
+ // run a WP_Query to find the job with this reference.
+ $jobs = new WP_Query(
+ apply_filters(
+ 'wpbb_get_job_by_reference_args',
+ array(
+ 'post_type' => wpbb_job_post_type_name(),
+ 'post_status' => 'publish',
+ 'posts_per_page' => 750,
+ 'meta_key' => '_wpbb_job_reference',
+ 'meta_value' => $job_ref,
+ 'fields' => 'ids',
+ 'no_found_rows' => true,
+ ),
+ $job_ref
+ )
+ );
+
+ // reset the query.
+ wp_reset_postdata();
+
+ // return the job id.
+ return apply_filters( 'wpbb_get_job_by_reference', array_shift( $jobs->posts ), $job_ref );
+
+}
+
+/**
+ * Loads a view from the views folder in the plugin to output something.
+ *
+ * @param string $path this is the path or filename inside the views folder.
+ * @param array $data an array of data that is available inside the view file via $data.
+ * @return mixed the content of the file.
+ */
+function wpbb_load_view( $path = '', $data = array() ) {
+
+ // build a filterable path for the view.
+ $view_path = apply_filters( 'wpbb_load_view_path', WPBB_LOCATION . '/views/' . $path . '.php', $path, $data );
+
+ /* start output buffering */
+ ob_start();
+
+ /* grab the file asked for */
+ include_once( $view_path );
+
+ /* get the content of the buffer - the file asked for and clean up */
+ $content = ob_get_clean();
+
+ /* return the content */
+ return apply_filters( 'wpbb_load_view_content', $content, $path, $data );
+
+}
+
+/**
+ * Gets the currency symbol for the job post id requested.
+ *
+ * @param integer $post_id the post if of the job to get the currency symbol of.
+ * @return string html entity of the currency symbol if supported or the default is not.
+ */
+function wpbb_get_job_currency_symbol( $post_id = 0 ) {
+
+ // set a filterable default currency.
+ $default_currency_symbol = apply_filters( 'wpbb_default_currency_symbol', '£', $post_id );
+
+ // get the currency code for this job.
+ $currency_code = get_post_meta( $post_id, wpbb_get_job_field_prefix() . 'salary_currency', true );
+
+ // if we have no currency code - return a default.
+ if ( '' === $currency_code ) {
+ $currency_symbol = $default_currency_symbol;
+ }
+
+ // create an array of currency code supported.
+ $supported_currency_codes = apply_filters(
+ 'wpbb_supported_currency_codes',
+ array(
+ 'GBP' => array(
+ 'name' => 'United Kingdom Pound',
+ 'symbol' => '£',
+ ),
+ 'USD' => array(
+ 'name' => 'United States Dollar',
+ 'symbol' => '$',
+ ),
+ 'EUR' => array(
+ 'name' => 'Euro Member Countries',
+ 'symbol' => '€',
+ ),
+ )
+ );
+
+ // if the currency code for this job does not exist in the supported codes.
+ if ( ! isset( $supported_currency_codes[ $currency_code ] ) ) {
+
+ // use the default symbol.
+ $currency_symbol = $default_currency_symbol;
+
+ } else { // currency code for this job is supported.
+
+ // find the symbol in the support list.
+ $currency_symbol = $supported_currency_codes[ $currency_code ]['symbol'];
+
+ }
+
+ // return the currency symbol.
+ return apply_filters( 'wpbb_get_job_currency_symbol', $currency_symbol, $post_id );
+
+}
+
+/**
+ * Gets the jobs data (fields and terms) associated with a job.
+ *
+ * @param array $args An array of args in terms of what to show. See $defaults.
+ * @return mixed false if there is no data or a string of html if there is.
+ */
+function wpbb_get_job_meta_data( $args = array() ) {
+
+ // string to hold meta data in.
+ $meta_output = '';
+
+ // string to hold taxonomy data in.
+ $tax_output = '';
+
+ // entire output string.
+ $output = '';
+
+ global $post;
+
+ // set some defaults for the args.
+ $defaults = array(
+ 'post_id' => $post->ID,
+ 'taxonomies' => wpbb_get_registered_taxonomies(),
+ 'meta' => wpbb_get_job_fields(),
+ 'show_title' => true,
+ );
+
+ // merge defaults with args.
+ $args = wp_parse_args( $args, $defaults );
+
+ // add the wrapper start.
+ $output .= '';
+
+ // if we should output the title.
+ if ( true === $args['show_title'] ) {
+
+ // add the title next.
+ $output .= '
' . esc_html__( 'Job Information', 'wproadbean' ) . ' ';
+
+ }
+
+ // add the job data div.
+ $output .= '
';
+
+ // handle the job fields first if we have any to handle.
+ if ( ! empty( $args['meta'] ) ) {
+
+ // loop through each meta.
+ foreach ( $args['meta'] as $field ) {
+
+ // get the value of this field.
+ $field_value = get_post_meta( $args['post_id'], $field['id'], true );
+
+ // make sure we have a show_on_frontend set.
+ if ( ! isset( $field['show_on_frontend'] ) ) {
+
+ // set to show on both archive and single views.
+ $field['show_on_frontend'] = array( 'single', 'archive' );
+
+ }
+
+ // if we are not showing this data on the front end.
+ if ( false === $field['show_on_frontend'] ) {
+ continue;
+ }
+
+ // if this is the salary from or salary to field.
+ if ( wpbb_get_job_field_prefix() . 'salary_from' === $field['id'] || wpbb_get_job_field_prefix() . 'salary_to' === $field['id'] ) {
+ $value_prefix = wpbb_get_job_currency_symbol( $args['post_id'] );
+ } else {
+ $value_prefix = '';
+ }
+
+ // add this field to the output string.
+ $meta_output .= '
' . esc_html( $field['name'] ) . ': ' . $value_prefix . $field_value . '
';
+
+ } // End foreach().
+ } // End if().
+
+ // add the meta output to the total output if we have meta output.
+ if ( '' !== $meta_output ) {
+ $output .= $meta_output;
+ }
+
+ // handle the job taxonomy terms first checking we have any.
+ if ( ! empty( $args['taxonomies'] ) ) {
+
+ // loop through each taxonomy.
+ foreach ( $args['taxonomies'] as $tax ) {
+
+ // if we are not showing on the front end.
+ if ( false === $tax['show_on_frontend'] ) {
+ continue;
+ }
+
+ // get the terms of this post.
+ $terms = wp_strip_all_tags(
+ get_the_term_list(
+ $args['post_id'],
+ $tax['taxonomy_name'],
+ '',
+ ', ',
+ ''
+ )
+ );
+
+ // if we have terms to display.
+ if ( '' !== $terms ) {
+
+ // add this to the tax output.
+ $tax_output .= '
' . esc_html( $tax['plural'] ) . ': ' . $terms . '
';
+
+ }
+ } // End foreach().
+ } // End if().
+
+ // add the meta output to the total output if we have meta output.
+ if ( '' !== $tax_output ) {
+ $output .= $tax_output;
+ }
+
+ // if we have output.
+ if ( '' !== $output ) {
+
+ // return output filtered.
+ return apply_filters( 'wpbb_get_job_meta_data', $output . '
', $args );
+
+ }
+
+ return '';
+
+}
+
+/**
+ * Gets the application url for a specified job post id.
+ *
+ * @param integer $job_id the post id of the job to get the url for.
+ * @return mixed if the job has a url a string is returned of the url.
+ * if the job has now application url returns an empty string.
+ */
+function wpbb_get_job_application_url( $job_id = 0 ) {
+
+ // return the tracking email from post meta.
+ return apply_filters(
+ 'wpbb_job_application_url',
+ get_post_meta( $job_id, wpbb_get_job_field_prefix() . 'application_url', true ),
+ $job_id
+ );
+
+}
+
+/**
+ * Outputs a required string if the field passed in is a required field.
+ *
+ * @param array $field An array of the registered application field.
+ */
+function wpbb_maybe_application_field_required( $field = array() ) {
+
+ $required_output = '';
+
+ // if this field is a required field.
+ if ( true === $field['required'] ) {
+
+ // set the required output.
+ $required_output = ' required';
+
+ }
+
+ // echo the required string.
+ echo esc_attr( $required_output );
+
+}
+
+/**
+ * Actions a file upload.
+ *
+ * @param integer $application_id the id of the application post produced.
+ * @param array $field an array of field data for the file upload field.
+ * @return mixed in success the attachment id of the upload
+ * on failure returns false.
+ */
+function wpbb_action_file_upload_field( $application_id = 0, $field = array() ) {
+
+ /* check that the wp_handle_upload function is loaded */
+ if ( ! function_exists( 'wp_handle_upload' ) ) {
+ require_once( ABSPATH . 'wp-admin/includes/file.php' );
+ }
+
+ /* get the uploaded file information */
+ $uploaded_file = $_FILES[ esc_attr( $field['id'] ) ];
+
+ /* check that the $_FILES var is an array */
+ if ( ! is_array( $uploaded_file ) ) {
+
+ /* add an error message */
+ $wpbb_messages['attachment_failed'] = array(
+ 'type' => 'error',
+ 'message' => __( 'Error: File attachment failed.', 'hd-job-integrator' ),
+ );
+
+ /* go no further as file type not allowed */
+ return false;
+ }
+
+ /* sanitize the uploaded file name */
+ $uploaded_file_name = sanitize_text_field( $uploaded_file['name'] );
+
+ /* check we have a file to upload */
+ if ( '' !== $uploaded_file_name ) {
+
+ /* set overides to make it work */
+ $upload_overrides = array(
+ 'test_form' => false,
+ );
+
+ /* upload the file to wp uploads dir */
+ $moved_file = wp_handle_upload( $uploaded_file, $upload_overrides );
+
+ /* get file type of the uploaded file */
+ $filetype = wp_check_filetype( $moved_file['url'], null );
+
+ /* generate array of allowed mime types */
+ $allowed_mime_types = apply_filters(
+ 'wpbb_application_allowed_file_types',
+ array(
+ 'pdf' => 'application/pdf',
+ 'word' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+ 'word_old' => 'application/msword',
+ 'pages' => 'application/vnd.apple.pages',
+ 'open_text' => 'application/vnd.oasis.opendocument.text',
+ 'rich_text' => 'application/rtf',
+ 'text' => 'text/plain',
+ )
+ );
+
+ /* check uploaded file is in allowed mime types array */
+ if ( ! in_array( $filetype['type'], $allowed_mime_types, true ) ) {
+
+ /* add an error message */
+ $wpbb_messages['cv_type_failed'] = array(
+ 'type' => 'error',
+ 'message' => __( 'Error: CV is not an allowed file type.', 'hd-job-integrator' ),
+ );
+
+ } else { /* excellent we have a file to upload */
+
+ /* get the wp upload directory */
+ $wp_upload_dir = wp_upload_dir();
+
+ /* setup the attachment data */
+ $attachment = array(
+ 'post_mime_type' => $filetype['type'],
+ 'post_title' => preg_replace( '/\.[^.]+$/', '', $application_id . '-' . time() ), // use a post title not related to the application.
+ 'post_content' => '',
+ 'guid' => $wp_upload_dir['url'] . '/' . basename( $moved_file['file'] ),
+ 'post_status' => 'inherit',
+ );
+
+ /* check the application post has been added */
+ if ( 0 !== $application_id ) {
+
+ /* check we have a file to attach */
+ if ( '' !== $uploaded_file_name ) {
+
+ /* add the attachment from the uploaded file */
+ $attachment_id = wp_insert_attachment( $attachment, $moved_file['file'], $application_id );
+ require_once( ABSPATH . 'wp-admin/includes/image.php' );
+ $attachment_data = wp_generate_attachment_metadata( $attachment_id, $moved_file['file'] );
+ wp_update_attachment_metadata( $attachment_id, $attachment_data );
+
+ }
+ }
+ } // End if().
+
+ /* return the attachment id of the added file */
+ return absint( $attachment_id );
+
+ } // End if().
+
+ return false;
+
+}
+
+/**
+ * Sets the email type in WordPress to html.
+ *
+ * @return string the email type to use
+ */
+function wpbb_text_html_email_type() {
+ return 'text/html';
+}
+
+/**
+ * Gets the applicant candidate name for a given application.
+ *
+ * @param integer $application_id The post ID of the application to get the name of.
+ * @return string The name of the applicant or an empty string.
+ */
+function wpbb_get_application_applicant_name( $application_id = 0 ) {
+ return apply_filters(
+ 'wpbb_application_applicant_name',
+ get_post_meta( $application_id, 'candidate_name', true ),
+ $application_id
+ );
+}
+
+/**
+ * Gets the applicant candidate email address for a given application.
+ *
+ * @param integer $application_id The post ID of the application to get the name of.
+ * @return string The email of the applicant or an empty string.
+ */
+function wpbb_get_application_applicant_email( $application_id = 0 ) {
+ return apply_filters(
+ 'wpbb_application_applicant_name',
+ get_post_meta( $application_id, 'candidate_email', true ),
+ $application_id
+ );
+}
+
+/**
+ * Sorts array of 2 levels on the second level key of order.
+ *
+ * @param mixed $a The first value to compare.
+ * @param mixed $b The second value to compare.
+ * @return mixed Either 0 if the values match or 1 or -1 if they are different.
+ */
+function wpbb_array_sort_by_order_key( $a, $b ) {
+
+ // if no order paramter is provided.
+ if ( ! isset( $a['order'] ) ) {
+
+ // set the order to 10.
+ $a['order'] = 10;
+
+ }
+
+ // if no order paramter is provided.
+ if ( ! isset( $b['order'] ) ) {
+
+ // set the order to 10.
+ $b['order'] = 10;
+
+ }
+
+ // if the first array element is the same as the next.
+ if ( $a['order'] === $b['order'] ) {
+ return 0;
+ }
+
+ // return -1 is the first array element is less than the second, otherwise return 1.
+ return ( $a['order'] < $b['order'] ) ? -1 : 1;
+
+}
diff --git a/inc/job-fields/.DS_Store b/inc/job-fields/.DS_Store
new file mode 100644
index 0000000..5008ddf
Binary files /dev/null and b/inc/job-fields/.DS_Store differ
diff --git a/inc/job-fields/job-fields-default.php b/inc/job-fields/job-fields-default.php
new file mode 100644
index 0000000..22ffa9a
--- /dev/null
+++ b/inc/job-fields/job-fields-default.php
@@ -0,0 +1,189 @@
+ $prefix . 'short_description',
+ 'name' => __( 'Short Description', 'wpbroadbean' ),
+ 'type' => 'textarea',
+ 'xml_field' => 'short_description',
+ 'desc' => __( 'Enter a short description for the job.', 'wpbroadbean' ),
+ 'show_on_frontend' => false,
+ 'cols' => 12,
+ 'order' => 5,
+ );
+
+ /* add the job reference field */
+ $fields['job_reference'] = array(
+ 'id' => $prefix . 'reference',
+ 'name' => __( 'Job Reference', 'wpbroadbean' ),
+ 'type' => 'text',
+ 'xml_field' => 'job_reference',
+ 'desc' => __( 'Unique to each job.', 'wpbroadbean' ),
+ 'show_on_frontend' => true,
+ 'cols' => 4,
+ 'order' => 10,
+ );
+
+ /* add the application tracking email field */
+ $fields['application_email'] = array(
+ 'id' => $prefix . 'broadbean_application_email',
+ 'name' => __( 'Application Email', 'wpbroadbean' ),
+ 'type' => 'email',
+ 'xml_field' => 'application_email',
+ 'desc' => __( 'For applicant tracking.', 'wpbroadbean' ),
+ 'show_on_frontend' => false,
+ 'cols' => 4,
+ 'order' => 20,
+ );
+
+ /* add the application tracking url field */
+ $fields['application_url'] = array(
+ 'id' => $prefix . 'broadbean_application_url',
+ 'name' => __( 'Application URL', 'wpbroadbean' ),
+ 'type' => 'text',
+ 'xml_field' => 'application_url',
+ 'desc' => __( 'External apply URL.', 'wpbroadbean' ),
+ 'show_on_frontend' => false,
+ 'cols' => 4,
+ 'order' => 30,
+ );
+
+ /* add the salary display field */
+ $fields['salary_display'] = array(
+ 'id' => $prefix . 'salary_display',
+ 'name' => __( 'Salary', 'wpbroadbean' ),
+ 'type' => 'text',
+ 'desc' => __( 'Salary display field to show on front end.', 'wpbroadbean' ),
+ 'xml_field' => 'salary_display',
+ 'show_on_frontend' => true,
+ 'cols' => 3,
+ 'order' => 40,
+ );
+
+ /* add the salary field */
+ $fields['salary'] = array(
+ 'id' => $prefix . 'salary',
+ 'name' => __( 'Salary Amount', 'wpbroadbean' ),
+ 'type' => 'number',
+ 'desc' => __( 'Salary amount.', 'wpbroadbean' ),
+ 'xml_field' => 'salary',
+ 'show_on_frontend' => false,
+ 'cols' => 2,
+ 'order' => 50,
+ );
+
+ /* add the salary from field */
+ $fields['salary_from'] = array(
+ 'id' => $prefix . 'salary_from',
+ 'name' => __( 'Salary From', 'wpbroadbean' ),
+ 'type' => 'number',
+ 'xml_field' => 'salary_from',
+ 'desc' => __( 'Salary from number.', 'wpbroadbean' ),
+ 'show_on_frontend' => true,
+ 'cols' => 2,
+ 'order' => 60,
+ );
+
+ /* add the salary from field */
+ $fields['salary_to'] = array(
+ 'id' => $prefix . 'salary_to',
+ 'name' => __( 'Salary To', 'wpbroadbean' ),
+ 'type' => 'number',
+ 'xml_field' => 'salary_to',
+ 'desc' => __( 'Salary to number.', 'wpbroadbean' ),
+ 'show_on_frontend' => true,
+ 'cols' => 2,
+ 'order' => 70,
+ );
+
+ /* add the job reference field */
+ $fields['currency'] = array(
+ 'id' => $prefix . 'salary_currency',
+ 'name' => __( 'Currency', 'wpbroadbean' ),
+ 'type' => 'text',
+ 'xml_field' => 'currency',
+ 'desc' => __( 'Currency code.', 'wpbroadbean' ),
+ 'show_on_frontend' => false,
+ 'cols' => 3,
+ 'order' => 80,
+ );
+
+ /* add the job reference field */
+ $fields['days_to_advertise'] = array(
+ 'id' => $prefix . 'days_to_advertise',
+ 'name' => __( 'Days to Advertise', 'wpbroadbean' ),
+ 'type' => 'number',
+ 'xml_field' => 'days_to_advertise',
+ 'desc' => __( 'Numbers of days to advertise job. This number is not actioned by this plugin.', 'wpbroadbean' ),
+ 'show_on_frontend' => false,
+ 'cols' => 6,
+ 'order' => 90,
+ );
+
+ // add the application tracking url field.
+ $fields['consultant_email'] = array(
+ 'id' => $prefix . 'consultant_email',
+ 'name' => __( 'Consultant Email', 'wpbroadbean' ),
+ 'type' => 'text',
+ 'xml_field' => 'consultant_email',
+ 'desc' => __( 'Add the email of the consultant posting this job.', 'wpbroadbean' ),
+ 'show_on_frontend' => false,
+ 'cols' => 6,
+ 'order' => 100,
+ );
+
+ /* return the modified fields array */
+ return $fields;
+
+}
+
+add_filter( 'wpbb_job_fields', 'wpbb_add_default_job_fields', 10, 1 );
diff --git a/inc/job-fields/job-fields-output.php b/inc/job-fields/job-fields-output.php
new file mode 100644
index 0000000..c9dfb02
--- /dev/null
+++ b/inc/job-fields/job-fields-output.php
@@ -0,0 +1,386 @@
+ID, $field['id'], true );
+
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ID, $field['id'], true );
+
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ID, $field['id'], true );
+
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ID, $field['id'], true );
+
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ID, $field['id'], true );
+
+ ?>
+
+
+
+
+
+
+
+
+
+ $option_label ) {
+
+ ?>
+ >
+
+
+
+
+
+
+
+
+ ID, $field['id'], true );
+
+ ?>
+
+
+
+
+
+
+
+ />
+
+
+
+
+
+
+
+
+
+
+ array(
+ 'name' => _x( 'Jobs', 'post type general name', 'wpbroadbean' ),
+ 'singular_name' => _x( 'Job', 'post type singular name', 'wpbroadbean' ),
+ 'add_new' => _x( 'Add New', 'Job', 'wpbroadbean' ),
+ 'add_new_item' => __( 'Add New Job', 'wpbroadbean' ),
+ 'edit_item' => __( 'Edit Job', 'wpbroadbean' ),
+ 'new_item' => __( 'New Job', 'wpbroadbean' ),
+ 'view_item' => __( 'View Job', 'wpbroadbean' ),
+ 'search_items' => __( 'Search Jobs', 'wpbroadbean' ),
+ 'not_found' => __( 'No Jobs found', 'wpbroadbean' ),
+ 'not_found_in_trash' => __( 'No Jobs found in Trash', 'wpbroadbean' ),
+ 'parent_item_colon' => '',
+ 'menu_name' => __( 'Jobs', 'wpbroadbean' ),
+ ),
+ 'public' => true,
+ 'menu_position' => 95,
+ 'supports' => array(
+ 'title',
+ 'editor',
+ 'excerpt',
+ ),
+ 'query_var' => true,
+ 'rewrite' => array(
+ 'slug' => 'jobs',
+ 'with_front' => false,
+ ),
+ 'has_archive' => true,
+ 'show_in_menu' => 'wp_broadbean_home', // shows the post type below wp broadbean home
+ 'show_in_rest' => true,
+ )
+ );
+
+ // register the application post type.
+ register_post_type(
+ 'wpbb_application',
+ array(
+ 'labels' => array(
+ 'name' => _x( 'Applications', 'post type general name', 'wpbroadbean' ),
+ 'singular_name' => _x( 'Application', 'post type singular name', 'wpbroadbean' ),
+ 'add_new' => _x( 'Add New', 'Application', 'wpbroadbean' ),
+ 'add_new_item' => __( 'Add New Application', 'wpbroadbean' ),
+ 'edit_item' => __( 'Edit Application', 'wpbroadbean' ),
+ 'new_item' => __( 'New Application', 'wpbroadbean' ),
+ 'view_item' => __( 'View Application', 'wpbroadbean' ),
+ 'search_items' => __( 'Search Applications', 'wpbroadbean' ),
+ 'not_found' => __( 'No Applications found', 'wpbroadbean' ),
+ 'not_found_in_trash' => __( 'No Applications found in Trash', 'wpbroadbean' ),
+ 'parent_item_colon' => '',
+ 'menu_name' => __( 'Applications', 'wpbroadbean' ),
+ ),
+ 'public' => false,
+ 'has_archive' => false,
+ )
+ );
+
+}
+
+add_action( 'init', 'wpbb_register_job_post_type' );
diff --git a/inc/settings/default-settings.php b/inc/settings/default-settings.php
new file mode 100644
index 0000000..036b869
--- /dev/null
+++ b/inc/settings/default-settings.php
@@ -0,0 +1,61 @@
+ 'wpbb_username',
+ 'label' => __( 'Username', 'wpbroadbean' ),
+ 'description' => __( 'Enter a username for your feed.', 'wpbroadbean' ),
+ 'input_type' => 'text',
+ 'settings_group' => 'wpbb_settings',
+ 'order' => 10,
+ );
+
+ // add the feed password.
+ $settings['password'] = array(
+ 'option_name' => 'wpbb_password',
+ 'label' => __( 'Password', 'wpbroadbean' ),
+ 'description' => __( 'Enter a password for your feed. Longer the better!', 'wpbroadbean' ),
+ 'input_type' => 'text',
+ 'settings_group' => 'wpbb_settings',
+ 'order' => 20,
+ );
+
+ // add the setting to hide the job data on a single job listing.
+ $settings['hide_job_data_output'] = array(
+ 'label' => __( 'Hide Job Data', 'wpbroadbean' ),
+ 'option_name' => 'wpbb_hide_job_data_output',
+ 'input_type' => 'checkbox',
+ 'description' => __( 'Check this to prevent the plugin outputting any job taxonomy term or meta data on a single job.', 'wpbroadbean' ),
+ 'settings_group' => 'wpbb_settings',
+ 'order' => 30,
+ );
+
+ // add the feed password.
+ $settings['plugin_credit'] = array(
+ 'option_name' => 'wpbb_plugin_credit',
+ 'label' => __( 'Show Plugin Credit', 'wpbroadbean' ),
+ 'description' => __( 'Show a credit beneath each job on your site for the WP Broadbean developers.', 'wpbroadbean' ),
+ 'input_type' => 'checkbox',
+ 'settings_group' => 'wpbb_settings',
+ 'order' => 40,
+ );
+
+ // return the modified settings array.
+ return $settings;
+
+}
+
+add_filter( 'wpbb_plugin_settings', 'wpbb_register_default_general_settings' );
diff --git a/inc/settings/register-settings.php b/inc/settings/register-settings.php
new file mode 100644
index 0000000..4417f16
--- /dev/null
+++ b/inc/settings/register-settings.php
@@ -0,0 +1,64 @@
+ '',
+ 'option_name' => '',
+ 'input_type' => 'text',
+ 'type' => 'string',
+ 'settings_group' => 'wpbb_settings',
+ 'description' => '',
+ 'sanitize_callback' => null,
+ 'show_in_rest' => false,
+ 'settings_page' => 'settings',
+ 'order' => 10,
+ );
+
+ // merge the args with defaults.
+ $args = wp_parse_args( $setting, $defaults );
+
+ // if no setting key is set.
+ if ( '' === $args['option_name'] ) {
+
+ // don't register the setting.
+ continue;
+
+ }
+
+ // register this setting.
+ register_setting(
+ $args['settings_group'], // setting group name.
+ $args['option_name'], // setting name - the option key.
+ array(
+ 'type' => $args['type'],
+ 'group' => $args['settings_group'],
+ 'description' => $args['description'],
+ 'sanitize_callback' => $args['sanitize_callback'],
+ 'show_in_rest' => $args['show_in_rest'],
+ )
+ );
+ } // End foreach().
+ } // End if().
+
+}
+
+add_action( 'admin_init', 'wpbb_register_settings' );
diff --git a/inc/settings/settings-fields.php b/inc/settings/settings-fields.php
new file mode 100644
index 0000000..08e0543
--- /dev/null
+++ b/inc/settings/settings-fields.php
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ $option_label ) {
+
+ ?>
+
+ >
+
+
+
+
+
+
+
+
+ />
+
+
+
+
+ 'wpbb_job_industry',
+ 'xml_field' => 'job_industry',
+ 'plural' => __( 'Job Industries', 'wpbroadbean' ),
+ 'singular' => __( 'Job Industry', 'wpbroadbean' ),
+ 'slug' => __( 'job-industry', 'wpbroadbean' ),
+ 'menu_label' => __( 'Industries', 'wpbroadbean' ),
+ 'hierarchical' => true,
+ 'show_admin_column' => true,
+ 'show_on_frontend' => true,
+ );
+
+ // add the job location taxonomy.
+ $taxonomies['job_location'] = array(
+ 'taxonomy_name' => 'wpbb_job_location',
+ 'xml_field' => 'job_location',
+ 'plural' => __( 'Job Locations', 'wpbroadbean' ),
+ 'singular' => __( 'Job Location', 'wpbroadbean' ),
+ 'slug' => __( 'job-location', 'wpbroadbean' ),
+ 'menu_label' => __( 'Locations', 'wpbroadbean' ),
+ 'hierarchical' => true,
+ 'show_admin_column' => true,
+ 'show_on_frontend' => true,
+ );
+
+ // add the job type taxonomy.
+ $taxonomies['job_type'] = array(
+ 'taxonomy_name' => 'wpbb_job_type',
+ 'xml_field' => 'job_type',
+ 'plural' => __( 'Job Types', 'wpbroadbean' ),
+ 'singular' => __( 'Job Type', 'wpbroadbean' ),
+ 'slug' => __( 'job-type', 'wpbroadbean' ),
+ 'menu_label' => __( 'Types', 'wpbroadbean' ),
+ 'hierarchical' => true,
+ 'show_admin_column' => true,
+ 'show_on_frontend' => true,
+ );
+
+ // add the job skills taxonomy.
+ $taxonomies['job_skill'] = array(
+ 'taxonomy_name' => 'wpbb_job_skill',
+ 'xml_field' => 'job_skills',
+ 'plural' => __( 'Job Skills', 'wpbroadbean' ),
+ 'singular' => __( 'Job Skill', 'wpbroadbean' ),
+ 'slug' => __( 'job-skill', 'wpbroadbean' ),
+ 'menu_label' => __( 'Skills', 'wpbroadbean' ),
+ 'hierarchical' => false,
+ 'show_admin_column' => true,
+ 'show_on_frontend' => true,
+ );
+
+ // return the modified taxonomies.
+ return $taxonomies;
+
+}
+
+add_filter( 'wpbb_registered_taxonomies', 'wpbb_register_default_taxonomies', 10, 1 );
+
+/**
+ * Registers the added taxonomies with WordPress.
+ */
+function wpbb_register_taxonomies() {
+
+ /* get the taxonomies that are registered with the plugin */
+ $taxonomies = wpbb_get_registered_taxonomies();
+
+ /* for each taxonomy returned, register it as a custom taxonomy */
+ foreach ( $taxonomies as $taxonomy ) {
+
+ register_taxonomy(
+ $taxonomy['taxonomy_name'], // taxonomy name
+ wpbb_job_post_type_name(), // post type for this taxonomy
+ array(
+ 'labels' => apply_filters( $taxonomy['taxonomy_name'] . '_labels',
+ array(
+ 'name' => $taxonomy['plural'],
+ 'singular_name' => $taxonomy['singular'],
+ 'search_items' => __( 'Search ', 'wpbroadbean' ) . $taxonomy['plural'],
+ 'all_items' => __( 'All ', 'wpbroadbean' ) . $taxonomy['plural'],
+ 'parent_item' => __( 'Parent ', 'wpbroadbean' ) . $taxonomy['singular'],
+ 'parent_item_colon' => __( 'Parent ', 'wpbroadbean' ) . $taxonomy['singular'] . ':',
+ 'edit_item' => __( 'Edit ', 'wpbroadbean' ) . $taxonomy['singular'],
+ 'update_item' => __( 'Update ', 'wpbroadbean' ) . $taxonomy['singular'],
+ 'add_new_item' => __( 'Add New ', 'wpbroadbean' ) . $taxonomy['singular'],
+ 'new_item_name' => __( 'New ', 'wpbroadbean' ) . $taxonomy['singular'] . ' Name',
+ 'menu_name' => $taxonomy['plural'],
+ )
+ ),
+ 'hierarchical' => $taxonomy['hierarchical'],
+ 'sort' => true,
+ 'rewrite' => array(
+ 'slug' => $taxonomy['slug'],
+ ),
+ 'show_admin_column' => $taxonomy['show_admin_column'],
+ 'show_in_rest' => true,
+ )
+ );
+
+ }
+
+}
+
+add_action( 'init', 'wpbb_register_taxonomies', 10 );
+
+/**
+ * Add a submenu item of WP Broadbean menu page for each taxonomy registered.
+ */
+function wpbb_add_taxonomy_submenus() {
+
+ // get all the registered taxonomies.
+ $taxonomies = wpbb_get_registered_taxonomies();
+
+ // if we have any taxonomies.
+ if ( ! empty( $taxonomies ) ) {
+
+ // loop through each registered taxonomy.
+ foreach ( $taxonomies as $taxonomy ) {
+
+ // add this taxonomy as as submenu of the WP Broadbean menu item.
+ add_submenu_page(
+ 'wp_broadbean_home', // parent_slug,
+ $taxonomy['plural'], // page_title,
+ $taxonomy['plural'], // menu_title,
+ apply_filters( 'wpbb_taxonomy_submenu_cap', 'edit_others_posts', $taxonomy ), // capability,
+ 'edit-tags.php?taxonomy=' . $taxonomy['taxonomy_name'] // menu slug,
+ );
+
+ }
+ }
+
+}
+
+add_action( 'admin_menu', 'wpbb_add_taxonomy_submenus' );
+
+/**
+ * When viewing a taxonomy edit screen, keep the WP Broadbean top level menu open.
+ *
+ * @param string $parent_file The current parent file set for this sub page.
+ * @return string The new parent file set for this sub page.
+ */
+function wpbb_tax_menu_correction( $parent_file ) {
+
+ global $current_screen;
+
+ /* get the taxonomy of the current screen */
+ $current_taxonomy = $current_screen->taxonomy;
+ $taxonomies = wpbb_get_registered_taxonomies();
+
+ // loop through each registered taxonomy.
+ foreach ( $taxonomies as $taxonomy ) {
+
+ // if the current screen taxonomy is this taxonomy.
+ if ( $current_taxonomy === $taxonomy['taxonomy_name'] ) {
+
+ // set the parent file slug to the sen main page.
+ $parent_file = 'wp_broadbean_home';
+
+ }
+ }
+
+ // return the new parent file.
+ return $parent_file;
+
+}
+
+add_action( 'parent_file', 'wpbb_tax_menu_correction' );
diff --git a/js/jquery.validate.js b/js/jquery.validate.js
deleted file mode 100755
index b16e209..0000000
--- a/js/jquery.validate.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.13.1 - 10/14/2014
- * http://jqueryvalidation.org/
- * Copyright (c) 2014 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."));var c=a.data(this[0],"validator");return c?c:(this.attr("novalidate","novalidate"),c=new a.validator(b,this[0]),a.data(this[0],"validator",c),c.settings.onsubmit&&(this.validateDelegate(":submit","click",function(b){c.settings.submitHandler&&(c.submitButton=b.target),a(b.target).hasClass("cancel")&&(c.cancelSubmit=!0),void 0!==a(b.target).attr("formnovalidate")&&(c.cancelSubmit=!0)}),this.submit(function(b){function d(){var d,e;return c.settings.submitHandler?(c.submitButton&&(d=a(" ").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),e=c.settings.submitHandler.call(c,c.currentForm,b),c.submitButton&&d.remove(),void 0!==e?e:!1):!0}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c;return a(this[0]).is("form")?b=this.validate().form():(b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b})),b},removeAttrs:function(b){var c={},d=this;return a.each(b.split(/\s/),function(a,b){c[b]=d.attr(b),d.removeAttr(b)}),c},rules:function(b,c){var d,e,f,g,h,i,j=this[0];if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(b,c){i[c]=f[c],delete f[c],"required"===c&&a(j).removeAttr("aria-required")}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g),a(j).attr("aria-required","true")),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}),a.extend(a.expr[":"],{blank:function(b){return!a.trim(""+a(b).val())},filled:function(b){return!!a.trim(""+a(b).val())},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(a,b){(9!==b.which||""!==this.elementValue(a))&&(a.name in this.submitted||a===this.lastElement)&&this.element(a)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date ( ISO ).",number:"Please enter a valid number.",digits:"Please enter only digits.",creditcard:"Please enter a valid credit card number.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c=a.data(this[0].form,"validator"),d="on"+b.type.replace(/^validate/,""),e=c.settings;e[d]&&!this.is(e.ignore)&&e[d].call(c,this[0],b)}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){d[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).validateDelegate(":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'] ,[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox']","focusin focusout keyup",b).validateDelegate("select, option, [type='radio'], [type='checkbox']","click",b),this.settings.invalidHandler&&a(this.currentForm).bind("invalid-form.validate",this.settings.invalidHandler),a(this.currentForm).find("[required], [data-rule-required], .required").attr("aria-required","true")},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c=this.clean(b),d=this.validationTargetFor(c),e=!0;return this.lastElement=d,void 0===d?delete this.invalid[c.name]:(this.prepareElement(d),this.currentElements=a(d),e=this.check(d)!==!1,e?delete this.invalid[d.name]:this.invalid[d.name]=!0),a(b).attr("aria-invalid",!e),this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),e},showErrors:function(b){if(b){a.extend(this.errorMap,b),this.errorList=[];for(var c in b)this.errorList.push({message:b[c],element:this.findByName(c)[0]});this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.submitted={},this.lastElement=null,this.prepareForm(),this.hideErrors(),this.elements().removeClass(this.settings.errorClass).removeData("previousValue").removeAttr("aria-invalid")},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find("input, select, textarea").not(":submit, :reset, :image, [disabled], [readonly]").not(this.settings.ignore).filter(function(){return!this.name&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),this.name in c||!b.objectLength(a(this).rules())?!1:(c[this.name]=!0,!0)})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},reset:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([]),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d=a(b),e=b.type;return"radio"===e||"checkbox"===e?a("input[name='"+b.name+"']:checked").val():"number"===e&&"undefined"!=typeof b.validity?b.validity.badInput?!1:d.val():(c=d.val(),"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f=a(b).rules(),g=a.map(f,function(a,b){return b}).length,h=!1,i=this.elementValue(b);for(d in f){e={method:d,parameters:f[d]};try{if(c=a.validator.methods[d].call(this,i,b,e.parameters),"dependency-mismatch"===c&&1===g){h=!0;continue}if(h=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(j){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",j),j}}if(!h)return this.objectLength(f)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;aWarning: No message defined for "+b.name+"")},formatAndAdd:function(b,c){var d=this.defaultMessage(b,c.method),e=/\$?\{(\d+)\}/g;"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),this.errorList.push({message:d,element:b,method:c.method}),this.errorMap[b.name]=d,this.submitted[b.name]=d},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g=this.errorsFor(b),h=this.idOrName(b),i=a(b).attr("aria-describedby");g.length?(g.removeClass(this.settings.validClass).addClass(this.settings.errorClass),g.html(c)):(g=a("<"+this.settings.errorElement+">").attr("id",h+"-error").addClass(this.settings.errorClass).html(c||""),d=g,this.settings.wrapper&&(d=g.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement(d,a(b)):d.insertAfter(b),g.is("label")?g.attr("for",h):0===g.parents("label[for='"+h+"']").length&&(f=g.attr("id").replace(/(:|\.|\[|\])/g,"\\$1"),i?i.match(new RegExp("\\b"+f+"\\b"))||(i+=" "+f):i=f,a(b).attr("aria-describedby",i),e=this.groups[b.name],e&&a.each(this.groups,function(b,c){c===e&&a("[name='"+b+"']",this.currentForm).attr("aria-describedby",g.attr("id"))}))),!c&&this.settings.success&&(g.text(""),"string"==typeof this.settings.success?g.addClass(this.settings.success):this.settings.success(g,b)),this.toShow=this.toShow.add(g)},errorsFor:function(b){var c=this.idOrName(b),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+d.replace(/\s+/g,", #")),this.errors().filter(e)},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+b+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return this.dependTypes[typeof a]?this.dependTypes[typeof a](a,b):!0},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},startRequest:function(a){this.pending[a.name]||(this.pendingRequest++,this.pending[a.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],c&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(a(this.currentForm).submit(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(b){return a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,"remote")})}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),/min|max/.test(c)&&(null===g||/number|range|text/.test(g))&&(d=Number(d)),d||0===d?e[c]=d:g===c&&"range"!==g&&(e[c]=!0);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b);for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),void 0!==d&&(e[c]=d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0!==e.param?e.param:!0:delete b[d]}}),a.each(b,function(d,e){b[d]=a.isFunction(e)?e(c):e}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var c;b[this]&&(a.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(c=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(c[0]),Number(c[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:a.trim(b).length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(a)},date:function(a,b){return this.optional(b)||!/Invalid|NaN/.test(new Date(a).toString())},dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},creditcard:function(a,b){if(this.optional(b))return"dependency-mismatch";if(/[^0-9 \-]+/.test(a))return!1;var c,d,e=0,f=0,g=!1;if(a=a.replace(/\D/g,""),a.length<13||a.length>19)return!1;for(c=a.length-1;c>=0;c--)d=a.charAt(c),f=parseInt(d,10),g&&(f*=2)>9&&(f-=9),e+=f,g=!g;return e%10===0},minlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d},maxlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||d>=e},rangelength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d[0]&&e<=d[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||c>=a},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.unbind(".validate-equalTo").bind("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d){if(this.optional(c))return"dependency-mismatch";var e,f,g=this.previousValue(c);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),g.originalMessage=this.settings.messages[c.name].remote,this.settings.messages[c.name].remote=g.message,d="string"==typeof d&&{url:d}||d,g.old===b?g.valid:(g.old=b,e=this,this.startRequest(c),f={},f[c.name]=b,a.ajax(a.extend(!0,{url:d,mode:"abort",port:"validate"+c.name,dataType:"json",data:f,context:e.currentForm,success:function(d){var f,h,i,j=d===!0||"true"===d;e.settings.messages[c.name].remote=g.originalMessage,j?(i=e.formSubmitted,e.prepareElement(c),e.formSubmitted=i,e.successList.push(c),delete e.invalid[c.name],e.showErrors()):(f={},h=d||e.defaultMessage(c,"remote"),f[c.name]=g.message=a.isFunction(h)?h(b):h,e.invalid[c.name]=!0,e.showErrors(f)),g.valid=j,e.stopRequest(c,j)}},d)),"pending")}}}),a.format=function(){throw"$.format has been deprecated. Please use $.validator.format instead."};var b,c={};a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,d){var e=a.port;"abort"===a.mode&&(c[e]&&c[e].abort(),c[e]=d)}):(b=a.ajax,a.ajax=function(d){var e=("mode"in d?d:a.ajaxSettings).mode,f=("port"in d?d:a.ajaxSettings).port;return"abort"===e?(c[f]&&c[f].abort(),c[f]=b.apply(this,arguments),c[f]):b.apply(this,arguments)}),a.extend(a.fn,{validateDelegate:function(b,c,d){return this.bind(c,function(c){var e=a(c.target);return e.is(b)?d.apply(e,arguments):void 0})}})});
\ No newline at end of file
diff --git a/js/validate.js b/js/validate.js
deleted file mode 100644
index bc3cc6d..0000000
--- a/js/validate.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Uses jquery.validate to validate the page form
- */
-jQuery(document).ready(
-
- function($) {
-
- // validate the application form when it is submitted
- $("#wpbb-application-form").validate({
- rules: {
- wpbb_name: {
- required:true
- },
- wpbb_email: {
- required:true
- },
- wpbb_message: {
- required:true
- },
- wpbb_file: {
- required:true
- }
- },
- messages: {
- wpbb_name: "Please add your name - this is a required field",
- wpbb_email: "Please enter a valid email address.",
- wpbb_message: "Please enter a message to go with your application."
- }
- });
-
- }
-);
\ No newline at end of file
diff --git a/readme.md b/readme.md
deleted file mode 100644
index 07d0398..0000000
--- a/readme.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# WP Broadbean
-
-[WP Broadbean](http://wpbroadbean.com/ "Broadbean posted jobs on your WordPress website") is a plugin designed to work alongside the Broadbean Adcourier job posting system allowing jobs added posted through Broadbean to show in your WordPress site. The plugin adds custom post types and taxonomies to allow you to add jobs. More importantly it provides an end-point to accept feed data sent by Broadbean and add this as job posts to your site.
\ No newline at end of file
diff --git a/readme.txt b/readme.txt
index 454511c..46831bf 100755
--- a/readme.txt
+++ b/readme.txt
@@ -1,21 +1,30 @@
-=== Plugin Name ===
-Contributors: wpmarkuk, highrisedigital
+=== WP Broadbean ===
+Contributors: wpmarkuk, keithdevon, highrisedigital
Tags: jobs, recruitment
-Requires at least: 3.9
-Tested up to: 5.0.3
-Stable tag: 2.2.3
-License: GPLv2 or later
-License URI: http://www.gnu.org/licenses/gpl-2.0.html
+Requires at least: 5.1
+Requires PHP: 5.6
+Tested up to: 5.1
+Stable tag: 3.0
+License: GPLv3 or later
+License URI: https://www.gnu.org/licenses/gpl-3.0.html
-WP Broadbean is a plugin allowing jobs added to Broadbean to show in your WordPress site.
+WP Broadbean is a plugin which allows jobs added to Broadbean to show in your WordPress site.
== Description ==
-[WP Broadbean](http://wpbroadbean.com/ "Broadbean posted jobs on your WordPress website") is a plugin designed to work alongside the Broadbean Adcourier job posting and distribution system allowing jobs added to Broadbean to show in your WordPress site. The plugin adds custom post types and taxonomies to allow you to add jobs. More importantly it provides an end-point to accept feed data sent by Broadbean and add this as job posts to your site.
+[WP Broadbean](https://highrise.digital/products/wpbroadbean-wordpress-plugin/) is a plugin designed to work alongside the [Broadbean job posting and distribution](https://www.broadbean.com/uk/products/features/job-posting-distribution/) system allowing jobs written in Broadbean to show in your WordPress site. The plugin adds custom post types and taxonomies to allow you to add jobs. More importantly it allows your site to accept feed data sent by Broadbean to create jobs on your site.
-We also offer a service to complete a Broadbean integration with WordPress for you. Find out more about our this on our [WordPress agency](https://highrise.digital) site.
+The plugin requires some collaboration with the Broadbean integrations team. This is because they need to add your WordPress site as a posting destination, and to build a "feed" to your WordPress sites endpoint, provided by this plugin, in the form of XML data.
->If you are running a version of WP Broadbean less than version 2.0 please DO NOT UPDATE.
+If you are struggling with any aspects of a site integration, we offer a complete integration service which you can take advantage of. Find out more about our this on our [WP Broadbean information page](https://highrise.digital/products/wpbroadbean-wordpress-plugin/).
+
+We also have some add-ons for this plugin which you can find out more about on the [WP Broadbean plugin page](https://highrise.digital/products/wpbroadbean-wordpress-plugin/).
+
+Highrise Digital also offer a number of [WordPress Broadbean integration services](https://highrise.digital/broadbean-wordpress-integrations/) as well as services to [integrate LogicMelon with WordPress](https://highrise.digital/services/integrate-logicmelon-wordpress/).
+
+For the sake of clarity, the WP Broadbean plugin is not affiliated in any way with Broadbean Technology Limited.
+
+> IMPORTANT NOTICE BEFORE UPDATING: WP Broadbean version 3.0 is a complete rewrite of the plugin to make it more stable, secure and extensible. If you are running a version of the plugin prior to version 3.0, updating without testing and development will break your Broadbean integration. You can find out more [information about upgrading to version 3.0 here](https://highrise.digital/blog/updating-the-wp-broadbean-plugin-to-version-3/).
== Installation ==
@@ -25,195 +34,37 @@ To install the plugin:
2. Activate the plugin through the 'Plugins' menu in WordPress
3. Visit the settings page under WP Broadbean > Settings
4. Enter a username and password as well as choosing a page to use for your application form.
-5. View the how to get start question in the FAQs
+5. Request your integration with Broadbean, instructing them how to send the data to your site.
== Frequently Asked Questions ==
-**How do I get started?**
-
-Your first task is to contact Broadbean and let them know that you want to create a new feed from your Broadbean Adcourier account to your WordPress website. It is also important to tell them that your integration will be using the WP Broadbean Plugin by Mark Wilkinson. You will need to indicate that you require the standard feed to be setup for this plugin without any changes being made.
-
-**Do Broadbean charge for this?**
-
-Probably yes! Contact your Broadbean account manager in order to get a price for developing a feed to your WordPress website.
-
-**What is the URL to which Broadbean should post the feed too?**
-
-The URL to post to, in order to add a job is http://domain.com/?wpbb=broadbean (of course replacing domain.com with your actual domain). The end-point expects an XML feed using the standard Broadbean XML feed.
-
-**Can I customise the how the feed is added to WordPress?**
-
-Yes you can. The plugin is built with extensibility in mind and therefore you can make many changes and edits without altering the plugin code itself. This will protect you when the plugin is updated. The plugin handles the incoming feed in the `inbox.php` file in the plugin root folder. If you copy this file to your active theme and place it in a folder named `wpbb` this will be used instead of the plugins version. Therefore you can make amends and change how the jobs are added when posted from Broadbean.
-
-**What if I want different meta data and taxonomies than the standard ones, can the plugin handle that?**
-
-Broadbean can build you a completely bespoke feed to your site, with practically any date you want about each job you post. The WP Broadbean Plugin can handle this through its extensibility features. You can add fields and taxonomies as well as remove the default ones should you wish too. The plugin was built with extensibility in mind with a number of actions and filters available to developers. Take a look at the source code for `do_action` and `apply_filters`.
+It is a new version, therefore we don't have any FAQs just yet. Feel free to [submit an issue](https://github.com/highrisedigital/wpbroadbean/issues) over on the Github repository. We can then turn the popular questions into FAQs on the Wiki.
== Screenshots ==
-1. Job listings in the WordPress admin
-2. Single job edit post screen
+1. The job edit screen in WordPress
== Changelog ==
-= 2.2.3 =
-* IMPORTANT NOTE: to avoid any confusion with users understand whether applicant data is stored within WordPress, please visit the plugin settings page up update and review the settings.
-* Removal of the deprecated call to the settings page screen option.
-* Introduces new settings to allow users to prevent applications and their associated attachments being stored in WordPress. If set to remove they are removed once sent across to Broadbean.
-* Make sure the `wpbb_after_application_form_processing` hook is the last thing to fire in the processing function. This prevent code after it from not running if a function was running on this hook that died or exited. An example is a function which redirected users on application form completion.
-* Adds a new filter for filtering the error message on the application form when no job reference is detected - `wpbb_application_form_messages`.
-* Adds a new setting to allow a user to switch of the output of job data on a job post - meta and taxonomy output.
-
-= 2.2.2 =
-* Set applications post type to not have an archive. Even though the post type is set to not public (`'public' => false`) it would appear that in some setups the applications had a front-end page.
-* Set the applications to draft post status by default
-* Create a new filter named `wpbb_insert_application_args` to allow devs to change the args used when creating the application post.
-
-= 2.2.1 =
-* Allow jobs to be edited once they are sent through from Broadbean. If a job is sent with the same reference as an existing job in WordPress, the job will be updated rather than a new job being created. If you don't not want this functionality you can add the `add_filter( 'wpbb_allow_job_updates', '__return_false' );` to either your themes `functions.php` file or a plugin / mu-plugin.
-* More strings are now translatable, particularly in the applications form and associated messages.
-
-= 2.2 =
-* Fix Duplicate Terms Showing. After WP 4.7.5 was released the `args` param in the `register_taxonomy` was causing the terms to be outputted twice. This was because of a change in the `wp_get_object_terms` function released with WP 4.7.5. Removing this param that is not needed fixes the problem.
-
-= 2.1.9 =
-* Remove attachment link from the application email - dead link since 2.1.6
-* Remove the application attachments meta field
-* Make all application form labels translatable
-* Output the title of the job being applied for above the application form
-
-= 2.1.8 =
-* Add support for PHP7 so that taxonomies are added correctly when WordPress is running on PHP7. Thanks for @bencorke and @pixelanddot for assisting in this fix.
-
-= 2.1.7 =
-* Allow application uploads to work on multisite - thanks to @sijones-uk for contribution here
-* Add support for the job short description saved as the post excerpt
-
-= 2.1.6 =
-* Delete attachments from application form once emailed to broadbean. This is an important update for clients who do not want to store CVs on there website.
-
-= 2.1.5 =
-* Correct an wrong filter name to filter the application email attachments
-* Moved the job added action hook outside of the job fields loop in the inbox. This was wrongly being fired after each field was added.
-* Sanitize a call to the post ID using $_GET within the Applications posts when listing the CV attachment
-* When outputting the application form, check whether an application form has been set in the settings screen before filtering the content. Thanks for [@jonnyauk](https://profiles.wordpress.org/jonnyauk) for spotting this issue!
-
-= 2.1.4 =
-* Make the messages output by the application form filterable by developers using the filter 'wpbb_application_form_messages'.
-* Correct a typo in the application form success message.
-
-= 2.1.3 =
-* Correct a bug introduced in 2.1.2 which prevented application emails from sending.
-* Add filters to allowing developers to filter the application email headers, subject etc.
-* Sanitize the $_GET requests in the application form
-* Use function for setting the email content type.
-* Add a filter to allow the insert job post argumnets pasted to wp_insert_post to be filterable.
-
-= 2.1.2 =
-* Sanitize all posted data from the application form.
-* Add in a hook (wpbb_after_application_form_processing) which fires after the application form has been processed. This could be used for example to redirect users to a different page on the site, like a thank you page.
-* Prevent an application from being saved and processed if the CV file type does not match those allowed.
-* Make all the fields in the application form mandatory or required. The JS validate will prevent form submission unless all fields are completed.
-
-= 2.1.1 =
-* Include the application message in the email sent back to the application tracking email.
-
-= 2.1 =
-* In strange circumstances if a job was added where there was a taxonomy term which was an empty string it caused an WP_Error and the job was not posted correctly. This has now be fixed but checking for an empty string before creating a new term. Thanks to Julian Taylor for assisting with this bug.
-
-= 2.0.9 =
-* Prevent an error when trying to add a term with an empty string as the term name. It essentially allows you to have blank terms when sent. Thanks to Susie Black for input on this issue.
-* Force XML value in added fields to be a string
-* Correct typo on the job post edit screen in meta boxes
-
-= 2.0.8 =
-* Application form php warnings with WP_DEBUG on are not removed on the application form page
-* Adds a message input to the application form so that applicants can add notes to their applications
-* Enables additional file types to be uploaded other than PDFs through the addition of filterable allowed file types on the application form
-
-= 2.0.7 =
-* Addition of a action hook with fires after a job has been added by the plugin. This allows for developer to trigger actions once a job is added such as clearing search cache in searching plugins.
-* Only send the application for the contact email and tracking email if they have an email applied.
-
-= 2.0.6 =
-* Applications where CV uploads had spaces in their names where failing to attach to the Broadbean email and the link in the admin led to a 404 error. This has now been corrected and all should be fixed!
-
-= 2.0.5 =
-* Correct declaration of constant to remove debug warnings.
-* Add additional filters to allow developers to changes the names of the admin menus added by the plugin.
-* Additional filters added which allows developers to change the page titles in the admin area.
-* Functions for retrieving the password and username
-* Some simple functions docs updates
-
-= 2.0.4 =
-* Add columns on the settings screen with call to action boxes for WP Broadbean Assist
-* Redirect to the settings screen on plugin activation
-* Change the way application forms are saved to prevent conflicts with other plugins
-* Add actions which fire after job terms and meta are added to a job when sent from Broadbean
-
-= 2.0.3 =
-* Correct an issue where an incorrect taxonomy term could be added to a job. This was because the term could have belonged to another taxonomy. This fix force it to look for only wpbb taxonomies when adding terms to jobs posted through Broadbean.
-
-= 2.0.2 =
-* Corrected an issue where jobs could not be deleted via broadbean
-
-= 2.0.1 =
-* Corrected an issue where username and password failed to authenticate
-
-= 2.0 =
-* Removed the beta status!
-* Added a filter to allow developers to use a different custom post type for jobs
-* WP Broadbean sub menus are added using a filter so developers can add their own menus more easily
-* Created a template function to get the value of a job field from post meta
-* Fields are now added using a filter. This allows developers to easily add other fields and have the data processed in the feed as well as the WP backend.
-* The processing of the feed is now more dynamic to tie in with other registered taxonomies and fields.
-* Amended the way in which the application form is rendered (no shortcode) and processed. Also slimmed the number of fields on this form.
-* Documented most functions etc. in the plugin code itself as well as cleaning up the file structure a little.
-* Allow both hierarchical and non hierarchical taxonomies to be registered for use with jobs
-* Output fields and taxonomies on the front end - using the_content filter. These get added below the post content. Control of which taxonomies and fields are shown on the front-end is controlled when they are registered.
-* Updated the readme.txt file.
-
-= 1.0.2 =
-* Set skills taxonomy to hierarchical
-
-= 1.0.1 =
-* Correct name for the job locations taxonomy - showed an incorrect label in the taxonomy meta box
-
-= 1.0 =
-* Thanks to @getdave for contributions to v1.0
-* Ensure taxonomies (and all assoc data and admin menus) are created dynamically rather than hard coded
-* Ability to add custom taxonomies via hooks/filters
-* Add new Broadbean default taxonomy "Industry"
-* Ensure new taxonomy terms are created if they don't exist. Ensures client can dynamically created new terms without having to manually create them in WP first
-* Ensure job days_to_advertise field is used to calculate an expiry date which is stored as post meta. Developers can then use this to ensure "expired" jobs are not included in search results
-
-= 0.8 =
-* Add the select2 js library for select input in the metaboxes
-
-= 0.7 =
-* Corrected a type in the email header function that resulted in a semi-colon appearing before the email content.
-
-= 0.6 =
-* Added the ability to use WYSIWYG when adding your own settings to the setting page
-* Removed the post type support filters as post type support can be added with add_post_type_support()
-
-= 0.5 =
-* Corrected issue where using an inbox.php file from the theme folder would not work.
-
-= 0.4 =
-* Added filters for meta box fields in applications and job post types. This allows devs to be able to add to or remove existing fields from a metabox.
-
-= 0.3 =
-* Removed the admin stylesheet - use dashicons for the admin menu icon
-* Removed filterable post type labels, not needed as core provides this functionality
-* Add additional filters for post title and post editor content
-* General bug fixes and code comment updates
-
-= 0.2 =
-* Minor bug fixes
-
-= 0.1 =
-* Initial Beta Release
+= 3.0 =
+* IMPORTANT NOTICE BEOFRE UPDATING: WP Broadbean version 3.0 is a major overhaul of the plugin from earlier versions. With this in mind, this version is NOT backward compatible to earlier versions. This means if you are running a version earlier than version 3.0 already, it is crucial that you test the update on a staging or test site before updating to the latest version.
+* Deprecated the theme inbox file version located at `wpbb/inbox.php` in the active theme and replaced with `wpbroadbean.php` in the root of the active theme.
+* Deprecated the double settings arrays. Settings should now be registered against the `wpbb_plugin_settings` filter.
+* Adds options footer credit with a link back to plugin authors.
+* No longer use the CMB Meta Box framework to provide the job fields on the job edit screen. This framework is no longer supported and therefore this has been removed and replaced with a native meta box solution.
+* Newly configured way of storing applications, temporarily whilst notifications are sent and then removed for privacy and security reasons.
+* Extensible application form where developers can now make changes to application fields.
+* New endpoint URL which no longer uses a query string name and value, but an actual URL. The endpoint for jobs to be posted to is now `/wpbb/jobfeed/`.
+* Application forms are now shown on job single page views rather than having a seperate page.
+* Added a check for SSL. If your site is not running over SSL (https) a warning message is shown on the settings page.
+* Allow users to display a credit to Highrise Digital below each single job post, should they wish the give something back to us!
+* Allow the jobs post type to show in the REST API. This means that partial block editor (aka Gutenberg) support is provided. The edit screens now use the new block editor.
+* Prepared the plugin for add-ons being released, namely allow add-ons to add settings to different admin menu pages.
+* The job post ID is now appended to the jobs permalink slug. This prevents a job having the same URL as a deleted job in the future.
+
+To view the changelog for older versions of the plugin, please visit [the Github releases page](https://github.com/highrisedigital/wpbroadbean/releases).
== Upgrade Notice ==
-Update through the WordPress admin as notified always be sure to make a site backup before upgrading.
\ No newline at end of file
+Update through the WordPress admin as notified but always be sure to make a site backup before upgrading and better still, test on a staging or test site first.
+
+Also please note that versions 2 and 3 are breaking change versions, and therefore updating from version 0 to 2 or 2 to 3 will cause the plugin to break without additional work being carried out.
\ No newline at end of file
diff --git a/sample-xml/sample-add.xml b/sample-xml/sample-add.xml
new file mode 100644
index 0000000..287ad8f
--- /dev/null
+++ b/sample-xml/sample-add.xml
@@ -0,0 +1,23 @@
+
+
+ add
+ user
+ pass
+
+ HTML such as:A list item Another list item ]]>
+
+ Permanent
+ London
+ IT
+ PHP|HTML|Javascript
+ bob.12345.123@smith.aplitrak.com
+ https://apply.url
+ abc123
+ 25000
+ 30000
+ GBP
+ 30000
+ Up to £30,000 with benefits.
+ contact@domain.com
+ 28
+
\ No newline at end of file
diff --git a/sample-xml/sample-delete.xml b/sample-xml/sample-delete.xml
new file mode 100644
index 0000000..b1679e1
--- /dev/null
+++ b/sample-xml/sample-delete.xml
@@ -0,0 +1,7 @@
+
+
+ delete
+ user
+ pass
+ abc123
+
\ No newline at end of file
diff --git a/templates/inbox.php b/templates/inbox.php
new file mode 100644
index 0000000..9e06c9d
--- /dev/null
+++ b/templates/inbox.php
@@ -0,0 +1,292 @@
+username !== $username || (string) $xml->password !== $password ) {
+
+ /* echo an error */
+ header( 'HTTP/1.1 401 Unauthorized' );
+ esc_html_e( 'Authorisation failed. Incorrect username or password.', 'wpbroadbean' );
+ die();
+
+}
+
+/**
+ * We are now authenticated and seeminly have valid XML data to work with
+ * the next stage is to check what command we are to process.
+ */
+
+// get the sent command.
+$command = wp_strip_all_tags( trim( $xml->command ) );
+
+// get the sent job reference.
+$job_reference = wp_strip_all_tags( trim( $xml->job_reference ) );
+
+// get any job with the posted job reference.
+$update_post_id = wpbb_get_job_by_reference( $job_reference );
+
+// if we are adding a job - the add command was sent.
+if ( 'add' === $command ) {
+
+ // build an array of args for inserting our new job.
+ $insert_job_args = array(
+ 'post_type' => wpbb_job_post_type_name(),
+ 'post_title' => wp_strip_all_tags( trim( $xml->job_title ) ),
+ 'post_content' => wp_kses_post( $xml->job_description ),
+ 'post_status' => 'publish',
+ );
+
+ // check if there is a job that already exists with this reference.
+ if ( ! empty( $update_post_id ) ) {
+
+ // set the job post id for the job found for this reference.
+ $insert_job_args['ID'] = absint( $update_post_id );
+
+ }
+
+ /**
+ * Lets now insert the post for this job.
+ * Uses the standard wp_insert_post function.
+ * On success it will return the newly added job post id.
+ */
+ $job_id = wp_insert_post(
+ apply_filters(
+ 'wpbb_insert_job_post_args',
+ $insert_job_args,
+ $xml
+ )
+ );
+
+ // lets check whether the job was created successfully.
+ if ( 0 === $job_id ) {
+
+ /* echo an error */
+ header( 'HTTP/1.1 406 Not Acceptable' );
+ esc_html_e( 'All looked good, but for some reason the job was not added.', 'wpbroadbean' );
+ die();
+
+ }
+
+ // update the post slug to include the post id - makes sure all jobs have a unique url.
+ wp_update_post(
+ apply_filters(
+ 'wpbb_update_job_post_args',
+ array(
+ 'ID' => $job_id,
+ 'post_name' => sanitize_title_with_dashes( trim( $xml->job_title ) ) . '-' . $job_id,
+ )
+ )
+ );
+
+ /**
+ * Fire an action that runs directly after a successful job posting.
+ */
+ do_action( 'wpbb_inbox_after_job_inserted', $job_id, $xml );
+
+ /**
+ * Lets start by adding this jobs meta data.
+ * First lets get all the fields for the jobs.
+ */
+ $job_fields = wpbb_get_job_fields();
+
+ // if we have job fields.
+ if ( ! empty( $job_fields ) ) {
+
+ // loop through each field to add as post meta.
+ foreach ( $job_fields as $job_field ) {
+
+ // if the xml_field value is empty or not present skip to the next.
+ if ( empty( $xml->{ $job_field['xml_field'] } ) || '' === $xml->{ $job_field['xml_field'] } ) {
+ continue;
+ }
+
+ // make sure the value is sent as a string.
+ $field_value = (string) $xml->{ $job_field['xml_field'] };
+
+ // add the sent data as post meta for this job post.
+ $job_field_added = update_post_meta( $job_id, $job_field['id'], $field_value );
+
+ // if this job field was added successfully.
+ if ( false !== $job_field_added ) {
+
+ /**
+ * Fires after the job field was added.
+ *
+ * @param int $job_id the id of the newly created job
+ * @param string $meta_key this is the meta key of the created field
+ * @param string $meta_value this is the sent meta value in the xml
+ * @param object $xml The XML sent across as an object.
+ */
+ do_action( 'wpbb_inbox_job_field_added', $job_id, $job_field['id'], $field_value, $xml );
+
+ }
+ } // End foreach().
+ }
+
+ /**
+ * Lets prepare the taxonomy terms for adding
+ */
+ $taxonomies = wpbb_get_registered_taxonomies();
+
+ // if we have registered taxonomies.
+ if ( ! empty( $taxonomies ) ) {
+
+ /* set up holding array */
+ $job_tax_terms = array();
+
+ /**
+ * Loop through each of the taxonomies we have preparing it for adding to the post
+ */
+ foreach ( $taxonomies as $taxonomy ) {
+
+ // if no tax terms sent - continue.
+ if ( '' === $xml->{ $taxonomy['xml_field'] } ) {
+ continue;
+ }
+
+ // add the prepared terms to our terms array.
+ $job_tax_terms[ $taxonomy['xml_field'] ] = wpbb_prepare_terms( $xml->{ $taxonomy['xml_field'] }, $taxonomy );
+
+ // lets check we have some prepared terms to process.
+ if ( ! empty( $job_tax_terms ) ) {
+
+ // if the sent xml field is present but has no valid - continue to the next.
+ if ( '' === $xml->{ $taxonomy['xml_field'] } ) {
+ continue;
+ }
+
+ // set the terms against this job post.
+ $term_added = wp_set_post_terms(
+ $job_id,
+ $job_tax_terms[ $taxonomy['xml_field'] ],
+ $taxonomy['taxonomy_name']
+ );
+
+ // if the terms were added.
+ if ( false !== $term_added && ! is_wp_error( $term_added ) ) {
+
+ /**
+ * Fires after the term has been added.
+ *
+ * @param (int) $job_id is the post id for the added job
+ * @param (string) $wpbb_term term to be added
+ * @param (string) $taxonomy taxonomy of the term
+ */
+ do_action( 'wpbb_inbox_job_term_added', $job_id, $job_tax_terms[ $taxonomy['xml_field'] ], $taxonomy['taxonomy_name'], $xml );
+
+ }
+ } // End if().
+ } // End foreach().
+ } // End if().
+
+ /**
+ * Fires after a job has been successfully added and after taxonomy terms and
+ * meta data are added.
+ *
+ * @param int $job_id is the post id for the added job.
+ * @param object $xml sent XML object.
+ */
+ do_action( 'wpbb_inbox_job_added', $job_id, $xml );
+
+ /**
+ * If would appear the job is added, so tell the user.
+ */
+ /* echo success message */
+ header( 'HTTP/1.1 200 OK' );
+
+ // set some echo text.
+ $text = sprintf(
+ // translators: 1: job post id.
+ __( 'Success! Job added/updated with a post ID of %s.', 'wpbroadbean' ),
+ $job_id
+ );
+
+ echo esc_html( $text );
+ die();
+
+} elseif ( 'delete' === $command ) {
+
+ // if no job exists with this reference.
+ if ( empty( $update_post_id ) ) {
+
+ // echo an error.
+ header( 'HTTP/1.1 406 Not Acceptable' );
+ esc_html_e( 'Sorry, a job with that job reference could not be found.', 'wpbroadbean' );
+ die();
+
+ }
+
+ // delete the post found.
+ $deleted = wp_delete_post( $update_post_id, true );
+
+ /* if delete failed */
+ if ( false === $deleted ) {
+
+ /* echo an error */
+ header( 'HTTP/1.1 406 Not Acceptable' );
+ esc_html_e( 'Error: job was not deleted. Adding to trash failed.', 'wpbroadbean' );
+ die();
+
+ } else { /* job deleted */
+
+ /**
+ * Fires after a job has been deleted.
+ *
+ * @param int $update_post_id The ID of the job removed.
+ * @param object $xml The XML sent.
+ */
+ do_action( 'wpbb_inbox_job_deleted', $update_post_id, $xml );
+
+ // echo success message.
+ header( 'HTTP/1.1 200 OK' );
+
+ // set some echo text.
+ $text = sprintf(
+ // translators: 1: job post id.
+ __( 'The job (ID: %s) was successfully trashed.', 'hd-job-integrator' ),
+ $deleted->ID
+ );
+
+ // output the text.
+ echo esc_html( $text );
+ die();
+
+ }
+} else {
+
+ // echo an error as the command is not recognised.
+ header( 'HTTP/1.1 405 Method not allowed' );
+ esc_html_e( 'Invalid command sent.', 'wpbroadbean' );
+ die();
+
+} // End if().
diff --git a/views/application-email.php b/views/application-email.php
new file mode 100644
index 0000000..214c00f
--- /dev/null
+++ b/views/application-email.php
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ :
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/views/application-form.php b/views/application-form.php
new file mode 100644
index 0000000..eb7074f
--- /dev/null
+++ b/views/application-form.php
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/views/messages.php b/views/messages.php
new file mode 100644
index 0000000..665f55a
--- /dev/null
+++ b/views/messages.php
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/views/settings-ctas.php b/views/settings-ctas.php
new file mode 100644
index 0000000..5cef384
--- /dev/null
+++ b/views/settings-ctas.php
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+ Version: , written by
+
+
' . esc_url( home_url( '/wpbb/jobfeed/' ) ) . '' ); ?>
+
sample-xml' ); ?>
+
+
+
+
+
+
+
+
+
+
+
diff --git a/wpbroadbean.php b/wpbroadbean.php
index ecd0154..ac334af 100755
--- a/wpbroadbean.php
+++ b/wpbroadbean.php
@@ -1,13 +1,14 @@
Broadbean job posting and distribution with WordPress. It allows jobs written in Broadbean to be distributed to a WordPress site and have applications made to those jobs in WordPress delivered back to Broadbean.
+Version: 3.0
+Author: Highrise Digital
Author URI: https://highrise.digital
-License: GPLv2 or later
+License: GPLv3 or later
Text Domain: wpbroadbean
+Domain Path: /langauges
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -18,179 +19,50 @@
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-
-**************** ****************
-**************** ****************
-**************** ****************
-***** ******* ******* *****
-***** ******* ******* *****
-***** ******* ******* *****
-***** ********************** *****
-***** ********************** *****
-***** ********************** *****
-***** ********************** *****
-***** ******* ******* *****
-***** ******* ******* *****
-***** ******* ******* *****
-***** ******* ******* *****
-***** ******* ******* *****
-***** ******* ******* *****
-***** ***** ***** *****
-****** ** ** ******
-********** **********
-************** **************
- ************** **************
- ************************
- ****************
- ********
-
*/
-/* exist if directly accessed */
-if( ! defined( 'ABSPATH' ) ) exit;
+// exist if directly accessed.
+if ( ! defined( 'ABSPATH' ) ) {
+ exit;
+}
-/* define variable for path to this plugin file. */
+// define variable for path to this plugin file.
define( 'WPBB_LOCATION', dirname( __FILE__ ) );
+define( 'WPBB_LOCATION_URL', plugins_url( '', __FILE__ ) );
// Define plugin version constant.
-define( 'WPBB_PLUGIN_VERSION', '2.2.3' );
-
-/* load required files & functions */
-require_once( dirname( __FILE__ ) . '/functions/post-types.php' );
-require_once( dirname( __FILE__ ) . '/functions/taxonomies.php' );
-require_once( dirname( __FILE__ ) . '/functions/default-fields.php' );
-require_once( dirname( __FILE__ ) . '/functions/email-functions.php' );
-require_once( dirname( __FILE__ ) . '/functions/application-form.php' );
-require_once( dirname( __FILE__ ) . '/functions/wpbb-functions.php' );
-require_once( dirname( __FILE__ ) . '/functions/admin/admin-menus.php' );
-require_once( dirname( __FILE__ ) . '/functions/admin/admin.php' );
-require_once( dirname( __FILE__ ) . '/functions/admin/default-settings.php' );
-
-/* check whether the metabox class already exists - and load it if not */
-if( ! class_exists( 'CMB_Meta_Box' ) )
- require_once( dirname( __FILE__ ) . '/functions/metaboxes/custom-meta-boxes.php' );
-
-/* load the metabox functions */
-require_once( dirname( __FILE__ ) . '/functions/admin/metaboxes.php' );
+define( 'WPBB_PLUGIN_VERSION', '3.0' );
-/***************************************************************
-* Function wpbb_add_new_query_var()
-* Adds a query var to wordpress so it knows what to do something
-* when that query var is used.
-***************************************************************/
-function wpbb_add_new_query_var( $wpbb_public_query_vars ) {
-
- /* set a name for our new query var */
- $wpbb_public_query_vars[] = 'wpbb';
-
- /* return the new name to the query_vars filter */
- return $wpbb_public_query_vars;
-
-}
-
-add_filter( 'query_vars', 'wpbb_add_new_query_var' );
-
-/***************************************************************
-* Function wpbb_adcourier_inbox_load()
-* Loads the adcourier inbox template php file when the above
-* query var is called. When a user navigates their browser to
-* yoursite.com/?wpac=adcourier it loads page using the
-* wpbb-inbox.php template form this plugin folder.
-***************************************************************/
-function wpbb_adcourier_inbox_load() {
-
- /* get the query var we named above from the url */
- $wpbb_bb = get_query_var( 'wpbb' );
-
- /* make the query var value filterable */
- $wpbb_query_var_value = apply_filters( 'wpbb_query_var_value', 'broadbean' );
-
- /* check that its value is equal to adcourier */
- if( $wpbb_bb == $wpbb_query_var_value ) {
-
- /* check for a dashboard content file in the theme folder */
- if( file_exists( STYLESHEETPATH . '/wpbb/inbox.php' ) ) {
-
- /* load the dashboard content file from the theme folder */
- require_once STYLESHEETPATH . '/wpbb/inbox.php';
-
- } else {
+/**
+ * Load the plugins translated strings.
+ */
+function wpbb_load_plugin_textdomain() {
- /* load the adcourier inbox file */
- require_once( dirname( __FILE__ ) . '/inbox.php' );
+ // load the plugin text domain.
+ load_plugin_textdomain(
+ 'wpbroadbean',
+ false,
+ dirname( __FILE__ ) . '/languages'
+ );
- }
-
- /* stop wordpress loading any further */
- exit;
-
- }
-
}
-/* redirect the user to our adcourier inbox file when correct query var and value are inputted */
-add_action( 'template_redirect', 'wpbb_adcourier_inbox_load' );
+add_action( 'init', 'wpbb_load_plugin_textdomain' );
/**
- * Function wpbb_on_activation()
- * On plugin activation makes current user a wpbasis user and
- * sets an option to redirect the user to another page.
+ * Function to run when the plugin is activated.
*/
function wpbb_on_activation() {
-
- /* set option to initialise the redirect */
- add_option( 'wpbb_activation_redirect', true );
-
-}
-
-register_activation_hook( __FILE__, 'wpbb_on_activation' );
-
-/**
- * Function wpbb_activation_redirect()
- * Redirects user to the settings page for wp basis on plugin
- * activation.
- */
-function wpbb_activation_redirect() {
-
- /* check whether we should redirect the user or not based on the option set on activation */
- if( true == get_option( 'wpbb_activation_redirect' ) ) {
-
- /* delete the redirect option */
- delete_option( 'wpbb_activation_redirect' );
-
- /* redirect the user to the wp basis settings page */
- wp_redirect( admin_url( 'admin.php?page=wpbb_broadbean_settings' ) );
- exit;
-
- }
-
-}
-
-add_action( 'admin_init', 'wpbb_activation_redirect' );
-/***************************************************************
-* Function wpbb_add_styles_scripts()
-* Enqueues the scripts for the form validation only on posts
-* were the shortcode has been added to the post content.
-***************************************************************/
-function wpbb_add_styles_scripts() {
+ // store the plugin version number on activation.
+ update_option( 'wpbroadbean_version', WPBB_PLUGIN_VERSION );
- /* get the apply page from the settings */
- $apply_pageid = get_option( 'wpbb_apply_page_id' );
-
- /* check this is the apply page */
- if( is_page( $apply_pageid ) ) {
-
- /* enqueue the jquery validate plugin */
- wp_enqueue_script( 'jquery' );
- wp_enqueue_script( 'wpbb_jquery_validate', plugins_url( '/js/jquery.validate.js', __FILE__ ), 'jquery' );
- wp_enqueue_script( 'wpbb_validate', plugins_url( '/js/validate.js', __FILE__ ), 'wpbb_jquery_validate', array(), true );
+ // flush the rewrite rules.
+ flush_rewrite_rules();
- /* enqueue the application form styles */
- wp_enqueue_style( 'wpbb_form_styles', plugins_url( '/css/form-style.css', __FILE__ ) );
-
- } // end if have post varibale
-
}
-add_action( 'wp_enqueue_scripts', 'wpbb_add_styles_scripts' );
\ No newline at end of file
+register_activation_hook( __FILE__, 'wpbb_on_activation' );
+
+/* load required files & functions */
+require_once( dirname( __FILE__ ) . '/inc/loader.php' );