function trim(s) {
  while (s.substring(0,1) == ' ') {
    s = s.substring(1,s.length);
  }
  while (s.substring(s.length-1,s.length) == ' ') {
    s = s.substring(0,s.length-1);
  }
  return s;
}

function GetRandom(min, max) {
	if(min > max) {
		return( -1 );
	}
	if(min == max) {
		return(min);
	}
 
        return(min + parseInt(Math.random() * (max-min+1)));
}

var acitveUserArray = new Array();
var X=0, Y=0;
var globobj;
var globobjinuse = false;
var globtxtviewinuse = false;

// MainChecker
function showMovedUserArray() { 
	var activeUser = "";

	for (var i = 0; i < acitveUserArray.length; i++) {

		userarrayindex	= i;
		userid 		= acitveUserArray[i]["userid"];
		userobj		= acitveUserArray[i]["userobj"];
		// userobj		= 'obj' + acitveUserArray[i]["userid"];
		userobjtopstart	= acitveUserArray[i]["userobjtopstart"];
		userobjtopend	= acitveUserArray[i]["userobjtopend"];
		userobjleftstart= acitveUserArray[i]["userobjleftstart"];
		userobjleftend	= acitveUserArray[i]["userobjleftend"];

		// Move active user
		moveUser(userarrayindex,userid,userobj,userobjtopstart,userobjtopend,userobjleftstart,userobjleftend);

		// document.getElementById('inarray').innerHTML = 'Arr: ' + i + 1 + ' - userid: ' + userid + ' userobj: ' + userobj + ' userobjtopstart: ' + userobjtopstart + ' userobjtopend: ' + userobjtopend + ' userobjleftstart: ' + userobjleftstart + ' userobjleftend: ' + userobjleftend + '<br>';
	}

	// document.getElementById('status').innerHTML = activeUser;

window.setTimeout("showMovedUserArray()", 30);
}

// Add an active Move-User to array
function addActiveUser(clickobject,userid) { 
	// alert(clickobject.tagName);


	var userobj = 'obj' + userid;

	// Check if userobj exist - else create obj
	if(!document.getElementById(userobj)) { 
		createUserDiv(userid);
	}

	// if user not active moved and click on mainfield - push to list-array
	if(checkActiveMoveUser(userid) == false && globobjinuse != true) { 

		// current position
		userobjtopstart 	= parseInt(document.getElementById(userobj).style.top);
		userobjleftstart	= parseInt(document.getElementById(userobj).style.left);

		// New position
		var userobjtopend  	= Y-document.getElementById('mainfield').offsetTop;
		var userobjleftend 	= X-document.getElementById('mainfield').offsetLeft;

		// Vorerst entfernt - Erledigt Ajax
		// var newIndex = acitveUserArray.length;
		// acitveUserArray[newIndex] = new Object();
		// acitveUserArray[newIndex]["userid"] 		= userid;
		// acitveUserArray[newIndex]["userobj"] 		= userobj;
		// acitveUserArray[newIndex]["userobjtopstart"] 	= userobjtopstart;
		// acitveUserArray[newIndex]["userobjtopend"]	= userobjtopend;
		// acitveUserArray[newIndex]["userobjleftstart"] 	= userobjleftstart;
		// acitveUserArray[newIndex]["userobjleftend"] 	= userobjleftend;

		// globobjinuse = true - for only 1 position click
		globobjinuse = true;

		var nachricht = "";
		// DB
		createNewEntry(userid,userobjtopstart,userobjtopend,userobjleftstart,userobjleftend,nachricht);
	}
}

