/***************************************************************************************************************************************
 *   tx_ifujobdb javascript ( FormManager, Session )
 *   @author        Stefan Steinbeck <info@stefan-steinbeck.de>
 ***************************************************************************************************************************************
 *
 *  variables                     see below
 *  ifu_FormManagerChildChange    Updates the contents of a html selection list respectif to the changes of a master list
 *  ifu_FormManagerInit           Manage relation between two html selection list (inside the same form). Called on page load.
 *  ifu_boxshow                   Show a certain "slave" container in a given "master" box and hide current content
 *  ifu_ajaxStore                 Store a query/note with an additional titel with an ajax request to an given url and additiona parameters
 *  ifu_ajaxQuery                 Submits a task (f.e. delete) by an ajax request to an given url with additional parameters
 *  ifu_changeText                Change a given text element to a input field and vice versa; Finnaly stores the content of the input field with ajax
 *  ifu_changeTextSubmit
 *  ifu_changeTextOnKeyDown
 *
 ***************************************************************************************************************************************
 *
 *  2006-03-20  ste  started
 *         -21  ste  finished version 1.0 of country-region update and responsible body - person update
 *       04-19  ste  try to fix ie bug (did not liked var name parent)
 *       05-10  ste  don't output an empty option anymore, if in selectable mode
 *       09-27  ste  adapted to extension name
 *       12-27  ste  beautified file; added ifu_boxshow function
 *  2007-01-09  ste  added ifu_storequery function and ajax functionality
 *         -17  ste  sstorequery-> ajaxstore and started to implent note storages
 *         -29  ste  added ifu_changeText
 *  2009-06-09  ste  added encodeURI istead of escape to ajaxStore
 *  
 ***************************************************************************************************************************************/


// init formmanager global variables
var ifu_FormManagerForm ;
var ifu_FormManagerInitCalled = false ;
var ifu_FormManagerMasterElement ;
var ifu_FormManagerChildElement ;
var ifu_FormManagerChildInit = "" ;
var ifu_FormManagerChildFields = new Array() ;

// create XMLHttpRequest instance
var aObj = false;
if( window.XMLHttpRequest ) {
  aObj = new XMLHttpRequest() ;
 } 
else if( window.ActiveXObject ) {
  aObj = new ActiveXObject( 'Microsoft.XMLHTTP' ) ;
 }



/***************************************************************************************************************************************
 * Updates the contents of a html selection list respectif to the changes of a master list
 *
 * @param  pointer  masterlist: pointer to select-one elemenet
 * @return  bool  success
 ***************************************************************************************************************************************/
function ifu_FormManagerChildChange( masterlist ) {

  // find selected parent element from parent field
  parent_idx = masterlist.options[ masterlist.selectedIndex ].value ; 

  // reset element of child list and select empty element
  ifu_FormManagerChildElement.length = 0 ;
  if( ifu_FormManagerChildInit.length == 0 )
    ifu_FormManagerChildElement.options[0] = new Option( "", "", false, true ) ;

  // print child list if found
  if( ifu_FormManagerChildInit.length == 0 ) {
    for( i = 0; i < ifu_FormManagerChildFields.length; ++i )
      if( ifu_FormManagerChildFields[i].parent == parent_idx )
        ifu_FormManagerChildElement.options[ ifu_FormManagerChildElement.options.length ] = 
            new Option( ifu_FormManagerChildFields[i].text, ifu_FormManagerChildFields[i].value, false, false ) ;
   }
  else
    for( i = 0; i < ifu_FormManagerChildFields.length; ++i )
      if( ifu_FormManagerChildFields[i].parent == parent_idx ) 
        if( ifu_FormManagerChildInit == ifu_FormManagerChildFields[i].value ) 
          ifu_FormManagerChildElement.options[ ifu_FormManagerChildElement.options.length ] = 
              new Option( ifu_FormManagerChildFields[i].text, ifu_FormManagerChildFields[i].value, false, true ) ;
        else
          ifu_FormManagerChildElement.options[ ifu_FormManagerChildElement.options.length ] = 
              new Option( ifu_FormManagerChildFields[i].text, ifu_FormManagerChildFields[i].value, false, false ) ;
  if( ifu_FormManagerChildInit.length != 0 )
    ifu_FormManagerChildInit = "" ;
  return true;
 }



