
var TagCloud=new Class({Implements:[Options],options:{minRingSize:1/8,maxRingSize:7/8,ringScalingPower:4/3,maxFontSizeScalingPower:1/4,labelScalingPower:2/3,minLabelOpacity:1/10,maxLabelOpacity:9/10,opacityDegradationPower:1,randomAngles:true,rotationDelta:2*Math.PI/360,rotationInterval:100,skewAngle:Math.PI/6,skewDelta:0,minSkewAngle:-Math.PI/6,maxSkewAngle:Math.PI/6,appearanceSteps:5,appearanceInterval:500,pauseOnHover:true},initialize:function(dataSource,options){this.setOptions(options);this.ds=dataSource;this.root=new Element("div",{"class":"tag-cloud"});if(this.options.skewDelta){this.skewDelta=this.options.skewDelta;this.skewAngle=this.options.minSkewAngle;}
else{this.skewAngle=this.options.skewAngle;}},replaces:function(element){this.toElement().replaces(element);this.build();return this;},inject:function(element,where){this.toElement().inject(element,where);this.build();return this;},toElement:function(){return this.root;},build:function(){this.createNodes();this.styleNodes();this.determineInitialAngles();this.positionNodes();this.startRotation();},revalidate:function(){this.styleNodes();this.positionNodes();},createNodes:function(){this.root.empty();this.containers={};var events;if(this.options.pauseOnHover){events={"mouseover":function(){this.cancelRotation();}.bind(this),"mouseout":function(){this.startRotation();}.bind(this)};}
else{events={};}
for(uses in this.ds.getTags()){this.containers[uses]=new Element("div",{"class":"container container-"+uses}).inject(this.root);this.ds.getTags()[uses].each(function(tag){var a=new Element("a",{"href":tag.getURL(),"text":tag.getName(),"title":tag.getName()+": "+tag.getUsageCount(),"events":events,"styles":{"visibility":"hidden","position":"absolute"}}).inject(this.containers[uses]);(function(){a.setStyle("visibility","visible");}).delay(this.options.appearanceInterval*$random(1,this.options.appearanceSteps));}.bind(this));}},styleNodes:function(){var totalSize=this.root.getSize();var baseFontSize=Math.pow(totalSize.x*totalSize.x+totalSize.y+totalSize.y,this.options.maxFontSizeScalingPower);for(uses in this.containers){var ratio=(uses-this.ds.getMinUsageCount())/(this.ds.getMaxUsageCount()-this.ds.getMinUsageCount());var adjustedRatio=(uses-this.ds.getMinUsageCount()+1)/(this.ds.getMaxUsageCount()-this.ds.getMinUsageCount()+1);var fontScale=Math.pow(adjustedRatio,this.options.labelScalingPower);this.containers[uses].setStyle("font-size",Math.round(baseFontSize*fontScale)+"px");this.containers[uses].getChildren().each(function(elem){elem.setOpacity(this.options.minLabelOpacity
+Math.pow(ratio,this.options.opacityDegradationPower)*(this.options.maxLabelOpacity
-this.options.minLabelOpacity));}.bind(this));}},positionNodes:function(){var totalSize=this.root.getSize();var cx=totalSize.x/2;var cy=totalSize.y/2;var rx0=this.options.minRingSize*cx;var ry0=this.options.minRingSize*cy;var rx1=(this.options.maxRingSize-this.options.minRingSize)*cx;var ry1=(this.options.maxRingSize-this.options.minRingSize)*cy;for(uses in this.containers){var nodeCount=this.containers[uses].childNodes.length;var ratio=(uses-this.ds.getMinUsageCount())/(this.ds.getMaxUsageCount()-this.ds.getMinUsageCount());var angleDelta=2*Math.PI/nodeCount;var angle=this.angles[uses];var r=Math.pow(1-ratio,this.options.ringScalingPower);this.containers[uses].getChildren().each(function(elem){var size=elem.getSize();var top=Math.round(cy
+ry0*Math.sin(angle)
+ry1*r*Math.sin(angle)
-size.y/2);var left=Math.round(cx
+rx0*Math.cos(angle)
+rx1*r*Math.cos(angle)
+(cy-top)*Math.tan(this.skewAngle)
-size.x/2);elem.setStyles({"left":left+"px","top":top+"px"});angle+=angleDelta;}.bind(this));}},startRotation:function(){this.cancelRotation();if(this.options.rotationDelta||this.skewDelta){this.rotationInterval=this.rotateAndSkew.periodical(this.options.rotationInterval,this);}},cancelRotation:function(){$clear(this.rotationInterval);},rotateAndSkew:function(){if(this.options.rotationDelta){for(uses in this.containers){this.angles[uses]=(this.angles[uses]
+this.options.rotationDelta)%(2*Math.PI);}}
if(this.skewDelta){this.skewAngle+=this.skewDelta;if(this.skewAngle>=this.options.maxSkewAngle||this.skewAngle<=this.options.minSkewAngle){this.skewDelta=-this.skewDelta;}}
this.positionNodes();},determineInitialAngles:function(){this.angles={};for(uses in this.containers){this.angles[uses]=(this.options.randomAngles?Math.random()*2*Math.PI:0);}}});var Tag=new Class({initialize:function(name,uses,url){this.setName(name);this.setUsageCount(uses);this.setURL(url);},getName:function(){return this.name;},getUsageCount:function(){return this.uses;},getURL:function(){return this.url;},setName:function(name){this.name=name;},setUsageCount:function(uses){this.uses=uses;},setURL:function(url){this.url=url;}});var DefaultTagCloudDataSource=new Class({initialize:function(dl){this.dl=dl;this.loadData();},getTags:function(){return this.tags;},getMinUsageCount:function(){return this.minUses;},getMaxUsageCount:function(){return this.maxUses;},loadData:function(){this.tags={};this.minUses=-1;this.maxUses=-1;var name,url;this.dl.getChildren().each(function(child){var tn=child.get("tag");if(tn=="dt"){var a=child.getFirst();url=a.get("href");name=a.get("text");}
else if(tn=="dd"){var uses=child.get("text").toInt();this.addTag(new Tag(name,uses,url));}}.bind(this));},addTag:function(tag){var uses=tag.getUsageCount();if(!this.tags[uses]){this.tags[uses]=[];}
this.tags[uses].push(tag);if(this.minUses<0||uses<this.minUses){this.minUses=uses;}
if(uses>this.maxUses){this.maxUses=uses;}}});var DefaultTagCloud=new Class({initialize:function(dl,options){new TagCloud(new DefaultTagCloudDataSource(dl),options).replaces(dl);}});window.addEvent("load",function(){new DefaultTagCloud($("tags"));});