/*******************************************************************************
 * Copyright (c) 2013-2020 LAAS-CNRS (www.laas.fr)
 * 7 Colonel Roche 31077 Toulouse - France
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * Initial Contributors:
 *     Thierry Monteil : Project manager, technical co-manager
 *     Mahdi Ben Alaya : Technical co-manager
 *     Samir Medjiah : Technical co-manager
 *     Khalil Drira : Strategy expert
 *     Guillaume Garzone : Developer
 *     François Aïssaoui : Developer
 *
 * New contributors :
 *******************************************************************************/
/**
 * Authors:
 * Mahdi Ben Alaya <ben.alaya@laas.fr> <benalaya.mahdi@gmail.com>
 * Marouane El kiasse <melkiasse@laas.fr> <kiasmarouane@gmail.com>
 * Yassine Banouar <ybanouar@laas.fr> <yassine.banouar@gmail.com>
 */
var cseBase = getUrlVar("cseId");
var context = getUrlVar("context");
$(document).ready(function() {
    $("#main").hide();
    $("input#username").focus();
});

var username;
var password;
var parser = new DOMParser();

function make_base_auth(user, password) {
    var tok = user + ':' + password;
    return tok;
}

function login() {
    username = $("input#username").val();
    password = $("input#password").val();
    get("/" + cseBase);
}

function logout() {
    username = "";
    password = "";
    $("input#username").val("")
    $("input#password").val("")
    $("#attributes").html("");
    $('#content').html("");
    $('#response').html("");
    $("#login").show();
    $("#main").hide();
}

function get(targetId) {
    $.ajax({
        type: "GET",
        beforeSend: function() {},
        dataType: "xml",
        url: context + targetId + "?rcn=5&lvl=1",
        headers: {
            "X-M2M-Origin": make_base_auth(username, password),
            "Accept": "application/xml",
            "X-M2M-RI": "OM2M-webpage-xml"
        },
        success: function(response) {
            $("#login").hide();
            $("#main").show();
            $("#url").text(window.location.protocol + "//" + window.location.host + context + targetId);
            $("#" + encodeId(targetId)).html("");
            $("#attributes").html("");
            $('#content').html('');
            $('#response').html('');
            $("#error").html('');

            // Get the main resource
            var resource = response.firstChild;
            // Get child elements
            var children = $(response.firstChild).children();

            // In the case of CSEBase, add the resource at the root element
            if (resource.localName == "cb") {
                $("#resources").html("<li onclick=get('" + targetId + "')>" + $(resource).attr('rn') + "<ul id=" + encodeId(targetId) + "></ul></li>");
            }

            // For each child element
            for (var i = 0; i < children.length; i++) {
                attribute = children[i];

                if (attribute.localName == "ch") {
                    // If it is a child resource (ch) add it to the resource tree
                    $("#" + encodeId(targetId)).append("<li onclick=get('" + attribute.textContent + "')>" + $(attribute).attr('nm') + "<ul id=" + encodeId(attribute.textContent) + "></ul></li>");
                } else {
                    // Handle other attributes
                    var value;
                    if (attribute.localName == "pv" || attribute.localName == "pvs") {
                        // Handle the case of ACP rules
                        var table = '<table class="bordered"><thead><th>AccessControlOriginator</th><th>AccessControlOperation</th></thead>' +
                            '<tbody>';
                        var acrs = $(attribute).children('acr');
                        for (var j = 0; j < acrs.length; j++) {
                            var acor = '<table class="bordered"><tbody>';
                            var acors = $(acrs[j]).children('acor')[0].firstChild.textContent.split(" ");
                            for (var k = 0; k < acors.length; k++) {
                                acor += "<tr><td>" + acors[k] + "</td></tr>";
                            }
                            acor += "</tbody></table>";
                            table += '<tr><td>' + acor + '</td><td>' + $(acrs[j]).children('acop')[0].firstChild.textContent + '</td></tr>';
                        }
                        table += '</tbody></table>';
                        value = table;
                    } else if (attribute.localName == "poa") {
                        // Handle point of access list
                        var table = '<table class="bordered"><thead><th>Point Of Access</th></thead><tbody>';
                        var poas = attribute.textContent.split(" ");
                        for (var index in poas) {
                            table += '<tr><td>' + poas[index] + '</td></tr>'
                        }
                        table += "</tbody></table>";
                        value = table;
                    } else if (resource.localName == "csr" && attribute.localName == "csi") {
                        // Add a button in case of remoteCSE link
                        value = '<button type="button" onClick="get(\'' + attribute.textContent + '\')">' + attribute.textContent + '</button>';
                    } else if (attribute.localName == "acpi") {
                        // Handle the list of acp ids
                        var table = "<table class='bordered'><thead><th>AccessControlPolicyIDs</th></thdead><tbody>";
                        var acpiList = attribute.textContent.split(" ");
                        for (var index in acpiList) {
                            table += "<tr><td>" + acpiList[index] + "</td></tr>";
                        }
                        table += "</tbody></table>";
                        value = table;
                    } else if (attribute.localName == "daci") {
                        // Handle the list of acp ids
                        var table = "<table class='bordered'><thead><th>DynamicAuthorizationConsultationIDs</th></thdead><tbody>";
                        var daciList = attribute.textContent.split(" ");
                        for (var index in daciList) {
                            table += "<tr><td>" + daciList[index] + "</td></tr>";
                        }
                        table += "</tbody></table>";
                        value = table;
                    } else if (attribute.localName =="ldv"){
                        var table = "<table class='bordered'><thead><th>ListOfDevices</th></thdead><tbody>";
                        var devices = attribute.textContent.split(" ");
                        for(var index in devices){
                            table += "<tr><td>" + devices[index] + "</td></tr>";
                        }
                        table += "</tbody></table>";
                        value = table;
                    } else {
                        // Default case
                        value = attribute.textContent;
                    }

                    if (attribute.localName == "con") {
                        display(attribute);
                    } else {
                        $("#attributes").append("<tr><td class=" + attribute.localName + ">" + attribute.localName + "</td><td>" + value + "</td></tr>");
                    }
                }

            }
            $("li").click(function(e) {
                e.stopPropagation();
            });
        },
        error: function(xhr, status, error) {
            $("#error").html(xhr.status + ' ' + status + ' ' + error);
        }
    });
}

