/*
Common functions
*/

// DOM
function raz_node(node, sauf)
{
    var i = 0;
    if (node.hasChildNodes())
    {
        while (node.firstChild)
        {
            i = i + 1;
            if(!sauf || node.firstChild.id != sauf)
            {
                node.removeChild(node.firstChild);
            }
            if(sauf != '' && node.childNodes.length == 1)
            {
                break;
            }
        }
    }
    return;
}
function cree_span(parent, texte, classe)
{
	var mon_span;
	mon_span = window.document.createElement('span');
	mon_span.className = classe;
	mon_span.innerHTML = texte;
	parent.appendChild(mon_span);
	return mon_span;
}
function cree_lien(parent, url, texte, cible, classe)
{
	var mon_lien;
	mon_lien = window.document.createElement('a');
	if (cible)
	{
		mon_lien.setAttribute('target', cible);
	}
	mon_lien.setAttribute('href', url);
	if (classe)
	{
		mon_lien.className = classe;
	}
	if(typeof texte == 'string')
	{
		var mon_texte = window.document.createTextNode(texte);
	  mon_lien.appendChild(mon_texte);
	}
	else
	{
	  mon_lien.appendChild(texte);
	}
	parent.appendChild(mon_lien);
	return mon_lien;
}
function cree_img(parent, src, classe, largeur, hauteur, bordure)
{
    if(!bordure)
    {
        bordure = '0';
    }
    var img = document.createElement('img');
    img.setAttribute('src', src);
    if(classe)
    {
        img.className = classe;
    }
    if(largeur)
    {
        img.setAttribute('width', largeur);
    }
    if(hauteur)
    {
        img.setAttribute('height', hauteur);
    }
    img.setAttribute('border', bordure);
    if(parent)
    {
        parent.appendChild(img);
    }
    return img;
}
function cree_lien_img(href_parent, href_url, href_cible, href_classe, sep, img_src, img_classe, img_largeur, img_hauteur, img_bordure)
{
	var mon_lien;
	mon_lien = window.document.createElement('a');
	if (href_cible)
	{
		mon_lien.setAttribute('target', href_cible);
	}
	mon_lien.setAttribute('href', href_url);
	if (href_classe)
	{
		mon_lien.className = href_classe;
	}
  if(sep)
  {
      mon_lien.appendChild(document.createTextNode(sep));
  }
  cree_img(mon_lien, img_src, img_classe, img_largeur, img_hauteur, img_bordure);
  if(sep)
  {
      mon_lien.appendChild(document.createTextNode(sep));
  }
  if(href_parent)
  {
      href_parent.appendChild(mon_lien);
  }
	return mon_lien;
}

// Misc Math function
function roundNumber(num, dec)
{
  var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
  return result;
}
function LZ(x)
{
	x = parseInt(x, 10);
	return(x < 0 || x > 9 ? '' : '0') + x;
}

// Misc String functions
function capitalize(s)
{
  return s.charAt(0).toUpperCase() + s.substr(1).toLowerCase();
}


// Debugging functions
// This function recursively inspects passed objects
// and stores property information in a string. This string is 
// returned after there are no more object properties to examine
function parseObj(obj)
{
    objCount = 0;
    var objStr = '';
    for (prop in obj)
    {
        objStr += '<TR><TD>Property: </TD><TD><B>' + prop + '</B></TD><TD>Type: </TD><TD><B>' + typeof(obj[prop]) + 
        '</B></TD><TD>Value: </TD><TD><B>'  + obj[prop] + '</B></TD></TR>';
        if (typeof(obj[prop]) == 'object') {
        objStr += parseObj(obj[prop]);
        }
    }
    return objStr;
}

// This function displays object properties accumulated from parseObj() 
function objProfile()
{
    var objTable = '<TABLE BORDER=2 CELLSPACING=0><TR><TD><H1>Object Profile</H1></TD></TR>';
    for (var i = 0; i < arguments.length; i++)
    { 
        objTable += '<TR><TD><BR><BR><H2><TT>' + (i + 1) + ') ' + arguments[i] +  '</H2></TD></TR>';
        objTable += '<TR><TD><TT><TABLE CELLPADDING=5>' + parseObj(eval(arguments[i])) + '</TABLE></TD></TR>';
    }
    objTable += '</TABLE><BR><BR><BR>';
    return objTable;
}


