/**
 * Copyright (C) 2010 Graham Breach
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
/**
 * TagCanvas 1.3
 * For more information, please contact <graham@goat1000.com>
 */
function Point(a,b){this.x=a;this.y=b}Point.AbsPos=function(d){var c,b,a;c=document.getElementById(d);b=new Point(c.offsetLeft,c.offsetTop);while(c.offsetParent){a=c.offsetParent;b.x+=a.offsetLeft;b.y+=a.offsetTop;c=a}return b};function Point3D(a,c,b){this.x=a;this.y=c;this.z=b;this.RotateX=function(d){var e,g,f;e=Math.sin(d);g=Math.cos(d);f=new Point3D(this.x,(this.y*g)+(this.z*e),(this.y*-e)+(this.z*g));return f};this.RotateY=function(d){var e,g,f;e=Math.sin(d);g=Math.cos(d);f=new Point3D((this.x*g)+(this.z*-e),this.y,(this.x*e)+(this.z*g));return f};this.RotateZ=function(d){var e,g,f;e=Math.sin(d);g=Math.cos(d);f=new Point3D((this.x*g)+(this.y*e),(this.x*-e)+(this.y*g),this.z);return f};this.toString=function(){return"["+this.x.toFixed(2)+","+this.y.toFixed(2)+","+this.z.toFixed(2)+"]"};this.Project=function(e,i,f,g){var k,j,d;k=(this.y*TagCanvas.z1)/(TagCanvas.z1+TagCanvas.z2+this.z);j=(this.x*TagCanvas.z1)/(TagCanvas.z1+TagCanvas.z2+this.z);d=TagCanvas.z2+this.z;return new Point3D(j,k,d)}}function TagCanvas(h,a){var f,d,n,e,b,l,m,o,k=document.getElementById(h),j=["id","class","innerHTML"];if(!k){throw 0}if(typeof(G_vmlCanvasManager)!="undefined"){k=G_vmlCanvasManager.initElement(k)}if(k&&(!k.getContext||!k.getContext("2d").fillText)){b=document.createElement("DIV");for(f=0;f<j.length;++f){b[j[f]]=k[j[f]]}k.parentNode.insertBefore(b,k);k.parentNode.removeChild(k);throw 0}TagCanvas.z1=(19800/(Math.exp(TagCanvas.depth)*(1-1/Math.E)))+20000-19800/(1-(1/Math.E));TagCanvas.z2=TagCanvas.z1;TagCanvas.radius=(k.height>k.width?k.width:k.height)*0.33*(TagCanvas.z2+TagCanvas.z1)/(TagCanvas.z1);this.Draw=function(q){var u=0,r,t,v,p,s;v=q.getContext("2d");v.clearRect(0,0,q.width,q.height);v.strokeStyle="white";v.fillStyle="white";r=q.width/2;t=q.height/2;this.active=null;for(s=0;s<this.taglist.length;++s){this.taglist[s].Calc(this.yaw,this.pitch)}this.taglist=this.taglist.sort(function(i,c){return i.sc-c.sc});for(s=0;s<this.taglist.length;++s){p=this.taglist[s].Draw(v,r,t);if(p&&p.sc>u){this.active=p;this.active.index=s;u=p.sc}}if(TagCanvas.freezeActive&&this.active){this.yaw=this.pitch=0}else{this.Animate(q.width,q.height)}if(this.active){this.active.Draw(v)}};this.Animate=function(c,i){if(TagCanvas.mx>=0&&TagCanvas.my>=0&&TagCanvas.mx<c&&TagCanvas.my<i){this.yaw=(TagCanvas.maxSpeed*2*TagCanvas.mx/c)-TagCanvas.maxSpeed;this.pitch=-((TagCanvas.maxSpeed*2*TagCanvas.my/i)-TagCanvas.maxSpeed);if(TagCanvas.reverse){this.yaw=-this.yaw;this.pitch=-this.pitch}TagCanvas.initial=null}else{if(!TagCanvas.initial){this.yaw=this.yaw*TagCanvas.decel;this.pitch=this.pitch*TagCanvas.decel}}};this.Clicked=function(i){try{if(this.active&&this.taglist[this.active.index]){this.taglist[this.active.index].Clicked(i)}}catch(c){}};try{d=document.getElementById(a?a:h);n=d.getElementsByTagName("a");this.taglist=[];if(n.length){e=TagCanvas.PointsOnSphere(n.length,f);for(f=0;f<n.length;++f){l=n[f].getElementsByTagName("img");if(l.length){m=new Image;m.src=l[0].src;o=new Tag(m,n[f].href,n[f].target,e[f],1,1);AddImage(m,o,this.taglist)}else{this.taglist.push(new Tag(n[f].innerText?n[f].innerText:n[f].textContent,n[f].href,n[f].target,e[f],2,TagCanvas.textHeight+2))}}}if(a&&TagCanvas.hideTags){d.style.display="none"}}catch(g){}this.yaw=TagCanvas.initial?TagCanvas.initial[0]*TagCanvas.maxSpeed:0;this.pitch=TagCanvas.initial?TagCanvas.initial[1]*TagCanvas.maxSpeed:0;b=Point.AbsPos(k.id);TagCanvas.cx=b.x;TagCanvas.cy=b.y;if(!TagCanvas.started){AddHandler("mousemove",TagCanvas.MouseMove);AddHandler("mouseout",TagCanvas.MouseMove);AddHandler("mousedown",TagCanvas.MouseClick);TagCanvas.started=setInterval(function(){TagCanvas.DrawCanvas(k)},10)}}function AddImage(c,b,a){AddHandler("load",function(){b.w=this.width;b.h=this.height;a.push(b)},c)}function AddHandler(a,b,c){if(!c){c=document}if(c.addEventListener){c.addEventListener(a,b,false)}else{c.attachEvent("on"+a,b)}}function Outline(){this.ts=new Date();this.Update=function(a,e,b,c,d){this.x=d*(a-TagCanvas.outlineOffset);this.y=d*(e-TagCanvas.outlineOffset);this.w=d*(b+TagCanvas.outlineOffset*2);this.h=d*(c+TagCanvas.outlineOffset*2);this.sc=d};this.Draw=function(b){var a=new Date()-this.ts;b.save();b.strokeStyle=TagCanvas.outlineColour;b.lineWidth=TagCanvas.outlineThickness;if(TagCanvas.pulsateTo<1){b.globalAlpha=TagCanvas.pulsateTo+((1-TagCanvas.pulsateTo)*(0.5+(Math.cos(2*Math.PI*a/(1000*TagCanvas.pulsateTime))/2)))}b.beginPath();b.rect(this.x,this.y,this.w,this.h);b.closePath();b.stroke();b.restore()};this.Active=function(d,a,b){return(a>=this.x&&b>=this.y&&a<=this.x+this.w&&b<=this.y+this.h)};this.Update(0,0,0,0,1)}function Tag(d,c,f,b,a,e){this.image=d.src?d:null;this.name=d.src?"":d;this.href=c;this.target=f;this.p3d=new Point3D;this.p3d.x=b[0]*TagCanvas.radius*1.1;this.p3d.y=b[1]*TagCanvas.radius*1.1;this.p3d.z=b[2]*TagCanvas.radius*1.1;this.x=0;this.y=0;this.w=a;this.h=e;this.sc=1;this.alpha=1;this.outline=new Outline(this);this.Draw=function(j,h,i){var g;j.save();j.globalAlpha=this.alpha;j.scale(this.sc,this.sc);h=h/this.sc;i=i/this.sc;j.textBaseline="top";j.fillStyle=TagCanvas.textColour;j.font=TagCanvas.textHeight+"px "+TagCanvas.textFont;if(this.image){this.w1=this.w*this.sc;this.h1=this.h*this.sc}else{g=j.measureText(this.name);this.w1=g.width+2;this.h1=this.h}h=h-(this.w1/2);i=i-(this.h1/2);if(this.image){j.drawImage(this.image,h+this.x,i+this.y,this.image.width*this.sc,this.image.height*this.sc)}else{j.fillText(this.name,h+this.x+1,i+this.y+1,this.w1-2)}j.restore();this.outline.Update(h+this.x,i+this.y,this.w1,this.h1,this.sc);if(this.outline.Active(j,TagCanvas.mx,TagCanvas.my)){return this.outline}return null};this.Calc=function(i,h){var g;g=this.p3d.RotateY(i);this.p3d=g.RotateX(h);g=this.p3d.Project(this.w,this.h,Math.PI/4,20);this.x=g.x;this.y=g.y;this.sc=(TagCanvas.z1+TagCanvas.z2-g.z)/TagCanvas.z2;this.alpha=TagCanvas.minBrightness+1-((g.z-TagCanvas.z2+TagCanvas.radius)/(2*TagCanvas.radius))};this.Clicked=function(g){if(this.target==""||this.target=="_self"){document.location=this.href}else{if(self.frames[this.target]){self.frames[this.target]=this.href}else{if(top.frames[this.target]){top.frames[this.target]=this.href}else{window.open(this.href,this.target)}}}}}TagCanvas.MouseMove=function(a){if(a.pageX){TagCanvas.mx=a.pageX-TagCanvas.cx;TagCanvas.my=a.pageY-TagCanvas.cy}else{TagCanvas.mx=a.clientX+(document.documentElement.scrollLeft?document.documentElement.scrollLeft:document.body.scrollLeft)-TagCanvas.cx;TagCanvas.my=a.clientY+(document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop)-TagCanvas.cy}};TagCanvas.MouseClick=function(a){TagCanvas.MouseMove(a);TagCanvas.tc.Clicked(a)};TagCanvas.DrawCanvas=function(a){TagCanvas.tc.Draw(a)};TagCanvas.Start=function(b,a){TagCanvas.tc=new TagCanvas(b,a)};TagCanvas.PointsOnSphere=function(h){var a,g,c,b,f=[],d=Math.PI*(3-Math.sqrt(5)),e=2/h;for(a=0;a<h;++a){g=a*e-1+(e/2);c=Math.sqrt(1-g*g);b=a*d;f.push([Math.cos(b)*c,g,Math.sin(b)*c])}return f};TagCanvas.mx=-1;TagCanvas.my=-1;TagCanvas.cx=0;TagCanvas.cy=0;TagCanvas.z1=20000;TagCanvas.z2=20000;TagCanvas.freezeActive=false;TagCanvas.pulsateTo=0.15;TagCanvas.pulsateTime=3;TagCanvas.reverse=false;TagCanvas.depth=0.5;TagCanvas.maxSpeed=0.05;TagCanvas.decel=0.95;TagCanvas.minBrightness=0.1;TagCanvas.outlineColour="#ffff99";TagCanvas.outlineThickness=2;TagCanvas.outlineOffset=5;TagCanvas.textColour="#ff99ff";TagCanvas.textHeight=15;TagCanvas.textFont="Helvetica, Arial, sans-serif";TagCanvas.initial=null;TagCanvas.hideTags=true;
