function Loader(loaderDom) {
	this.dom = loaderDom;
	this.map = null;
	this.container = null;
	this.progress = null;
	this.text = null;
	this.max = 0;
	this.loaded = 0;
	this.currentCategory = null;
}

Loader.prototype = new GControl();

Loader.prototype.initialize = function(map) {
	this.map = map;
	this.map.getContainer().appendChild(this.dom);
	this.container = document.getElementById("loaderIcons");
	this.progress = document.getElementById("loaderProgress");
	this.text = document.getElementById("loaderText");
	YAHOO.util.Dom.setStyle(this.progress, "opacity", 0.7);
	return this.dom;
}

// Remove the main DIV from the map pane
Loader.prototype.remove = function() {
	this.dom.parentNode.removeChild(this.dom);
}

Loader.prototype.setProgressValue = function(completed) {
	var amount = Math.min(completed, 100);
	amount = Math.max(amount, 0);
	var w = parseInt(YAHOO.util.Dom.getStyle(this.dom, "width"));
	w = Math.max(parseInt(w * (amount / 100)) - 12, 0);
	YAHOO.util.Dom.setStyle(this.progress, "width", w + "px");
}

Loader.prototype.setProgressColor = function(r, g, b) {
	var hex = this.DecToHex(r, g, b);
	YAHOO.util.Dom.setStyle(this.progress, "background-color", hex);
}

Loader.prototype.decToHex = function (dec) {
	if (dec == 10) return "A";
	if (dec == 11) return "B";
	if (dec == 12) return "C";
	if (dec == 13) return "D";
	if (dec == 14) return "E";
	if (dec == 15) return "F";
	return new String(dec);
}

Loader.prototype.DecToHex = function (red, green, blue) {
	var a = this.decToHex(Math.floor(red / 16));
	var b = this.decToHex(red % 16);
	var c = this.decToHex(Math.floor(green / 16));
	var d = this.decToHex(green % 16);
	var e = this.decToHex(Math.floor(blue / 16));
	var f = this.decToHex(blue % 16);
	var z = "#" + a + b + c + d + e + f;
	return z;
}

Loader.prototype.setText = function(text) {
	this.text.innerHTML = text;
}

Loader.prototype.redraw = function(force) {
	if (!force) return;
}

Loader.prototype.getDefaultPosition = function() {
	return new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(3, 15));
}

Loader.prototype.addCategory = function(category) {
	this.currentCategory = category;
	category.createIcon();
	category.setOpacity(Category.OPACITY_LOADING);
	this.container.appendChild(category.icon);
}

Loader.prototype.increment = function() {
	this.setText("Loading " + this.currentCategory.loadQueue.length + " " + this.currentCategory.getName() + "s (" + (this.currentCategory.visible ? "shown" : "hidden") + " - click icon to toggle)...");
	this.loaded = this.loaded + 1;
	var completed = this.loaded / this.max;
	var c = 255 - parseInt(completed * 255);
	completed = parseInt(100 * (completed));
	this.setProgressValue(completed);
	this.setProgressColor(c, 175, c);
}

Loader.prototype.fadeProgressOut = function() {
	this.setProgressColor(100, 255, 100);

	var anim = new YAHOO.util.Anim(this.progress);
	anim.attributes.opacity = {to:0};
	anim.duration = 3;
	anim.method = YAHOO.util.Easing.easeOut;
	anim.animate();
}

Loader.setImagePNG = function(element, src) {
	if (YAHOO.env.ua.ie > 0) {
		element.setAttribute("src", "");
		YAHOO.util.Dom.setStyle(element, "filter", "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "')");
	} else {
		element.setAttribute("src", src);
	}
}

Loader.setBackgroundPNG = function(element, src) {
	if (YAHOO.env.ua.ie > 0) {
		YAHOO.util.Dom.setStyle(element, "filter", "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "')");
	} else {
		YAHOO.util.Dom.setStyle(element, "background", "url(" + src + ") no-repeat top left");
	}
}

Loader.setClass = function(element, className) {
	element.setAttribute("class", className);
	element.setAttribute("className", className);
}