/**
 * Convert a list of tags into tag cloud HTML markup
 */
(function($)
{
    /**
     *  Looks for a list of tags in the .data() store for the specified element
     */
    $.fn.tagCloud = function(options) {
        
        // Some defaults
        var defaults = {
            delimeter:      ";",
            max:            15,
            link:           "http://",
            css:            ["smallestTag","smallTag","mediumTag","largeTag","largestTag"],
            dataName:       "tags"
        };
        
        // User defined settings
        var settings = jQuery.extend({},defaults,options);
        
        return this.each(function() {
            if ($(this).data(settings.dataName) !== "undefined" ) {
                var html = $(this).data('tags').replace('\n','').replace(/;\s/gim,';');
                var tags = html.split(settings.delimeter);
                var sorted = sort(uniques(tags));
                
                // Sort out max and min values within the max parameter
                var max = sorted[0][1],min = sorted[sorted.length -1][1];
                if (typeof(sorted[settings.max]) !== "undefined") {
                    min = sorted[settings.max][1];
                }    
                var variance = Math.ceil((max-min)/(settings.css.length - 1));
                
                var output = "";
                var hyperlinks = [];

                // Construct hyperlinks
                for (var i=0;i<settings.max;i++) {
                    var tagName = sorted[i][0];
                    var tagSize = sorted[i][1];
                    var cssIndex = Math.ceil(tagSize/variance) - 1;
                    var className = settings.css[cssIndex];
                    hyperlinks.push([tagName,'<a href="' + settings.link + tagName + '" class="' + className + '">' + tagName + '</a> ']);
                }
                
                // Reorder output based on original keyword order
                var added = [];
                for (var key in tags) {
                    for (var j=0,l=hyperlinks.length;j<l;j++) {                    
                        if (hyperlinks[j][0] === tags[key] && typeof(added[j]) === "undefined") {
                            output += hyperlinks[j][1];
                            added[j] = 1;
                        }
                    }
                }
                
                // Output rendered tags
                $(this).html(output);
            }
        });
    };
    
    /**
     *  Find uniques and return associate array with a count
     */
    function uniques(array)
    {
        var uniques = {};
        for (var i=0,l=array.length;i<l;i++) {
            if (typeof(uniques[array[i]]) === "number") {
                uniques[array[i]] ++;
            } else if (array[i] !== "") {
                uniques[array[i]] = 1;
            }
        }
        return uniques;
    }

    /**
     *  Sort an associate array by value
     */
    function sort(object)
    {
        var tmp = [];
        for (var key in object) {
            tmp.push([key, object[key]]);
        }
        tmp.sort(function () {return arguments[0][1] < arguments[1][1]});
        return tmp;
    }
})(jQuery);

jQuery(document).ready(function() {
    jQuery('#tag-cloud').tagCloud({link: "http://www.minister.dbcde.gov.au/search?q="});
});

