//++
//
//  JavaScript:
//	romber_base
//
//  Provides:
//	romber_find_element
//	romber_find_parent_element
//	romber_include
//	romber_include_once
//	romber_onload_add
//	romber_onload_execute
//	romber_onload_set
//	romber_set_update
//	romber_trigger_updates
//
//  Locally uses:
//
//  Copyright:
//	Copyright &copy; 1987 - 2010 Corpita Pty Ltd
//	15 Bedford Street, Collingwood 3066, Australia
//
//  History:
//	2010-09-10 by SLJ
//	    Enhance romber_find_element and romber_find_parent_element
//	2010-04-01 by SLJ
//	    Receive romber_find_element and romber_find_parent_element from romber_form.js
//	2009-06-30 by SLJ
//	    Fix romber_onload_execute
//	27-Sep-2007 by SLJ
//	    Allow additional arguments for an update
//	22-Jul-2007 by SLJ
//	    Add romber_include and romber_include_once
//	27-Jan-2007 by Simon L. Jackson
//	    Initial Romber version
//
//--

var gbl_in_update = false;
var gbl_onload_functions = new Array ();
var gbl_updates = new Array ();
var gbl_num_included = 0;
var gbl_num_loaded = 0;


//
//  Function:
//	romber_find_element
//
//  Argument:
//	arg_element = Element name
//	arg_window = Windown hook
//

function romber_find_element ( arg_element, arg_window ) {

  if ( arg_window == "parent" )
    return ( romber_find_parent_element ( arg_element ));

// If it's already an object, just return
  if ( typeof arg_element == 'object' )
    return ( arg_element );

// If a simple element path, try that first
  if ( arg_element.match ( /^[\w\.]+$/i )) {
    lcl_containers = arg_element.split ( '.' );
    lcl_container = '';
    for ( lcl_index = 0 ; lcl_index < lcl_containers.length ; lcl_index++ ) {
      lcl_container += '.' + lcl_containers[lcl_index];
      lcl_element = eval ( "document" + lcl_container );
      if ( lcl_element == undefined )
	break;
    }
    if ( lcl_element != undefined )
      return ( lcl_element );
  }

// Now try by ID
  if ( document.getElementById ) return ( document.getElementById ( arg_element ));

  if ( document.all ) return ( document.all[arg_element] );

  if ( document.layers ) return ( document.layers[arg_element] );

  return ( false );

}


//
//
//

function romber_find_parent_element ( arg_element ) {

// If it's already an object, just return
  if ( typeof arg_element == 'object' )
    return ( arg_element );

// If a simple element path, try that first
  if ( arg_element.match ( /^[\w\.]+$/i )) {
    lcl_containers = arg_element.split ( '.' );
    lcl_container = '';
    for ( lcl_index = 0 ; lcl_index < lcl_containers.length ; lcl_index++ ) {
      lcl_container += '.' + lcl_containers[lcl_index];
      lcl_element = eval ( "window.opener.document" + lcl_container );
      if ( lcl_element == undefined )
	break;
    }
    if ( lcl_element != undefined )
      return ( lcl_element );
  }

// Now try by ID
  if ( window.opener.document.getElementById )
    return ( window.opener.document.getElementById ( arg_element ));

  if ( window.opener.document.all ) return ( window.opener.document.all[arg_element] );

  if ( window.opener.document.layers ) return ( window.opener.document.layers[arg_element] );

  return ( false );

}


//
//  Function:
//	romber_include
//
//  Purpose:
//	Include an external script
//

function romber_include ( arg_file ) {

  var lcl_script;

  lcl_script = lcl_get_script ( arg_file );

  return ( lcl_include_script ( lcl_script ));

}

function lcl_get_script ( arg_file ) {

  var lcl_script;
  var lcl_script_extension;

  lcl_script_extension = arg_file.substring ( arg_file.lastIndexOf ( '.' ) + 1 );

  switch ( lcl_script_extension ) {

    case 'css':
      lcl_script = document.createElement ( 'link' );
      lcl_script.rel = 'stylesheet';
      lcl_script.type = 'text/css';
      lcl_script.href = arg_file;
      break;

    case 'js':
      lcl_script = document.createElement ( 'script' );
      lcl_script.language = 'javascript';
      lcl_script.type = 'text/javascript';
      lcl_script.src = arg_file;
      break;

  }

  return ( lcl_script );

}