function createNewUserMessage() { 
	var msguserid=document.getElementById('testuser').value;
	var msguserobj = 'msg_' + msguserid;
	// if user not active moved and click on mainfield - push to list-array
	if(checkActiveMoveUser(msguserid) == false && globobjinuse != true && trim(document.getElementById('msg_input').value) != "") { 
		// current position
		userobjtopstart3 	= parseInt(document.getElementById(msguserobj).style.top);
		userobjtopend3		= parseInt(document.getElementById(msguserobj).style.top) + 1;

		userobjleftstart3	= parseInt(document.getElementById(msguserobj).style.left);
		userobjleftend3 	= parseInt(document.getElementById(msguserobj).style.left) + 1;

		var nachricht3 = trim(document.getElementById('msg_input').value);
		// nachricht3 = escape(nachricht3);
		// DB
		// createNewEntry(name,topstart,topend,leftstart,leftend,nachricht)
		createNewEntry(msguserid,userobjtopstart3,userobjtopend3,userobjleftstart3,userobjleftend3,nachricht3);
		document.getElementById('msg_input').value = '';
	}
}

// Check if user moving true/false
function checkActiveMoveUser(userid) { 
	var isUserActive = false;
	for (var usri = 0; usri < acitveUserArray.length; usri++) {
	  if(userid == acitveUserArray[usri]["userid"]) { 
		isUserActive = true;
	  }
	}
return isUserActive;
}

// Remove active Move-User from List-Array
function removeActiveMoveUser(userid) { 
	for (var dusri = 0; dusri < acitveUserArray.length; dusri++) {
	  if(userid == acitveUserArray[dusri]["userid"]) { 
		acitveUserArray.splice(dusri,1);
	  }
	}
}

function showCoords(obj) { 
	var left = X-obj.offsetLeft; 
	var top  = Y-obj.offsetTop; 
	// document.getElementById('status').innerHTML = left+'x'+top;
} 

document.onmousemove = function (e) {
	X = e ? e.pageX : event.clientX; 
	Y = e ? e.pageY : event.clientY; 
} 

var movetimer;
function moveUser(userarrayindex,userid,userobj,userobjtopstart,userobjtopend,userobjleftstart,userobjleftend) { 
	var userobjmsg = 'msg_' + userid;
	var userobj = 'obj' + userid;
	if(userobjtopstart != userobjtopend) { 
		if(userobjtopstart > userobjtopend) {
			userobjtopstart = userobjtopstart - 1;
			document.getElementById(userobj).style.top = userobjtopstart;
		} else { 
			userobjtopstart = userobjtopstart + 1;
			document.getElementById(userobj).style.top = userobjtopstart;
		}
	}

	if(userobjleftstart != userobjleftend) { 
		if(userobjleftstart < userobjleftend) {
			userobjleftstart = userobjleftstart + 1;
			document.getElementById(userobj).style.left = userobjleftstart;
		} else { 
			userobjleftstart = userobjleftstart - 1;
			document.getElementById(userobj).style.left = userobjleftstart;
		}
	}

	var mainfieldwidthhalf = document.getElementById('mainfield').offsetWidth / 2;
	// Wenn aktuelles Objekt horizontal größer als Bildschirmhälfte, dann msg-div nach links verlagern
	if(userobjleftstart <= mainfieldwidthhalf) {
		document.getElementById(userobjmsg).style.top = userobjtopstart - 40;
		document.getElementById(userobjmsg).style.left = userobjleftstart + document.getElementById(userobj).offsetWidth;
	} else { 
		document.getElementById(userobjmsg).style.top = userobjtopstart - 40;
		document.getElementById(userobjmsg).style.left = userobjleftstart - document.getElementById(userobjmsg).offsetWidth;;
	}

	if(userobjtopstart != userobjtopend || userobjleftstart != userobjleftend) { 
		// movetimer = window.setTimeout("moveUser('"+userobj+"',"+userobjtopstart+","+userobjtopend+","+userobjleftstart+","+userobjleftend+")", 10);
		// globobjinuse = true;
		// Array-Daten für User neu schreiben
		acitveUserArray[userarrayindex]["userobjtopstart"] = userobjtopstart;
		acitveUserArray[userarrayindex]["userobjtopend"] = userobjtopend;
		acitveUserArray[userarrayindex]["userobjleftstart"] = userobjleftstart;
		acitveUserArray[userarrayindex]["userobjleftend"] = userobjleftend;
	} else { 
		// window.clearTimeout(movetimer);
		// globobjinuse = false;
		// Endposition remove user from active moved list-array
		document.getElementById(userobj).style.top = userobjtopend;
		document.getElementById(userobj).style.left = userobjleftend;
		removeActiveMoveUser(userid);
	}

	// document.getElementById('status').innerHTML = 'arrindex: ' + userarrayindex + ' userid: ' + userid + ' userobjtopstart: ' + userobjtopstart + ' userobjtopend: ' + userobjtopend + ' userobjleftstart: ' + userobjleftstart + ' userobjleftend: ' + userobjleftend;
}