/***************************************************************************************************************************************
 * Manage relation between two html selection list (inside the same form). Called on page load.
 *
 * @return  void
 ***************************************************************************************************************************************/
function ifu_FormManagerInit() {

  // check if called allready
  if( ifu_FormManagerInitCalled ) {
    return;
  }
  ifu_FormManagerInitCalled = true ;

  // Check if document contains ifu JobDB Form
  for( i = 0; i < document.forms.length; ++i )
    if( document.forms[i].name == "ifuJobDBFormManager" ) {
      ifu_FormManagerForm = document.forms[i] ;
      break ;
     }
  if( typeof ifu_FormManagerForm == "undefined" )
    return ;

  /**************************  Region - Country  ******************************/

  // Search html for "Region" select element
  FoundIt = false ; 
  for( i = 0; i < ifu_FormManagerForm.elements.length; ++i )
    if( ( ifu_FormManagerForm.elements[i].type == "select-one" ) &&
        ( ifu_FormManagerForm.elements[i].name == "JobDB_Address[region]" ) ) {
      ifu_FormManagerChildElement = ifu_FormManagerForm.elements[i] ; 
      FoundIt = true ; 
      break;
     }

  // Start JobDB_Address specific part and exit if preview
  if( FoundIt )  {
    if( ifu_FormManagerChildElement.disabled )
      return;

  // Search html for country select element
    FoundIt = false ; 
    for( i = 0; i < ifu_FormManagerForm.elements.length; ++i )
      if( ( ifu_FormManagerForm.elements[i].type == "select-one" ) &&
          ( ifu_FormManagerForm.elements[i].name == "JobDB_Address[country]" ) ) {
        ifu_FormManagerMasterElement = ifu_FormManagerForm.elements[i] ; 
        FoundIt = true ; 
        break;
       }
    if( ! FoundIt )
      return ;
    ifu_FormManagerMasterElement.onchange = function() { ifu_FormManagerChildChange( this ) ; };

    // Get list of regions for select field and determine selected element
    for( i = 1; i < ifu_FormManagerChildElement.options.length; ++i ) { 
      // start with element 1 to skip initial blank element, which is needed for preview
      child = ifu_FormManagerChildElement.options[ i ] ;
      ifu_FormManagerChildFields[ i - 1 ] = { 
                               text: child.text,
                               parent: child.value.substring( 0, 2 ),
                               value: child.value.substring( 0, 2 ) +"-"+
                                      child.value.substring( 3, child.value.length + 1 ) 
                              } ;
     }
    for( i = 0; i < ifu_FormManagerChildElement.options.length; ++i )
      if( ifu_FormManagerChildElement.options[i].selected ) 
        ifu_FormManagerChildInit = ifu_FormManagerChildElement.options[i].value ;
  
    // Update region list field
    ifu_FormManagerChildChange( ifu_FormManagerMasterElement ) ;

    /********************************************************/
   } 
  else {
    /*************************  Resp. body org. - rbo contact person  *******************************/

    // Search html for "Responible Body Person" (from job db) select element  
  for( j = 0; j < ifu_FormManagerForm.elements.length; ++j )
    if( ( ifu_FormManagerForm.elements[j].type == "select-one" ) &&
        ( ifu_FormManagerForm.elements[j].name == "JobDB_Job[application_person_id]" ) ) {
      ifu_FormManagerChildElement = ifu_FormManagerForm.elements[j] ;
      break;
     }
  if( typeof ifu_FormManagerChildElement != "undefined" ) {

    // Start JobDB_Job specific part and exit if preview
  if( ifu_FormManagerChildElement.disabled )
    return;
  
  // Search html for "Responible Body" organisation select element  
  for( k = 0; k < ifu_FormManagerForm.elements.length; ++k )
    if( ( ifu_FormManagerForm.elements[k].type == "select-one" ) &&
        ( ifu_FormManagerForm.elements[k].name == "JobDB_Job[application_organisation_id]" ) ) {
      ifu_FormManagerMasterElement = ifu_FormManagerForm.elements[k] ; 
      break;
     }
  if( typeof ifu_FormManagerMasterElement == "undefined" )
    return ;
  ifu_FormManagerMasterElement.onchange = function() { ifu_FormManagerChildChange( this ) ; };

  // Get list of "responsible bodies" for select field and determine selected element
  for( l = 1; l < ifu_FormManagerChildElement.options.length; ++l ) { 
    // start with element 1 to skip initial blank element, which is needed for preview
    child = ifu_FormManagerChildElement.options[l] ;
    ifu_FormManagerChildFields[ l - 1 ] = { 
                             text: child.text,
                             parent: child.title,
                             value: child.value  
                            } ;
   }
  for( i = 0; i < ifu_FormManagerChildElement.options.length; ++i )
    if( ifu_FormManagerChildElement.options[i].selected ) 
      ifu_FormManagerChildInit = ifu_FormManagerChildElement.options[i].value ;
  
  // Update person list field
  ifu_FormManagerChildChange( ifu_FormManagerMasterElement ) ;

  } }
  /********************************************************/
  
  return ;
}



