;(function ( $, window, document, undefined ) {
// undefined is used here as the undefined global
// variable in ECMAScript 3 and is mutable (i.e. it can
// be changed by someone else). undefined isn't really
// being passed in so we can ensure that its value is
// truly undefined. In ES5, undefined can no longer be
// modified.
// window and document are passed through as local
// variables rather than as globals, because this (slightly)
// quickens the resolution process and can be more
// efficiently minified (especially when both are
// regularly referenced in your plugin).
// Create the defaults once
var pluginName = "defaultPluginName",
defaults = {
propertyName: "value"
},
count = 0;
// The actual plugin constructor
function Plugin( element, options ) {
this.element = element;
// jQuery has an extend method that merges the
// contents of two or more objects, storing the
// result in the first object. The first object
// is generally empty because we don't want to alter
// the default options for future instances of the plugin
this.options = $.extend( {}, defaults, options) ;
this._defaults = defaults;
this._name = pluginName;
$.each(this.settings, function(key, value) {
if ( typeof value === "function" ) {
$(this.element).on(key + "." + pluginName, function(event, param) {
return value(event, this.element, param)
})
}
});
this.init();
}
Plugin.prototype = {
init: function() {
var parent = $("<div/>",
{
"class": "test" + ($(this.element).attr("disabled") ? " disabled" : ""),
"id": "test" + "-" + count
}),
input = $("<input/>",
{
"class": "test__input",
"id":"test-" + count + "__input"
}),
title = $("<div/>",
{
"class": "test__title",
"click": function() { parent.addClass("show"); }
}),
placeholder = $("<span/>", {
"class": "test__placeholder",
"text": $(this.element).data("placeholder")
}).css({
"position": "absolute"
}),
titleText = $("<span/>"),
btn = $("<div>",
{
"class": "test__btn"
}).append("<span/>"),
ul = $("<ul/>", {
"class": "test__list"
});
$(this.element).wrap(parent);
parent = $(this.element).parent();
parent.append(input).append(title.append($(this.element).data("placeholder") ? placeholder : "").append(titleText).append(btn)).append(ul);
for (var i = 0; i < $(this.element).children("option").length; i++) {
var li = $("<li/>",
{
"click": function() {
parent.removeClass("show");
}
}).append($("<span/>").text($(this.element).children("option")[i].text));
ul.append(li);
};
if ( !$(this.element).data("placeholder") ) {
titleText.text($(this.element).children("option:selected").text())
}
}
};
// A really lightweight plugin wrapper around the constructor,
// preventing against multiple instantiations
$.fn[pluginName] = function ( options ) {
return this.each(function () {
if (!$.data(this, "plugin_" + pluginName)) {
$.data(this, "plugin_" + pluginName,
new Plugin( this, options ));
}
});
};
})( jQuery, window, document );