
var loading = false;
var loader;
var loaderImgPath = '/img/progress.gif';
var styleNormal = 'btn';
var styleDisabled = 'btn-dis';
var TIMER = 10; // interval refreshe
var STEP = 0.1;  // velikost zmeny pruhlednosti pri jednom kroku
var DELAY = 500;
var GROWTIMER = 10;



//-----------------------------------------------------------------------------
//zpusob zobrazeni hlasu (hlasy, procenta)
function switchDetails(bar, type){
  var votes = bar.getElementsByTagName('span')[0];
  var percents = bar.getElementsByTagName('span')[1];
  
  if(type=='percents'){
    votes.style.display = 'none';
    percents.style.display = 'block';
  }
  else{
    votes.style.display = 'block';
    percents.style.display = 'none';
  } 
}

//-----------------------------------------------------------------------------
// iniciace ankety

function pollInit(){
  // loader
  loader = document.createElement('div');
  loader.setAttribute('id','loader');
  var loaderImg = document.createElement('img');
  loaderImg.setAttribute('alt','čekejte prosím');
  loaderImg.setAttribute('src', loaderImgPath);
  loader.appendChild(loaderImg);
  loader.style.display = 'none';
  getObj('anketa').appendChild(loader);
  
  // prepinani zobrazeni procent a hlasu
  var bars = getObj('answers').getElementsByTagName('div');
  var k = bars.length;
  for(var i=0; i<k; i++){
    if(bars[i].className=='votes-bar'){
      bars[i].onmouseover=function(){switchDetails(this, 'percents')};
      bars[i].onmouseout=function(){switchDetails(this, 'votes')};
    }
  }
}

//-----------------------------------------------------------------------------
// obsluha hlasovani

function vote(answerId){
  elementEffect(getObj('answers'), 'hide', '');
  displayLoader();
  hideBars();
  send_xmlhttprequest(updatePoll, 'GET', '/inc/poll_vote.php?answer_id=' + answerId);
}


// ----------------------------------------------------------------------------
// zobrazeni loaderu (working)

function displayLoader(){
  setOpacity(loader, 0);
  loader.style.display = 'block';
  elementEffect(loader, 'appear');
}

//-----------------------------------------------------------------------------
// skryti loaderu

function hideLoader(){
  loader.style.display = 'none';
}


//-----------------------------------------------------------------------------
// skryti sloupcu

function hideBars(){
  var answerObj = getObj('answers');
  var bars = answerObj.getElementsByTagName('div');
  for (var i=0; i < bars.length; i++) {
    if(bars[i].className == 'votes-bar')
      bars[i].style.visibility = 'hidden';
  }
}

//-----------------------------------------------------------------------------
// zobrazeni sloupcu

function showBars(){
  var answerObj = getObj('answers');
  var bars = answerObj.getElementsByTagName('div');
  for (var i=0; i < bars.length; i++) {
    if(bars[i].className == 'votes-bar')
      bars[i].style.visibility = 'visible';
  }
}


// ----------------------------------------------------------------------------
// funkce zjisti, zda je promena definovana

function isset(varname){
  if(typeof( window[ varname ] ) != "undefined") return true;
  else return false;
}

// ----------------------------------------------------------------------------
// funkce nastavi pruhlednost danemu elementu

function setOpacity(obj, level) {
  obj.style.opacity = level;
  obj.style.MozOpacity = level;
  obj.style.KhtmlOpacity = level;
  obj.style.filter = "alpha(opacity=" + (level * 100) + ")";
  obj.alpha = level;
  //alert(obj.alpha);
}

//-----------------------------------------------------------------------------
// obsluha fade-in, fade-out efektu

function elementEffect(obj, effect, width){
  clearInterval(obj.timer);
  //alert(obj);
  if(effect=='hide'){
    obj.alpha = 1;
    obj.timer = setInterval(function(){fadeOut(obj, 0)}, TIMER);  
  }
  else if(effect=='appear'){
    obj.alpha = 0;
    obj.timer = setInterval(function(){fadeIn(obj, 1)}, TIMER);
  }
  else if(effect=='grow'){
    growElement(obj, 0, width);
  }
}

//-----------------------------------------------------------------------------
// grow efekt

