function get_value(id)
{
	var el=document.getElementById(id+'_value');
	switch (el.class_type)
	{
		case 'datetime':
		{
		}
		break;

		default:
		{
			return el.innerHTML;
		}
		break;
	}
	return null;
}

function set_value(id, val)
{
	var el=document.getElementById(id+'_value');
	switch (el.class_type)
	{
		case 'datetime':
		{
		}
		break;

		default:
		{
			el.innerHTML=val;
		}
	}
}

var ajax_submitting=false;
var ajax_error_message="";
var pre_complete_function=null;
var ajax_completed_function=null;
var global_ajax_completed_function=null;
var ajax_return_function=null;
var html_replacement_function=null;
var ajax_empty_handler=true;
var http_object = null;

function getHTTPObject()
{
	var xmlhttp;
	/*@cc_on
		
	@if (@_jscript_version >= 5)
	{
		try
		{
			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e)
		{
			try
			{
				xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} 
			catch (e)
			{
				xmlhttp = false;
			}
		}
	}
	@else
	{
		xmlhttp = false;
	}
	@end @*/
	
	if (!xmlhttp && typeof XMLHttpRequest != 'undefined')
	{
		try
		{
			xmlhttp = new XMLHttpRequest();
		}
		catch (e)
		{
			xmlhttp = false;
		}
    }

	return xmlhttp;
}

function show_ajax_info(text, buttons_visible)
{
	var el=document.getElementById('ajax_message');
	if (el)
	{
		el.innerHTML+="<p>"+text+"</p>";
	}
}

function htmlencode(a)
{
	var b=a.replace("<", "&lt;");
	return b.replace(">", "&gt;");
}

function gethtml(o)
{
	if (o.nodeValue!=null)
	{
		return o.nodeValue;
	}
	var s="<"+o.nodeName;
	for (i=0; i < o.attributes.length; i++)
	{
		s+=" "+o.attributes[i].nodeName+"=\""+o.attributes[i].nodeValue+"\"";
	}
	if (o.childNodes.length > 0)
	{
		s+=">";
		for (j=0; j < o.childNodes.length; j++)
		{
			s+=gethtml(o.childNodes[j]);
		}
		s+="</"+o.nodeName+">";
	}
	else
	{
		s+=" />";
	}
	return s;
}

function getNodeText(node)
{
    var r = "";
    for (var x = 0;x < node.childNodes.length; x++)
    {
		if (node.childNodes[x].nodeValue != null)
		{
	        r = r + node.childNodes[x].nodeValue;
		}
		if (node.childNodes[x].childNodes.length > 0)
		{
//			r = r + getNodeText(node.childNodes[x]);
		}
    }
    return r;
}

function copy_style(src_style_tag)
{
    var tmp_div = document.createElement('div');
    var innerHTML = src_style_tag.innerHTML;
    tmp_div.innerHTML = '<p>x</p><style type="text/css">' + innerHTML + '</style>';

    return tmp_div.getElementsByTagName('style')[0];
}

function ajax_replace_html(el, html)
{
	if( el )
	{
		var newEl;
		if (el.tagName=="TR")
		{
            while (el.cells.length>0)
            {
            	el.deleteCell(0);
            }
			// build <td>/<th>s (!)
			var cellStart=html.indexOf("<t");
			while (cellStart != -1)
			{
				var theCellStart=cellStart+2;
				var tagType="t"+html.substring(theCellStart, theCellStart+1);
				var tagOpenEnd=html.indexOf(">", theCellStart);
				cellStart=-1;
				if (tagOpenEnd!=-1)
				{
					var tagClose=html.indexOf("</"+tagType, tagOpenEnd);
					if (tagClose!=-1)
					{
						var cellHTML=html.substring(tagOpenEnd+1, tagClose);
						var cellTag;
						if (tagType=="td")
						{
							cellTag=el.insertCell(-1);
						}
						else
						{
							cellTag=document.createElement('th');
							el.appendChild(cellTag);
						}
						// set tag attributes...
						var attributeStart=theCellStart+2;
						var keyStart=html.indexOf("=\"", attributeStart);
						while ((keyStart != -1) && (keyStart < tagOpenEnd))
						{
							var keyEnd=html.indexOf("\"", keyStart+2);
							if (keyEnd==-1)
							{
								keyStart=-1;
							}
							else
							{
								var key=html.substring(attributeStart, keyStart);
								var value=html.substring(keyStart+2, keyEnd);
								if (key=="class")
								{
									cellTag.className=value;
								}
								else
								if (key=="style")
								{
									cellTag.style.cssText=value;
								}
								else
								{
									if (key=="colspan")
									{
										key="colSpan";
									}
									cellTag.setAttribute(key, value);
								}
								attributeStart = keyEnd+2;
								keyStart=html.indexOf("=\"", attributeStart);
							}
						}
						cellTag.innerHTML=cellHTML;
						cellStart=html.indexOf("<t", tagClose);
					}
				}
			}
			newEl=el.cloneNode(true);
		}
		else
		{
			newEl=el.cloneNode(true);
	        newEl.innerHTML = html;
		}
		if (el.parentNode)
			el.parentNode.replaceChild(newEl, el);
		else
			el.innerHTML = html;

        return newEl;
	}
}

