// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults

//--------------------------------------------------------------------------------------------------
// Spinner
//--------------------------------------------------------------------------------------------------
function si_spinner_show() {
  $('spinner').show();
//  Element.setStyle( 'spinner', { visibility: 'visible' } );
  }

function si_spinner_hide() {
  $('spinner').hide();
//  Element.setStyle( 'spinner', { visibility: 'hidden' } );
  }

//--------------------------------------------------------------------------------------------------
function si_dec_text_field( field, min ) {
  v = parseInt( $F(field) );
  v = v - 1;
  if (v < min) { v = min; }
  $(field).value = v;
  }  
  
//--------------------------------------------------------------------------------------------------
function si_inc_text_field( field, max ) {
  v = parseInt( $F(field) );
  v = v + 1;
  if (v > max) { v = max; }
  $(field).value = v;
  }  
  
//--------------------------------------------------------------------------------------------------
function si_row_hover_in( event ) {
  var theTr = this; //Event.findElement( event, 'tr' );
  theTr.addClassName('hover');
  }

//--------------------------------------------------------------------------------------------------
function si_row_hover_out( event ) {
  var theTr = this; //Event.findElement( event, 'tr' );
  theTr.removeClassName('hover');
  }

//--------------------------------------------------------------------------------------------------
function si_open_choose_window(url, basename) {
  window.open(url, ("choose_win_" + basename), "width=800, height=640, top=100, left=100, resizable=yes");
}
//--------------------------------------------------------------------------------------------------
function si_opener_choosed_update( basename, plink, dname, id ) {
  var dnameField = window.opener.document.getElementById( basename + '_dname' );
  if (dnameField) dnameField.value = dname;
  var plinkField = window.opener.document.getElementById( basename + '_plink' );
  if (plinkField) plinkField.value = plink;
  var idField = window.opener.document.getElementById( basename + '_id' );
  if (idField) idField.value = id;
  }  

//--------------------------------------------------------------------------------------------------
function si_row_choosed( event ) {
  var theTr = Event.findElement( event, 'tr' );
  si_opener_choosed_update( cur_basename, theTr.readAttribute('plink'),
                            theTr.readAttribute('dname'), theTr.readAttribute('res_id') );
  self.close();
  }

//--------------------------------------------------------------------------------------------------
function si_decorate_hoverable_rows() {
  $$('table.index > tbody > tr').each(
    function(elt){
      elt.observe( 'mouseover', si_row_hover_in );
      elt.observe( 'mouseout', si_row_hover_out );
      }
    )
  $$('table.choose > tbody > tr').each(
    function(elt){
      elt.observe( 'mouseover', si_row_hover_in );
      elt.observe( 'mouseout', si_row_hover_out );
      if (!elt.hasClassName('paginator')) elt.observe( 'click', si_row_choosed );
      }
    )
  $$('table.index > tbody > tr > td.editable').each(
    function(elt){
      elt.observe( 'mouseover', si_row_hover_in );
      elt.observe( 'mouseout', si_row_hover_out );
      }
    )
  $$('table.index > tbody > tr > td > div.editable').each(
    function(elt){
      elt.observe( 'mouseover', si_row_hover_in );
      elt.observe( 'mouseout', si_row_hover_out );
      }
    )
  }

//--------------------------------------------------------------------------------------------------
function si_menu_hover_in( event ) {
  $('main_navigation').addClassName('hover');
  }

//--------------------------------------------------------------------------------------------------
function si_menu_hover_out( event ) {
  $('main_navigation').removeClassName('hover');
  }

//--------------------------------------------------------------------------------------------------
function si_decorate_hoverable_menu() {
  var menu = $('main_navigation')
  if (menu) {
    menu.observe( 'mouseover', si_menu_hover_in );
    menu.observe( 'mouseout', si_menu_hover_out );
    }
  }

//--------------------------------------------------------------------------------------------------
function closeMenu() {
  $('main_wrapper').addClassName('closed_menu');
  $('main_navigation').addClassName('closed_menu');
  $('menu_close').hide();
  $('menu_pin').show();
  }

//--------------------------------------------------------------------------------------------------
function pinupMenu() {
  $('main_wrapper').removeClassName('closed_menu');
  $('main_navigation').removeClassName('closed_menu');
  $('menu_close').show();
  $('menu_pin').hide();
  }

//--------------------------------------------------------------------------------------------------
function si_toggle_sort( inputId, linkId ) {
  inputElt = $(inputId);
  linkElt = $(linkId);
  spanElt = linkElt.down('span');
  new_sort = 'no_sort';
  switch (inputElt.value) {
    case 'asc_sort':
      new_sort = 'desc_sort';
      break;
    case 'desc_sort':
      new_sort = 'no_sort';
      break;
    default:
      new_sort = 'asc_sort';
      break;
    }
  spanElt.removeClassName( inputElt.value );
  inputElt.value = new_sort;
  spanElt.addClassName( inputElt.value );
  }

