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;

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')
		{
			l=el.cells.length;
			for (i=0; i < l; i++)
			{
				el.cells[0].style.display='inline';
				try
				{
	            	el.deleteCell(0);
				}
				catch (exception)
				{
	            	el.deleteCell();
				}
			}
			// 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;
	}
}

var ajaxSuccess;

function handle_xml_response(response)
{
	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');
		return_tag=null;
		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);
				}
			}
		}
		return return_tag;
	}
}

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 = function()
			{
				if (http_object != null)
				{
					var return_tag=null;
					if (http_object.readyState=='4')
					{
						show_ajax_info('handle_response:'+this.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
								{
									return_tag=handle_xml_response(response);
								}
							}
						}
						ajax_submitting=false;
						http_object = null;
						if (ajax_completed_function!=null)
						{
							show_ajax_info('ajax_completed_function('+ajaxSuccess+')');
							ajax_completed_function(ajaxSuccess);
						}
						if ((ajax_return_function!=null) && (return_tag!=null))
						{
							show_ajax_info('ajax_return_function('+return_tag+')');
							ajax_return_function(return_tag);
						}
						if (global_ajax_completed_function!=null)
						{
							show_ajax_info('global_ajax_completed_function('+ajaxSuccess+')');
							global_ajax_completed_function(ajaxSuccess);
						}
						fire_next_ajax_command();
					}
				}
			};
			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;
}

