/* 
ResPower AJAX Library
copyright (c) 2005,2006 by ResPower, Inc.
ALL RIGHTS RESERVED
*/

var rpaj_browser_flag_XMLHttpRequest = 0x01;
var rpaj_browser_flag_ActiveX = 0x02;
var rpaj_browser_flag_DOM = 0x04;
var rpaj_browser_flag_IE = 0x08;

var rpaj_browser_flags = 0;

var request_queue = null; // new queue( ); 
var current_request = null;
var req = null;
var req_id = 0;

function push_back( array , value )
  {
  array[ array.length ] = value;
  }

      function ceilpow10(val) 
        {
        val = Math.ceil(val);
        if (val % 10 == 0) return val;
        return (val) + (10 - (val % 10));
        }

function clear_children( item )
  {
  while( item && item.hasChildNodes() )
    {
    item.removeChild( item.childNodes.item(0) );
    }
  }

function min( valuea , valueb )
  {
	return valuea < valueb ? valuea : valueb;
  }

function max( valuea , valueb )
  {
	return valuea > valueb ? valuea : valueb;
  }

function trim( str ) 
  {
  str = String( str );
  return str.replace(/^\s*(.*)\s*$/, "$1");
  }

function get_attribute_function( element , attribute )
  {
  element = to_ref( element );
  if( rpaj_browser_flags & rpaj_browser_flag_IE )
    {
    var result = element.getAttribute( attribute );
    if ( !result ) return "";
    if ( result == "undefined" ) return "";
    result = result.toString( );
    result = result.replace( /\s/g , " " );
    result = trim( result.replace( /function anonymous\(\)/, "") );
    result = trim( result.replace( /^\{(.*)\}/ , "$1" ) );
	
    //logln( "function return: " + result );
    return result;
    }
  else
    {
    return element.getAttribute( attribute );
    }
  }

function clean_js( code )
  {
  var result = "";
  for( var idx = 0; idx != code.length ; ++idx )
    {
    var ch = code.charAt( idx );
    switch( ch )
      {
      case ':': case ';': case '`': case '~': case '?':
      case '!': case '@': case '#': case '$': case '%':
      case '^': case '&': case '*': case '(': case ')':
      case '-': case '_': case '=': case '+': case '\\':
      case '|': case '[': case ']': case '{': case '}':
      case '<': case '>': case ',': case '.': case '/':
      case '\"':
	result += ch; break;
      case '\'': 
	result += "\\'"; break;
      case '\r': case '\n': case '\t':
	result += " "; break;
      default:
	if ( ( 'a' <= ch && ch <= 'z' )
           ||( 'A' <= ch && ch <= 'Z' )
	   ||( '0' <= ch && ch <= '9' ) )
           result += ch;
	else
	   result += " ";
      }
    }
  return result;
  }

function set_attribute_function( element , attribute , value )
  {
  element = to_ref( element );
  if ( rpaj_browser_flags & rpaj_browser_flag_IE )
    {
    var code = clean_js( value );
    // logln( code );
    var cmd = "element." 
      + attribute 
      + "=new Function( '" 
      + code
      + ";' )";
    // logln( cmd );
    eval( cmd );
    }
  else 
    {
    element.setAttribute( attribute , value );
    }
  }

function detect_browser( )
  {
  if ( window.XMLHttpRequest )
    rpaj_browser_flags |= rpaj_browser_flag_XMLHttpRequest;

  if ( window.ActiveXObject )
    rpaj_browser_flags |= rpaj_browser_flag_ActiveX;

  if ( document.getElementById ? true : false )
    rpaj_browser_flags |= rpaj_browser_flag_DOM;

  if ( document.all ? true: false)
    rpaj_browser_flags |= rpaj_browser_flag_IE;
  }

function format_float( value , decimals )
  {
  var round_factor = 10;
  while ( --decimals > 0 )
    round_factor *= 10;

  return Math.round( value * round_factor ) / round_factor;
  }

function format_time( value_secs )
  {
  var value_min = value_secs / 60;
  var value_hr = value_min / 60;
  var value_day = value_hr / 24;
  var value_month = value_day / 30;
  var value_year = value_day / 365;

  if ( value_year > 1 ) return format_float( value_year , 2 ) + " Year";
  if ( value_month > 1 ) return format_float( value_month , 2 ) + " Month";
  if ( value_day > 1 ) return format_float( value_day , 2 ) + " Day";
  if ( value_hr > 1 ) return format_float( value_hr , 2 ) + " Hr"; 
  if ( value_min > 1 ) return format_float( value_min , 2 ) + " Min";
  return format_float( value_secs , 2 ) + " Sec";
  }

function get_ref(id, par)
  {
  if ( rpaj_browser_flags & rpaj_browser_flag_DOM )
    return document.getElementById(id);

  if ( rpaj_browser_flags & rpaj_browser_flag_IE )
    return document.all[id];

  if (!par)
    par = window;

  return par.document.layers[id];
  } // get_ref( id , par )

