function() {
		var self      = this;
		var settings  = self.settings;
		var eventNS   = self.eventNS;
		var $window   = $(window);
		var $document = $(document);
		var $input    = self.$input;

		var $wrapper;
		var $control;
		var $control_input;
		var $dropdown;
		var $dropdown_content;
		var $dropdown_parent;
		var inputMode;
		var timeout_blur;
		var timeout_focus;
		var classes;
		var classes_plugins;
		var inputId;

		inputMode         = self.settings.mode;
		classes           = $input.attr('class') || '';

		$wrapper          = $('<div>').addClass(settings.wrapperClass).addClass(classes).addClass(inputMode);
		$control          = $('<div>').addClass(settings.inputClass).addClass('items').appendTo($wrapper);
		$control_input    = $('<input type="text" autocomplete="off" />').appendTo($control).attr('tabindex', $input.is(':disabled') ? '-1' : self.tabIndex);
		$dropdown_parent  = $(settings.dropdownParent || $wrapper);
		$dropdown         = $('<div>').addClass(settings.dropdownClass).addClass(inputMode).hide().appendTo($dropdown_parent);
		$dropdown_content = $('<div>').addClass(settings.dropdownContentClass).appendTo($dropdown);

		if(inputId = $input.attr('id')) {
			$control_input.attr('id', inputId + '-selectized');
			$("label[for='"+inputId+"']").attr('for', inputId + '-selectized');
		}

		if(self.settings.copyClassesToDropdown) {
			$dropdown.addClass(classes);
		}

		$wrapper.css({
			width: $input[0].style.width
		});

		if (self.plugins.names.length) {
			classes_plugins = 'plugin-' + self.plugins.names.join(' plugin-');
			$wrapper.addClass(classes_plugins);
			$dropdown.addClass(classes_plugins);
		}

		if ((settings.maxItems === null || settings.maxItems > 1) && self.tagType === TAG_SELECT) {
			$input.attr('multiple', 'multiple');
		}

		if (self.settings.placeholder) {
			$control_input.attr('placeholder', settings.placeholder);
		}

		// if splitOn was not passed in, construct it from the delimiter to allow pasting universally
		if (!self.settings.splitOn && self.settings.delimiter) {
			var delimiterEscaped = self.settings.delimiter.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
			self.settings.splitOn = new RegExp('\\s*' + delimiterEscaped + '+\\s*');
		}

		if ($input.attr('autocorrect')) {
			$control_input.attr('autocorrect', $input.attr('autocorrect'));
		}

		if ($input.attr('autocapitalize')) {
			$control_input.attr('autocapitalize', $input.attr('autocapitalize'));
		}
		$control_input[0].type = $input[0].type;

		self.$wrapper          = $wrapper;
		self.$control          = $control;
		self.$control_input    = $control_input;
		self.$dropdown         = $dropdown;
		self.$dropdown_content = $dropdown_content;

		$dropdown.on('mouseenter mousedown click', '[data-disabled]>[data-selectable]', function(e) { e.stopImmediatePropagation(); });
		$dropdown.on('mouseenter', '[data-selectable]', function() { return self.onOptionHover.apply(self, arguments); });
		$dropdown.on('mousedown click', '[data-selectable]', function() { return self.onOptionSelect.apply(self, arguments); });
		watchChildEvent($control, 'mousedown', '*:not(input)', function() { return self.onItemSelect.apply(self, arguments); });
		autoGrow($control_input);

		$control.on({
			mousedown : function() { return self.onMouseDown.apply(self, arguments); },
			click     : function() { return self.onClick.apply(self, arguments); }
		});

		$control_input.on({
			mousedown : function(e) { e.stopPropagation(); },
			keydown   : function() { return self.onKeyDown.apply(self, arguments); },
			keyup     : function() { return self.onKeyUp.apply(self, arguments); },
			keypress  : function() { return self.onKeyPress.apply(self, arguments); },
			resize    : function() { self.positionDropdown.apply(self, []); },
			blur      : function() { return self.onBlur.apply(self, arguments); },
			focus     : function() { self.ignoreBlur = false; return self.onFocus.apply(self, arguments); },
			paste     : function() { return self.onPaste.apply(self, arguments); }
		});

		$document.on('keydown' + eventNS, function(e) {
			self.isCmdDown = e[IS_MAC ? 'metaKey' : 'ctrlKey'];
			self.isCtrlDown = e[IS_MAC ? 'altKey' : 'ctrlKey'];
			self.isShiftDown = e.shiftKey;
		});

		$document.on('keyup' + eventNS, function(e) {
			if (e.keyCode === KEY_CTRL) self.isCtrlDown = false;
			if (e.keyCode === KEY_SHIFT) self.isShiftDown = false;
			if (e.keyCode === KEY_CMD) self.isCmdDown = false;
		});

		$document.on('mousedown' + eventNS, function(e) {
			if (self.isFocused) {
				// prevent events on the dropdown scrollbar from causing the control to blur
				if (e.target === self.$dropdown[0] || e.target.parentNode === self.$dropdown[0]) {
					return false;
				}
				// blur on click outside
				if (!self.$control.has(e.target).length && e.target !== self.$control[0]) {
					self.blur(e.target);
				}
			}
		});

		$window.on(['scroll' + eventNS, 'resize' + eventNS].join(' '), function() {
			if (self.isOpen) {
				self.positionDropdown.apply(self, arguments);
			}
		});
		$window.on('mousemove' + eventNS, function() {
			self.ignoreHover = false;
		});

		// store original children and tab index so that they can be
		// restored when the destroy() method is called.
		this.revertSettings = {
			$children : $input.children().detach(),
			tabindex  : $input.attr('tabindex')
		};

		$input.attr('tabindex', -1).hide().after(self.$wrapper);

		if ($.isArray(settings.items)) {
			self.setValue(settings.items);
			delete settings.items;
		}

		// feature detect for the validation API
		if (SUPPORTS_VALIDITY_API) {
			$input.on('invalid' + eventNS, function(e) {
				e.preventDefault();
				self.isInvalid = true;
				self.refreshState();
			});
		}

		self.updateOriginalInput();
		self.refreshItems();
		self.refreshState();
		self.updatePlaceholder();
		self.isSetup = true;

		if ($input.is(':disabled')) {
			self.disable();
		}

		self.on('change', this.onChange);

		$input.data('selectize', self);
		$input.addClass('selectized');
		self.trigger('initialize');

		// preload options
		if (settings.preload === true) {
			self.onSearchChange('');
		}

	}
