// Setup
(function() {

Foxmarks = window.Foxmarks || {}; 
Foxmarks.Widget = Foxmarks.Widget || {};
window["Foxmarks.Widget"] = Foxmarks.Widget;
Widget = Foxmarks.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) {
            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("<h2 class=\"widgettitle\">");
            html.push("<a href=\"" + bookmarks_url + "\" title=\"" + root["name"] + "\" target=\"_blank\">", root["name"], "</a>")
            html.push("</h2>");
            if((!widget.hide_description) && root["description"] && (root["description"] != '')) {
                html.push("<div>", root["description"], "</div>")
            }
        }
        html.push("<ul>");
        for (var n in nodes) {
            node = nodes[n];
            if (n >= widget.limit) { break; }
            html.push("<li>", "<a href=\"", node["url"], "\"", "target=\"_blank\"", "title=\"", node["name"].replace("\"", '&quot;'), "\"",  ">", widget.display_str(node["name"]), "</a>");

            if(node["description"]) {
                html.push("<br /><small>", node["description"].replace("\"", '&quot;'), "</small>")
            }

			html.push("</li>");
        }
        html.push("</ul>");


    } else {
        html.push("<p style=\"padding-bottom:2em;\">", "<i>", "Unable to load bookmarks.", "</i>", "</p>");
    }


    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 = "http://webstrane.info/wp-content/themes/galeksic/xmarks/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=Foxmarks.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);
}




})();
