/*
 * =================================================================
 * Gossamer Links - enhanced directory management system
 *
 *   Website  : http://gossamer-threads.com/
 *   Support  : http://gossamer-threads.com/scripts/support/
 *   Revision : $Id: utils.js,v 1.3 2006/07/18 03:32:55 brewt Exp $
 *
 * Copyright (c) 2005 Gossamer Threads Inc.  All Rights Reserved.
 * Redistribution in part or in whole strictly prohibited. Please
 * see LICENSE file for full details.
 * =================================================================
 */

/*
Event Handler
=============
Description:
    A simple cross-browser event handler replacement.
Usage:
    registerEvent(<html_object>, <event>, <handler>);
    unregisterEvent(<html_object>, <event>, <handler>);
Example:
    registerEvent(window, 'onload', myhandler);
Notes:
    html_object is a html object that you wish to register the event on.
    event is a string containing the event you wish to register, eg. 'onload'.
    handler is a function reference for the code you wish to run when the
        event is fired.
*/

function registerEvent(object, event, handler) {
    if (!(object && event && handler))
        return;

    var events = object[event + 'Events'];
    if (!events) {
        object[event + 'Events'] = object[event] ? [object[event], handler] : [handler];
        object[event] = _eventHandler;
    }
    else
        object[event + 'Events'][events.length] = handler;
}

function unregisterEvent(object, event, handler) {
    if (!(object && event && handler))
        return;

    var events = object[event + 'Events'];
    if (!events)
        return;

    for (var i = 0; i < events.length; i++)
        if (object[event + 'Events'][i] == handler)
            return object[event + 'Events'].splice(i, 1);
}

function _eventHandler(event) {
    if (!event) event = window.event;

    var events = this['on' + event.type + 'Events'];
    if (!events)
        return;

    for (var i = 0; i < events.length; i++) {
        this.eventMethod = events[i];
        if (this.eventMethod(event) == false) {
            this.eventMethod = null;
            return false;
        }
        this.eventMethod = null;
    }
}

/*
Check All Checkbox
==================
Description:
    Code to implement a check all checkbox.
Usage:
    checkAllInit(<form_id>, <checkbox_name>, <checkall_id>);
Example:
    registerEvent(window, 'onload', function () { checkAllInit('my_form', 'ID', 'checkall') });
*/

function checkAllInit(form, checkBoxes, checkAllBox) {
    var oForm, oCheckBoxes, oCheckAllBox;
    if (!(form && checkBoxes && checkAllBox &&
        (oForm = document.getElementById(form)) &&
        (oCheckBoxes = oForm.elements[checkBoxes]) &&
        (oCheckAllBox = document.getElementById(checkAllBox))))
        return;

    oCheckAllBox.checkBoxes = oCheckBoxes;
    registerEvent(oCheckAllBox, 'onclick', _checkAllBoxes);
    for (var i = 0; i < oCheckBoxes.length; i++) {
        oCheckBoxes[i].checkAllBox = oCheckAllBox;
        registerEvent(oCheckBoxes[i], 'onclick', _updateAllBoxes);
    }
}

function _checkAllBoxes() {
    var checkBoxes = this.checkBoxes;
    for (var i = 0; i < checkBoxes.length; i++)
        checkBoxes[i].checked = this.checked;
}

function _updateAllBoxes() {
    var checkBoxes = this.form.elements[this.name];
    var allChecked = true;
    for (var i = 0; i < checkBoxes.length; i++) {
        if (!checkBoxes[i].checked) {
            allChecked = false;
            break;
        }
    }
    this.checkAllBox.checked = allChecked;
}

/*
Hide Objects
============
Description:
    Hide a list of html objects using the display = 'none' style.
Usage:
    hideObjects(<id>[, <id>]*);
Example:
    hideObjects('foo', 'bar', 'baz');
Notes:
    id is the id of the html object you want to hide.
*/

function hideObjects() {
    var args = hideObjects.arguments;
    for (var i = 0; i < args.length; i++) {
        var obj = document.getElementById(args[i]);
        if (obj)
            obj.style.display = 'none';
    }
}

function loadXML(url, func, args) {
  var request = false;
  if(window.XMLHttpRequest) {
    request = new XMLHttpRequest();
    if(request.overrideMimeType) request.overrideMimeType('text/xml');
  }
  else if(window.ActiveXObject) {
    try { request = new ActiveXObject("Msxml2.XMLHTTP"); }
    catch (e) {
      try { request = new ActiveXObject("Microsoft.XMLHTTP"); }
      catch (e) {}
    }
  }
  if(!request) {
    alert('Error: could not create XMLHTTP object.');
    return false;
  }
  request.onreadystatechange = function() { eval(func + '(request, args)'); }
  request.open('GET', url, true);
  request.send(null);
}

function findPosX (object) {
    var curleft = 0;
    if (object.offsetParent) {
        while (object.offsetParent) {
            curleft += object.offsetLeft
            object = object.offsetParent;
        }
    }
    else if (object.x) {
        curleft += object.x;
    }
    return curleft;
}

function findPosY(object) {
    var curtop = 0;
    if (object.offsetParent) {
        while (object.offsetParent) {
            curtop += object.offsetTop
            object = object.offsetParent;
        }
    }
    else if (object.y) {
        curtop += object.y;
    }
    return curtop;
}

function getCookie(name) { 
    var aCookie = document.cookie.split("; ");
    for (var i=0; i<aCookie.length; i++) {
        var aPart = aCookie[i].split("=");
        if (aPart[0] == name) return unescape(aPart[1]);
    }
}
