
var RightContext = {
	TYPE_MENU: 0,
	TYPE_TEXT: 1,
	TYPE_TEXT_EXT: 2,
	TYPE_SEPERATOR: 3,
	TYPE_ATTRIBUTES: 4,
	menuTriggerEvent: "RIGHT",
	mousePos: {
		x: 0,
		y: 0
	},
	rightOffset: -15,
	allowedContexts: ["a", "div", "span", "input"],
	menuCollection: new Object(),
	contextMenu: null,
	isShowing: false,
	abortKill: false,
	images: new Object(),
	req: null,
	initialize: function() {
		this.attachContextEvents();
	},
	addMenu: function(n, m) {
		this.menuCollection[n] = m;
	},
	getMenu: function(n) {
		return this.menuCollection[n];
	},
	
	attachContextEvents: function() {
		// DSI CHANGE limits the tags to the plugin <div class="tx-ttnews">
		var tagContext, thisTag, extensionContext;
		// get the plugins
		extensionsContext = document.getElementsByClassName('tx-ttnews');
		// find the tags in <div class="tx-ttnews">
		for (var ec = 0; ec < extensionsContext.length; ec++) {
			for (var t = 0; t < this.allowedContexts.length; t++) {
				// tags=document.getElementsByTagName(this.allowedContexts[t]);
				tags = extensionsContext[ec].getElementsByTagName(this.allowedContexts[t]);
				for (e = 0; e < tags.length; e++) {
					thisTag = tags[e];
					tagContext = thisTag.getAttribute("id");
					if (tagContext != null && tagContext != "undefined") {
						this.bindEvent('mousemove', tags[e], function(e) {
							return RightContext.locateMousePos(e);
						});
						if (this.menuTriggerEvent == "RIGHT") {
							tags[e].oncontextmenu = function() {
								return RightContext.render(this);
							};
						} else 
							if (this.menuTriggerEvent == "LEFT") {
								tags[e].onclick = function(e) {
									RightContext.killBubble(e);
									return RightContext.render(this)
								};
							} else 
								if (this.menuTriggerEvent == "MOVE") {
									if (!document.all) {
										this.bindEvent('mouseover', tags[e], function(e) {
											RightContext.locateMousePos(e);
											return RightContext.render(this);
										});
										this.bindEvent('mouseout', tags[e], function(e) {
											setTimeout("RightContext.killMenu()", 10);
										});
									} else {
										tags[e].onmouseover = function(e) {
											RightContext.locateMousePos(e);
											return RightContext.render(this);
										};
										tags[e].onmouseout = function(e) {
											setTimeout("RightContext.killMenu()", 10);
										};
									}
								}
					}
				}
			}
		}
	},
	
	
	killBubble: function(e) {
		if (!e) var e = window.event;
		e.cancelBubble = true;
		if (e.stopPropagation) e.stopPropagation();
	},
	bindEvent: function(evt, obj, act, bubble) {
		if (!bubble) bubble = false;
		if (obj.addEventListener) {
			obj.addEventListener(evt, act, bubble);
		} else 
			if (obj.attachEvent) {
				obj.attachEvent('on' + evt, act);
			}
	},
	render: function(caller, name) {
		var url, title;
		var name = name || caller.getAttribute("id");
		var thisMenu = this.getMenu(name);
		var attributes = thisMenu["attributes"].split(',');
		var items = thisMenu.items;
		var objMap = this.buildAttributeMap(attributes, caller);
		this.killMenu();
		this.buildMenu(caller);
		tbl = document.createElement("TABLE");
		tbl.id = "rcRightContextTable";
		for (var m = 0; m < items.length; m++) {
			switch (items[m]["type"]) {
				case this.TYPE_MENU:
					if (this.isDisplayed(items[m], objMap)) {
						this.addMenuItem(items[m], objMap, tbl);
					}
					break;
				case this.TYPE_TEXT:
					text = this.transform(items[m]["text"], objMap);
					cell = this.addTableCell(tbl, "rcMenuItemText", text);
					break;
				case this.TYPE_TEXT_EXT:
					cell = this.addTableCell(tbl, "rcMenuItemTextExt");
					url = this.transform(items[m]["url"], objMap);
					// this.request(url,function(){if(RightContext.req.readyState==4&&RightContext.req.status==200){cell.innerHTML=RightContext.req.responseText}});
					break;
				case this.TYPE_SEPERATOR:
					cell = this.addTableCell(tbl);
					cell.appendChild(this.getSeparator());
					break;
				default:
					break;
			}
		}
		this.contextMenu.appendChild(tbl);
		this.repositionMenu();
		if (this.menuTriggerEvent == "MOVE") {
			this.bindEvent('mouseout', this.contextMenu, function(e) {
				RightContext.abortKill = false;
				setTimeout("RightContext.killMenu()", 10);
			});
			this.bindEvent('mouseover', this.contextMenu, function(e) {
				RightContext.abortKill = true;
			});
		} else 
			if (this.menuTriggerEvent == "LEFT" || this.menuTriggerEvent == "RIGHT") {
				this.bindEvent('click', document.body, function(e) {
					setTimeout("RightContext.killMenu();", 10);
				}, false);
			}
		this.isShowing = true;
		return false;
	},
	isDisplayed: function(item, objMap) {
		var reqVar, reqVal;
		var shown = true;
		if (item["requires"] != null && item["requires"] != "undefined") {
			reqVar = item["requires"][0];
			reqVal = item["requires"][1];
			if (objMap[reqVar] != null && objMap[reqVar] != "undefined") {
				if (objMap[reqVar] != reqVal) {
					shown = false;
				}
			} else {
				shown = false;
			}
		}
		return shown;
	},
	repositionMenu: function() {
		var mPos = this.findPosition(this.contextMenu);
		var mDim = this.getDimensions(this.contextMenu);
		var winHeight = window.innerHeight || document.body.clientHeight;
		var winWidth = window.innerWidth || document.body.clientWidth;
		if (mPos.y + mDim.height > winHeight - 30) {
			this.position(this.contextMenu, mPos.x, mPos.y - mDim.height);
			mPos = this.findPosition(this.contextMenu);
		}
		if (mPos.x + mDim.width > winWidth - 30) {
			this.position(this.contextMenu, mPos.x - mDim.width, mPos.y);
		}
	},
	getSeparator: function() {
		var sep = document.createElement("HR");
		sep.className = "rcMenuSeparator";
		return sep;
	},
	addTableCell: function(table, className, content) {
		row = table.insertRow(-1);
		cell = row.insertCell(0);
		if (className) {
			cell.className = className;
			if (content) {
				cell.innerHTML = content;
			}
		}
		return cell;
	},
	addMenuItem: function(item, objMap, tbl) {
		var title = this.transform(item["text"], objMap);
		var url, frame, img, imgAlign, itemSrc, tmp, itemAction;
		var cell = this.addTableCell(tbl, "rcMenuItem", title);
		cell.style.cursor = document.all ? 'hand' : 'pointer';
		this.bindEvent('mouseover', cell, function(e) {
			this.className = "rcMenuItemHover";
		});
		this.bindEvent('mouseout', cell, function(e) {
			this.className = "rcMenuItem";
		});
		if (item["image"] != null && item["image"] != "undefined") {
			imgAlign = (item["align"] != null && item["align"] != "undefined") ? item["align"] : "absmiddle";
			if (this.images[item["image"]] != null && this.images[item["image"]] != "undefined") {
				img = this.images[item["image"]];
			} else {
				img = this.loadImage(item["image"]);
			}
			img.align = imgAlign;
			cell.insertBefore(this.images[item["image"]], cell.childNodes[0]);
		}
		if (item["url"] != null && item["url"] != "undefined") {
			url = this.transform(item["url"], objMap);
			frame = false;
			if (item["frame"] != null && item["frame"] != "undefined") {
				frame = item["frame"];
			}
			cell.onclick = function() {
				RightContext.redirect(url, frame);
			}
		} else {
			itemAction = item["onclick"];
			try {
				itemSrc = item["onclick"].toString();
				if (itemSrc.indexOf('[') > -1) {
					itemSrc = this.transform(itemSrc, objMap);
					if (document.all) {
						eval('itemAction = ' + itemSrc);
					} else {
						itemAction = eval(itemSrc);
					}
				}
			} catch (e) {
			}
			cell.onclick = itemAction;
		}
	},
	transform: function(str, map) {
		var tStr, tmp;
		tStr = str;
		for (p in map) {
			tmp = "[" + p + "]";
			tStr = tStr.replace(tmp, map[p]);
		}
		return tStr;
	},
	getMenuAttributeArray: function(menu) {
		for (var i = 0; i < menu.length; i++) {
			if (menu[i].type == this.TYPE_ATTRIBUTES) {
				return menu[i]["attributes"].split(',');
			}
		}
		return new Array(0);
	},
	buildAttributeMap: function(attribs, obj) {
		var thisAttr, thisValue;
		var attrMap = new Object();
		for (var a = 0; a < attribs.length; a++) {
			thisAttr = attribs[a];
			thisValue = obj.getAttribute(attribs[a]);
			if (typeof thisValue != "undefined") {
				attrMap[thisAttr] = thisValue;
			}
		}
		return attrMap;
	},
	findPosition: function(obj) {
		var lft = 0;
		var top = 0;
		if (obj.offsetParent) {
			lft = obj.offsetLeft;
			top = obj.offsetTop;
			while (obj = obj.offsetParent) {
				lft += obj.offsetLeft;
				top += obj.offsetTop;
			}
		}
		return {
			x: lft,
			y: top
		};
	},
	getDimensions: function(obj) {
		var objStyle = obj.style;
		var originalVisibility = objStyle.visibility;
		var originalPosition = objStyle.position;
		var originalDisplay = objStyle.display;
		objStyle.visibility = 'hidden';
		objStyle.position = 'absolute';
		objStyle.display = 'block';
		var originalWidth = obj.clientWidth;
		var originalHeight = obj.clientHeight;
		objStyle.display = originalDisplay;
		objStyle.position = originalPosition;
		objStyle.visibility = originalVisibility;
		return {
			width: originalWidth,
			height: originalHeight
		};
	},
	position: function(obj, x, y) {
		obj.style.left = x + 'px';
		obj.style.top = y + 'px';
	},
	buildMenu: function(parent) {
		var pos, dim, tbl;
		this.contextMenu = document.createElement("DIV");
		this.contextMenu.id = "rcRightContext";
		this.contextMenu.className = 'rcMenuContainer';
		pos = this.findPosition(parent);
		dim = this.getDimensions(parent);
		// Position context menu depending on browser
		// All browsers
		this.position(this.contextMenu, this.mousePos.x + this.rightOffset, pos.y + dim.height);
		// Opera
		if (navigator.userAgent.indexOf("opera")) {
			this.position(this.contextMenu, this.mousePos.x + this.rightOffset, pos.y - dim.height);
		}
		if (this.menuTriggerEvent == "RIGHT") {
			this.contextMenu.oncontextmenu = function() {
				return false;
			};
		}
		document.body.appendChild(this.contextMenu);
	},
	killMenu: function() {
		if (!this.abortKill && this.isShowing) {
			try {
				rc = this.contextMenu;
				document.body.removeChild(rc);
			} catch (e) {
			}
			this.contextMenu = null;
			this.isShowing = false;
			this.abortKill = false;
		}
	},
	locateMousePos: function(e) {
		var posx = 0, posy = 0;
		if (e == null) e = window.event;
		if (e.pageX || e.pageY) {
			posx = e.pageX;
			posy = e.pageY;
		} else 
			if (e.clientX || e.clientY) {
				if (document.documentElement.scrollTop) {
					posx = e.clientX + document.documentElement.scrollLeft;
					posy = e.clientY + document.documentElement.scrollTop;
				} else {
					posx = e.clientX + document.body.scrollLeft;
					posy = e.clientY + document.body.scrollTop;
				}
			}
		this.mousePos = {
			x: posx,
			y: posy
		};
	},
	redirect: function(u, frame) {
		if (!frame) {
			document.location = u;
		} else {
			if (frame == "_blank") {
				w = window.open(u, 'w');
			} else {
				window.frames[frame].document.location = u;
			}
		}
	},
	request: function(url, callBack) {
		if (window.XMLHttpRequest) {
			this.req = new XMLHttpRequest();
			this.req.onreadystatechange = callBack;
			this.req.open("GET", url, true);
			this.req.send(null);
		} else 
			if (window.ActiveXObject) {
				this.req = new ActiveXObject("Microsoft.XMLHTTP");
				if (this.req) {
					this.req.onreadystatechange = callBack;
					this.req.open("GET", url, true);
					this.req.send();
				}
			}
	},
	loadImage: function(url) {
		var img = new Image();
		img.src = url;
		img.className = "rcImage";
		this.images[url] = img;
		return img;
	}
};

/* DSI CHANGE add function getElementsByClassName as it is not IE6 compatible */
document.getElementsByClassName = function(cl) {
	var retnode = [];
	var myclass = new RegExp('\\b' + cl + '\\b');
	var elem = this.getElementsByTagName('*');
	for (var i = 0; i < elem.length; i++) {
		var classes = elem[i].className;
		if (myclass.test(classes)) retnode.push(elem[i]);
	}
	return retnode;
};