function handle_response()
{
	var ajaxSuccess;
	var return_tag=null;
	if (http_object.readyState=="4")
	{
		show_ajax_info('handle_response:'+http_object.status);
		// parse XML response
		if (http_object.status=="200")
		{
			if (http_object.responseXML==null)
			{
				show_ajax_info('Invalid response - not XML', true);
			}
			else
			{
				var response = http_object.responseXML.documentElement;
				if (response == null)
				{
					ajaxSuccess = "0";
				}
				else
				{
					var successtag = response.getElementsByTagName('success');
					if (successtag == null)
					{
						show_ajax_info('Invalid response - no success indicator', true);
					}
					else
					if (successtag[0] == null)
					{
						show_ajax_info('Invalid response - could not detect success indicator', true);
					}
					else
					{
						ajaxSuccess = successtag[0].firstChild.data;
						if (pre_complete_function!=null)
						{
							pre_complete_function(ajaxSuccess);
						}
						var redirectTag = response.getElementsByTagName('redirect');
						if ( (redirectTag != null) && 
							 (redirectTag.length!=0) &&
							 (redirectTag[0].nodeType==1) &&
							 (redirectTag[0].childNodes.length==1) &&
							 (redirectTag[0].childNodes[0].nodeType==3)
						   )
						{
							window.location=redirectTag[0].childNodes[0].nodeValue;
						}
						if (ajaxSuccess=="1")
						{
							// show_ajax_info('success=1', true);
							// do any redirect
							// update all specified elements
							var updateTag = response.getElementsByTagName('updateElements');
							if (updateTag != null)
							{
								for (n=0; n < updateTag[0].childNodes.length; n++)
								{
									if (updateTag[0].childNodes[n].nodeType==1)
									{
										var replaceWith="";
										if (updateTag[0].childNodes[n].firstChild != null)
										{
											if (updateTag[0].childNodes[n].firstChild.nodeValue != null)
											{
//												replaceWith=updateTag[0].childNodes[n].firstChild.nodeValue;
												replaceWith=getNodeText(updateTag[0].childNodes[n]);
											}
											else
											{
												replaceWith=gethtml(updateTag[0].childNodes[n].firstChild);
											}
										}
										var el=document.getElementById(updateTag[0].childNodes[n].nodeName);
										if (el==null)
										{
											if (ajax_empty_handler==null)
											{
												alert("could not find element:"+updateTag[0].childNodes[n].nodeName);
											}
											else
											{
												el=ajax_empty_handler(updateTag[0].childNodes[n].nodeName, updateTag[0].childNodes[n].attributes);
											}
										}
										if (el!=null)
										{
											for( var x = 0; x < updateTag[0].childNodes[n].attributes.length; x++ )
											{
												if (updateTag[0].childNodes[n].attributes[x].nodeName=="style")
												{
													el.style.cssText= updateTag[0].childNodes[n].attributes[x].childNodes[0].nodeValue;
												}
												else
												if (updateTag[0].childNodes[n].attributes[x].nodeName=="class")
												{
													el.className=updateTag[0].childNodes[n].attributes[x].nodeValue;
												}
												else
												{
													el.setAttribute(updateTag[0].childNodes[n].attributes[x].nodeName, updateTag[0].childNodes[n].attributes[x].nodeValue);
												}
											}
											show_ajax_info("replace "+updateTag[0].childNodes[n].nodeName);
											if ( (html_replacement_function==null) || 
												 (!html_replacement_function(el, replaceWith))
											   )
											{
												ajax_replace_html(el, replaceWith);
											}
										}
									}
								}
							}							
						}
						else
						{					
							var errorMessageTag = response.getElementsByTagName('errorMessage');
							if (errorMessageTag == null)
							{
								show_ajax_info('Invalid response - no error message', true);
							}
							else
							{
								ajax_error_message=errorMessageTag[0].firstChild.data;
								show_ajax_info(errorMessageTag[0].firstChild.data, true);
							}
						}
						// set all return elements
						var returnTag = response.getElementsByTagName('return');
						if (returnTag != null)
						{
							return_tag=new Object;
							for (n=0; n < returnTag[0].childNodes.length; n++)
							{
								if (returnTag[0].childNodes[n].nodeType==1)
								{
									var name=returnTag[0].childNodes[n].nodeName;
									if (returnTag[0].childNodes[n].firstChild!=undefined)
									{
										return_tag[name]=getNodeText(returnTag[0].childNodes[n]);
									}
									else
									{
										return_tag[name]="";
									}
								}
								else
								{
									alert("strange return type:"+returnTag[0].childNodes[n].nodeType);
								}
							}
						}
					}
				}
			}
		}
		ajax_submitting=false;
		if (ajax_completed_function!=null)
		{
			ajax_completed_function(ajaxSuccess);
		}
		if ((ajax_return_function!=null) && (return_tag!=null))
		{
			ajax_return_function(return_tag);
		}
		if (global_ajax_completed_function!=null)
		{
			global_ajax_completed_function(ajaxSuccess);
		}
		fire_next_ajax_command();
	}
}