function showmymsg(usermsgfield) { 

	// Testuser
	var userid = document.getElementById('testuser').value;
	var userobj = 'obj' + userid;
	var usermsgfield = 'msg_' + document.getElementById('testuser').value;

	var usermsg = trim(document.getElementById('msg_input').value);
	if(usermsg != "") {
		// if(globobjinuse != true) { 
		// if user now not moved
		if(checkActiveMoveUser(userid) == false) { 
			// Anzeigedauer anhand von Wörtern berechnen
			var wordsplit = usermsg.split(" ");
			var wordcounts = wordsplit.length + 5; 

			showhideusrwin(usermsgfield,wordcounts);

			// document.getElementById(usermsgfield).innerHTML = 'wordcounts: ' + wordcounts + ' - ' + document.getElementById('msg_input').value;
			document.getElementById(userobj).style.zIndex = latestID;
			document.getElementById(usermsgfield).style.zIndex = latestID;
			// document.getElementById(usermsgfield).innerHTML = userid + ':<br>' + usermsg;
			document.getElementById(usermsgfield).innerHTML = usermsg;
			document.getElementById('msg_input').value = "";
		} else { 
			document.getElementById('msg_input').value = usermsg;
		}
	}
}

function viewusermsgs(userid,usermsg) { 
	var userobj = 'obj' + userid;
	var usermsgfield = 'msg_' + userid;
	if(usermsg != "") {
		// if(globobjinuse != true) { 
		// if user now not moved
		//if(checkActiveMoveUser(userid) == false) { 
			// Anzeigedauer anhand von Wörtern berechnen
			var wordsplit = usermsg.split(" ");
			var wordcounts = wordsplit.length + 5;

			showhideusrwin(usermsgfield,wordcounts);

			// document.getElementById(usermsgfield).innerHTML = 'wordcounts: ' + wordcounts + ' - ' + document.getElementById('msg_input').value;
			document.getElementById(userobj).style.zIndex = latestID;
			document.getElementById(usermsgfield).style.zIndex = latestID;
			// document.getElementById(usermsgfield).innerHTML = userid + ':<br>' + usermsg;
			document.getElementById(usermsgfield).innerHTML = unescape(usermsg);


			// document.getElementById('msg_input').value = "";
		//} else { 
			// document.getElementById('msg_input').value = "";
		//}
	}
}

// var showtimecounter = 0;
function showhideusrwin(usermsgfield,showtime) { 

	if(showtime > 0) { 
		showtime = showtime - 1;
	} else { 
		showtime = 0;
	}

	// document.getElementById('status').innerHTML = 'showtime: ' + showtime;

	if(showtime > 0) { 
		document.getElementById(usermsgfield).style.visibility = 'visible';
		globtxtviewinuse = true;
		window.setTimeout("showhideusrwin('"+usermsgfield+"','"+showtime+"')", 1000);
	} else { 
		document.getElementById(usermsgfield).style.visibility = 'hidden';
		globtxtviewinuse = false;
	}
}