/*
  Fonctions d'affichage des QuickPoll
*/

function QP_DisplayVotes(questionId, numCols)
{
  QP_EmptyDivResults();
  QP_DisplayDivVote(questionId, numCols);
}
function QP_DisplayDivVote(questionId, numCols)
{
  var div_QP;
  for(var i = 0; i < qpList.length; i++)
  {
    div_QP = document.getElementById('QP_' + qpList[i].id);
    div_QP.style.display = 'none';
  }
  div_QP = document.getElementById('QP_' + questionId);
  div_QP.style.display = 'block';
	// Vote DIV
	var my_vote_div = document.getElementById('qp_votes' + questionId + '_' + numCols);
	if(my_vote_div)
	{
	  my_vote_div.style.display = 'block';
	}
}
function QP_EmptyDivResults()
{
  // DIV Content on 1 column
	var my_div_content = document.getElementById('qp_res_cont');
	// Effacer les contenus
	if(my_div_content)
	{
	  my_div_content.innerHTML = '';
	}
	
	// Left DIV Content on 2 columns
	var my_left_div_content = document.getElementById('qp_res_left_cont');
	// Right DIV Content
	var my_right_div_content = document.getElementById('qp_res_right_cont');

	// Effacer les contenus
	if(my_left_div_content)
	{
	  my_left_div_content.innerHTML = '';
	}
	if(my_right_div_content)
	{
	  my_right_div_content.innerHTML = '';
	}
	// Effacer les stats : date d'expiration et nombre de votes
	var my_div_stats = document.getElementById('qp_stats_cont');
	if(my_div_stats)
	{
	  my_div_stats.innerHTML = '';
	}
}
function QP_getDate(s)
{
  var tab_tmp = s.split('T');
  var yy = tab_tmp[0].split('-')[0];
  var mm = parseInt(tab_tmp[0].split('-')[1]);
  var dd = tab_tmp[0].split('-')[2];
  var hh = tab_tmp[1].split(':')[0];
  var mn = tab_tmp[1].split(':')[1];
  var ss = tab_tmp[1].split(':')[2];
  var ret = new Date(yy, mm, dd, hh, mn, ss);
  return ret;
}
function QP_Display(my_qp, orig)
{
  if(!orig)
  {
    orig = 'single';
  }
  if(orig == 'list' || orig == 'onload_list')
  {
    QP_StopCurrentAnimation();
    QP_DisplayDivVote(my_qp.id, my_qp.numCols);
  }
  if(orig == 'onload_list')
  {
    // Tester si le QuickPoll est encore ouvert aux votes
    //  -> si oui, afficher préférentiellement la liste des réponses
    return;
  }
	// Vote DIV
	var my_vote_div = document.getElementById('qp_votes' + my_qp.id + '_' + my_qp.numCols);
	if(my_vote_div)
	{
	  my_vote_div.style.display = 'none';
	}

  // Effacer les contenus
  QP_EmptyDivResults();
  
  // Afficher / masquer les containers 1 colonne / 2 colonnes
    // DIV Content : 1 column model
  var my_div_content = document.getElementById('qp_res_cont');
  // Left DIV Content : 2 columns model
  var my_left_div_content = document.getElementById('qp_res_left_cont');
  // Right DIV Content : 2 columns model
	var my_right_div_content = document.getElementById('qp_res_right_cont');
	
	if(my_qp.numCols == 2)
	{
	  if(my_div_content)
	  {
	    my_div_content.style.display = 'none';
	  }
  	if(my_left_div_content && my_right_div_content)
  	{
	    my_left_div_content.style.display = 'block';
	    my_right_div_content.style.display = 'block';
	  }

		// Dynamics DIV Contents Left and Right
		var my_dyn_div_left = window.document.createElement('div');
		var my_dyn_div_right = window.document.createElement('div');
	}
	else
	{
	  if(my_div_content)
	  {
  	  my_div_content.style.display = 'block';
  	}
  	if(my_left_div_content && my_right_div_content)
  	{
  	  my_left_div_content.style.display = 'none';
	    my_right_div_content.style.display = 'none';
    }
		
		// Dynamic DIV Contents
		var my_dyn_div = window.document.createElement('div');
	}
	
	for(i = 0; i < my_qp.answers.length; i++)
	{
		var ans = my_qp.answers[i];
		//var percent = Math.round(roundNumber(ans.nb_votes * 100 / my_qp.nb_votes, 1));
		var percent = Math.round(ans.nb_votes * 100 / my_qp.nb_votes);
		
		var my_div_answer = window.document.createElement('div');
		my_div_answer.setAttribute('id', 'res_' + i);
		my_div_answer.className = 'answer';
		
		// Libellé de la réponse
		var my_span_lib = window.document.createElement('h5');
		my_span_lib.setAttribute('id', 'lib_' + i);
		my_span_lib.appendChild(window.document.createTextNode(ans.lib));
		my_div_answer.appendChild(my_span_lib);
		
		// Jauge du pourcentage de votes : tableau de deux cellules
		var my_div_jauge = window.document.createElement('div');
		my_div_jauge.className = 'jauge_' + my_qp.numCols + 'col';
		my_div_jauge.setAttribute('id', 'jauge_' + i);
		my_div_jauge.style.border = 'solid 1px #B4B4B4';
		//my_div_jauge.style.width = '100%';
		my_div_jauge.style.height = '13px';
		var my_jauge_table = document.createElement('table');
		my_jauge_table.setAttribute('width', '100%');
		my_jauge_table.setAttribute('height', '13px');
		var my_jauge_tablebody = document.createElement('tbody');
		var my_jauge_row = document.createElement('tr');
		var my_jauge_cell_1 = document.createElement('td');
		my_jauge_cell_1.setAttribute('id', 'jauge_1_' + i);
		my_jauge_cell_1.className = 'jauge_empty';
		my_jauge_cell_1.width = '1%';
		my_jauge_row.appendChild(my_jauge_cell_1);
		var my_jauge_cell_2 = document.createElement('td');
		my_jauge_cell_2.setAttribute('id', 'jauge_2_' + i);
		my_jauge_cell_2.className = 'jauge_empty';
		my_jauge_cell_2.width = '99%';
		my_jauge_row.appendChild(my_jauge_cell_2);
		my_jauge_table.appendChild(my_jauge_tablebody);
		my_jauge_tablebody.appendChild(my_jauge_row);
		my_div_jauge.appendChild(my_jauge_table);
		
		// Pourcentage en chiffres
		var my_span_percent = window.document.createElement('span');
		my_span_percent.setAttribute('id', 'perc_' + i);
		my_span_percent.className = 'percent';
		// DEBUG
		/*
		if(i == 1 || i == 2)
		{
			percent = 100;
		}
		else if(i == 4)
		{
			percent = 0;
		}
		*/
		//my_span_percent.appendChild(window.document.createTextNode(percent + '%'));
		my_span_percent.appendChild(window.document.createTextNode('0%'));
		
		// Attention à l'ordre d'insertion des noeuds :
		//	-> insérer d'abord le pourcent puis la jauge en raison du style float:right de ces deux éléments
		my_div_answer.appendChild(my_span_percent);
		my_div_answer.appendChild(my_div_jauge);

		if(my_qp.numCols == 2)
		{
			// Insertion du résultat la colonne de gauche ou de droite selon la parité de l'indice
			if(i % 2 == 0)
			{
				my_dyn_div_left.appendChild(my_div_answer);
			}
			else
			{
				my_dyn_div_right.appendChild(my_div_answer);
			}
			my_left_div_content.appendChild(my_dyn_div_left);
			my_right_div_content.appendChild(my_dyn_div_right);
			//alert('LEFT :\n' + my_left_div_content.innerHTML + '\n\nRIGHT:\n' + my_right_div_content.innerHTML);
		}
		else
		{
			my_dyn_div.appendChild(my_div_answer);
			my_div_content.appendChild(my_dyn_div);
		}
	}
	
	// Affichage des stats : date d'expiration, nombre total de votes
	if(orig == 'list' || orig == 'onload_list')
	{
	  var qp_stats = document.getElementById('qp_stats');
	  var marker = document.getElementById('marker_stats');
	  if(qp_stats && marker)
	  {
	    var qp_enddate = QP_getDate(my_qp.enddate);
	    var my_div_stats = document.getElementById('qp_stats_cont');
	    if(!my_div_stats)
	    {
	      my_div_stats = window.document.createElement('div');
	      my_div_stats.setAttribute('id', 'qp_stats_cont');
	      my_div_stats.className = 'stats';
	      qp_stats.insertBefore(my_div_stats, marker);
	    }
	    else
	    {
	      my_div_stats.innerHTML = '';
	    }

	    // Date d'expiration
	    var my_div = window.document.createElement('div');
	    my_div.setAttribute('id', 'qp_stats_expires');
	    my_div.className = 'left , twocolumn , textleft';
	    var my_span = window.document.createElement('span');
	    my_span.appendChild(window.document.createTextNode(libExpires + ' : '));
	    my_div.appendChild(my_span);
	    my_span = window.document.createElement('span');
	    my_span.style.fontWeight = 'bold';
	    my_span.appendChild(window.document.createTextNode(LZ(qp_enddate.getDate()) + '/' + LZ(qp_enddate.getMonth()) + '/' + qp_enddate.getFullYear()));
	    my_div.appendChild(my_span);
	    my_div_stats.appendChild(my_div);
	    
	    // Nombre total de votes
	    my_div = window.document.createElement('div');
	    my_div.setAttribute('id', 'qp_stats_votes');
	    my_div.className = 'left , twocolumn , textright';
	    my_span = window.document.createElement('span');
	    my_span.appendChild(window.document.createTextNode(libNumberOfVotes + ' : '));
	    my_div.appendChild(my_span);
	    my_span = window.document.createElement('span');
	    my_span.style.fontWeight = 'bold';
	    my_span.appendChild(window.document.createTextNode(my_qp.nb_votes));
	    my_div.appendChild(my_span);	    
	    my_div_stats.appendChild(my_div);
	    
	    var my_p = window.document.createElement('p');
	    my_p.className = 'spacer';
	    my_div_stats.appendChild(my_p);
    }
  }
  
	// Lancement des chronos de remplissages des Jauges
	QP_AnimationResults(my_qp);
}

