var gecko = (navigator.userAgent.indexOf("Gecko")!=(-1)) ? true : false;
if (!gecko) {
	alert('Sorry, diese Demonstration funktioniert bisher nur auf \nMozilla-basierten Browsern einwandfrei.');
}
var eTarget;
var startTime = false;
var endTime   = false;
var server    = 'http://' + window.location.hostname + '/experiments/r2/server.php';
var lastXML = 'none received yet!';

function formElementManager(e) 
{
  e = (e) ? e : ((window.event) ? window.event : '');
  eTarget = getETarget(e);
  result = validateField(eTarget.name, eTarget.value);
  setFieldMsg(eTarget.parentNode, '<i>bitte Warten ...</i>', '');
}

function validateField(name, value) 
{
  // hier zum server connecten und ein qualifiziertes ergebnis erhalten:
  now = new Date();
  startTime = now.getTime();

  // übermittlung der anfrage per xmlhttprequest
  sendValidationRequest(name, value);

  // @todo:
  // info über weitere zu modifizierende felder
  // info zum update der page select tabelle.
}

function sendValidationRequest(fieldName, fieldValue)
{
	// send a request
	var http = getHTTPObject(); 
	http.open('GET', server + '?fieldName=' + fieldName + '&fieldValue=' + fieldValue, true); 
	http.onreadystatechange = function() { 
		if (http.readyState == 4) { 
			processResponse(http); 
		} 
	} 
	http.send(null);
}

function updateField(fieldRef, result) 
{
  while(fieldRef.nodeName != 'TD') {
    fieldRef = fieldRef.parentNode;
  }
  // feldname
  classes = new Array('errorMsg', 'okMsg');
  setFieldMsg(fieldRef, result.msg, classes[parseInt(result.code)]);
  // titel
  classes = new Array('errorTitle', 'okTitle');
  node_before(fieldRef).className = classes[parseInt(result.code)];
  // debug info
  debug = document.getElementById('debug');
  now = new Date();
  diff =(now.getTime() - startTime); 
  debug.innerHTML = 'Zeit f&uuml;r Request, Validierung und Response: <b>' + diff + 'ms</b>';
}

function setFieldMsg(fieldRef, msg, className) 
{
  // fehlermeldung
  eMsgField = node_after(fieldRef);
  eMsgField.innerHTML = msg;
  eMsgField.className = className;
}

function getETarget(e) 
{
  eTarget = e.srcElement ? e.srcElement : e.target; 
  while(eTarget.nodeType != 1) {
    eTarget = eTarget.parentNode;
  }
  return eTarget;
}

/** 
 * browser-übergreifend ein neues http objekt instanzieren
 * @source http://www.peej.co.uk/articles/rich-user-experience.html 
 * @return 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 processResponse(httpObject) 
{
	data = parseTextToObject(httpObject.responseText);
	//data = parseXmlToObject(httpObject.responseXML);
	lastXML = httpObject.responseText;
	updateField(eTarget, data);
	if (data.visFields.length > 0) {
		updateVisibility(data);
	}
}

function parseXmlToObject(xmlDoc)
{
	data = new Object();
	data.fieldname = xmlDoc.getElementsByTagName('f').item(0).firstChild.nodeValue;
	data.code      = xmlDoc.getElementsByTagName('c').item(0).firstChild.nodeValue;
	data.msg       = xmlDoc.getElementsByTagName('m').item(0).firstChild.nodeValue;
	data.pstates   = xmlDoc.getElementsByTagName('p').item(0).firstChild.nodeValue;
	data.visFields = new Array();
	data.visStates = new Array();

	/*
	tmp1 = xml.split('<fn>');
	tmp2 = xml.split('<fv>');
	for (i=1;i<tmp1.length;i++) {
		data.visFields[i-1] = tmp1[i].substr(0, tmp1[i].search('<'));
		data.visStates[i-1] = tmp2[i].substr(0, tmp2[i].search('<'));
	}
	*/
	return data;
}
function parseTextToObject(xmlAsText)
{
	xml = xmlAsText;
	data = new Object();
	data.fieldname = xml.match(/<f>(.+)<\/f>/)[1];
	data.code      = xml.match(/<c>(.+)<\/c>/)[1];
	data.msg       = xml.match(/<m>(.+)<\/m>/)[1];
	//data.pstates   = xml.match(/<p>(.+)<\/p>/)[1];
	data.visFields = new Array();
	data.visStates = new Array();

	tmp1 = xml.split('<fn>');
	tmp2 = xml.split('<fv>');
	for (i=1;i<tmp1.length;i++) {
		data.visFields[i-1] = tmp1[i].substr(0, tmp1[i].search('<'));
		data.visStates[i-1] = tmp2[i].substr(0, tmp2[i].search('<'));
	}
	return data;
}
function updateVisibility(data)
{
	for (i=0;i<data.visFields.length;i++) {
		el = document.getElementById(data.visFields[i]);
		while (el.nodeName != 'TR') {
			el = el.parentNode;
		}
		el.style.display = (data.visStates[i] == '1') ? 'table-row' : 'none';
	}

}

/** 
 * 
 * @source http://www.quirksmode.org/dom/importxml.html
 * @return null
 */
function importXML()
{
	if (document.implementation && document.implementation.createDocument) {
		xmlDoc = document.implementation.createDocument("", "", null);
		xmlDoc.onload = createTable;
	} else if (window.ActiveXObject) {
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.onreadystatechange = function () {
			if (xmlDoc.readyState == 4) createTable()
		};
 	} else {
		alert('Your browser can\'t handle this script');
		return;
	}
	xmlDoc.load("emperors.xml");
}

function showLastXML()
{
	alert(lastXML);
}

