/******************** Человеческий скрипт ********************/

var timer;

/////////////////////////////////////////////////////////////////////////////////////////////
//Все содержимое файла инкапсулируется в эту функцию, чтобы не засорять пространство имен  //
//и в случае ошибки функция просто незапустилась, а не вызвала каких-либо сообщений        //
/////////////////////////////////////////////////////////////////////////////////////////////

                        function autopopup_insertion() {



/*************************** Определение переменных ***************************/

var verticalOffset = 30;
var selector = "div.thumbnail a";

var thisFilePrefix;

var placement;
var my_caption;
var my_img;

var documentLoaded = false;

var illSmallCurrent = null;


/***************************  Определение функций   ***************************/

// Эта функция определяет путь к файлу с точки зрения подключающей нас html-странички
function guessFileAbsolutePrefix(prefix, base) {
        var ss = document.getElementsByTagName('script');
        for (i=0; i<ss.length; i++) {
                var name_re = new RegExp((prefix+'/'+base+'$').replace(/\/+/,'(?:/|/.)+'));
                //var base = name.match(/\/([^\/]*)$/)[1];
                var base_re = new RegExp(base+'$');
                if (ss[i].src.match(name_re)) {return ss[i].src.replace(base_re, '')};
        };
        return;
}


//Эта функция назначает обработчику событий документа onLoad указатель на ту функцию,
//которая была переданна в качестве аргумента.
//Пример вызова: addLoadHandler(function(){ documentLoaded = true; modifier(); });

function addLoadHandler(handler) {
        with (window) {
                if(window.addEventListener) {
                        window.addEventListener("load",handler,false);
                }
                else if(attachEvent) {
                        attachEvent("onload",handler);
                }
                else if(onload) {
                        var oldHandler = onload;
                        onload = function piggyback() {
                                oldHandler();
                                handler();
                        };
                }
                else {
                        onload = handler;
                }
        }
}


//Эта функция дописывает к документу код, неоходимый для работы скрипта:
//подключает таблицы стилей, дописывает теги div и table, ссылкам, заданного класса,
//назначает обработчик события onClick

function modifier() {
        if (!thisFilePrefix) {return}

        //Подключаем два css-файла
        var objHead = document.getElementsByTagName('head');
        var objCSS;

        objCSS = document.createElement('link');
        objCSS.href = thisFilePrefix+'style.css';
        objCSS.type = 'text/css';
        objCSS.rel = 'stylesheet';
        objHead[0].appendChild(objCSS);

        objCSS = document.createElement('link');
        objCSS.href = thisFilePrefix+'shadows/style.css';
        objCSS.type = 'text/css';
        objCSS.rel = 'stylesheet';
        objHead[0].appendChild(objCSS);

        //Дорисовываем необходимый код
        placement = document.createElement("div");
        placement.className = "ill-popup shadowed";
        document.getElementsByTagName('body')[0].appendChild(placement);
        placement.innerHTML =
                '<table class="ill" align="center">' +
                        '<tr><td id=td0l><table style="height: 100%"><tr><td id=td1l class="lt"><tr><td id=td100l class="l" style="height: 100%"></table>' +
                                '<td class="cont"><div>' +
                                        '<img id="my_img">' +
                                        '<img src="' + thisFilePrefix + 'ill-close.gif" alt="Закрыть" class="close" id="close">' +
                                        '<div id="my_caption" class="caption">123</div>' +
                                        '</div>' +
                                '<td id=td0r><table><tr><td id=td1r class="rt"><tr><td id=td100r class="r" style="height: 100%"></table>' +
                        '<tr><td class="lb"><td class="b"><td class="rb">' +
                '</table>';
        my_caption = document.getElementById('my_caption');
        my_img = document.getElementById('my_img');

        document.getElementById('close').onclick = (function(N) {return function() {closeIll(); return false}})();
        my_img.onresize = (function(N) {return function() {correctShadows(); return false}})();
        my_img.onload = (function(N) {return function() {correctShadows(); return false}})();

        //ссылкам заданного класса назначаем обработчик событий onClick
        var elements = getElementsBySelector(selector);
        if (elements.length > 0)
                for (var j=0;j<elements.length;j++)
                        elements[j].onclick = (function(N) {return function() {showIll(this); return false}})(this);
}


//Функция возвращает массив элементов с заданным селектором (классом).
//Эта функция очень гибкая, она может различать даже очень сложные селекторы.

function getElementsBySelector(selector)
{
        var tokens = selector.split(' ');
        var currentContext = new Array(document);
        for(var i=0;i<tokens.length;i++)
        {
                token = tokens[i];//.replace(/^\s+/,'').replace(/\s+$/,'');
                if(token.indexOf('#') > -1)
                {
                        var bits = token.split('#');
                        var tagName = bits[0];
                        var id = bits[1];
                        var element = document.getElementById(id);
                        if(tagName && element.nodeName.toLowerCase() != tagName)
                                return new Array();
                        currentContext = new Array(element);
                        continue;
                }

                if(token.indexOf('.') > -1)
                {
                        var bits = token.split('.');
                        var tagName = bits[0];
                        var className = bits[1];
                        if(!tagName)
                                tagName = '*';

                        var found = new Array;
                        var foundCount = 0;
                        for(var h=0;h<currentContext.length;h++)
                        {
                                var elements;
                                if(tagName == '*')
                                        elements = currentContext[h].all ? currentContext[h].all : currentContext[h].getElementsByTagName('*');
                                else
                                        elements = currentContext[h].getElementsByTagName(tagName);

                                for(var j=0;j<elements.length;j++)
                                        found[foundCount++] = elements[j];
                        }

                        currentContext = new Array;
                        var currentContextIndex = 0;
                        for(var k=0;k<found.length;k++)
                        {
                                if(found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b')))
                                        currentContext[currentContextIndex++] = found[k];
                        }

                        continue;
            }

                if(token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/))
                {
                        var tagName = RegExp.$1;
                        var attrName = RegExp.$2;
                        var attrOperator = RegExp.$3;
                        var attrValue = RegExp.$4;
                        if(!tagName)
                                tagName = '*';

                        var found = new Array;
                        var foundCount = 0;
                        for(var h=0;h<currentContext.length;h++)
                        {
                                var elements;
                        if(tagName == '*')
                                        elements = currentContext[h].all ? currentContext[h].all : currentContext[h].getElementsByTagName('*');
                                else
                                        elements = currentContext[h].getElementsByTagName(tagName);

                                for(var j=0;j<elements.length;j++)
                                        found[foundCount++] = elements[j];
                        }

                        currentContext = new Array;
                        var currentContextIndex = 0;
                        var checkFunction;
                        switch(attrOperator)
                        {
                                case '=':
                                        checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };
                                        break;
                                case '~':
                                        checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); };
                                        break;
                                case '|':
                                        checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };
                                        break;
                                case '^':
                                        checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };
                                        break;
                                case '$':
                                        checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };
                                        break;
                                case '*':
                                        checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };
                                        break;
                                default :
                                        checkFunction = function(e) { return e.getAttribute(attrName); };
                        }

                        currentContext = new Array;
                        var currentContextIndex = 0;
                        for(var k=0;k<found.length;k++)
                        {
                                if(checkFunction(found[k]))
                                        currentContext[currentContextIndex++] = found[k];
                        }

                        continue;
                }

                tagName = token;
                var found = new Array;
                var foundCount = 0;
                for(var h=0;h<currentContext.length;h++)
                {
                        var elements = currentContext[h].getElementsByTagName(tagName);
                        for(var j=0;j<elements.length; j++)
                                found[foundCount++] = elements[j];
                }

                currentContext = found;
        }

        return currentContext;
}


