//javascript document

//hlavni objekt
function O_BubbleInfo()
{
  var ajaxServerPath = "/js/ajax/";
  //funkce projde vsechny html prvky a vrati ty, ktere maji atribut class prefix bubble_
  this.bubble_returnClasses = function () 
  {
    var arr = [];
    var elements = document.getElementsByTagName('*'), i = 0, e; 
    while (e = elements[i++]) 
    {
      if (e.className && (bubble_processClass(e.className) != "")) 
      {
          arr[arr.length] = e;
      }
    }   
    return arr;
  }
    
  //najde pres AJAX  v databazi odpovidajici bubliny
  //vytvari spojeni se serverem a nastavuje obsluznou funkci pro asynchroni volani
  this.bubble_setBubbleEvents = function ()
  {
    var bubbleArr = this.bubble_returnClasses(); 
    var getParam = "?bubbleID=";
    var duplicityArr = [];
    var id = "";
    var key;
    for(var key = 0; key < bubbleArr.length; key++) 
    {  
      //alert('bubbleArr[key]: '+bubbleArr[key]+"; key: "+key);  
      id = bubble_processClass(bubbleArr[key].className);
      //alert('id: '+id+"; key: "+key);
      //overeni, jestli bylo id uz pridavano do dotazu - predchazeni duplicity
      if(duplicityArr[id] != true){
      //formovani dotazu, jednotlive identifikatory jsou oddeleny pomoci "<-;->"
        getParam += id+"<-;->"; 
      }
      duplicityArr[id] = true;  
    }  
    if(bubbleArr.length > 0)
    {
      var url = ajaxServerPath + "bubbleAjax.php";
      var out = "";
      var httpRequest = createXMLHTTPObject();
//       if (window.ActiveXObject)
//       {
//         httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
//       }
//       else
//       {
//         httpRequest = new XMLHttpRequest();
//       }
      httpRequest.open("GET", url+getParam, true);
      httpRequest.onreadystatechange = function () { bubble_processRequest(bubbleArr,httpRequest); } ;
      
      httpRequest.send(null);
  
    }
  } 
}           
//funkce, ktera kontroluje vyskyt urciteho prefixu v className a vraci identifikator za timto prefixem
//pokud je v retezci vyskytu vic, vraci vzdy ten posledni
function bubble_processClass(str)
{ 
  if(!str) return "";
  var prefix = "bubble_";
  var classNameArr = str.split(" ");
  var strOut = "";
  for(var i=0; i < classNameArr.length; i++)
  {
    if (classNameArr[i].indexOf(prefix) == 0)
    {
      strOut = classNameArr[i].substring(0+prefix.length,classNameArr[i].length);
    }
  }
  return strOut;
}   
//funkce, ktera obsluhuje udalost pri najeti mysi na element 
function bubble_servEventOnmouseover()
{
  bubbleInfo2(this,this.bubble_html);
}
//funkce, ktera obsluhuje udalost pri odjeti mysi z elementu
function bubble_servEventOnmouseout()
{
  bubbleInfoDelete2();
}
//funkce spracovavajici odpoved od serveru
//nastavuje udalosti
function bubble_processRequest(bubbleArr,httpRequest)
{ 
  if (httpRequest.readyState == 4)
  {
    if(httpRequest.status == 200)
    {    
         
      //return httpRequest.responseText;
      //result = httpRequest.responseText;  
      //alert(httpRequest.responseText);
      var xmlRoot = httpRequest.responseXML.documentElement;
      var bubbles = xmlRoot.getElementsByTagName('bubble'); 
      //projdu vsechny bubliny vracene ze serveru
      var i=0;
      var bubble;
      while(bubble = bubbles.item(i++))
      {               
        var id = bubble.childNodes[0].firstChild.data;
        var html = bubble.childNodes[1].firstChild.data;
        //k bubline ze serveru najdu element z pole elementu ze vstupniho parametru 
        for(var j=0;j < bubbleArr.length; j++)
        { 
          //naleznu odpovidajici elementy ze serveru a od klienta
          if(bubble_processClass(bubbleArr[j].className) == id)
          {
            //do elementu pridam obsah bubliny
            bubbleArr[j].bubble_html = html;

            //pridam udalosti, pri kterych vyskoci popripade zmizi bublina
            bubble_addEvent(bubbleArr[j],'mouseout',bubble_servEventOnmouseout);
            bubble_addEvent(bubbleArr[j],'mouseover',bubble_servEventOnmouseover);
            
            //bubbleArr[j].onmouseover = function(){bubbleInfo2(this,this.bubble_html);};
            //bubbleArr[j].onmouseout = function(){bubbleInfoDelete2();};           
          }
        }
      } 
    }
    else
    {
      //alert( "Chyba pri nacitani stanky"+ httpRequest.status +":"+ httpRequest.statusText);
    }
  }
}
//pridani udalosti k elementu
//obj - html element
//type - nazev udalosti (mouseclick,load)
//fn - obsluzna funkce
function bubble_addEvent( obj, type, fn )
{
	if (obj.addEventListener)
		obj.addEventListener( type, fn, false );
	else if (obj.attachEvent)
	{
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
	}
}
var XMLHttpFactories = [
	function () {return new XMLHttpRequest()},
	function () {return new ActiveXObject("Msxml2.XMLHTTP")},
	function () {return new ActiveXObject("Msxml3.XMLHTTP")},
	function () {return new ActiveXObject("Microsoft.XMLHTTP")}
];

function createXMLHTTPObject() {
	var xmlhttp = false;
	for (var i=0;i<XMLHttpFactories.length;i++) {
		try {
			xmlhttp = XMLHttpFactories[i]();
		}
		catch (e) {
			continue;
		}
		break;
	}
	return xmlhttp;
}

//po vypsani html stranky se zavola funkce, ktera priradi ke vsem elementum, ktere maji atribut class zacinajici prefixem "bubble_", bublinu.
new O_BubbleInfo().bubble_setBubbleEvents();