function encodeId(id) {
    return id.replace(/[\n\s]/g, '').replace(/[\/]/gi, "_");
}

function clean(text) {
    return text.replace(/[\n\s]/g, '');
}

function display(content) {

    $("#attributes").append("<tr><td class=" + content.localName + ">" + content.localName + "</td><td id='cont'></td></tr>");
    var obix = content.textContent;
    var rep = parser.parseFromString(obix, 'text/xml');
    if (rep.firstChild.tagName != 'obj') {
        $('#cont').append(content);
        return;
    }

    $('#cont').append("<table class='bordered' id='contentTable'><thead><tr><th>Attribute</th><th>Value</th></tr></thead></table>");

    if (rep.firstChild.tagName != "obj") {
        $('#contentTable').append('<tr><td>' + $(rep.firstChild).attr('name') + '</td><td>' + $(rep.firstChild).attr('val') + '</td></tr>');
    }

    var childrens = $(rep.firstChild).children();

    for (var t = 0; t < childrens.length; t++) {
        if (childrens[t].tagName == "op") {
            if ($(childrens[t]).attr('is') == "retrieve") {
                $('#contentTable').append("<tr><td><input type='button' onclick=retrieve('" + $(childrens[t]).attr('href') + "') value='" + $(childrens[t]).attr('name') + "' ></td><td>" + $(childrens[t]).attr('href') + "</td></tr>");
            } else if ($(childrens[t]).attr('is') == "execute") {
                $('#contentTable').append("<tr><td><input type='button' onclick=execute('" + $(childrens[t]).attr('href') + "') value='" + $(childrens[t]).attr('name') + "' ></td><td>" + $(childrens[t]).attr('href') + "</td></tr>");
            } else if ($(childrens[t]).attr('is') == "create") {
                var objs = childrens;
                for (var j = 0; j < objs.length; j++) {
                    if (objs[j].tagName == "obj") {
                        if ($(objs[j]).attr('href') == $(childrens[t]).attr('in')) {
                            var serializer = new XMLSerializer();
                            content = serializer.serializeToString(objs[j]);
                            $('#contentTable').append("<tr><td><input type='button' onclick=create('" + $(childrens[t]).attr('href') + "','" + btoa(content) + "') value='" + $(childrens[t]).attr('name') + "' ></td><td>" + $(childrens[t]).attr('href') + "</td></tr>");
                            break;
                        }
                    }
                }
            }
        } else if (childrens[t].tagName != "obj") {
            $('#contentTable').append('<tr><td>' + $(childrens[t]).attr('name') + '</td><td>' + $(childrens[t]).attr('val') + '</td></tr>');
        }
    }
}

