/* $Id: mo.js,v 1.1 2004/10/20 08:35:47 rolipe Exp $ */

var states = [0, 1];

function tgl(lnk, num_children, turn_to) {
	if (!can_capture()) return false;
	if (typeof lnk == 'undefined') return false;
	if (typeof lnk == 'string') {
		if (!dom.finished || typeof dom.handles[lnk] == 'undefined') return false;
		lnk = dom.handles[lnk];
	}
	if (parseInt(turn_to, 10) != NaN) {
		turn_to = states[turn_to];
	}
	// Netscape 4 hack:
	if (typeof lnk.tagName == 'undefined') {
		if (typeof lnk.href != 'undefined') {
			lnk['tagName'] = 'A';
		}
		else if (typeof lnk.src != 'undefined') {
			lnk['tagName'] = 'IMG';
		}
	}
	if (typeof lnk.tagName != 'undefined') {
		if (lnk.tagName == 'IMG') {
			var url = lnk.src;
			var state = get_state(url);
			if (state != null) {
				var re = eval("/(.*)" + states[state] + "(\\.|$)(.*)/");
				if (states[state] + "" == "") {
					re = /(.*)(\\.)(.*)/;
				}
				var rep = (typeof turn_to != 'undefined')
					? turn_to
					: states[Math.abs(parseInt(state) - 1)];
				// Opera and Netscape 4 interpolate $1 + 0 incorrectly to $10,
				// so we hack a temporary tab into the URL:
				lnk.src = lnk.src.replace(re, "$1\t" + rep + "$2$3");
				lnk.src = lnk.src.replace(/(\t|%09)/g, "");
			}
		}
		if (lnk.tagName == 'A') {
			var imgs = _lnk2imgs(lnk, num_children);
			for (var i = 0; i < imgs.length; i++) {
				tgl(imgs[i], 1, turn_to);
			}
		}
		else if (lnk.tagName == 'TD') {
			var url = lnk.background;
			if (typeof url == 'undefined') {
				if (typeof lnk.attributes != 'undefined') {
					url = lnk.attributes.getNamedItem("background").value;
					// Opera 7.20 doesn't get it...
				}
			}
			if (typeof url != 'undefined' && url != "") {
				var state = get_state(url);
				if (state != null) {
					var re = eval("/(.*)" + states[state] + "(\\.|$)(.*)/");
					if (states[state] + "" == "") {
						re = /(.*)(\\.)(.*)/;
					}
					var rep = (typeof turn_to != 'undefined')
						? turn_to
						: states[Math.abs(parseInt(state) - 1)];
					url = url.replace(re, "$1" + rep + "$2$3");
					if (typeof lnk.background != 'undefined') {
						lnk.background = url;
						// Konqueror hack:
						if (lnk.background != url) {
							lnk.attributes.getNamedItem("background").value = url;
						}
					}
					else {
						lnk.attributes.getNamedItem("background").value = url;
					}
				}
			}
		}
		else if (lnk.tagName == 'DIV') {
			var url = lnk.style.backgroundImage.substr(4);
			url = url.substr(0, url.length - 1);
			if (typeof url != 'undefined' && url != "") {
				var state = get_state(url);
				if (state != null) {
					var re = eval("/(.*)" + states[state] + "(\\.|$)(.*)/");
					if (states[state] + "" == "") {
						re = /(.*)(\\.)(.*)/;
					}
					var rep = (typeof turn_to != 'undefined')
						? turn_to
						: states[Math.abs(parseInt(state) - 1)];
					url = url.replace(re, "$1" + rep + "$2$3");
					lnk.style.backgroundImage = "url('" + url + "')";
				}
			}
		}
	}
	return true;
}

function trn(lnk, num_children, turn_to) {
	return tgl(lnk, num_children, turn_to);
}

