tagCloud.js#

/** limits for different font-sizes */
var lim1;
var lim2;

var limit = 0;
var order;

/** 
* Retrieves tags from BibSonomy 

* param url: the url of the JSON feed
* param limit: tag limitation
* param order: order of the tags (tagname or tagcount)
*/
function getTags(url, lim, ord) {
        limit = lim;
        order = ord;

        var headID = document.getElementsByTagName("head")[0];         
        var newScript = document.createElement("script");
        newScript.type = "text/javascript";
        newScript.src = url + "?callback=jsonBibSonomyFeed";
        headID.appendChild(newScript);
}

/** 
* Handler function 
*/
function jsonBibSonomyFeed(feed) {
        var div = document.getElementById("tags");
        var ultag = document.getElementById("tagbox");
        var maxCount = -1000;
        var minCount = 1000;
        
        for(x=0; x < feed.items.length; x++){
                var tagCount = feed.items[x].count;
                if (tagCount < minCount)
                        minCount = tagCount;
                if (tagCount > maxCount)
                        maxCount = tagCount;                    
        }               
        var diff = maxCount - minCount;
        var part = diff / 3;    
        lim2 = maxCount - part;
        lim1 = lim2 - part;

        // remove old tags      
        var lilength = ultag.getElementsByTagName("LI").length;
        while (lilength > 0) {
                ultag.removeChild(ultag.firstChild);
                lilength = ultag.getElementsByTagName("LI").length;
        }

        // limitation
        if (limit == 0 || limit > feed.items.length)
                limit = feed.items.length;

        // sort to frequency and cut after limit
        feed.items = feed.items.sort(softFreq);
        feed.items = feed.items.slice(0,limit);         

        // sort 
        feed.items = feed.items.sort(comparator);
        
        // insert new tags
        var space = document.createTextNode(" ");
        for(var x=0; x < feed.items.length; x++){
                var tagname  = feed.items[x].label;
                var tagcount = feed.items[x].count;
                var clazz = getClazz(tagcount);
                
                var newli = document.createElement("LI");

                var newa = document.createElement("A");
                newa.href = "http://www.bibsonomy.org/tag/" + tagname;
                newa.innerHTML = tagname;
                newa.className = clazz;
                
                newli.appendChild(newa);
                newli.appendChild(space.cloneNode(true));
                ultag.appendChild(newli);
        }               
}

/**
* compartor function for array sort
**/
function comparator(x,y) {
        if (order == "frequency") {
                var count1 = x.count;   
                var count2 = y.count;   
                
                return count2 - count1; 
        } else {
                var name1 = x.label.toLowerCase();      
                var name2 = y.label.toLowerCase();
                
                return (name1 == name2) ? 0 : (name1 < name2) ? -1 : 1                  
        }
}

/**
* sorts array to frequency
**/
function softFreq(x,y) {
        var count1 = x.count;   
        var count2 = y.count;   
        
        return count2 - count1; 
}

/** 
* Computes the style class for a tag 
*/
function getClazz(count) {
        if (count > lim2)
                return "big";
        if (count < lim1)
                return "small";
        return "normal";
}