/*
    nazev:    HODNOCENI (objekt hodnoceni)
    projekt:  CFN v2
    autor:    orangeSOFT s.r.o. & Laki <info@laki.cz>
    release:  1.1 <07-03-2009>
    
    zavislost: ajaxObject()
    
    popis:    dynamicke hlasovani s moznosti menit hlasovani a pregenerovani obsahu po hlasovani
*/

//definice kostruktoru objektu
function hodnoceni(el, type, id, proc)
{
  //pracovni elementy
  this.el = document.getElementById(el);  
  this.elHodnota = null;
  this.elPlocha = null;
  this.elPosuvnik = null;
  this.elVoteButton = null;
  this.ajax = null;         //instance objektu ajax
  this.ajaxCallback = null; //definice AJAX callback metody
  this.ajaxType = type;     //parametr 'type' pro zaslani vysledku hlasovani AJAXem
  this.ajaxId = id;         //parametr 'id' pro zaslani vysledku hlasovani AJAXem
  this.ajaxURL = "http://redesign.cfn.cz/box/hodnoceni/ajax_hlasuj";
  //souracdnice mysi
  this.xcoord = null;
  this.ycoord = null;
  //element kontroly, pokud je true, je vse v poradku
  this.ok = false;
  //pracovni promenne
  this.leva = 0;      //vypoctena leva pocatecni pozice posuvniku
  this.startleva = 0; //vypoctena leva pocatecni pozice posuvniku pri inicializaci objektu
  this.startx = 0;    //pozice, kde probehl zacatek drag&drop 
  this.min = 0;       //minimum posuvniku
  this.max = 0;       //maximum posuvniku
  this.value = null;
  //obsluzne funkce udalosti
  this.eventMousedown = null;
  this.eventMousemove = null;
  this.eventMouseup = null;
  this.eventVote = null;
  //konstatnty - pocet pixelu
  this.cSirkaPlochyPosuvniku = 202;   //sirka plochy posuvniku
  this.cSirkaOkraje = 3;        //sirka okraje posuvniku, plocha na okraji, kam se posuvnik nedostane
  this.cSirkaPosuvniku = 8;     //sirka posuvniku
  //elementy pro zpracovani vysledku hlasovani
  this.elHodnoceno = null;      //element, kam se zapise seznam poslednich hlasovani
  this.elSkore = null;          //element, kam se zapise nove skore
  
 
  //vyhledat potrebne eementy pro budouci praci s nimi
  for (i=0;i<this.el.childNodes.length; i++)
  {    
    var cn = this.el.childNodes[i].className;
    
    if (cn == "h_title")
    {
      for (j=0;j<this.el.childNodes[i].childNodes.length; j++)
      {
        var cn2 = this.el.childNodes[i].childNodes[j].className;
        
        if (cn2 == "hodnota")
        {
          this.elHodnota = this.el.childNodes[i].childNodes[j];
        }
        if (cn2 == "title")
        {
          for (u=0;u<this.el.childNodes[i].childNodes[j].childNodes.length; u++)
          {
            var cn3 = this.el.childNodes[i].childNodes[j].childNodes[u].className;
            
            if (cn3 == "hlasuj")
            {
              this.elVoteButton = this.el.childNodes[i].childNodes[j].childNodes[u];
            }
          }
        }
      }
    } 
      
    if (cn == "scroll")
    {
      for (j=0;j<this.el.childNodes[i].childNodes.length; j++)
      {
        var cn2 = this.el.childNodes[i].childNodes[j].className;
        
        if (cn2 == "plocha")
        {
          this.elPlocha = this.el.childNodes[i].childNodes[j];
        }
        
        if (cn2 == "posuvnik")
        {
          this.elPosuvnik = this.el.childNodes[i].childNodes[j];
        }
      }
    }

  }
  
  //definice metod
  this.insertText = hodnoceni_insertText;
  this.setHodnota = hodnoceni_setHodnota;
  this.setSkore = hodnoceni_setSkore;
  
  this.set = hodnoceni_set;
  
  this.processAJAX = hodnoceni_processAJAX;
  
  this.addHodnoceno = hodnoceni_addHodnoceno;
  this.addSkore = hodnoceni_addSkore;
  
  
  if (this.elHodnota != null && this.elPlocha != null && this.elPosuvnik != null)
  {
    this.ok = true;
    
    //vypocet pracovnich hodnot
    this.leva = parseInt(this.elPosuvnik.offsetLeft)+this.cSirkaOkraje; //pocatecni pozice posuvniku+okraj
    this.startleva = this.leva;   //pocateni leva (Firefox...)  
    this.min = this.leva; //minimum posuvniku
    this.max = this.min+this.cSirkaPlochyPosuvniku-this.cSirkaPosuvniku-this.cSirkaOkraje-this.cSirkaOkraje; //maximum posuvniku - sirka posuvniku-min_posuvniku-2xokraj

    this.elPosuvnik.style.left = this.min+"px"; //nastavit vychozi pozici posuvniku na minumnum, tj. nulu

    this.setHodnota("X");  //nastavit vychozi hodnotu
    
    //navazani eventu      
    this.eventMousedown = hodnoceni_events.addEventListener(this.elPosuvnik, "mousedown", this.dragStart, this);

    this.eventVote = hodnoceni_events.addEventListener(this.elVoteButton, "mousedown", this.vote, this);
  }
  
  if (typeof(proc) != "undefined")
  { //pokud je pri inicializaci znama hodnota, nastav ji
    this.set(proc);
  } 
}

