function z_showtagsform(caller,formtarget,itemid) {
	var at = z_getEl('addtags');
	var call = z_getEl(caller);
	for (var lx=0,ly=0;call!=null;lx+=call.offsetLeft,ly+=call.offsetTop,call=call.offsetParent);
	var item = document.getElementById('itemid');
	at.style.top = (ly+20)+"px";
	at.style.left = (lx+40)+"px";
	item.value=itemid;
	at.style["display"]="block";
	var tf = z_getEl('tagsform');
	tf.action = formtarget;
    var t = z_getEl('tag'); 
    t.value = ''; 
    t.focus(); 
	//return false;
}
function z_hidetagsform() {
	var at = z_getEl('addtags');
	at.style["display"]="none";
	return false;
}
function z_updateinterests(tag) {
	var myinterests = z_getEl('interests');
	if(myinterests.innerHTML=='No interests yet.') {
		myinterests.innerHTML=tag;
	} else {
		myinterests.innerHTML+=tag;
	}
	var at = z_getEl('addtags');
	var pos = z_getPos(z_getEl('showtagslink'));
	at.style.top = (pos.y+20)+"px";
	at.style.left = (pos.x+40)+"px";
	var t = z_getEl('tag'); 
    t.value = ''; 
    t.focus(); 
	return true;
}
function z_hidediv(divid) {
	var d = z_getEl(divid);
	d.style["display"]="none";
}

function z_updateaddtag(content) {
	var d = document.getElementById('addtaglink');
	d.innerHTML=content;
}
function z_submittagform() {
	var d = document.getElementById('addtagform');
	d.submit();
	return false;
}

function ajax()
{

}

