//------------------------------------------------------------------
// Cygnet Web Controls Toolkit
// Cross-platform EMCAScript functions
//
// ©2003 Cygnet Solutions Ltd
//
// Bunch of functions to allow nearly-standards-compliant DOM scripting, even
// with Internet Explorer. Tested on IE6 & Firefox0.8
//------------------------------------------------------------------

// Curse Microsoft; curse them; curse them.
var agt = navigator.userAgent.toLowerCase();
var hackForMicrosoft = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));

function visible_if(name, P){
	$(name).style.display = P ? '' : 'none';
}
function enabled_if(name, P){
	$(name).disabled = !P;
}

function is_checked(name) {
	return $(name).checked;
}

function joinStrings(a, sep, b){
	if (a && b) {
		return a + sep + b;
	}else if (a) {
		return a
	}else if (b) {
		return b;
	} else {
		return "";
	}
}

function uriParameters(params){
	var a = new Array(); var i = 0;
	for(var k in params){
		if (typeof(params[k]) != "function") {
			a[i++] = encodeURIComponent(k) + "=" + encodeURIComponent(params[k]);
		}
	}
	return a.join("&");
}
function uriAddParameters(uri, params){
	if (typeof(params) != 'string')
		params = uriParameters(params);
		
    return uri + ((uri.indexOf("?") == -1) ? '?' : '&') + params;
}

function replaceChildNodes(node, newChildren){
	while(node.hasChildNodes()){
		node.removeChild(node.lastChild);
	}
	for(var i = 0; i < newChildren.length; i++){
		var n = newChildren[i].cloneNode(true);
		node.appendChild(n);
	}
}
function innerXML(node){
	var content = '';
	if (node.hasChildNodes()){
		var children = node.childNodes;
		for(var i = 0; i < children.length; i++){
			content += outerXML(children[i]);
		}
	}
	return content;
}
function outerXML(node){
	switch(node.nodeType){
		case 3: case 4:
			return node.data;
		case 1:
			var xml = '<' + node.tagName;
			var attrs = node.attributes;
			for(var i =0; i < attrs.length; i++){
				var attr = attrs[i];
				xml += ' ' + attr.name + '="' + attr.value + '"';
			}
			var content = innerXML(node);
			if (content != '') {
				xml += '>' + content + '</' + node.tagName+'>';
			}else{
				xml += '/>';
			}
			return xml;
	}
}

function cloneXML(node, doc) {
	switch(node.nodeType){
		case 3: 
			return doc.createTextNode(node.data);
		case 4:
			return doc.createCDATASection(node.data);
		case 1:
			if (hackForMicrosoft) return cloneXMLElement_hackForMicrosoft(node, doc);
			var newNode;
			newNode = doc.createElement(node.tagName);
			var attrs = node.attributes;
			for(var i = 0; i < attrs.length; i++){
				var attr = attrs[i];
				var v = attr.value;
				newNode.setAttribute(attr.name, v);
			}
			cloneInnerXML(node, doc, newNode);
			return newNode;
	}
}
function cloneXMLElement_hackForMicrosoft(node, doc){
	if (node.tagName == 'input'){
		return doc.createElement(outerXML(node));
	}else{
		var newNode = doc.createElement(node.tagName);
		var attrs = node.attributes;
		for(var i = 0; i < attrs.length; i++){
			var attr = attrs[i];
			var v = attr.value, n = attr.name;
			if (n.indexOf("on") == 0) {
				v = new Function("", v);
				newNode[n] = v;
			}else
				switch(n) {
					case 'id': newNode.id = v; break;
					case 'class': newNode.className = v; break;
					case 'colspan': newNode.colSpan = v; break;
					case 'rowspan': newNode.rowSpan = v; break;
					case 'style': newNode.style.cssText = v; break;
					case 'name': newNode.name = v; break;
					case 'value': newNode.value = v; break;
					case 'type': newNode.type = v; break;
					case 'for': newNode.htmlFor = v; break;
					default: 
						newNode.setAttribute(n, v);
				}
		}
		var tagName = node.tagName;
		
		if (tagName == 'textarea'){
			newNode.value = innerXML(node);
			
		}else if (tagName=='script') {
			newNode.text = innerXML(node);
			
		}else{
			cloneInnerXML(node, doc, newNode);
		}
		return newNode;
	}
}