function createUserDiv(userid) { 

	// Vorerst userid ersetzen durch Zufall
	// userid = 'userid' + GetRandom(1,1000);
	// userid = GetRandom(1,1000);
	userobj = 'obj' + userid;
	userobjmsg = 'msg_' + userid;

	// GetRandom(min, max)
	var userPosTop = GetRandom(15, parseInt(document.getElementById('mainfield').offsetHeight));
	var userPosLeft = GetRandom(15, parseInt(document.getElementById('mainfield').offsetWidth));

	// UserObj
        var divTag = document.createElement("div");
	divTag.id = userobj;
	// divTag.setAttribute("align","center");
	// divTag.style.margin = "0px auto";
	divTag.setAttribute("onmouseover","globobjinuse=true;");
	divTag.setAttribute("onmouseout","globobjinuse=false;");
	divTag.style.border = "0px solid #000000";
	divTag.className ="userobject";
	// document.body.appendChild(divTag);
	document.getElementById("mainfield").appendChild(divTag);
	divTag.style.top = userPosTop;
	divTag.style.left = userPosLeft;
	divTag.style.zIndex = '9';
	// divTag.innerHTML = "UserID: " + userid;
	divTag.innerHTML = '<img src="sm2.gif" border="0">';

	// UsermsgObj
        var divTag2 = document.createElement("div");
	divTag2.id = userobjmsg;
	divTag2.setAttribute("onmouseover","globobjinuse=true;");
	divTag2.setAttribute("onmouseout","globobjinuse=false;");
	divTag2.style.textAlign = "left";
	divTag2.className ="usermsgobject";
	document.getElementById("mainfield").appendChild(divTag2);

	// Wenn aktuelles Objekt horizontal größer als
	var mainfieldwidthhalf2 = document.getElementById('mainfield').offsetWidth / 2;
	if(userPosLeft <= mainfieldwidthhalf2) {
		document.getElementById(userobjmsg).style.top = userPosTop - 40;
		document.getElementById(userobjmsg).style.left = userPosLeft + document.getElementById(userobj).offsetWidth;
	} else { 
		document.getElementById(userobjmsg).style.top = userPosTop - 40;
		document.getElementById(userobjmsg).style.left = userPosLeft - document.getElementById(userobjmsg).offsetWidth;;
	}


	// Zum testen
	// document.getElementById("testuser").value = userid;
}

function deleteUserDiv() { 
	var userid = document.getElementById("testuser").value;
	var deluserobj = 'obj' + document.getElementById("testuser").value;
	var usermsgobj = 'msg_' + userid;

	// if user is moved - stop all moved actions
	if(checkActiveMoveUser(userid) == true) {
		removeActiveMoveUser(userid);
	}

	// delete users div and UsermsgObj
	if(checkActiveMoveUser(userid) == false) { 
		document.getElementById("mainfield").removeChild(document.getElementById(deluserobj));
		document.getElementById("mainfield").removeChild(document.getElementById(usermsgobj));
	}
}

function getCoordData() {
	var userid = '';
	var userdata;

            // Name der URL, welche die Daten bezogen auf diese Funktion liefert
            var url = "checkcoorddata.php";
            var param = '?flag=' + new Date().getTime();

            new Ajax.Request(url, {
                parameters: param,
                method: 'get',
                asynchronous: false,
                onLoading: function(transport) {
                                // Nicht nötig
                           },
                onSuccess: function(transport) {
                                // if(transport.responseText == 'false') {
				// userdata = transport.responseText;
				createUserDiv(transport.responseText);
                           },
                onFailure: function() {
                                    alert('Failure to check userdata !');
                           }
            });

            // alert(userdata);
window.setTimeout("getCoordData()", 5000);
}

