// Опции и глобальные переменные

var xmlHttp = createXmlHttpRequestObject();                     // Объект для отсылки запросов скрипту (AJAX)
var scripturl = '/cgi-bin/get_issuers.cgi';  // имя скрипта
var lastcontent = '';                                           // содержимое поля ввода "Найти эмитента" (во время наступл. события)
var oCache = new Object();                                      // Кэш с ответами от скрипта (списки эмитентов по нач. буквам)
var arrayfromxml = new Array();                                // массив эмитентов, отображаемый в выпадающем списке
//arrayfromxml['name_enterprise_rus'] = new Array();              // -"-
//arrayfromxml['id_enterprise'] = new Array();                    // -"-
var StrSearch = '';                                             // содержимое поля ввода "Найти эмитента" (текущее)
var Queue = new Array();                                        // очередь событий
var QueueTerm = new Array();                                    // элемент очереди событий
var xmlhttpparam = '';                                          // параметр запроса серверу
var issuer_name = '';                                           // Имя текущего эмитента
var issuer_id = '';                                             // ID текущего эмитента
var manualScan = 0;                                             // Флаг ручного поиска
var timeoutId = -1;                                             // таймаут
var HttpHandler = '';                                           // обработчик ответа от сервера (хранит имя функции)
var arrayposition = -1;                                         // позиция в отображаемом списке эмитентов
var maxDisplay = 100;                                           // максимальная длина списка эмитентов
var SelectedValue = '';                                         // выделенная подстрока для поиска Э.
var Debug = false;                                              // отладочный флаг
var workingWithList = false;												 // признак того, что курсор над списком вариантов ( для решения проблем со скролом )
var clExecutor = new executor();                                // массив имен функций - обработчиков событий.
clExecutor.functions['printxml'] = printxml ;
var prevPos = 2;


//window.onload = function() { moveToTruePosition() }

// Функции

// Начальная инициализация
function init() {
    set_position();
    var oKeyword = document.getElementById("aae_qstr");
    oKeyword.setAttribute("autocomplete", "off");
    oKeyword.value = "";
    moveToTruePosition();
    var container = document.getElementById('companyname');
    // обработка курсора над списком, для того, чтоб он не скрывался при прокрутке
    container.onmouseover = function(){ oKeyword.focus(); workingWithList = true; };
	container.onmouseout = function(){ oKeyword.focus(); workingWithList = false; };
    //oKeyword.focus();
}

//функция высчитывает позицию элемента, с учётом offsetParent
function computePosition(objectToCompute) {
    var resultPosition = { x : 0, y : 0 };
    while(objectToCompute) {
        resultPosition.y += objectToCompute.offsetTop;
        objectToCompute = objectToCompute.offsetParent;
    }
    return resultPosition;
}

//находим форму инпута, под которой будем показывать текст, по id="aae_qstr" и сдвигаем наш весь блок так, чтобы он под ней показывался
function moveToTruePosition() {
    var objectWhereTo = document.getElementById('aae_qstr');
    //var divToMove = document.getElementById('movingDivWithList');
    var divToMove = document.getElementById('companyname');
    var realPosition = computePosition(objectWhereTo);
    realPosition.y += objectWhereTo.offsetHeight;
    //показываем див с календарём
	var IE='\v'=='v';
    divToMove.style.top = realPosition.y + ((IE) ? 0 : -1) + 'px';
}

// Выполнение функции-обработчика
function executor() {
    this.functions = new Object();
}
// Создаем объект XMLHttp (функция вызывается при объявлении переменной XMLHttp).
function createXmlHttpRequestObject()
{
    var xmlHttpLocal;
    try { 
        // Прообуем создать под Mozilla
        xmlHttpLocal = new XMLHttpRequest(); 
    }
    catch(e) {
        // Если не получается, перебираем версии для IE.
        var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
                                        "MSXML2.XMLHTTP.5.0",
                                        "MSXML2.XMLHTTP.4.0",
                                        "MSXML2.XMLHTTP.3.0",
                                        "MSXML2.XMLHTTP",
                                        "Microsoft.XMLHTTP");
        for (var i=0; i < XmlHttpVersions.length && !xmlHttp; i++)
        {
            try
            {
                xmlHttpLocal = new ActiveXObject(XmlHttpVersions[i]);
            }
            catch (e) {}
        }
    }
    if (!xmlHttpLocal) {
        alert("Error creating the XMLHttpRequest object.");
    }
    else {
        return xmlHttpLocal;
    }
}

