if(!Nobirds) {
    var Nobirds = {};
}

Nobirds.Windows = {};

//
// Класс репозитория окон
//
Nobirds.Windows.Repository = function() {
    // nothing
}

// зарегистрированные окна
Nobirds.Windows.Repository.prototype.registered = new Array();

//
// зарегистрировать элемент как окно
//
Nobirds.Windows.Repository.prototype.register = function(element) {
    var e = Nobirds.Utils.getElement(element);
    if(e != null && !this.isRegistred(e)) {
        this.registered.push(e);
    }
}

//
// возвращает зарегистрирован ли элемент в репозитории
//
Nobirds.Windows.Repository.prototype.isRegistred = function(element) {
    for(var i = 0; i < this.registered.length; i++) {
        if(element.id == this.registered[i].id) {
            return true;
        }
    }

    return false;
}

//
// метод поиска в глобальном репозитории окна по одному из его вложенных элементов
//
Nobirds.Windows.Repository.prototype.findBySubElement = function(element) {
    if(element == null) {
        return null;
    }

    if(this.isRegistred(element)) {
        return element;
    }

    if (element.parentNode != null) {
        return this.findBySubElement(element.parentNode);
    }

    return null;
}

//
// скрывает все зарегистрированные элементы исключая перданный, если он определен
//
Nobirds.Windows.Repository.prototype.hide = function(excludeElement) {
    var windowsElement = this.findBySubElement(excludeElement);
    for(var i = 0; i < this.registered.length; i++) {
        var element = this.registered[i];
        if(windowsElement == null || (element.id != windowsElement.id)) {
            element.style.display = "none";
        }
    }
}

Nobirds.Windows.MainRepository = new Nobirds.Windows.Repository();

Nobirds.Windows.onClickEvent = function(e) {
    if (!e) e = window.event;

    var element = e.srcElement ? e.srcElement : e.target;
    Nobirds.Windows.MainRepository.hide(element);
}

if(!Nobirds.Utils) {
    Nobirds.Utils = {};
}

Nobirds.Utils.addEventListener = function( object, type, handler ) {
    if ( object.attachEvent ) {
        object['e'+type+handler] = handler;
        object[type + handler] = function(e){if (!e) e = window.event; object['e'+type+handler]( e );}
        object.attachEvent( 'on'+type, object[type+handler] );
    } else {
        object.addEventListener( type, handler, false );
    }
}

Nobirds.Utils.removeEventListener = function( object, type, handler ) {
    if ( object.detachEvent ) {
        object.detachEvent( 'on'+type, object[ type + handler ] );
        object[ type + handler ] = null;
        object['e' + type + handler] = null;
    } else {
        object.removeEventListener( type, handler, false );
    }
}

Nobirds.Utils.getElement = function(element) {
    if(typeof element == "string") {
        return document.getElementById(element);
    } else {
        return element;
    }
}

Nobirds.Utils.addEventListener(document, "click", Nobirds.Windows.onClickEvent);