
// hook - the javascript function that gets invoked when the ajaj server call returns
function ajaj ( uri, params, hook, args ) {
    busy()
  // alert( 'ajaj  uri: [' + uri + '] params: [' + params + '] args: [' + args + ']' );
//    var get_uri = 'http://funpox.helvella.org:3000' + uri;
    var get_uri = uri;

//    if ( ! params == '' ) get_uri = get_uri + '?' + params;
//    alert( 'get_uri: [' + get_uri + ']' );

    var getter = false;
    try {
        getter = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e) {
        try {
            getter = new ActiveXObject("Microsoft.XMLHTTP");
        } 
        catch (E) {
            getter = false;
        }
    }
    
   if ( ! getter && typeof XMLHttpRequest!='undefined') {
        getter = new XMLHttpRequest();
   }

    getter.open( 'POST', get_uri, true );
    getter.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    getter.onreadystatechange = response_statechange_handler( getter, hook, args );    
    getter.send( params );
} 

function response_statechange_handler ( getter, hook, args ) {
  // alert( 'building handler args: [' + args + ']' );
    return function () {
        var msg = 'getter response handler - args: [' + args + ']'; 
        if ( getter ) msg = msg + ' readyState: [' + getter.readyState + ']';
      // alert( msg );
        if ( getter.readyState == 4 ) {
          // msg = ' readyState: [' + getter.readyState + '] status: [' + getter.status + '] ';
          // alert( 'handling ' + msg );
            var result_object = eval( '(' + getter.responseText + ')' );
            not_busy();
            hook( result_object, args ); 
        }
    }
}


// from prototype-1.4.0.js
function $() {
  var elements = new Array();

  for (var i = 0; i < arguments.length; i++) {
    var element = arguments[i];
    if (typeof element == 'string')
      element = document.getElementById(element);

    if (arguments.length == 1)
      return element;

    elements.push(element);
  }

  return elements;
}


function make_dropdown_renewer ( dropdown_id, no_default ) {
    return function ( new_list, args ) {
        var selected = args[0];
        var select_node = $(dropdown_id)
        select_node.options.length = 0; // is this the appropriate way to clear the existing options from a dropdown?

        if ( new_list.length > 0 ) {
            if ( !no_default ) {
                var default_option = new Option( "-- Select --", "", false, 
                                                 false );
                select_node.appendChild( default_option );
            }
            for each ( var item in new_list ) {
                var id    = item.id
                var label = item.label;
                var new_option = new Option( label, id, false, false ); 
                if ( id == selected || label == selected ) 
                  new_option.selected = true;
                select_node.appendChild( new_option );
            }
        }
        else if ( !no_default ) {
            // if there are no new item, make the empty option
            var new_option = new Option( "--", 0, false, false );
            new_option.selected = true;
            select_node.appendChild( new_option );
        }
        // cascade the event
        if ( select_node.onchange != null )
            select_node.onchange()
        return 1
    }
}


busy_count = 0
function busy () {
    busy_count += 1
    show( 'busy' )
//    document.body.style.cursor = '/static/images/FungaBaseLogo_32.png'
}

function not_busy () {
    busy_count -= 1
    if ( busy_count <= 0 ) {
        busy_count = 0
        hide( 'busy' )
//        document.body.style.cursor = 'default'
    }
}

var hide_event = [] 
// appends _hidden to an element's class name, if it isn't there already
function hide (element_id, args) {
    var element = $(element_id)
    var class   = element.className

    var func = hide_event[element_id]
    if ( func != null ) {
        func(args)
    }
    
    if ( class.indexOf( ' hidden' ) > 0 ) return 1
    class += ' hidden'
    element.className = class

    return 1;
}

var show_event = []
// removes _hidden from the end of an element's classname
function show (element_id, args) {
    var element = $(element_id)
    var func = show_event[element_id]
    if ( func != null ) {
        func(args)
    }
    var class   = element.className
    var new_class = class.replace( / hidden/, '' )
//    alert( "class: " + class + " new_class: " + new_class );
    element.className = new_class
    return 1
}


// toggle's an elements class, like hide()/show()
// prepends or remove's "Hide" from a link text
function toggle_hide (element_id, link_id) {
    var element = $(element_id)
    var class = element.className
    if ( class.indexOf( ' hidden' ) > 0 ) {
        show( element_id ) // wasteful double $() call 
    }
    else {
        hide( element_id )
    }
}


function popupdown (element_id) {
    var element = $(element_id)
    var class = element.className
    if ( class.indexOf( ' hidden' ) > 0 ) {
        show( 'shield' )
        show( element_id ) 
    }
    else {
        hide( element_id )
        hide( 'shield' )
    }
}

function popup (element_id) {
    var element = $(element_id)
    var class = element.className
    if ( class.indexOf( ' hidden' ) > 0 ) {
        show( 'shield' )
        show( element_id ) 
    }
}

function popdown (element_id) {
    var element = $(element_id)
    var class = element.className
    if ( class.indexOf( ' hidden' ) == -1 ) {
        hide( element_id )
        hide( 'shield' )
    }
}

function enterCall ( event, call_function ) {
    // alert( "event charchode: [" + event.charCode + "]   keycode: [" + event.keyCode + "]  function: [" + call_function + "]" );
//    if ( event.charCode == 97 ) {
//        alert( "lol you pressd a" )
//        event.stopPropagation()
//        return false;
//    }
    if ( event.keyCode == 13 ) {
        event.stopPropagation()
        
        call_function()
        return false;
    }
    
    return true;
}

function dump ( stuff ) { 
    var message = ''; 
    for ( var id in stuff ) {  
        message += id + ': [' + stuff[id] + '] -- ' 
    } 
    alert( message ); 
}

function display_errors ( error_container_name, errors ) {
    error_container = $(error_container_name)

    var errHtml = ""
    for ( var i = 0; i < errors.length; i++ ) {
        if ( errors[i] == "" ) 
            next
        
        errHtml += "<div class=\"error_message\">" + errors[i] + "</div>"
    }
    error_container.innerHTML = errHtml
    show( error_container_name )
}
