/**
 * addEvent written by Dean Edwards, 2005
 * with input from Tino Zijdel
 *
 * http://dean.edwards.name/weblog/2005/10/add-event/
 **/
function addEvent(element, type, handler) {
	// assign each event handler a unique ID
	if (!handler.$$guid) handler.$$guid = addEvent.guid++;
	// create a hash table of event types for the element
	if (!element.events) element.events = {};
	// create a hash table of event handlers for each element/event pair
	var handlers = element.events[type];
	if (!handlers) {
		handlers = element.events[type] = {};
		// store the existing event handler (if there is one)
		if (element["on" + type]) {
			handlers[0] = element["on" + type];
		}
	}
	// store the event handler in the hash table
	handlers[handler.$$guid] = handler;
	// assign a global event handler to do all the work
	element["on" + type] = handleEvent;
};
// a counter used to create unique IDs
addEvent.guid = 1;

function removeEvent(element, type, handler) {
	// delete the event handler from the hash table
	if (element.events && element.events[type]) {
		delete element.events[type][handler.$$guid];
	}
};

function handleEvent(event) {
	var returnValue = true;
	// grab the event object (IE uses a global event object)
	event = event || fixEvent(window.event);
	// get a reference to the hash table of event handlers
	var handlers = this.events[event.type];
	// execute each event handler
	for (var i in handlers) {
		this.$$handleEvent = handlers[i];
		if (this.$$handleEvent(event) === false) {
			returnValue = false;
		}
	}
	return returnValue;
};

function fixEvent(event) {
	// add W3C standard event methods
	event.preventDefault = fixEvent.preventDefault;
	event.stopPropagation = fixEvent.stopPropagation;
	return event;
};
fixEvent.preventDefault = function() {
	this.returnValue = false;
};
fixEvent.stopPropagation = function() {
	this.cancelBubble = true;
};

// end from Dean Edwards


/**
 * Creates an Element for insertion into the DOM tree.
 * From http://simon.incutio.com/archive/2003/06/15/javascriptWithXML
 *
 * @param element the element type to be created.
 *				e.g. ul (no angle brackets)
 **/
function createElement(element) {
	if (typeof document.createElementNS != 'undefined') {
		return document.createElementNS('http://www.w3.org/1999/xhtml', element);
	}
	if (typeof document.createElement != 'undefined') {
		return document.createElement(element);
	}
	return false;
}

/**
 * "targ" is the element which caused this function to be called
 * from http://www.quirksmode.org/js/events_properties.html
 **/
function getEventTarget(e) {
	var targ;
	if (!e) {
		e = window.event;
	}
	if (e.target) {
		targ = e.target;
	} else if (e.srcElement) {
		targ = e.srcElement;
	}
	if (targ.nodeType == 3) { // defeat Safari bug
		targ = targ.parentNode;
	}

	return targ;
}

// from akz
// creates an array of elements which match className
function getElementsByClassName(className,type) {
    type = (type != "") ? type : "*";
    var objAr = document.getElementsByTagName(type);
    var Matched = new Array;
    var re = new RegExp("\\b"+ className +"\\b");
    for(var i=0; i < objAr.length; i++){
	if (objAr[i].className.match(re)) {
	    document.title = objAr[i].className;
	    Matched.push(objAr[i]);
	}
    }
    return Matched;
}
// Empties a select list
function ClearSelect (s) {
    for (var i = 0; i < s.options.length; i++) {
	s.options[i] = null;
    }
    if (s.options.length != 0) {
	ClearSelect (s);
    }
}
// Adds a value to a select list
function Append2Select(s, val,text) {
    s.options[s.options.length] = new Option (text, val);
}
// open external links (for forums really) in a new tab/window
function externalLinks() {
    if (!document.getElementsByTagName) return;
    var anchors = document.getElementsByTagName("a");
    for (var i=0; i<anchors.length; i++) {
	var anchor = anchors[i];
	if (anchor.getAttribute("href") && anchor.getAttribute("rel") && anchor.getAttribute("rel").toString().match("\\bexternal\\b")) {
	    anchor.target = "_blank";
	}
    }
}

addEvent(window,'load',externalLinks);

// var _external_init = document.addEventListener ? document.addEventListener("DOMContentLoaded", function(){externalLinks();}, false): setInterval( function(){if (/loaded|complete/.test( document.readyState )){ clearInterval(_external_init);externalLinks(); } }, 10);

var target;
var ratereq;
function rateMsg (id,w,rs) {
 target = document.getElementById("msg" + id);
 doRating("/fcluster/mrate3.pl?mid=" + id + ";w=" + w + ";style=" + rs);
 return false;
}
function postRate () {
  if (ratereq.readyState == 4) { // Complete
    if (ratereq.status == 200) { // OK response
      var result = ratereq.responseText;
      target.className = "";
      target.innerHTML = result;
    } 
  } 
} 
function doRating(url) {
    if (window.XMLHttpRequest) { // Non-IE browsers
	ratereq = new XMLHttpRequest();
	ratereq.onreadystatechange = postRate;
	try {
	    ratereq.open("GET", url, true);
	} catch (e) {
	    //      alert(e);
	}
	ratereq.send(null);
    } else if (window.ActiveXObject) { // IE
	ratereq = new ActiveXObject("Microsoft.XMLHTTP");
	if (ratereq) {
	    ratereq.onreadystatechange = postRate;
	    ratereq.open("GET", url, true);
	    ratereq.send();
	}
    }
}