var qp_timers = new Array();

// Uses the global qp_timers
function QP_StopCurrentAnimation()
{
  var my_timer;
  for(var i = 0; i < qp_timers.length; i++)
  {
    my_timer = qp_timers[i];
    window.clearTimeout(my_timer);
    my_timer = 0;
  }
  qp_timers = new Array();
}

function QP_AnimationResults(my_qp)
{
	for(var i = 0; i < my_qp.answers.length; i++)
	{
		var ans = my_qp.answers[i];
		//var percent = Math.round(roundNumber(ans.nb_votes * 100 / my_qp.nb_votes, 1));
		var percent = Math.round(ans.nb_votes * 100 / my_qp.nb_votes);
		// DEBUG
		/*
		if(i == 1 || i == 2)
		{
			percent = 100;
		}
		else if(i == 4)
		{
			percent = 0;
		}
		*/
		if(percent != 0)
		{
			var pas;
			if(percent < 5)
			{
				pas = 1;
			}
			else if(percent < 10)
			{
				pas = 2;
			}
			else if(percent < 50)
			{
				pas = 5;
			}
			else
			{
				pas = 10;
			}
			var j = 1;
			var val = j*pas;
			while(val < percent)
			{
				var str = 'QP_setJauges(' + i + ', ' + val + ')';
				window.setTimeout(str, j*300);
				val = (j++) * pas;
			}
			var str = 'QP_setJauges(' + i + ', ' + percent + ')';
			qp_timers[qp_timers.length] = window.setTimeout(str, (j+1)*300);
		}
	}
}