//--------------------------------------------------------------------------------------------------
function si_decorate_index_table() {
  $$('table input.pattern').each(
    function(i) {
      th = i.up('th');
      w = th.getStyle('width');
      if (w != '0px') {
        i.setStyle({ width : w });
        th.setStyle({ width : w });
        }
      }
    )
  $$('table input.combo_pattern').each(
    function(i) {
      th = i.up('th');
      w = th.getWidth();
      if (w != 0) {
        i.setStyle({ width : w+'px' });
        th.setStyle({ width : w+24+'px' });
        }
      }
    )
  }

//--------------------------------------------------------------------------------------------------
function si_decorate_index_table_named( name ) {
  $$('table#'+name+' input.pattern').each(
    function(e) {
      th = e.up('th');
      sw = th.getStyle('width');
      w = parseInt( sw.sub('px', '') );
      if (w != 0) {
        e.setStyle({ width : (w-2)+'px' });
        th.setStyle({ width : sw });
        }
      }
    )
  $$('table#'+name+' .combo_pattern').each(
    function(e) {
      th = e.up('th');
      sw = th.getStyle('width');
      w = parseInt( sw.sub('px', '') );
      if (w != 0) {
        e.setStyle({ width : (w-30)+'px' });
        th.setStyle({ width : sw });
        }
      }
    )
  }

//--------------------------------------------------------------------------------------------------
// Popup menu
//--------------------------------------------------------------------------------------------------
var si_popup_timeout;
var si_popup_delay = 500;
var si_popup_id;

function si_show_popup( elt ) {
  elt.show();
  si_popup_id = elt.id;
  var cmd = "$('" + elt.id + "').hide();";
  si_popup_timeout = setTimeout( cmd, 4*si_popup_delay );
  }

function si_start_hide( event ) {
  var elt = $(Event.element(event));
  if (!elt.hasClassName('popup')) elt = elt.up('.popup');
  si_popup_id = elt.id;
  var cmd = "$('" + elt.id + "').hide();";
  si_popup_timeout = setTimeout( cmd, 2*si_popup_delay );
  }

function si_stop_hide( event ) {
  var elt = $(Event.element(event));
  if (!elt.hasClassName('popup')) elt = elt.up('.popup');
  if (si_popup_id && elt.id == si_popup_id) {
    if (si_popup_timeout) { clearTimeout( si_popup_timeout ); }
    }
  }

function si_hide( event ) {
  var elt = $(Event.element(event));
  if (!elt.hasClassName('popup')) elt = elt.up('.popup');
  elt.hide();
  }

function si_decorate_popups() {
  $$('.popup').each(
    function(elt){
      elt.observe( 'mouseover', si_stop_hide );
      elt.observe( 'mouseout', si_start_hide );
      elt.observe( 'click', si_hide );
      elt.hide();
      }
    )
  }

//--------------------------------------------------------------------------------------------------
function si_decorate_form() {
  elems = $$('.initial_focus');
  if (elems[0] !== undefined) elems[0].activate();
  else {
    forms = $$('form');
    if (forms[0]) forms[0].focusFirstElement();
    }
  }

//--------------------------------------------------------------------------------------------------
function si_resize_viewport() {
  var header = $('main_header');
  var banner = $('banner');
  var footer = $('footer');
  var h = 0;
  if (header !== undefined) h = h + header.getHeight();
  if (banner !== undefined) h = h + banner.getHeight();
  if (footer !== undefined) h = h + footer.getHeight();
  h = document.viewport.getHeight() - h;
  var wrapper = $('main_wrapper');
  if (wrapper !== undefined) {
    wrapper.setStyle({ height : h+'px' });
    h = h - 30;
    var vwport = wrapper.down('.viewport');
    if (vwport !== undefined) vwport.setStyle({ height : h+'px' });
    else {
      content = wrapper.down('.content')
      if (content !== undefined) content.setStyle({ height : h+'px' });
      }
    }
  }

//--------------------------------------------------------------------------------------------------
function si_toggle_fieldset_panel(panel_id, link_id){
  panel_elt = $(panel_id);
  Element.toggle(panel_elt);
  span_elt = $(link_id).down('span');
  if (Element.visible(panel_elt)) {
    span_elt.removeClassName('arrow_down');
    span_elt.addClassName('arrow_up');
  }
  else {
    span_elt.removeClassName('arrow_up');
    span_elt.addClassName('arrow_down');
  }
}

//--------------------------------------------------------------------------------------------------
function setCookie(c_name, value, expiredays){
  var exdate = new Date();
  exdate.setDate( exdate.getDate() + expiredays );
  document.cookie = c_name + "=" + escape(value) + ( ( expiredays == null ) ? "" : ";expires=" + exdate.toGMTString() );
}

//--------------------------------------------------------------------------------------------------
function si_toggle_fieldset_tabs(tabs, selected_tab, tab_value, tab_editable){
  for(var i=0; i<tabs.length; i++) {
    panel_elt = $(tabs[i] + "_panel");
    tab_elt = $(tabs[i] + "_tab");
    if (tab_elt) {
      if (tab_value == tabs[i]) {
        panel_elt.className = 'panel_visible';
        tab_elt.className = 'sel';
      }
      else {
        panel_elt.className = 'panel_hidden';
        tab_elt.className = 'frame';
      }
    }
  }
  $(selected_tab).value = tab_value;
  setCookie(selected_tab, tab_value, 1);
  edit_elt = $('fieldset_edit');
  if (edit_elt) {
    if (tab_editable) { edit_elt.show(); }
    else { edit_elt.hide(); }
  }
}

