function ajax_pull( in_uri ) {
	XMLReq.pullURI( in_uri, function ( ) { } );
	return true;
	}

var XMLReq = new Object( );

XMLReq.test = function( ) {
	var r = new Object( );
	if( window.XMLHttpRequest )
		r.xr = new XMLHttpRequest( );
	else
		r.xr = new ActiveXObject( 'Microsoft.XMLHTTP' );
		
	if( r.xr ) return true;
	
	return false;
	}

XMLReq.openThreads = 0;

XMLReq.openThread = function( ) {
	this.openThreads++;
	if( this.threadCallback ) {
		this.threadCallback( this.openThreads );
		}
	}

XMLReq.closeThread = function( ) {
	if( this.openThreads ) {
		this.openThreads--;
		}
	else {
		alert(
			'XMLReq: Attempted to close a thread, but no threads are open!' 
			);
		}
	
	if( this.threadCallback ) {
		this.threadCallback( this.openThreads );
		}
	}

var _w = null;
	
var _lisk		= null;
var _renderN		= 0;
var _renderNlert	= false;	
function lisk_render( obj, open, pre, path ) {
	if( _renderN > 2500 ) return;

	if( !path ) path = '';
	if( !pre ) pre = '';
	
	var	out		= [];
	var wval	= new Array( );
	var nval	= new Array( );
	var fval	= new Array( );
	
	if( typeof( obj ) == 'number' ) {
		return pre + '&middot; <strong> num</strong> ' + obj;
		}
	if( typeof( obj ) == 'string' ) {
		return pre + '&middot; <strong> str `</strong>' + obj + '\'</strong>';
		}
	if( typeof( obj ) == 'undefined' ) {
		return pre + '&middot; <strong>undf</strong> ' + obj;
		}
	if( typeof( obj ) == 'boolean' ) {
		return pre + '&middot; <strong>bool</strong> ' + obj;
		}
	
	
	for( var k in obj ) {
		if( obj[ k ] ) {
			if( typeof( obj[ k ] ) == 'function' ) {
				if( !in_array( k, fval ) ) {
					fval.push( k );
					}
				}
			else
			if( !in_array( k, wval ) ) {
				wval.push( k );
				}
			}
		else {
			if( !in_array( k, nval ) ) {
				nval.push( k );
				}
			}
		}

	_renderN = _renderN + wval.length + nval.length + fval.length;
	if( _renderN > 2500 ) {
		if( !_renderNlert ) {
			_renderNlert = true;
			alert( '_renderN > 2500, recursion?' );
			}
		return;
		}
	
	wval.sort();
	nval.sort();
	fval.sort();
	
	if( wval.length + nval.length + fval.length == 0 ) {
		return pre + '&middot; <strong>null</strong>';
		}
	
	var ii = 0;
	var a;
	for( var k in wval ) {

		a =   '<a href="#" onclick="return lisk_toggle( \'' + path + ii + '\' );">'
			+ wval[ k ]
			+ '</a>';

		out.push( pre + '+ ' + a );

		if( _lisk._open_all || in_array( path + ii, open ) ) {
			out.push(
				lisk_render(
					obj[ wval[ k ] ],
					open,
					pre + '  ',
					path + ii + ';'
					)
				);
			}
		
		ii++;
		}

	for( var k in fval ) {

		a =   '<a href="#" onclick="return lisk_toggle( \''
				+ path + ii
			+ '\' );">'
			+ fval[ k ]
			+ '</a>';

		var n = 0;
		for( var q in obj[ fval[ k ] ] ) n++;
		
		if( n == 0 ) a = fval[ k ] + '()';

		out.push( pre + '&fnof; ' + a );

		if( _lisk._open_all || in_array( path + ii, open ) ) {
			out.push(
				lisk_render(
					obj[ fval[ k ] ],
					open,
					pre + '  ',
					path + ii + ';'
					)
				);
			}
		
		ii++;
		}


	for( var k in nval ) {
		out.push( pre + '<em>- ' + nval[ k ] + '</em>' );
		}
		
	return out.join( "\n" );
	}
	
function lisk_toggle( t ) {
	if( !_lisk ) alert( 'No lisk?' );

	if( t == 'all' ) {
		_lisk._open_all = !_lisk.open_all;
		}
	else {
		if( in_array( t, _lisk._open ) ) {
			for( var k in _lisk._open ) {
				if( _lisk._open[ k ] == t ) {
					_lisk._open[ k ] = null;
					}
				}
			}
		else {
			_lisk._open.push( t );
			}
		}
		
	_lisk.update( );
	}
	
		
