var WM = {
	
	addEvent : function(el, type, listener, useCapture)
	{
		if (el.addEventListener && type == "mousewheel" && ("opera" in window))
		{
			el.addEventListener("DOMMouseScroll", listener, useCapture);
			return;
		}
		
		if (el.addEventListener)
			el.addEventListener(type, listener, useCapture);
		else if (el.attachEvent)
			el.attachEvent("on"+type, listener);
	},

	removeEvent: function(el, type, listener, useCapture)
	{
		if (el.removeEventListener && type == "mousewheel" && ("opera" in window))
		{
			el.removeEventListener("DOMMouseScroll", listener, useCapture);
			return;
		}
		
		if (el.removeEventListener)
			el.removeEventListener(type, listener, useCapture);
		else if (el.detachEvent)
			el.detachEvent("on"+type, listener);
	},
	
	stopEvent : function(evt)
	{
		if (evt != null)
		{
			if (evt.stopPropagation)
				evt.stopPropagation();
			if (evt.preventDefault)
				evt.preventDefault();
				/*
			if (typeof(evt.cancelBubble) != "undefined")
				evt.cancelBubble = true;
				*/
			if (typeof(evt.returnValue) != "undefined")
				evt.returnValue = false;
		}
	},
	
	getEvent: function(ev) {
		return(ev || window.event);
	},
	
	getEventTarget: function(ev) {
		var ev = WM.getEvent(ev);
		if ("currentTarget" in ev)
			return(ev.currentTarget);
		else
		{
			// IE has no currentTarget.
			var el = ev.srcElement;
			while((el != null) && (typeof(el.wm_target) == "undefined"))
			{
				el = el.parentNode;
			}
			return(el);
		}
	},
	
	getWindowOffset : function(el)
	{
		var op = [0, 0];
		while(el != document && el != null)
		{
			op[0] += el.offsetLeft;
			op[1] += el.offsetTop;
			el = el.offsetParent;
		}
		return(op);
	},
	
	init : function() {
		WM.addEvent(window, "load", WM.processDocument, false);
	},
	
	rexMoveable: /wm_moveable\((\d+)\s*,\s*(\d+)\)/i,
	
	processDocument : function(ev) {
		var anchors = document.getElementsByTagName("a");
		for(var i=0; i<anchors.length; i++) {
			var a = anchors[i];
			var rel = a.getAttribute("rel");
			
			if (rel != null) {
				var m;
				
				m = rel.match(WM.rexMoveable);
				if (m) WM.hookMoveable(a);
			}
		}
	},
	
	hookMoveable : function(el) {
		WM.addEvent(el, "click", WM.openFrameHook, false);
		el.wm_target = true;			// for IE
	},
	
	openFrameHook: function(ev) {
		
		ev = WM.getEvent(ev);
		var a = WM.getEventTarget(ev);
		var url = a.href; 
		
		if (url != null) {

			// get title
			var title = a.getAttribute("title");
			// get width and height
			var rel = a.getAttribute("rel");
			m = rel.match(WM.rexMoveable);
			var width = parseInt(m[1]);
			var height = parseInt(m[2]);
		
			var win = WM.findWindow(url);
			if (!win)	// does not exist
			{
				win = WM.getWindow(url, title, width, height);
				win.showCenter();
			}
			else		// already exists
			{
				if (win.isMinimized()) win.minimize();
				win.toFront();
				Windows.focus(win.getId());
			}
		}
	
		WM.stopEvent(ev);
		return(false);
	},

	windows: {},
	
	findWindow: function(url) {
		if (WM.windows.hasOwnProperty(url))
			return(WM.windows[url]);
		return(null);
	},
	
	getWindow: function(url, title, width, height) {
		var win = WM.findWindow(url);
		if (!win) {
			win = new Window({
				className: "greylighting", 
				title: title,
				url: url, 
				width: width,
				height: height,
				//resizable: false,
				maximizable: true,
				destroyOnClose: true,
				recenterAuto: false,
				onDestroy: WM.onDestroy});
			WM.windows[url] = win;
			win.setCloseCallback(WM.onClose);
		}
		return(win);
	},
	
	onClose: function(win) {
		//console.log("Closing " + win.getId());
		return(true);
	},
	onDestroy: function(win) {
		//console.log("Destroying " + win.getId());
		delete WM.windows[win.getURL()];
	}
};

WM.init();

