var debugMode = false;

function ActivaUpdater( uri, data, handlerFunc, postFunc, target )
{
	var toolkit 		= new nodeHelper();
	var uri 			= uri;
	var data 			= data;
	var handlerFunc 	= handlerFunc;
	var postFunc		= postFunc;
	var xmlBaseTag 		= "lu";
	
	if ( !target ) {
		var target = document;
	} else {
		var target = target;
	}
	
	function getRequester() 
	{	
		if ( window.XMLHttpRequest ) {
			return new XMLHttpRequest();
	
		} else if ( window.ActiveXObject ) {
			try {
				return new ActiveXObject( "Msxml2.XMLHTTP" );
	
			} catch ( error ) {
				try {
					return new ActiveXObject( "Microsoft.XMLHTTP" );
	
				} catch ( error2 ) {
					return false;
				}
			}
		}
	}
	
	
	function getReadyStateHandler( requester, xmlHandler ) 
	{
		return function () 
		{
			if ( requester.readyState == 4 ) {     
				if ( requester.status == 200 ) {
					try {
						var xml = requester.responseXML;        

					} catch( e ) {
						if ( debugMode ) {
							alert (requester.responseText);  		
						}   
						
						return false;
					}						
					//alert (requester.responseText);
					xmlHandler( xml );
	
				} else {
					if ( debugMode == true ) {
						alert( "An error occurred: "+requester.status );
					}
				}
			}
		}
	}
	

	function makeXMLRequest() 
	{
		var requester = getRequester();
			
		var handlerFunction = getReadyStateHandler( requester, handleXML );
		
		requester.onreadystatechange = handlerFunction;
		
		requester.open( "POST", uri, true );
		requester.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded" );		
		requester.send( "junk=1"+data );
	}
	
	
	function handleXML( xml )
	{		
		var body = xml.getElementsByTagName(xmlBaseTag);
		    
		if ( body.length > 0 ) {
			var nodes = body[0].childNodes;
			for ( var i=0; i < nodes.length; i++ ) {
				try {
					if ( nodes[i].nodeType == 1 && nodes[i].getAttribute("id") != null ) {
						var id = nodes[i].getAttribute("id");
		          		
						if ( handlerFunc ) {
							handlerFunc( nodes[i], id );
								
						} else if ( nodes[i].nodeName == "select" ) {
							toolkit.handleSelect( nodes[i], id );
							
						} else if ( nodes[i].nodeName == "optionSelect" ) {
							toolkit.optionSelect( id, nodes[i].nodeType );
						
						} else if ( nodes[i].nodeName == "input" ) {
							toolkit.handleInput(id, nodes[i]);
							
						} else if ( document.all && nodes[i].nodeName == 'tr' ) {
							toolkit.handleTr( id, nodes[i] );
							
						} else {
							element = document.getElementById(id);
							while (element.firstChild) {
							  element.removeChild(element.firstChild);
							}
							
							toolkit.walk(nodes[i], element);
						}
						
					} else if ( nodes[i].nodeName == "script" ) {
						toolkit.handleScripts( nodes[i] );
					}	
				} catch (e) {
					try {
						console.warn(e)
					} catch (e2) {
						
					}
				}
			}
		}

		if ( postFunc ) {	
			postFunc();	
		}
	}
	
	makeXMLRequest();
}


