function delegate(object, method, argument) {
    //return method.apply(object);
    return function() { return method.apply(object, new Array(argument)); };
}

function $(id) {
	var e = document.getElementById(id);
	if (e == null) {
		return null;
	}
	return e;
}

var HtmlFactory = {
	createElement: function(name, parent, className) {
		var element = document.createElement(name);
		element.unselectable = "on";
		if (className != null) element.className = className;
		if (parent != null) {
			parent.appendChild(element);
		}
		else {
			document.body.appendChild(element);
		}
		return element;
	},

	removeElement: function(element) {
		if (element.parentNode != null) {
			element.parentNode.removeChild(element);
		}
		else {
			document.body.removeChild(element);
		}
	}
	
};

var Overlay = {
	id:	"overlay",
	interval: null,
	counter: 0,
	
	show: function(text) {
		var element = $(Overlay.id);
		if (element == null) {
			element = HtmlFactory.createElement("DIV");
			element.id = Overlay.id;
		}
		Overlay.counter = 0;
		Overlay.interval = setInterval(Overlay.blend, 40);
	},
	
	hide: function() {
		var element = $(Overlay.id);
		if (element == null) {
			return;
		}
		clearInterval(Overlay.interval);
		Overlay.counter = 0;
		HtmlFactory.removeElement(element);
	},
	
	blend: function() {
		var element = $(Overlay.id);
		if (element == null) {
			return;
		}
		Overlay.counter += 1;
		if (Overlay.counter < 100 && document.all) {
			element.filters[0].opacity = Overlay.counter * 0.5;
		}
	}
	
};

var Info = {
	id:	"info",
	onClose: null,
	
	show: function(text) {
		Overlay.show();
		var element = $(Info.id);
		if (element == null) {
			element = HtmlFactory.createElement("DIV");
			element.id = Info.id;
			element.onclick = Info.hide;
		}
		element.innerHTML = "<p>" + text + "</p>";
		element.style.left = (780 - element.offsetWidth) / 2 + "px";
		element.style.top = (600 - element.offsetHeight) / 2 + "px";
	},
	
	onClose: function() {
	},
	
	hide: function() {
		var element = $(Info.id);
		if (element == null) {
			return;
		}
		Overlay.hide();
		HtmlFactory.removeElement(element);
		if (Info.onClose) {
			Info.onClose();
			Info.onClose = null;
		}
	}
	
};

var Warning = {
	id:				"warning",
	backgroundId:	"warning-background",
	timeout: null,

	show: function(text) {
		Overlay.show();
		var element = $(Warning.id);
		var backgroundElement = $(Warning.backgroundId);
		if (element == null && backgroundElement == null) {
			backgroundElement = HtmlFactory.createElement("DIV");
			backgroundElement.id = Warning.backgroundId;
			element = HtmlFactory.createElement("DIV");
			element.id = Warning.id;
			element.onclick = Warning.hide;
		}
		var innerHTML = "";
		innerHTML += "<p unselectable=\"on\">" + text + "</p>";
		innerHTML += "<a class=\"close\" href=\"javascript:Warning.hide()\"></a>";
		element.innerHTML = innerHTML;
		element.style.left = backgroundElement.style.left = (780 - element.offsetWidth) / 2 + "px";
		element.style.top = backgroundElement.style.top = (600 - element.offsetHeight) / 2 + "px";
		clearTimeout(Warning.timeout);
		Warning.timeout = setTimeout(Warning.hide, 5000);
	},
	
	hide: function() {
		var element = $(Warning.id);
		var backgroundElement = $(Warning.backgroundId);
		if (element == null && backgroundElement == null) {
			return;
		}
		Overlay.hide();
		HtmlFactory.removeElement(element);
		HtmlFactory.removeElement(backgroundElement);
	}
	
};

var Error = {
	id:	"error",

	show: function(text) {
		Overlay.show();
		var element = $(Error.id);
		if (element == null) {
			element = HtmlFactory.createElement("DIV");
			element.id = Error.id;
			element.onclick = Error.hide;
		}
		element.innerHTML = "<p>" + text + "</p>";
		element.style.left = (780 - element.offsetWidth) / 2 + "px";
		element.style.top = (600 - element.offsetHeight) / 2 + "px";
	},
	
	hide: function() {
		var element = $(Error.id);
		if (element == null) {
			return;
		}
		Overlay.hide();
		HtmlFactory.removeElement(element);
	}
	
};