var dbActiveUserArray = new Array();
function checkAllInactiveUsers(userid,usrtimestamp) { 

	var now = new Date(usrtimestamp*1000);
	hours = now.getHours() + 1;
	minutes = now.getMinutes();
	seconds = now.getSeconds();
	day = now.getDate();
	month = now.getMonth();
	year = now.getFullYear();

	testdate = (day <10) ? '0' + day + '.' : day + '.';
	testdate += (month <10) ? '0' + month + '.' : month + '.';
	testdate += year + ' ';
	testdate += (hours < 10) ? '0' + hours + ':' : hours + ':';
	testdate += (minutes < 10) ? '0' + minutes + ':' : minutes + ':';
	testdate += (seconds < 10) ? '0' + seconds : seconds;

	// document.getElementById('inactivestat').innerHTML = 'PHP: ' + usrtimestamp + ' JS ' + testdate;
}


var surl="http://www.profimann.de/";
var latestID = 0; //latestID als globale Variable

//Funktion, mit der Anfragen nach neuesten Einträgen gesendet wird
function getLatestEntries() {
	if (httpGetLatestEntries.readyState == 4 || httpGetLatestEntries.readyState == 0) { //Anfrage senden, wenn Status der letzten Anfrage "completed" ist, bzw. "nicht initialisiert" (d.h. erster Aufruf)
  		// httpGetLatestEntries.open("GET",surl+"ajaxchat.php?action=getLatestEntries&latestID="+latestID, true);
		httpGetLatestEntries.open("get","ajaxchat.php?action=getLatestEntries&latestID="+latestID, true);
    		httpGetLatestEntries.onreadystatechange = handleHttpGetLatestEntries; 
		httpGetLatestEntries.send(null);
		// httpGetLatestEntries.send(Null);
	}
}

//Behandelt die Serverantwort
function handleHttpGetLatestEntries() {

  if (httpGetLatestEntries.readyState == 4) {

	response = httpGetLatestEntries.responseXML.documentElement; 
	messages = response.getElementsByTagName('message');
    
	if(messages.length > 0) { //Anzeige nur, wenn mindestens eine neue Nachricht
		//document.write(messages.length); //Debug
		for (var i=messages.length-1; i>=0; i--) {
  			//Darstellung im Browser mit dem DOM
 		  	//showEntry= document.getElementById("showEntries");
			//neuSpan = document.createElement('span');
			//neuSpan.setAttribute('class','entry');
			//neuSpan.setAttribute('className','entry'); //für den InternetExplorer
			//neuSmall = document.createElement('small');
			//neuNameDate = document.createTextNode(messages[i].getElementsByTagName('date')[0].firstChild.nodeValue + ': ' + messages[i].getElementsByTagName('name')[0].firstChild.nodeValue +': ');
			//neuSmall.appendChild(neuNameDate);
			//neuSpan.appendChild(neuSmall);
			//neuSpan.appendChild(document.createElement('br'));	
			//neuNachricht = document.createTextNode(messages[i].getElementsByTagName('nachricht')[0].firstChild.nodeValue);
			//neuSpan.appendChild(neuNachricht);
			//neuSpan.appendChild(document.createElement('br'));
			//showEntry.insertBefore(neuSpan, showEntry.firstChild);


			var userid2 = parseInt(messages[i].getElementsByTagName('name')[0].firstChild.nodeValue);
			var userobj2 = 'obj' + messages[i].getElementsByTagName('name')[0].firstChild.nodeValue;
			var userobjtopstart2 = parseInt(messages[i].getElementsByTagName('topstart')[0].firstChild.nodeValue);
			var userobjtopend2 = parseInt(messages[i].getElementsByTagName('topend')[0].firstChild.nodeValue);
			var userobjleftstart2 = parseInt(messages[i].getElementsByTagName('leftstart')[0].firstChild.nodeValue);
			var userobjleftend2 = parseInt(messages[i].getElementsByTagName('leftend')[0].firstChild.nodeValue);
			var nachricht2 = messages[i].getElementsByTagName('nachricht')[0].firstChild.nodeValue;
			var userdate2 = parseInt(messages[i].getElementsByTagName('date')[0].firstChild.nodeValue);

			// Check if userobj exist - else create obj
			if(!document.getElementById(userobj2)) { 
				createUserDiv(userid2);
			}

			// from addActiveUser to click is now open
			globobjinuse = false;

			// Check if nachricht2 != "" to show
			if(nachricht2 != '0') { 
				viewusermsgs(userid2,nachricht2);
			} else { 
				var newIndex = acitveUserArray.length;
				acitveUserArray[newIndex] = new Object();
				acitveUserArray[newIndex]["userid"] 		= userid2;
				acitveUserArray[newIndex]["userobj"] 		= userobj2;
				acitveUserArray[newIndex]["userobjtopstart"] 	= userobjtopstart2;
				acitveUserArray[newIndex]["userobjtopend"]	= userobjtopend2;
				acitveUserArray[newIndex]["userobjleftstart"] 	= userobjleftstart2;
				acitveUserArray[newIndex]["userobjleftend"] 	= userobjleftend2;
			}

			// Update active user to checkAllInactiveUsers(userid,usrtimestamp) 
			checkAllInactiveUsers(userid2,userdate2);

			// document.getElementById('status2').innerHTML = userid2 + ' ' + userobj2 + ' ' + userobjtopstart2 + ' ' + userobjtopend2 + ' ' + userobjleftstart2 + ' ' + userobjleftend2;
		} 
		latestID = messages[0].getElementsByTagName('id')[0].firstChild.nodeValue; //Festlegung der neuen latestID
		//document.write(latestID); //Debug
	}

    setTimeout('getLatestEntries();',5000); //Erneute Anfrage in vier Sekunden
  } 
}


