function addEvent(o,evt,f){
    if (o.attachEvent) window.attachEvent("on"+evt, f); 
    else o.addEventListener(evt, f, false);
}

function createHttpRequest()
{
	var xmlhttp;
	if (window.XMLHttpRequest) {
		xmlhttp=new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		alert("Your browser does not support XMLHTTP!");
	}
	return xmlhttp;
}

function executeSyncronRequest(url)
{
	var xmlhttp = createHttpRequest();
	xmlhttp.open("GET", url, false);
	xmlhttp.send(null);
	return xmlhttp.responseXML;
}

function executeAyncronRequest(xmlhttp, url, callback)
{
	xmlhttp.open("GET", url, true);
	xmlhttp.onreadystatechange = callback;
	xmlhttp.send(null);
	return xmlhttp;
}

function updateState(updater){
	updater.xmlhttp = createHttpRequest();
	executeAyncronRequest(updater.xmlhttp, updater.url, function () {updater.response();});
}

function updateProfil(updater,expertId){
	updater.xmlhttp = createHttpRequest();
	updater.refreshExpert(expertId);
}


function ExpertUpdater(language, country, _filter, affid, _phonetest){
	this.prefix = "e_";
	this.finished = true;
	this.xmlhttp = null;
	this.filter = _filter;

	var _affid = "0";
	if (null!=affid && affid!='undefined')
		_affid = affid;
	this.url = "/ajax/AjaxExpertRefreshState?lang=" + language + "&country=" + country + "&affid=" + _affid + "&" + this.filter;
	if (_phonetest == 'phonetest')
		this.url += "&phonetest";
	this.dataurl = "/ajax/AjaxExpertData?lang="+language+"&country="+country+"&affid="+_affid+"&id=";
	
	if(document.getElementById("e_-1") == null && document.getElementById("p_-1") != null) {
		this.prefix = "p_";
	}
	
	this.response = function() {
		if(this.xmlhttp.readyState == 4 && this.finished)
		{
			xml = this.xmlhttp.responseXML;
			var root = xml.getElementsByTagName('experts').item(0);
			if(root == null)
				return;
			
			
			this.finished = false;
			
			var cloneBox = document.getElementById(this.prefix+"-1");
			var boxContainer = cloneBox.parentNode;
			var box;
			var ids = new Array();
			var idx = 0;
			for(var i = 0; i < boxContainer.childNodes.length; i++) {
				if(boxContainer.childNodes[i].tagName == "DIV" && boxContainer.childNodes[i].id.substring(2) != "-1") {
					ids[idx] = boxContainer.childNodes[i].id.substring(2);
					idx++;
				}
			}
			
			var idsToStay = new Array();
			var doinsert = false;
			var ctnbase = "expertList";
			var ctnindex = 0;
			var ctnloopindex = 0;	
			if (document.getElementById(ctnbase + ctnindex) == null)
				return;
			
			var ctnsize = document.getElementById(ctnbase + ctnindex + "count").value;
			var ii = 0;
			for (var i = 0; i < root.childNodes.length; i++) {
				var node = root.childNodes.item(i);
				expertId = node.getAttribute("id");
				expertState = node.getAttribute("state");
				
				idsToStay[idsToStay.length] = expertId;
				this.moveBox(i - ii,ctnbase + ctnindex,expertId);
				
				if(expertState == "ONLINE" && this.isBoxChanged(expertId, expertState))
					this.changeBoxToOnline(expertId);
				if(expertState == "BUSY" && this.isBoxChanged(expertId, expertState))
					this.changeBoxToBusy(expertId);
				if(expertState == "OFFLINE" && this.isBoxChanged(expertId, expertState))
					this.changeBoxToOffline(expertId);

				++ctnloopindex;
				
				if (ctnloopindex == ctnsize) {
					var container = document.getElementById(ctnbase + ctnindex);
					for(var j = 0; j < container.childNodes.length; j++) {
						if (j < ctnsize)
							continue;
						
						container.childNodes[j].style.display = 'none';
					}
					
					if (idsToStay.length > 0) { 
						var lastitem = document.getElementById(this.prefix + idsToStay[idsToStay.length - 1]);
						if (lastitem != null)
							lastitem.className = lastitem.className + " lastitem";
					}
					
					++ctnindex;
					ctnloopindex = 0;
					
					if (document.getElementById(ctnbase + ctnindex) == null)
						break;
					
					ii += i + 1;
					ctnsize = document.getElementById(ctnbase + ctnindex + "count").value;
				}
			}
			
			for (var i = 0; i < ids.length; ++i) {
				var found = false;
				for (var j = 0; j < idsToStay.length; ++j) {
					if (idsToStay[j] == ids[i]) {
						found = true;
						break;
					}
				}
				
				if (!found) {
					var box = document.getElementById(this.prefix + ids[i]);
					box.parentNode.removeChild(box);
					
					if (document.getElementById('hb-' + ids[i]) != null) {
						var bubble = document.getElementById('hb-' + ids[i]);
						bubble.parentNode.removeChild(bubble);
					}
				}
			}
			
			if (idsToStay.length > 0) { 
				var lastitem = document.getElementById(this.prefix + idsToStay[idsToStay.length - 1]);
				if (lastitem != null && !lastitem.className.match("lastitem"))
					lastitem.className = lastitem.className + " lastitem";
			}
			this.finished = true;
		}
	};
	
	this.moveBox = function(index, containerid, expertid) {
		if (document.getElementById(this.prefix + expertid) == null) {
			this.addExpert(index, containerid, expertid);
			return;
		}
		
		var container = document.getElementById(containerid);
		var inserted = false;
		var box = null;
		for (var i = 0; i < container.childNodes.length && !inserted; ++i) {
			if (i == index) {
				box = document.getElementById(this.prefix + expertid);
				if (box == container.childNodes[i]) {
					inserted = true;
					break;
				}
				box.parentNode.removeChild(box);
				container.insertBefore(box, container.childNodes[i]);
				inserted = true;
			}
		}
		
		if (!inserted) {
			box = document.getElementById(this.prefix + expertid);
			box.parentNode.removeChild(box);
			container.appendChild(box);
		}
		
		if (box.className.match("lastitem")) {
			box.className = box.className.substring(0,box.className.length - 9);
		}
		box.style.display="";
	};
	
	this.refreshExpert = function (expertId) {
		var response = executeSyncronRequest(this.dataurl+expertId);
		var root = response.getElementsByTagName('expertdata').item(0);
		var state = response.getElementsByTagName('state').item(0).childNodes[0].nodeValue;
		if (state != null) {
			var container = document.getElementById("p_" + expertId) == null ? document.getElementById("e_" + expertId) : document.getElementById("p_" + expertId); 
			if (state == "ONLINE") {
				container.className = "profile-left";
				var boxLinks = container.getElementsByTagName("a");
				for (var j = 0; j < boxLinks.length; j++) {
					var button = boxLinks[j];
					if(button.getAttribute("rel") == "button")
					{
						var isnew = button.className.match(/(new)$/i) ? true : false;
						button.innerHTML = isnew ? document.getElementById('provider_callnow').innerHTML : document.getElementById('online').innerHTML;
						button.innerHTML += "<span class=\"rght\"></span>";
						button.className = isnew ? "btn-call-new" : "btn-call"; 
					}
					if(button.getAttribute("rel") == "phone")
					{
						button.className = "live";
						button.onmouseover=function(){Bubble.showBubble(this, 'hb-1', false, null, null, 'main-box');};
						button.onmouseout=function(){Bubble.hideBubble('hb-1');};
					}
					if(button.getAttribute("rel") == "chat") {
						button.className = "live";
						button.href = "/index?page=liveChat&id="+expertId;
					}
				}
				document.getElementById('calltoaction').innerHTML = document.getElementById('cta_online').innerHTML;
				
			} else if (state == "BUSY") {
				container.className = "profile-left modell-busy";
				var boxLinks = container.getElementsByTagName("a");
				for (var j = 0; j < boxLinks.length; j++) {
					var button = boxLinks[j];
					if(button.getAttribute("rel") == "button")
					{
						var isnew = button.className.match(/(new)$/i) ? true : false;
						button.innerHTML = document.getElementById('busy').innerHTML;
						button.innerHTML += "<span class=\"rght\"></span>";
						button.className = isnew ? "btn-busy-new" : "btn-busy"; 
					}
					if(button.getAttribute("rel") == "phone")
					{
						button.className = "";
						button.onmouseover = "";
						button.onmouseout = "";
					}
					if(button.getAttribute("rel") == "chat") {
						button.className = "";
						button.href = "";
					}
				}
				document.getElementById('calltoaction').innerHTML = document.getElementById('cta_busy').innerHTML;
			} else {
				container.className = "profile-left modell-offline";
				var boxLinks = container.getElementsByTagName("a");
				for (var j = 0; j < boxLinks.length; j++) {
					var button = boxLinks[j];
					if(button.getAttribute("rel") == "button")
					{
						var isnew = button.className.match(/(new)$/i) ? true : false;
						button.innerHTML = document.getElementById('offline').innerHTML;
						button.innerHTML += "<span class=\"rght\"></span>";
						button.className = isnew ? "btn-offline-new" : "btn-offline"; 
					}
					if(button.getAttribute("rel") == "phone")
					{
						button.className = "";
						button.onmouseover = "";
						button.onmouseout = "";
					}
					if(button.getAttribute("rel") == "chat") {
						button.className = "";
						button.href = "";
					}
				}
				document.getElementById('calltoaction').innerHTML = document.getElementById('cta_offline').innerHTML;
			}
		}
	}

	this.addExpert = function (index, containerid, expertId) {
		var response = executeSyncronRequest(this.dataurl+expertId);
		var root = response.getElementsByTagName('expertdata').item(0);
		
		var id;
		var image;
		var state;
		var screenname;
		var expertise;
		var description;
		var rating;
		var channel;
		var profileurl;
		var phonecode;
		var channel_videochat = false;
		var channel_phone = false;
		var channel_mail = false;
		var channel_quickreading = false;
		
		for (var i = 0; i < root.childNodes.length; i++)
		{
			var node = root.childNodes.item(i);
			if(node.tagName == "id")id = node.childNodes[0].nodeValue;
			if(node.tagName == "state")state = node.childNodes[0].nodeValue;
			if(node.tagName == "image")image = node.childNodes[0].nodeValue;
			if(node.tagName == "screenname")screenname = node.childNodes[0].nodeValue;
			if(node.tagName == "expertise")expertise = node.childNodes[0].nodeValue;
			if(node.tagName == "description")description = node.childNodes[0].nodeValue;
			if(node.tagName == "rating")rating = node.childNodes[0].nodeValue;
			if(node.tagName == "profileurl")profileurl = node.childNodes[0].nodeValue;
			if(node.tagName == "phonecode")phonecode = node.childNodes[0].nodeValue;
			if(node.tagName == "channel")
			{
				if(node.childNodes[0].nodeValue == "videochat")
					channel_videochat = true;
				if(node.childNodes[0].nodeValue == "phone")
					channel_phone = true;
				if(node.childNodes[0].nodeValue == "email")
					channel_mail = true;
				if(node.childNodes[0].nodeValue == "quickreading")
					channel_quickreading = true;
			}
		}
		 
		var sourceBox = document.getElementById(this.prefix+"-1");
		var boxContainer = sourceBox.parentNode;
		var box;

		box = sourceBox.cloneNode(true);
		box.id = this.prefix+id;
		//boxContainer.appendChild(box);  was before
		
		var boxSpans = box.getElementsByTagName("span");
		for (var k = 0; k < boxSpans.length; k++) {
			var button = boxSpans[k];
			if(button.getAttribute("rel") == "rating") {
				button.style.width = rating*20+"%";
			}
			if(button.getAttribute("rel") == "expertise") {
				button.innerHTML = expertise;
			}
		}
		var boxPs = box.getElementsByTagName("p");
		for (var i = 0; i < boxPs.length; i++) {
			var button = boxPs[i];
			if(button.getAttribute("rel") == "desc") {
				button.innerHTML = description;
			}
		}
		var boxLinks = box.getElementsByTagName("a");
		var chatAvailable = true;
		var mailAvailable = true;
		var quickreadingAvailable = true;
		for (var j = 0; j < boxLinks.length; j++) {
			var button = boxLinks[j];
			if(button.getAttribute("rel") == "image")
			{
				for (var imgindex=0; imgindex < button.childNodes.length; imgindex++) {
					if (button.childNodes[imgindex].tagName && button.childNodes[imgindex].tagName.toLowerCase() == "img") {
						button.childNodes[imgindex].src = image;
						break;
					}
				}
				button.href = button.href.replace("-1", id);
			}
			if(button.getAttribute("rel") == "more")
			{
				button.href = button.href.replace("-1", id);
			}
			if(button.getAttribute("rel") == "name")
			{
				button.innerHTML = screenname;
				button.href = button.href.replace("-1", id);
				button.id = "name_"+expertId;
			}
			if(button.getAttribute("rel") == "phone") {
				if(!channel_phone)
					button.style.display = "none";
				button.href = button.href.replace("-1", id);
			}
			if(button.getAttribute("rel") == "chat") {
				if(!channel_videochat) {
					button.style.display = "none";
					chatAvailable = false;
					if (!mailAvailable && !quickreadingAvailable) {
						button.parentNode.style.display = "none";
					}
				}
				button.href = button.href.replace("-1", id);
			}
			if(button.getAttribute("rel") == "mail") {
				if(!channel_mail) {
					button.style.display = "none";
					mailAvailable = false;
					if (!chatAvailable && !quickreadingAvailable) {
						button.parentNode.style.display = "none";
					}
				}
				button.href = button.href.replace("-1", id);
			}
			if(button.getAttribute("rel") == "quickreading") {
				if(!channel_quickreading) {
					button.style.display = "none";
					quickreadingAvailable = false;
					if (!chatAvailable && !mailAvailable) {
						button.parentNode.style.display = "none";
					}
				}
				button.href = button.href.replace("-1", id);
			}
		}
		
		var emaildivs = box.getElementsByTagName("div");
		for (var j = 0; j < emaildivs.length; j++) {
			var button = emaildivs[j];
			if (button.getAttribute("rel") == "mail") {
				if(!channel_mail) {
					button.style.display = "none";
					mailAvailable = false;
					if (!chatAvailable && !quickreadingAvailable) {
						button.parentNode.style.display = "none";
					}
				}
				button.onclick = function(){document.location.href='/mailcreate?id=' + id + '&amp;';};  // fixme
				break;
			}
		}
		
		if(this.prefix != "p_")
		{
			var sourceBubble = document.getElementById("hb--1"); 
			if (sourceBubble != null) {
				var bubble = sourceBubble.cloneNode(true);
				var bubbleContainer = sourceBubble.parentNode;
				bubbleContainer.insertBefore(bubble, sourceBubble);
				bubble.id = "hb-"+id;
				
				var bubbleStrongs = bubble.getElementsByTagName("strong");
				for (var l = 0; l < bubbleStrongs.length; l++) {
					var button = bubbleStrongs[l];
					if(button.getAttribute("rel") == "code") {
						button.innerHTML = phonecode;
					}
				}
			} else {
				var boxStrongs = box.getElementsByTagName("strong");
				for (var l = 0; l < boxStrongs.length; l++) {
					var button = boxStrongs[l];
					if(button.getAttribute("rel") == "code") {
						button.innerHTML = phonecode;
					}
				}
			}
		}else
		{
			var boxStrongs = box.getElementsByTagName("strong");
			for (var l = 0; l < boxStrongs.length; l++) {
				var button = boxStrongs[l];
				if(button.getAttribute("rel") == "code") {
					button.innerHTML = phonecode;
				}
			}
		}
		
		box.style.display="";
		
		var container = document.getElementById(containerid);
		var inserted = false;
		for (var i = 0; i < container.childNodes.length && !inserted; ++i) {
			if (i == index) {
				container.insertBefore(box, container.childNodes[i]);
				inserted = true;
			}
		}
		
		if (!inserted) {
			container.appendChild(box);
			//alert("addboxlast - " + expertId);
		}
		
		return state;
	};

	this.changeBoxToOnline = function (expertId) {
		var box = document.getElementById(this.prefix+expertId);
		
		box.className = "facebox";
		var profileUrl = document.getElementById("name_" + expertId).href;
		var boxLinks = this.prefix == "p_" ? box.getElementsByTagName("a") : box.getElementsByTagName("div");
		for (var j = 0; j < boxLinks.length; j++) {
			if(boxLinks[j].getAttribute("rel") == "chat")
				profileUrl = "/index?page=liveChat&id="+expertId;
		}

		for (var j = 0; j < boxLinks.length; j++) {
			var button = boxLinks[j];
			if(button.getAttribute("rel") == "button")
			{
				if(this.prefix != "p_")
				{
					button.innerHTML=document.getElementById('provider_callnow').innerHTML + "<span class=\"rght\"></span>";
					button.className = "btn-call-new";
					button.href = profileUrl;
				}else
				{
					button.innerHTML=document.getElementById('online').innerHTML + "<span class=\"rght\"></span>";
					button.className = "btn-call";
				}
			}
			if(button.getAttribute("rel") == "phone")
			{
				button.className = "live";
				button.onmouseover=function(){Bubble.showBubble(this, 'hb-'+expertId, false, null, null, 'main-box');}
				button.onmouseout=function(){Bubble.hideBubble('hb-'+expertId);}
			}
			if(button.getAttribute("rel") == "chat")
				button.className = "live";
			if(button.getAttribute("rel") == "calltoaction")
				button.innerHTML = document.getElementById('cta_online').innerHTML;
		}
		box.setAttribute("rel", "ONLINE");
	};

	this.changeBoxToBusy = function(expertId) {
		var box = document.getElementById(this.prefix+expertId);
		var profileUrl = document.getElementById("name_" + expertId).href;

		box.className = "facebox modell-busy";

		var boxLinks = this.prefix == "p_" ? box.getElementsByTagName("a") : box.getElementsByTagName("div");
		for (var j = 0; j < boxLinks.length; j++) {
			var button = boxLinks[j];
			if(button.getAttribute("rel") == "button")
			{
				button.innerHTML=document.getElementById('busy').innerHTML + "<span class=\"rght\"></span>";
				if(this.prefix != "p_")
				{
					button.className = "btn-busy-new";
					button.href = profileUrl;
				}else
				{
					button.className = "btn-busy";
				}
			}
			if(button.getAttribute("rel") == "phone")
			{
				button.className = "";
				button.onmouseover = "";
				button.onmouseout = "";
			}
			if(button.getAttribute("rel") == "chat")
				button.className = "";
			if(button.getAttribute("rel") == "calltoaction")
				button.innerHTML = document.getElementById('cta_busy').innerHTML;
		}
		box.setAttribute("rel", "BUSY");
	};

	this.changeBoxToOffline = function (expertId) {
		var box = document.getElementById(this.prefix+expertId);
		if (box == null)
			return;
		var profileUrl = document.getElementById("name_" + expertId).href;
		box.className = "facebox modell-offline";

		var boxLinks = this.prefix == "p_" ? box.getElementsByTagName("a") : box.getElementsByTagName("div");
		for (var j = 0; j < boxLinks.length; j++) {
			var button = boxLinks[j];
			if(button.getAttribute("rel") == "button")
			{
				button.innerHTML=document.getElementById('offline').innerHTML + "<span class=\"rght\"></span>";
				button.className = "btn-offline-new";
				button.href = profileUrl;
			}
			if(button.getAttribute("rel") == "phone")
			{
				button.className = "";
				button.onmouseover = "";
				button.onmouseout = "";
			}
			if(button.getAttribute("rel") == "chat")
				button.className = "";
			if(button.getAttribute("rel") == "calltoaction")
				button.innerHTML = document.getElementById('cta_offline').innerHTML;
		}
		box.setAttribute("rel", "OFFLINE");
	};

	this.isBoxChanged = function (expertId, expertState) {
		var box = document.getElementById(this.prefix+expertId);
		
		if (box == null)
			return false;
		
		if(box.getAttribute("rel") == expertState) {
			return false;
		}
		return true;
	};
}
