<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>QUnit Example</title>
    <link href="../../dist/css/select2.css" rel="stylesheet"/>

    <script src="../../vendor/almond-0.2.9.js" type="text/javascript"></script>
    <script src="../../vendor/jquery-2.1.0.js" type="text/javascript"></script>

    <script src="../../dist/js/select2.js"></script>
</head>
<body>


<input type="text" style="width:300px" autofocus/><br/>
<select style="width:300px" id="source">
    <option value="AK">Alaska</option>
    <option value="HI">Hawaii</option>
    <option value="CA">California</option>
    <option value="NV">Nevada</option>
    <option value="OR">Oregon</option>
    <option value="WA">Washington</option>
    <option value="AZ">Arizona</option>
    <option value="CO">Colorado</option>
    <option value="ID">Idaho</option>
    <option value="MT">Montana</option>
    <option value="NE">Nebraska</option>
    <option value="NM">New Mexico</option>
    <option value="ND">North Dakota</option>
    <option value="UT">Utah</option>
    <option value="WY">Wyoming</option>
    <option value="AL">Alabama</option>
    <option value="AR">Arkansas</option>
    <option value="IL">Illinois</option>
    <option value="IA">Iowa</option>
    <option value="KS">Kansas</option>
    <option value="KY">Kentucky</option>
    <option value="LA">Louisiana</option>
    <option value="MN">Minnesota</option>
    <option value="MS">Mississippi</option>
    <option value="MO">Missouri</option>
    <option value="OK">Oklahoma</option>
    <option value="SD">South Dakota</option>
    <option value="TX">Texas</option>
    <option value="TN">Tennessee</option>
    <option value="WI">Wisconsin</option>
    <option value="CT">Connecticut</option>
    <option value="DE">Delaware</option>
    <option value="FL">Florida</option>
    <option value="GA">Georgia</option>
    <option value="IN">Indiana</option>
    <option value="ME">Maine</option>
    <option value="MD">Maryland</option>
    <option value="MA">Massachusetts</option>
    <option value="MI">Michigan</option>
    <option value="NH">New Hampshire</option>
    <option value="NJ">New Jersey</option>
    <option value="NY">New York</option>
    <option value="NC">North Carolina</option>
    <option value="OH">Ohio</option>
    <option value="PA">Pennsylvania</option>
    <option value="RI">Rhode Island</option>
    <option value="SC">South Carolina</option>
    <option value="VT">Vermont</option>
    <option value="VA">Virginia</option>
    <option value="WV">West Virginia</option>
</select><br/>
<input type="text" style="width:300px" /><br/>
<select style="width:300px">
    <option value="AK">Alaska</option>
    <option value="HI">Hawaii</option>
    <option value="CA">California</option>
    <option value="NV">Nevada</option>
    <option value="OR">Oregon</option>
    <option value="WA">Washington</option>
    <option value="AZ">Arizona</option>
    <option value="CO">Colorado</option>
    <option value="ID">Idaho</option>
    <option value="MT">Montana</option>
    <option value="NE">Nebraska</option>
    <option value="NM">New Mexico</option>
    <option value="ND">North Dakota</option>
    <option value="UT">Utah</option>
    <option value="WY">Wyoming</option>
    <option value="AL">Alabama</option>
    <option value="AR">Arkansas</option>
    <option value="IL">Illinois</option>
    <option value="IA">Iowa</option>
    <option value="KS">Kansas</option>
    <option value="KY">Kentucky</option>
    <option value="LA">Louisiana</option>
    <option value="MN">Minnesota</option>
    <option value="MS">Mississippi</option>
    <option value="MO">Missouri</option>
    <option value="OK">Oklahoma</option>
    <option value="SD">South Dakota</option>
    <option value="TX">Texas</option>
    <option value="TN">Tennessee</option>
    <option value="WI">Wisconsin</option>
    <option value="CT">Connecticut</option>
    <option value="DE">Delaware</option>
    <option value="FL">Florida</option>
    <option value="GA">Georgia</option>
    <option value="IN">Indiana</option>
    <option value="ME">Maine</option>
    <option value="MD">Maryland</option>
    <option value="MA">Massachusetts</option>
    <option value="MI">Michigan</option>
    <option value="NH">New Hampshire</option>
    <option value="NJ">New Jersey</option>
    <option value="NY">New York</option>
    <option value="NC">North Carolina</option>
    <option value="OH">Ohio</option>
    <option value="PA">Pennsylvania</option>
    <option value="RI">Rhode Island</option>
    <option value="SC">South Carolina</option>
    <option value="VT">Vermont</option>
    <option value="VA">Virginia</option>
    <option value="WV">West Virginia</option>
</select>

<style>
.clear {
    background-color: transparent;
    border: none;
    box-sizing: border-box;
    color: #666;
    cursor: pointer;
    display: none;
    font-size: 15px;
    font-weight: bold;
    height: 26px;
    outline: 0;
    position: absolute;
    top: 1px;
    right: 4px;
    width: 26px;
}

.clear:hover {
    color: #000;
}

.clearable {
    padding-right: 31px;
}

.clearable .clear {
    display: inline;
}
</style>

<script>
require(["select2/core", "select2/utils", "select2/selection/single",
         "select2/dropdown"], function (Select2, Utils, Selection, Dropdown) {
    function ClearSelection () { }

    ClearSelection.prototype.render = function (decorated) {
        var $selection = decorated.call(this);

        var $clear = $(
            '<button class="clear">&times;</button>'
        )

        $selection.append($clear);
        $selection.addClass("clearable");

        this.$clear = $clear;

        return $selection;
    };

    ClearSelection.prototype.bind = function (decorated, container, $container) {
        var self = this;

        decorated.call(this, container, $container);

        this.$container = $container;

        this.$clear.on("mousedown", function (evt) {
            evt.stopPropagation();

            var $first = $container.find("li").first();
            $first.mouseup();
        });
    };

    ClearSelection.prototype.update = function (decorated, data) {
        decorated.call(this, data);

        if (data.length == 0 || this.$container.find("li").length == 0) {
            this.$selection.removeClass("clearable");
            return;
        }

        var firstOption = this.$container.find("li").first().data("data");
        var firstData = data[0];

        if (firstOption.id == firstData.id) {
            this.$selection.removeClass("clearable");
        } else {
            this.$selection.addClass("clearable");
        }
    };

    function DropdownFooter () { }

    DropdownFooter.prototype.render = function (decorated) {
        var $dropdown = decorated.call(this);

        $dropdown.append('<div class="footer">My custom footer</div>');

        return $dropdown;
    }

    function DropdownHeader () { }

    DropdownHeader.prototype.render = function (decorated) {
        var $dropdown = decorated.call(this);

        $dropdown.prepend('<div class="header">Some custom header</div>');

        return $dropdown;
    }

    var CustomSelection = Utils.Decorate(Selection, ClearSelection)

    var CustomDropdown = Utils.Decorate(
        Utils.Decorate(Dropdown, DropdownHeader),
        DropdownFooter
    );

    var s2 = new Select2($("#source"), {
        selectionAdapter: CustomSelection,
        dropdownAdapter: CustomDropdown
    });
});
</script>

</body>
</html>