function is_string(a) {
    return typeof a == 'string';
}

function to_ref( value , par )
  {
  if ( is_string( value ) )
    return get_ref( value , par );
  return value;
  }

function got_xml_list(  )
  {
  var select = get_ref( this.m_params );
  select.options.length = 0;

  var docelt = req.responseXML.documentElement;
  if ( !docelt )
    {
    alert( req.responseText );
    return;
    }
  if ( docelt.nodeName == "error" )
    {
    alert( docelt.textContent );
    return;
    }

  var childNodes = docelt.childNodes;
  var count = childNodes.length;
  var itemidx = 0;

  select.options[itemidx++] = new Option( "--- Please Select ---" , "" , false , false  );
  for( var idx = 0; idx < count ; ++idx )
    {
    var item = childNodes[ idx ];
    if( item.nodeName == "error" )
      throw item.text;
    if( item.nodeName != 'item' )
      continue;
    select.options[itemidx++] 
      = new Option
        ( item.getAttribute( 'name' ) 
        , item.getAttribute( 'id' ) 
        , false , false  );
    } // for loop
  select.disabled = false;        
  }

function flush_queue( )
  {
  logln( "flushing queue of length " + request_queue.size( ) );
  request_queue = new queue( );
  }

function init_ajax( )
  {
  request_queue = new queue( );
  detect_browser( );
  }

function is_item_valid( item )
  {
  var result = ( "1" == item.getAttribute( 'valid' ) ) ? 1 : 0;
  return result;
  }

function item_valid( item , value )
  {
  if ( value )
    {
    item.style.background = "#ffffff";
    item.setAttribute( "valid" , "1" );
    if ( item.getAttribute( 'on_updateui' ) )
      eval( item.getAttribute( 'on_updateui' ) );
    return 1;
    }
  else if ( item.getAttribute('required') == 1 )
    {
    item.style.background = "#ffaaaa";
    item.setAttribute( "valid" , "0" );
    if ( item.getAttribute( 'on_updateui' ) )
      eval( item.getAttribute( 'on_updateui' ) );
    return 0;
    }
  else
    {
    item.style.background = "#aaaaaa";
    item.setAttribute( "valid" , "-1" );
    if ( item.getAttribute( 'on_updateui' ) )
      eval( item.getAttribute( 'on_updateui' ) );
    return -1;
    }
  }

function logln( entry )
  {
  var the_log = get_ref( "log" );
  if ( !the_log ) return;

  try
    {
    var element = document.createElement( "pre" );
    element.appendChild( document.createTextNode( trim( entry ) ) );
    element.style.marginTop = '0px';
    element.style.marginBottom = '0px';
    element.style.border = '1px solid black';
    get_ref( "log" ).appendChild( element );
    //get_ref( "log" ).appendChild( document.createElement( 'br' ) );
    }
  catch( e )
    {
    alert( e );
    }
  }

function new_ajax_request( )
  {
  if( rpaj_browser_flags & rpaj_browser_flag_XMLHttpRequest )
    return new XMLHttpRequest();

  if ( rpaj_browser_flags & rpaj_browser_flag_ActiveX )
    return new ActiveXObject( "Microsoft.XMLHTTP" );

  throw "Could not allocate XMLHttpRequest Object";
  }

function path_extract_extension( value )
  {
  var extension = value.substring( value.lastIndexOf('.')+1 )
  // extensions should always be lower case
  return extension.toLowerCase();
  }

function path_extract_folder_name( value )
  {
  var extension = value.substring( 0 , value.lastIndexOf('/') + 1 )
  return extension;
  }


function path_extract_extension_normalized( value )
  {
  var result = path_extract_extension( value );
  if ( result == "ma" ) result = "mb";
  return result;
  }

var last_stat = "";
function update_ajax_monitor( )
  {
  var monitor = get_ref( "ajax_monitor" );
  if ( monitor )
    {
    var qlen= request_queue.size();
    var hascurrent=( current_request != null ? 1:0 );
    var len = qlen + hascurrent;

    var stat="background job queue length:" + len + "<br/>";
    if ( hascurrent )
      {
      var name = current_request.m_name;
      var bname = "<b>" + name; // + "</b><br/>";
      stat = stat + bname + "</b>";
      }
    for( var idx = 0 ; idx != qlen ; ++idx )
      {
      var item = request_queue.at( idx );
      if ( !item ) continue;
      var bname = "<br/>" + item.m_name;
      stat = stat + bname;
      }
    stat += "<br/>[end]<br/>";
    if ( stat != last_stat )
      {
      monitor.innerHTML = stat;
      last_stat = stat;
      }
    }
  }

