/* 
	AJAX & window library routines
	bx]l[ab 2007
*/

function xmlObj(){
	if (window.XMLHttpRequest){
		var obj = new XMLHttpRequest();
	} else {
		var obj = new ActiveXObject("Microsoft.XMLHTTP");
	}
	return obj;
}

function getEl(el){
	if (document.getElementById) {
		return document.getElementById(el);
	} else if (document.all) {
		return document.all[id];
	}
}

function setEl(el, content){
	if (document.getElementById) {
		var obj = document.getElementById(el);
		obj.innerHTML = content;
	} else if (document.all) {
		var obj = document.all[id];
		obj.innerHTML = content;
	}
}

function setFormEl(el, content){
	if (document.getElementById) {
		var obj = document.getElementById(el);
		obj.value = content;
	} else if (document.all) {
		var obj = document.all[id];
		obj.value = content;
	}
}

function toggle(el){
	if (getEl(el).style.display=="block" || getEl(el).style.display=="") {
		getEl(el).style.display="none";
		getEl(el+'btn').innerHTML = "+";
	} else {
		getEl(el).style.display="block";
		getEl(el+'btn').innerHTML = "-";
	}
}


/*
	set element  
*/
function ajaxSetEl(url, el, call){
	var obj = xmlObj();
	//setEl(el,"Loading...");
	obj.onreadystatechange=function(){
		if (obj.readyState==4) {
			if (obj.status==200) {
				//alert(" "+obj.status+"\r\nRequest: "+url);
				setEl(el,obj.responseText);
				if(call) call();
			} else {
				//alert("warning: ajax request returned "+obj.status+"\r\nRequest: "+url);
				setEl(el,"Error loading "+url);
			}

		} else {
			//alert(obj.status+url +  obj.readyState);
		}
	}
	obj.open("GET",url,true);
	obj.send(null);
//	ajaxBusy= false;
}

function ajaxGetJS(url, el){
	var obj = xmlObj();
	obj.onreadystatechange=function(){
		if (obj.readyState==4) {
			if (obj.status==200) {
				//alert(" "+obj.status+"\r\nRequest: "+url);
				eval(obj.responseText);
			} else {
				alert("warning: ajax request returned "+obj.status+"\r\nRequest: "+url);
			}
		}
	}
	obj.open("GET",url,true);
	obj.send(null);
}


function sizeElement(el,width, height, steps){
	var e=getEl(el);
	var x=parseInt(e.style.width);
	var y=parseInt(e.style.height);
	var newx=x + Math.round((width - x) / steps);
	var newy=y + Math.round((height - y) / steps);
	e.style.width=newx+'px';
	e.style.height=newy+'px';
	e.width=newx;
	e.height=newy;

	steps--;
	if (steps>0)
		setTimeout('sizeElement("'+el+'",'+width+','+height+','+steps+');',50);
}

function bounceEl(el,width, height, steps){
	var e=getEl(el);
	e.width=0;
	e.height=0;
	e.display='none';
	e.style.width='auto';
	e.style.height='auto';
	setTimeout('sizeElement("'+el+'",'+width+','+height+','+steps+');',50);
}

function ajaxGetDoc(url, callbackFunc){
	var obj = xmlObj();
	obj.onreadystatechange=function(){
		if (obj.readyState==4) {
			if (obj.status==200) {
				callbackFunc(obj.responseText);
				//setEl(el,obj.responseText);
			} else {
				alert("warning: ajax request returned "+obj.status+"\r\nRequest: "+url);
			}
		}
	}
	obj.open("GET",url,true);
	obj.send(null);
}

function ajaxSetFormEl(url, el){
	var obj = xmlObj();
	obj.onreadystatechange=function(){
		if (obj.readyState==4) {
			if (obj.status==200) {
				setFormEl(el,obj.responseText);
			} else {
				alert("warning: ajax request returned "+obj.status+"\r\nRequest: url");
			}
		}
	}
	obj.open("GET",url,true);
	obj.send(null);
}

function ajaxPostForm(url){
	var obj = xmlObj();
	obj.onreadystatechange=function(){
		if (obj.readyState==4) {
			if (obj.status==200) {
				//alert(obj.responseText+' element: '+ el);
			} else {
				alert("warning: ajax request returned "+obj.status+"\r\nRequest: "+url);
			}
		}
	}
	obj.open("POST",url,true);
	obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
	obj.send(null);
}

function toggleDelBtns(formname){
	var form=eval('document.'+formname);
	var newstate=form.delbtn.checked;
	for(var i=0;i<form.elements.length;i++){
		var e=form.elements[i];
		if(e.type=='checkbox'){
			e.checked=newstate;
		}
	}
}

function insertAfter( referenceNode, newNode ) {
	referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}