var Loader = {
	id:	"loader",

	show: function(text) {
		Overlay.show();
		var element = $(Loader.id);
		if (element == null) {
			element = HtmlFactory.createElement("DIV");
			element.id = Loader.id;
			element.onclick = Loader.hide;
		}
		var html = "";
		html += "<p>" + text + "</p>";
		element.innerHTML = html;
		element.style.left = (780 - element.offsetWidth) / 2 + "px";
		element.style.top = (600 - element.offsetHeight) / 2 + "px";
	},
	
	hide: function() {
		var element = $(Loader.id);
		if (element == null) {
			return;
		}
		Overlay.hide();
		document.body.removeChild(element);
	}
	
};

var Progress = {
	id:	"progress",

	show: function(text) {
		Overlay.show();
		var element = $(Progress.id);
		if (element == null) {
			element = HtmlFactory.createElement("DIV");
			element.id = Progress.id;
			element.onclick = Progress.hide;
		}
		var html = "";
		html += "<p>" + text + "</p>";
		html += "<img src=\"images/shared/progress_bar.gif\" />";
		element.innerHTML = html;
		element.style.left = (780 - element.offsetWidth) / 2 + "px";
		element.style.top = (600 - element.offsetHeight) / 2 + "px";
	},
	
	hide: function() {
		var element = $(Progress.id);
		if (element == null) {
			return;
		}
		Overlay.hide();
		document.body.removeChild(element);
	}
	
};

var Alt = {
	id:	"alt",

	show: function(product) {
		if (DragAndDrop.element != null) {
			return;
		}
		var element = $(Alt.id);
		if (element == null) {
			element = HtmlFactory.createElement("DIV");
			element.id = Alt.id;
		}
		var innerHTML = "";
		//innerHTML = "<h2>" + product.name + "</h2>";
		if (product.description != null) {
			innerHTML += "<p>" + product.description + "</p>";
		}
		if (product.benefits.length > 0) {
			innerHTML += "<ul>";
			for (var i = 0; i < product.benefits.length; i++) {
				innerHTML += "<li>" + product.benefits[i].text + "</li>";
			}
			innerHTML += "</ul>";
		}
		element.innerHTML = innerHTML;
		Alt.update();
	},
	
	update: function() {
		var element = $(Alt.id);
		if (element == null) {
			return;
		}
		if (Mouse.x < 495) {
			if (Mouse.y > 310) {
				element.className = "make-mirrored-flipped";
				element.style.left = Mouse.x + "px";
				element.style.top = Mouse.y + - element.offsetHeight - 10 + "px";
			}
			else {
				element.className = "make-mirrored";
				element.style.left = Mouse.x + "px";
				element.style.top = Mouse.y + 10 + "px";
			}
		}
		else {
			if (Mouse.y > 310) {
				element.className = "make-normal-flipped";
				element.style.left = Mouse.x - element.offsetWidth + "px";
				element.style.top = Mouse.y + - element.offsetHeight - 10 + "px";
			}
			else {
				element.className = "make-normal";
				element.style.left = Mouse.x - element.offsetWidth + "px";
				element.style.top = Mouse.y + 10 + "px";
			}
		}
	},

	hide: function() {
		var element = $(Alt.id);
		if (element == null) {
			return;
		}
		document.body.removeChild(element);
	}
	
};

