/*
 * Copyright (C) 2013, 2015 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

WI.ScopeBarItem = class ScopeBarItem extends WI.Object
{
    constructor(id, label, {className, exclusive, independent, hidden} = {})
    {
        super();

        this._element = document.createElement("li");
        this._element.classList.toggle("exclusive", !!exclusive);
        if (className)
            this._element.classList.add(className);
        this._element.textContent = label;
        this._element.addEventListener("mousedown", this._handleMouseDown.bind(this));

        this._id = id;
        this._label = label;
        this._exclusive = !!exclusive;
        this._independent = !!independent;
        this._hidden = !!hidden;

        this._selectedSetting = new WI.Setting("scopebaritem-" + id, false);

        this._element.classList.toggle("selected", this._selectedSetting.value);
        this._element.classList.toggle("hidden", this._hidden);
    }

    // Public

    get element()
    {
        return this._element;
    }

    get id()
    {
        return this._id;
    }

    get label()
    {
        return this._label;
    }

    get exclusive()
    {
        return this._exclusive;
    }

    get selected()
    {
        return this._selectedSetting.value;
    }

    set selected(selected)
    {
        if (this._selectedSetting.value === selected)
            return;

        this._element.classList.toggle("selected", selected);
        this._selectedSetting.value = selected;

        this.dispatchEventToListeners(WI.ScopeBarItem.Event.SelectionChanged, {
            extendSelection: this._independent || (WI.modifierKeys.metaKey && !WI.modifierKeys.ctrlKey && !WI.modifierKeys.altKey && !WI.modifierKeys.shiftKey),
        });
    }

    get hidden()
    {
        return this._hidden;
    }

    set hidden(flag)
    {
        if (this._hidden === flag)
            return;

        this._hidden = flag;

        this._element.classList.toggle("hidden", flag);

        this.dispatchEventToListeners(WI.ScopeBarItem.Event.HiddenChanged);
    }

    // Private

    _handleMouseDown(event)
    {
        // Only handle left mouse clicks.
        if (event.button !== 0)
            return;

        this.selected = !this.selected;
    }
};

WI.ScopeBarItem.Event = {
    SelectionChanged: "scope-bar-item-selection-changed",
    HiddenChanged: "scope-bar-item-hidden-changed",
};
