function go() {
	var select = OZ.$("url");
	var ids = [];
	var url = "";
	var opts = select.getElementsByTagName("option");
	for (var i=0;i<opts.length;i++) {
		var o = opts[i];
		if (o.selected && o.value) {
			url = o.innerHTML.split(" ").shift();
			ids.push(o.value);
		}
	}
	if (url) { window.v = new View(ids.join(","), url, OZ.$("c")); }
}

var View = OZ.Class();

View.prototype.init = function(ids, url, div) {
	OZ.DOM.clear(div);
	this.xml = false;
	this.flag = 2;
	
	div.style.position = "relative";
	var w = div.offsetWidth;
	var h = div.offsetHeight;
	
	OZ.Request("../?get&id="+ids, this.response.bind(this), {xml:true});
	var ifr = OZ.DOM.elm("iframe");

	this.ifr = ifr;
	ifr.setAttribute("width", "100%");

	var c = OZ.DOM.elm("canvas",{position:"absolute", top:"0px", left:"0px"});
	this.canvas = c;
	this.context = c.getContext("2d");

	OZ.Event.add(ifr, "load", this.bind(this.load));
	ifr.src = url.replace(/&amp;/g,"&");

	div.appendChild(ifr);
	div.appendChild(c);
}

View.prototype.response = function(xmlDoc) {
	this.xml = xmlDoc;
	this.flag--;
	if (!this.flag) { this.draw(); }
}

View.prototype.load = function(e) {
	try {
		netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
	} catch(e) {
		var str = e + "\n\n" + "Please enable codebase principal support in user.js";
		alert(str);	
	}
	var w = this.ifr.contentDocument.documentElement.scrollWidth;
	var h = this.ifr.contentDocument.documentElement.scrollHeight;

	this.ifr.setAttribute("width",w);
	this.ifr.setAttribute("height",h);
	this.canvas.setAttribute("width",w);
	this.canvas.setAttribute("height",h);
	this.context.globalCompositeOperation = "lighter";

	this.flag--;
	if (!this.flag) { this.draw(); }
}

View.prototype.draw = function() {
	var hits = this.xml.getElementsByTagName("hit");
	var bad = 0;
	var total = 0;
	var data = [];
	var cache = {};
	
	for (var i=0;i<hits.length;i++) {
		var hit = hits[i];
		var obj = {
			path: hit.getAttribute("path"),
			count: parseInt(hit.getAttribute("count"),10),
			x: parseInt(hit.getAttribute("x"),10),
			y: parseInt(hit.getAttribute("y"),10)
		}
		total += obj.count;
		if (!(obj.path in cache)) {
			var elm = this.getElement(obj.path);
			if (elm) {
				netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
				var pos = OZ.DOM.pos(elm);
				cache[obj.path] = pos;
			} else {
				cache[obj.path] = false;
			}
		}
		var pos = cache[obj.path];
		if (pos) {
			obj.x += pos[0];
			obj.y += pos[1];
			data.push(obj);
		} else {
			bad += obj.count;
		}
	}
	
	data.sort(function(a,b) { return a.count-b.count; });
	if (!data.length) { return; }
	
	var max = data[data.length-1].count;
	for (var i=0;i<data.length;i++) {
		this.drawHit(data[i], max);
	}
	OZ.$("stats").innerHTML = "Total: "+total+"<br/>Invalid: "+bad;
}

View.prototype.getElement = function(path) {
	netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
	var parts = path.split(",");
	var curr = false;
	var first = parts.shift();
	if (first == "^") {
		curr = this.ifr.contentDocument.body;
	} else {
		curr = this.ifr.contentDocument.getElementById(first);
	}
	if (!curr) { return false; }
	for (var i=0;i<parts.length;i++) {
		var idx = parts[i];
		var cnt = -1;
		var ok = false;
		for (var j=0;j<curr.childNodes.length;j++) {
			var ch = curr.childNodes[j];
			if (ch.nodeType == 1) { cnt++; }
			if (cnt == idx) { 
				curr = ch; 
				ok = true;
				break;
			}
		}
		if (!ok) { return false; }
	}
	return curr;
}

View.prototype.generateColor = function(count, max) {
	var rgb1 = [0, 0, 255];
	var rgb2 = [0, 255, 255];
	
	if (max == 1) {
		var frac = 1;
	} else {
		var frac = (count-1)/(max-1);
	}
	
	var rgb = [0,0,0];
	for (var i=0;i<3;i++) {
		rgb[i] = Math.round(rgb1[i] + frac * (rgb2[i] - rgb1[i]));
	}
	return "rgba("+rgb.join(",")+",0.3)";
}

View.prototype.drawHit = function(data, max) {
	var elm = data.path;
	var count = data.count;
	var x = data.x;
	var y = data.y;
	
	var c = this.context;
	c.fillStyle = this.generateColor(count, max); 
	c.beginPath();
	c.arc(x,y,4,0,Math.PI*2,1);
	c.fill();	
	return true;
}