/***************************************************************************************************************************************
 * Show a certain "slave" container in a given "master" box and hide current content (used for navigation in the session box)
 *
 * @param  string  master: id of master element
 * @param  string  slave: id of slave element
 * @return  bool  success
 ***************************************************************************************************************************************/
function ifu_boxshow( master, slave  ) {
  //debugout = 'ifu_boxshow called with master="' + master +'" and slave="' + slave + '"\n\n' ;
  // get master and slave elements
  masterele = document.getElementById( master ) ;
  if( masterele == null )
    return false;
  slaveele = document.getElementById( slave ) ;
  if( slaveele == null && slave.length != 0 )
    return false;
  
  // hide all content of master element, beside the slave which should be visible
  for( i = 0; i < masterele.childNodes.length; i++ ) {
    mchild = masterele.childNodes[i] ;
    if( mchild.nodeType == 1 ) {
      mcid = mchild.getAttribute('id') ;
      //debugout +=  'child '+i+' '+mcid+': "'+ mchild.style.visibility +'" => "' ;
      if( mcid == slave ) {
  mchild.style.visibility = 'visible' ;
  mchild.style.display = 'block' ;
       }
      else {
  mchild.style.visibility = 'hidden' ;
  mchild.style.display = 'none' ;
      }
      //debugout +=  mchild.style.visibility +'"\n' ;
    }
  }
  //alert( debugout );
}



/***************************************************************************************************************************************
 * Store a query/note with an additional titel with an ajax request to an given url and additional parameters
 *
 * @param  string  question: Text of prompt question
 * @param  string  url: target of the ajax request 
 * @param  string  upar: parameter for post request
 * @param  string  preval: Predefined input value
 * @param  string  emptymsg: Text which appears after an empty input
 * @return  bool  success
 ***************************************************************************************************************************************/
function ifu_ajaxStore( question, url, upar, preval, emptymsg ) {
  // init
  if( ( typeof url == 'undefined' ) || ( ! aObj )  ) {
    return false;
  }
  //alert( 'store request with url: "'+ url +'" and parameters: "'+ upar +'".\n' ) ;
  
  // get query title and return if empty string or cancel pressed
  var ec = 0 ;
  while( 1 == 1 ) {
    if( ec > 0 ) {
      qtitle = prompt( question + '.\n' + emptymsg, preval ) ;
    }
    else {
      qtitle = prompt( question, preval ) ;
    }
    if( typeof qtitle == 'string' ) {
      if( qtitle.length != 0 ) {
        break ;
      }
    }
    else {
      return false;
    }
    //if ( typeof qtitle == 'undefined' ) return false;
    ec++ ;
  }
  //alert( 'store actual "'+ typeof qtitle +'" with title: "'+ qtitle +'", url: "'+ url +'" and parameters: "'+ upar +'".\n' ) ;


  // define ajax handler
  aObj.onreadystatechange = function() { 
    if( aObj.readyState == 4 ) {
      if( aObj.status == 200 ) {
        //alert( 'Agent submitted with readyState=' + aObj.readyState +' and status='+ aObj.status +'.\n The result was:\n'+ aObj.responseText ) ;
        restxt=aObj.responseText ;
        if( restxt.length != 0 ) {
          alert( restxt ) ;
        }
///////////////////////////////////////////////////////////////////////////////////////////        window.location.reload() ;
      }
      else {
        alert( 'Error while submiting:  readyState=' + aObj.readyState + ' status='+ aObj.status + ' ' + 'and responseText:\n'+ aObj.responseText ) ;
      }
    }
  }

  // init request
  aObj.open( 'POST', url, true ) ;
  //aObj.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
  aObj.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' ) ;

  // start ajax request
  //aObj.send( upar + '&tx_ifujobdb[ajax_prompt_title]=' + escape( qtitle ) ) ;
  aObj.send( upar + '&tx_ifujobdb[ajax_prompt_title]=' + encodeURIComponent( qtitle ) ) ;
  
  return false;
 }