function getUrlVar(key) {
    var result = new RegExp(key + "=([^&]*)", "i").exec(window.location.search);
    return result && unescape(result[1]) || "";
}

function execute(url) {
    $('#response').html('');
    $.ajax({
        type: 'POST',
        url: context + url,
        headers: {
            "X-M2M-Origin": make_base_auth(username, password),
            "X-M2M-RI": "OM2M-webpage-xml"
        },
        beforeSend: function() {},
        timeout: 20000,
        error: function(xhr, status, error) {
            if (xhr.status == 204) successCallback(null, error, xhr);
            else $('#response').append('<h4>Post request failed: ' + xhr.status + ' ' + error + '</h4>');
        },
        dataType: 'xml',
        success: function(response) {
            $('#response').append('<h4>Successful POST request.</h4>');
            if(response != null){
                var content = response.firstChild;
                $('#response').append('<table class="bordered" id="contentTable1" ><thead><tr><th >Name</th><th >Value</th></thead></table>');
                if (content.firstChild.localName == "obj") {
                    $(content).find('obj').children().each(function() {
                        $('#contentTable1').append('<tr"><td>' + $(this).attr('name') + '</td><td>' + $(this).attr('val') + '</td></tr>');
                    });
                } else {
                    $(content).children().each(function() {
                        $('#contentTable1').append('<tr"><td>' + $(this).attr('name') + '</td><td>' + $(this).attr('val') + '</td></tr>');
                    });
                }
            }
        }
    });
}

function retrieve(url) {
    $('#response').html('');
    $.ajax({
        type: 'GET',
        url: context + url,
        headers: {
            "X-M2M-Origin": make_base_auth(username, password),
            "X-M2M-RI": "OM2M-webpage-xml"
        },
        beforeSend: function() {},
        timeout: 20000,
        error: function(xhr, status, error) {
            $('#response').append('<h4>GET request failed: ' + xhr.status + ' ' + error + '</h4>');
        }, // alert a message in case of error
        dataType: 'xml',
        success: function(response) {
            if (response.firstChild.localName == "cin") {
                var content = $(response.firstChild).children("con")[0];
                var obix = content.textContent;
                content = parser.parseFromString(obix, 'text/xml');

                $('#response').append('<h4>Successful GET Request:</h4>');
                $('#response').append('<table class="bordered" id="contentTable1" ><thead><tr><th >Name</th><th >Value</th></thead></table>');
                if (content.firstChild.localName == "obj") {
                    $(content).find('obj').children().each(function() {
                        $('#contentTable1').append('<tr"><td>' + $(this).attr('name') + '</td><td>' + $(this).attr('val') + '</td></tr>');
                    });
                } else {
                    $(content).children().each(function() {
                        $('#contentTable1').append('<tr"><td>' + $(this).attr('name') + '</td><td>' + $(this).attr('val') + '</td></tr>');
                    });
                }
            }
        }
    });
}

function create(url, content) {
    $('#response').html('');
    $.ajax({
        type: 'POST',
        url: context + '/' + url,
        headers: {
            "X-M2M-Origin": make_base_auth(username, password),
            "X-M2M-RI": "OM2M-webpage-xml"
        },
        beforeSend: function() {},
        timeout: 20000,
        data: atob(content),
        error: function(xhr, status, error) {
            if (xhr.status == 204) successCallback(null, error, xhr);
            else $('#response').append('<h4>Post request failed: ' + xhr.status + ' ' + error + '</h4>');
        },
        dataType: 'xml',
        success: function(response) {
            $('#response').append('<h4>Successful POST request.</h4>');
        }
    });
}