/*
* jQuery TagCloud 0.5.0
* Copyright (c) 2008 Ron Valstar
* Dual licensed under the MIT and GPL licenses:
*   http://www.opensource.org/licenses/mit-license.php
*   http://www.gnu.org/licenses/gpl.html
*/

var tree = [ {"name":"TECHNOLOGY SKILLS", "children":[ 
                    {"name":"J2EE", "children":[
			  {"name":"Servlets"},
			  {"name":"JSP"},
			  {"name":"Custom tag libraries"},
			  {"name":"JSTL"},
			  {"name":"JavaMail"},
			  {"name":"JTA"},
			  {"name":"JMS"}
                    ]}, 
                    {"name":"Database Access", "children":[
			  {"name":"JDBC"},
			  {"name":"iBATIS"},
			  {"name":"Hibernate"},
			  {"name":"JDO"}
		    ]},
                    {"name":"Remoting", "children":[
			  {"name":"RMI"},
			  {"name":"RPC/JAX-RPC"},
			  {"name":"SOAP"},
			  {"name":"CORBA"}
		    ]},
                    {"name":"XML", "children":[
			  {"name":"SAX"},
			  {"name":"DOM"},
			  {"name":"XSL/T"},
			  {"name":"RSS"}
		    ]},
                    {"name":"Portlets", "children":[
			  {"name":"JSR168"},
			  {"name":"Novell exteNd"},
			  {"name":"Liferay"}
		    ]},
                    {"name":"Workflow Automation", "children":[
			  {"name":"OSWorkflow (Open Symphony)"},
			  {"name":"Enhydra Shark"}
		    ]},
                    {"name":"AOP", "children":[
			  {"name":"AspectJ"},
			  {"name":"AOP Alliance"},
			  {"name":"AspectWerkz"}
		    ]},
                    {"name":"JSR170", "children":[
			  {"name":"JackRabbit"},
			  {"name":"Magnolia"}
		    ]},
                    {"name":"JNDI/LDAP", "children":[
			  {"name":"OpenLDAP"},
			  {"name":"Apple Open Directory"},
			  {"name":"OpenDS"},
			  {"name":"389 Directory Server"},
			  {"name":"The Apache Directory Project"},
			  {"name":"Active Directory"}
		    ]},
                    {"name":"RDF/RDQL"},
                    {"name":"VBA"},
                    {"name":"JavaScript", "children":[
			  {"name":"Browser-specific features in Internet Explorer, FireFox and Opera"},
			  {"name":"DOM 1 and 2"}
		    ]},
                    {"name":"JavaScript libraries", "children":[
			  {"name":"jQuery"},
			  {"name":"Prototype"},
			  {"name":"Ext JS"}
		    ]},
                    {"name":"C/C++"},
                    {"name":"Messaging", "children":[
			  {"name":"ActiveMQ"}
		    ]}
              ]},
             {"name":"FRAMEWORKS AND LIBRARIES", "children":[
                    {"name":"General purpose", "children":[
			{"name":"Spring"},
			{"name":"Acegi Security"},
			{"name":"JavaCC"},
			{"name":"Jakarta Turbine"},
			{"name":"Jakarta Velocity"},
			{"name":"Jakarta Commons"},
			{"name":"Log4J"},
			{"name":"Quartz Scheduler (Open Symphony)"},
			{"name":"OSUser"},
			{"name":"Jena RDF API/RDQL"},
			{"name":"Apache Slide/WebDAV"},
			{"name":"Lucene"},
			{"name":"Solr"},
			{"name":"POI"},
			{"name":"GNU Aspell"}
		    ]}, 
                    {"name":"PDF", "children":[
			{"name":"iText"},
			{"name":"JPod"},
			{"name":"PDFBox"}
		    ]},
		    {"name":"Database Access", "children":[
			{"name":"Apache Derby"},
			{"name":"Hypersonic SQL"},
			{"name":"Berkley DB Java Edition"},
			{"name":"Berkley XML database"},
			{"name":"iBATIS"},
			{"name":"Hibernate"},
			{"name":"Apache OJB"},
			{"name":"TopLink"}
		    ]},
		    {"name":"Web", "children":[
			{"name":"Struts"},
			{"name":"FreeMaker"},
			{"name":"JavaServerFaces"},
			{"name":"Tapestry"},
			{"name":"WebWork"}
		    ]},
		    {"name":"Web 2.0 mashups", "children":[
			{"name":"Google maps API"},
			{"name":"Bing API"}
		    ]},
		    {"name":"C/C++", "children":[
			{"name":"STL"},
			{"name":"wxWidgets"},
			{"name":"Boost"},
			{"name":"ACE / TAO"},
			{"name":"Flex / Bison"},
			{"name":"Common C++"},
			{"name":"MFC"}
		    ]}
             ]},
             {"name":"DEVELOPMENT TOOLS", "children":[
		    {"name":"Version Control", "children":[
			{"name":"CVS"},
			{"name":"SVN"},
			{"name":"Git"},
			{"name":"Microsoft SourceSafe"}
		    ]},
		    {"name":"Build", "children":[
			{"name":"Ant"},
			{"name":"Maven 1.0/2.0"},
			{"name":"Continuum"},
			{"name":"BSD Make"},
			{"name":"autoconf/automake"}
		    ]},
		    {"name":"Integrated Environments", "children":[
			{"name":"Eclipse"},
			{"name":"IntelliJ IDEA"},
			{"name":"NetBeans"}
		    ]},
		    {"name":"UML", "children":[
			{"name":"Rational Rose"},
			{"name":"ArgoUML"},
			{"name":"Umbrello"},
			{"name":"GNU Dia"}
		    ]}
	     ]},
	     {"name":"OPERATING SYSTEMS", "children":[
		    {"name":"Windows"},
		    {"name":"Linux"},
		    {"name":"FreeBSD"},
		    {"name":"Sun Solaris"},
		    {"name":"Palm OS"}
	     ]},
	     {"name":"DATABASES", "children":[
		    {"name":"Relational","children":[
			{"name":"MySQL"},
			{"name":"Oracle"},
			{"name":"MS-SQL"},
			{"name":"PostgreSQL"}
		    ]},
		    {"name":"Embedded","children":[
			{"name":"Berkley Database"}
		    ]}
	     ]},
	     {"name":"APPLICATION AND WEB-SERVERS", "children":[
		    {"name":"Apache HTTP Server"},
		    {"name":"Microsoft IIS"},
		    {"name":"Apache Tomcat"},
		    {"name":"JBoss"},
		    {"name":"Resin"},
		    {"name":"IBM WebSphere"},
		    {"name":"SSO","children":[
			{"name":"Novell Client"},
			{"name":"Novell Secure Login"},
			{"name":"Novell Directory Server"},
			{"name":"Novell NetWare"}
		    ]}
	     ]}
	];


