﻿// These function make it easier to select xml nodes. The must be placed 
// before var Element or else prototype wont work for Element.

// mozXPath [http://km0ti0n.blunted.co.uk/mozxpath/] km0ti0n@gmail.com
// Code licensed under Creative Commons Attribution-ShareAlike License 
// http://creativecommons.org/licenses/by-sa/2.5/

var Debug =
{
	Text: '',
	Write: function(title, value)
	{
		Debug.Text += title + ': ' + value + '\r\n';
	},
	Clear: function(title, value)
	{
		Debug.Text += '';
	},
	Display: function()
	{
		alert(Debug.Text);
	}
}

if( document.implementation.hasFeature("XPath", "3.0") )
{
	XMLDocument.prototype.selectNodes = function(cXPathString, xNode)
	{
		if( !xNode ) { xNode = this; } 

		var oNSResolver = this.createNSResolver(this.documentElement)
		var aItems = this.evaluate(cXPathString, xNode, oNSResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
		var aResult = [];
		for( var i = 0; i < aItems.snapshotLength; i++)
		{
			aResult[i] =  aItems.snapshotItem(i);
		}
		
		return aResult;
	}
	XMLDocument.prototype.selectSingleNode = function(cXPathString, xNode)
	{
		if( !xNode ) { xNode = this; } 

		var xItems = this.selectNodes(cXPathString, xNode);
		if( xItems.length > 0 )
		{
			return xItems[0];
		}
		else
		{
			return null;
		}
	}

	Element.prototype.selectNodes = function(cXPathString)
	{
		if(this.ownerDocument.selectNodes)
		{
			return this.ownerDocument.selectNodes(cXPathString, this);
		}
		else{throw "For XML Elements Only";}
	}

	Element.prototype.selectSingleNode = function(cXPathString)
	{	
		if(this.ownerDocument.selectSingleNode)
		{
			return this.ownerDocument.selectSingleNode(cXPathString, this);
		}
		else{throw "For XML Elements Only";}
	}
}

/*
	element
	functions for JavaScript objects and DOM elements
*/


$ = function(id) { return Element.Get(id); } //helper function

var Element = {

	Get: function(element, documentObject) 
	{
		//documentObject (for targeting a different window, e.g. window.parent.document)
		if (typeof(element) == 'string')
		{
			documentObject = (documentObject) ? documentObject : document;
			if (document.getElementById)
				return documentObject.getElementById(element);
			else if (document.all)
				return documentObject.all[element];
		}
		else if (Element.IsObject(element))
		{
			return element;
		}
	},
	
	GetByClassName: function (className, container)
	{
		container = (container) ? container : document;
		var tags = container.getElementsByTagName('*');
		var tagClasses = null;
		var elements = new Array();
		for (i=0;i<tags.length;i++)
		{
			if (tags[i].className.indexOf(className) >= 0)
			{
				tagClasses = tags[i].className.split(' ');
				if (tagClasses.indexOf(className) >= 0)
					elements.push(tags[i]);
			}
		}
		return elements;
	},
	
	GetByTagName: function (tagName, parent)
	{
		parent = (parent) ? parent : document;
		var tags = parent.getElementsByTagName(tagName);
		var elements = new Array();
		for (i=0;i<tags.length;i++)
			elements.push(tags[i]);
		return elements;
	},
	
	GetNodeIndex: function(element)
	{
		var parent = element.parentNode.childNodes;
		for(var i=0; i < parent.length; i++)
		{
			if (element == parent[i]) return i;
		}
	},
	
	Hide: function(element)
	{
		if (Element.IsArray(element))
		{
			for (var i = 0; i < element.length; i++)
			{
				Element.Get(element[i]).style.display = 'none';
			}
		}
		else if (Element.Get(element))
		{
			Element.Get(element).style.display = 'none';
		}
	},
	
	Show: function(element, value) 
	{
		if (value == null) value = '';
		if (Element.IsArray(element))
		{
			for (var i = 0; i < element.length; i++)
				Element.Get(element[i]).style.display = value;
		}
		else
			Element.Get(element).style.display = value;
	},
	
	Disable: function(element)
	{
		if (typeof(element) == 'string')
		{
			element = Element.Get(element);
		}
		if (typeof(element.disabled) != 'undefined')
		{
			element.disabled = true;
			if (typeof(element.checked) != 'undefined')
				element.checked = false;
		}
		
		if (element.parentNode.tagName == 'LABEL')
			Element.ClassAdd(element.parentNode, 'disabled');
	},
	
	Enable: function(element)
	{
		if (typeof(element) == 'string')
		{
			element = Element.Get(element);
		}
		if (typeof(element.disabled) != 'undefined')
			element.disabled = false;
		
		if (element.parentNode.tagName == 'LABEL')
			Element.ClassRemove(element.parentNode, 'disabled');
	},
	
	IsVisible: function(id)
	{
		var elem = Element.Get(id);
		if (elem.style.display == 'none' || elem.style.visibility == 'hidden')
			return false;
			
		return true;
	},

	HideTag: function(tag) 
	{
		var tags = document.getElementsByTagName(tag);
		if (tags.length > 0)
		{
			for (i=0;i<tags.length;i++)
			{
				this.ToggleVisibility(tags[i].id, 'hidden');
			}
		}
	},
	
	ShowTag: function(tag) 
	{
		var tags = document.getElementsByTagName(tag);
		if (tags.length > 0)
		{
			for (i=0;i<tags.length;i++)
			{
				this.ToggleVisibility(tags[i].id, 'visible');
			}
		}
		
	},
	
	Toggle: function(id) 
	{
		var elem = Element.Get(id);
		if (elem.style.display.toLowerCase() == 'none')
			elem.style.display = '';
		else
			elem.style.display = 'none';
	},
	
	ToggleVisibility: function(id, value) 
	{
		var elem = Element.Get(id);
		if (value == null)
		{
			if (elem.style.visibility.toLowerCase() == 'hidden')
				elem.style.visibility = 'visible';
			else
				elem.style.visibility = 'hidden';
		}
		else
		{
			elem.style.visibility = value;
		}
		
	},
	
    ClassAdd: function(id, value)
	{
	    var element = Element.Get(id);
	    if (value != null) 
	        element.className = (isNull(element.className)) ? value : element.className + ' ' + value;
	},
	
    ClassInsert: function(id, value)
	{
	    var element = Element.Get(id);
	    if (value != null) 
	        element.className = (isNull(element.className)) ? value : value + ' ' + element.className;
	},
	
	ClassRemove: function(id, value)
	{
	    var element = Element.Get(id);
		var classes = element.className.split(' ');
		var	newClass = '';
		for(var i=0; i<classes.length; i++)
			if (classes[i] != value)
				newClass += (newClass.length > 0) ? ' ' + classes[i] : classes[i];
		element.className = newClass;
	},
	
	Remove: function (obj) 
	{
		var element = Element.Get(obj);
		if (element != null && typeof(element) == 'object') 
			element.parentNode.removeChild(element);
	},
	
	RemoveChildNodes: function(id)
	{
		var element = Element.Get(id);
		
		while (element.childNodes.length > 0)
		{
			element.removeChild(element.childNodes[0]);
		}
	},
	
	Create: function(tag, id, attributes, content)
	{
		var ieTest;
		try {
			ieTest = document.createElement('<test id="test">');
		}
		catch(err)
		{
			// Probably failed because we’re not running on IE
			ieTest = false;
		}
		var element = null;
		if (!ieTest)
		{
			//proper method..
			element = document.createElement(tag);
			if (id != null) element.id = id;
			if (Element.IsArray(attributes) && attributes.length > 0)
			{
				for(var i=0; i < attributes.length; i++)
					if (Element.IsArray(attributes[i]) && attributes[i].length == 2)
						element.setAttribute(attributes[i][0], attributes[i][1]);
			}
		}
		else
		{
			//internet explorer method..
			var attrContent = '';
			if(id != null) attrContent += ' id="' + id + '"';
			if (Element.IsArray(attributes) && attributes.length > 0)
			{
				for(var i=0; i < attributes.length; i++)
					if (Element.IsArray(attributes[i]) && attributes[i].length == 2)
						attrContent += ' ' + attributes[i][0] + '="' + attributes[i][1] + '"';
			}
			element = document.createElement('<' + tag + attrContent + ' />');
		}		
		if (content != null)
		{
			if (Element.IsObject(content))
				element.appendChild(content);
			else
				element.appendChild(document.createTextNode(content.toString()));
		}
		return element;
	},
	
	CreateRadio: function (id, name, value, checked)
	{
		if (checked)
			attrs = [ ['type', 'radio'], ['name', name], ['checked', 'checked'], ['value', value] ];
		else
			attrs = [ ['type', 'radio'], ['name', name], ['value', value] ];
	
		
		return Element.Create( 'input' , id, attrs	);
	},
	
	CreateLabelRadio: function (id, name, value, text, checked)
	{
		if (checked)
			attrs = [ ['type', 'radio'], ['name', name], ['checked', 'checked'], ['value', value] ];
		else
			attrs = [ ['type', 'radio'], ['name', name], ['value', value] ];
	
		Radio = Element.Create( 'input' , id, attrs );
		Label = Element.Create( 'label' , id + 'Label', [ ['for', id] ] , Radio)
		Label.innerHTML += text;
		
		return Label;
	},
	
	CreateLabelCheckBox: function (id, value, text, checked)
	{
	
	
		if (checked)
			attrs = [ ['type', 'checkbox'], ['checked', 'checked'], ['value', value] ];
		else
			attrs = [ ['type', 'checkbox'], ['value', value] ];
		
		CheckBox = Element.Create( 'input' , id, attrs );
		Label = Element.Create( 'label' , id + 'Label', [ ['for', id] ] , CheckBox)
		Label.innerHTML += text;
		
		return Label;
	},

	IsArray: function(obj)
	{
		return (obj != null && typeof(obj) == 'object' && obj.constructor == Array);
	},
	
	IsObject: function(obj)
	{
		return (obj && typeof(obj) == 'object');
	},
	
	InsertAfter: function (obj, newContent)
	{
		var element = Element.Get(obj);
		if (Element.IsObject(obj))
		{
			obj.parentNode.insertBefore(newContent, obj.nextSibling);
		}
	}
}