function write_obj( o ) {

	if( !_lisk ) {
		document.body.appendChild(
			_lisk = document.createElement( 'div' )
			);
		
		_lisk.id = 'liskCore';
		if( !(_lisk._baseWidth = parseInt( getCookie( 'lisk_base_width' ))) ) {
			_lisk._baseWidth = 250;
			}
		_lisk.style.width = _lisk._baseWidth + 'px';
		
		_lisk.appendChild(
			_lisk._bar = document.createElement( 'div' )
			);
		
		_lisk._bar.id = 'liskBar';
		_lisk._bar._lisk = _lisk;

		_lisk._bar.onmousedown = function( e ) {
			this._orig_x = getEventX( getEvent( e ) );
			this._move = true;
			}

		_lisk._bar.onmouseup = function( e ) {
			setCookie( 'lisk_base_width', this._effwidth );
			_lisk._baseWidth = this._effwidth;
			this._move = false;
			}
			
		_lisk._bar.onmousemove = function( e ) {
			if( this._move ) {
				var nx = getEventX( getEvent( e ) );
				this._lisk.style.width
					= (_lisk._baseWidth - (nx - this._orig_x)) + 'px';
				this._effwidth = (_lisk._baseWidth - (nx - this._orig_x));
				}
			return true;
			}

		document.onmousemove = chainHandlers(
			function( e ) { _lisk._bar.onmousemove( e ); },
			document.onmousemove
			);
		
		document.onmouseup = chainHandlers(
			function( e ) { _lisk._bar.onmouseup( e ); },
			document.onmouseup
			);
			

		_lisk.appendChild(
			_lisk._view = document.createElement( 'div' )
			);
			
		_lisk._view.id = 'liskView';
		
		_lisk._open_all = false;
		_lisk._open = [];
		_lisk.update = function( ) {

			var x = 
				  '<a href="#" onclick="return lisk_toggle(\'all\');">[All]</a>'
				+ "\n\n"
				;

			_renderN = 0;
			setHTML( this._view, x + lisk_render( this._obj, this._open ) );
			}
		
		}
		
		
	_lisk._obj = o;
	lisk_toggle( null );
//	_lisk.update( );
	
/*	var key = keys( o ).sort( );

	var out = '';
	var ii = 0;
	for( var k in key ) {
		var a = '<a href="#" onclick="return lisk_open( ' + ii + ' );">'
			+ key[ k ] + '</a>';
	
		if( o[ key[ k ] ] ) {
			out = out + "\n" + '+ ' + a;
			}
		else {
			out = out + "\n" + '<em>- ' + key[ k ] + '</em>';
			}

		ii++;
		}
*/
//	setHTML( _lisk._view, lisk_render( o ) );
	
		
		
//	var cxt = _w.document.context;
//	var doc = _w.document;
		

//	var s;
	
//	setText( cxt, 'hey sup' );//string_obj( o, '' ) );
	}
	
function string_obj( o, d ) {
	var s = '';
	
	if( typeof(o) == 'object' ) {
		var p = [];
		for( var k in o ) {
			p.push( k );
			}
		p.sort();
		s = s + p.join( "\n" );
			
		}
	else {
		s = s + "\n" + d + '- ' + o;
		}

	return s;
	}



/*function debug_out( obj ) {
	
	alert( obj );
	
	var d;
	document.body.appendChild(
		d = document.createElement( 'div' )
		);

	var s = '';
	for( var k in obj ) {
		s = s + "\n" + k + ': ' + obj[ k ];
		setText( d, s );
		}
		
	alert( s );
	
	}
*/

XMLReq.objectify = function( xml ) {

	if( !xml.firstChild ) return xml.nodeValue;
	
	var s = new Array( );
	var v = '';
	var r = null;
	var n = xml.firstChild;

	do {
		r = XMLReq.objectify( n );
		if( typeof( r ) != 'object' ) {
			v += r;
			}
		else {
			s.push( r );
			}
		} while( n.nextSibling && (n = n.nextSibling) );
	
	var o = new Array( );

	if( s.length == 0 ) {
		o = v;
		}
	else {
		for( var k = 0; k < s.length; k++ ) {
			if( s[k] ) {
				for( var l in s[k] ) {
					if( objlen( s[k] ) == 1 ) {
						if( typeof( s[k][l] ) != 'object' ) {
							o[ l ] = s[k][l];
							break;
							}
						}
					if( !o[ l ] ) {
						o[ l ] = new Array( );
						}
					
					if( is_array( o[ l ] ) )
						o[ l ].push( s[k][l] );
					}
				}
			}
		}
	
	var x = new Array( );
	x[ xml.nodeName ] = o;
	
	return x;
	}

XMLReq.stateChange = function( obj ) {
	if( obj.xr.readyState == 4 ) {
		if( obj.xr.status == 200 ) {
			
			if( !obj.xr.responseXML ) {
				console.log( 'The resource did not return XML.' );
				obj.func( null );
				return;
				}
		    
			var d = XMLReq.objectify( obj.xr.responseXML );
			if(	d[ '#document' ]
			&&	d[ '#document' ].response
			&&	d[ '#document' ].response[0] ) {
				obj.func( d[ '#document' ].response[0] );
				}
			else {
				obj.func( null );
				}

			this.closeThread( );
			}
		else if( obj.xr.status == 404 ) {
			alert( 'The requested resource was not found (404).' );
			}
		else if( obj.xr.status ) {
			alert(
				'An error occurred when attempting to retrieve '
			+	'XML data: ' + obj.xr.status
				);
			}
		}
	}

XMLReq.newRequest = function( ) {
	var r = new Object( );
	if( window.XMLHttpRequest )
		r.xr = new XMLHttpRequest( );
	else
		r.xr = new ActiveXObject( 'Microsoft.XMLHTTP' );
		
	if( !r.xr ) {
		alert(
			'This action requires XMLHTTP support, but it is not available.'
			);
		}
		
	r.xr.onreadystatechange = function( ) { XMLReq.stateChange( r ); }

	return r;
	}
		
	
XMLReq.pullURI = function( uri, in_func ) {
	var obj = this.newRequest( );
		
	this.openThread( );
	obj.func = in_func;
	obj.xr.open( 'POST', uri, true );
	obj.xr.send( null );
	}

XMLReq.getValue	= function( obj, key ) {
	if( !obj )
		return false;
	var r = obj.getElementsByTagName( key )[ 0 ];
	if( r ) {
		if( r.childNodes.length > 1 )
			return r.childNodes[1].nodeValue;
		else
		if( r.firstChild )
			return r.firstChild.nodeValue;
		}
	return '';		
	}
	
XMLReq.getObjArr = function( obj, key ) {
	if( !obj || !obj.responseXML )
		return false;
	else
		return obj.responseXML.getElementsByTagName( key );
	}

