| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831 | 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 methodName = superMethods[m];        DecoratedClass.prototype[methodName] = SuperClass.prototype[methodName];    }    for (var m = 0; m < decoratedMethods.length; m++) {      var methodName = decoratedMethods[m];      function calledMethod (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);        }      }      DecoratedClass.prototype[methodName] = calledMethod(methodName);    }    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/select',[  '../utils',  'jquery'], function (Utils, $) {  function SelectAdapter ($element, options) {    this.$element = $element;    SelectAdapter.__super__.constructor.call(this);  }  Utils.Extend(SelectAdapter, Utils.Observable);  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 = $(      '<ul class="options"></ul>'    );    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 = $(      '<li class="option"></li>'    );    $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 = $(      '<span class="">' +        '<span class="results"></span>' +      '</span>'    );    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 = $(      '<span class="single-select">' +        '<span class="rendered-selection"></span>' +      '</span>'    );    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 = $(      '<span class="multiple-select">' +        '<ul class="rendered-selection"></ul>' +      '</span>'    );    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 = $('<ul class="choice"></ul>');      $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></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);      console.log(results)      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");    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 = $(      '<span class="select2 select2-container select2-theme-default">' +        '<span class="selection"></span>' +        '<span class="dropdown"></span>' +      '</span>'    );    return $container;  };  return Select2;});
 |