function QP_setJauges(answer, percent)
{
	var my_jauge_cell_1 = document.getElementById('jauge_1_' + answer);
	var my_jauge_cell_2 = document.getElementById('jauge_2_' + answer);
	var my_span_percent = document.getElementById('perc_' + answer);
	if(!isNaN(percent))
	{
	  // Encapsulation nécessaire
	  if(my_jauge_cell_1 && my_jauge_cell_2 && my_span_percent)
	  {
		  if(percent == 0)
		  {
			  my_jauge_cell_1.className = 'jauge_empty';
			  my_jauge_cell_2.className = 'jauge_empty';
			  my_jauge_cell_1.width = '50%';
			  my_jauge_cell_2.width = '50%';
		  }
		  else if(percent == 100)
		  {
			  my_jauge_cell_1.className = 'jauge_full';
			  my_jauge_cell_2.className = 'jauge_full';
			  my_jauge_cell_1.width = percent + '%';
			  my_jauge_cell_2.width = (100 - percent) + '%';
		  }
		  else
		  {
			  my_jauge_cell_1.className = 'jauge_full';
			  my_jauge_cell_2.className = 'jauge_empty';
			  my_jauge_cell_1.width = percent + '%';
			  my_jauge_cell_2.width = (100 - percent) + '%';
		  }
  		//alert(answer + '\t\t' + my_jauge_cell_1.width + '\t\t' + my_jauge_cell_2.width);
	  	my_span_percent.innerHTML = percent + '%';
		}
	}
}