//--------------------------------------------------------------------------------------------------
function si_decorate_all() {
  si_decorate_hoverable_menu();
  si_decorate_hoverable_rows();
  si_decorate_popups();
  si_decorate_form();
//  si_resize_viewport();
  }

//--------------------------------------------------------------------------------------------------
Event.observe( window, 'load', si_decorate_all );
// Event.observe( window, 'resize', si_resize_viewport );

//==================================================================================================
//
//  Edition in-line des cellules d'index.
//
//==================================================================================================

function cancel_inline_edition(elt) {
  var show_div = $(elt).up("td").down("div.show");
  var edit_div = $(elt).up("td").down("div.edition");
  var input = edit_div.down('input');
  var init_value_input = edit_div.down("input[type=hidden]");

  // If the input has been modified, we have to add
  // a selector to avoid the observeForm.
  if (input.value != init_value_input.value) input.addClassName("cancelled");
  switch_to_show(show_div, edit_div, input);
}

function switch_to_edition(elt) {
  var show_div = $(elt).up("td").down("div.show");
  var edit_div = $(elt).up("td").down("div.edition");
  var input = edit_div.down('input');

  switch_all_to_show();

  input.addClassName("visible");
  show_div.hide();
  edit_div.show();
}

function switch_to_show(show_div, edit_div, input) {
  edit_div.hide();
  show_div.show();

  // Reset the field to initial value ; we don't
  // want to keep a previous input.
  input.value = edit_div.down("input[type=hidden]").value;

  // Remove errors message (if any) in the label.
  var error_span = edit_div.down("label > span.error");
  if (error_span) error_span.innerHTML = "";

  // We now can safely remove this class.
  input.removeClassName("visible");
}

function switch_all_to_show(){
  $$('input.edition.visible').each(function(elt) {
    var show_div = $(elt).up("td").down("div.show");
    var edit_div = $(elt).up("td").down("div.edition");
    switch_to_show(show_div, edit_div, elt);
  });
}


function delete_index_row(elt, url) {
  /*  Suppression d'une ligne d'enregistrement depuis l'index.
   *
   * o Un champ authenticity_token doit être présent dans le DOM.
   *
   *
   * */

  var row = $(elt).up("tr");

  parameters = {
    "authenticity_token" : $('authenticity_token').value,
    "_method" : "delete"
  }

  new Ajax.Request(url, {
    method: 'post',
    parameters: parameters,
    onSuccess: function(transport) {
      // Supprime la row avec un petit effet "eye-candy".
      row.fade({ afterFinish: function(e) {e.element.remove();} });
    } // end onSuccess.
  });
}

function update_index_cell(elt, url, row_number, column_number, index_column_name) {
  /* Submit de la nouvelle valeur de la cellule.
   *
   * o Un champ authenticity_token doit être présent dans le DOM.
   *
   *
   * */
  var cell = $(elt).up("td");
  var show_div = cell.down("div.show");
  var edit_div = cell.down("div.edition");
  var input = edit_div.down("input")

  parameters = {
    "authenticity_token" : $('authenticity_token').value,
    "row_number" : row_number,
    "column_number" : column_number,
    "index_column_name" : index_column_name
  }
  parameters[input.getAttribute("name")] = input.value ;

  new Ajax.Request(url, {
    method: 'put',
    parameters: parameters,
    onSuccess: function(transport) {
      var response = transport.responseText;
      cell.update(response);
    } // end onSuccess.
  });
}

function formInEdition(form) {
  /*  Check si le formulaire d'index est en mode edition pour empecher
   *  le declenchement de la callback de l'observe form posée
   *  sur le formulaire de filtrage d'index.
   *
   *  TODO expliquer le truc du remove cancelled.
   *  a cause de l'observe form.
   */
  // TODO: etre specifique au formulaire dans la recherche des elts.
  if ( $$("input.edition.visible").length > 0 ) return true;
  if ( $$("input.edition.cancelled").length > 0 ){
    $$("input.edition.cancelled").each( function(elt) {
        elt.removeClassName("cancelled");
    });
    return true;
  }
  //if ( $$("input.edition.visible").length > 0 ) return true;
  return false;
}

/*
 * Initialisation des pages d'indexes, choose.
 *
 * */

var Index = {};

Index.initEventHandlers = function () {
  // When focus on a filter field, close all editions.
  $$("input.combo_pattern").each( function(elt) {
    elt.observe('focus', function(event) {
      switch_all_to_show();
    });
  });

  // Click on a combo list.
  // WARNING: lib.calendar also create some div.combo 
  // and do not clean its own mess.
  $$("table thead div.combo").each( function(elt) {
    elt.down('a').observe('click', function(event) {
      switch_all_to_show();
    });
  });

}