//Показывает иллюстрацию
function showIll(ill) {
        ill.className = 'ill_small_active';
        if(illSmallCurrent)illSmallCurrent.className = 'ill_small_normal';
        illSmallCurrent=ill;

        placement.style.display = 'none';
        my_img.src = ill.href;
        my_caption.innerHTML = (ill.title || ill.href).replace(/\n/gim,"<br />");
		
        placement.style.top = (ill.getElementsByTagName('img').length ? getPos(ill.getElementsByTagName('img')[0]).top : getPos(ill).top)+verticalOffset + 'px';
        placement.style.display = 'block';

        correctShadows();
        if (!timer) {timer=window.setInterval("correctShadows()", 1000)};
}


//Закрывает илюстрацию
function closeIll() {
        placement.style.display = 'none';
        window.clearInterval(timer); timer=false;
        my_img.src = "";
        illSmallCurrent.className = 'ill_small_normal';
}


// Пытаемся получить абсолютную позицию элемента
function getPos() {
        var scrOfX = 0;
        var scrOfY = 0;
        with (document) {
                if( typeof( window.pageYOffset ) == 'number' ) {
                        //Netscape compliant
                        scrOfY = window.pageYOffset;
                        scrOfX = window.pageXOffset;
                } else if( body && ( body.scrollLeft || body.scrollTop ) ) {
                        //DOM compliant
                        scrOfY = body.scrollTop;
                        scrOfX = body.scrollLeft;
                } else if( documentElement && ( documentElement.scrollLeft || documentElement.scrollTop ) ) {
                        //IE6 standards compliant mode
                        scrOfY = documentElement.scrollTop;
                        scrOfX = documentElement.scrollLeft;
                }
        }
        return {left: scrOfX, top: scrOfY};
}


/***************************    Начало действий     ***************************/

//Узнаем префикс этого файла с точки зрения подключающей страницы
thisFilePrefix = guessFileAbsolutePrefix('files/autopopup/', 'modify.js');

//Назначаем document.onLoad = modifier();
addLoadHandler(function(){ documentLoaded = true; modifier(); });




/////////////////////////////////////////////////////////////////////////////////////////////
// Это конец большой функции, в которую инкапсулированно все содержимое файла.             //
/////////////////////////////////////////////////////////////////////////////////////////////
                        }



//Функция корректировки тени либо после смены картинки, либо изменения ее размеров.
function correctShadows() {
        with (document) {
                var l     = getElementById('td100l');
                var lAndT = getElementById('td0l');
                var lT    = getElementById('td1l');
                var r     = getElementById('td100r');
                var rAndT = getElementById('td0r');
                var rT    = getElementById('td1r');
        }        
        l.style.height = lAndT.offsetHeight - lT.offsetHeight + 'px';
        r.style.height = rAndT.offsetHeight - rT.offsetHeight + 'px';
        // на всякий случай (konqueror, например): 
        if (timer && l.style.height != lAndT.offsetHeight - lT.offsetHeight + 'px') {clearInterval(timer); timer=false}
}



if(document.createElement && document.getElementsByTagName && !navigator.userAgent.match(/opera\/?6/i))
        autopopup_insertion();




