/*******************************************************************************
 * 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"
        },
        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)
        },
        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)
        },
        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)
        },
        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>');
        }
    });
}