// © Copyright Comaltech Limited 1996 - 2002
// All rights reserved

// JavaScript utilities library
var loaded = false;
var preloaded = false;
var origWidth = 0;
var origHeight = 0;

function resizeHandler() {
    if (! loaded) return;
    var width = (document.body.clientWidth) ? document.body.clientWidth : window.innerWidth;
    var height = (document.body.clientHeight) ? document.body.clientHeight : window.innerHeight;
    if (width != origWidth || height != origHeight) {
        origWidth = width;
        origHeight = height;
        setTimeout('rePositionAll()', 100);
    }
}

window.onresize = resizeHandler;

function loadCore() {
    loaded = true;
    origWidth = (document.body.clientWidth) ? document.body.clientWidth : window.innerWidth;
    origHeight = (document.body.clientHeight) ? document.body.clientHeight : window.innerHeight;
    rePositionAll();
    doPreload();
}

function getElement(id) {
    if (document.all) return document.all(id);
    if (document.getElementById) return document.getElementById(id);
}

function getStringObject(id) {
    var index = id.indexOf('_');
    return eval('SO' + (index == -1 ? id : id.substring(0, index)));
}

function isOpera() {
    return (window.navigator.userAgent.toLowerCase().indexOf('opera') != -1);
}

function isGecko() {
    return (window.navigator.userAgent.toLowerCase().indexOf('gecko') != -1);
}

function doAction(action) {
    var doc = document.forms[0];
    if (action) doc.action.value = action;
    doc.submit();
}

function confirmDelete() {
    var onOK = confirm('Click OK to delete this entry');
    if (onOK) {
        doAction('delete');
    }
}

// Script for preloading images
function preload() {
    var args = preload.arguments;
    if (! document.preloadUrls) document.preloadUrls = new Array();
    var index = document.preloadUrls.length;
    for (var i = 0; i < args.length; i++) {
        document.preloadUrls[index++] = preload.arguments[i];
    }
}

function doPreload() {
    if (! document.preloadImages) document.preloadImages = new Array();
    for (var i = 0; document.preloadUrls && i < document.preloadUrls.length; i++) {
        document.preloadImages[i] = new Image();
        document.preloadImages[i].src = document.preloadUrls[i];
    }
    preloaded = true;
}

// A selection of scripts for opening mini windows
function openMini(url, width, height, scrollbars) {
    width = (width == null ? 500 : width);
    height = (height == null ? 400 : height);
    config='toolbar=no,location=no,directories=no,menubar=no,scrollbars=' + (! scrollbars ? 'no' : 'yes') + ',status=yes,left=' + (screen.availWidth-width)/2 + ',top=' + (screen.availHeight-height)/2 + ',width=' + width + ',height=' + height;
    win = window.open(url, "win", config);
    this.win.focus();
}

function preview(url, width, height) {
    width = (width == null ? 1024 : width);
    height = (height == null ? 768 : height);
    config='toolbar=yes,location=yes,directories=yes,menubar=yes,scrollbars=yes,status=yes,left=0,top=0,width=' + width + ',height=' + height;
    win = window.open(url, "preview", config);
    this.win.focus();
}

function newWindow(url) {
    config='toolbar=yes,location=yes,directories=yes,menubar=yes,scrollbars=yes,status=yes';
    win = window.open(url, "newwin", config);
    this.win.focus();
}

// ActiveMap (patented)
var to;
var currElem;
var clicked = false;

function rePositionAll() {
    if (document.all) {
        for (var i = 0; i < document.all.length; i++){
            var id = document.all(i).id;
            if (id && getElement(id + '_0')) rePosition(id);
        }
     } else {
        var arr = new Array("A", "IMG", "DIV");
        for (var i = 0; i < arr.length; i++) {
            var tags = document.getElementsByTagName(arr[i]);
            for (var j = 0; j < tags.length; j++) {
                var id = tags[j].id;
                if (id && getElement(id + '_0')) rePosition(id);
            }
        }
    }
}