function nodeHelper()
{	
	this.flatten = function( node )
	{
		var returnStr = "";
		
		if ( node.nodeType == 1 ) {
			switch ( node.nodeName ) {
				case "br":
					returnStr += "<br />";	
					break;
					
				case "img":
					returnStr += '<' + node.nodeName + this.flattenAttributes( node ) + ' />';
					break;
					
				case "input":
					returnStr += '<' + node.nodeName + this.flattenAttributes(node) + ' />';
					break;
					
				default:			
					returnStr += '<' + node.nodeName + this.flattenAttributes( node ) + '>';					
					returnStr += this.flattenChildren( node.childNodes );					
					returnStr += '</' + node.nodeName + '>';
					break;
			}
			
		} else if ( node.nodeType == 3 ) {
			returnStr += node.nodeValue;
		}
		
		return returnStr;
	}
	
	this.flattenChildren = function( nodes )
	{
		var buffer = '';
		
		if ( nodes.length > 0 ) {
			for ( var i=0; i < nodes.length; i++ ) {				
				buffer += this.flatten(nodes[i]);
			}
		}
		
		return buffer;
	}	
	
	this.flattenAttributes = function( node )
	{
		var buffer = "";
	  
		for ( var i=0; i < node.attributes.length; i++ ) {
			var attribute = node.attributes[i];
			buffer += ' '+attribute.name+'="'+attribute.value+'"'
		}
		
		return buffer;
	}
	
	this.copyAttributes = function( source, destination )
	{
		for ( var i=0; i < source.attributes.length; i++ ) {
			var attribute = source.attributes[i];
			destination.setAttribute( attribute.name, attribute.value );
		}
		
		destination.className = source.getAttribute('class');
	}
	
	this.handleTr = function( id, subtree )
	{
		var parentElement = document.getElementById( id );
		
		for ( var i=parentElement.childNodes.length-1; i >= 0; i-- ) {
			parentElement.removeChild( parentElement.childNodes[i] );
		}
	
		for ( var i=0; i < subtree.childNodes.length; i++ ) {
			var cell = document.createElement( subtree.childNodes[i].nodeName );
			
			copyAttributes( subtree.childNodes[i], cell );
			cell.innerHTML = urldecode( flattenChildren( subtree.childNodes[i].childNodes ) );
			parentElement.appendChild(cell);
		}
	}
	
	this.handleInput = function(id, node)
	{
		if ( document.getElementById(id) && node.firstChild ) {
			document.getElementById(id).value = this.urldecode(node.firstChild.nodeValue);
		}
	}
	
	this.handleSelect = function( node, id )
	{
		optNodes = node.getElementsByTagName( 'option' );
		targetBox = document.getElementById( id );
		targetBox.length = 0;
		
		if ( optNodes.length > 0 ) {
			for ( var x=0; x < optNodes.length; x++ ) {
				var loadingOption = document.createElement( 'option' );
				
				if ( optNodes[x].attributes ) {
					for ( var j=0; j < optNodes[x].attributes.length; j++ ) {
						if ( optNodes[x].attributes[j].name == 'selected' ) {
							loadingOption.selected = true;
						}
					}
				}

				targetBox.appendChild( loadingOption );
				loadingOption.value = this.urldecode(optNodes[x].getAttribute("value"));
				/* Was having issues with IE displaying weird characters in select box, turned
				   out to be whitespace, so I just have it running this trim function on the text.
				 */
				loadingOption.text = this.urldecode(trim(optNodes[x].firstChild.nodeValue));
	
				targetBox.disabled=false;	 
			}
		}
	}	
	
	this.handleScripts = function( node )
	{		
		if ( node.firstChild != null ) {
			var script = node.firstChild.nodeValue;
					
			if ( script != null ) {
				scriptArr = script.split( ";" );
				for ( var i=0; i < scriptArr.length - 1; i++ ) {
					eval( scriptArr[i]+";" );
				}
			}
		}

	}

	this.urlencode = function( str ) 
	{
		return escape( str ).replace( /[+]/g, '%2B' );
	}

 	this.urldecode = function( str ) 
 	{
		return unescape( str ).replace( /[+]/g, ' ' );
	}
	
	this.optionSelect = function( id, value )
	{
		var box = document.getElementById( id );
		var boxSize = box.options.length;
		
		for ( var i=0; i < boxSize; i++ ) {
			if (  box.options[i].value == value ) {
				box.options[i].selected = true;
			}
		}
	}
	

	this.compressData = function( field, value ) 
	{
		return "&"+field+"="+this.urlencode( value );
	}
	
	this.walk = function(node, element)
	{
		var nodes = node.childNodes;
		
		for ( var i=0; i < nodes.length; i++ ) {
			if ( nodes[i].nodeType != 3 ) {
				var newnode = document.createElement(nodes[i].nodeName);
				if ( nodes[i].attributes ) {
					for ( var j=0; j < nodes[i].attributes.length; j++ ) {
						if ( nodes[i].attributes[j].name == 'class' ) {
							newnode.className = this.urldecode(nodes[i].attributes[j].value);
						} else if ( nodes[i].attributes[j].name.toLowerCase() == 'onclick' ) {
							var string = nodes[i].attributes[j].value;
							
							newnode.onclick=function(e) {
								//event = e;
								var returnValue123 = true;
	    						eval(string.replace('return ',' returnValue123 = '));
	    						return returnValue123;
							};
						} else {
							newnode.setAttribute(nodes[i].attributes[j].name, this.urldecode(nodes[i].attributes[j].value));
						}
					}
				}
				
				element.appendChild(newnode);
				
				/* For some reason, IE doesn't respect the checked attribute until
				   after you append the node, so the current workaround is to loop
				   through it at again and check it manually.
				 */
				if ( nodes[i].attributes ) {
					for ( var j=0; j < nodes[i].attributes.length; j++ ) {
						if ( nodes[i].attributes[j].name == 'checked' ) {
							newnode.checked = true;
						}
					}
				}
				
				if ( nodes[i].childNodes.length > 0 ) {
					if ( nodes[i].nodeName == 'table' ) {
						if ( nodes[i].childNodes[0] ) {
							if ( nodes[i].childNodes[0].nodeName != 'tbody' ) {
								var tbody = document.createElement('TBODY');
								
								newnode.appendChild(tbody);
								newnode = tbody;
							}
						}
					}
					this.walk(nodes[i], newnode);
				}
			} else {
				var newnode = document.createTextNode(this.urldecode(nodes[i].nodeValue));
				element.appendChild(newnode);
			}
		}
	}
}

nh = new nodeHelper();
