var popup_defaults;
function popup(opts) {
    var options = {};
    if (popup_defaults) {
        for (var key in popup_defaults)
            options[key] = popup_defaults[key];
    }
    if (opts) {
        for (var key in opts)
            options[key] = opts[key];
    }

    if (!options.url)
        return;

    var features = '';
    for (var key in options) {
        if (key == 'url' || key == 'name')
            continue;
        if (key == 'width' && options[key] > screen.width - 50)
            options[key] = screen.width - 50;
        else if (key == 'height' && options[key] > screen.height - 100)
            options[key] = screen.height - 100;
        features += (features ? ', ' : '') + key + '=' + options[key];
    }

    return window.open(options.url, options.name, features);
}

function registerEvent(obj, evt, handler) {
    if (!(obj && evt && handler))
        return;

    if (obj.addEventListener)
        obj.addEventListener(evt, handler, false);
    else if (obj.attachEvent)
        obj.attachEvent('on' + evt, handler);
}

function unregisterEvent(obj, evt, handler) {
    if (!(obj && evt && handler))
        return;

    if (obj.removeEventListener) {
        try { obj.removeEventListener(evt, handler, false); } catch (e) {};
    }
    else if (obj.detachEvent) {
        try { obj.detachEvent('on' + evt, handler); } catch (e) {};
    }
}

function stopPropagation(evt) {
    if (!evt)
        return;

    if (evt.stopPropagation)
        evt.stopPropagation();
    else
        evt.cancelBubble = true;
}

function cancelEvent(evt) {
    if (!evt)
        return;

    if (evt.preventDefault && evt.cancelable)
        evt.preventDefault();
    else
        evt.returnValue = false;
}