var Menu = {
	id:	"menu",
	backgroundId: "menu-background",
	containerId: "menu-container",
	
	show: function(title, count) {
		if (DragAndDrop.element != null) {
			return;
		}
		var element = $(Menu.id);
		var backgroundElement = $(Menu.backgroundId);
		if (element == null && backgroundElement == null) {
			backgroundElement = HtmlFactory.createElement("DIV");
			backgroundElement.id = Menu.backgroundId;
			element = HtmlFactory.createElement("DIV");
			element.id = Menu.id;
			if (count <= 2) {
				backgroundElement.className = "menu-background-smaller";
			}
			else {
				backgroundElement.className = "menu-background-full";
			}
		}
		var innerHTML = null;
		innerHTML = "<a href=\"javascript:Menu.hide()\" class=\"close\"></a>";
		innerHTML += "<p>" + title + "</p>";
		innerHTML += "<div id=\"" + Menu.containerId + "\"></div>";
		element.innerHTML = innerHTML;
		element.style.left = backgroundElement.style.left = Mouse.x - element.offsetWidth / 2 + "px";
		element.style.top = backgroundElement.style.top = Mouse.y + 20 + "px";
	},
	
	update: function() {
		var element = $(Menu.id);
		var backgroundElement = $(Menu.backgroundId);
		if (element == null && backgroundElement == null) {
			return;
		}
	},

	hide: function() {
		var element = $(Menu.id);
		var backgroundElement = $(Menu.backgroundId);
		if (element == null && backgroundElement == null) {
			return;
		}
		document.body.removeChild(element);
		document.body.removeChild(backgroundElement);
		c.page3.openedSlot = null;
	}

};


var Hint = {
	id:	"hint",

	show: function(text) {
		var element = $(Hint.id);
		if (element == null) {
			element = HtmlFactory.createElement("DIV");
			element.id = Hint.id;
		}
		var innerHTML = null;
		element.innerHTML = "<p>" + text + "</p>";
		Hint.update();
	},
	
	update: function() {
		var element = $(Hint.id);
		if (element == null) {
			return;
		}
		element.style.left = Mouse.x + "px";
		element.style.top = Mouse.y - element.offsetHeight + "px";
	},

	hide: function() {
		var element = $(Hint.id);
		if (element == null) {
			return;
		}
		document.body.removeChild(element);
	}
	
};

var Hint2 = {
	id:	"hint2",

	show: function(text) {
		var element = $(Hint2.id);
		if (element == null) {
			element = HtmlFactory.createElement("DIV");
			element.id = Hint2.id;
		}
		var innerHTML = null;
		element.innerHTML = "<p>" + text + "</p>";
		Hint2.update();
	},
	
	update: function() {
		var element = $(Hint2.id);
		if (element == null) {
			return;
		}
		element.style.left = (Mouse.x - element.offsetWidth + 65)>0?Mouse.x - element.offsetWidth + 65 + "px":0;
		element.style.top = Mouse.y - element.offsetHeight - 10 + "px";
	},

	hide: function() {
		var element = $(Hint2.id);
		if (element == null) {
			return;
		}
		document.body.removeChild(element);
	}
	
};

var Hint3 = {
	id:	"hint3",

	show: function(text) {
		var element = $(Hint3.id);
		if (element == null) {
			element = HtmlFactory.createElement("DIV");
			element.id = Hint3.id;
		}
		var innerHTML = null;
		element.innerHTML = "<p>" + text + "</p>";
		Hint3.update();
	},

	update: function() {
		var element = $(Hint3.id);
		if (element == null) {
			return;
		}
		element.style.left = (Mouse.x - element.offsetWidth + 65)>0?Mouse.x - element.offsetWidth + 65 + "px":0;
		element.style.top = Mouse.y - element.offsetHeight - 10 + "px";
	},

	hide: function() {
		var element = $(Hint3.id);
		if (element == null) {
			return;
		}
		document.body.removeChild(element);
	}

};

var MenuHint = {
	id:	"menu-hint",

	show: function(title, text1, text2) {
		var element = $(MenuHint.id);
		if (element == null) {
			element = HtmlFactory.createElement("DIV");
			element.id = MenuHint.id;
		}
		var innerHTML = null;
		var innerHTML = "";
		//innerHTML = "<h2>" + title + "</h2>";
		innerHTML += "<p class=\"text1\">" + text1 + "</p>";
		innerHTML += "<p class=\"text2\">" + text2 + "</p>";
		element.innerHTML = innerHTML;
		MenuHint.update();
	},
	
	update: function() {
		var element = $(MenuHint.id);
		if (element == null) {
			return;
		}
		element.style.left = Mouse.x - element.offsetWidth / 2 + "px";
		element.style.top = Mouse.y + 20 + "px";
	},

	hide: function() {
		var element = $(MenuHint.id);
		if (element == null) {
			return;
		}
		document.body.removeChild(element);
	}
		
};