function() {
		var self      = this;
		var settings  = self.settings;
		var eventNS   = self.eventNS;
		var $window   = $(window);
		var $document = $(document);
		var $input    = self.$input;

		var $wrapper;
		var $control;
		var $control_input;
		var $dropdown;
		var $dropdown_content;
		var $dropdown_parent;
		var inputMode;
		var timeout_blur;
		var timeout_focus;
		var classes;
		var classes_plugins;
		var inputId;

		inputMode         = self.settings.mode;
		classes           = $input.attr('class') || '';

		$wrapper          = $('<div>').addClass(settings.wrapperClass).addClass(classes).addClass(inputMode);
		$control          = $('<div>').addClass(settings.inputClass).addClass('items').appendTo($wrapper);
		$control_input    = $('<input type="text" autocomplete="off" />').appendTo($control).attr('tabindex', $input.is(':disabled') ? '-1' : self.tabIndex);
		$dropdown_parent  = $(settings.dropdownParent || $wrapper);
		$dropdown         = $('<div>').addClass(settings.dropdownClass).addClass(inputMode).hide().appendTo($dropdown_parent);
		$dropdown_content = $('<div>').addClass(settings.dropdownContentClass).appendTo($dropdown);

		if(inputId = $input.attr('id')) {
			$control_input.attr('id', inputId + '-selectized');
			$("label[for='"+inputId+"']").attr('for', inputId + '-selectized');
		}

		if(self.settings.copyClassesToDropdown) {
			$dropdown.addClass(classes);
		}

		$wrapper.css({
			width: $input[0].style.width
		});

		if (self.plugins.names.length) {
			classes_plugins = 'plugin-' + self.plugins.names.join(' plugin-');
			$wrapper.addClass(classes_plugins);
			$dropdown.addClass(classes_plugins);
		}

		if ((settings.maxItems === null || settings.maxItems > 1) && self.tagType === TAG_SELECT) {
			$input.attr('multiple', 'multiple');
		}

		if (self.settings.placeholder) {
			$control_input.attr('placeholder', settings.placeholder);
		}

		
		if (!self.settings.splitOn && self.settings.delimiter) {
			var delimiterEscaped = self.settings.delimiter.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
			self.settings.splitOn = new RegExp('\\s*' + delimiterEscaped + '+\\s*');
		}

		if ($input.attr('autocorrect')) {
			$control_input.attr('autocorrect', $input.attr('autocorrect'));
		}

		if ($input.attr('autocapitalize')) {
			$control_input.attr('autocapitalize', $input.attr('autocapitalize'));
		}
		$control_input[0].type = $input[0].type;

		self.$wrapper          = $wrapper;
		self.$control          = $control;
		self.$control_input    = $control_input;
		self.$dropdown         = $dropdown;
		self.$dropdown_content = $dropdown_content;

		$dropdown.on('mouseenter mousedown click', '[data-disabled]>[data-selectable]', function(e) { e.stopImmediatePropagation(); });
		$dropdown.on('mouseenter', '[data-selectable]', function() { return self.onOptionHover.apply(self, arguments); });
		$dropdown.on('mousedown click', '[data-selectable]', function() { return self.onOptionSelect.apply(self, arguments); });
		watchChildEvent($control, 'mousedown', '*:not(input)', function() { return self.onItemSelect.apply(self, arguments); });
		autoGrow($control_input);

		$control.on({
			mousedown : function() { return self.onMouseDown.apply(self, arguments); },
			click     : function() { return self.onClick.apply(self, arguments); }
		});

		$control_input.on({
			mousedown : function(e) { e.stopPropagation(); },
			keydown   : function() { return self.onKeyDown.apply(self, arguments); },
			keyup     : function() { return self.onKeyUp.apply(self, arguments); },
			keypress  : function() { return self.onKeyPress.apply(self, arguments); },
			resize    : function() { self.positionDropdown.apply(self, []); },
			blur      : function() { return self.onBlur.apply(self, arguments); },
			focus     : function() { self.ignoreBlur = false; return self.onFocus.apply(self, arguments); },
			paste     : function() { return self.onPaste.apply(self, arguments); }
		});

		$document.on('keydown' + eventNS, function(e) {
			self.isCmdDown = e[IS_MAC ? 'metaKey' : 'ctrlKey'];
			self.isCtrlDown = e[IS_MAC ? 'altKey' : 'ctrlKey'];
			self.isShiftDown = e.shiftKey;
		});

		$document.on('keyup' + eventNS, function(e) {
			if (e.keyCode === KEY_CTRL) self.isCtrlDown = false;
			if (e.keyCode === KEY_SHIFT) self.isShiftDown = false;
			if (e.keyCode === KEY_CMD) self.isCmdDown = false;
		});

		$document.on('mousedown' + eventNS, function(e) {
			if (self.isFocused) {
				
				if (e.target === self.$dropdown[0] || e.target.parentNode === self.$dropdown[0]) {
					return false;
				}
				
				if (!self.$control.has(e.target).length && e.target !== self.$control[0]) {
					self.blur(e.target);
				}
			}
		});

		$window.on(['scroll' + eventNS, 'resize' + eventNS].join(' '), function() {
			if (self.isOpen) {
				self.positionDropdown.apply(self, arguments);
			}
		});
		$window.on('mousemove' + eventNS, function() {
			self.ignoreHover = false;
		});

		
		
		this.revertSettings = {
			$children : $input.children().detach(),
			tabindex  : $input.attr('tabindex')
		};

		$input.attr('tabindex', -1).hide().after(self.$wrapper);

		if ($.isArray(settings.items)) {
			self.setValue(settings.items);
			delete settings.items;
		}

		
		if (SUPPORTS_VALIDITY_API) {
			$input.on('invalid' + eventNS, function(e) {
				e.preventDefault();
				self.isInvalid = true;
				self.refreshState();
			});
		}

		self.updateOriginalInput();
		self.refreshItems();
		self.refreshState();
		self.updatePlaceholder();
		self.isSetup = true;

		if ($input.is(':disabled')) {
			self.disable();
		}

		self.on('change', this.onChange);

		$input.data('selectize', self);
		$input.addClass('selectized');
		self.trigger('initialize');

		
		if (settings.preload === true) {
			self.onSearchChange('');
		}

	}
