whole_func_string: 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('');
  		}
  
  	}
func_code_string: 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('');
  		}
  
  	}
func_documentation_string: Creates all elements and sets up event bindings.