// Setup
(function() {

Xmarks = window.Xmarks || {}; 
Foxmarks = Xmarks;
Xmarks.Widget = Xmarks.Widget || {};
window["Xmarks.Widget"] = Xmarks.Widget;
Widget = Xmarks.Widget;
Widget.widgets = Widget.widgets || [];


// Class (static) methods

Widget.create = function(args) {
    obj = new Widget.widget(args);
    Widget.widgets.push(obj);
    obj.add_default_css();
    obj.add_script();
    obj.add_style(obj.css);
}


Widget.find = function(share_id) {
    for(var n in Widget.widgets) {
        widget = Widget.widgets[n];
        if (widget.share_id == share_id) {
            return widget;
        }
    }
    return null;
}

Widget.render = function(data) {
    var html = [];
    var nodes = [];
    var widget = Widget.find(data["share_id"]);
    if (widget == null) { return; }
    var div = widget.get_div();
    if (div == null) { return; }
    if (data["status"] == 0) {
        var node_hash = data["data"]["nodes"];
        var username = data["data"]["username"];
        var root = null;
        var bookmarks_url = widget.base_url + "folder/bookmarks/" + widget.share_id

        // Build tree from flat hash
        for (var n in node_hash) {
            if (node_hash.hasOwnProperty(n)) {
                node = node_hash[n];
                node.children = node.children || [];
                if(node["pnid"]) {
                    var parent = node_hash[node["pnid"]];
                    if(parent) {
                        root = parent;
                        node.parent = parent;
                        parent.children = parent.children || [];
                        parent.children.push(node);
                    }            
                }
            }
        }
        while(root.parent) {
            root = root.parent;
        }
        traverse = function(folder) {
            if(folder == null) { return; }
            folder.children = folder.children.sort(function(a, b) {return a["position"] - b["position"];});
            for (var node in folder.children) {
                node = folder.children[node];
                switch(node["ntype"]) {
                case "bookmark":
                    nodes.push(node);
                    break;
                case "folder":
                    traverse(node);
                    break;
                }
            }
        }
        traverse(root);
        if (root) {
            html.push("<div class=\"top\" onclick=\"window.location.href='" + bookmarks_url + "';\">");
            html.push("<span class=\"title\">", root["name"], "</span>")
            if((!widget.hide_description) && root["description"] && (root["description"] != '')) {
                html.push("<br />", root["description"])
            }
            html.push("</div>");
        }
        html.push("<ul>");
        for (var n in nodes) {
            node = nodes[n];
            if (n >= widget.limit) { break; }
            html.push("<li>", "<a href=\"", node["url"], "\"", "title=\"", (node["description"] || node["name"]).replace("\"", '&quot;'), "\"",  ">", widget.display_str(node["name"]), "</a>", "</li>");
        }
        html.push("</ul>");
        if(root && nodes && (nodes.length > 0)) {
            html.push("<div class=\"seeall\">");
            html.push( "&raquo; ", "<a href=\"" + bookmarks_url + "\">", "See all links", "</a>");
            html.push("</div>");
        }
    } else {
        html.push("<p style=\"padding-bottom:2em;\">", "<i>", "Unable to load bookmarks.", "</i>", "</p>");
    }
    html.push("<div class=\"bottom\">")
    html.push("Shared by ", username, ". ")
    html.push(div.innerHTML, "</div>");
    div.innerHTML = html.join("");
}


// Constructor

Widget.widget = function(args) {
    this.base_url = args["base"] || "http://share.foxmarks.com/";
    this.share_id = args["id"];
    this.version = args["v"];
    this.hide_description = args["hide_description"] || false;
    this.limit = args["limit"] || 20;
    this.css = args["css"] || '';
    this.max_str_len = args["truncate"] || 25;
    this.display_str = Widget.display_str;
    this.get_div = Widget.get_div;  
    this.add_default_css = Widget.add_default_css;
    this.add_style = Widget.add_style;
    this.add_script = Widget.add_script;
    return true;
}

// Object methods

Widget.display_str = function(str) {
    if (str.length < this.max_str_len) { return str; }
    return (str.substring(0, this.max_str_len) + "...")
}

Widget.get_div = function() {
    return document.getElementById(this.share_id);
}


Widget.add_style = function(css) {
    var head, style;
    if (css == '') { return; }
    head = document.getElementsByTagName("head")[0];
    if (!head) { return; }
    style = document.createElement("style");
    style.type = "text/css";
    style.innerHTML = css;
    head.appendChild(style);
}


Widget.add_default_css = function() {
    if (Widget.default_css_set) { return; }
    var head, style;
    head = document.getElementsByTagName("head")[0];
    if (!head) { return; }
    link = document.createElement("link");
    link.type = "text/css";
    link.rel = "stylesheet";
    link.href = this.base_url + "widget.css";
    head.appendChild(link);
    Widget.default_css_set = true;
}


Widget.add_script = function() {
    var head, script;
    script_url = this.base_url + "folder/json/" + this.version + "/" + this.share_id + "?callback=Xmarks.Widget.render";
    head = document.getElementsByTagName("head")[0];
    if (!head) { return; }
    script = document.createElement("script");
    script.type = "text/javascript";
    script.src = script_url;
    head.appendChild(script);
}




})();