//metoda pro nastaveni testoveho obsahu
function hodnoceni_insertText(el, txt)
{
  if (this.ok)
  {
    var innertext = (document.getElementsByTagName("body")[0].innerText != undefined) ? true : false;
    if (!innertext)
    {
      el.textContent = txt;
    }
    else
    {
      el.innerText = txt;
    }
  }
}

//metoda pro nastaveni textove hodnoty hodnoceni
function hodnoceni_setHodnota(txt)
{
  if (this.ok)
  {
    this.insertText(this.elHodnota, txt + "%");
  }
}

//metoda pro nastaveni textove hodnoty celkoveho skore
function hodnoceni_setSkore(txt)
{
  if (this.ok)
  {
    if (this.elSkore != null)
    { 
      //zlikvodovat cely obsah elBoxMini
      if (this.elSkore.hasChildNodes() )
      {
        while (this.elSkore.childNodes.length >= 1)
        {
          this.elSkore.removeChild(this.elSkore.firstChild);       
        }
      }
      
      var procento = Math.round(parseInt(txt)*10)/10;  //zaokrouhlit na jedno desetinne cislo
      if(procento > 0) {
        var celeProcento = Math.floor(procento);
        var desetinaProcenta = procento - celeProcento;
      } else {
        var celeProcento = "X";
        var desetinaProcenta = "";
      }
      var strong = document.createElement("strong");
      
      strong.appendChild(document.createTextNode(celeProcento));
      this.elSkore.appendChild(strong);
      //this.elSkore.appendChild(document.createTextNode("." + desetinaProcenta + " %"));
      this.elSkore.appendChild(document.createTextNode(" %"));
    }
  }
}

//metoda pro nastaveni pozice posuvniku hodnoty podle procenta
function hodnoceni_set(proc)
{
  if (this.ok)
  {
    proc = Math.round(proc);  //zobrazovat a pracovat jen s celymi procenty
    
    l = Math.round((this.max-this.min)*proc/100); //leve odsazeni
    
    x = 200-l+this.min-this.startleva;   //posun pozadi plochy posuvniku
    x = "-"+x.toString()+"px 0px";
    this.elPlocha.style.backgroundPosition = x;

    l += this.min;  
    this.elPosuvnik.style.left = l+"px";
  
    this.setHodnota(proc);
  }
}

//metoda prirazeni elementu HODNOCENO pro zpracovani AJAX hlasovani
function hodnoceni_addHodnoceno(id)
{
  if (this.ok)
  {
    this.elHodnoceno = document.getElementById(id);
  }
}