// Обработка нажатия клавиши в поле "Найти эмитента"
function handleKeyUp(e)
{   
    if ( search_method != 1 && search_method != 2 ) {
        return false;
    }
    // шаманство из-за разных версий браузера.
    e = (e) ? e : window.event;
    target = (e.target) ? e.target : e.srcElement;
    if (target.nodeType == 3) {
        target = target.parentNode;
    }
    // определяем код нажатой кнопки
    code = (e.charCode) ? e.charCode :
                     ((e.keyCode) ? e.keyCode :
                     ((e.which) ? e.which : 0));
    if (e.type == "keyup") {
        // Если нажат "backspace", "delete" или просто символ
        if ( code == 8 || code == 32 || (code >= 46 && code <= 111) || code >= 124 ) {
            CheckChanges();
        }
        // Если нажат enter
        if(code == 13)
        {
            if(arrayposition >= 0)
            {
                (search_method == 1) ? 
                        helperApply( arrayfromxml[arrayposition]['id_enterprise'], arrayfromxml[arrayposition]['ticker'] ) :
                        helperApply( arrayfromxml[arrayposition]['id_enterprise'], arrayfromxml[arrayposition]['name_enterprise_rus'] );
            }
        }
    }
}

// Обработка нажатия стрелок в поле "Найти эмитента"
function handleKeyDown(e)
{
    if ( search_method != 1 && search_method != 2 ) {
        return false;
    }
    //  шаманство из-за разных версий браузера.
    e = (e) ? e : window.event;
    target = (e.target) ? e.target : e.srcElement;
    if (target.nodeType == 3) {
        target = target.parentNode;
    }
    // определяем код нажатой кнопки
    code = (e.charCode) ? e.charCode :
            ((e.keyCode) ? e.keyCode :
             ((e.which) ? e.which : 0));
    if (e.type == "keydown") {
        // вниз
        if(code == 40) { 
                positionDown();
        }
        // вверх
        if(code == 38) { 
                positionUp();
        }                       
    }
}

// Проверка изменений в поле "Найти эмитента"          
function CheckChanges() {
    // если что-то изменилось в этом поле
    if ( document.getElementById("aae_qstr").value != lastcontent ) {
        //document.getElementById("area").value = '';
        lastcontent = document.getElementById("aae_qstr").value;

        var regexp = /^\s*$/; 
        
        // убираем пробелы в начале строки
        if ( regexp.test(lastcontent) ) {
            document.getElementById("aae_qstr").value = '';
            lastcontent = '';
            var companyname = document.getElementById("companyname");
            companyname.innerHTML = '';
            companyname.style.display = 'none';
            //document.getElementById('movingDivWithList').style.display = 'none';
            return false;
        }
        // ставим задачу поиска эмитентов, начинающихся с подстроки
        var term = new Array( 'issuersearch', 'printxml', lastcontent);
        Queue.push( term );
        if ( timeoutId == -1 ) {
            timeoutId = setTimeout( "execQueue()", 50 );
        }
        
        if ( Debug ) {
            document.getElementById("counter").innerHTML = 'Queue: ' + Queue.length;
        }
    }
}

// выполнение заданий из очереди
function execQueue() {
    // Если есть очередь, ставим таймер повторно
    if ( Queue.length > 1 ) {
        timeoutId = setTimeout( "execQueue()", 100);
    }        
    else if ( Queue.length <= 1 ) {
        // иначе очищаем таймер
        clearTimeout(timeoutId);
        timeoutId = -1;
    }
    
    if ( Queue.length > 0 ) {
        // вытаскиваем задание
        QueueTerm = Queue.shift();
        if ( QueueTerm[0] == 'issuersearch' ) {
            // Если изменилась строчка в поле "Найти эмитента",
            // берем текущее значение этого поля
            StrSearch = document.getElementById("aae_qstr").value;
            QueueTerm[2] = StrSearch;
            var firstchar = QueueTerm[2].substr(0, 1).toLowerCase();
            manualScan = 1;
            if ( !oCache[firstchar] ) {
                // Если нет в кэше - создаем запрос с нужной буквой
                xmlhttpparam = 'text='+encodeURIComponent(firstchar);
                xmlhttpparam += '&method='+encodeURIComponent(search_method);
                //ajd.log(xmlhttpparam);
                xmlhttpStart(QueueTerm);                                                       
            }
            else {
                // Если есть в кэше - выводим список.
                printxml();
            }
            arrayposition = -1;
        } 
        if ( Debug ) {
                document.getElementById("counter").innerHTML = 'Queue: ' + Queue.length;
        }
    }
}