/***************************************************************************************************************************************
 * Submits a task (f.e. delete) by an ajax request to an given url with additional parameters
 *
 * @param  string  question: Text of prompt question
 * @param  string  url: target of the ajax request 
 * @param  string  upar: parameter for post request
 * @return  bool  inverse success (could f.e. be used for onsubmit in forms)
 ***************************************************************************************************************************************/
function ifu_ajaxQuery( question, url, upar ) {
  // init
  if( ( typeof url == 'undefined' ) || ( ! aObj )  )
    return false;

  // get query title and return if empty string or cancel pressed
  if( ! confirm( question ) )
    return false ;
  
  // init request
  aObj.open( 'POST', url, true ) ;
  aObj.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' ) ;

  // define ajax handler
  aObj.onreadystatechange = function() { 
    if( aObj.readyState == 4 )
      if( aObj.status == 200 ) {
  restxt=aObj.responseText ;
  if( restxt.length != 0 )
    alert( restxt ) ;
  window.location.reload() ;
  return false;
      }
      else {
  alert( 'Error while submiting: readyState=' + aObj.readyState +' status='+ aObj.status +' and responseText:\n'+ 
         aObj.responseText ) ;
        return true;
      }
    return false;
  }

  // start ajax request
  aObj.send( upar ) ;
  
  return false;
 }


/***************************************************************************************************************************************
 * Change a given text element to a input field and vice versa; Finnaly stores the content of the input field with ajax
 *
 * @param  ref  ebut: refence to the field to be changed
 * @param    :
 * @return  bool  success
 * @see      ifu_ajaxQuery
 ***************************************************************************************************************************************/
// global vars vor ifu_changeText
var ifu_CT_ref ;  // reference to text element
var ifu_CT_cont ;  // previous content of text element

function ifu_changeText( ebut ) {
  alert( 'type: '+ ebut.nodeType +'\nname: '+ ebut.firstChild.nodeName +'\nHTML: '+ ebut.innerHTML +'\n' ) ;
  var inputfield = 
      '<form style="display:inline;z-index:999;margin:0px;padding:0px;">'+
      '<input type="text" value="%v" size="60" maxlength="100" onblur="return ifu_changeTextSubmit();" '+
      'onkeydown="return ifu_changeTextOnKeyDown(event)" />'+
      '</form>' ;

  if( typeof ifu_CT_ref != 'undefined' ) {
    if( ifu_CT_ref == ebut ) {
      if( ebut.firstChild.nodeName == 'FORM' )
  ebut.innerHTML = ifu_CT_cont ;
      else
  ebut.innerHTML = inputfield.replace( /%v/, ifu_CT_cont ) ;
     }
    else {
      ebut.innerHTML = ifu_CT_cont ;
      ifu_CT_ref = ebut ;
      ifu_CT_cont = ebut.innerHTML ;
      ebut.innerHTML = inputfield.replace( /%v/, ifu_CT_cont ) ;
     }
   }
  else {
    ifu_CT_ref = ebut ;
    ifu_CT_cont = ebut.innerHTML ;
    ebut.innerHTML = inputfield.replace( /%v/, ifu_CT_cont ) ;
   }
  return true;
 }



function ifu_changeTextSubmit(){
  alert( 'type: '+ ifu_CT_ref.nodeType +'\nname: '+ ifu_CT_ref.firstChild.nodeName +'\nHTML: '+ ifu_CT_ref.innerHTML +'\n' ) ;
  //ajax submit
  //reload
  return true;
 }



function ifu_changeTextOnKeyDown( event ){
  var keycode = -1 ;
  if( ! event )
    event = window.event ;
  if( event.which ) { // Netscape/Firefox/Opera
    keycode = event.which ;
   }
  else if( event.keycode ) { // IE
    keycode = event.keycode ;
   }
  if( keycode == 13 ) //submit
    return ifu_changeTextSubmit() ;
  return true;
 }