/* Liste */

var pagination = 7;

function sortListByEndDate(x1, x2)
{   
   // Tri descendant selon la date de fin du QuickPoll
   return (QP_getDate(x1.enddate) > QP_getDate(x2.enddate))? -1 : 1;
}
function sortListByNbDaysDiff(x1, x2)
{   
   // Tri ascendant selon le nb_days_diff du QuickPoll
   return (x1.nb_days_diff < x2.nb_days_diff)? -1 : 1;
}
function sortListById(x1, x2)
{   
   // Tri descendant ID du QuickPoll
   return (x1.id > x2.id)? -1 : 1;
}
function calc_pages(tab_data)
{
    if(tab_data.length <= pagination)
    {
        nb_pages = 1;
    }
    else
    {
        nb_pages = Math.floor(tab_data.length / pagination) + (tab_data.length % pagination != 0 ? 1 : 0);
    }
    return;
}
function qp_pagination()
{  
    //pagination
    var cont_pagination = document.getElementById('qp_pagination');
    if(cont_pagination)
    {
        cont_pagination.innerHTML = '';

        if(nb_pages > 1)
        {
            var lien = '';

            if(page > 1)
            {
                lien = 'javascript:QP_RedirectPagination(' + (1) + ');';
                if(imgFirstNav)
                {
                    cree_lien_img(cont_pagination, lien, '', '', '\u00a0', imgFirstNav, '', '', '', '')
                }
                else
                {
                    cree_lien(cont_pagination, lien, '\u00a0' + '>>' + '\u00a0', '', '');
                }
                lien = 'javascript:QP_RedirectPagination(' + (page - 1) + ');';
                if(imgPrevNav)
                {
                    cree_lien_img(cont_pagination, lien, '', '', '\u00a0', imgPrevNav, '', '', '', '')
                }
                else
                {
                    cree_lien(cont_pagination, lien, '\u00a0' + '<' + '\u00a0', '', '');
                }
            }
            for(i = 1; i <= nb_pages; i++)
            {
                if(i != page)
                {
                    lien = 'javascript:QP_RedirectPagination(' + i + ');';
                    cree_lien(cont_pagination, lien, '\u00a0' + i + '\u00a0', '', '');
                }
                else
                {
                    cree_span(cont_pagination, '\u00a0' + i + '\u00a0', 'bold');
                }
            }
            if(page < nb_pages)
            {
                lien = 'javascript:QP_RedirectPagination(' + (page + 1) + ');';
                if(imgNextNav)
                {
                    cree_lien_img(cont_pagination, lien, '', '', '\u00a0', imgNextNav, '', '', '', '')
                }
                else
                {
                    cree_lien(cont_pagination, lien, '\u00a0' + '>' + '\u00a0', '', '');
                }
                lien = 'javascript:QP_RedirectPagination(' + (nb_pages) + ');';
                if(imgLastNav)
                {
                    cree_lien_img(cont_pagination, lien, '', '', '\u00a0', imgLastNav, '', '', '', '')
                }
                else
                {
                    cree_lien(cont_pagination, lien, '\u00a0' + '>>' + '\u00a0', '', '');
                }
            }
        }
    }
    return;
}
function QP_RedirectPagination(page)
{
    QP_DisplayList(qpList, page);
}
function QP_DisplayList(tab_data, num_page)
{
    var i = 0;
    var str_tmp = '';
    if(!num_page)
    {
        num_page = 1;
    }
    page = num_page;
    
    var cont_data = document.getElementById('qp_list');
    if(cont_data)
    {
      raz_node(cont_data, 'marker');
      var cont_elem, node_elem, p_elem, sp_elem, sep_elem , t_node, strHtml = '', strResult = '', strVote = '';
      for(i = (num_page - 1)*pagination; i < num_page*pagination; i++)
      {
          if(!tab_data[i])
          {
              break;
          }

          // node conteneur
          cont_elem = document.createElement('div');
          cont_elem.setAttribute('id', 'QP_list_' + i);
          /*
          if(i == 0 || i % 2 == 0)
          {
              cont_elem.className = '';
          }
          else
          {
              cont_elem.className = '';
          }
          */
          cont_elem.className = 'list_item';
          if(i > 0)
          {
              cont_elem.style.borderTop = '1px #E8E8E8 solid';

            // Separator
            p_elem = document.createElement('p');
            p_elem.className = 'separator';
            cont_elem.appendChild(p_elem);
          }
          
          // ================
          // <title>
          // ================
          node_elem = document.createElement('div');
          if(tab_data[i].optionaltitle)
          {
            // Optional title
            sp_elem = document.createElement('span');
            //sp_elem.style.color = '#4C90DB';
            //sp_elem.style.fontWeight = 'bold';
            sp_elem.className = 'opt_title';
            t_node = window.document.createTextNode(tab_data[i].optionaltitle + ' - ');
            sp_elem.appendChild(t_node);
            node_elem.appendChild(sp_elem);
          }
          // Question
          sp_elem = document.createElement('span');
          //sp_elem.style.color = '#004898';
          //sp_elem.style.fontWeight = 'bold';
          sp_elem.className = 'question';
          t_node = window.document.createTextNode(tab_data[i].name);
          sp_elem.appendChild(t_node);
          node_elem.appendChild(sp_elem);
          if(tab_data[i].nb_days_diff <= 0)
          {
            strVote = 'javascript:QP_DisplayVotes(' + tab_data[i].id + ', ' + tab_data[i].numCols + ');';
            mon_lien = cree_lien(cont_elem, strVote, node_elem, '', 'action');
          }
          else
          {
            strResult = 'javascript:QP_Display(qpList[' + i + '], \'list\')';
            mon_lien = cree_lien(cont_elem, strResult, node_elem, '', 'action');
          }
          //cont_elem.appendChild(node_elem);
          // ================
          // <title>
          // ================

          /*
          // ================
          // <liens>
          // ================
          node_elem = document.createElement('div');
          // Separator
          p_elem = document.createElement('p');
          p_elem.className = 'separator';
          p_elem.style.clear = 'both';
          node_elem.appendChild(p_elem);
          if(tab_data[i].nb_days_diff <= 0)
          {
            // lien Voter : si end_date non dépassée
            sp_elem = document.createElement('span');
            sp_elem.className = 'aG';
            strVote = 'javascript:QP_DisplayVotes(' + tab_data[i].id + ', ' + tab_data[i].numCols + ');';
            cree_lien(sp_elem, strVote, '\u00a0' + '>' + '\u00a0' + libVote, '', '');
            node_elem.appendChild(sp_elem);
          }            
          // lien Voir les résultats
          sp_elem = document.createElement('span');
          sp_elem.className = 'aD';
          strResult = 'javascript:QP_Display(qpList[' + i + '], \'list\')';
          cree_lien(sp_elem, strResult, '\u00a0' + '>' + '\u00a0' + libSeeResult, '', '');
          node_elem.appendChild(sp_elem);
          // Ajout des liens au node conteneur
          cont_elem.appendChild(node_elem);
          // Separator
          p_elem = document.createElement('p');
          p_elem.className = 'separator';
          p_elem.style.clear = 'both';
          cont_elem.appendChild(p_elem);
          // ================
          // </liens>
          // ================
          */

          var marker = document.getElementById('marker');
          if(marker)
          {
              cont_data.insertBefore(cont_elem, marker);
          }
          else
          {
              cont_data.appendChild(cont_elem);
          }
      }
      qp_pagination();
    }
    return;
}