function rePosition(id) {
    var elem = getElement(id);
    var tier = getElement(id + '_0');
    if (tier && elem) {
        var object = getStringObject(id);
        switch (object.e) {
            case 1: // right
                return moveTo(tier, offsetHoriz(elem, tier, object) + elem.offsetWidth, offsetVert(elem, tier, object));
            case 2: // left
                return moveTo(tier, offsetHoriz(elem, tier, object) - tier.offsetWidth, offsetVert(elem, tier, object));
            case 4: // down right
                return moveTo(tier, offsetHoriz(elem, tier, object) + (elem.id.indexOf('_') == -1 ? 0 : elem.offsetWidth), offsetVert(elem, tier, object) + (elem.id.indexOf('_') == -1 ? elem.offsetHeight : 0));
            case 8: // down left
                return moveTo(tier, offsetHoriz(elem, tier, object) - (elem.id.indexOf('_') == -1 ? 0 : tier.offsetWidth), offsetVert(elem, tier, object) + (elem.id.indexOf('_') == -1 ? elem.offsetHeight : 0));
            case 16: // up right
                return moveTo(tier, offsetHoriz(elem, tier, object) + (elem.id.indexOf('_') == -1 ? 0 : elem.offsetWidth), offsetVert(elem, tier, object) - (elem.id.indexOf('_') == -1 ? tier.offsetHeight : 0));
            case 32: // up left
                return moveTo(tier, offsetHoriz(elem, tier, object) - (elem.id.indexOf('_') == -1 ? 0 : tier.offsetWidth), offsetVert(elem, tier, object) - (elem.id.indexOf('_') == -1 ? tier.offsetHeight : 0));
        }
    }
}

function offsetHoriz(elem, tier, object) {
    var left = getLeft(elem);
    if (elem.id.indexOf('_') == -1) {
        left += object.offX;
    } else {
	if (object.e == 1 || object.e == 4 || object.e == 16) {
	    if (isOpera()) left += object.tbw;
            else left += 2 * object.tbw;
            left -= object.olX;
	} else {
            if (isOpera()) left -= object.tbw;
            left += object.olX;
	}
    }
    return left;

}

function offsetVert(elem, tier, object) {
    var top = getTop(elem);
    if (elem.id.indexOf('_') == -1) {
        top += object.offY;
    } else {
        if (isOpera()) top -= object.tbw;
        if (object.ro) {
            top += elem.offsetHeight - tier.offsetHeight - object.olY;
            top += 2 * object.tbw;
        } else top += object.olY;
    }
    return top;
}

function moveTo(elem, left, top) {
    elem.style.left = left + 'px';
    elem.style.top = top + 'px';
}

function getLeft(elem) {
    var left = 0;
    if (elem) {
        left = elem.offsetLeft;
        var parent = elem.offsetParent;
        while (parent.tagName != "BODY" && parent.id != "IBODY") {
            left += parent.offsetLeft;
            parent = parent.offsetParent;
        }
    }
    return left;
}

function getTop(elem) {
    var top = 0;
    if (elem) {
        top = elem.offsetTop;
        var parent = elem.offsetParent;
        while (parent.tagName != "BODY" && parent.id != "IBODY") {
            top += parent.offsetTop;
            parent = parent.offsetParent;
        }
    }
    return top;
}

function show(id, showMenu) {
    if (! loaded || ! id) return;
    clearTimeout(to);
    var object = getStringObject(id);
    if (currElem != null && id.indexOf(currElem) == -1) hide(id);
    hover(id, true);
    if (clicked || showMenu) {
        showChildren(id);
        clicked = true;
    }
    currElem = id;
}

function hide(id) {
    if (! loaded || ! currElem) return;
    temp = currElem;
    do {
        hover(temp, false);
        hideChildren(temp);
        temp = getParent(temp);
        if (id && temp == getParent(id)) break;
    } while (getElement(temp + "_0"))
}

function showChildren(id) {
    div = getElement(id + "_0");
    if (div) div.style.visibility = 'visible';
}

function hideChildren(id) {
    div = getElement(id + "_0");
    if (div) div.style.visibility = 'hidden';
}

function callHideAll(delay) {
    if (! clicked) {
        hide();
        return;
    }
    to = setTimeout("hideAll()", delay);
}

function hideAll() {
    hide();
    clicked = false;
}

function getParent(id) {
    return (id) ? id.indexOf('_') != -1 ? id.substring(0, id.lastIndexOf('_')) : "" : "";
}