function process_requests( )
  {
  if ( current_request != null )
    {
    // logln( "already processing a request..." + current_request.m_url );
    setTimeout( process_requests , 500 );
    update_ajax_monitor( );
    return;
    }
  if ( request_queue.empty() )
    {
    // logln( "request queue empty" );
    update_ajax_monitor( );
    return;
    }

  current_request = request_queue.pop_front( );
  update_ajax_monitor( );
  current_request.start( );
  setTimeout( process_requests , 500 );
  }

function queue( )
  {
  this.m_items = new Array( );

  this.push_back = function( item )
    {
    this.m_items[ this.m_items.length ] = item;
    }

  this.pop_front = function( )
    {
    if ( this.empty() )
      return null;
    var result = this.m_items[ 0 ];
    for( var idx = 0; idx <= this.m_items.length - 2 ; ++idx )
      this.m_items[ idx ] = this.m_items[ idx + 1 ];
    this.m_items.length = this.m_items.length - 1;
    return result;
    }

  this.at = function( idx )
    {
    return this.m_items[ idx ];
    }

  this.size = function( )
    {
    return this.m_items.length;
    }  

  this.empty = function( )
    { return this.m_items.length == 0; }
  } // queue( ) object

function queue_request( request )
  {
  request_queue.push_back( request );
  setTimeout( process_requests , 1 );
  } // queue_request 

function xml_request_object( url , xml_handler , params , name )
  {
  this.m_handler = xml_handler;
  this.m_params = params;
  this.m_url = url;
  //this.m_req_id = ++req_id;
  if ( name )
    this.m_name = name;
  else
    this.m_name = "stream...";

  //logln( "New Request created:" + this.m_url );
  this.name = function( )
    { return this.m_name; }

  this.start = function( )
    {
    req = new_ajax_request( );
    //req.req_id = this.m_req_id;
    req.onreadystatechange = function( ) 
      { 
      // logln( "onreadystatechange( )" + req.readyState + " " + current_request.m_url );

      // only if req shows "loaded"
      if (req.readyState == 4) 
        {
        // only if "OK"
        if ( req.status == 200 ) 
          {
          // logln( "calling current_request.m_handler( )..." );
          current_request.m_handler( );
          // logln( "calling current_request.m_handler( ) done..." );
          }
        else 
          {
          logln("There was a problem retrieving the XML data:\n" + req.statusText);
          }
	// logln( "done" );
        current_request = null;
        process_requests( );
        } // if req.readyState == 4
      }; // onreadystatechange()

    // logln( "XMLHttpRequest starting - " + this.m_url );
    req.open("GET", url, true);
    req.send(null);
    } // xml_request_object.start( )

  } // xml_request_object( )

function request_xml_doc( url , xml_handler , params , name )
  {
  // logln( "request_xml_doc( \"" + url + "\" , xml_handler , params )" );
  queue_request( new xml_request_object( url , xml_handler , params , name ) );
  return;
  }

function set_html( item , value )
  {
  clear_children( item );
  item = to_ref( item );
  item.appendChild( value );
  }

function set_text( item , value )
  {
  if ( !item ) return;
  item = to_ref( item );
  clear_children( item );
  item.appendChild( document.createTextNode( value ) );
  }

function validate_float( item )
  {
  item = to_ref( item );
  floatVal = parseFloat( item.value );
  var retVal = item_valid( item , !isNaN( floatVal ) );
  item.value = isNaN( floatVal ) ? "" : floatVal;
  return retVal;
  }

function elementToFloat( item , defaultVal )
  {
  item = to_ref( item );
  floatVal = parseFloat( item.value );
  return isNaN( floatVal ) ? defaultVal : floatVal;
  }

function is_integer( value )
  {
  intVal = parseInt( value );
  return !isNaN( intVal );
  }

function is_valid_number( value )
  {
  var valid_characters = "0123456789.-";
  var result = true;

  if( value.length == 0 ) return false;

  for( i = 0; i < value.length && result == true; i++ )
    {
    if( valid_characters.indexOf( value.charAt( i ) ) == -1 )
      {
      result = false;
      }
    }
  return result;
  }

function is_float( value )
  {
  if( !is_integer( value ) )
    return false;

  for( i = 0; i < value.length; i++ ) 
    {
    if( value.charAt( i ) == '.' )
      return true;
    }
  return false;
  }

function validate_integer( item , def_value )
  {
  // logln( "validate_integer( " + item.getAttribute( 'id' ) + ", " + def_value + " )" );
  item = to_ref( item );
  if ( def_value == null ) def_value = "";
  intVal = parseInt( item.value );
  var retVal = item_valid( item , !isNaN( intVal ) );
  item.value = isNaN( intVal ) ? def_value : intVal;
  return retVal;
  }

function validate_string( item ) 
  {
  // logln( "validate_string( " + item.getAttribute( 'id' ) + ")" );
  // logln( "- validate_string: item.value:" + item.value );
  // logln( "- validate_string: item.value.length:" + item.value.length );
  item = to_ref( item );
  return item_valid( item , item.value.length > 0 );
  }


init_ajax( );