// jquery tagcloud plugin

;(function($) {
	// private variables
	var oSettings;
	var oUlCss = {};
	var oLiCss = {};
	var fGAng = 2.399963; // sphere angle in radians*pi
	// default settings
	$.tagcloud = {
		 id: "TagCloud"
		,version: "0.5.0"
		,defaults: {
			 height: null
			,type: "cloud"		// "cloud", "list" or "sphere"
			,sizemax: 20
			,sizemin: 10
			,colormax: "00F"
			,colormin: "B4D2FF"
			,seed: null			// only for type=="cloud"
			,power: .5			// only for type=="sphere"
		}
	};
	$.fn.extend({
		tagcloud: function(_settings) {
			oSettings = $.extend({}, $.tagcloud.defaults, _settings);
			if (oSettings.seed===null) oSettings.seed = Math.ceil(Math.random()*45309714203);

			switch (oSettings.type) {

				case "list":
					oLiCss = {position:"relative",display:"inline"};
				break;
			}

			Rng.setSeed(oSettings.seed+123456);

			return this.each(function(i,o) {
				var mUl = $(o);
				var aLi = mUl.find(">li");
				var iNumLi = aLi.length;


				var iUlW = mUl.width();
				var iUlH = oSettings.height===null?(.004*iUlW*iNumLi):oSettings.height;
				mUl.css({width:iUlW,listStyle:"none",margin:0,padding:0});
				mUl.css(oUlCss);
				

				var iValMx = -2147483647;
				var iValMn = 2147483648;
				var iLastVal = -1;
				for (var j=0;j<iNumLi;j++) {
					var mLi = $(aLi[j]);
					var iVal = mLi.attr("value")==-1?iLastVal++:mLi.attr("value");
					if (iVal>iValMx) iValMx = iVal;
					if (iVal<iValMn) iValMn = iVal;
					iLastVal = iVal;
				}
				var iValRn = iValMx-iValMn;

				
				iLastVal = -1;
				for (var j=0;j<iNumLi;j++) {
					var mLi = $(aLi[j]);;
					var iVal = mLi.attr("value")==-1?iLastVal++:mLi.attr("value");
					iLastVal = iVal;
					//
					var fPrt = ((iNumLi-j-1)/(iNumLi-1));
					var fPrt = (iVal-iValMn)/iValRn;
					//
					var iSzFnt = oSettings.sizemin + fPrt*(oSettings.sizemax-oSettings.sizemin);
					var sColor = colorRng(oSettings.colormin,oSettings.colormax,fPrt);
					//
					mLi.css({"fontSize":iSzFnt}).children().css({});
					var iLiW = mLi.width();
					var iLiH = mLi.height();

					var oCss = {};
				

					oCss["margin-left"] =  parseInt(Math.random() * 2)+1  ;
					oCss["margin-rigth"] =  parseInt(Math.random() * 2)+1  ;
					if (j%2==1)
					oCss["top"] =  parseInt(Math.random() * 3)  ; else oCss["bottom"] =  parseInt(Math.random() * 3)  ;
					oCss["position"] = "relative";
					oCss["display"]="inline";
					mLi.css(oCss);

				}
			});
		}
	});
	// Park-Miller RNG
	var Rng = new function() {
		this.seed = 23145678901;
		this.A = 48271;
		this.M = 2147483647;
		this.Q = this.M/this.A;
		this.R = this.M%this.A;
		this.oneOverM = 1.0/this.M;
	}
	Rng.setSeed = function(seed) {
		this.seed = seed;
	}
	Rng.next = function() {
		var hi   = this.seed/this.Q;
		var lo   = this.seed%this.Q;
		var test = this.A*lo - this.R*hi;
		this.seed = test + (test>0?0:this.M);
		return (this.seed*this.oneOverM);
	}
	Rng.rand = function(lrn, urn) {
		return Math.floor((urn - lrn + 1) * this.next() + lrn);
	}
	// hex dec
	function d2h(d) {return d.toString(16);}
	function h2d(h) {return parseInt(h,16);}

	function getRGB(s) {
		var b3 = s.length==3;
		var aClr = [];
		for (var i=0;i<3;i++) {
			var sClr = s.substring( i*(b3?1:2), (i+1)*(b3?1:2) );
			aClr.push(h2d(b3?sClr+sClr:sClr));
		}
		return aClr;
	}
	function getHex(a) {
		var s = "";
		for (var i=0;i<3;i++) {
			var c = d2h(a[i]);
			if (c.length==1) c = "0"+c; // todo: this can be better
			s += c;
		}
		return s;
	}
	function colorRng(mn,mx,prt) {
		var aMin = getRGB(mn);
		var aMax = getRGB(mx);
		var aRtr = [];
		for (var i=0;i<3;i++) aRtr.push( aMin[i] + Math.floor(prt*(aMax[i]-aMin[i])) );
		return getHex(aRtr);
	}
	// trace
	function trace(o) {
		if (window.console&&window.console.log) {
			if (typeof(o)=="string")	window.console.log(o);
			else						for (var prop in o) window.console.log(prop+": "+o[prop]);
		}
	};
	// set functions
	$.fn.TagCloud = $.fn.Tagcloud = $.fn.tagcloud;
})(jQuery);