function lcl_include_script ( arg_script ) {

  gbl_num_included++;

// IE
  arg_script.onreadystatechange = function () {
    if ( arg_script.readyState == 'loaded'
     || arg_script.readyState == 'complete' )
      gbl_num_loaded++;
  };

// NS
  arg_script.onload = function () { gbl_num_loaded++; };

//  alert ( 'Including ' + arg_script.src );
  document.getElementsByTagName('head')[0].appendChild ( arg_script );

  return ( false );

}


//
//  Function:
//	romber_include_once
//
//  Purpose:
//	Include an external script once
//

function romber_include_once ( arg_file ) {

  var lcl_index;
  var lcl_scripts;
  var lcl_script;

  lcl_script = lcl_get_script ( arg_file );

  lcl_scripts = document.getElementsByTagName('head')[0].getElementsByTagName('script');
  for ( lcl_index = 0 ; lcl_index < lcl_scripts.length ; lcl_index++ ) {
    if ( lcl_scripts[lcl_index].src != '' ) {
//  alert ( 'Trying ' + lcl_scripts[lcl_index].src + ' versus ' + lcl_script.src );
      if ( lcl_scripts[lcl_index].type == lcl_script.type
       && lcl_scripts[lcl_index].src == lcl_script.src ) {
	return ( false );
      }
    }
  }

// If we get here, then this file has not been included yet
  return ( lcl_include_script ( lcl_script ));

}


//
//
//

function romber_onload_add ( arg_function ) {

  gbl_onload_functions[gbl_onload_functions.length] = arg_function;

}


//
//  Function:
//	romber_onload_execute
//

gbl_num_waits = 0;
gbl_onload_executed = false;
gbl_onload_executing = false;
gbl_wait_interval = 25;

function romber_onload_execute () {

  if ( gbl_onload_executed || gbl_onload_executing ) {
    return ( true );
  }

  if ( gbl_num_loaded < gbl_num_included && gbl_num_waits < 20 ) {
    setTimeout ( 'romber_onload_execute ()', gbl_wait_interval );
    gbl_num_waits++;
    if ( gbl_wait_interval < 100 ) {
      gbl_wait_interval = gbl_wait_interval * 2;
    }
    return ( true );
  }

  gbl_onload_executing = true;

  for ( var i = 0 ; i < gbl_onload_functions.length ;  i++ ) {
    gbl_onload_functions[i] ();
  }

  gbl_onload_executed = true;

  return ( true );

}


//
//
//

function romber_onload_set () {

  window.onload = function () {
    romber_onload_execute ();
  }

}


//
//
//

function romber_set_update ( arg_item, arg_method, arg_args ) {

  var lcl_index;
  var lcl_itemname;
  var lcl_args;

  lcl_itemname = 'document.' + arg_item.form.name + '.' + arg_item.name;

  for ( lcl_index = 0 ; lcl_index < gbl_updates.length ; lcl_index++ )
    if ( gbl_updates[lcl_index].itemname == lcl_itemname )
      return ( true );

  if ( arg_args == null )
    lcl_args = '';
  else
    lcl_args = arg_args.toString ();

  if ( lcl_args != '' )
    if ( lcl_args.substring ( 0, 1 ) != ',' )
      lcl_args = ', ' + lcl_args;

  gbl_updates[gbl_updates.length] =
    { method : arg_method, itemname : lcl_itemname, args : lcl_args };

  return ( true );

}


//
//
//

function romber_trigger_updates () {

  var lcl_index;
  var lcl_statement;
  var lcl_update;

  gbl_in_update = true;

  for ( lcl_index = 0 ; lcl_index < gbl_updates.length ; lcl_index++ ) {
    lcl_update = gbl_updates[lcl_index];
    lcl_statement = lcl_update.method + '(' + lcl_update.itemname + lcl_update.args + ')';
    eval ( lcl_statement );
  }

  gbl_in_update = false;

  return ( true );

}

