$(function() {
	setTimeout(function() {
		function normalizeWeight(tags)
		{
			if (!tags || tags.length == 0) { return; }
			var len = tags.length;
			var mid = 0.0;
			for (var i = 0; i < len; ++i) {
				mid += tags[i].weight;
			}

			if (len == 1) {
				tags[0].elem.className = tags[0].prefix + 4;
			} else {
				mid /= 2;
				var piv = 0.0;
				var stop = false;
				var idx;
				for (idx = 0; idx < len && !stop; ++idx) {
					var w = tags[idx].weight;
					if (piv + w >= mid) {
						stop = true;
					} else {
						piv += w;
					}
				}

				if (idx == len) { --idx; }

				var we = tags[len - 1].weight;
				var wb = tags[idx].weight - we;

				for (var i = 0; i < len; ++i) {
					var r = 0;
					var w = tags[i].weight;
					if (wb != 0) {
						r = Math.floor(((w - we) / wb) * 5);
					} else {
						r = Math.floor(w * 5);
					}
					if (r > 4) { r = 4; }
					tags[i].elem.className = tags[i].prefix + r;
				}
			}

			return tags;
		}

		function shuffle(tags)
		{
			var i = tags.length;
			while (i) {
				var j = Math.floor(Math.random() * i);
				var t = tags[--i];
				tags[i] = tags[j];
				tags[j] = t;
			}
			return tags;
		}

		var tagMap = {};
		$('#QzCmsTagCloud > li > span').each(function() {
			var cls = this.className.replace(/^([^\d]+)\d$/, '$1');
			if (!tagMap[cls]) {
				tagMap[cls] = [];
			}
			this.className = '';

			tagMap[cls].push({
				elem: this,
				prefix: cls,
				word: $('a', this).text(),
				weight: parseFloat($('.weight', this).remove().text())
			});
		});

		var tags = [];
		for (var cls in tagMap) {
			tags.push.apply(tags, normalizeWeight(tagMap[cls]));
		}

		$('#QzCmsTagCloud').children().remove().end().text('').append(
			jQuery.map(shuffle(tags), function(tag) {
				return tag.elem;
			})
		).children();
	}, 1);
});