ajax.prototype.init = function()
{
	this.request = false;
	if(window.XMLHttpRequest)
	{
		this.request = new XMLHttpRequest();
		if( this.request.overrideMimeType )
		{
			this.request.overrideMimeType("text/xml");
		}
	}
	else if( window.ActiveXObject )
	{
		try
		{
			this.request = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch(e)
		{
			try
			{
				this.request = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch(e) { }
		}
	}
	if( !this.request )
	{
		// no ajax support
		return false;
	}
}
var ajreq;
// ajax class from cameron
ajax.prototype.get = function(url, func)
{
	this.init();
	this.request.onreadystatechange = func;
	this.request.open('GET', url, true);
	this.request.send(null);
}
var params;
ajax.prototype.post = function(url, params, func)
{
	this.init();
	this.request.onreadystatechange = func;
	this.request.open('POST', url, true);
	this.request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	this.request.setRequestHeader("Content-length", params.length);
	this.request.setRequestHeader("Connection", "close");
	this.request.send(params);
}
// end ajax class

function AutoSuggest(elem, suggestions)
{
	var me = this;
	this.elem = elem;
	this.suggestions = suggestions;
	this.eligible = new Array();
	this.inputText = null;
	this.highlighted = -1;
	this.div = document.getElementById("autosuggest");
	this.numletters = 0;
	this.count=0;
	var TAB = 9;
	var ESC = 27;
	var KEYUP = 38;
	var KEYDN = 40;
	var RET = 13;
	var BCKSP = 8;
	elem.setAttribute("autocomplete","off");
	if(!elem.id)
	{
		var id = "autosuggest" + idCounter;
		idCounter++;

		elem.id = id;
	}
	elem.onkeydown = function(ev)
	{
		var key = me.getKeyCode(ev);

		switch(key)
		{
			case TAB:
			me.useSuggestion();
			break;
	
			case RET:
			me.useSuggestion();
			me.hideDiv();
			return false;
			break;

			case ESC:
			me.hideDiv();
			break;

			case KEYUP:
			if (me.highlighted > 0)
			{
				me.highlighted--;
			}
			me.changeHighlight(key);
			break;

			case KEYDN:
			if (me.highlighted < (me.eligible.length - 1))
			{
				me.highlighted++;
			}
			me.changeHighlight(key);
			break;
		}
	};
	elem.onkeyup = function(ev) 
	{
		var key = me.getKeyCode(ev);
		switch(key)
		{
		//The control keys were already handled by onkeydown, so do nothing.
		case TAB:
		case ESC:
		case RET:
		case KEYUP:
		case KEYDN:
			return;
		default:
			
			if (this.value != me.inputText && this.value.length > 1)
			{
				if(this.numletters==1 && this.value.length==2) {
					me.getSuggestions(this.value);
				}
				this.numletters = this.value.length;
				me.inputText = this.value;
				if(this.value.length > 2 || (this.value.length == 2 && key==BCKSP)) {
					me.getEligible();
					me.createDiv();
					me.positionDiv();
					if(me.eligible.length>0) {
						me.showDiv();
					} else {
						me.hideDiv();
					}
				}
			}
			else
			{				
				this.numletters = this.value.length;
				me.hideDiv();
			}
		}
	};
	this.useSuggestion = function()
	{
		if (this.highlighted > -1)
		{
			this.elem.value = this.eligible[this.highlighted];
			this.hideDiv();
			setTimeout("document.getElementById('" + this.elem.id + "').focus()",0);
		}
	};
	this.showDiv = function()
	{
		this.div.style.display = 'block';
	};
	this.hideDiv = function()
	{
		this.div.style.display = 'none';
		this.highlighted = -1;
	};
	this.changeHighlight = function()
	{
		var lis = this.div.getElementsByTagName('LI');
		for (i=0;i<lis.length;i++)
		{
			var li = lis[i];

			if (this.highlighted == i)
			{
				li.className = "selected";
			}
			else
			{
				li.className = "";
			}
		}
	};
	this.positionDiv = function()
	{
	};
	this.createDiv = function()
	{
		var ul = document.createElement('ul');
	
		//Create an array of LI's for the words.
		for (i=0;i<this.eligible.length;i++)
		{
			if(i>25) break;
			var word = this.eligible[i];
			var li = document.createElement('li');
			var a = document.createElement('a');
			a.href="javascript:false";
			a.innerHTML = word;
			li.appendChild(a);
	
			if (me.highlighted == i)
			{
				li.className = "selected";
			}
	
			ul.appendChild(li);
		}
	
		this.div.replaceChild(ul,this.div.childNodes[0]);
		ul.onmouseover = function(ev)
		{
			//Walk up from target until you find the LI.
			var target = me.getEventSource(ev);
			while (target.parentNode && target.tagName.toUpperCase() != 'LI')
			{
				target = target.parentNode;
			}
		
			var lis = me.div.getElementsByTagName('LI');
			
	
			for (i in lis)
			{
				var li = lis[i];
				if(li == target)
				{
					me.highlighted = i;
					break;
				}
			}
			me.changeHighlight();
		};
		ul.onclick = function(ev)
		{
			me.useSuggestion();
			me.hideDiv();
			me.cancelEvent(ev);
			return false;
		};	
		this.div.className="suggestion_list";
	};
	this.getEligible = function()
	{
		this.eligible = new Array();
		for (i in this.suggestions) 
		{
			var suggestion = this.suggestions[i];
			
			if(typeof(suggestion)=='string' && suggestion.toLowerCase().indexOf(this.inputText.toLowerCase()) == "0")
			{
				this.eligible[this.eligible.length]=suggestion;
			}
		}
	};
	this.getKeyCode = function(ev)
	{
		if(ev)			//Moz
		{
			return ev.keyCode;
		}
		if(window.event)	//IE
		{
			return window.event.keyCode;
		}
	};
	this.getEventSource = function(ev)
	{
		if(ev)			//Moz
		{
			return ev.target;
		}
	
		if(window.event)	//IE
		{
			return window.event.srcElement;
		}
	};

	this.cancelEvent = function(ev)
	{
		if(ev)			//Moz
		{
			ev.preventDefault();
			ev.stopPropagation();
		}
		if(window.event)	//IE
		{
			window.event.returnValue = false;
		}
	}
	this.getSuggestions = function(twochars)
	{
		ajreq = false;
		ajreq = new ajax;
		ajreq.post("ajax/", "cmd=autosuggest&twochars="+ escape(twochars), this.ajax_response_autosuggest);
	}
	this.ajax_response_autosuggest = function() {
		if( ajreq.request.readyState == 4 )
		{
			if( ajreq.request.status == 200 )
			{
				if(ajreq.request.responseText=="<suggestions>0</suggestions>")
				{} else {
					var results = ajreq.request.responseText.substring(13,ajreq.request.responseText.length-14);
					eval('me.suggestions=new Array('+results+');');
					me.getEligible();
					me.createDiv();
					me.positionDiv();
					me.showDiv();					
				}
			}
			else
			{
				window.status="an error occurred while fetching suggestions: "+ajreq.request.status;
			}
		}
		else
		{
			// not ready yet, still processing.
		}
	}
}
var idCounter = 0;

// remote scripting library
// (c) copyright 2005 modernmethod, inc

		var sajax_debug_mode = false;
		var sajax_request_type = "GET";
		
		function sajax_debug(text) {
			if (sajax_debug_mode)
				alert("RSD: " + text)
		}
 		function sajax_init_object() {
 			sajax_debug("sajax_init_object() called..")
 			
 			var A;
			try {
				A=new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					A=new ActiveXObject("Microsoft.XMLHTTP");
				} catch (oc) {
					A=null;
				}
			}
			if(!A && typeof XMLHttpRequest != "undefined")
				A = new XMLHttpRequest();
			if (!A)
				sajax_debug("Could not create connection object.");
			return A;
		}
		function sajax_do_call(func_name, args) {
			var i, x, n;
			var uri;
			var post_data;
			
			uri = "";
			if (sajax_request_type == "GET") {
				if (uri.indexOf("?") == -1) 
					uri = uri + "?rs=" + escape(func_name);
				else
					uri = uri + "&rs=" + escape(func_name);
				for (i = 0; i < args.length-1; i++) 
					uri = uri + "&rsargs[]=" + escape(args[i]);
				uri = uri + "&rsrnd=" + new Date().getTime();
				post_data = null;
			} else {
				post_data = "rs=" + escape(func_name);
				for (i = 0; i < args.length-1; i++) 
					post_data = post_data + "&rsargs[]=" + escape(args[i]);
			}
			
			x = sajax_init_object();
			x.open(sajax_request_type, uri, true);
			if (sajax_request_type == "POST") {
				x.setRequestHeader("Method", "POST " + uri + " HTTP/1.1");
				x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			}
			x.onreadystatechange = function() {
				if (x.readyState != 4) 
					return;
				sajax_debug("received " + x.responseText);
				
				var status;
				var data;
				status = x.responseText.charAt(0);
				data = x.responseText.substring(2);
				if (status == "-") 
					alert("Error: " + data);
				else  
					args[args.length-1](data);
			}
			x.send(post_data);
			sajax_debug(func_name + " uri = " + uri + "/post = " + post_data);
			sajax_debug(func_name + " waiting..");
			delete x;
		}
		
				
		// wrapper for sajax_update		
		function x_sajax_update() {
			sajax_do_call("sajax_update",
				x_sajax_update.arguments);
		}
