/**
 * attachHandler - функция, предназначенная для регистрации 
 * обработчиков событий. Если браузер не поддерживает методы 
 * регистрации, то скрипт просто не будет загружен.
 */

function attachHandler(aObj, aEvent, aFunc) { 
    aObj.attachEvent
    ? aObj.attachEvent(('on' + aEvent), aFunc)
    : (aObj.addEventListener
      ? aObj.addEventListener(aEvent, aFunc, false)
      : '');
}

/**
 * initList - функция инициализации списка.
 * Получает в качестве параметров id списка и тэг, который будет 
 * обрабатывать событие onclick для открытия дополнительных 
 * пунктов списка (в данном примере используются тэги <a>&<img>)
 *
 * Основная задача этой функции - "пробежаться" по всем пунктам 
 * списка и найти среди них те, в которые вложены дополнительные 
 * списки. В случае (условие if (list)), если у пункта есть 
 * вложенный список, на один из вложенных элементов (opener - 
 * тэги <a>&<img>) будет "повешен" обработчик события onclick 
 * (функция switchDisplay) при помощи функции attachHandler.
 */
 
function initList(aId, aTag) {
    var items = document.getElementById(aId)
                        .getElementsByTagName('li'),
        list, opener;
    for (var i = 0, l = items.length; i < l; i++) {
        list = items[i].getElementsByTagName('ul')[0];
        if (list) {
            opener = items[i].getElementsByTagName(aTag)[0];
            opener.list = list;
            attachHandler(opener, 'click', switchDisplay);
        }
    }
}

/**
 * switchDisplay - функция, вызываемая в момент наступления события 
 * onclick. В случае, если в качестве "открывашек" были выбраны 
 * изображения, эта функция укажет для них новый адрес (используются 
 * предварительно загруженные изображения). Основная задача - менять 
 * поочередно значение свойства display вложенного списка. Функция 
 * также осуществляет отмену действия, происходящего по умолчанию для 
 * события onclick - это имеет смысл в случае, если "открывашками" 
 * выбраны тэги <a>.
 */

function switchDisplay(aEvent) {
    var el = aEvent.target || aEvent.srcElement;
    el.list.style.display = (el.opened = !el.opened)
                            ? 'block'
                            : 'none';
    return (aEvent.preventDefault
           ? aEvent.preventDefault()
           : (aEvent.returnValue = false));
}