/**
 * floor4.js
 * Fall 2005
 *
 * A few general purpose helper functions and one that is site-specific
 *
 * @author  Dan Phiffer (DP) <dan@phiffer.org>
 */

// Adds a function call 'func' to object 'target' for when the onload event is
//   executed.
function add_event(target, event, func) {
    eval('var old_event = target.' + event + ';');
    if (typeof old_event != 'function') {
        eval('target.' + event + ' = func;');
    } else {
        eval('target.' + event + ' = function() { old_event(); func(); }');
    }
}

// A wrapper for the XMLHttpRequest object
function remote(url, callback, content) {
    
    // Create the request object, in one of two flavors
    if (window.XMLHttpRequest) {
        var request = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        var request = new ActiveXObject("Microsoft.XMLHTTP");
    } else {
        // TODO: resort to hidden IFRAMEs if we're using an old browser
        return;
    }
    
    // Paring down the HTTP vocabulary here to just GET and POST.
    if (!content) {
        var method = 'GET';
    } else {
        var method = 'POST';
    }
    
    // Evaluate the response text if no other callback has been specified
    if (!callback) {
        var callback = function(req) {
            eval(req.responseText);
        }
    }
    
    // Contact the server and work it baby
    request.open(method, url, true);
    request.onreadystatechange = function() {
        if (request.readyState == 4) {
            callback(request);
        }
    }
    
    // Set some request headers in order to try to be a good client
    request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    request.setRequestHeader('Referer', window.location);
    request.setRequestHeader('User-Agent', 'XMLHttpRequest');
    request.send(content);
    
}

// Adds a CSS class to an HTML element
Object.prototype.add_class = function(value) {
    if (!this.has_class(value)) {
        this.className += ' ' + value;
    }
}

// Removes a CSS class from an HTML element
Object.prototype.remove_class = function(value) {
    if (!this.has_class(value)) {
        return;
    }
    var start = this.className.indexOf(value);
    var before = this.className.substr(0, start);
    var new_length = this.className.length - value.length;
    var after = this.className.substr(start + value.length, new_length);
    this.className = before + after;
}

// Check for the presence of a CSS class
Object.prototype.has_class = function(value) {
    return (this.className && this.className.indexOf(value) != -1);
}

// Adds some rounded corners to the header graphic
function header_setup() {
    if (!document.getElementById) {
        return;
    }
    var header = document.getElementById('header');
    
    // Add the lower-left corner
    var left = header.appendChild(document.createElement('img'));
    left.setAttribute('src', 'images/left-corner.png');
    left.style.position = 'absolute';
    left.style.bottom = '0';
    
    // Add the lower-right corner
    var right = header.appendChild(document.createElement('img'));
    right.setAttribute('src', 'images/right-corner.png');
    right.style.position = 'absolute';
    right.style.bottom = '0';
    right.style.right = '0';
    right.setAttribute('id', 'header_right_corner');
}

// Log messages to the Firefox JavaScript console
function log(log_msg) {
    log_msg = log_msg + '';
    //log_msg = log_msg.replace(/"/, '\\"');
    //log_msg = log_msg.replace(/'/, "\\'");
    //log_msg = log_msg.replace(/\n/m, " ");
    setTimeout("throw('" + log_msg + "');", 0);
}

function find_left(target) {
	var left = 0;
	while (target.offsetParent) {
		left += target.offsetLeft;
		target = target.offsetParent;
    }
	return left;
}

add_event(window, 'onload', header_setup);

