// 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_StatusLED(p_viewmodels, p_mainId, p_parentId, p_data) {
    "use strict";
    /** constructor */
    
    var v_viewmodel = ViewUtils.getViewmodelsFromExpectedInterface(p_viewmodels, CView_StatusLED)[0];
    var v_conditionViewmodel = ViewUtils.getViewmodelsFromExpectedInterface(p_viewmodels, CView_StatusLED)[1];
    var v_mainId = p_mainId;
    var v_parentId = p_parentId;
    var v_customData = p_data;
    
    var v_label;
    var v_led = "";
    
    var v_this = this;
        
    this.applicationCreated = function() {
        $("#" + v_parentId).append(getHtml());
        if (v_customData.isElementLabelPresent) {
            v_label = ViewUtils.addLabel(v_mainId, v_customData.elementText);
        }
        $("#" + v_mainId).addClass("StatusLED");
    };
        
    this.refresh = function(p_fullRefresh) {
        if (v_viewmodel != undefined && ViewUtils.checkVisibility(v_conditionViewmodel, v_mainId)) {
            var dataObject = v_viewmodel.getListWithElementInfo();
            if (dataObject == undefined || dataObject.values[0] == undefined) {
                return;
            }
            
            if (p_fullRefresh && v_customData.isElementLabelPresent && v_customData.elementText == undefined) {
                v_label.text(dataObject.values[0].element);
            }
            
            var text = "";
            var str = dataObject.values[0].val;
            
            if (str == undefined) {
                $("#" + v_mainId + " > span").css("display", "none");
                $("#" + v_mainId).addClass("NoData");
            } else {
                $("#" + v_mainId + " > span").css("display", "");
                $("#" + v_mainId).removeClass("NoData");
            }
            
            if (str != undefined && str.substring != undefined && str.indexOf != undefined) {
                var strpos = str.indexOf("]"); 
                text = str.substring(strpos+1);
                var color = str.substring(str.indexOf(":")+1, strpos);
                if (v_led != color) {
                    v_led = color;
                    $("#" + v_mainId + " img").attr("src", getImg(v_led));
                }
            }
            
            if (v_customData.isLabelPresent !== false) {
                $("#" + v_mainId + "_label").text(v_customData.labelText == undefined ? text : v_customData.labelText);
            }
            
            ViewUtils.addTooltip(v_mainId, v_customData);
        }
    };

    function getHtml() {
        var html = '<div id="' + v_mainId + '"><span>';
        var img = '<img src="">';
        var label = '';
        
        if (v_customData.isLabelPresent !== false) {
            label += '<label id="' + v_mainId + '_label">';
            if (v_customData.labelText != undefined) {
                label += v_customData.labelText;
            }
            label += '</label>';
        }
        
        if (v_customData.alignment == "right") {
            html += label;
            html += img;
        } else {
            html += img;
            html += label;
        }
        
        html += '</span></div>';
        return html;
    }
    
    function getImg(ledColor) {
        var img = "";
        switch (ledColor) {
            case "blue":
                img = "WebApplicationFramework/Res/blueLED.png";
                break;
            case "black":
                img = "WebApplicationFramework/Res/blackLED.png";
                break;
            case "yellow":
                img = "WebApplicationFramework/Res/yellowLED.png";
                break;
            case "green":
                img = "WebApplicationFramework/Res/greenLED.png";
                break;
            case "red":
                img = "WebApplicationFramework/Res/redLED.png";
                break;
            case "spinning":
                img = "WebApplicationFramework/Res/waiting.gif";
                break;
        }
        return img;
    }
}

CView_StatusLED.getHelp = function() {
    return "Visual element for status LEDs";
};

CView_StatusLED.expectsInterface = function() {
    return [
        {
            "mandatory": ["getListWithElementInfo"]
        },
        {
            "optional": ["getState"]
        }
    ];
};

CView_StatusLED.getCustomDataSchema = function() {
    var schema = {
        "$schema": "http://json-schema.org/draft-04/schema#",
        "title": "Custom data for CView_StatusLED",
        "type": "object",
        "properties": {
            "isLabelPresent": {
                "type": "boolean",
                "format": "checkbox",
                "default": false,
                "description": "show status led as text (default true)"
            },
            "labelText": {
                "type": "string",
                "description": "show this text istead of the status led text"
            },
            "alignment": {
                "type": "string",
                "enum": ["left", "right"],
                "default": "right",
                "description": "the position of the image relative to the label (default left)"
            }
        },
        "additionalProperties": false
    };
    $.extend(true, schema, ViewUtils.commonViewSchema, ViewUtils.commonElementSchema);
    return schema;
};
//# sourceURL=WebApplicationFramework\Views\View_StatusLED.js