function hover(id, hilite) {
    var object = getStringObject(id);
    if (id == object.id) { // look for HotSpots
        if (! object.type) return;
        switch (object.type) {
            case "ihs": // ImageHotSpot
		swap(id, hilite);
                break;
	    case "ths": // TextHotSpot
		rollover(id, hilite);
		break;
	    case "chs": // CombinationHotSpot
		swapAndRollover(id, hilite);
		break;
        }
        return;
    }
    div = getElement(id);
    if (!div) return;
    div.style.color = (hilite) ? object.ch : object.c;
    if (! isOpera()) div.style.backgroundColor = (hilite) ? object.bgh : object.bg;
    else div.style.background = (hilite) ? object.bgh : object.bg;
    div.style.border = (hilite) ? object.bh : object.b;
}

function swap(id, hilite) {
    img = getElement(id);
    object = getStringObject(id);
    if (preloaded && img && object.sh && (img.src != hilite ? object.sh : object.s)) swapImage(img, (hilite) ? object.sh : object.s);
}

function swapImage(img, src) {
    if (preloaded) img.src = src;
}

function rollover(id, hilite) {
    var div = getElement(id);
    var object = getStringObject(id);
    if (div) {
        div.style.color = (hilite) ? object.hsch : object.hsc;
        div.style.font = (hilite) ? object.hsfh : object.hsf;
        div.style.border = (hilite) ? object.hsbh : object.hsb;
        div.style.background = (hilite) ? object.hsbgh : object.hsbg;
        div.style.textDecoration = (hilite) ? object.hstdh : object.hstd;
    }
}

function swapAndRollover(id, object, hilite) {
    var div = getElement(id);
    var object = getStringObject(id);
    if (div) {
        if (object.hsbh) div.style.backgroundImage = (hilite) ? object.hsbh : object.hsb;
        div.style.color = (hilite) ? object.hsch : object.hsc;
        div.style.font = (hilite) ? object.hsfh : object.hsf;
        div.style.textDecoration = (hilite) ? object.hstdh : object.hstd;
    }
}

function cancelEvent(e) {
    if (!e) var e = window.event;
    e.cancelBubble = true;
    if (e.stopPropagation) e.stopPropagation();
}


// Scripts for Tickers
var tto;

function scrollTicker(id) {
    object = eval(id);
    outer = (document.all) ? document.all(object.outerID) : document.getElementById(object.outerID);
    inner = (document.all) ? document.all(object.innerID) : document.getElementById(object.innerID);
    outerTop = parseInt(outer.style.top);
    innerTop = parseInt(inner.style.top);
    switch(object.direction) {
        case 'UP':
            if (innerTop <= 0 - object.innerHeight - 50) inner.style.top = object.outerHeight + 50;
            else inner.style.top = innerTop - 1;
            break;
        case 'DOWN':
            if (innerTop > object.outerHeight + 50) inner.style.top = - object.innerHeight - 50;
            else inner.style.top = innerTop + 1;
            break;
        case 'LEFT':
            break;
        case 'RIGHT':
            break;
    }
    tto = setTimeout("scrollTicker('" + id + "')", 100 / object.speed);
}

function callTimeout(id) {
    tto = setTimeout("scrollTicker('" + id + "')", 100 / eval(id).speed);
}

// TabViews
var currentTabIndex = -1;

function showTab(object, tabIndex) {
    if (currentTabIndex == -1) currentTabIndex = object.ti;
    var label = getElement('label' + currentTabIndex);
    var labelHi = getElement('label' + tabIndex);

    label.style.color = object.c;
    label.style.backgroundColor = object.b;
    label.style.borderBottom = object.bdr;
    label.style.textDecoration = 'none';

    labelHi.style.color = object.ch;
    labelHi.style.backgroundColor = object.bh;
    labelHi.style.borderBottom = object.bdrh;
    labelHi.style.textDecoration = 'underline';

    getElement('tab' + currentTabIndex).style.visibility = "hidden";
    getElement('tab' + tabIndex).style.visibility = "visible"; 

    currentTabIndex = tabIndex;
}

function hiliteTab(object, tabIndex, over) {
    if (currentTabIndex == -1) currentTabIndex = object.ti;
    var label = getElement('label' + tabIndex);
    if (over) {
        if (tabIndex != currentTabIndex) {
            label.style.textDecoration = 'underline';
            label.style.color = object.ch;
        } else {
            label.style.textDecoration = 'none';
        }
    } else {
        if (tabIndex != currentTabIndex) {
            label.style.textDecoration = 'none';
            label.style.color = object.c;
        } else {
            label.style.textDecoration = 'none';
        }
    }
}