function get_state(url) {
	url = url.substr(url.indexOf("\/\/") + 2);
	url = url.substr(url.indexOf("\/") + 1);
	var state = null;
	for (var i = 0; i < states.length; i++) {
		if (states[i] == "") {
			state = i;
		}
	}
	for (var i = 0; i < states.length; i++) {
		// Netscape 4 falls back on indexof...
		var re = eval("/" + states[i] + "(\\.|$)/");
		if (
			i != state
			&& (
				url.lastIndexOf(states[i] + ".") > 0
				|| url.lastIndexOf(states[i]) + states[i].length == url.length
			)
			//&& re.test(url)
		) {
			state = i;
		}
	}
	return state;
}

function init_mo(a_states) {
	if (typeof a_states != 'undefined') {
		states = a_states;
	}
	if (!dom.finished) return false;
	dom.preloaded = [];
	for (h in dom.handles) {
		var handle = dom.handles[h];
		if (typeof handle.src != 'undefined' && handle.src != null) {
			var url = handle.src;
		}
		else if (typeof handle.style != 'undefined') {
			if (typeof handle.style.backgroundImage != 'undefined') {
				var url = handle.style.backgroundImage.substr(4);
				url = url.substr(0, url.length - 1);
			}
		}
		if (typeof url != 'undefined') {
			var state = get_state(url);
			if ((state == 0) || (state == 1) ) {
				var re = eval("/(.*)" + states[state] + "(\\.|$)(.*)/");
				if (states[state] + "" == "") {
					re = /(.*)(\\.)(.*)/;
				}
				var rep = states[Math.abs(parseInt(state) - 1)];
				// Opera and Netscape 4 interpolate $1 + 0 incorrectly to $10,
				// so we hack a temporary tab into the URL:
				url = url.replace(re, "$1\t" + rep + "$2$3");
				url = url.replace(/(\t|%09)/g, "");
	    		dom.preloaded[dom.preloaded.length] = new Image();
	    		dom.preloaded[dom.preloaded.length - 1].src = url;
				for (var i = 2; i < states.length; i++) {
					rep = states[i];
					re = eval("/(.*)" + states[i - 1] + "(\\.|$)(.*)/");
					url = url.replace(re, "$1\t" + rep + "$2$3");
					url = url.replace(/(\t|%09)/g, "");
					dom.preloaded[dom.preloaded.length] = new Image();
					dom.preloaded[dom.preloaded.length - 1].src = url;
				}
		    }
		}
	}
	return true;
}

function _lnk2imgs(lnk, num_children) {
	if (typeof lnk == 'undefined') return [];
	if (typeof num_children == 'undefined') {
		num_children = 1;
	}
	var doc = document;
	if (typeof lnk.document != 'undefined') {
		doc = lnk.document;
	}
	var imgs = [];
	// DOM method:
	var children = [];
	if (typeof lnk.children != 'undefined') children = lnk.children;
	if (typeof lnk.childNodes != 'undefined') children = lnk.childNodes;
	for (var i = 0; i < children.length; i++) {
		if (children[i].tagName == "IMG") imgs[imgs.length] = children[i];
	}
	// Fallback method for Netscape 4:
	// Requires combined images to form a solid rectangle, images with
	// differences in height (including vspace) don't map correctly to the
	// coordinates of the surrounding link.
	if (imgs.length == 0) {
		for (var i = 0; i < doc.images.length; i++) {
			var image = doc.images[i];
			if (typeof image.x != 'undefined'
				&& (image.x - image.hspace) == lnk.x
				&& (image.y - image.vspace) == lnk.y
			) {
				// Get children up to the number specified by num_children:
				for (var b = 0; b < num_children; b++) {
					if (b > i) last;
					imgs.push(doc.images[i - b]);
				}
			}
		}
	}
	return imgs;
}

function can_capture() {
	var re = /(.*)/;
	var str = "test";
	var str = str.replace(re, "$1");
	return (str != ("$" + "1") );
}


