/*
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */

function saveEdits() {
    var components = {};
    $(".sw-editable").each(function (e) {
        components[$(this).data("component")] = tinymce.get($(this).attr("id")).getContent();
    });
    $(".sw-text-input").each(function (e) {
        components[$(this).data("component")] = $(this).val();
    });
    $(".sw-complex").each(function (e) {
        if (typeof $(this).data("json") === "string") {
            components[$(this).data("component")] = JSON.parse($(this).data("json"));
        } else {
            components[$(this).data("component")] = $(this).data("json");
        }
    });
    var output = {
        slug: page_slug,
        site: site_id,
        content: components
    };
    //console.log(output);
    var json = JSON.stringify(output);
    console.log(output);
    console.log("editor: sent page content");
    parent.postMessage('save ' + json, "*");
}

var filePickerCallback = null;

$(document).ready(function () {
    $('a').click(function (e) {
        e.preventDefault();
    });

    $("body").append("<link href=\"" + static_dir + "/css/editor.css\" rel=\"stylesheet\" />");

    $(".sw-editable").each(function () {
        // Remove leading whitespace added by the template
        $(this).html($(this).html().trim());
    });

    tinymce.init({
        selector: '.sw-editable',
        inline: true,
        plugins: [
            'autolink lists link image imagetools charmap',
            'searchreplace visualblocks code fullscreen',
            'media table contextmenu paste code'
        ],
        branding: false,
        elementpath: false,
        menubar: 'edit insert view format table tools',
        toolbar: 'insert | undo redo | formatselect | bold italic | bullist numlist outdent indent | removeformat | fullscreen',
        link_list: function (success) {
            success(pages_list);
        },
        file_picker_callback: function (callback, value, meta) {
            filePickerCallback = callback;
            parent.postMessage('browse ' + meta.filetype, "*");
        },
        image_dimensions: false,
        image_class_list: [
            {title: 'Autosizing', value: 'img-responsive img-fluid'}
        ],
        mobile: {
            theme: 'mobile'
        }
    });

    $(".sw-text").each(function () {
        var text = $(this).text().trim();
        var component = $(this).data("component");
        $(this).html("<input type=\"text\" data-component=\"" + component + "\" class=\"sw-text-input\" value=\"" + text + "\" placeholder=\"Click to edit\">");
    });

    $(".sw-complex").each(function () {
        var eid = $(this).attr("id");
        var eclass = $(this).attr("class");
        var estyle = $(this).attr("style");
        var ecomp = $(this).data("component");
        var ejson = $(this).data("json");
        if (typeof ejson !== "string") {
            ejson = JSON.stringify(ejson);
        }
        $(this).replaceWith(
                $('<div>', {
                    id: eid,
                    class: eclass,
                    style: estyle,
                    html: $(this).html(),
                    "data-component": ecomp,
                    "data-json": ejson
                }));
        $("[data-component=\"" + ecomp + "\"]").append("<div class=\"sw-editbtn\">Click to edit</div>");
    });

    $(".sw-editbtn").on("click", function () {
        var data = $(this).parent().data("json");
        var send = {"component": $(this).parent().data("component"), "content": data};
        //console.log(send);
        parent.postMessage('editcomplex ' + JSON.stringify(send), "*");
        return false;
    });

    window.addEventListener('message', function (event) {
        console.log("editor: received message: " + event.data);
        if (event.data == "save") {
            saveEdits();
        } else if (event.data.startsWith("complex ")) {
            var json = JSON.parse(event.data.slice(8));
            var comp = json["component"];
            var data = json["content"];
            $(".sw-complex[data-component='" + comp + "']").data("json", JSON.stringify(data));
        } else if (event.data.startsWith("picked ")) {
            var json = JSON.parse(event.data.slice(7));
            console.log(json);
            filePickerCallback(json.path, json.meta);
        }
    });
});