function growElement(obj, currWidth, maxWidth){
  //alert(currWidth);
  if(currWidth >= maxWidth){
    clearTimeout(obj.timer);
  }
  else{
    if(maxWidth == minWidth)
      currWidth += 1;
    else
      currWidth = currWidth + Math.round((maxWidth-currWidth)/20);
    obj.style.width = currWidth + 'px';
    obj.timer = setTimeout(function(){growElement(obj, currWidth, maxWidth)}, GROWTIMER);
  }
}


// ----------------------------------------------------------------------------
// fade-in efekt

function fadeIn(obj, finalOpacity){
  obj.style.visibility = 'visible';
  var value = obj.alpha;
  value += STEP;
  setOpacity(obj, value);

  if(value >= finalOpacity){
    clearInterval(obj.timer);
    setOpacity(obj, finalOpacity);
  } 
}

// ----------------------------------------------------------------------------
// fade-out efekt

function fadeOut(obj, finalOpacity){
  var value = obj.alpha;
  value -= STEP;
  setOpacity(obj, value);

  if(value <= finalOpacity){
    clearInterval(obj.timer);
    setOpacity(obj, finalOpacity);
    if(finalOpacity == 0) obj.style.visibility = 'hidden';
  }
}


//-----------------------------------------------------------------------------
// obsluha XML odpovedi

function updatePoll(xmlhttp){
  if(xmlhttp.readyState == 4) {
    //alert(xmlhttp.responseText);
    hideLoader();
    elementEffect(getObj('answers'), 'appear', '');
    showBars();
    
    var total = xmlhttp.responseXML.getElementsByTagName('total')[0].firstChild.data;
    var max = xmlhttp.responseXML.getElementsByTagName('max')[0].firstChild.data;
    
    getObj('total-votes').innerHTML = 'Celkem hlasovalo ' + total + ' uživatelů ';
    
    var answers = xmlhttp.responseXML.getElementsByTagName('answer');
    for (var i=0; i < answers.length; i++) {
        
        var barDiv = getObj('default-bar-' + answers[i].getAttribute('num'));
        barDiv.setAttribute('id', 'bar-' + answers[i].getAttribute('num'));
        barDiv.style.width = '0px';
        
        getObj('triger-' + answers[i].getAttribute('num')).onclick = function(){};
        
        var votes_count = parseInt(answers[i].getAttribute('votes'));
        if(votes_count > 0)
          width = (votes_count / max * maxWidth) + basicWidth;
        
        else
          width = minWidth;
        
        barDiv.style.visibility = 'visible';
        elementEffect(barDiv, 'grow', width);
        
        var votes = barDiv.getElementsByTagName('span')[0];
        switch(votes_count){
          case 1 : votes.innerHTML = '1 hlas'; break;
          case 2 : votes.innerHTML = '2 hlasy'; break;
          case 3 : votes.innerHTML = '3 hlasy'; break;
          case 4 : votes.innerHTML = '4 hlasy'; break;
          default : votes.innerHTML = votes_count + ' hlasů';
        }
        if(votes_count == 0) votes.className = 'votes-black';
        
        var percents = barDiv.getElementsByTagName('span')[1];
        percents.innerHTML=answers[i].getAttribute('percent') + '%';
        if(votes_count == 0) percents.className = 'percent-black';
    }
    loading = false;  
  }
}


/** odeslání XMLHttp požadavku
* @param function obsluha funkce zajišťující obsluhu při změně stavu požadavku, dostane parametr s XMLHttp objektem
* @param string method GET|POST|...
* @param string url URL požadavku
* @param string [content] tělo zprávy
* @param array [headers] pole předaných hlaviček ve tvaru { 'hlavička': 'obsah' }
* @return bool true v případě úspěchu, false jinak
* @copyright Jakub Vrána, http://php.vrana.cz
*/
function send_xmlhttprequest(obsluha, method, url, content, headers) {
    var xmlhttp = (window.XMLHttpRequest ? new XMLHttpRequest : (window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : false));
    if (!xmlhttp) {
        return false;
    }
    xmlhttp.open(method, url);
    xmlhttp.onreadystatechange = function() {
        obsluha(xmlhttp);
    };
    if (headers) {
        for (var key in headers) {
            xmlhttp.setRequestHeader(key, headers[key]);
        }
    }
    xmlhttp.send(content);
    return true;
}