// Отправка запроса cgi-скрипту
function xmlhttpStart(term) {
    if ( xmlhttpparam != '' ) {
        if ( xmlHttp ) {
            try {
                //  Проверяем состояние объекта XmlHttp: "неинициализирован" (0) или "выполнен" (4)
                if ( xmlHttp.readyState == 4 || xmlHttp.readyState == 0 ) {
                    // Устанавливаем параметры запроса (метод GET, асинхронный)
                    xmlHttp.open( "GET", scripturl+"?"+xmlhttpparam, true );
                    // Добавляем обработик события смены состояния XmlHttp
                    xmlHttp.onreadystatechange = xmlHttpHandler;
                    HttpHandler = term[1];
                    // Чтобы не кэшировался GET запрос
                    xmlHttp.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
                    xmlHttp.send( null );
                    
                    // Если будет нужен POST запрос
                    //xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
                    // собственно запрос
                    //xmlHttp.send( xmlhttpparam );
                }
                else {
                    // Если XmlHttp занят выполнением другого запроса, ставим запрос снова в очередь.
                    Queue.push( term );
                    if ( timeoutId == -1 ) {
                            timeoutId = setTimeout( 'execQueue()', 50 );
                    }
                }
            }
            catch(e) {
                if ( Debug ) { 
                    alert("Error: "+e.toString()); 
                }
            }
        }
    }
}

// Обработчик смены состояния  XmlHttp.
function xmlHttpHandler() {
    // Если запрос выполнен
    if ( xmlHttp.readyState == 4 ) {
        // и выполнен успешно
        if ( xmlHttp.status == 200 ) {
            try {
                // выполняем соответствующую функцию по обработке результата 
                if ( HttpHandler ) {
                    clExecutor.functions[ HttpHandler ]();
                }
            }
            catch(e) {
                if ( Debug ) { 
                    alert( HttpHandler + " - error on use: " + e.toString()); 
                }
            }
        }
        else {
            if ( Debug ) { 
                alert("There was a problem retrieving the data:\n" + xmlHttpGetSuggestions.statusText); 
            }
        }
    }
    else {
        return false;
    }
}