function ( ) { var self = this ; var settings = self . settings ; var eventNS = self . eventNS ; var $window = $ ( window ) ; var $document = $ ( document ) ; var $input = self . $input ; var $wrapper ; var $control ; var $control_input ; var $dropdown ; var $dropdown_content ; var $dropdown_parent ; var inputMode ; var timeout_blur ; var timeout_focus ; var classes ; var classes_plugins ; var inputId ; inputMode = self . settings . mode ; classes = $input . attr ( 'class' ) || '' ; $wrapper = $ ( '<div>' ) . addClass ( settings . wrapperClass ) . addClass ( classes ) . addClass ( inputMode ) ; $control = $ ( '<div>' ) . addClass ( settings . inputClass ) . addClass ( 'items' ) . appendTo ( $wrapper ) ; $control_input = $ ( '<input type="text" autocomplete="off" />' ) . appendTo ( $control ) . attr ( 'tabindex' , $input . is ( ':disabled' ) ? '-1' : self . tabIndex ) ; $dropdown_parent = $ ( settings . dropdownParent || $wrapper ) ; $dropdown = $ ( '<div>' ) . addClass ( settings . dropdownClass ) . addClass ( inputMode ) . hide ( ) . appendTo ( $dropdown_parent ) ; $dropdown_content = $ ( '<div>' ) . addClass ( settings . dropdownContentClass ) . appendTo ( $dropdown ) ; if ( inputId = $input . attr ( 'id' ) ) { $control_input . attr ( 'id' , inputId + '-selectized' ) ; $ ( "label[for='" + inputId + "']" ) . attr ( 'for' , inputId + '-selectized' ) ; } if ( self . settings . copyClassesToDropdown ) { $dropdown . addClass ( classes ) ; } $wrapper . css ( { width : $input [ 0 ] . style . width } ) ; if ( self . plugins . names . length ) { classes_plugins = 'plugin-' + self . plugins . names . join ( ' plugin-' ) ; $wrapper . addClass ( classes_plugins ) ; $dropdown . addClass ( classes_plugins ) ; } if ( ( settings . maxItems === null || settings . maxItems > 1 ) && self . tagType === TAG_SELECT ) { $input . attr ( 'multiple' , 'multiple' ) ; } if ( self . settings . placeholder ) { $control_input . attr ( 'placeholder' , settings . placeholder ) ; } // if splitOn was not passed in, construct it from the delimiter to allow pasting universally if ( ! self . settings . splitOn && self . settings . delimiter ) { var delimiterEscaped = self . settings . delimiter . replace ( / [-\/\\^$*+?.()|[\]{}] / g , '\\$&' ) ; self . settings . splitOn = new RegExp ( '\\s*' + delimiterEscaped + '+\\s*' ) ; } if ( $input . attr ( 'autocorrect' ) ) { $control_input . attr ( 'autocorrect' , $input . attr ( 'autocorrect' ) ) ; } if ( $input . attr ( 'autocapitalize' ) ) { $control_input . attr ( 'autocapitalize' , $input . attr ( 'autocapitalize' ) ) ; } $control_input [ 0 ] . type = $input [ 0 ] . type ; self . $wrapper = $wrapper ; self . $control = $control ; self . $control_input = $control_input ; self . $dropdown = $dropdown ; self . $dropdown_content = $dropdown_content ; $dropdown . on ( 'mouseenter mousedown click' , '[data-disabled]>[data-selectable]' , function ( e ) { e . stopImmediatePropagation ( ) ; } ) ; $dropdown . on ( 'mouseenter' , '[data-selectable]' , function ( ) { return self . onOptionHover . apply ( self , arguments ) ; } ) ; $dropdown . on ( 'mousedown click' , '[data-selectable]' , function ( ) { return self . onOptionSelect . apply ( self , arguments ) ; } ) ; watchChildEvent ( $control , 'mousedown' , '*:not(input)' , function ( ) { return self . onItemSelect . apply ( self , arguments ) ; } ) ; autoGrow ( $control_input ) ; $control . on ( { mousedown : function ( ) { return self . onMouseDown . apply ( self , arguments ) ; } , click : function ( ) { return self . onClick . apply ( self , arguments ) ; } } ) ; $control_input . on ( { mousedown : function ( e ) { e . stopPropagation ( ) ; } , keydown : function ( ) { return self . onKeyDown . apply ( self , arguments ) ; } , keyup : function ( ) { return self . onKeyUp . apply ( self , arguments ) ; } , keypress : function ( ) { return self . onKeyPress . apply ( self , arguments ) ; } , resize : function ( ) { self . positionDropdown . apply ( self , [ ] ) ; } , blur : function ( ) { return self . onBlur . apply ( self , arguments ) ; } , focus : function ( ) { self . ignoreBlur = false ; return self . onFocus . apply ( self , arguments ) ; } , paste : function ( ) { return self . onPaste . apply ( self , arguments ) ; } } ) ; $document . on ( 'keydown' + eventNS , function ( e ) { self . isCmdDown = e [ IS_MAC ? 'metaKey' : 'ctrlKey' ] ; self . isCtrlDown = e [ IS_MAC ? 'altKey' : 'ctrlKey' ] ; self . isShiftDown = e . shiftKey ; } ) ; $document . on ( 'keyup' + eventNS , function ( e ) { if ( e . keyCode === KEY_CTRL ) self . isCtrlDown = false ; if ( e . keyCode === KEY_SHIFT ) self . isShiftDown = false ; if ( e . keyCode === KEY_CMD ) self . isCmdDown = false ; } ) ; $document . on ( 'mousedown' + eventNS , function ( e ) { if ( self . isFocused ) { // prevent events on the dropdown scrollbar from causing the control to blur if ( e . target === self . $dropdown [ 0 ] || e . target . parentNode === self . $dropdown [ 0 ] ) { return false ; } // blur on click outside if ( ! self . $control . has ( e . target ) . length && e . target !== self . $control [ 0 ] ) { self . blur ( e . target ) ; } } } ) ; $window . on ( [ 'scroll' + eventNS , 'resize' + eventNS ] . join ( ' ' ) , function ( ) { if ( self . isOpen ) { self . positionDropdown . apply ( self , arguments ) ; } } ) ; $window . on ( 'mousemove' + eventNS , function ( ) { self . ignoreHover = false ; } ) ; // store original children and tab index so that they can be // restored when the destroy() method is called. this . revertSettings = { $children : $input . children ( ) . detach ( ) , tabindex : $input . attr ( 'tabindex' ) } ; $input . attr ( 'tabindex' , - 1 ) . hide ( ) . after ( self . $wrapper ) ; if ( $ . isArray ( settings . items ) ) { self . setValue ( settings . items ) ; delete settings . items ; } // feature detect for the validation API if ( SUPPORTS_VALIDITY_API ) { $input . on ( 'invalid' + eventNS , function ( e ) { e . preventDefault ( ) ; self . isInvalid = true ; self . refreshState ( ) ; } ) ; } self . updateOriginalInput ( ) ; self . refreshItems ( ) ; self . refreshState ( ) ; self . updatePlaceholder ( ) ; self . isSetup = true ; if ( $input . is ( ':disabled' ) ) { self . disable ( ) ; } self . on ( 'change' , this . onChange ) ; $input . data ( 'selectize' , self ) ; $input . addClass ( 'selectized' ) ; self . trigger ( 'initialize' ) ; // preload options if ( settings . preload === true ) { self . onSearchChange ( '' ) ; } }
Creates all elements and sets up event bindings.
Creates all elements and sets up event bindings .