
String.prototype.startsWith = function(str) {
    str = str.toLowerCase();
    return (this.toLowerCase().match("^"+str)==str);
}

function unassignTag(e) {
    tag = e.target.rel;

    if (window.XMLHttpRequest)
            xmlhttp = new XMLHttpRequest();
    else if (window.ActiveXObject)
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

    xmlhttp.onreadystatechange = function() {
        if(xmlhttp.readyState == 4) {
            tm = document.getElementById("assigned-tags");
            tm.removeChild(e.target);
            link = document.getElementById("tag-"+tag);
            tm.removeChild(link);

            if (tm.getElementsByTagName('a').length <= 1)
                document.getElementById('no-tags').setAttribute('style', '');
        }
    }

    xmlhttp.open("POST", "/EditTags/unassign", true);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

    xmlhttp.send("tag="+tag+"&type="+INFO.type+"&id="+INFO.id);
}

function assignTags(e) {
    newtags = "";
    newtagsa = new Array();

    taglist = document.getElementById("tag-list");

    for(i = 0; i < taglist.options.length; i++) {
        if (taglist.options[i].selected) {
            obj = new Object();
            
            obj.value = taglist.options[i].value;

            if (document.getElementById("tag-"+obj.value))
                continue;

            obj.name = taglist.options[i].text;
            obj.normalizedName = taglist.options[i].getAttribute('rel');
            taglist.options[i].selected = false;

            newtagsa.push(obj);
        }
    }

    for (i = 0; i < newtagsa.length; i++) {
        if (newtags.length != 0)
            newtags += "&";
        newtags += "tag=" + newtagsa[i].value;
    }

    if (newtags.length == 0)
        return;

    if (window.XMLHttpRequest)
        xmlhttp = new XMLHttpRequest();
    else if (window.ActiveXObject)
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

    xmlhttp.onreadystatechange = function() {
        if(xmlhttp.readyState == 4) {
            tm = document.getElementById("assigned-tags");
            
            for (i = 0; i < newtagsa.length; i++) {
                tm.appendChild(document.createTextNode(" "));
                
                aelem = document.createElement("a");

                aelem.id = "tag-"+newtagsa[i].value;
                aelem.innerHTML = newtagsa[i].name;
                aelem.href = "/tags/"+newtagsa[i].normalizedName;
                aelem.setAttribute('class', 'tag');

                tm.appendChild(aelem);

                aelem = document.createElement("a");
                
                aelem.setAttribute("rel", newtagsa[i].value);
                aelem.setAttribute("style", "color:red;text-decoration:none");
                aelem.innerHTML = "[&times;]";
		addEvent(aelem, "click", unassignTag);
                aelem.href = "javascript:";

                tm.appendChild(aelem);
            }

            document.getElementById('no-tags').setAttribute('style', 'display:none');
        }
    }

    xmlhttp.open("POST", "/EditTags/assign", true);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

    xmlhttp.send(newtags+"&type="+INFO.type+"&id="+INFO.id);
}

function createTag(e) {
    tn = document.getElementById("tag-name");
    if (tn.value.length == "")
        return;
    tnvalue = tn.value;

    if (window.XMLHttpRequest)
        xmlhttp = new XMLHttpRequest();
    else if (window.ActiveXObject)
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

    xmlhttp.onreadystatechange = function() {
        if(xmlhttp.readyState == 4) {
            if (xmlhttp.responseText.length == 0)
                alert("Error");
            else {
                p = xmlhttp.responseText.indexOf('|');
                id = xmlhttp.responseText.substring(0, p);
                norm = xmlhttp.responseText.substring(p+1);

                list = document.getElementById("tag-list");

                opt = document.createElement("option");
                opt.value = id;
                opt.setAttribute("rel", norm);
                opt.text = tnvalue;

                try {
                    list.add(opt, null);
                } catch (e) {
                    list.add(opt);
                }

                opt.selected = "selected";
                tn.value = '';
            }
        }
    }

    xmlhttp.open("POST", "/EditTags/"+INFO.rid+"/create", true);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

    xmlhttp.send("tag="+urlencode(tn.value));
}

function urlencode(str) {
    //return escape(str).replace('+', '%2B').replace('%20', '+').replace('*', '%2A').replace('/', '%2F').replace('@', '%40');
    return str;
}

function tagFilterChange(e) {
    taglist = document.getElementById("tag-list");
    val = document.getElementById("tag-filter").value;

    for(i = 0; i < taglist.options.length; i++) {
        if (taglist.options[i].text.startsWith(val)) {
            taglist.options[i].setAttribute("class", "");
        } else {
            taglist.options[i].setAttribute("class", "tag-hidden");
            taglist.options[i].selected = false;
        }
    }
}

function addTagHandlers(e) {
    tm = document.getElementById("assigned-tags");
    tags = tm.getElementsByTagName("a");

    for (i=0;i<tags.length;i++) {
        if (tags[i].getAttribute("rel"))
            addEvent(tags[i], "click", unassignTag);
    }

    btn = document.getElementById("tag-assign");
    addEvent(btn, "click", assignTags);

    btn = document.getElementById("tag-create");
    addEvent(btn, "click", createTag);

    btn = document.getElementById("tag-list");
    if (btn)
        addEvent(btn, "dblclick", assignTags);

    field = document.getElementById("tag-filter");
    addEvent(field, "keyup", tagFilterChange);
}

function toggleTagAdmin() {
    div = document.getElementById("tag-admin");
    
    if (!div.getAttribute("style")) {
        div.setAttribute("style", "display: block");
    } else
        div.setAttribute("style", "");
}

addEvent(window, "load", addTagHandlers);