// Рисуем табличку с результатами.
function printxml() {
    var companyname = document.getElementById('companyname');
    companyname.innerHTML = ' ';
    companyname.style.display = 'none';
    // обновляем массив
    updatearray();
    var maximum = maxDisplay;
    if (arrayfromxml.length < 1 ) return false;
    if ( maximum > arrayfromxml.length ) {
        maximum = arrayfromxml.length;
    }

    var helperTable = '<table class="innerTable" cellpadding="0" cellspacing="0"><tbody>';
    if ( search_method == 1) {
        for ( i = 0; i < maximum ; i++ ) {
            helperTable += '<tr id="id' + arrayfromxml[i]['ticker'] +'"'
                            + ' onmousedown="helperApply( ' + arrayfromxml[i]['id_enterprise'] + ', \''
                            + arrayfromxml[i]['ticker'].replace( /\"/g, '' ) + '\' );"'
                            + ' onmouseover="this.className=\'helperWork\';" onmouseout="this.className=\'helperFree\';">'
                            + '<td>' + arrayfromxml[i]['ticker'] + '</td><td>'
                            + arrayfromxml[i]['name_enterprise_rus'] + '</td></tr>';
        }
        helperTable += '</tbody></table>';
    }
    else if (search_method == 2) {
        for ( i = 0; i < maximum ; i++ ) {
            helperTable += '<tr id="id' + arrayfromxml[i]['id_enterprise'] +'"'
                            + ' onmousedown="helperApply( ' + arrayfromxml[i]['id_enterprise'] + ', \''
                            + arrayfromxml[i]['name_enterprise_rus'].replace( /\"/g, '' ) + '\' );"'
                            + ' onmouseover="this.className=\'helperWork\';" onmouseout="this.className=\'helperFree\';">'
                            + '<td>' + arrayfromxml[i]['name_enterprise_rus'] + '</td></tr>';
        }
    }
    
    helperTable += '</tbody></table>';
    companyname.innerHTML = helperTable;
    companyname.style.display = 'block';
}
// Преобразование полученных от сервера данных в массив
function xml2array( resultsXml ) {
    var resultsArray = new Array();
    for( i = 0; i < resultsXml.length; i++ ) {
        resultsArray[i]=resultsXml.item(i).firstChild.data;
    }
    return resultsArray;
}
// Обновление массива с эмитентами
function updatearray() {
    // Опустошаем массив.
    arrayfromxml = [];
    
    // Определяем первую букву запроса
    var firstchar = StrSearch.substr(0, 1).toLowerCase();
    // если нет в кэше...
    if ( !oCache[firstchar] ) {
        // ..берем инфу из запроса и запиываем в кэш
        oCache[firstchar]  = eval( xmlHttp.responseText );
    }
    var num = 0;
    var i = 0;
    var curlength = StrSearch.length;
    // записываем в массив все подходящие названия эмитентов из кэша
    while ( num <= maxDisplay && i < oCache[firstchar].length ) {
        if ( search_method == 1 && oCache[firstchar][i]['ticker'].substr(0, curlength).toLowerCase() == StrSearch.toLowerCase() ) {
            arrayfromxml[num] = oCache[firstchar][i];
            num++;
        }
        if ( search_method == 2 && oCache[firstchar][i]['name_enterprise_rus'].substr(0, curlength).toLowerCase() == StrSearch.toLowerCase() ) {
            arrayfromxml[num] = oCache[firstchar][i];
            num++;
        }
        i++;
    }
}

// Выбор конкретного эмитента из списка
function helperApply ( issuerid, issuername ) {
    document.getElementById("aae_qstr").value = issuername;
    document.getElementById("aae_qstr").text = issuername;
    document.getElementById('companyname').innerHTML = '';
    document.getElementById('companyname').style.display = 'none';
    //document.getElementById('movingDivWithList').style.display = 'none';
    //var id_100 = issuerid % 100;
    //window.location = "/fterm/emitent.shtml?" + id_100 + "/" + issuerid;
    window.location = "/ticker_search.shtml?cfg=base_emitent&query=" + issuername;
    return false;
}
// Передвижение вниз по выпадающему списку эмитентов
function positionDown() {
    if ( arrayposition >= maxDisplay || (arrayposition >= arrayfromxml.length - 1) ) return false;
    var tmp = arrayposition;
    arrayposition++;
    reflectposition( 'reflect', arrayposition );
    if ( tmp != -1 ) {
        reflectposition( 'hide', tmp );
    }
}
// передвижение вверх по выпадающему списку эмитентов
function positionUp() {
    if ( arrayposition <= 0 ) return false;
    var tmp = arrayposition;
    arrayposition--;
    reflectposition( 'reflect', arrayposition );
    if ( tmp <= maxDisplay ) {
        reflectposition( 'hide', tmp );
    }
}
// Отображение курсора над эмитентом в списке
function reflectposition( command, position ) {
    if ( command == 'hide' ) {
        var element = (search_method == 1) ? 
                                document.getElementById( 'id' + arrayfromxml[position]['ticker'] ) :
                                document.getElementById( 'id' + arrayfromxml[position]['id_enterprise'] );
        element.className = 'helperFree';
    }
    else if ( command == 'reflect' ) {
        var element = (search_method == 1) ? 
                                document.getElementById( 'id' + arrayfromxml[position]['ticker'] ) :
                                document.getElementById( 'id' + arrayfromxml[position]['id_enterprise'] );       
        element.className = 'helperWork';
        element.scrollIntoView(false);
    }
}

function match_str() {
    if ( ! document.getElementById("aae_qstr").value ) {
        alert("Задан пустой поисковый запрос");
        return false;
    }
    var regexp = /^[a-zA-Zа-яА-Я0-9\-\_\. ]+$/i;
    if ( ! regexp.test( document.getElementById("aae_qstr").value ) ) {
        alert("Неправильно заполнена поисковая строка.");
        return false;
    }
    var seForm = document.getElementById("searchEmitentForm");
    var seConf = document.getElementById("search_config");
    switch(search_method) {
        case 3:
            seForm.action = "/search.shtml";
            seConf.value = "quote";
            var elem = document.createElement("INPUT");
            elem.type='hidden';
            elem.name='cat';
            elem.value='news';
            seForm.appendChild(elem);
            break;
        case 4:
            seForm.action = "/mf/search.shtml";
            break;
    }
    seForm.submit();
}

function clear_block() {
	var container = document.getElementById('companyname');
	if( !workingWithList ){
		container.innerHTML = '';
		container.style.display = 'none';
	}
}

// переменная для включения выпадающего списка автозаполнения, в случае, если выбран поиск "по эмитенту"

var aPosition = new Array('pos_tickers', 'pos_emits', 'pos_news', 'pos_pifs');
var search_method = 2;

function set_position() {
    prevPos = GetCookie('search_field');
    if (prevPos) {
        search_method = prevPos;
        moveTo(aPosition[eval(search_method + "- 1")]);
    }
    else {
        search_method = 2;
    }
}

// функция сдвигает треугольник на нужную позицию
function moveTo(position) {
    for (pos in aPosition) {
        pos_div = document.getElementById(aPosition[pos]);
        if ( pos_div ) {
            if ( aPosition[ pos ] == position ) {
                pos_div.className = 'active';
                search_method = eval(pos + "+ 1");
                if ( search_method != prevPos) {
                    SetSessionCookie('search_field', search_method, '/');
                    prevPos = search_method;
                }
            }
            else {
                pos_div.className = '';
            }
        }
    }
}