function cloneInnerXML(node, doc, dest) {
	if (dest == null)
		dest = doc.createDocumentFragment();
	if (node.hasChildNodes()){
		var children = node.childNodes;
		for(var i = 0; i < children.length; i++){
			dest.appendChild(cloneXML(children[i], doc));
		}
	}
	return dest;
}

function revitaliseNode(root){
return;
	var allElements = root.getElementsByTagName("*");
	var m = allElements.length;
	for(var j = 0; j < m; j++){
		var node = allElements[j];
		var attrs = node.attributes;
		var n = attrs.length;
		for(var i = 0; i < n; i++){
			var attr = attrs[i];
			var v = attr.value;
			if (attr.name.indexOf("on") == 0 && v != null && v != 'null'/* for IE */ && v != ''){
			alert(v);
				var thing = v;
				node[attr.name] = new Function("", v);
			}
		}
	}
}

if (Ajax.call == null) {
	Ajax.call = function(uri, getparameters, postparameters, oncomplete) {
		if (typeof(getparameters) != 'string')
			getparameters = uriParameters(getparameters);
			
        uri += ((uri.indexOf("?") == -1) ? '?' : '&') + getparameters;
		new Ajax.Request(uri, {
			method: (postparameters == null ? 'get' : 'post'), 
			parameters: postparameters,
			onComplete: function(req){
				var actionSuccess = null;
				try {
					actionSuccess = req.getResponseHeader("X-Action-Success");
				}catch(e){ /* Ignore failure to get response header */ }
				if (actionSuccess == '') actionSuccess = null; // IE returns '' instead of null

				if (req.status == 200 && actionSuccess != null){
					oncomplete(req, Math.round(actionSuccess));
				}else{
					// Need to defer this for the sake of IE.
					window.setTimeout(function(){
						var d = document.open("text/html", "replace");
						d.write(req.responseText);
						d.close();
					},0);
				}
			}
		});
	}
}

function AddEventListener(o, et, f, b){
	if (o.addEventListener){
		o.addEventListener(et, f, b);
	}else {
		var eventname = "on"+et;
		if (o.attachEvent){
			o.attachEvent(eventname, function(){
				var evt = window.event;
				evt.expando = true;
				evt.target = evt.srcElement;
				evt.currentElement = this;
				evt.returnValue = true; // by default;
				evt.stopPropagation = function(){this.cancelBubble = true;};
				evt.preventDefault = function(){this.returnValue = false;};
				f(evt);
			});
		}else{
			// Cannot do anything useful.
		}
	}
}
function EventTarget(evt){
	evt = (evt) ? evt : ((window.event) ? window.event : null);
	return (evt.target) ? evt.target : evt.srcElement;
}

function ElementHasClass(e, classname){
	var classes = e.className;
	if (classes == '' || classes.length < classname.length)  return false;
	if (classes == classname) return true;
	if (classes.indexOf(' ')) return false;
	for(var c in classes.split(' ')){
		if (c == classname) return true;
	}
	return false;
}

function ElementsWithClass(root, classname){
	var allElements = root.getElementsByTagName("*");
	var result = Array(), i = 0;
	for(var e in allElements){
		if (ElementHasClass(e, classname)){
			result[i++] = e;
		}
	}
	return result;
}

function SetInitialFocus(elementID) {
	AddEventListener(
		window, 
		"load", 
		function(e) {
			var o = document.getElementById(elementID);
			if (o == null) return;
			o.focus();
		},
		false);
}

function SetDefaultText(elementID) {
	AddEventListener(
		window, 
		"load", 
		function(e) {
			var el = $(elementID);
			AddEventListener(
				el, "focus",
				function(e) {
					el.style.color = "#000";
					if (el.value == el.defaultValue) el.value = "";
				}, false);
			AddEventListener(
				el, "blur",
				function(e) {
					if (el.value == "") {
						el.style.color = "#888";
						el.value = el.defaultValue;
					}
				}, false);
			AddEventListener(
				el.form, "submit",
				function(e) {
					if (el.value == el.defaultValue) el.value = "";
				}, false);
			if (el.value == el.defaultValue){
				el.style.color = "#888";
			}
		},
		false);
}