function addmsgs(el,text){
	if(text.length>0){
		// split all the new messages
		var lines = text.split('\0\0');
		// for each new mesage do
		for (var i=0;i<lines.length;i++) {
			if(lines[i].length>0){
				var message = lines[i].split('\0');
				var content = message[0].split(':');
				if(content[0]>lastid) // only change if this number is higher
					lastid = content[0];

				// element 2 holds the action 
				// actions are:
				//	0 - add or replace msg
				// 	1 - remove msg
				// 	2 - add or replace sticky post, should delete the existing one and reinsert it

				// an element to be removed?
				if (content[2]==1){
					// delete it..
					if (getEl(content[0])!=null) {
						var parentdiv = getEl(content[0]).parentNode;
						parentdiv.removeChild(getEl(content[0]));
						//getEl(content[0]).innerHTML="";
					}
				} else {
					// element needs to be added or replaced
					// if mode=2 then this is a sticky post, else its a normal post

					var addasnew = true;

					// existing element ?
					if (getEl(content[0])!=null) {
						//alert("existing " + content[0] +" - " + getEl(content[0]));
						addasnew=false;

						// replacing msgs..if its a sticky post and it is currently located amongst the normal msgs, then move it, and vice versa
						if((content[2]==0) && (getEl('stickyposts') == getEl(content[0]).parentNode)){
							// move it
							var parentdiv = getEl('stickyposts');
							parentdiv.removeChild(getEl(content[0]));
							addasnew = true;

						} else if((content[2]==2) && (getEl('messages') == getEl(content[0]).parentNode)){
							// replace it
							var parentdiv = getEl('messages');
							parentdiv.removeChild(getEl(content[0]));
							addasnew = true;
							//alert("x");
						} else {
							//alert(getEl(content[0]).innerHTML);
							getEl(content[0]).innerHTML=message[1];
						}
					} 

					if(addasnew) {
						if((content[1]!=0) && (content[2]==0)){ //avoid adding sticky posts as childs..child and not sticky
							// its a child element, add it to its parent
							var par=getEl(content[1]);
							if(par!=null){ // only try to add if this parent exists....
								var padding=parseInt(par.style.paddingLeft) + 40;
								var newdiv = document.createElement('div');
								newdiv.innerHTML="<div id=\""+content[0]+"\" class=\"msg bg0\" style=\"padding-left: "+padding+"px;\">" +message[1]+"</div>";
								if(par.parentNode == getEl('messages')){
								    insertAfter(par.lastChild, newdiv);
								} else {
								    insertAfter(par.parentNode.lastChild, newdiv);
								}
							} else {
	    							//alert("missing parent for:"+message[1]+" press F5");
							}
						} else {
							// its a parent element, add top, actually it needs to go below a Certain post...fix this..
							// it doesnt matter how these posts come in, as long as they arrive before the childs
							if(content[2]==2){
								var par=getEl("stickyposts"); 
							} else {
								var par=getEl("messages"); 
							}
							var newdiv = document.createElement('div');
							newdiv.innerHTML = "<div id=\""+content[0]+"\" class=\"msg bg0\" style=\"padding-left: 15px;\">" +message[1]+"</div>";
							//par.innerHTML="<div id=\""+content[0]+"\" class=\"msg bg0\" style=\"padding-left: 15px;\">" +message[1]+"</div>" + par.innerHTML;
							par.insertBefore(newdiv,par.firstChild);
						}
					}
				}
			}
		}
	} else {
		setEl(el,"No new messages..");
	}
}

function nextmessage(timer){
	if ((timer-1)> 0){
		setEl('progress',"Next update in "+ (timer-1) + " seconds");
		setTimeout("nextmessage("+(timer-1)+");",1000);
	} else {
		setEl('progress',"Updating...");
	
	}
}

var inprogress=false;
var timeout;
var timeout2;
function fetchmessages(el,lastid){
	clearTimeout(timeout);
	clearTimeout(timeout2);
	//inprogress=true;
	var obj = xmlObj();
	obj.onreadystatechange=function(){
		if (obj.readyState==4) {
			if (obj.status==200) {
				addmsgs(el,obj.responseText);
			} else {
				//alert("warning: ajax request returned "+obj.status+"\r\nRequest: "+url);
				setEl(el,"Error loading "+url);
			}
			timeout2 = setTimeout("nextmessage(5)",1000);
			timeout = setTimeout("fetchmessages('progress', lastid);",5000);
			//inprogress=false;
		} else {
			
		}
	}

	var d=new Date();
	obj.open("GET","fetch.php?id="+lastid+'&t='+d.getTime(),true);
	obj.send(null);
}

function fetchmessages2(el,lastid){
	if (inprogress) return;
	inprogress=true;
	var obj = xmlObj();
	obj.onreadystatechange=function(){
		if (obj.readyState==4) {
			if (obj.status==200) {
				addmsgs(el,obj.responseText);
			} else {
				//alert("warning: ajax request returned "+obj.status+"\r\nRequest: "+url);
				setEl(el,"Error loading "+url);
			}
			inprogress=false;
		} else {
			
		}
	}
	var d = new Date();
	obj.open("GET","fetch.php?id="+lastid+'&t='+d.getTime(),true);
	obj.send(null);
}

function whoison(){
	setTimeout("ajaxSetEl('tools/streaminfo.php','listen',whoison);",30000);
}


function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}


function stickyonoff(el){
	if (getEl(el).style.display=="block" || getEl(el).style.display=="") {
		getEl(el).style.display="none";
		getEl(el+'btn').innerHTML = "+ show sticky messages";
		createCookie("sticky","0")
	} else {
		getEl(el).style.display="block";
		getEl(el+'btn').innerHTML = "- hide sticky messages";
		createCookie("sticky","1")
	}	
}

function RestoreSticky(){
	if(readCookie("sticky") == "0")
		stickyonoff("stickyposts");
}