// END jquery tagcloud plugin

var highlightLock = 0;
function drawTagCloud() {
	
	var list = document.createElement("ul");
	list.setAttribute("id", "tagcloud");
	list.className="taglist";
	document.getElementById("cloud").appendChild(list);
	var tagId=1;
	
	function mouseOver(element, parent) {
	    
	    if (element.id==parent.id) { element.className="tag-highlited"; return; }
	
	    var p = element.getAttribute("parentId");
	    while (p) {
	      if (p && p==parent.id){ element.className="tag-highlited"; return; }
	      p = document.getElementById(p);
	      if (p) p=p.getAttribute("parentId");
	    }
	
	    element.className="tag-shadow";
	
	}
	
	function mouseOut(element) {
	  element.className="tag";
	}

	function resetHighlighting() {
	    highlightLock=0;
	    var elements = list.childNodes;
	    if (elements) {
	      for (var j=0;j<elements.length;j++) {
		if (elements[j].tagName && elements[j].tagName.toUpperCase()=="LI") mouseOut(elements[j]);
	      }
	    }
	}

	function shuffle(o){ 
		for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
		return o;
	}
	
	function putTag(tag, value, parent) {
	  var element = document.createElement("li");
	  element.innerHTML =  ((value==10)||(value==9))?" <b>"+tag.name.replace(/\s+/g,"&nbsp;")+"</b> ":" "+tag.name.replace(/\s+/g,"&nbsp;")+" ";
	  element.setAttribute("value", value);
	  element.setAttribute("parentId", parent);
	  element.className="tag";
	  var id="tag"+tagId++;
	  element.setAttribute("id", id);
	  if (tag.children) {
	    var parentAdded = false;
	    shuffle(tag.children);
	    for (var i = 0; i<tag.children.length; i++) {
	      if (!parentAdded && i>=tag.children.length/2) { list.appendChild(element); parentAdded = true; }
	      putTag(tag.children[i], value-1, id);
	    } 
	    if (!parentAdded) list.appendChild(element);
	  } else list.appendChild(element);
	
	  element.onmouseover = function(e) {
	    highlightLock = 1;
	    var elements = list.childNodes;
	    if (elements ) {
	      for (var j=0;j<elements.length;j++) {
		if (elements[j].tagName && elements[j].tagName.toUpperCase()=="LI") mouseOver(elements[j], this);
	      }
	    }
	    if (!e) var e = window.event;
	    e.cancelBubble = true;
	    if (e.stopPropagation) e.stopPropagation();
	  }
	  element.onmouseout = function(e) {
	      if (!e) var e = window.event;
	      e.cancelBubble = true;
	      if (e.stopPropagation) e.stopPropagation();

	  }
	}
	list.onmouseout = function(e) {
	    resetHighlighting();
	}
	document.getElementById("cloud").onmouseout = function(e) {
	    resetHighlighting();
	}
	document.getElementById("cloud").onmouseover = function(e) {
	    if (!e) var e = window.event;
	    e.cancelBubble = true;
	    if (e.stopPropagation) e.stopPropagation();
	}
	document.body.onmouseover = function() {
	  if (highlightLock==1) {
	      highlightLock=0;
	      resetHighlighting();
	  }
	}

	shuffle(tree);
	
	for (var i = 0; i<tree.length; i++) {
	  putTag(tree[i],10);
	}
	
	$("#tagcloud").tagcloud( {type:"list", sizemax:15, sizemin: 11} );

}
