function ajaxRead(url, maxArtists) {
  readXml(url, function(responseXml) {
    generateLinks(document.getElementById('artist_cloud'), responseXml, maxArtists);
  });
}

function readXml(url, responseFunc) {
  var xmlObj = null;
  if (window.XMLHttpRequest) {
    xmlObj = new XMLHttpRequest();
  } else if(window.ActiveXObject) {
    xmlObj = new ActiveXObject("Microsoft.XMLHTTP");
  } else {
    return;
  }
  xmlObj.onreadystatechange = function() {
    if(xmlObj.readyState == 4) {
      responseFunc(xmlObj.responseXML);
    }
  }
  xmlObj.open ('GET', url, true);
  xmlObj.send ('');
}

function generateLinks(cloudHtml, responseXml, maxArtists) {
  var nodes=cloudHtml.childNodes;
  for (var i=0; i < nodes.length; i++) {
    cloudHtml.removeChild(nodes[i]);
  }
  var all=new All(responseXml, maxArtists);
  all.generateHtml(cloudHtml);
}

function All(responseXml, maxArtists) {
  maxArtists=(maxArtists == undefined) ? 20 : maxArtists;
  artistsXml=responseXml.getElementsByTagName('artist');
  this.artists=[];
  this.playcount=0;
  for (var i=0; i < artistsXml.length && i < maxArtists; i++) {
    var each=new Artist(artistsXml[i]);
    each.all=this;
    this.playcount=Math.max(this.playcount, each.playcount);
    this.artists.push(each);
  }
  this.artists.sort(function(a,b) {
    if (a.name == b.name) return 0;
    return a.name < b.name ? -1 : 1;
  });
}
All.prototype={
  generateHtml: function(root) {
    cloud=new LinkCloud(this.getLinks());
    cloud.generateHtml(root);
  },
  getLinks: function() {
    var links=[];
    for (var i=0; i < this.artists.length; i++) {
      links.push(this.artists[i].asLink());
    }
    return links;
  }
};

function Artist(xml) {
  var childNodes=xml.childNodes
  for (var x=0; x < childNodes.length; x++) {
    if (childNodes[x].childNodes.length > 0) {
      if ("name" == childNodes[x].nodeName) this.name=childNodes[x].firstChild.data;
      if ("playcount" == childNodes[x].nodeName) this.playcount=Number(childNodes[x].firstChild.data);
      //if ("url" == childNodes[x].nodeName) this.url=childNodes[x].firstChild.data;
    }
  }
  this.url='http://www.amazon.com/gp/search?ie=UTF8&keywords='+escape(this.name)+'&tag=wwwblainebuxt-20&index=music&linkCode=ur2&camp=1789&creative=9325';
}
Artist.prototype={
  asLink: function() {
    return new Link(this.name, this.url, this.weight());
  },
  weight: function() {
    return this.playcount / this.all.playcount;
  }
};

function LinkCloud(links) {
  this.links=links;
}
LinkCloud.prototype={
  clearChildren: function(rootHtml) {
    var nodes=rootHtml.childNodes;
    for (var i=0; i < nodes.length; i++) {
      rootHtml.removeChild(nodes[i]);
     }
  },
  generateHtml: function (rootHtml) {
    this.clearChildren(rootHtml);
    this.linksDoAndBetween(function(each) {
      each.generateHtml(rootHtml);
    }, function() {
      var text=document.createTextNode(' - ');
      rootHtml.appendChild(text);
    });
  },
  linksDoAndBetween: function(eachFunc, betweenFunc) {
    var beforeFunc=function() {
      beforeFunc=betweenFunc;
    }
    for (var i=0; i < this.links.length; i++) {
      beforeFunc();
      eachFunc(this.links[i]);
    }
  }
};

function Link(name, url, weight) {
  this.name=name;
  this.url=url;
  this.weight=weight;
}
Link.prototype={
  fontSizePercent: function() {
    var result = this.weight * 150;
    return result + 50;
  },
  generateHtml: function(root) {
    link=document.createElement('a');
    link.href=this.url;
    link.innerHTML=this.name;
    link.style.fontSize=this.fontSizePercent() + '%';
    link.target='_blank';
    root.appendChild(link);
  }
};