//var tagList = [
//	{ tag: "lorem", count: 40, lastRef: "2010-01-05 12:47:24", link: "http://blahblah.bla" },
//	{ tag: "ipsum", count: 215, lastRef: "2010-01-04 07:23:20", link: "http://blahblah.bla"  },
//	{ tag: "dolor", count: 97, lastRef: "2010-02-01 18:01:43", link: "http://blahblah.bla"  },
//	{ tag: "sit", count: 303, lastRef: "2010-01-21 17:31:11", link: "http://blahblah.bla"  },
//	{ tag: "consectetur", count: 412, lastRef: "2010-01-05 13:07:54", link: "http://blahblah.bla"  },
//	{ tag: "adipisicing", count: 156, lastRef: "2009-12-20 14:56:56", link: "http://blahblah.bla"  },
//	{ tag: "labore", count: 471, lastRef: "2009-12-30 03:03:03", link: "http://blahblah.bla"  },
//	{ tag: "tempor", count: 320, lastRef: "2010-01-02 19:16:57", link: "http://blahblah.bla"  },
//	{ tag: "incididunt", count: 250, lastRef: "2010-01-05 11:41:21", link: "http://blahblah.bla"  },
//	{ tag: "eiusmod", count: 512, lastRef: "2009-11-04 17:26:40", link: "http://blahblah.bla"  },
//	{ tag: "sed do", count: 101, lastRef: "2010-01-01 21:07:43", link: "http://blahblah.bla"  },
//	{ tag: "elit", count: 26, lastRef: "2010-01-31 13:31:11", link: "http://blahblah.bla"  },
//	{ tag: "test", count: 258, lastRef: "2009-09-15 20:02:24", link: "http://blahblah.bla"  },
//	{ tag: "ompet", count: 154, lastRef: "2010-01-20 14:56:56", link: "http://blahblah.bla"  },
//	{ tag: "blah", count: 333, lastRef: "2009-12-26 04:04:04", link: "http://blahblah.bla"  },
//	{ tag: "yargh!", count: 111, lastRef: "2010-01-17 19:16:57", link: "http://blahblah.bla"  }
//];

var TagCloud = function(tagList, elId, tagClass) {
    var elSel = '#' + elId;
    var cloudlist = $('<ul/>').appendTo($(elSel));
    var min, max, i, tag, count, lastRef, link;
    var pattern = /[^0-9]/g;    
    // turn lastRef in format YYYY-MM-DD HH:MM:SS into plain number for color weighting    
    if (typeof (tagList) != "undefined") {
        if (tagList.length > 0) {
            min = max = tagList[0].count;
            minRef = maxRef = tagList[0].lastRef.replace(pattern, "");            
        }
    } else {
        min = max = 0;
        minRef = maxRef = ""; 
    }
    var minFontSize = 1, maxFontSize = 2.5; // font sizes in EMs
    var minColor = 0, maxColor = 100; // min and max color values
    var rval = 255, gval = 166, bval = 1; // rgb values





    var showCount = false;

    // set minimum and maximum tag occurrence
    for (i in tagList) {
        count = tagList[i].count;
        lastRef = tagList[i].lastRef.replace(pattern, "");

        if (count < min)
            min = count;
        if (count > max)
            max = count;

        if (lastRef < minRef)
            minRef = lastRef;
        if (lastRef > maxRef)
            maxRef = lastRef;
    }


    // add the tag to the list
    for (i in tagList) {
        tag = tagList[i].tag;
        count = tagList[i].count;
        lastRef = tagList[i].lastRef.replace(pattern, "");
        link = tagList[i].link;

        // logarithmic font size weighting function
        //var weight = (Math.log(count)-Math.log(min))/(Math.log(max)-Math.log(min));

        // linear font size weighting function
        var weight = (count - min) / (max - min) || 0;
        var size = minFontSize + (maxFontSize - minFontSize) * weight;

        // linear color weighting function
        var cWeight = (lastRef - minRef) / (maxRef - minRef) || 0;
        bval = minColor + Math.round((maxColor - minColor) * cWeight);

        // build the html element for the tag and append it to the list
        var tagText = tag + (showCount ? ' (' + count + ')' : '');
        $('<a rel="tag"/>')
			.html(tagText)
			.attr({
			    'title': tag + ' (' + count + ')',
			    'href': link
			})
			.css({
			    'font-size': size + "em",
			    'color': 'rgb(' + rval + ', ' + gval + ', ' + bval + ')'
			})
			.data('lastRef', lastRef.replace(pattern, ""))
			.appendTo($('<li/>').appendTo(cloudlist))
			.after(' ');
    }

    return { cloudElId: elId };
};
