
//var HIDDEN     = new Array();
//var SHOWHIDDEN = true;

var FLAGGED  = new Array();
var FLAGONLY = false;


function enhance_compare_form(){
  if(!document.getElementById) return;
  var frm = document.getElementById('compareform');
  if(!frm) return;

  addEvent(frm,'submit',check_compare_form);
}

function check_compare_form(){
  var frm = document.getElementById('compareform');

  var count = 0;
  for(var i=0; i<frm.elements.length; i++){
    var elem = frm.elements[i];
    if(elem.type != 'checkbox') continue;

    if(elem.checked){
      count++;
      if(count >= 2) return true;
    }
  }

  alert('Pour effectuer la comparaison, merci de sélectionner au moins deux moteurs!');
  return false;
}


function enhance_compare_table(){
  if(!document.getElementById) return;
  var tbl = document.getElementById('comparetable');
  if(!tbl) return;
  var master = document.getElementById('masterrow');
  if(!master) return;

  var rows = tbl.getElementsByTagName('tr');
  
  var len = rows.length;

  // walk the rows
  for(var i=0; i<len; i++){
    // only item rows please:
    if(rows[i].id.substr(0,5) != 'item_') continue;

    // create the button
    var btn = document.createElement('img');
    btn.className = 'hidebutton';
    btn.src = 'icons/shading.png';
    btn.id = rows[i].id+'_flag';

    // add button into first <th> cell
    var th = rows[i].getElementsByTagName('th')[0];
    th.insertBefore(btn,th.firstChild);
    // add event
    eval("addEvent(btn,'click',function(){ flag_toggle('"+rows[i].id+"'); });");
  }

  // init filter
  var filter = document.createElement('span');
  filter.id = 'flagfilter';
  master.appendChild(filter);
  addEvent(filter,'click',function(){flagfilter_set('toggle'); flag_updateall();});
  flagfilter_set(false);

  // load states
  flag_ajaxload();
}

function flagfilter_set(on){
  var filter = document.getElementById('flagfilter'); 

  if(on === null){
    on = FLAGONLY;
  }else if(on == 'toggle'){
    on = !FLAGONLY;
  }

  if(on){
    filter.className = 'flag_enabled';
    filter.innerHTML = 'Affichez toutes les fonctionnalités';
    FLAGONLY = true;
  }else{
    filter.className = 'flag_disabled';
    filter.innerHTML = 'Affichez les fonctionnalités marquées';
    FLAGONLY = false;
  }
}

/**
 * Calls flag_set with toggle and saves
 */
function flag_toggle(id){
  flag_set(id,'toggle');
  // save state
  flag_ajaxsave();
}

/**
 * Set a flag for an item_id, does not save
 */
function flag_set(id,on){
  var feat = id.substr(5,id.length);
  var btn = document.getElementById(id+'_flag');
  var row = document.getElementById(id);

  // if on not given or set to toggle get it from FLAGGED array
  if(on === null || on == 'toggle'){
    if(contains(FLAGGED,feat) !== null){
      on = (on=='toggle') ? false : true;
    }else{
      on = (on=='toggle') ? true : false;
    }
  }

  // set state of the flag
  if(on){
    btn.src = 'icons/flag_yellow.png';
    btn.title = 'Cliquez pour déselectionner';
    row.style.display = '';
    FLAGGED[FLAGGED.length] = feat;
  }else{
    btn.src = 'icons/flag_gray.png';
    btn.title = 'Cliquez pour marquer';
    if(FLAGONLY){
      row.style.display = 'none';
    }else{
      row.style.display = '';
    }
    var pos = contains(FLAGGED,feat);
    if(pos !== null) FLAGGED.splice(pos,1);
  }
  FLAGGED = unique(FLAGGED);
}

/**
 * Updates all flags according to the global array
 */ 
function flag_updateall(){
  var tbl = document.getElementById('comparetable');
  if(!tbl) return;
  var rows = tbl.getElementsByTagName('tr');
  var len = rows.length;

  for(var i=0; i<len; i++){
    if(rows[i].id.substr(0,5) != 'item_') continue;
    flag_set(rows[i].id,null);
  }
}

/**
 * Saves the current flagstates
 */
function flag_ajaxsave(){
  var data = FLAGGED.join('-');
  var ajax = new sack('ajaxflag.php');
  ajax.runAJAX('flagged='+data);
}

/**
 * Loads the flagstates and calls the callback
 */
function flag_ajaxload(){
  var ajax = new sack('ajaxflag.php');
  ajax.onCompletion = flag_ajaxload_cb;
  ajax.runAJAX('');
}

/**
 * Uses the loaded flagstates
 */
function flag_ajaxload_cb(){
  var data = this.response;
  if(data == ''){
    FLAGGED = new Array();
  }else{
    FLAGGED = data.split('-');
  }
  flag_updateall();
}



/**
 * Removes duplicates in the array 'a'
 * @author Johan Känngård, http://dev.kanngard.net
 */
function unique(a) {
  var tmp = new Array(0);
  for(var i=0;i<a.length;i++){
    if(contains(tmp, a[i]) === null){
      tmp.length+=1;
      tmp[tmp.length-1]=a[i];
    }
  }
  return tmp;
}

function contains(a, e) {
  for(var j=0;j<a.length;j++)if(a[j]==e)return j;
  return null;
}


// Main

addEvent(window,'load',enhance_compare_form);
addEvent(window,'load',enhance_compare_table);
