/*
 *
 * Copyright (c) 2004-2005 by Zapatec, Inc.
 * http://www.zapatec.com
 * 1700 MLK Way, Berkeley, California,
 * 94709, U.S.A.
 * All rights reserved.
 *
 *
 */


if (typeof Zapatec == 'undefined') {
    Zapatec = function() {
    };
}
Zapatec.version = '07-01';
if (typeof Zapatec.zapatecPath == 'undefined') {
    Zapatec.zapatecPath = function() {
        if (document.documentElement) {
            var aTokens = document.documentElement.innerHTML.match(/<script[^>]+src="([^"]*zapatec(-core|-src)?.js[^"]*)"/i);
            if (aTokens && aTokens.length >= 2) {
                aTokens = aTokens[1].split('?');
                aTokens = aTokens[0].split('/');
                if (Array.prototype.pop) {
                    aTokens.pop();
                } else {
                    aTokens.length -= 1;
                }
                return aTokens.length?aTokens.join('/') + '/':'';
            }
        }
        return'';
    }();
}
if (typeof Zapatec == 'undefined') {
    Zapatec = function() {
    };
}
Zapatec.Utils = {};
Zapatec.Utils.getAbsolutePos = function(el, scrollOff) {
    var SL = 0,ST = 0;
    if (!scrollOff) {
        var is_div = /^div$/i.test(el.tagName);
        if (is_div && el.scrollLeft)
            SL = el.scrollLeft;
        if (is_div && el.scrollTop)
            ST = el.scrollTop;
    }
    var r = {x:el.offsetLeft - SL,y:el.offsetTop - ST};
    if (el.offsetParent) {
        var tmp = this.getAbsolutePos(el.offsetParent);
        r.x += tmp.x;
        r.y += tmp.y;
    }
    return r;
};
Zapatec.Utils.getElementOffset = function(oEl) {
    var iLeft = iTop = iWidth = iHeight = 0;
    if (oEl.getBoundingClientRect) {
        var oRect = oEl.getBoundingClientRect();
        iLeft = oRect.left;
        iTop = oRect.top;
        iWidth = oRect.right - iLeft;
        iHeight = oRect.bottom - iTop;
        iLeft += Zapatec.Utils.getPageScrollX() - 2;
        iTop += Zapatec.Utils.getPageScrollY() - 2;
    } else {
        iWidth = oEl.offsetWidth;
        iHeight = oEl.offsetHeight;
        var sPos = Zapatec.Utils.getStyleProperty(oEl, 'position');
        if (sPos == 'fixed') {
            iLeft = oEl.offsetLeft + Zapatec.Utils.getPageScrollX();
            iTop = oEl.offsetTop + Zapatec.Utils.getPageScrollY();
        } else if (sPos == 'absolute') {
            while (oEl) {
                var sTag = oEl.tagName;
                if (sTag) {
                    sTag = sTag.toLowerCase();
                    if (sTag != 'body' && sTag != 'html') {
                        iLeft += parseInt(oEl.offsetLeft, 10) || 0;
                        iTop += parseInt(oEl.offsetTop, 10) || 0;
                    }
                }
                oEl = oEl.offsetParent;
                var sTag = oEl?oEl.tagName:null;
                if (sTag) {
                    sTag = sTag.toLowerCase();
                    if (sTag != 'body' && sTag != 'html') {
                        iLeft -= oEl.scrollLeft;
                        iTop -= oEl.scrollTop;
                    }
                }
            }
        } else {
            var oP = oEl;
            while (oP) {
                iLeft += parseInt(oP.offsetLeft, 10) || 0;
                iTop += parseInt(oP.offsetTop, 10) || 0;
                oP = oP.offsetParent;
            }
            oP = oEl;
            while (oP.parentNode) {
                oP = oP.parentNode;
                var sTag = oP.tagName;
                if (sTag) {
                    sTag = sTag.toLowerCase();
                    if (sTag != 'body' && sTag != 'html' && sTag != 'tr') {
                        iLeft -= oP.scrollLeft;
                        iTop -= oP.scrollTop;
                    }
                }
            }
        }
    }
    return{left:iLeft,top:iTop,x:iLeft,y:iTop,width:iWidth,height:iHeight};
};
Zapatec.Utils.getElementOffsetScrollable = function(oEl) {
    var oPos = Zapatec.Utils.getElementOffset(oEl);
    if (oEl.scrollLeft) {
        oPos.left -= oEl.scrollLeft;
        oPos.x = oPos.left;
    }
    if (oEl.scrollTop) {
        oPos.top -= oEl.scrollTop;
        oPos.y = oPos.top;
    }
    return oPos;
};
Zapatec.Utils.fixBoxPosition = function(box, leave) {
    var screenX = Zapatec.Utils.getPageScrollX();
    var screenY = Zapatec.Utils.getPageScrollY();
    var sizes = Zapatec.Utils.getWindowSize();
    leave = parseInt(leave, 10) || 0;
    if (box.x < screenX) {
        box.x = screenX + leave;
    }
    if (box.y < screenY) {
        box.y = screenY + leave;
    }
    if (box.x + box.width > screenX + sizes.width) {
        box.x = screenX + sizes.width - box.width - leave;
    }
    if (box.y + box.height > screenY + sizes.height) {
        box.y = screenY + sizes.height - box.height - leave;
    }
};
Zapatec.Utils.isRelated = function(el, evt) {
    evt || (evt = window.event);
    var related = evt.relatedTarget;
    if (!related) {
        var type = evt.type;
        if (type == "mouseover") {
            related = evt.fromElement;
        } else if (type == "mouseout") {
            related = evt.toElement;
        }
    }
    try {
        while (related) {
            if (related == el) {
                return true;
            }
            related = related.parentNode;
        }
    } catch(e) {
    }
    ;
    return false;
};
Zapatec.Utils.removeClass = function(el, className) {
    if (!(el && el.className)) {
        return;
    }
    var cls = el.className.split(" ");
    var ar = [];
    for (var i = cls.length; i > 0;) {
        if (cls[--i] != className) {
            ar[ar.length] = cls[i];
        }
    }
    el.className = ar.join(" ");
};
Zapatec.Utils.addClass = function(el, className) {
    Zapatec.Utils.removeClass(el, className);
    el.className += " " + className;
};
Zapatec.Utils.getElement = function(ev) {
    if (Zapatec.is_ie) {
        return window.event.srcElement;
    } else {
        return ev.currentTarget;
    }
};
Zapatec.Utils.getTargetElement = function(ev) {
    if (Zapatec.is_ie) {
        return window.event.srcElement;
    } else {
        return ev.target;
    }
};
Zapatec.Utils.getMousePos = function(oEv) {
    oEv || (oEv = window.event);
    var oPos = {pageX:0,pageY:0,clientX:0,clientY:0};
    if (oEv) {
        var bIsPageX = (typeof oEv.pageX != 'undefined');
        var bIsClientX = (typeof oEv.clientX != 'undefined');
        if (bIsPageX || bIsClientX) {
            if (bIsPageX) {
                oPos.pageX = oEv.pageX;
                oPos.pageY = oEv.pageY;
            } else {
                oPos.pageX = oEv.clientX + Zapatec.Utils.getPageScrollX();
                oPos.pageY = oEv.clientY + Zapatec.Utils.getPageScrollY();
            }
            if (bIsClientX) {
                oPos.clientX = oEv.clientX;
                oPos.clientY = oEv.clientY;
            } else {
                oPos.clientX = oEv.pageX - Zapatec.Utils.getPageScrollX();
                oPos.clientY = oEv.pageY - Zapatec.Utils.getPageScrollY();
            }
        }
    }
    return oPos;
};
Zapatec.Utils.stopEvent = function(ev) {
    ev || (ev = window.event);
    if (ev) {
        if (Zapatec.is_ie) {
            ev.cancelBubble = true;
            ev.returnValue = false;
        } else {
            ev.preventDefault();
            ev.stopPropagation();
        }
    }
    return false;
};
Zapatec.Utils.removeOnUnload = [];
Zapatec.Utils.addEvent = function(oElement, sEvent, fListener, bUseCapture) {
    if (oElement.addEventListener) {
        if (!bUseCapture) {
            bUseCapture = false;
        }
        oElement.addEventListener(sEvent, fListener, bUseCapture);
    } else if (oElement.attachEvent) {
        oElement.detachEvent('on' + sEvent, fListener);
        oElement.attachEvent('on' + sEvent, fListener);
        if (bUseCapture) {
            oElement.setCapture(false);
        }
    }
    Zapatec.Utils.removeOnUnload.push({'element':oElement,'event':sEvent,'listener':fListener,'capture':bUseCapture});
};
Zapatec.Utils.removeEvent = function(oElement, sEvent, fListener, bUseCapture) {
    if (oElement.removeEventListener) {
        oElement.removeEventListener(sEvent, fListener, bUseCapture);
    } else if (oElement.detachEvent) {
        oElement.detachEvent('on' + sEvent, fListener);
    }
    for (var iLis = Zapatec.Utils.removeOnUnload.length - 1; iLis >= 0; iLis--) {
        var oParams = Zapatec.Utils.removeOnUnload[iLis];
        if (!oParams) {
            continue;
        }
        if (oElement == oParams['element'] && sEvent == oParams['event'] && fListener == oParams['listener'] && bUseCapture == oParams['capture']) {
            Zapatec.Utils.removeOnUnload[iLis] = null;
            Zapatec.Utils.removeEvent(oParams['element'], oParams['event'], oParams['listener'], oParams['capture']);
        }
    }
};
Zapatec.Utils.createElement = function(type, parent, selectable) {
    var el = null;
    if (window.self.document.createElementNS)
        el = window.self.document.createElementNS("http://www.w3.org/1999/xhtml", type); else
        el = document.createElement(type);
    if (typeof parent != "undefined" && parent != null)
        parent.appendChild(el);
    if (!selectable) {
        if (Zapatec.is_ie)
            el.setAttribute("unselectable", true);
        if (Zapatec.is_gecko)
            el.style.setProperty("-moz-user-select", "none", "");
    }
    return el;
};
Zapatec.Utils.writeCookie = function(name, value, domain, path, exp_days) {
    value = escape(value);
    var ck = name + "=" + value,exp;
    if (domain)
        ck += ";domain=" + domain;
    if (path)
        ck += ";path=" + path;
    if (exp_days) {
        exp = new Date();
        exp.setTime(exp_days * 86400000 + exp.getTime());
        ck += ";expires=" + exp.toGMTString();
    }
    document.cookie = ck;
};
Zapatec.Utils.getCookie = function(name) {
    var pattern = name + "=";
    var tokenPos = 0;
    while (tokenPos < document.cookie.length) {
        var valuePos = tokenPos + pattern.length;
        if (document.cookie.substring(tokenPos, valuePos) == pattern) {
            var endValuePos = document.cookie.indexOf(";", valuePos);
            if (endValuePos == -1) {
                endValuePos = document.cookie.length;
            }
            return unescape(document.cookie.substring(valuePos, endValuePos));
        }
        tokenPos = document.cookie.indexOf(" ", tokenPos) + 1;
        if (tokenPos == 0) {
            break;
        }
    }
    return null;
};
Zapatec.Utils.makePref = function(obj) {
    function stringify(val) {
        if (typeof val == "object" && !val)
            return"null"; else if (typeof val == "number" || typeof val == "boolean")
            return val; else if (typeof val == "string")
            return'"' + val.replace(/\x22/, "\\22") + '"'; else return null;
    }
    ;
    var txt = "",i;
    for (i in obj)
        txt += (txt?",'":"'") + i + "':" + stringify(obj[i]);
    return txt;
};
Zapatec.Utils.loadPref = function(txt) {
    var obj = null;
    try {
        eval("obj={" + txt + "}");
    } catch(e) {
    }
    return obj;
};
Zapatec.Utils.mergeObjects = function(dest, src) {
    for (var i in src)
        dest[i] = src[i];
};
Zapatec.Utils.__wch_id = 0;
Zapatec.Utils.createWCH = function(element) {
    var f = null;
    element = element || document.body;
    if (Zapatec.is_ie && !Zapatec.is_ie5) {
        var filter = 'filter:progid:DXImageTransform.Microsoft.alpha(style=0,opacity=0);';
        var id = "WCH" + (++Zapatec.Utils.__wch_id);
        element.insertAdjacentHTML
                ('beforeEnd', '<iframe id="' + id + '" scrolling="no" frameborder="0" ' + 'style="z-index:0;position:absolute;visibility:hidden;' + filter + 'border:0;top:0;left:0;width:0;height:0" ' + 'src="javascript:false"></iframe>');
        f = document.getElementById(id);
    }
    return f;
};
Zapatec.Utils.setupWCH_el = function(f, el, el2) {
    if (f) {
        var pos = Zapatec.Utils.getAbsolutePos(el),X1 = pos.x,Y1 = pos.y,X2 = X1 + el.offsetWidth,Y2 = Y1 + el.offsetHeight;
        if (el2) {
            var p2 = Zapatec.Utils.getAbsolutePos(el2),XX1 = p2.x,YY1 = p2.y,XX2 = XX1 + el2.offsetWidth,YY2 = YY1 + el2.offsetHeight;
            if (X1 > XX1)
                X1 = XX1;
            if (Y1 > YY1)
                Y1 = YY1;
            if (X2 < XX2)
                X2 = XX2;
            if (Y2 < YY2)
                Y2 = YY2;
        }
        Zapatec.Utils.setupWCH(f, X1, Y1, X2 - X1, Y2 - Y1);
    }
};
Zapatec.Utils.setupWCH = function(f, x, y, w, h) {
    if (f) {
        var s = f.style;
        (typeof x != "undefined") && (s.left = x + "px");
        (typeof y != "undefined") && (s.top = y + "px");
        (typeof w != "undefined") && (s.width = w + "px");
        (typeof h != "undefined") && (s.height = h + "px");
        s.visibility = "inherit";
    }
};
Zapatec.Utils.hideWCH = function(f) {
    if (f)
        f.style.visibility = "hidden";
};
Zapatec.Utils.getPageScrollY = function() {
    if (window.pageYOffset) {
        return window.pageYOffset;
    } else if (document.body && document.body.scrollTop) {
        return document.body.scrollTop;
    } else if (document.documentElement && document.documentElement.scrollTop) {
        return document.documentElement.scrollTop;
    }
    return 0;
};
Zapatec.Utils.getPageScrollX = function() {
    if (window.pageXOffset) {
        return window.pageXOffset;
    } else if (document.body && document.body.scrollLeft) {
        return document.body.scrollLeft;
    } else if (document.documentElement && document.documentElement.scrollLeft) {
        return document.documentElement.scrollLeft;
    }
    return 0;
};
Zapatec.ScrollWithWindow = {};
Zapatec.ScrollWithWindow.list = [];
Zapatec.ScrollWithWindow.stickiness = 0.25;
Zapatec.ScrollWithWindow.register = function(oElement) {
    var iTop = oElement.offsetTop || 0;
    var iLeft = oElement.offsetLeft || 0;
    Zapatec.ScrollWithWindow.list.push({node:oElement,origTop:iTop,origLeft:iLeft});
    if (!Zapatec.ScrollWithWindow.interval) {
        Zapatec.ScrollWithWindow.on();
    }
};
Zapatec.ScrollWithWindow.unregister = function(oElement) {
    for (var iItem = 0; iItem < Zapatec.ScrollWithWindow.list.length; iItem++) {
        var oItem = Zapatec.ScrollWithWindow.list[iItem];
        if (oElement == oItem.node) {
            Zapatec.ScrollWithWindow.list.splice(iItem, 1);
            if (!Zapatec.ScrollWithWindow.list.length) {
                Zapatec.ScrollWithWindow.off();
            }
            return;
        }
    }
};
Zapatec.ScrollWithWindow.moveTop = function(iTop) {
    Zapatec.ScrollWithWindow.top += (iTop - Zapatec.ScrollWithWindow.top) * Zapatec.ScrollWithWindow.stickiness;
    if (Math.abs(Zapatec.ScrollWithWindow.top - iTop) <= 1) {
        Zapatec.ScrollWithWindow.top = iTop;
    }
    for (var iItem = 0; iItem < Zapatec.ScrollWithWindow.list.length; iItem++) {
        var oItem = Zapatec.ScrollWithWindow.list[iItem];
        var oElement = oItem.node;
        oElement.style.position = 'absolute';
        if (!oItem.origTop && oItem.origTop !== 0) {
            oItem.origTop = parseInt(oElement.style.top) || 0;
        }
        oElement.style.top = oItem.origTop +
                             parseInt(Zapatec.ScrollWithWindow.top) + 'px';
    }
};
Zapatec.ScrollWithWindow.moveLeft = function(iLeft) {
    Zapatec.ScrollWithWindow.left += (iLeft - Zapatec.ScrollWithWindow.left) * Zapatec.ScrollWithWindow.stickiness;
    if (Math.abs(Zapatec.ScrollWithWindow.left - iLeft) <= 1) {
        Zapatec.ScrollWithWindow.left = iLeft;
    }
    for (var iItem = 0; iItem < Zapatec.ScrollWithWindow.list.length; iItem++) {
        var oItem = Zapatec.ScrollWithWindow.list[iItem];
        var oElement = oItem.node;
        oElement.style.position = 'absolute';
        if (!oItem.origLeft && oItem.origLeft !== 0) {
            oItem.origLeft = parseInt(oElement.style.left) || 0;
        }
        oElement.style.left = oItem.origLeft +
                              parseInt(Zapatec.ScrollWithWindow.left) + 'px';
    }
};
Zapatec.ScrollWithWindow.cycle = function() {
    var iTop = Zapatec.Utils.getPageScrollY();
    var iLeft = Zapatec.Utils.getPageScrollX();
    if (iTop != Zapatec.ScrollWithWindow.top) {
        Zapatec.ScrollWithWindow.moveTop(iTop);
    }
    if (iLeft != Zapatec.ScrollWithWindow.left) {
        Zapatec.ScrollWithWindow.moveLeft(iLeft);
    }
};
Zapatec.ScrollWithWindow.on = function() {
    if (Zapatec.ScrollWithWindow.interval) {
        return;
    }
    Zapatec.ScrollWithWindow.top = Zapatec.Utils.getPageScrollY();
    Zapatec.ScrollWithWindow.left = Zapatec.Utils.getPageScrollX();
    Zapatec.ScrollWithWindow.interval = setInterval(Zapatec.ScrollWithWindow.cycle, 50);
};
Zapatec.ScrollWithWindow.off = function() {
    if (!Zapatec.ScrollWithWindow.interval) {
        return;
    }
    clearInterval(Zapatec.ScrollWithWindow.interval);
    Zapatec.ScrollWithWindow.interval = null;
};
Zapatec.FixateOnScreen = {};
Zapatec.FixateOnScreen.getExpression = function(coord, direction) {
    return"Zapatec.Utils.getPageScroll" + direction.toUpperCase() + "() + " + coord;
};
Zapatec.FixateOnScreen.parseCoordinates = function(element) {
    if (!this.isRegistered(element)) {
        return false;
    }
    var x = 0;
    var y = 0;
    var style = element.style;
    if (Zapatec.is_ie && !Zapatec.is_ie7) {
        x = style.getExpression("left").split(" ");
        x = parseInt(x[x.length - 1], 10);
        y = style.getExpression("top").split(" ");
        y = parseInt(y[y.length - 1], 10);
    } else {
        x = parseInt(style.left, 10);
        y = parseInt(style.top, 10);
    }
    x += Zapatec.Utils.getPageScrollX();
    y += Zapatec.Utils.getPageScrollY();
    return{x:x,y:y};
};
Zapatec.FixateOnScreen.correctCoordinates = function(x, y) {
    position = {x:x,y:y};
    if (position.x || position.x === 0) {
        position.x -= Zapatec.Utils.getPageScrollX();
        if (Zapatec.is_ie && !Zapatec.is_ie7) {
            position.x = this.getExpression(position.x, "X");
            ;
        } else {
            position.x += "px";
        }
    }
    if (position.y || position.y === 0) {
        position.y -= Zapatec.Utils.getPageScrollY();
        if (Zapatec.is_ie && !Zapatec.is_ie7) {
            position.y = this.getExpression(position.y, "Y");
            ;
        } else {
            position.y += "px";
        }
    }
    return position;
};
Zapatec.FixateOnScreen.register = function(element) {
    if (!Zapatec.isHtmlElement(element)) {
        return false;
    }
    if (this.isRegistered(element)) {
        return true;
    }
    var pos = Zapatec.Utils.getElementOffset(element);
    pos = {x:parseInt(element.style.left, 10) || pos.x,y:parseInt(element.style.top, 10) || pos.y}
    pos = this.correctCoordinates(pos.x, pos.y);
    if (!Zapatec.is_ie || Zapatec.is_ie7) {
        var restorer = element.restorer;
        if (!restorer || !restorer.getObject || restorer.getObject() != element) {
            restorer = element.restorer = new Zapatec.SRProp(element);
        }
        restorer.saveProp("style.position");
        element.style.position = "fixed";
        element.style.left = pos.x;
        element.style.top = pos.y;
    } else {
        element.style.setExpression("left", pos.x);
        element.style.setExpression("top", pos.y);
    }
    element.zpFixed = true;
    return true;
};
Zapatec.FixateOnScreen.unregister = function(element) {
    if (!Zapatec.isHtmlElement(element)) {
        return false;
    }
    var pos = this.parseCoordinates(element);
    if (pos === false) {
        return true;
    }
    if (Zapatec.is_ie && !Zapatec.is_ie7) {
        element.style.removeExpression("left");
        element.style.removeExpression("top");
    }
    element.style.left = pos.x + "px";
    element.style.top = pos.y + "px";
    if (!Zapatec.is_ie || Zapatec.is_ie7) {
        element.restorer.restoreProp("style.position", true);
    }
    element.zpFixed = false;
    return true;
};
Zapatec.FixateOnScreen.isRegistered = function(element) {
    if (element.zpFixed) {
        return true;
    }
    return false;
};
Zapatec.Utils.destroy = function(el) {
    if (el && el.parentNode)
        el.parentNode.removeChild(el);
};
Zapatec.Utils.newCenteredWindow = function(url, windowName, width, height, scrollbars) {
    var leftPosition = 0;
    var topPosition = 0;
    if (screen.width)
        leftPosition = (screen.width - width) / 2;
    if (screen.height)
        topPosition = (screen.height - height) / 2;
    var winArgs = 'height=' + height + ',width=' + width + ',top=' + topPosition + ',left=' + leftPosition + ',scrollbars=' + scrollbars + ',resizable';
    var win = window.open(url, windowName, winArgs);
    return win;
};
Zapatec.Utils.getWindowSize = function() {
    var iWidth = 0;
    var iHeight = 0;
    if (Zapatec.is_opera) {
        iWidth = document.body.clientWidth || 0;
        iHeight = document.body.clientHeight || 0;
    } else if (Zapatec.is_khtml) {
        iWidth = window.innerWidth || 0;
        iHeight = window.innerHeight || 0;
    } else if (document.compatMode && document.compatMode == 'CSS1Compat') {
        iWidth = document.documentElement.clientWidth || 0;
        iHeight = document.documentElement.clientHeight || 0;
    } else {
        iWidth = document.body.clientWidth || 0;
        iHeight = document.body.clientHeight || 0;
    }
    return{width:iWidth,height:iHeight};
};
Zapatec.Utils.selectOption = function(sel, val, call_default) {
    var a = sel.options,i,o;
    for (i = a.length; --i >= 0;) {
        o = a[i];
        o.selected = (o.value == val);
    }
    sel.value = val;
    if (call_default) {
        if (typeof sel.onchange == "function")
            sel.onchange(); else if (typeof sel.onchange == "string")
            eval(sel.onchange);
    }
};
Zapatec.Utils.getNextSibling = function(el, tag, alternateTag) {
    el = el.nextSibling;
    if (!tag) {
        return el;
    }
    tag = tag.toLowerCase();
    if (alternateTag)alternateTag = alternateTag.toLowerCase();
    while (el) {
        if (el.nodeType == 1 && (el.tagName.toLowerCase() == tag || (alternateTag && el.tagName.toLowerCase() == alternateTag))) {
            return el;
        }
        el = el.nextSibling;
    }
    return el;
};
Zapatec.Utils.getPreviousSibling = function(el, tag, alternateTag) {
    el = el.previousSibling;
    if (!tag) {
        return el;
    }
    tag = tag.toLowerCase();
    if (alternateTag)alternateTag = alternateTag.toLowerCase();
    while (el) {
        if (el.nodeType == 1 && (el.tagName.toLowerCase() == tag || (alternateTag && el.tagName.toLowerCase() == alternateTag))) {
            return el;
        }
        el = el.previousSibling;
    }
    return el;
};
Zapatec.Utils.getFirstChild = function(el, tag, alternateTag) {
    if (!el) {
        return null;
    }
    el = el.firstChild;
    if (!el) {
        return null;
    }
    if (!tag) {
        return el;
    }
    tag = tag.toLowerCase();
    if (el.nodeType == 1) {
        if (el.tagName.toLowerCase() == tag) {
            return el;
        } else if (alternateTag) {
            alternateTag = alternateTag.toLowerCase();
            if (el.tagName.toLowerCase() == alternateTag) {
                return el;
            }
        }
    }
    return Zapatec.Utils.getNextSibling(el, tag, alternateTag);
};
Zapatec.Utils.getLastChild = function(el, tag, alternateTag) {
    if (!el) {
        return null;
    }
    el = el.lastChild;
    if (!el) {
        return null;
    }
    if (!tag) {
        return el;
    }
    tag = tag.toLowerCase();
    if (el.nodeType == 1) {
        if (el.tagName.toLowerCase() == tag) {
            return el;
        } else if (alternateTag) {
            alternateTag = alternateTag.toLowerCase();
            if (el.tagName.toLowerCase() == alternateTag) {
                return el;
            }
        }
    }
    return Zapatec.Utils.getPreviousSibling(el, tag, alternateTag);
};
Zapatec.Utils.getChildText = function(objNode) {
    if (objNode == null) {
        return'';
    }
    var arrText = [];
    var objChild = objNode.firstChild;
    while (objChild != null) {
        if (objChild.nodeType == 3) {
            arrText.push(objChild.data);
        }
        objChild = objChild.nextSibling;
    }
    return arrText.join(' ');
};
Zapatec.Utils.insertAfter = function(oldNode, newNode) {
    if (oldNode.nextSibling) {
        oldNode.parentNode.insertBefore(newNode, oldNode.nextSibling);
    } else {
        oldNode.parentNode.appendChild(newNode);
    }
}
Zapatec.Utils._ids = {};
Zapatec.Utils.generateID = function(code, id) {
    if (typeof id == "undefined") {
        if (typeof this._ids[code] == "undefined")
            this._ids[code] = 0;
        id = ++this._ids[code];
    }
    return"zapatec-" + code + "-" + id;
};
Zapatec.Utils.addTooltip = function(target, tooltip) {
    return new Zapatec.Tooltip({target:target,tooltip:tooltip});
};
Zapatec.isLite = true;
Zapatec.Utils.checkLinks = function() {
    var anchors = document.getElementsByTagName('A');
    for (var ii = 0; ii < anchors.length; ii++) {
        if (Zapatec.Utils.checkLink(anchors[ii])) {
            return true;
        }
    }
    return false;
}
Zapatec.Utils.checkLink = function(lnk) {
    if (!lnk) {
        return false;
    }
    if (!/^https?:\/\/((dev|www)\.)?zapatec\.com/i.test(lnk.href)) {
        return false;
    }
    var textContent = ""
    for (var ii = 0; ii < lnk.childNodes.length; ii++) {
        if (lnk.childNodes[ii].nodeType == 3) {
            textContent += lnk.childNodes[ii].nodeValue;
        }
    }
    if (textContent.length < 4) {
        return false;
    }
    var parent = lnk;
    while (parent && parent.nodeName.toLowerCase() != "html") {
        if (Zapatec.Utils.getStyleProperty(parent, "display") == "none" || Zapatec.Utils.getStyleProperty(parent, "visibility") == "hidden" || Zapatec.Utils.getStyleProperty(parent, "opacity") == "0" || Zapatec.Utils.getStyleProperty(parent, "-moz-opacity") == "0" || /alpha\(opacity=0\)/i.test(Zapatec.Utils.getStyleProperty(parent, "filter"))) {
            return false;
        }
        parent = parent.parentNode;
    }
    var coords = Zapatec.Utils.getElementOffset(lnk);
    if (coords.left < 0 || coords.top < 0) {
        return false;
    }
    return true;
}
Zapatec.Utils.checkActivation = function() {
    if (!Zapatec.isLite)return true;
    var arrProducts = []
    add_product = function(script, webdir_in, name_in)
    {
        arrProducts[script] = {webdir:webdir_in,name:name_in,bActive:false}
    }
    add_product('calendar.js', 'prod1', 'Calendar')
    add_product('zpmenu.js', 'menu', 'Menu')
    add_product('tree.js', 'prod3', 'Tree')
    add_product('form.js', 'forms', 'Forms')
    add_product('effects.js', 'effects', 'Effects')
    add_product('hoverer.js', 'effects', 'Effects - Hoverer')
    add_product('slideshow.js', 'effects', 'Effects - Slideshow')
    add_product('zpgrid.js', 'grid', 'Grid')
    add_product('slider.js', 'slider', 'Slider')
    add_product('zptabs.js', 'tabs', 'Tabs')
    add_product('zptime.js', 'time', 'Time')
    add_product('window.js', 'windows', 'Window')
    var strName,arrName,i
    var bProduct = false
    var scripts = document.getElementsByTagName('script');
    for (i = 0; i < scripts.length; i++)
    {
        if (/wizard.js/i.test(scripts[i].src))
            return true
        arrName = scripts[i].src.split('/')
        if (arrName.length == 0)
            strName = scripts[i]
        else
            strName = arrName[arrName.length - 1]
        strName = strName.toLowerCase()
        if (typeof arrProducts[strName] != 'undefined')
        {
            bProduct = true
            arrProducts[strName].bActive = true
        }
    }
    if (!bProduct || Zapatec.Utils.checkLinks()) {
        return true;
    }
    var strMsg = 'You are using the Free version of the Zapatec Software.\n' + 'While using the Free version, a link to www.zapatec.com in this page is required.'
    for (i in arrProducts)
        if (arrProducts[i].bActive == true)
            strMsg += '\nTo purchase the Zapatec ' + arrProducts[i].name + ' visit www.zapatec.com/website/main/products/' + arrProducts[i].webdir + '/'
    alert(strMsg)
    return false;
}
Zapatec.Utils.clone = function(oSource) {
    var oClone;
    if (!oSource && typeof oSource == 'object') {
        return null;
    } else if (typeof oSource == 'undefined') {
        return oClone;
    }
    if ((oSource instanceof String) || (oSource instanceof Number) || (oSource instanceof Boolean)) {
        oClone = new oSource.constructor(oSource.valueOf());
    } else {
        oClone = new oSource.constructor();
    }
    for (var sProperty in oSource) {
        if (typeof oSource[sProperty] == 'object') {
            oClone[sProperty] = Zapatec.Utils.clone(oSource[sProperty], true);
        } else {
            oClone[sProperty] = oSource[sProperty];
        }
    }
    return oClone;
};
Zapatec.is_opera = /opera/i.test(navigator.userAgent);
Zapatec.is_ie = (/msie/i.test(navigator.userAgent) && !Zapatec.is_opera);
Zapatec.is_ie5 = (Zapatec.is_ie && /msie 5\.0/i.test(navigator.userAgent));
Zapatec.is_ie7 = (Zapatec.is_ie && /msie 7\.0/i.test(navigator.userAgent));
Zapatec.is_mac_ie = (/msie.*mac/i.test(navigator.userAgent) && !Zapatec.is_opera);
Zapatec.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);
Zapatec.is_konqueror = /Konqueror/i.test(navigator.userAgent);
Zapatec.is_gecko = /Gecko/i.test(navigator.userAgent);
Zapatec.is_webkit = /WebKit/i.test(navigator.userAgent);
Zapatec.webkitVersion = Zapatec.is_webkit?parseInt(navigator.userAgent.replace(/.+WebKit\/([0-9]+)\..+/, "$1")):-1;
if (!Object.prototype.hasOwnProperty) {
    Object.prototype.hasOwnProperty = function(strProperty) {
        try {
            var objPrototype = this.constructor.prototype;
            while (objPrototype) {
                if (objPrototype[strProperty] == this[strProperty]) {
                    return false;
                }
                objPrototype = objPrototype.prototype;
            }
        } catch(objException) {
        }
        return true;
    };
}
if (!Function.prototype.call) {
    Function.prototype.call = function() {
        var objThis = arguments[0];
        objThis._this_func = this;
        var arrArgs = [];
        for (var iArg = 1; iArg < arguments.length; iArg++) {
            arrArgs[arrArgs.length] = 'arguments[' + iArg + ']';
        }
        var ret = eval('objThis._this_func(' + arrArgs.join(',') + ')');
        objThis._this_func = null;
        return ret;
    };
}
if (!Function.prototype.apply) {
    Function.prototype.apply = function() {
        var objThis = arguments[0];
        var objArgs = arguments[1];
        objThis._this_func = this;
        var arrArgs = [];
        if (objArgs) {
            for (var iArg = 0; iArg < objArgs.length; iArg++) {
                arrArgs[arrArgs.length] = 'objArgs[' + iArg + ']';
            }
        }
        var ret = eval('objThis._this_func(' + arrArgs.join(',') + ')');
        objThis._this_func = null;
        return ret;
    };
}
if (!Array.prototype.pop) {
    Array.prototype.pop = function() {
        var last;
        if (this.length) {
            last = this[this.length - 1];
            this.length -= 1;
        }
        return last;
    };
}
if (!Array.prototype.push) {
    Array.prototype.push = function() {
        for (var i = 0; i < arguments.length; i++) {
            this[this.length] = arguments[i];
        }
        return this.length;
    };
}
if (!Array.prototype.shift) {
    Array.prototype.shift = function() {
        var first;
        if (this.length) {
            first = this[0];
            for (var i = 0; i < this.length - 1; i++) {
                this[i] = this[i + 1];
            }
            this.length -= 1;
        }
        return first;
    };
}
if (!Array.prototype.unshift) {
    Array.prototype.unshift = function() {
        if (arguments.length) {
            var i,len = arguments.length;
            for (i = this.length + len - 1; i >= len; i--) {
                this[i] = this[i - len];
            }
            for (i = 0; i < len; i++) {
                this[i] = arguments[i];
            }
        }
        return this.length;
    };
}
if (!Array.prototype.splice) {
    Array.prototype.splice = function(index, howMany) {
        var elements = [],removed = [],i;
        for (i = 2; i < arguments.length; i++) {
            elements.push(arguments[i]);
        }
        for (i = index; (i < index + howMany) && (i < this.length); i++) {
            removed.push(this[i]);
        }
        for (i = index + howMany; i < this.length; i++) {
            this[i - howMany] = this[i];
        }
        this.length -= removed.length;
        for (i = this.length + elements.length - 1; i >= index + elements.length; i--) {
            this[i] = this[i - elements.length];
        }
        for (i = 0; i < elements.length; i++) {
            this[index + i] = elements[i];
        }
        return removed;
    };
}
Zapatec.Utils.arrIndexOf = function(arr, searchElement, fromIndex) {
    if (Array.prototype.indexOf) {
        return arr.indexOf(searchElement, fromIndex);
    }
    if (!fromIndex) {
        fromIndex = 0;
    }
    for (var iElement = fromIndex; iElement < arr.length; iElement++) {
        if (arr[iElement] == searchElement) {
            return iElement;
        }
    }
    return-1;
};
Zapatec.Log = function(objArgs) {
    if (!objArgs) {
        return;
    }
    var strMessage = objArgs.description;
    if (objArgs.severity) {
        strMessage = objArgs.severity + ':\n' + strMessage;
    }
    if (objArgs.type != "warning") {
        alert(strMessage);
    }
};
Zapatec.Utils.Array = {};
Zapatec.Utils.Array.insertBefore = function(arr, el, key, nextKey) {
    var tmp = new Array();
    for (var i in arr) {
        if (i == nextKey) {
            if (key) {
                tmp[key] = el;
            } else {
                tmp.push(el);
            }
        }
        tmp[i] = arr[i];
    }
    return tmp;
}
Zapatec.inherit = function(oSubClass, oSuperClass, oArg) {
    var Inheritance = function() {
    };
    Inheritance.prototype = oSuperClass.prototype;
    oSubClass.prototype = new Inheritance();
    oSubClass.prototype.constructor = oSubClass;
    oSubClass.SUPERconstructor = oSuperClass;
    oSubClass.SUPERclass = oSuperClass.prototype;
    if (typeof oSuperClass.path != 'undefined') {
        if (oArg && oArg.keepPath) {
            oSubClass.path = oSuperClass.path;
        } else {
            oSubClass.path = Zapatec.getPath(oSubClass.id);
        }
    }
};
Zapatec.getPath = function(sId) {
    var sSrc;
    if (typeof sId == 'string') {
        var oScript = document.getElementById(sId);
        if (oScript) {
            sSrc = oScript.getAttribute('src');
        }
    }
    if (!sSrc) {
        if (typeof Zapatec.lastLoadedModule == 'string') {
            return Zapatec.lastLoadedModule;
        }
        if (document.documentElement) {
            var sHtml = document.documentElement.innerHTML;
            var aMatch = sHtml.match(/<script[^>]+src=[^>]+>/gi);
            if (aMatch && aMatch.length) {
                sHtml = aMatch[aMatch.length - 1];
                aMatch = sHtml.match(/src="([^"]+)/i);
                if (aMatch && aMatch.length == 2) {
                    sSrc = aMatch[1];
                }
            }
        }
        if (!sSrc) {
            return'';
        }
    }
    sSrc = sSrc.replace(/\\/g, '/');
    var aTokens = sSrc.split('?');
    aTokens = aTokens[0].split('/');
    aTokens = aTokens.slice(0, -1);
    if (!aTokens.length) {
        return'';
    }
    return aTokens.join('/') + '/';
};
Zapatec.Utils.setWindowEvent = function(oEvent) {
    if (oEvent) {
        window.event = oEvent;
    }
};
Zapatec.Utils.emulateWindowEvent = function(aEventNames) {
    if (document.addEventListener) {
        for (var iEvent = 0; iEvent < aEventNames.length; iEvent++) {
            document.addEventListener(aEventNames[iEvent], Zapatec.Utils.setWindowEvent, true);
        }
    }
};
Zapatec.windowLoaded = typeof(document.readyState) != 'undefined'?(document.readyState == 'loaded' || document.readyState == 'complete'):document.getElementsByTagName != null && typeof(document.getElementsByTagName('body')[0]) != 'undefined';
Zapatec.Utils.addEvent(window, "load", function() {
    Zapatec.windowLoaded = true;
});
Zapatec.Utils.warnUnload = function(msg, win) {
    Zapatec.Utils.warnUnloadFlag = true;
    if (typeof(msg) != "string") {
        msg = "All your changes will be lost.";
    }
    if (typeof(win) == 'undefined') {
        win = window;
    }
    Zapatec.Utils.addEvent(win, 'beforeunload', function(ev) {
        if (Zapatec.Utils.warnUnloadFlag != true) {
            return true;
        }
        if (typeof(ev) == 'undefined') {
            ev = window.event;
        }
        ev.returnValue = msg;
        return false;
    });
}
Zapatec.Utils.unwarnUnload = function(msg, win) {
    Zapatec.Utils.warnUnloadFlag = false;
}
Zapatec.Utils.warnUnloadFlag = false;
Zapatec.Utils.getMaxZindex = function() {
    if (window.opera || Zapatec.is_khtml) {
        return 2147483583;
    } else if (Zapatec.is_ie) {
        return 2147483647;
    } else {
        return 10737418239;
    }
};
Zapatec.Utils.correctCssLength = function(val) {
    if (typeof val == 'undefined' || (typeof val == 'object' && !val)) {
        return'auto';
    }
    val += '';
    if (!val.length) {
        return'auto';
    }
    if (/\d$/.test(val)) {
        val += 'px';
    }
    return val;
};
Zapatec.Utils.destroyOnUnload = [];
Zapatec.Utils.addDestroyOnUnload = function(objElement, strProperty) {
    Zapatec.Utils.destroyOnUnload.push([objElement,strProperty]);
};
Zapatec.Utils.createProperty = function(objElement, strProperty, val) {
    objElement[strProperty] = val;
    Zapatec.Utils.addDestroyOnUnload(objElement, strProperty);
};
Zapatec.Utils.addEvent(window, 'unload', function() {
    for (var iObj = Zapatec.Utils.destroyOnUnload.length - 1; iObj >= 0; iObj--) {
        var objDestroy = Zapatec.Utils.destroyOnUnload[iObj];
        objDestroy[0][objDestroy[1]] = null;
        objDestroy[0] = null;
    }
    for (var iLis = Zapatec.Utils.removeOnUnload.length - 1; iLis >= 0; iLis--) {
        var oParams = Zapatec.Utils.removeOnUnload[iLis];
        if (!oParams) {
            continue;
        }
        Zapatec.Utils.removeOnUnload[iLis] = null;
        Zapatec.Utils.removeEvent(oParams['element'], oParams['event'], oParams['listener'], oParams['capture']);
    }
});
Zapatec.Utils.htmlEncode = function(str) {
    str = str.replace(/&/ig, "&amp;");
    str = str.replace(/</ig, "&lt;");
    str = str.replace(/>/ig, "&gt;");
    str = str.replace(/\x22/ig, "&quot;");
    return str;
};
Zapatec.Utils.applyStyle = function(elRef, style) {
    if (typeof(elRef) == 'string') {
        elRef = document.getElementById(elRef);
    }
    if (elRef == null || style == null || elRef.style == null) {
        return null;
    }
    if (Zapatec.is_opera) {
        var pairs = style.split(";");
        for (var ii = 0; ii < pairs.length; ii++) {
            var kv = pairs[ii].split(":");
            if (!kv[1]) {
                continue;
            }
            var value = kv[1].replace(/^\s*/, '').replace(/\s*$/, '');
            var key = "";
            for (var jj = 0; jj < kv[0].length; jj++) {
                if (kv[0].charAt(jj) == "-") {
                    jj++;
                    if (jj < kv[0].length) {
                        key += kv[0].charAt(jj).toUpperCase();
                    }
                    continue;
                }
                key += kv[0].charAt(jj);
            }
            switch (key) {case"float":key = "cssFloat";break;}
            try {
                elRef.style[key] = value;
            } catch(e) {
            }
        }
    } else {
        elRef.style.cssText = style;
    }
    return true;
}
Zapatec.Utils.getStyleProperty = function(objElement, strProperty) {
    if (document.defaultView && document.defaultView.getComputedStyle) {
        strProperty = strProperty.replace(/([A-Z])/g, '-$1').toLowerCase();
        var computedStyle = document.defaultView.getComputedStyle(objElement, '');
        if (computedStyle) {
            return computedStyle.getPropertyValue(strProperty);
        }
    } else if (objElement.currentStyle) {
        return objElement.currentStyle[strProperty];
    }
    return objElement.style[strProperty];
};
Zapatec.Utils.getPrecision = function(dFloat) {
    return(dFloat + '').replace(/^\d*\.*/, '').length;
};
Zapatec.Utils.setPrecision = function(dFloat, iPrecision) {
    dFloat *= 1;
    if (dFloat.toFixed) {
        return(dFloat * 1).toFixed(iPrecision) * 1;
    }
    var iPow = Math.pow(10, iPrecision);
    return parseInt(dFloat * iPow, 10) / iPow;
};
Zapatec.Utils.setPrecisionString = function(dFloat, iPrecision) {
    var sFloat = Zapatec.Utils.setPrecision(dFloat, iPrecision) + '';
    var iZeros = iPrecision - Zapatec.Utils.getPrecision(sFloat);
    for (var iZero = 0; iZero < iZeros; iZero++) {
        sFloat += '0';
    }
    return sFloat;
};
Zapatec.Utils.createNestedHash = function(parent, keys, value) {
    if (parent == null || keys == null) {
        return null;
    }
    var tmp = parent;
    for (var ii = 0; ii < keys.length; ii++) {
        if (typeof(tmp[keys[ii]]) == 'undefined') {
            tmp[keys[ii]] = {};
        }
        if (ii == keys.length - 1 && typeof(value) != 'undefined') {
            tmp[keys[ii]] = value;
        }
        tmp = tmp[keys[ii]];
    }
}
Zapatec.implement = function(classOrObject, interfaceStr) {
    if (typeof interfaceStr != "string") {
        return false;
    }
    if (typeof classOrObject == "function") {
        classOrObject = classOrObject.prototype;
    }
    if (!classOrObject || typeof classOrObject != "object") {
        return false;
    }
    var interfaceObj = window;
    var objs = interfaceStr.split(".");
    try {
        for (var i = 0; i < objs.length; ++i) {
            interfaceObj = interfaceObj[objs[i]];
        }
    } catch(e) {
        return false;
    }
    if (typeof classOrObject.interfaces != "object") {
        classOrObject.interfaces = {};
        classOrObject.interfaces[interfaceStr] = true;
    } else if (classOrObject.interfaces[interfaceStr] !== true) {
        classOrObject.interfaces = Zapatec.Utils.clone(classOrObject.interfaces);
        classOrObject.interfaces[interfaceStr] = true;
    } else {
        return true;
    }
    for (var iProp in interfaceObj) {
        classOrObject[iProp] = interfaceObj[iProp];
    }
    classOrObject.hasInterface = function(interfaceStr) {
        if (this.interfaces[interfaceStr] === true) {
            return true;
        }
        return false;
    }
    return true;
};
Zapatec.Utils.getCharFromEvent = function(evt) {
    if (!evt) {
        evt = window.event;
    }
    var response = {};
    if (Zapatec.is_gecko && !Zapatec.is_khtml && evt.type != "keydown" && evt.type != "keyup") {
        if (evt.charCode) {
            response.chr = String.fromCharCode(evt.charCode);
        } else {
            response.charCode = evt.keyCode;
        }
    } else {
        response.charCode = evt.keyCode || evt.which;
        response.chr = String.fromCharCode(response.charCode);
    }
    if (Zapatec.is_opera && response.charCode == 0) {
        response.charCode = null;
        response.chr = null;
    }
    if (Zapatec.is_khtml && response.charCode == 63272) {
        response.charCode = 46;
        response.chr = null;
    }
    return response;
}
if (typeof Zapatec == 'undefined') {
    Zapatec = function() {
    };
}
Zapatec.Transport = function() {
};
if (typeof ActiveXObject != 'undefined') {
    Zapatec.Transport.XMLDOM = null;
    Zapatec.Transport.XMLHTTP = null;
    Zapatec.Transport.pickActiveXVersion = function(aVersions) {
        for (var iVn = 0; iVn < aVersions.length; iVn++) {
            try {
                var oDoc = new ActiveXObject(aVersions[iVn]);
                if (oDoc) {
                    return aVersions[iVn];
                }
            } catch(oExpn) {
            }
            ;
        }
        return null;
    };
    Zapatec.Transport.XMLDOM = Zapatec.Transport.pickActiveXVersion(['Msxml2.DOMDocument.4.0','Msxml2.DOMDocument.3.0','MSXML2.DOMDocument','MSXML.DOMDocument','Microsoft.XMLDOM']);
    Zapatec.Transport.XMLHTTP = Zapatec.Transport.pickActiveXVersion(['Msxml2.XMLHTTP.4.0','MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP','Microsoft.XMLHTTP']);
    Zapatec.Transport.pickActiveXVersion = null;
}
Zapatec.Transport.createXmlHttpRequest = function() {
    if (typeof ActiveXObject != 'undefined') {
        try {
            return new ActiveXObject(Zapatec.Transport.XMLHTTP);
        } catch(oExpn) {
        }
        ;
    }
    if (typeof XMLHttpRequest != 'undefined') {
        return new XMLHttpRequest();
    }
    return null;
};
Zapatec.Transport.isBusy = function(oArg) {
    var oContr = oArg.busyContainer;
    if (typeof oContr == 'string') {
        oContr = document.getElementById(oContr);
    }
    if (!oContr) {
        return;
    }
    var sImage = oArg.busyImage;
    if (typeof sImage != 'string') {
        sImage = '';
    }
    sImage = sImage.split('/').pop();
    if (!sImage.length) {
        sImage = 'zpbusy.gif';
    }
    var oFC = oContr.firstChild;
    if (oFC) {
        oFC = oFC.firstChild;
        if (oFC) {
            oFC = oFC.firstChild;
            if (oFC && oFC.tagName && oFC.tagName.toLowerCase() == 'img') {
                var sSrc = oFC.getAttribute('src');
                if (typeof sSrc == 'string' && sSrc.length) {
                    sSrc = sSrc.split('/').pop();
                    if (sSrc == sImage) {
                        return true;
                    }
                }
            }
        }
    }
    return false;
};
Zapatec.Transport.showBusy = function(oArg) {
    if (Zapatec.Transport.isBusy(oArg)) {
        return;
    }
    var oContr = oArg.busyContainer;
    if (typeof oContr == 'string') {
        oContr = document.getElementById(oContr);
    }
    if (!oContr) {
        return;
    }
    var sImage = oArg.busyImage;
    var sImageWidth = oArg.busyImageWidth;
    var sImageHeight = oArg.busyImageHeight;
    if (typeof sImage != 'string' || !sImage.length) {
        sImage = 'zpbusy.gif';
    } else {
        if (typeof sImageWidth == 'number' || (typeof sImageWidth == 'string' && /\d$/.test(sImageWidth))) {
            sImageWidth += 'px';
        }
        if (typeof sImageHeight == 'number' || (typeof sImageHeight == 'string' && /\d$/.test(sImageHeight))) {
            sImageHeight += 'px';
        }
    }
    if (!sImageWidth) {
        sImageWidth = '65px';
    }
    if (!sImageHeight) {
        sImageHeight = '35px';
    }
    var sPath = '';
    if (sImage.indexOf('/') < 0) {
        if (Zapatec.zapatecPath) {
            sPath = Zapatec.zapatecPath;
        } else {
            sPath = Zapatec.Transport.getPath('transport.js');
        }
    }
    var aImg = [];
    aImg.push('<img src="');
    aImg.push(sPath);
    aImg.push(sImage);
    aImg.push('"');
    if (sImageWidth || sImageHeight) {
        aImg.push(' style="');
        if (sImageWidth) {
            aImg.push('width:');
            aImg.push(sImageWidth);
            aImg.push(';');
        }
        if (sImageHeight) {
            aImg.push('height:');
            aImg.push(sImageHeight);
        }
        aImg.push('"');
    }
    aImg.push(' />');
    var iContainerWidth = oContr.offsetWidth;
    var iContainerHeight = oContr.offsetHeight;
    var oBusyContr = Zapatec.Utils.createElement('div');
    oBusyContr.style.position = 'relative';
    oBusyContr.style.zIndex = 2147483583;
    var oBusy = Zapatec.Utils.createElement('div', oBusyContr);
    oBusy.style.position = 'absolute';
    oBusy.innerHTML = aImg.join('');
    if (oContr.firstChild) {
        oContr.insertBefore(oBusyContr, oContr.firstChild);
    } else {
        oContr.appendChild(oBusyContr);
    }
    var iBusyWidth = oBusy.offsetWidth;
    var iBusyHeight = oBusy.offsetHeight;
    if (iContainerWidth > iBusyWidth) {
        oBusy.style.left = oContr.scrollLeft +
                           (iContainerWidth - iBusyWidth) / 2 + 'px';
    }
    if (iContainerHeight > iBusyHeight) {
        oBusy.style.top = oContr.scrollTop +
                          (iContainerHeight - iBusyHeight) / 2 + 'px';
    }
};
Zapatec.Transport.removeBusy = function(oArg) {
    var oContr = oArg.busyContainer;
    if (typeof oContr == 'string') {
        oContr = document.getElementById(oContr);
    }
    if (!oContr) {
        return;
    }
    if (Zapatec.Transport.isBusy(oArg)) {
        oContr.removeChild(oContr.firstChild);
    }
};
Zapatec.Transport.fetch = function(oArg) {
    if (oArg == null || typeof oArg != 'object') {
        return null;
    }
    if (!oArg.url) {
        return null;
    }
    if (!oArg.method) {
        oArg.method = 'GET';
    }
    if (typeof oArg.async == 'undefined') {
        oArg.async = true;
    }
    if (!oArg.contentType && oArg.method.toUpperCase() == 'POST') {
        oArg.contentType = 'application/x-www-form-urlencoded';
    }
    if (!oArg.content) {
        oArg.content = null;
    }
    if (!oArg.onLoad) {
        oArg.onLoad = null;
    }
    if (!oArg.onError) {
        oArg.onError = null;
    }
    var oRequest = Zapatec.Transport.createXmlHttpRequest();
    if (oRequest == null) {
        return null;
    }
    Zapatec.Transport.showBusy(oArg);
    var bErrorDisplayed = false;
    var funcOnReady = function() {
        Zapatec.Transport.removeBusy(oArg);
        try {
            if (oRequest.status == 200 || oRequest.status == 304 || (location.protocol == 'file:' && !oRequest.status)) {
                if (typeof oArg.onLoad == 'function') {
                    oArg.onLoad(oRequest);
                }
            } else if (!bErrorDisplayed) {
                bErrorDisplayed = true;
                Zapatec.Transport.displayError(oRequest.status, "Error: Can't fetch " + oArg.url + '.\n' +
                                                                (oRequest.statusText || ''), oArg.onError);
            }
        } catch(oExpn) {
            if (!bErrorDisplayed) {
                bErrorDisplayed = true;
                if (oExpn.name && oExpn.name == 'NS_ERROR_NOT_AVAILABLE') {
                    Zapatec.Transport.displayError(0, "Error: Can't fetch " + oArg.url + '.\nFile not found.', oArg.onError);
                } else {
                    Zapatec.Transport.displayError(0, "Error: Can't fetch " + oArg.url + '.\n' +
                                                      (oExpn.message || ''), oArg.onError);
                }
            }
        }
        ;
    };
    try {
        if (typeof oArg.username != 'undefined' && typeof oArg.password != 'undefined') {
            oRequest.open(oArg.method, oArg.url, oArg.async, oArg.username, oArg.password);
        } else {
            oRequest.open(oArg.method, oArg.url, oArg.async);
        }
        if (oArg.async) {
            oRequest.onreadystatechange = function() {
                if (oRequest.readyState == 4) {
                    funcOnReady();
                    oRequest.onreadystatechange = {};
                }
            };
        }
        if (oArg.contentType) {
            oRequest.setRequestHeader('Content-Type', oArg.contentType);
        }
        oRequest.send(oArg.content);
        if (!oArg.async) {
            funcOnReady();
            return oRequest;
        }
    } catch(oExpn) {
        Zapatec.Transport.removeBusy(oArg);
        if (!bErrorDisplayed) {
            bErrorDisplayed = true;
            if (oExpn.name && oExpn.name == 'NS_ERROR_FILE_NOT_FOUND') {
                Zapatec.Transport.displayError(0, "Error: Can't fetch " + oArg.url + '.\nFile not found.', oArg.onError);
            } else {
                Zapatec.Transport.displayError(0, "Error: Can't fetch " + oArg.url + '.\n' +
                                                  (oExpn.message || ''), oArg.onError);
            }
        }
    }
    ;
    return null;
};
Zapatec.Transport.parseHtml = function(sHtml) {
    sHtml += '';
    sHtml = sHtml.replace(/^\s+/g, '');
    var oTmpContr;
    if (document.createElementNS) {
        oTmpContr = document.createElementNS('http://www.w3.org/1999/xhtml', 'div');
    } else {
        oTmpContr = document.createElement('div');
    }
    oTmpContr.innerHTML = sHtml;
    return oTmpContr;
};
Zapatec.Transport.evalGlobalScope = function(sScript) {
    if (typeof sScript != 'string' || !sScript.match(/\S/)) {
        return;
    }
    if (window.execScript) {
        window.execScript(sScript, 'javascript');
    } else if (window.eval) {
        window.eval(sScript);
    }
};
Zapatec.Transport.setInnerHtml = function(oArg) {
    if (!oArg || typeof oArg.html != 'string') {
        return;
    }
    var sHtml = oArg.html;
    var oContr = null;
    if (typeof oArg.container == 'string') {
        oContr = document.getElementById(oArg.container);
    } else if (typeof oArg.container == 'object') {
        oContr = oArg.container;
    }
    var aScripts = [];
    if (sHtml.match(/<\s*\/\s*script\s*>/i)) {
        var aTokens = sHtml.split(/<\s*\/\s*script\s*>/i);
        var aHtml = [];
        for (var iToken = aTokens.length - 1; iToken >= 0; iToken--) {
            var sToken = aTokens[iToken];
            if (sToken.match(/\S/)) {
                var aMatch = sToken.match(/<\s*script([^>]*)>/i);
                if (aMatch) {
                    var aCouple = sToken.split(/<\s*script[^>]*>/i);
                    while (aCouple.length < 2) {
                        if (sToken.match(/^<\s*script[^>]*>/i)) {
                            aCouple.unshift('');
                        } else {
                            aCouple.push('');
                        }
                    }
                    aHtml.unshift(aCouple[0]);
                    var sAttrs = aMatch[1];
                    var srtScript = aCouple[1];
                    if (sAttrs.match(/\s+src\s*=/i)) {
                        srtScript = '';
                    } else {
                        srtScript = srtScript.replace(/function\s+([^(]+)/g, '$1=function');
                    }
                    aScripts.push([sAttrs,srtScript]);
                } else if (iToken < aTokens.length - 1) {
                    aTokens[iToken - 1] += '</script>' + sToken;
                } else {
                    aHtml.unshift(sToken);
                }
            } else {
                aHtml.unshift(sToken);
            }
        }
        sHtml = aHtml.join('');
    }
    if (oContr) {
        if (window.opera) {
            oContr.innerHTML = '<form></form>';
        }
        oContr.innerHTML = sHtml;
    }
    for (var iScript = 0; iScript < aScripts.length; iScript++) {
        if (aScripts[iScript][1].length) {
            Zapatec.Transport.evalGlobalScope(aScripts[iScript][1]);
        }
        var sAttrs = aScripts[iScript][0];
        sAttrs = sAttrs.replace(/\s+/g, ' ').replace(/^\s/, '').replace(/\s$/, '').replace(/ = /g, '=');
        if (sAttrs.indexOf('src=') >= 0) {
            var oContr = document.body;
            if (!oContr) {
                oContr = document.getElementsByTagName('head')[0];
                if (!oContr) {
                    oContr = document;
                }
            }
            var aAttrs = sAttrs.split(' ');
            var oScript = Zapatec.Utils.createElement('script');
            for (var iAttr = 0; iAttr < aAttrs.length; iAttr++) {
                var aAttr = aAttrs[iAttr].split('=');
                if (aAttr.length > 1) {
                    oScript.setAttribute(aAttr[0], aAttr[1].match(/^[\s|"|']*([\s|\S]*[^'|"])[\s|"|']*$/)[1]);
                } else {
                    oScript.setAttribute(aAttr[0], aAttr[0]);
                }
            }
            oContr.appendChild(oScript);
        }
    }
};
Zapatec.Transport.fetchXmlDoc = function(oArg) {
    if (oArg == null || typeof oArg != 'object') {
        return null;
    }
    if (!oArg.url) {
        return null;
    }
    if (typeof oArg.async == 'undefined') {
        oArg.async = true;
    }
    if (!oArg.onLoad) {
        oArg.onLoad = null;
    }
    if (!oArg.onError) {
        oArg.onError = null;
    }
    if (!oArg.method && typeof oArg.username == 'undefined' && typeof oArg.password == 'undefined') {
        if (document.implementation && document.implementation.createDocument) {
            var oDoc = null;
            if (!oArg.reliable) {
                oArg.reliable = false;
            }
            var oFetchArg = {};
            for (var sKey in oArg) {
                oFetchArg[sKey] = oArg[sKey];
            }
            if (oArg.async) {
                oFetchArg.onLoad = function(oRequest) {
                    oFetchArg.onLoad = null;
                    var parser = new DOMParser();
                    oDoc = parser.parseFromString(oRequest.responseText, "text/xml");
                    Zapatec.Transport.removeBusy(oArg);
                    Zapatec.Transport.onXmlDocLoad(oDoc, oArg.onLoad, oArg.onError);
                };
            } else {
                oFetchArg.onLoad = null;
            }
            var oRequest = Zapatec.Transport.fetch(oFetchArg);
            if (!oArg.async && oRequest) {
                var parser = new DOMParser();
                oDoc = parser.parseFromString(oRequest.responseText, "text/xml");
                Zapatec.Transport.removeBusy(oArg);
                Zapatec.Transport.onXmlDocLoad(oDoc, oArg.onLoad, oArg.onError);
                return oDoc;
            }
            return null;
        }
        if (typeof ActiveXObject != 'undefined') {
            Zapatec.Transport.showBusy(oArg);
            try {
                var oDoc = new ActiveXObject(Zapatec.Transport.XMLDOM);
                oDoc.async = oArg.async;
                if (oArg.async) {
                    oDoc.onreadystatechange = function() {
                        if (oDoc.readyState == 4) {
                            Zapatec.Transport.removeBusy(oArg);
                            Zapatec.Transport.onXmlDocLoad(oDoc, oArg.onLoad, oArg.onError);
                            oDoc.onreadystatechange = {};
                        }
                    };
                }
                oDoc.load(oArg.url);
                if (!oArg.async) {
                    Zapatec.Transport.removeBusy(oArg);
                    Zapatec.Transport.onXmlDocLoad(oDoc, oArg.onLoad, oArg.onError);
                    return oDoc;
                }
                return null;
            } catch(oExpn) {
                Zapatec.Transport.removeBusy(oArg);
            }
            ;
        }
    }
    var oFetchArg = {};
    for (var sKey in oArg) {
        oFetchArg[sKey] = oArg[sKey];
    }
    if (oArg.async) {
        oFetchArg.onLoad = function(oRequest) {
            Zapatec.Transport.parseXml({strXml:oRequest.responseText,onLoad:oArg.onLoad,onError:oArg.onError});
        };
    } else {
        oFetchArg.onLoad = null;
    }
    var oRequest = Zapatec.Transport.fetch(oFetchArg);
    if (!oArg.async && oRequest) {
        return Zapatec.Transport.parseXml({strXml:oRequest.responseText,onLoad:oArg.onLoad,onError:oArg.onError});
    }
    return null;
};
Zapatec.Transport.parseXml = function(oArg) {
    if (oArg == null || typeof oArg != 'object') {
        return null;
    }
    if (!oArg.strXml) {
        return null;
    }
    if (!oArg.onLoad) {
        oArg.onLoad = null;
    }
    if (!oArg.onError) {
        oArg.onError = null;
    }
    if (window.DOMParser) {
        try {
            var oDoc = (new DOMParser()).parseFromString(oArg.strXml, 'text/xml');
            Zapatec.Transport.onXmlDocLoad(oDoc, oArg.onLoad, oArg.onError);
            return oDoc;
        } catch(oExpn) {
            Zapatec.Transport.displayError(0, "Error: Can't parse.\n" + 'String does not appear to be a valid XML fragment.', oArg.onError);
        }
        ;
        return null;
    }
    if (typeof ActiveXObject != 'undefined') {
        try {
            var oDoc = new ActiveXObject(Zapatec.Transport.XMLDOM);
            oDoc.loadXML(oArg.strXml);
            Zapatec.Transport.onXmlDocLoad(oDoc, oArg.onLoad, oArg.onError);
            return oDoc;
        } catch(oExpn) {
        }
        ;
    }
    return null;
};
Zapatec.Transport.onXmlDocLoad = function(oDoc, onLoad, onError) {
    var sError = null;
    if (oDoc.parseError) {
        sError = oDoc.parseError.reason;
        if (oDoc.parseError.srcText) {
            sError += 'Location: ' + oDoc.parseError.url + '\nLine number ' + oDoc.parseError.line + ', column ' +
                      oDoc.parseError.linepos + ':\n' +
                      oDoc.parseError.srcText + '\n';
        }
    } else if (oDoc.documentElement && oDoc.documentElement.tagName == 'parsererror') {
        sError = oDoc.documentElement.firstChild.data + '\n' +
                 oDoc.documentElement.firstChild.nextSibling.firstChild.data;
    } else if (!oDoc.documentElement) {
        sError = 'String does not appear to be a valid XML fragment.';
    }
    if (sError) {
        Zapatec.Transport.displayError(0, "Error: Can't parse.\n" + sError, onError);
    } else {
        if (typeof onLoad == 'function') {
            onLoad(oDoc);
        }
    }
};
Zapatec.Transport.serializeXmlDoc = function(oDoc) {
    if (window.XMLSerializer) {
        return(new XMLSerializer).serializeToString(oDoc);
    }
    if (oDoc.xml) {
        return oDoc.xml;
    }
};
Zapatec.Transport.fetchJsonObj = function(oArg) {
    if (oArg == null || typeof oArg != 'object') {
        return null;
    }
    if (!oArg.url) {
        return null;
    }
    if (typeof oArg.async == 'undefined') {
        oArg.async = true;
    }
    if (!oArg.reliable) {
        oArg.reliable = false;
    }
    var oFetchArg = {};
    for (var sKey in oArg) {
        oFetchArg[sKey] = oArg[sKey];
    }
    if (oArg.async) {
        oFetchArg.onLoad = function(oRequest) {
            Zapatec.Transport.parseJson({strJson:oRequest.responseText,reliable:oArg.reliable,onLoad:oArg.onLoad,onError:oArg.onError});
        };
    } else {
        oFetchArg.onLoad = null;
    }
    var oRequest = Zapatec.Transport.fetch(oFetchArg);
    if (!oArg.async && oRequest) {
        return Zapatec.Transport.parseJson({strJson:oRequest.responseText,reliable:oArg.reliable,onLoad:oArg.onLoad,onError:oArg.onError});
    }
    return null;
};
Zapatec.Transport.parseJson = function(oArg) {
    if (oArg == null || typeof oArg != 'object') {
        return null;
    }
    if (!oArg.reliable) {
        oArg.reliable = false;
    }
    if (!oArg.onLoad) {
        oArg.onLoad = null;
    }
    if (!oArg.onError) {
        oArg.onError = null;
    }
    var oJson = null;
    try {
        if (oArg.reliable) {
            if (oArg.strJson) {
                oJson = eval('(' + oArg.strJson + ')');
            }
        } else {
            oJson = Zapatec.Transport.parseJsonStr(oArg.strJson);
        }
    } catch(oExpn) {
        var sError = "Error: Can't parse.\nString doesn't appear to be a valid JSON fragment: ";
        sError += oExpn.message;
        if (typeof oExpn.text != 'undefined' && oExpn.text.length) {
            sError += '\n' + oExpn.text;
        }
        sError += '\n' + oArg.strJson;
        Zapatec.Transport.displayError(0, sError, oArg.onError);
        return null;
    }
    ;
    if (typeof oArg.onLoad == 'function') {
        oArg.onLoad(oJson);
    }
    return oJson;
};
Zapatec.Transport.parseJsonStr = function(text) {
    var p = /^\s*(([,:{}\[\]])|"(\\.|[^\x00-\x1f"\\])*"|-?\d+(\.\d*)?([eE][+-]?\d+)?|true|false|null)\s*/,token,operator;
    function error(m, t) {
        throw{name:'JSONError',message:m,text:t || operator || token};
    }
    function next(b) {
        if (b && b != operator) {
            error("Expected '" + b + "'");
        }
        if (text) {
            var t = p.exec(text);
            if (t) {
                if (t[2]) {
                    token = null;
                    operator = t[2];
                } else {
                    operator = null;
                    try {
                        token = eval(t[1]);
                    } catch(e) {
                        error("Bad token", t[1]);
                    }
                }
                text = text.substring(t[0].length);
            } else {
                error("Unrecognized token", text);
            }
        } else {
            token = operator = null;
        }
    }
    function val() {
        var k,o;
        switch (operator) {case'{':next('{');o = {};if (operator != '}') {
            for (; ;) {
                if (operator || typeof token != 'string') {
                    error("Missing key");
                }
                k = token;
                next();
                next(':');
                o[k] = val();
                if (operator != ',') {
                    break;
                }
                next(',');
            }
        }
            next('}');return o;case'[':next('[');o = [];if (operator != ']') {
            for (; ;) {
                o.push(val());
                if (operator != ',') {
                    break;
                }
                next(',');
            }
        }
            next(']');return o;default:if (operator !== null) {
            error("Missing value");
        }
            k = token;next();return k;}
    }
    next();
    return val();
};
Zapatec.Transport.serializeJsonObj = function(v) {
    var a = [];
    function e(s) {
        a[a.length] = s;
    }
    function g(x) {
        var c,i,l,v;
        switch (typeof x) {case'object':if (x) {
            if (x instanceof Array) {
                e('[');
                l = a.length;
                for (i = 0; i < x.length; i += 1) {
                    v = x[i];
                    if (typeof v != 'undefined' && typeof v != 'function') {
                        if (l < a.length) {
                            e(',');
                        }
                        g(v);
                    }
                }
                e(']');
                return;
            } else if (typeof x.toString != 'undefined') {
                e('{');
                l = a.length;
                for (i in x) {
                    v = x[i];
                    if (x.hasOwnProperty(i) && typeof v != 'undefined' && typeof v != 'function') {
                        if (l < a.length) {
                            e(',');
                        }
                        g(i);
                        e(':');
                        g(v);
                    }
                }
                return e('}');
            }
        }
            e('null');return;case'number':e(isFinite(x)?+x:'null');return;case'string':l = x.length;e('"');for (i = 0; i < l; i += 1) {
            c = x.charAt(i);
            if (c >= ' ') {
                if (c == '\\' || c == '"') {
                    e('\\');
                }
                e(c);
            } else {
                switch (c) {case'\b':e('\\b');break;case'\f':e('\\f');break;case'\n':e('\\n');break;case'\r':e('\\r');break;case'\t':e('\\t');break;default:c = c.charCodeAt();e('\\u00' + Math.floor(c / 16).toString(16) +
                                                                                                                                                                                 (c % 16).toString(16));}
            }
        }
            e('"');return;case'boolean':e(String(x));return;default:e('null');return;}
    }
    g(v);
    return a.join('');
};
Zapatec.Transport.displayError = function(iErrCode, sError, onError) {
    if (typeof onError == 'function') {
        onError({errorCode:iErrCode,errorDescription:sError});
    } else {
        alert(sError);
    }
};
Zapatec.Transport.translateUrl = function(oArg) {
    if (!oArg || !oArg.url) {
        return null;
    }
    var aFullUrl = oArg.url.split('?', 2);
    var sUrl = aFullUrl[0];
    if (sUrl.charAt(0) == '/' || sUrl.indexOf(':') >= 0) {
        return oArg.url;
    }
    var sRelativeTo;
    if (typeof oArg.relativeTo != 'string') {
        sRelativeTo = document.location.toString().split('?', 2)[0];
    } else {
        sRelativeTo = oArg.relativeTo.split('?', 2)[0];
        if (sRelativeTo.indexOf('/') < 0) {
            sRelativeTo = document.location.toString().split('?', 2)[0];
        } else if (sRelativeTo.charAt(0) != '/' && sRelativeTo.indexOf(':') < 0) {
            sRelativeTo = Zapatec.Transport.translateUrl({url:sRelativeTo});
        }
    }
    var aUrl = sUrl.split('/');
    var aRelativeTo = sRelativeTo.split('/');
    aRelativeTo.pop();
    for (var iToken = 0; iToken < aUrl.length; iToken++) {
        var sToken = aUrl[iToken];
        if (sToken == '..') {
            aRelativeTo.pop();
        } else if (sToken != '.') {
            aRelativeTo.push(sToken);
        }
    }
    aFullUrl[0] = aRelativeTo.join('/');
    return aFullUrl.join('?');
};
Zapatec.Transport.loading = {};
Zapatec.Transport.setupEvents = function(oArg) {
    if (!oArg) {
        return{};
    }
    if (oArg.force || !Zapatec.EventDriven || !oArg.url) {
        return{onLoad:oArg.onLoad,onError:oArg.onError};
    }
    var sUrl = oArg.url;
    if (typeof oArg.onLoad == 'function') {
        Zapatec.EventDriven.addEventListener('zpTransportOnLoad' + sUrl, oArg.onLoad);
    }
    if (typeof oArg.onError == 'function') {
        Zapatec.EventDriven.addEventListener('zpTransportOnError' + sUrl, oArg.onError);
    }
    if (Zapatec.Transport.loading[sUrl]) {
        return{loading:true};
    } else {
        Zapatec.Transport.loading[sUrl] = true;
        return{onLoad:new Function("Zapatec.EventDriven.fireEvent('zpTransportOnLoad" +
                                   sUrl + "');Zapatec.EventDriven.removeEvent('zpTransportOnLoad" +
                                   sUrl + "');Zapatec.EventDriven.removeEvent('zpTransportOnError" +
                                   sUrl + "');Zapatec.Transport.loading['" + sUrl + "'] = false;"),onError:new Function('oError', "Zapatec.EventDriven.fireEvent('zpTransportOnError" +
                                                                                                                                  sUrl + "',oError);Zapatec.EventDriven.removeEvent('zpTransportOnLoad" +
                                                                                                                                  sUrl + "');Zapatec.EventDriven.removeEvent('zpTransportOnError" +
                                                                                                                                  sUrl + "');Zapatec.Transport.loading['" + sUrl + "'] = false;")};
    }
};
Zapatec.Transport.loadedJS = {};
Zapatec.Transport.isLoadedJS = function(sUrl, sAbsUrl) {
    if (typeof sAbsUrl == 'undefined') {
        sAbsUrl = Zapatec.Transport.translateUrl({url:sUrl});
    }
    if (Zapatec.Transport.loadedJS[sAbsUrl]) {
        return true;
    }
    var aScripts = document.getElementsByTagName('script');
    for (var iScript = 0; iScript < aScripts.length; iScript++) {
        var sSrc = aScripts[iScript].getAttribute('src') || '';
        if (sSrc == sUrl) {
            Zapatec.Transport.loadedJS[sAbsUrl] = true;
            return true;
        }
    }
    return false;
};
Zapatec.Transport.getPath = function(sScriptFileName) {
    var aScripts = document.getElementsByTagName('script');
    for (var iScript = aScripts.length - 1; iScript >= 0; iScript--) {
        var sSrc = aScripts[iScript].getAttribute('src') || '';
        var aTokens = sSrc.split('/');
        var sLastToken = aTokens.pop();
        if (sLastToken == sScriptFileName) {
            return aTokens.length?aTokens.join('/') + '/':'';
        }
    }
    for (var sSrc in Zapatec.Transport.loadedJS) {
        var aTokens = sSrc.split('/');
        var sLastToken = aTokens.pop();
        if (sLastToken == sScriptFileName) {
            return aTokens.length?aTokens.join('/') + '/':'';
        }
    }
    return'';
};
Zapatec.Transport.include = function(sSrc, sId, bForce) {
    if (Zapatec.doNotInclude) {
        return;
    }
    var sAbsUrl = Zapatec.Transport.translateUrl({url:sSrc});
    if (!bForce && Zapatec.Transport.isLoadedJS(sSrc, sAbsUrl)) {
        return;
    }
    document.write('<script type="text/javascript" src="' + sSrc +
                   (typeof sId == 'string'?'" id="' + sId:'') + '"></script>');
    Zapatec.Transport.loadedJS[sAbsUrl] = true;
};
Zapatec.include = Zapatec.Transport.include;
Zapatec.Transport.includeJS = function(sSrc, sId) {
    setTimeout(function() {
        var oContr = document.body;
        if (!oContr) {
            oContr = document.getElementsByTagName('head')[0];
            if (!oContr) {
                oContr = document;
            }
        }
        var oScript = document.createElement('script');
        oScript.type = 'text/javascript';
        oScript.src = sSrc;
        if (typeof sId == 'string') {
            oScript.id = sId;
        }
        oContr.appendChild(oScript);
    }, 0);
};
Zapatec.Transport.loadJS = function(oArg) {
    if (!(oArg instanceof Object)) {
        return;
    }
    if (typeof oArg.async == 'undefined') {
        oArg.async = true;
    }
    var sUrl = null;
    if (oArg.url) {
        sUrl = oArg.url;
    } else if (oArg.module) {
        var sPath = '';
        if (typeof oArg.path != 'undefined') {
            sPath = oArg.path;
        } else if (typeof Zapatec.zapatecPath != 'undefined') {
            sPath = Zapatec.zapatecPath;
        }
        sUrl = sPath + oArg.module + '.js';
    } else {
        return;
    }
    var sAbsUrl = Zapatec.Transport.translateUrl({url:sUrl});
    if (!oArg.onLoad) {
        oArg.onLoad = null;
    }
    if (!oArg.onError) {
        oArg.onError = null;
    }
    if (Zapatec.doNotInclude || (!oArg.force && Zapatec.Transport.isLoadedJS(sUrl, sAbsUrl))) {
        if (typeof oArg.onLoad == 'function') {
            oArg.onLoad();
        }
        return;
    }
    var oHandlers = Zapatec.Transport.setupEvents({url:sAbsUrl,force:oArg.force,onLoad:oArg.onLoad,onError:oArg.onError});
    if (oHandlers.loading) {
        return;
    }
    Zapatec.Transport.fetch({url:sUrl,async:oArg.async,onLoad:function(oRequest) {
        if (oArg.force || !Zapatec.Transport.loadedJS[sAbsUrl]) {
            var aTokens = sUrl.split('/');
            var sLastToken = aTokens.pop();
            Zapatec.lastLoadedModule = aTokens.join('/') + '/';
            Zapatec.Transport.evalGlobalScope(oRequest.responseText);
            Zapatec.lastLoadedModule = null;
            Zapatec.Transport.loadedJS[sAbsUrl] = true;
        }
        if (typeof oHandlers.onLoad == 'function') {
            oHandlers.onLoad();
        }
    },onError:oHandlers.onError});
};
Zapatec.Transport.includeCSS = function(sHref) {
    var oContr = document.getElementsByTagName('head')[0];
    if (!oContr) {
        return;
    }
    var oLink = document.createElement('link');
    oLink.setAttribute('rel', 'stylesheet');
    oLink.setAttribute('type', 'text/css');
    oLink.setAttribute('href', sHref);
    oContr.appendChild(oLink);
};
Zapatec.Transport.loadedCss = {};
Zapatec.Transport.loadCss = function(oArg) {
    if (Zapatec.StyleSheet) {
        Zapatec.Transport.loadCssWithStyleSheet(oArg);
    } else {
        Zapatec.Transport.loadJS({module:'stylesheet',async:oArg.async,onLoad:function() {
            Zapatec.Transport.loadCssWithStyleSheet(oArg);
        }});
    }
};
Zapatec.Transport.loadCssWithStyleSheet = function(oArg) {
    if (!(oArg instanceof Object)) {
        return;
    }
    if (!oArg.url) {
        return;
    }
    if (typeof oArg.async == 'undefined') {
        oArg.async = true;
    }
    var sAbsUrl = Zapatec.Transport.translateUrl({url:oArg.url});
    if (!oArg.force) {
        if (Zapatec.Transport.loadedCss[sAbsUrl]) {
            if (typeof oArg.onLoad == 'function') {
                oArg.onLoad();
            }
            return;
        }
        var aLinks = document.getElementsByTagName('link');
        for (var iLnk = 0; iLnk < aLinks.length; iLnk++) {
            var sHref = aLinks[iLnk].getAttribute('href') || '';
            sHref = Zapatec.Transport.translateUrl({url:sHref});
            if (sHref == sAbsUrl) {
                Zapatec.Transport.loadedCss[sAbsUrl] = true;
                if (typeof oArg.onLoad == 'function') {
                    oArg.onLoad();
                }
                return;
            }
        }
    }
    var oHandlers = Zapatec.Transport.setupEvents({url:sAbsUrl,force:oArg.force,onLoad:oArg.onLoad,onError:oArg.onError});
    if (oHandlers.loading) {
        return;
    }
    Zapatec.Transport.fetch({url:oArg.url,async:oArg.async,onLoad:function(oRequest) {
        var sCss = oRequest.responseText;
        var aResultCss = [];
        var aImgUrls = [];
        var aCssUrls = [];
        var iPos = 0;
        var iNextPos = sCss.indexOf('url(', iPos);
        while (iNextPos >= 0) {
            iNextPos += 4;
            var sToken = sCss.substring(iPos, iNextPos);
            var bIsImport = /@import\s+url\($/.test(sToken);
            aResultCss.push(sToken);
            iPos = iNextPos;
            iNextPos = sCss.indexOf(')', iPos);
            if (iNextPos >= 0) {
                var sImgUrl = sCss.substring(iPos, iNextPos);
                sImgUrl = sImgUrl.replace(/['"]/g, '');
                sImgUrl = Zapatec.Transport.translateUrl({url:sImgUrl,relativeTo:oArg.url});
                sImgUrl = Zapatec.Transport.translateUrl({url:sImgUrl});
                aResultCss.push(sImgUrl);
                if (bIsImport) {
                    aCssUrls.push(sImgUrl);
                } else {
                    aImgUrls.push(sImgUrl);
                }
                iPos = iNextPos;
                iNextPos = sCss.indexOf('url(', iPos);
            }
        }
        aResultCss.push(sCss.substr(iPos));
        sCss = aResultCss.join('');
        Zapatec.Transport.loadCssList({urls:aCssUrls,async:oArg.async,onLoad:function() {
            (new Zapatec.StyleSheet()).addParse(sCss);
            if (typeof oHandlers.onLoad == 'function') {
                oHandlers.onLoad();
            }
        }});
        Zapatec.Transport.loadedCss[sAbsUrl] = true;
        Zapatec.Transport.preloadImages({urls:aImgUrls,timeout:60000});
    },onError:oHandlers.onError});
};
Zapatec.Transport.loadCssList = function(oArg) {
    if (!(oArg instanceof Object)) {
        return;
    }
    if (typeof oArg.async == 'undefined') {
        oArg.async = true;
    }
    if (!oArg.onLoad) {
        oArg.onLoad = null;
    }
    if (!oArg.onError) {
        oArg.onError = null;
    }
    if (!oArg.urls || !oArg.urls.length) {
        if (typeof oArg.onLoad == 'function') {
            oArg.onLoad();
        }
        return;
    }
    var sUrl = oArg.urls.shift();
    var funcOnLoad = function() {
        Zapatec.Transport.loadCssList({urls:oArg.urls,async:oArg.async,force:oArg.force,onLoad:oArg.onLoad,onError:oArg.onError});
    };
    Zapatec.Transport.loadCss({url:sUrl,async:oArg.async,force:oArg.force,onLoad:funcOnLoad,onError:function(oError) {
        Zapatec.Transport.displayError(oError.errorCode, oError.errorDescription, oArg.onError);
        funcOnLoad();
    }});
};
Zapatec.Transport.imagePreloads = [];
Zapatec.Transport.preloadImages = function(oArg) {
    if (Zapatec.PreloadImages) {
        Zapatec.Transport.imagePreloads.push(new Zapatec.PreloadImages(oArg));
    } else {
        Zapatec.Transport.loadJS({module:'preloadimages',onLoad:function() {
            Zapatec.Transport.imagePreloads.push(new Zapatec.PreloadImages(oArg));
        }});
    }
};
if (typeof Zapatec == 'undefined') {
    Zapatec = function() {
    };
}
Zapatec.StyleSheet = function(bUseLast) {
    if (bUseLast) {
        if (document.createStyleSheet) {
            if (document.styleSheets.length) {
                this.styleSheet = document.styleSheets[document.styleSheets.length - 1];
            }
        } else {
            var aStyleSheets = document.getElementsByTagName('style');
            if (aStyleSheets.length) {
                this.styleSheet = aStyleSheets[aStyleSheets.length - 1];
            }
        }
    }
    if (!this.styleSheet) {
        if (document.createStyleSheet) {
            try {
                this.styleSheet = document.createStyleSheet();
            } catch(oException) {
                this.styleSheet = document.styleSheets[document.styleSheets.length - 1];
            }
            ;
        } else {
            this.styleSheet = document.createElement('style');
            this.styleSheet.type = 'text/css';
            var oHead = document.getElementsByTagName('head')[0];
            if (!oHead) {
                oHead = document.documentElement;
            }
            if (oHead) {
                oHead.appendChild(this.styleSheet);
            }
        }
    }
};
Zapatec.StyleSheet.prototype.addRule = function(strSelector, strDeclarations) {
    if (!this.styleSheet) {
        return;
    }
    if (document.createStyleSheet) {
        this.styleSheet.cssText += strSelector + ' { ' + strDeclarations + ' }';
    } else {
        this.styleSheet.appendChild(document.createTextNode(strSelector + ' { ' + strDeclarations + ' }'));
    }
};
Zapatec.StyleSheet.prototype.removeRules = function() {
    if (!this.styleSheet) {
        return;
    }
    if (document.createStyleSheet) {
        var iRules = this.styleSheet.rules.length;
        for (var iRule = 0; iRule < iRules; iRule++) {
            this.styleSheet.removeRule();
        }
    } else {
        while (this.styleSheet.firstChild) {
            this.styleSheet.removeChild(this.styleSheet.firstChild);
        }
    }
};
Zapatec.StyleSheet.prototype.addParse = function(strStyleSheet) {
    var arrClean = [];
    var arrTokens = strStyleSheet.split('/*');
    for (var iTok = 0; iTok < arrTokens.length; iTok++) {
        var arrTails = arrTokens[iTok].split('*/');
        arrClean.push(arrTails[arrTails.length - 1]);
    }
    strStyleSheet = arrClean.join('');
    strStyleSheet = strStyleSheet.replace(/@[^{]*;/g, '');
    var arrStyles = strStyleSheet.split('}');
    for (var iStl = 0; iStl < arrStyles.length; iStl++) {
        var arrRules = arrStyles[iStl].split('{');
        if (arrRules[0] && arrRules[1]) {
            var arrSelectors = arrRules[0].split(',');
            for (var iSel = 0; iSel < arrSelectors.length; iSel++) {
                this.addRule(arrSelectors[iSel], arrRules[1]);
            }
        }
    }
};
Zapatec.ImagePreloader = function(objArgs) {
    this.job = null;
    this.image = null;
    if (arguments.length > 0)this.init(objArgs);
};
Zapatec.ImagePreloader.prototype.init = function(objArgs) {
    if (!objArgs || !objArgs.job) {
        return;
    }
    this.job = objArgs.job;
    this.image = new Image();
    this.job.images.push(this.image);
    var objPreloader = this;
    this.image.onload = function() {
        objPreloader.job.loadedUrls.push(objArgs.url);
        setTimeout(function() {
            objPreloader.onLoad();
        }, 0);
    };
    this.image.onerror = function() {
        objPreloader.job.invalidUrls.push(objArgs.url);
        objPreloader.onLoad();
    };
    this.image.onabort = function() {
        objPreloader.job.abortedUrls.push(objArgs.url);
        objPreloader.onLoad();
    };
    this.image.src = objArgs.url;
    if (typeof objArgs.timeout == 'number') {
        setTimeout(function() {
            if (objPreloader.job) {
                if (objPreloader.image.complete) {
                    objPreloader.job.loadedUrls.push(objArgs.url);
                } else {
                    objPreloader.job.abortedUrls.push(objArgs.url);
                }
                objPreloader.onLoad();
            }
        }, objArgs.timeout);
    }
};
Zapatec.ImagePreloader.prototype.onLoad = function() {
    if (!this.job) {
        return;
    }
    this.image.onload = null;
    this.image.onerror = null;
    this.image.onabort = null;
    var objJob = this.job;
    this.job = null;
    objJob.leftToLoad--;
    if (objJob.leftToLoad == 0 && typeof objJob.onLoad == 'function') {
        var funcOnLoad = objJob.onLoad;
        objJob.onLoad = null;
        funcOnLoad(objJob);
    }
};
Zapatec.PreloadImages = function(objArgs) {
    this.images = [];
    this.leftToLoad = 0;
    this.loadedUrls = [];
    this.invalidUrls = [];
    this.abortedUrls = [];
    this.onLoad = null;
    if (arguments.length > 0)this.init(objArgs);
};
Zapatec.PreloadImages.prototype.init = function(objArgs) {
    if (!objArgs) {
        return;
    }
    if (!objArgs.urls || !objArgs.urls.length) {
        if (typeof objArgs.onLoad == 'function') {
            objArgs.onLoad(this);
        }
        return;
    }
    this.images = [];
    this.leftToLoad = objArgs.urls.length;
    this.loadedUrls = [];
    this.invalidUrls = [];
    this.abortedUrls = [];
    this.onLoad = objArgs.onLoad;
    for (var iUrl = 0; iUrl < objArgs.urls.length; iUrl++) {
        new Zapatec.ImagePreloader({job:this,url:objArgs.urls[iUrl],timeout:objArgs.timeout});
    }
};
if (typeof Zapatec == 'undefined') {
    Zapatec = function() {
    };
}
Zapatec.EventDriven = function() {
};
Zapatec.EventDriven.prototype.init = function() {
    this.events = {};
};
Zapatec.EventDriven.prototype.addEventListener = function(sEvent, fListener) {
    if (typeof fListener != "function") {
        return false;
    }
    if (!this.events[sEvent]) {
        this.events[sEvent] = {listeners:[]};
    } else {
        this.removeEventListener(sEvent, fListener);
    }
    this.events[sEvent].listeners.push(fListener);
};
Zapatec.EventDriven.prototype.unshiftEventListener = function(sEvent, fListener) {
    if (typeof fListener != "function") {
        return false;
    }
    if (!this.events[sEvent]) {
        this.events[sEvent] = {listeners:[]};
    } else {
        this.removeEventListener(sEvent, fListener);
    }
    this.events[sEvent].listeners.unshift(fListener);
};
Zapatec.EventDriven.prototype.removeEventListener = function(sEvent, fListener) {
    if (!this.events[sEvent]) {
        return 0;
    }
    var aListeners = this.events[sEvent].listeners;
    var iRemoved = 0;
    for (var iListener = aListeners.length - 1; iListener >= 0; iListener--) {
        if (aListeners[iListener] == fListener) {
            aListeners.splice(iListener, 1);
            iRemoved++;
        }
    }
    return iRemoved;
};
Zapatec.EventDriven.prototype.getEventListeners = function(sEvent) {
    if (!this.events[sEvent]) {
        return[];
    }
    return this.events[sEvent].listeners;
};
Zapatec.EventDriven.prototype.isEventListener = function(sEvent, fListener) {
    if (!this.events[sEvent]) {
        return false;
    }
    var aListeners = this.events[sEvent].listeners;
    for (var iListener = aListeners.length - 1; iListener >= 0; iListener--) {
        if (aListeners[iListener] == fListener) {
            return true;
        }
    }
    return false;
};
Zapatec.EventDriven.prototype.isEvent = function(sEvent) {
    if (this.events[sEvent]) {
        return true;
    }
    return false;
};
Zapatec.EventDriven.prototype.removeEvent = function(sEvent) {
    if (this.events[sEvent]) {
        var undef;
        this.events[sEvent] = undef;
    }
};
Zapatec.EventDriven.prototype.fireEvent = function(sEvent) {
    if (!this.events[sEvent]) {
        return;
    }
    var aListeners = this.events[sEvent].listeners.slice();
    for (var iListener = 0; iListener < aListeners.length; iListener++) {
        var aArgs = [].slice.call(arguments, 1);
        aListeners[iListener].apply(this, aArgs);
    }
};
Zapatec.EventDriven.events = {};
Zapatec.EventDriven.addEventListener = function(sEvent, fListener) {
    if (typeof fListener != "function") {
        return false;
    }
    if (!Zapatec.EventDriven.events[sEvent]) {
        Zapatec.EventDriven.events[sEvent] = {listeners:[]};
    } else {
        Zapatec.EventDriven.removeEventListener(sEvent, fListener);
    }
    Zapatec.EventDriven.events[sEvent].listeners.push(fListener);
};
Zapatec.EventDriven.unshiftEventListener = function(sEvent, fListener) {
    if (typeof fListener != "function") {
        return false;
    }
    if (!Zapatec.EventDriven.events[sEvent]) {
        Zapatec.EventDriven.events[sEvent] = {listeners:[]};
    } else {
        Zapatec.EventDriven.removeEventListener(sEvent, fListener);
    }
    Zapatec.EventDriven.events[sEvent].listeners.unshift(fListener);
};
Zapatec.EventDriven.removeEventListener = function(sEvent, fListener) {
    if (!Zapatec.EventDriven.events[sEvent]) {
        return 0;
    }
    var aListeners = Zapatec.EventDriven.events[sEvent].listeners;
    var iRemoved = 0;
    for (var iListener = aListeners.length - 1; iListener >= 0; iListener--) {
        if (aListeners[iListener] == fListener) {
            aListeners.splice(iListener, 1);
            iRemoved++;
        }
    }
    return iRemoved;
};
Zapatec.EventDriven.getEventListeners = function(sEvent) {
    if (!Zapatec.EventDriven.events[sEvent]) {
        return[];
    }
    return Zapatec.EventDriven.events[sEvent].listeners;
};
Zapatec.EventDriven.isEventListener = function(sEvent, fListener) {
    if (!Zapatec.EventDriven.events[sEvent]) {
        return false;
    }
    var aListeners = Zapatec.EventDriven.events[sEvent].listeners;
    for (var iListener = aListeners.length - 1; iListener >= 0; iListener--) {
        if (aListeners[iListener] == fListener) {
            return true;
        }
    }
    return false;
};
Zapatec.EventDriven.isEvent = function(sEvent) {
    if (Zapatec.EventDriven.events[sEvent]) {
        return true;
    }
    return false;
};
Zapatec.EventDriven.removeEvent = function(sEvent) {
    if (Zapatec.EventDriven.events[sEvent]) {
        var undef;
        Zapatec.EventDriven.events[sEvent] = undef;
    }
};
Zapatec.EventDriven.fireEvent = function(sEvent) {
    if (!Zapatec.EventDriven.events[sEvent]) {
        return;
    }
    var aListeners = Zapatec.EventDriven.events[sEvent].listeners.slice();
    for (var iListener = 0; iListener < aListeners.length; iListener++) {
        var aArgs = [].slice.call(arguments, 1);
        aListeners[iListener].apply(aListeners[iListener], aArgs);
    }
};
if (typeof Zapatec == 'undefined') {
    Zapatec = function() {
    };
}
Zapatec.Widget = function(oArg) {
    this.config = {};
    Zapatec.Widget.SUPERconstructor.call(this);
    this.init(oArg);
};
Zapatec.inherit(Zapatec.Widget, Zapatec.EventDriven);
Zapatec.Widget.path = Zapatec.getPath('Zapatec.Widget');
Zapatec.Widget.prototype.init = function(oArg) {
    Zapatec.Widget.SUPERclass.init.call(this);
    if (typeof this.id == 'undefined') {
        var iId = 0;
        while (Zapatec.Widget.all[iId]) {
            iId++;
        }
        this.id = iId;
        Zapatec.Widget.all[iId] = this;
    }
    this.configure(oArg);
    this.addUserEventListeners();
    this.addStandardEventListeners();
    this.loadTheme();
};
Zapatec.Widget.prototype.reconfigure = function(oArg) {
    this.configure(oArg);
    this.loadTheme();
};
Zapatec.Widget.prototype.configure = function(oArg) {
    this.defineConfigOption('theme', 'default');
    if (typeof this.constructor.path != 'undefined') {
        this.defineConfigOption('themePath', this.constructor.path + 'themes/');
    } else {
        this.defineConfigOption('themePath', 'themes/');
    }
    this.defineConfigOption('asyncTheme', false);
    this.defineConfigOption('source');
    this.defineConfigOption('sourceType');
    this.defineConfigOption('callbackSource');
    this.defineConfigOption('asyncSource', true);
    this.defineConfigOption('reliableSource', true);
    this.defineConfigOption('eventListeners', {});
    if (oArg) {
        for (var sOption in oArg) {
            if (typeof this.config[sOption] != 'undefined') {
                this.config[sOption] = oArg[sOption];
            } else {
                Zapatec.Log({description:"Unknown config option: " + sOption});
            }
        }
    }
};
Zapatec.Widget.prototype.getConfiguration = function() {
    return this.config;
};
Zapatec.Widget.all = [];
Zapatec.Widget.getWidgetById = function(iId) {
    return Zapatec.Widget.all[iId];
};
Zapatec.Widget.prototype.addCircularRef = function(oElement, sProperty) {
    if (!this.widgetCircularRefs) {
        this.widgetCircularRefs = [];
    }
    this.widgetCircularRefs.push([oElement,sProperty]);
};
Zapatec.Widget.prototype.createProperty = function(oElement, sProperty, val) {
    oElement[sProperty] = val;
    this.addCircularRef(oElement, sProperty);
};
Zapatec.Widget.prototype.removeCircularRefs = function() {
    if (!this.widgetCircularRefs) {
        return;
    }
    for (var iRef = this.widgetCircularRefs.length - 1; iRef >= 0; iRef--) {
        var oRef = this.widgetCircularRefs[iRef];
        oRef[0][oRef[1]] = null;
        oRef[0] = null;
    }
};
Zapatec.Widget.prototype.discard = function() {
    Zapatec.Widget.all[this.id] = null;
    this.removeCircularRefs();
};
Zapatec.Widget.removeCircularRefs = function() {
    for (var iWidget = Zapatec.Widget.all.length - 1; iWidget >= 0; iWidget--) {
        var oWidget = Zapatec.Widget.all[iWidget];
        if (oWidget) {
            oWidget.removeCircularRefs();
        }
    }
};
Zapatec.Utils.addEvent(window, 'unload', Zapatec.Widget.removeCircularRefs);
Zapatec.Widget.prototype.defineConfigOption = function(sOption, val) {
    if (typeof this.config[sOption] == 'undefined') {
        if (typeof val == 'undefined') {
            this.config[sOption] = null;
        } else {
            this.config[sOption] = val;
        }
    }
};
Zapatec.Widget.prototype.addUserEventListeners = function() {
    for (var sEvent in this.config.eventListeners) {
        if (this.config.eventListeners.hasOwnProperty(sEvent)) {
            this.addEventListener(sEvent, this.config.eventListeners[sEvent]);
        }
    }
};
Zapatec.Widget.prototype.addStandardEventListeners = function() {
    this.addEventListener('loadThemeError', Zapatec.Widget.loadThemeError);
};
Zapatec.Widget.loadThemeError = function(oError) {
    var sDescription = "Can't load theme.";
    if (oError && oError.errorDescription) {
        sDescription += ' ' + oError.errorDescription;
    }
    /*Zapatec.Log({description:sDescription});*/
};
Zapatec.Widget.prototype.loadTheme = function() {
    if (typeof this.config.theme == 'string' && this.config.theme.length) {
        var iPos = this.config.theme.lastIndexOf('/');
        if (iPos >= 0) {
            iPos++;
            this.config.themePath = this.config.theme.substring(0, iPos);
            this.config.theme = this.config.theme.substring(iPos);
        }
        iPos = this.config.theme.lastIndexOf('.');
        if (iPos >= 0) {
            this.config.theme = this.config.theme.substring(0, iPos);
        }
        this.config.theme = this.config.theme.toLowerCase();
    } else {
        this.config.theme = '';
    }
    if (this.config.theme) {
        this.fireEvent('loadThemeStart');
        this.themeLoaded = false;
        var oWidget = this;
        var sUrl = this.config.themePath + this.config.theme + '.css';
        Zapatec.Transport.loadCss({url:sUrl,async:this.config.asyncTheme,onLoad:function() {
            oWidget.fireEvent('loadThemeEnd');
            oWidget.themeLoaded = true;
            oWidget.hideLoader();
        },onError:function(oError) {
            oWidget.fireEvent('loadThemeEnd');
            oWidget.fireEvent('loadThemeError', oError);
            oWidget.themeLoaded = true;
            oWidget.hideLoader();
        }});
    }
}
Zapatec.Widget.prototype.getClassName = function(oArg) {
    var aClassName = [];
    if (oArg && oArg.prefix) {
        aClassName.push(oArg.prefix);
    }
    if (this.config.theme != '') {
        aClassName.push(this.config.theme.charAt(0).toUpperCase());
        aClassName.push(this.config.theme.substr(1));
    }
    if (oArg && oArg.suffix) {
        aClassName.push(oArg.suffix);
    }
    return aClassName.join('');
};
Zapatec.Widget.prototype.formElementId = function(oArg) {
    var aId = [];
    if (oArg && oArg.prefix) {
        aId.push(oArg.prefix);
    } else {
        aId.push('zpWidget');
    }
    aId.push(this.id);
    if (oArg && oArg.suffix) {
        aId.push(oArg.suffix);
    } else {
        aId.push('-');
    }
    if (typeof this.widgetUniqueIdCounter == 'undefined') {
        this.widgetUniqueIdCounter = 0;
    } else {
        this.widgetUniqueIdCounter++;
    }
    aId.push(this.widgetUniqueIdCounter);
    return aId.join('');
};
Zapatec.Widget.prototype.showLoader = function(message) {
    if (this.container != null && this.config.theme && !this.themeLoaded) {
        if (!Zapatec.windowLoaded) {
            var self = this;
            Zapatec.Utils.addEvent(window, "load", function() {
                self.showLoader(message)
            });
            return null;
        }
        if (typeof(Zapatec.Indicator) == 'undefined') {
            var self = this;
            Zapatec.Transport.loadJS({module:'indicator',onLoad:function() {
                if (self.themeLoaded) {
                    return null;
                }
                self.showLoader(message);
            }});
            return null;
        }
        this.loader = new Zapatec.Indicator({container:this.container,themePath:Zapatec.zapatecPath + "../zpextra/themes/indicator/"});
        this.loader.start(message || 'loading');
        this.container.style.visibility = 'hidden';
    }
}
Zapatec.Widget.prototype.hideLoader = function() {
    if (this.loader && this.loader.isActive()) {
        this.container.style.visibility = '';
        this.loader.stop();
    }
}
Zapatec.Widget.prototype.showContainer = function(effects, animSpeed, onFinish) {
    return this.showHideContainer(effects, animSpeed, onFinish, true);
}
Zapatec.Widget.prototype.hideContainer = function(effects, animSpeed, onFinish) {
    return this.showHideContainer(effects, animSpeed, onFinish, false);
}
Zapatec.Widget.prototype.showHideContainer = function(effects, animSpeed, onFinish, show) {
    if (this.container == null) {
        return null;
    }
    if (effects && effects.length > 0 && typeof(Zapatec.Effects) == 'undefined') {
        var self = this;
        Zapatec.Transport.loadJS({url:Zapatec.zapatecPath + '../zpeffects/src/effects.js',onLoad:function() {
            self.showHideContainer(effects, animSpeed, onFinish, show);
        }});
        return false;
    }
    if (animSpeed == null && isNaN(parseInt(animSpeed))) {
        animSpeed = 5;
    }
    if (!effects || effects.length == 0) {
        if (show) {
            this.container.style.display = this.originalContainerDisplay;
            this.originalContainerDisplay = null;
        } else {
            this.originalContainerDisplay = this.container.style.display;
            this.container.style.display = 'none';
        }
        if (onFinish) {
            onFinish();
        }
    } else {
        if (show) {
            Zapatec.Effects.show(this.container, animSpeed, effects, onFinish);
        } else {
            Zapatec.Effects.hide(this.container, animSpeed, effects, onFinish);
        }
    }
    return true;
}
Zapatec.Widget.prototype.loadData = function(oArg) {
    if (typeof this.config.callbackSource == 'function') {
        var oSource = this.config.callbackSource(oArg);
        if (oSource) {
            if (typeof oSource.source != 'undefined') {
                this.config.source = oSource.source;
            }
            if (typeof oSource.sourceType != 'undefined') {
                this.config.sourceType = oSource.sourceType;
            }
        }
    }
    if (this.config.source != null && this.config.sourceType != null) {
        var sSourceType = this.config.sourceType.toLowerCase();
        if (sSourceType == 'html') {
            this.fireEvent('loadDataStart');
            this.loadDataHtml(Zapatec.Widget.getElementById(this.config.source));
            this.fireEvent('loadDataEnd');
        } else if (sSourceType == 'html/text') {
            this.fireEvent('loadDataStart');
            this.loadDataHtmlText(this.config.source);
            this.fireEvent('loadDataEnd');
        } else if (sSourceType == 'html/url') {
            this.fireEvent('fetchSourceStart');
            var oWidget = this;
            Zapatec.Transport.fetch({url:this.config.source,async:this.config.asyncSource,onLoad:function(oRequest) {
                oWidget.fireEvent('fetchSourceEnd');
                oWidget.fireEvent('loadDataStart');
                oWidget.loadDataHtmlText(oRequest.responseText);
                oWidget.fireEvent('loadDataEnd');
            },onError:function(oError) {
                oWidget.fireEvent('fetchSourceError', oError);
                oWidget.fireEvent('fetchSourceEnd');
                oWidget.fireEvent('loadDataEnd');
            }});
        } else if (sSourceType == 'json') {
            this.fireEvent('loadDataStart');
            if (typeof this.config.source == 'object') {
                this.loadDataJson(this.config.source);
            } else if (this.config.reliableSource) {
                this.loadDataJson(eval('(' + this.config.source + ')'));
            } else {
                this.loadDataJson(Zapatec.Transport.parseJson({strJson:this.config.source}));
            }
            this.fireEvent('loadDataEnd');
        } else if (sSourceType == 'json/url') {
            this.fireEvent('fetchSourceStart');
            var oWidget = this;
            Zapatec.Transport.fetchJsonObj({url:this.config.source,async:this.config.asyncSource,reliable:this.config.reliableSource,onLoad:function(oResult) {
                oWidget.fireEvent('fetchSourceEnd');
                oWidget.fireEvent('loadDataStart');
                oWidget.loadDataJson(oResult);
                oWidget.fireEvent('loadDataEnd');
            },onError:function(oError) {
                oWidget.fireEvent('fetchSourceError', oError);
                oWidget.fireEvent('fetchSourceEnd');
                oWidget.fireEvent('loadDataEnd');
            }});
        } else if (sSourceType == 'xml') {
            this.fireEvent('loadDataStart');
            if (typeof this.config.source == 'object') {
                this.loadDataXml(this.config.source);
            } else {
                this.loadDataXml(Zapatec.Transport.parseXml({strXml:this.config.source}));
            }
            this.fireEvent('loadDataEnd');
        } else if (sSourceType == 'xml/url') {
            this.fireEvent('fetchSourceStart');
            var oWidget = this;
            Zapatec.Transport.fetchXmlDoc({url:this.config.source,async:this.config.asyncSource,onLoad:function(oResult) {
                oWidget.fireEvent('fetchSourceEnd');
                oWidget.fireEvent('loadDataStart');
                oWidget.loadDataXml(oResult);
                oWidget.fireEvent('loadDataEnd');
            },onError:function(oError) {
                oWidget.fireEvent('fetchSourceError', oError);
                oWidget.fireEvent('fetchSourceEnd');
                oWidget.fireEvent('loadDataEnd');
            }});
        }
    } else {
        this.fireEvent('loadDataStart');
        this.loadDataHtml(Zapatec.Widget.getElementById(this.config.source));
        this.fireEvent('loadDataEnd');
    }
};
Zapatec.Widget.prototype.loadDataHtml = function(oSource) {
};
Zapatec.Widget.prototype.loadDataHtmlText = function(sSource) {
    var oTempContainer = Zapatec.Transport.parseHtml(sSource);
    this.loadDataHtml(oTempContainer.firstChild);
};
Zapatec.Widget.prototype.loadDataJson = function(oSource) {
};
Zapatec.Widget.prototype.loadDataXml = function(oSource) {
};
Zapatec.Widget.prototype.editData = function(oArg) {
    this.fireEvent('editData', oArg);
};
Zapatec.Widget.prototype.editDataGet = function() {
    return null;
};
Zapatec.Widget.prototype.editDataCancel = function() {
    this.fireEvent('editDataCancel');
    if (typeof this.hide == 'function') {
        this.hide();
    }
};
Zapatec.Widget.prototype.editDataReturn = function(oArg) {
    this.fireEvent('editDataReturn', oArg);
    if (!oArg.widget || typeof oArg.widget.editDataReceive != 'function') {
        return;
    }
    oArg.widget.editDataReceive({data:this.editDataGet()});
    this.editDataCancel();
};
Zapatec.Widget.prototype.editDataReceive = function(oArg) {
    this.fireEvent('editDataReceive', oArg);
};
Zapatec.Widget.callMethod = function(iWidgetId, sMethod) {
    var oWidget = Zapatec.Widget.getWidgetById(iWidgetId);
    if (oWidget && typeof oWidget[sMethod] == 'function') {
        var aArgs = [].slice.call(arguments, 2);
        return oWidget[sMethod].apply(oWidget, aArgs);
    }
};
Zapatec.Widget.getElementById = function(element) {
    if (typeof element == 'string') {
        return document.getElementById(element);
    }
    return element;
};
Zapatec.Widget.getStyle = function(element) {
    var style = element.getAttribute('style') || '';
    if (typeof style == 'string') {
        return style;
    }
    return style.cssText;
};
Zapatec.Drag = {};
Zapatec.Utils.emulateWindowEvent(['mousedown','mousemove','mouseup']);
Zapatec.Drag.currentId = null;
Zapatec.Drag.start = function(oEv, sId, oArg) {
    if (Zapatec.Drag.currentId) {
        return true;
    }
    var oEl = document.getElementById(sId);
    if (!oEl || oEl.zpDrag) {
        return true;
    }
    if (!oArg) {
        oArg = {};
    }
    var oPos = Zapatec.Utils.getMousePos(oEv || window.event);
    Zapatec.EventDriven.fireEvent('dragStart', {id:sId});
    oEl.zpDrag = true;
    oEl.zpDragPageX = oPos.pageX;
    oEl.zpDragPageY = oPos.pageY;
    if (oEl.offsetParent) {
        var oPos = Zapatec.Utils.getElementOffset(oEl);
        var oPosParent = Zapatec.Utils.getElementOffset(oEl.offsetParent);
        oEl.zpDragLeft = oPos.left - oPosParent.left;
        oEl.zpDragTop = oPos.top - oPosParent.top;
    } else {
        oEl.zpDragLeft = oEl.offsetLeft;
        oEl.zpDragTop = oEl.offsetTop;
    }
    oEl.zpDragPrevLeft = oEl.zpDragLeft;
    oEl.zpDragPrevTop = oEl.zpDragTop;
    oEl.zpDragV = oArg.vertical;
    oEl.zpDragH = oArg.horizontal;
    oEl.zpDragLimTop = typeof oArg.limitTop == 'number'?oArg.limitTop:-Infinity;
    oEl.zpDragLimBot = typeof oArg.limitBottom == 'number'?oArg.limitBottom:Infinity;
    oEl.zpDragLimLft = typeof oArg.limitLeft == 'number'?oArg.limitLeft:-Infinity;
    oEl.zpDragLimRgh = typeof oArg.limitRight == 'number'?oArg.limitRight:Infinity;
    Zapatec.Drag.currentId = sId;
    Zapatec.Utils.addEvent(document, 'mousemove', Zapatec.Drag.move);
    Zapatec.Utils.addEvent(document, 'mouseup', Zapatec.Drag.end);
    return true;
};
Zapatec.Drag.move = function(oEv) {
    oEv || (oEv = window.event);
    if (!Zapatec.Drag.currentId) {
        return Zapatec.Utils.stopEvent(oEv);
    }
    var oEl = document.getElementById(Zapatec.Drag.currentId);
    if (!(oEl && oEl.zpDrag)) {
        return Zapatec.Utils.stopEvent(oEv);
    }
    var oPos = Zapatec.Utils.getMousePos(oEv);
    var oOffset = {id:Zapatec.Drag.currentId,startLeft:oEl.zpDragLeft,startTop:oEl.zpDragTop,prevLeft:oEl.zpDragPrevLeft,prevTop:oEl.zpDragPrevTop,left:0,top:0};
    if (!oEl.zpDragV) {
        var iLeft = oEl.zpDragLeft + oPos.pageX - oEl.zpDragPageX;
        if (oEl.zpDragLimLft <= iLeft && oEl.zpDragLimRgh >= iLeft) {
            oEl.style.right = '';
            oEl.style.left = iLeft + 'px';
            oOffset.left = iLeft;
            oEl.zpDragPrevLeft = iLeft;
        } else {
            oOffset.left = oOffset.prevLeft;
        }
    }
    if (!oEl.zpDragH) {
        var iTop = oEl.zpDragTop + oPos.pageY - oEl.zpDragPageY;
        if (oEl.zpDragLimTop <= iTop && oEl.zpDragLimBot >= iTop) {
            oEl.style.bottom = '';
            oEl.style.top = iTop + 'px';
            oOffset.top = iTop;
            oEl.zpDragPrevTop = iTop;
        } else {
            oOffset.top = oOffset.prevTop;
        }
    }
    Zapatec.EventDriven.fireEvent('dragMove', oOffset);
    return Zapatec.Utils.stopEvent(oEv);
};
Zapatec.Drag.end = function(oEv) {
    oEv || (oEv = window.event);
    if (!Zapatec.Drag.currentId) {
        return Zapatec.Utils.stopEvent(oEv);
    }
    var oEl = document.getElementById(Zapatec.Drag.currentId);
    if (!(oEl && oEl.zpDrag)) {
        return Zapatec.Utils.stopEvent(oEv);
    }
    Zapatec.Utils.removeEvent(document, 'mousemove', Zapatec.Drag.move);
    Zapatec.Utils.removeEvent(document, 'mouseup', Zapatec.Drag.end);
    var oOffset = {id:Zapatec.Drag.currentId,startLeft:oEl.zpDragLeft,startTop:oEl.zpDragTop,left:oEl.zpDragPrevLeft,top:oEl.zpDragPrevTop};
    Zapatec.Drag.currentId = null;
    oEl.zpDrag = null;
    oEl.zpDragPageX = null;
    oEl.zpDragPageY = null;
    oEl.zpDragLeft = null;
    oEl.zpDragTop = null;
    oEl.zpDragPrevLeft = null;
    oEl.zpDragPrevTop = null;
    oEl.zpDragV = null;
    oEl.zpDragH = null;
    oEl.zpDragLimTop = null;
    oEl.zpDragLimBot = null;
    oEl.zpDragLimLft = null;
    oEl.zpDragLimRgh = null;
    Zapatec.EventDriven.fireEvent('dragEnd', oOffset);
    return Zapatec.Utils.stopEvent(oEv);
};