//neue Nachricht auf dem Server erzeugen
function createNewEntry(name,topstart,topend,leftstart,leftend,nachricht) {
	
	if (httpCreateNewEntry.readyState == 4 || httpCreateNewEntry.readyState == 0) {
		// url  = surl + 'ajaxchat.php?action=createNewEntry&name=' + name + '&topstart=' + topstart + '&topend=' + topend + '&leftstart=' + leftstart + '&leftend=' + leftend + '&nachricht=' + encodeURIComponent(nachricht);
		var requrl  = 'ajaxchat.php?action=createNewEntry&name=' + name + '&topstart=' + topstart + '&topend=' + topend + '&leftstart=' + leftstart + '&leftend=' + leftend + '&nachricht=' + encodeURIComponent(nachricht);
     		httpCreateNewEntry.open("GET", requrl, true);
     		httpCreateNewEntry.onreadystatechange = handleHttpCreateNewEntry;
   	 	httpCreateNewEntry.send();
 	}
}

//behandelt die Antwort des Servers
function handleHttpCreateNewEntry() {
  if (httpCreateNewEntry.readyState == 4) {
  	//nachdem eine neue Nachricht erfolgreich erzeugt wurde, wird diese angezeigt
  	// getLatestEntries();   
	}
}

function createXMLHttpReqObj() {  //erzeugt die XMLHttpRequest Objekte
    // für Mozilla etc.
    if(window.XMLHttpRequest) {
    	try {  //Fehler abfangen
			req = new XMLHttpRequest(); 
        } catch(e) {
			req = false;
        }
    // für den InternetExplorer
    } else if(window.ActiveXObject) {
       	try {
        	req = new ActiveXObject("Msxml2.XMLHTTP");
      	} catch(e) {
        	try {
          		req = new ActiveXObject("Microsoft.XMLHTTP");
        	} catch(e) {
          		req = false;
        	}
		}
	}
	return req;
}

// Initialisierung
var httpGetLatestEntries= createXMLHttpReqObj();
var httpCreateNewEntry = createXMLHttpReqObj();

function initAll() { 
showMovedUserArray();
getLatestEntries();
// i
createUserDiv(document.getElementById('testuser').value);
}