//metoda prirazeni elementu SKORE pro zpracovani AJAX hlasovani
function hodnoceni_addSkore(id)
{
  if (this.ok)
  { 
    this.elSkore = document.getElementById(id);
  }
}

//metoda pro zpracobani vysledku AJAX hlasovani
function hodnoceni_processAJAX(responseText, responseStatus, responseXML)
{  
  if (responseStatus==200)
  {
    var xmldoc = responseXML;
    
    var root = xmldoc.getElementsByTagName("root").item(0);
    
    var celkove_skore = root.getElementsByTagName("celkovehodnoceni").item(0).firstChild.nodeValue     
    if(celkove_skore != 'x') {
      this.setSkore(celkove_skore);
    }
    
    if (this.elHodnoceno != null)
    {
      var pocet_hodnoceni = root.getElementsByTagName("pocet_hodnoceni").item(0).firstChild.nodeValue;
    
      var historie_hodnoceni = root.getElementsByTagName("hodnoceni");  //prepsat nove Skore
      
      var a = new Array();  //pole elementu Hodnotitel k odstraneni
      
      //projit cely blok Hodnoceno
      var h = this.elHodnoceno.getElementsByTagName("div");
      for (i=0; i<h.length; i++)
      {
        if (h.item(i).className == "pocet_hodnoceni")
        { // nastavi novou hodnotu celkoveho poctu hodnoceni
          h.item(i).getElementsByTagName("span").item(0).firstChild.nodeValue = pocet_hodnoceni;
        }
        if (h.item(i).className == "hodnotitel")
        {
          a.push(h.item(i));  //prida do pole elementu dalsi zaznam 
        } 
      }
      //smazat vsechny stavajici (ulozene) elementy Hodnotitel
      for (i=0; i<a.length; i++)
      {
        a[i].parentNode.removeChild(a[i]);
      }
      
      //vygenerovat blok hodnotitelelu
      for (i=0;i<historie_hodnoceni.length; i++)
      {
        var uzivatel = historie_hodnoceni.item(i).getElementsByTagName("uzivatel").item(0).firstChild.nodeValue;
        var hodnota = historie_hodnoceni.item(i).getElementsByTagName("hodnota").item(0).firstChild.nodeValue;
        
        //<div class="hodnotitel">uzivatel<span>75</span></div>
        var n1 = document.createElement("div");
        n1.className = "hodnotitel";
        n1.appendChild(document.createTextNode(uzivatel));
        var n2 = document.createElement("span");
        n2.appendChild(document.createTextNode(hodnota));
        n1.appendChild(n2);
        this.elHodnoceno.appendChild(n1); 
      }
    }
  }
  else
  {
    //chyba AJAX prenosu
  }
}