var ajax_completed_callback=null;
var pre_completed_callback=null;
var html_replacement_callback=null;
var ajax_return_callback=null;
var ajax_empty_element_handler=null;
var ajax_send_queue=new Array();
var ajax_path_queue=new Array();
var ajax_callback_queue=new Array();
var ajax_return_queue=new Array();
var ajax_empty_handler_queue=new Array();
var pre_completed_callback_queue=new Array();
var html_replacement_queue=new Array();

function fire_next_ajax_command()
{
	if ((!ajax_submitting) && (ajax_send_queue.length > 0))
	{
		var ajax_vars = ajax_send_queue.shift();
		var ajax_path = ajax_path_queue.shift();
		var ajax_callback = ajax_callback_queue.shift();
		var ajax_return = ajax_return_queue.shift();
		var ajax_empty = ajax_empty_handler_queue.shift();
		var pre_completed =	pre_completed_callback_queue.shift();
		var html_replace=html_replacement_queue.shift();

		http_object = getHTTPObject();
		if (ajax_path == null)
		{
			ajax_path="";
		}

		if (http_object != null)
		{
			var url=ajax_path+"xmlhttp.aspx";
			http_object.open("POST", url, true);
			http_object.setRequestHeader("content-type", "application/x-www-form-urlencoded");
			http_object.onreadystatechange = handle_response;
			ajax_submitting=true;
			ajax_completed_function=ajax_callback;
			ajax_return_function=ajax_return;
			html_replacement_function=html_replace;
			ajax_empty_handler=ajax_empty;
			pre_complete_function=pre_completed;
			http_object.send(ajax_vars);
		}
	}
}

function commit_ajax(ajax_path, ajax_vars, ajax_callback, ajax_return, ajax_empty, ajax_pre, html_replace)
{
	ajax_path_queue.push(ajax_path);
	ajax_send_queue.push(ajax_vars);
	ajax_callback_queue.push(ajax_callback);
	ajax_return_queue.push(ajax_return);
	ajax_empty_handler_queue.push(ajax_empty);
	pre_completed_callback_queue.push(ajax_pre);
	html_replacement_queue.push(html_replace);
	fire_next_ajax_command();
}

function get_ajax(getFieldName, path)
{
	show_ajax_info('get_ajax("'+getFieldName+'", "'+path+'")', false);
	commit_ajax(path, "get="+getFieldName, ajax_completed_callback, ajax_return_callback, ajax_empty_element_handler, pre_completed_callback, html_replacement_callback);
	return false;
}

function get_ajax_page(page, path)
{
	show_ajax_info('get_ajax_page("'+page+'", "'+path+'")', false);
	commit_ajax(path, "getpage="+page, ajax_completed_callback, ajax_return_callback, ajax_empty_element_handler, pre_completed_callback, html_replacement_callback);
	return false;
}

