/** * @license almond 0.2.9 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved. * Available via the MIT or new BSD license. * see: http://github.com/jrburke/almond for details */ //Going sloppy to avoid 'use strict' string cost, but strict practices should //be followed. /*jslint sloppy: true */ /*global setTimeout: false */ var requirejs, require, define; (function (undef) { var main, req, makeMap, handlers, defined = {}, waiting = {}, config = {}, defining = {}, hasOwn = Object.prototype.hasOwnProperty, aps = [].slice, jsSuffixRegExp = /\.js$/; function hasProp(obj, prop) { return hasOwn.call(obj, prop); } /** * Given a relative module name, like ./something, normalize it to * a real name that can be mapped to a path. * @param {String} name the relative name * @param {String} baseName a real name that the name arg is relative * to. * @returns {String} normalized name */ function normalize(name, baseName) { var nameParts, nameSegment, mapValue, foundMap, lastIndex, foundI, foundStarMap, starI, i, j, part, baseParts = baseName && baseName.split("/"), map = config.map, starMap = (map && map['*']) || {}; //Adjust any relative paths. if (name && name.charAt(0) === ".") { //If have a base name, try to normalize against it, //otherwise, assume it is a top-level require that will //be relative to baseUrl in the end. if (baseName) { //Convert baseName to array, and lop off the last part, //so that . matches that "directory" and not name of the baseName's //module. For instance, baseName of "one/two/three", maps to //"one/two/three.js", but we want the directory, "one/two" for //this normalization. baseParts = baseParts.slice(0, baseParts.length - 1); name = name.split('/'); lastIndex = name.length - 1; // Node .js allowance: if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); } name = baseParts.concat(name); //start trimDots for (i = 0; i < name.length; i += 1) { part = name[i]; if (part === ".") { name.splice(i, 1); i -= 1; } else if (part === "..") { if (i === 1 && (name[2] === '..' || name[0] === '..')) { //End of the line. Keep at least one non-dot //path segment at the front so it can be mapped //correctly to disk. Otherwise, there is likely //no path mapping for a path starting with '..'. //This can still fail, but catches the most reasonable //uses of .. break; } else if (i > 0) { name.splice(i - 1, 2); i -= 2; } } } //end trimDots name = name.join("/"); } else if (name.indexOf('./') === 0) { // No baseName, so this is ID is resolved relative // to baseUrl, pull off the leading dot. name = name.substring(2); } } //Apply map config if available. if ((baseParts || starMap) && map) { nameParts = name.split('/'); for (i = nameParts.length; i > 0; i -= 1) { nameSegment = nameParts.slice(0, i).join("/"); if (baseParts) { //Find the longest baseName segment match in the config. //So, do joins on the biggest to smallest lengths of baseParts. for (j = baseParts.length; j > 0; j -= 1) { mapValue = map[baseParts.slice(0, j).join('/')]; //baseName segment has config, find if it has one for //this name. if (mapValue) { mapValue = mapValue[nameSegment]; if (mapValue) { //Match, update name to the new value. foundMap = mapValue; foundI = i; break; } } } } if (foundMap) { break; } //Check for a star map match, but just hold on to it, //if there is a shorter segment match later in a matching //config, then favor over this star map. if (!foundStarMap && starMap && starMap[nameSegment]) { foundStarMap = starMap[nameSegment]; starI = i; } } if (!foundMap && foundStarMap) { foundMap = foundStarMap; foundI = starI; } if (foundMap) { nameParts.splice(0, foundI, foundMap); name = nameParts.join('/'); } } return name; } function makeRequire(relName, forceSync) { return function () { //A version of a require function that passes a moduleName //value for items that may need to //look up paths relative to the moduleName return req.apply(undef, aps.call(arguments, 0).concat([relName, forceSync])); }; } function makeNormalize(relName) { return function (name) { return normalize(name, relName); }; } function makeLoad(depName) { return function (value) { defined[depName] = value; }; } function callDep(name) { if (hasProp(waiting, name)) { var args = waiting[name]; delete waiting[name]; defining[name] = true; main.apply(undef, args); } if (!hasProp(defined, name) && !hasProp(defining, name)) { throw new Error('No ' + name); } return defined[name]; } //Turns a plugin!resource to [plugin, resource] //with the plugin being undefined if the name //did not have a plugin prefix. function splitPrefix(name) { var prefix, index = name ? name.indexOf('!') : -1; if (index > -1) { prefix = name.substring(0, index); name = name.substring(index + 1, name.length); } return [prefix, name]; } /** * Makes a name map, normalizing the name, and using a plugin * for normalization if necessary. Grabs a ref to plugin * too, as an optimization. */ makeMap = function (name, relName) { var plugin, parts = splitPrefix(name), prefix = parts[0]; name = parts[1]; if (prefix) { prefix = normalize(prefix, relName); plugin = callDep(prefix); } //Normalize according if (prefix) { if (plugin && plugin.normalize) { name = plugin.normalize(name, makeNormalize(relName)); } else { name = normalize(name, relName); } } else { name = normalize(name, relName); parts = splitPrefix(name); prefix = parts[0]; name = parts[1]; if (prefix) { plugin = callDep(prefix); } } //Using ridiculous property names for space reasons return { f: prefix ? prefix + '!' + name : name, //fullName n: name, pr: prefix, p: plugin }; }; function makeConfig(name) { return function () { return (config && config.config && config.config[name]) || {}; }; } handlers = { require: function (name) { return makeRequire(name); }, exports: function (name) { var e = defined[name]; if (typeof e !== 'undefined') { return e; } else { return (defined[name] = {}); } }, module: function (name) { return { id: name, uri: '', exports: defined[name], config: makeConfig(name) }; } }; main = function (name, deps, callback, relName) { var cjsModule, depName, ret, map, i, args = [], callbackType = typeof callback, usingExports; //Use name if no relName relName = relName || name; //Call the callback to define the module, if necessary. if (callbackType === 'undefined' || callbackType === 'function') { //Pull out the defined dependencies and pass the ordered //values to the callback. //Default to [require, exports, module] if no deps deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; for (i = 0; i < deps.length; i += 1) { map = makeMap(deps[i], relName); depName = map.f; //Fast path CommonJS standard dependencies. if (depName === "require") { args[i] = handlers.require(name); } else if (depName === "exports") { //CommonJS module spec 1.1 args[i] = handlers.exports(name); usingExports = true; } else if (depName === "module") { //CommonJS module spec 1.1 cjsModule = args[i] = handlers.module(name); } else if (hasProp(defined, depName) || hasProp(waiting, depName) || hasProp(defining, depName)) { args[i] = callDep(depName); } else if (map.p) { map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); args[i] = defined[depName]; } else { throw new Error(name + ' missing ' + depName); } } ret = callback ? callback.apply(defined[name], args) : undefined; if (name) { //If setting exports via "module" is in play, //favor that over return value and exports. After that, //favor a non-undefined return value over exports use. if (cjsModule && cjsModule.exports !== undef && cjsModule.exports !== defined[name]) { defined[name] = cjsModule.exports; } else if (ret !== undef || !usingExports) { //Use the return value from the function. defined[name] = ret; } } } else if (name) { //May just be an object definition for the module. Only //worry about defining if have a module name. defined[name] = callback; } }; requirejs = require = req = function (deps, callback, relName, forceSync, alt) { if (typeof deps === "string") { if (handlers[deps]) { //callback in this case is really relName return handlers[deps](callback); } //Just return the module wanted. In this scenario, the //deps arg is the module name, and second arg (if passed) //is just the relName. //Normalize module name, if it contains . or .. return callDep(makeMap(deps, callback).f); } else if (!deps.splice) { //deps is a config object, not an array. config = deps; if (config.deps) { req(config.deps, config.callback); } if (!callback) { return; } if (callback.splice) { //callback is an array, which means it is a dependency list. //Adjust args if there are dependencies deps = callback; callback = relName; relName = null; } else { deps = undef; } } //Support require(['a']) callback = callback || function () {}; //If relName is a function, it is an errback handler, //so remove it. if (typeof relName === 'function') { relName = forceSync; forceSync = alt; } //Simulate async callback; if (forceSync) { main(undef, deps, callback, relName); } else { //Using a non-zero value because of concern for what old browsers //do, and latest browsers "upgrade" to 4 if lower value is used: //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout: //If want a value immediately, use require('id') instead -- something //that works in almond on the global level, but not guaranteed and //unlikely to work in other AMD implementations. setTimeout(function () { main(undef, deps, callback, relName); }, 4); } return req; }; /** * Just drops the config on the floor, but returns req in case * the config return value is used. */ req.config = function (cfg) { return req(cfg); }; /** * Expose module registry for debugging and tooling */ requirejs._defined = defined; define = function (name, deps, callback) { //This module may not have dependencies if (!deps.splice) { //deps is not an array, so probably means //an object literal or factory function for //the value. Adjust args. callback = deps; deps = []; } if (!hasProp(defined, name) && !hasProp(waiting, name)) { waiting[name] = [name, deps, callback]; } }; define.amd = { jQuery: true }; }()); define("almond", function(){}); define('jquery',[],function () { return jQuery; }); define('select2/utils',[], function () { var Utils = {}; Utils.Extend = function (ChildClass, SuperClass) { var __hasProp = {}.hasOwnProperty; function BaseConstructor () { this.constructor = ChildClass; } for (var key in SuperClass) { if (__hasProp.call(SuperClass, key)) { ChildClass[key] = SuperClass[key]; } } BaseConstructor.prototype = SuperClass.prototype; ChildClass.prototype = new BaseConstructor(); ChildClass.__super__ = SuperClass.prototype; return ChildClass; }; function getMethods (theClass) { var proto = theClass.prototype; var methods = []; for (var methodName in proto) { var m = proto[methodName]; if (typeof m !== 'function') { continue; } methods.push(methodName); } return methods; } Utils.Decorate = function (SuperClass, DecoratorClass) { var decoratedMethods = getMethods(DecoratorClass); var superMethods = getMethods(SuperClass); function DecoratedClass () { var unshift = Array.prototype.unshift; var argCount = DecoratorClass.prototype.constructor.length; var calledConstructor = SuperClass.prototype.constructor; if (argCount > 0) { unshift.call(arguments, SuperClass.prototype.constructor); calledConstructor = DecoratorClass.prototype.constructor; } calledConstructor.apply(this, arguments); } DecoratorClass.displayName = SuperClass.displayName; function ctr () { this.constructor = DecoratedClass; } DecoratedClass.prototype = new ctr(); for (var m = 0; m < superMethods.length; m++) { var superMethod = superMethods[m]; DecoratedClass.prototype[superMethod] = SuperClass.prototype[superMethod]; } var calledMethod = function (methodName) { // Stub out the original method if it's not decorating an actual method var originalMethod = function () {}; if (methodName in DecoratedClass.prototype) { originalMethod = DecoratedClass.prototype[methodName]; } var decoratedMethod = DecoratorClass.prototype[methodName]; return function () { var unshift = Array.prototype.unshift; unshift.call(arguments, originalMethod); return decoratedMethod.apply(this, arguments); }; }; for (var d = 0; d < decoratedMethods.length; d++) { var decoratedMethod = decoratedMethods[d]; DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod); } return DecoratedClass; }; var Observable = function () { this.listeners = {}; }; Observable.prototype.on = function (event, callback) { if (event in this.listeners) { this.listeners[event].push(callback); } else { this.listeners[event] = [callback]; } }; Observable.prototype.trigger = function (event) { var slice = Array.prototype.slice; if (event in this.listeners) { this.invoke(this.listeners[event], slice.call(arguments, 1)); } if ('*' in this.listeners) { this.invoke(this.listeners['*'], arguments); } }; Observable.prototype.invoke = function (listeners, params) { for (var i = 0, len = listeners.length; i < len; i++) { listeners[i].apply(this, params); } }; Utils.Observable = Observable; return Utils; }); define('select2/data/base',[ '../utils' ], function (Utils) { function BaseAdapter ($element, options) { BaseAdapter.__super__.constructor.call(this); } Utils.Extend(BaseAdapter, Utils.Observable); BaseAdapter.prototype.current = function (callback) { throw new Error('The `current` method must be defined in child classes.'); }; BaseAdapter.prototype.query = function (params, callback) { throw new Error('The `query` method must be defined in child classes.'); }; return BaseAdapter; }); define('select2/data/select',[ './base', '../utils', 'jquery' ], function (BaseAdapter, Utils, $) { function SelectAdapter ($element, options) { this.$element = $element; SelectAdapter.__super__.constructor.call(this); } Utils.Extend(SelectAdapter, BaseAdapter); SelectAdapter.prototype.current = function (callback) { var data = []; var self = this; this.$element.find(':selected').each(function () { var $option = $(this); var option = self.item($option); data.push(option); }); callback(data); }; SelectAdapter.prototype.select = function (data) { var self = this; if (this.$element.prop('multiple')) { this.current(function (currentData) { var val = []; data = [data]; data.push.apply(data, currentData); for (var d = 0; d < data.length; d++) { id = data[d].id; if (val.indexOf(id) === -1) { val.push(id); } } self.$element.val(val); self.$element.trigger('change'); }); } else { var val = data.id; this.$element.val(val); this.$element.trigger('change'); } }; SelectAdapter.prototype.unselect = function (data) { var self = this; if (!this.$element.prop('multiple')) { return; } this.current(function (currentData) { var val = []; for (var d = 0; d < currentData.length; d++) { id = currentData[d].id; if (id !== data.id && val.indexOf(id) === -1) { val.push(id); } } self.$element.val(val); self.$element.trigger('change'); }); }; SelectAdapter.prototype.bind = function (container, $container) { var self = this; container.on('select', function (params) { self.select(params.data); }); container.on('unselect', function (params) { self.unselect(params.data); }); }; SelectAdapter.prototype.query = function (params, callback) { var data = []; var self = this; this.$element.find('option').each(function () { var $option = $(this); var option = self.item($option); if (self.matches(params, option)) { data.push(option); } }); callback(data); }; SelectAdapter.prototype.item = function ($option) { var data = $option.data('data'); // If the data has already be generated, use it if (data == null) { data = { id: $option.val(), text: $option.html() }; $option.data('data', data); } return data; }; SelectAdapter.prototype.matches = function (params, data) { if ($.trim(params.term) === '') { return true; } if (data.text.indexOf(params.term) > -1) { return true; } return false; }; return SelectAdapter; }); define('select2/results',[ './utils' ], function (Utils) { function Results ($element, options, dataAdapter) { this.$element = $element; this.data = dataAdapter; Results.__super__.constructor.call(this); } Utils.Extend(Results, Utils.Observable); Results.prototype.render = function () { var $results = $( '' ); this.$results = $results; return $results; }; Results.prototype.clear = function () { this.$results.empty(); }; Results.prototype.append = function (data) { var $options = []; for (var d = 0; d < data.length; d++) { var item = data[d]; var $option = this.option(item); $options.push($option); } this.$results.append($options); }; Results.prototype.setClasses = function () { var self = this; this.data.current(function (selected) { selected = $.map(selected, function (s) { return s.id; }); self.$results.find('.option.selected').removeClass('selected'); var $options = self.$results.find('.option'); $options.each(function () { var $option = $(this); var item = $option.data('data'); if (selected.indexOf(item.id) > -1) { $option.addClass('selected'); } }); }); }; Results.prototype.option = function (data) { var $option = $( '
  • ' ); $option.html(data.text); $option.data('data', data); return $option; }; Results.prototype.bind = function (container, $container) { var self = this; this.on('results:all', function (data) { self.clear(); self.append(data); self.setClasses(); }); this.on('results:append', function (data) { self.append(data); self.setClasses(); }); this.$results.on('mouseup', '.option', function (evt) { var $this = $(this); var data = $this.data('data'); if ($this.hasClass('selected')) { self.trigger('unselected', { originalEvent: evt, data: data }); self.setClasses(); return; } self.trigger('selected', { originalEvent: evt, data: data }); self.setClasses(); }); this.$results.on('mouseenter', '.option', function (evt) { self.$results.find('.option.highlighted').removeClass('highlighted'); $(this).addClass('highlighted'); }); this.$results.on('mouseleave', '.option', function (evt) { $(this).removeClass('highlighted'); }); }; return Results; }); define('select2/dropdown',[ './utils' ], function (Utils) { function Dropdown ($element, options) { this.$element = $element; } Utils.Extend(Dropdown, Utils.Observable); Dropdown.prototype.render = function () { var $dropdown = $( '' + '' + '' ); return $dropdown; }; return Dropdown; }); define('select2/selection/single',[ '../utils' ], function (Utils) { function SingleSelection ($element, options) { this.$element = $element; this.options = options; SingleSelection.__super__.constructor.call(this); } Utils.Extend(SingleSelection, Utils.Observable); SingleSelection.prototype.render = function () { var $selection = $( '' + '' + '' ); this.$selection = $selection; return $selection; }; SingleSelection.prototype.bind = function (container, $container) { var self = this; this.$selection.on('mousedown', function (evt) { // Only respond to left clicks if (evt.which !== 1) { return; } self.trigger('toggle', { originalEvent: evt }); }); container.on('selection:update', function (params) { self.update(params.data); }); }; SingleSelection.prototype.clear = function () { this.$selection.find('.rendered-selection').empty(); }; SingleSelection.prototype.display = function (data) { return data.text; }; SingleSelection.prototype.update = function (data) { if (data.length === 0) { this.clear(); return; } var selection = data[0]; var formatted = this.display(selection); this.$selection.find('.rendered-selection').html(formatted); }; return SingleSelection; }); define('select2/selection/multiple',[ '../utils' ], function (Utils) { function MultipleSelection ($element, options) { this.$element = $element; this.options = options; MultipleSelection.__super__.constructor.call(this); } Utils.Extend(MultipleSelection, Utils.Observable); MultipleSelection.prototype.render = function () { var $selection = $( '' + '' + '' ); this.$selection = $selection; return $selection; }; MultipleSelection.prototype.bind = function (container, $container) { var self = this; this.$selection.on('click', function (evt) { self.trigger('toggle', { originalEvent: evt }); }); container.on('selection:update', function (params) { self.update(params.data); }); }; MultipleSelection.prototype.clear = function () { this.$selection.find('.rendered-selection').empty(); }; MultipleSelection.prototype.display = function (data) { return data.text; }; MultipleSelection.prototype.update = function (data) { this.clear(); if (data.length === 0) { return; } var $selections = []; for (var d = 0; d < data.length; d++) { var selection = data[d]; var formatted = this.display(selection); var $selection = $(''); $selection.text(formatted); $selection.data('data', data); $selections.push($selection); } this.$selection.find('.rendered-selection').append($selections); }; return MultipleSelection; }); define('select2/data/array',[ './select', '../utils' ], function (SelectAdapter, Utils) { function ArrayAdapter ($element, options) { this.data = options.options.data; ArrayAdapter.__super__.constructor.call(this, $element, options); } Utils.Extend(ArrayAdapter, SelectAdapter); ArrayAdapter.prototype.select = function (data) { var self = this; this.$element.find('option').each(function () { var $option = $(this); var option = self.item($option); if (option.id == data.id) { $option.remove(); } }); var $option = this.option(data); this.$element.append($option); ArrayAdapter.__super__.select.call(this, data); }; ArrayAdapter.prototype.option = function (data) { var $option = $(''); $option.text(data.text); $option.val(data.id); $option.data('data', data); return $option; }; ArrayAdapter.prototype.query = function (params, callback) { var matches = []; var self = this; $.each(this.data, function () { var option = this; if (self.matches(params, option)) { matches.push(option); } }); callback(matches); }; return ArrayAdapter; }); define('select2/data/ajax',[ './array', '../utils', 'jquery' ], function (ArrayAdapter, Utils, $) { function AjaxAdapter ($element, options) { this.ajaxOptions = options.options.ajax; this.processResults = this.ajaxOptions.processResults || function (results) { return results; }; ArrayAdapter.__super__.constructor.call(this, $element, options); } Utils.Extend(AjaxAdapter, ArrayAdapter); AjaxAdapter.prototype.query = function (params, callback) { var matches = []; var self = this; var options = $.extend({ type: 'GET' }, this.ajaxOptions); if (typeof options.url === 'function') { options.url = options.url(params); } if (typeof options.data === 'function') { options.data = options.data(params); } var $request = $.ajax(options); $request.success(function (data) { var results = self.processResults(data); callback(results); }); }; return AjaxAdapter; }); define('select2/options',[ './data/select', './results', './dropdown', './selection/single', './selection/multiple', './data/array', './data/ajax' ], function (SelectData, ResultsList, Dropdown, SingleSelection, MultipleSelection) { function Options (options) { this.options = options; this.dataAdapter = options.dataAdapter || SelectData; this.resultsAdapter = ResultsList; this.dropdownAdapter = options.dropdownAdapter || Dropdown; this.selectionAdapter = options.selectionAdapter; if (this.selectionAdapter == null) { if (this.options.multiple) { this.selectionAdapter = MultipleSelection; } else { this.selectionAdapter = SingleSelection; } } } return Options; }); define('select2/core',[ 'jquery', './options', './utils' ], function ($, Options, Utils) { var Select2 = function ($element, options) { this.$element = $element; options = options || {}; options.multiple = options.multiple || $element.prop('multiple'); this.options = new Options(options); Select2.__super__.constructor.call(this); // Set up containers and adapters this.data = new this.options.dataAdapter($element, this.options); var $container = this.render(); this.$container = $container; $container.insertAfter(this.$element); $container.width($element.width()); this.selection = new this.options.selectionAdapter($element, this.options); var $selectionContainer = $container.find('.selection'); var $selection = this.selection.render(); $selectionContainer.append($selection); this.dropdown = new this.options.dropdownAdapter($element, this.options); var $dropdownContainer = $container.find('.dropdown-wrapper'); var $dropdown = this.dropdown.render(); $dropdownContainer.append($dropdown); this.results = new this.options.resultsAdapter( $element, this.options, this.data); var $resultsContainer = $dropdown.find('.results'); var $results = this.results.render(); $resultsContainer.append($results); // Bind events var self = this; this.data.bind(this, $container); this.selection.bind(this, $container); this.results.bind(this, $container); this.$element.on('change', function () { self.data.current(function (data) { self.trigger('selection:update', { data: data }); }); }); this.selection.on('toggle', function () { self.toggleDropdown(); }); this.results.on('selected', function (params) { self.trigger('select', params); self.trigger('close'); }); this.results.on('unselected', function (params) { self.trigger('unselect', params); self.trigger('close'); }); this.on('open', function () { $container.addClass('open'); }); this.on('close', function () { $container.removeClass('open'); }); // Set the initial state this.data.current(function (initialData) { self.trigger('selection:update', { data: initialData }); }); this.data.query({}, function (data) { self.results.trigger('results:all', data); }); // Hide the original select $element.hide(); }; Utils.Extend(Select2, Utils.Observable); Select2.prototype.toggleDropdown = function () { if (this.$container.hasClass('open')) { this.trigger('close'); } else { this.trigger('open'); } }; Select2.prototype.render = function () { var $container = $( '' + '' + '' + '' ); return $container; }; return Select2; });