//definice obsluznych event funkci objektu
hodnoceni.prototype = {
  //metoda pro zjisteni pozice mysi
  "mouseposition" : function(e)
  {
    if (!e)
    {
      e = window.event;
    }
    if (!e)
    {
      return;
    }
    if (typeof(e.pageX) == 'number')
    { //Mozilla
      this.xcoord = e.pageX;
      this.ycoord = e.pageY;
    }
    else if (typeof(e.clientX) == 'number')
    { //IE
      this.xcoord = e.clientX;
      this.ycoord = e.clientY;
      if (document.body && (document.body.scrollLeft || document.body.scrollTop))
      {
        this.xcoord += document.body.scrollLeft;
        this.ycoord += document.body.scrollTop;
      }
      else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop) )
      {
        this.xcoord += document.documentElement.scrollLeft;
        this.ycoord += document.documentElement.scrollTop;
      }
    }
    else
    { //nejde zjistit, nejaka historie
      return;
    }
  },
  
  //metoda pro zahajeni posunu posuvniku
  "dragStart": function(e)
  {
    this.mouseposition(e);  //zjistit pozici mysi
    
    this.leva = parseInt(this.elPosuvnik.offsetLeft); //aktualni leva pozice posuvniku
    this.startx = this.xcoord;  //startovaci pozice pohybu posuvniku

    //registrace udalosti
    this.eventMousemove = hodnoceni_events.addEventListener(document, "mousemove", this.dragMove, this);
    this.eventMouseup = hodnoceni_events.addEventListener(document, "mouseup", this.dragEnd, this);
    
    //zrusit dalsi probublavani udalosti
    if (!e) var e = window.event;
    e.cancelBubble = true;
    if (e.stopPropagation) e.stopPropagation();
  },
  
  //metoda pro posun posuvniku
  "dragMove" : function(e)
  {
    this.mouseposition(e);  //zjistit pozici mysi
    
    deltax = this.xcoord-this.startx;
    l = this.leva + deltax;
    if (l > this.max)
    {
      l = this.max;
    }
    if (l < this.min)
    {
      l = this.min;
    }
    
    this.elPosuvnik.style.left = l+"px";
  
    delta = this.max-this.min;
    proc = parseInt((l-this.min)*100/delta);
    this.setHodnota(proc);
  
    x = this.cSirkaPlochyPosuvniku-l+this.min;
    x = "-"+x+"px 0px";
    this.elPlocha.style.backgroundPosition = x;
  
    //zrusit dalsi probublavani udalosti
    if (!e) var e = window.event;
    e.cancelBubble = true;
    if (e.stopPropagation) e.stopPropagation();
  },
  
  //metoda pro ukonceni posunu posuvniku
  "dragEnd" : function(e)
  {  
    hodnoceni_events.removeEventListener(document, "mousemove", this.eventMousemove);
    hodnoceni_events.removeEventListener(document, "mouseup", this.eventMouseup);

    this.mouseposition(e);
    
    deltax = this.xcoord-this.startx;
    l = this.leva + deltax;
    if (l > this.max)
    {
      l = this.max;
    }
    if (l < this.min)
    {
      l = this.min;
    }
    this.value = l;
    
    this.elPosuvnik.style.left = l+"px";
    
    delta = this.max-this.min;
    proc = parseInt((l-this.min)*100/delta);
    
    this.value = proc;
  },
  
  "vote" : function(e)
  {
    proc = this.value;

    this.ajax = new ajaxObject(this.ajaxURL);
    //definovat metodu pro zpracovani AJAX odpovedi
    this.ajaxCallback = hodnoceni_events.getAJAXcallback(this.processAJAX, this);
    this.ajax.callback = this.ajaxCallback;
    this.ajax.update("type=" + this.ajaxType + "&id=" + this.ajaxId + "&v=" + proc); //odeslat GET pozadavek
  }
}


//prirazeni eventu s redefinici event funkce pro integraci s objekty
hodnoceni_events = {
  //vygeneruje callback funkci, ktera prida stavajici kontext objektu
  "getAJAXcallback": function(fnct, scope)
  {
    var f = scope ? function(responseText, responseStatus, responseXML) { fnct.apply(scope, [responseText, responseStatus, responseXML]); } : fnct;
    return f;
  },
  //povesi na element udalost evenName obsouzenou eventHandlerem v kontextu objektu scope
  "addEventListener" : function(element, eventName, eventHandler, scope)
  {  
    //vytvori volaci funkci na metodu s kontextem objektu
    var scopedEventHandler = scope ? function(e) { eventHandler.apply(scope, [e]); } : eventHandler;
    
    if(document.addEventListener)  
    { //Firefox, Opera... - bez probublavani
      element.addEventListener(eventName, scopedEventHandler, false);
    }
    else if (document.attachEvent)
    { //IE
      element.attachEvent("on"+eventName, scopedEventHandler);
    }
    
    return scopedEventHandler;    //vrati vytvorenu funkci, ktera je navazana na event
  },
  
  //odstrani na objektu element udalosti eventName handler eventHandler
  "removeEventListener" : function(element, eventName, eventHandler)
  {
    if(document.removeEventListener)
    { //Firefox, Opera...
      element.removeEventListener(eventName, eventHandler, false);
    }
    else if (document.detachEvent)
    { //IE
      element.detachEvent("on"+eventName, eventHandler);
    }
  }
}