var AttrReader = {
	asNumber: function(attrs, name) {
		if (attrs.getNamedItem(name) == null) return 0;
		return parseFloat(attrs.getNamedItem(name).value);
	},

	asString: function(attrs, name) {
		if (attrs.getNamedItem(name) == null) return null;
		return attrs.getNamedItem(name).value;
	},

	asBoolean: function(attrs, name) {
		if (attrs.getNamedItem(name) == null) return false;
		return attrs.getNamedItem(name).value == "true";
	}

};

var Formatter = {
	asCurrency: function(value) {
		var result = "" + (Math.round(value * 10) / 10);
		if (result.indexOf(".") >= 0) {
			result = result.replace(".", ",") + "0";
		}
		// UPDATE: tisice oddelene mezerou
		var result2 = "";
		var counter = 0;
		for (var i = result.length - 1; i >= 0; i--) {
			var n = result.substring(i, i + 1);
			result2 = n + result2;
			if (n == ",") {
				counter = 0;
				continue;
			}
			counter += 1;
			if (counter % 3 == 0) {
				result2 = " " + result2;
			}
		}
		return result2 + " Kč";
	},
	asDateTime: function(value) {
		var year = value.getUTCFullYear();
		var month = value.getMonth() + 1;
		var day = value.getDate();
		var minutes = value.getMinutes();
		var hours = value.getHours();
		if (hours < 10) {
			hours = "0" + hours;
		};
		if (minutes < 10) {
			minutes = "0" + minutes;
		}
		return day + "." + month + "." + year + " " + hours + ":" + minutes;
	}
};

var FormAlerter = {
	initialize: function() {
		var elements = document.getElementsByTagName("IMG");
		for (var i = 0; i < elements.length; i++) {
			var element = elements[i];
			if (element.className == "alert") {
				element.onmouseover = delegate(null, Hint.show, element.getAttribute("text"));
				element.onmouseout = delegate(null, Hint.hide);
				element.onmousemove = delegate(null, Hint.update);
			}
		}
	}
};

var Mouse = {
	x: 0,
	y: 0,
	previousX: 0,
	previousY: 0,
	onMove: null
};

var DragAndDrop = {
	element: null,
	startX: 0,
	startY: 0,
	
	start: function(element) {
		if (element == null) {
			return;
		}
		Alt.hide();
		DragAndDrop.element = element;
		DragAndDrop.element.style.zIndex = 999;
		DragAndDrop.element.style.filter = "Alpha(opacity=50)";
		DragAndDrop.startX = DragAndDrop.element.offsetLeft;
		DragAndDrop.startY = DragAndDrop.element.offsetTop;
		Mouse.onMove = DragAndDrop.move;
	},

	move: function() {
		if (DragAndDrop.element == null) {
			return;
		}
		DragAndDrop.element.style.left = DragAndDrop.element.offsetLeft + (Mouse.x - Mouse.previousX) + "px";
		DragAndDrop.element.style.top = DragAndDrop.element.offsetTop + (Mouse.y - Mouse.previousY) + "px";
	},

	stop: function() {
		if (DragAndDrop.element == null) {
			return;
		}
		DragAndDrop.element.style.left = DragAndDrop.startX + "px";
		DragAndDrop.element.style.top = DragAndDrop.startY + "px";
		DragAndDrop.element = null;
	},

	hasMoved: function() {
		if (DragAndDrop.element == null) {
			return false;
		}
		return (DragAndDrop.element.offsetLeft != DragAndDrop.startX && DragAndDrop.element.offsetTop != DragAndDrop.startY);
	}

}

document.onmousemove = function(e) {
	if (window.event) {
		Mouse.x = event.clientX;
		Mouse.y = event.clientY;
	}
	else {
		Mouse.x = e.pageX;
		Mouse.y = e.pageY;
 	}
	if (Mouse.onMove != null) {
		Mouse.onMove();
	}
	Mouse.previousX = Mouse.x;
	Mouse.previousY = Mouse.y;
}

