// Copyright (c) 2000-2017 Ericsson Telecom AB                                                       //
// All rights reserved. This program and the accompanying materials are made available under the     //
// terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at //
// http://www.eclipse.org/legal/epl-v10.html                                                         //
///////////////////////////////////////////////////////////////////////////////////////////////////////
function CView_BasicButton(p_viewmodels, p_mainId, p_parentId, p_data) {
    "use strict";

    /** constructor */

    var v_viewmodel = ViewUtils.getViewmodelsFromExpectedInterface(p_viewmodels, CView_BasicButton)[0];
    var v_conditionViewmodel = ViewUtils.getViewmodelsFromExpectedInterface(p_viewmodels, CView_BasicButton)[1];
    var v_mainId = p_mainId;
    var v_parentId = p_parentId;
    var v_customData = p_data;

    var v_label;
    var v_value = -1;

    var v_this = this;

    /** public functions */

    this.applicationCreated = function() {
        if (v_viewmodel != undefined) {
            $("#" + v_parentId).append(getHtml());
            if (v_customData.isElementLabelPresent) {
                v_label = ViewUtils.addLabel(v_mainId, v_customData.elementText);
            }
            if (v_customData.class != undefined) {
                $("#" + v_mainId).addClass(v_customData.class);
            } else {
                $("#" + v_mainId).addClass("BasicButton");
            }
            setupCallbacks();
            ViewUtils.addTooltip(v_mainId, v_customData);
        }
    };

    this.refresh = function(p_fullRefresh) {
        if (v_viewmodel != undefined) {
            if (ViewUtils.checkVisibility(v_conditionViewmodel, v_mainId)) {
                var dataObj = v_viewmodel.getListWithElementInfo();
                if (dataObj == undefined || dataObj.values[0] == undefined) {
                    return;
                }

                v_value = parseInt(dataObj.values[0].val) == NaN ? v_value : parseInt(dataObj.values[0].val);

                if (v_customData.isElementLabelPresent && v_customData.elementText == undefined) {
                    v_label.text(dataObj.values[0].element);
                }

                if (v_customData.text == undefined && v_customData.showLabel !== false) {
                    $("#" + v_mainId + " > button > span > label").text(dataObj.values[0].element);
                }

                if (v_customData.disabled !== true && dataObj.values[0] != undefined && dataObj.values[0].isWritable) {
                    $("#" + v_mainId + " > button").prop('disabled', false);
                } else {
                    $("#" + v_mainId + " > button").prop('disabled', true);
                }
            }
        }
    };

    /** protected functions */

    this.onClick = function() {
        v_viewmodel.setValue(0, ((v_customData.incrementValue) ? v_value + 1 : v_value));
    };

    this.onMiddleClick = function() {};

    /** private functions */

    function getHtml() {
        var html = '<div id="' + v_mainId + '"><button><span>';
        var img = '';
        var label = '';

        if (v_customData.img != undefined) {
            img += '<img ';
            img += 'src="' + v_customData.img + '" ';
            img += '>';
        }

        if (v_customData.showLabel !== false) {
            label += '<label>';
            if (v_customData.text != undefined) {
                label += v_customData.text;
            }
            label += '</label>';
        }

        if (v_customData.imagePosition == "right") {
            html += label;
            html += img;
        } else {
            html += img;
            html += label;
        }

        html += '</span></button></div>';
        return html;
    }

    function setupCallbacks() {
        $("#" + v_mainId + " > button").click(v_this.onClick).mouseup(v_this.onMiddleClick);
    }
}

CView_BasicButton.getHelp = function() {
    return "A simple button view that can contain a text and an image.";
};

CView_BasicButton.expectsInterface = function() {
    return [
        {
            "mandatory": ["setValue", "getListWithElementInfo"]
        },
        {
            "optional": ["getState"]
        }
    ];
};

CView_BasicButton.getCustomDataSchema = function() {
    var schema = {
        "$schema": "http://json-schema.org/draft-04/schema#",
        "title": "Custom data for CView_BasicButton",
        "type": "object",
        "properties": {
            "text": {
                "description": "The button text (if it is undefined, the request element will be used)",
                "type": "string"
            },
            "showLabel": {
                "description": "Whether the text is visible on the button (default true)",
                "type": "boolean",
                "format": "checkbox",
                "default": false
            },
            "img": {
                "description": "The button image",
                "type": "string",
                "default": "CustomizableContent/CustomizableApp/res/start.png"
            },
            "imagePosition": {
                "description": "The position of the image relative to the text (default left)",
                "type": "string",
                "enum": ["left", "right"],
                "default": "right"
            },
            "incrementValue": {
                "description": "Increment the value of the connected data element (default false)",
                "type": "boolean",
                "format": "checkbox",
                "default": true
            },
            "class": {
                "description": "The css class of the button",
                "type": "string",
                "default": "BasicButton"
            }
        },
        "additionalProperties": false
    };
    $.extend(true, schema, ViewUtils.commonViewSchema, ViewUtils.commonElementSchema);
    return schema;
};

//# sourceURL=WebApplicationFramework\Views\View_BasicButton.js