// ---[ state: ordering ]--- //
var INNER_ID = 'iid';
var BD = ';', DD = ',', AD = String.fromCharCode(9);

function A(key) {
    return MsgClass.get(key,'ordering');
}

// вызывает функцию обработчика события onChange, соответствующую элементу
function iOnChange( elem )
{
    elem = $(elem);
    if (!elem) return;

    // в зависимости от кликнутого элемента вызываем соответстующий ему обработчик
    switch (elem.id) {
//        case 'tFIO':
//            onChangeFIO(elem);
//        break;

        //case 'cbNotifyEmail':
        //case 'cbNotifyPhone':
            //onChangeNotify(elem);
        //break;

        case 'rOtherCity':
            onChangeOtherCity(elem);
        break;
   }
}
// ^^^ iOnChange



// заплатка к usableForms
function onChangeOtherCity( elem )
{
    // а ещё у нас там hidden инпут,содержащий id выбраного магазина
    // делаем так, чтоб он всегда был правильный
    var selectedShop = document.getElementById('selectedShop');
    if (selectedShop) {
        // определяем какой сити выбран
        var selectedCity = getRadioChecked(document.regionForm.elements);

        if (selectedCity) {
            // смотрим внутрь дива,соответствующего выбранному городу
            var shopId = '';
            var shopDiv = $('shopDivCity_'+selectedCity.value);
            if (shopDiv) { // если там чё есть, то пишем это в value, иначе обнуляем
                var inputs = shopDiv.getElementsByTagName('input');
                for (var i=0; i<inputs.length; i++) {
                    if (inputs[i].name == 'shopId') {
                        shopId = inputs[i].value;
                        break;
                    }
                }
            }
            selectedShop.value = shopId;
        }
    }
}
// ^^^ onChangeOtherCity






// обработка кнопки выбора магазина
// открывает новое окошко со списком магазинов выбраного города
function chooseShop()
{
    var checked = getRadioChecked( document.regionForm.elements );
    if (checked) {
        var url = '/-/a/order/shops/z/city/' + checked.value;

        var frameWidth=0,frameHeight=0;
        var frameLeft=0,frameTop=0;
        if (self.innerWidth) {
                    frameWidth = self.innerWidth;
                    frameHeight = self.innerHeight;
            } else if (document.documentElement && document.documentElement.clientWidth) {
                    frameWidth = document.documentElement.clientWidth;
                    frameHeight = document.documentElement.clientHeight;
            } else if (document.body) {
                    frameWidth = document.body.clientWidth;
                    frameHeight = document.body.clientHeight;
            }
            var width  = 400;
            var height = 400;
            var left = (frameWidth-width)/2;
            var top  = (frameHeight-height)/2;

        popitup(url,'choose_shop','width='+width+',height='+height+',left='+left+',top='+top+',resizable,scrollbars');
    }
}
// ^^^ chooseShop





// из массива инпутов создаёт форму с ними и субмитит по action
function submitForm( inputs, action )
{
    // 5. все инпуты переделываем в форму
    var form = document.createElement('form');

    form.action = action;
    form.method = 'post';
    for (var i=0; i<inputs.length; i++) {
        var input = document.createElement('input');
        input.type = 'hidden';
        input.name = inputs[i][0];
        input.value = inputs[i][1];
        form.appendChild(input);
    }
    document.body.appendChild(form);
    form.submit();
}
// ^^^ submitForm


// из массива filledForms генерит массив inputs с нужными полями и их значениями
function generateInputs( filledForms, formNames )
{
    // 1. из филледФормс выбераем формы блока1 и сразу в массив вида [ [name,val], [name,val], ...]
    var inputs = new Array();
    ['nameForm', 'notifyForm'].each( function(formName) {
        for (var i=0; i<filledForms[formName].length; i++) {
            var name = filledForms[formName][i][0];
            var value = filledForms[formName][i][1];
            // телефон и емайл должны содержать впереди цифорку 1 или 0,  взависимости от галочки
            if (name == 'notifyType_1' || name == 'notifyType_2') {
                value = (document.notifyForm['notify'+name.substr(name.length-1)+'Off'].checked ? '1':'0') + value;
            }
            inputs.push( [name, value] );
        }
    });


    // 2. из филледФормс выбераем остальыне формы и в массив блока2
    var block2 = new Array();
    for (var f=0; f<formNames.length; f++) {
        var formName = formNames[f];
        if ( ['nameForm','notifyForm', 'forRomaForm'].include(formName) ) continue;
        for (var i=0; i<filledForms[formName].length; i++) {
            block2[filledForms[formName][i][0]] = filledForms[formName][i][1];
        }
    }

    var block2str = '';
    block2str += 0 + DD;
    block2str += (block2.region || '') + DD;
    var address = selectiveEscape(block2.otherRegion||'', [DD,BD,AD]) + AD + selectiveEscape(block2.delivAddress||'', [DD,BD,AD]);
    block2str += address + DD;
    block2str += (block2.shop || '') + DD;
    block2str += (block2.delivType || '')+ DD;
    block2str += (block2.payment || '') + DD;
    block2str += 1 + BD;

    // 4. добавляем к массиву инпутов блок2стр
    inputs.push( ['block2', block2str] );

    // доп.инфа по желанию Ромы
    var addInfoStr = '';
    for (var i=0; i<document.forms.forRomaForm.length; i++) {
        var input = document.forms.forRomaForm[i];
        addInfoStr += input.value + ',' + (input.checked ? 'on':'off') + ';';
    }
    inputs.push( ['addInfo', addInfoStr] );
    return inputs;
}
// ^^^ generateInputs



// возвращает список незаполненных полей
function hasEmptyFields(fields)
{
    var errmsg = '';
    for (var i=0; i<fields.length; i++) {
        errmsg += fields[i].name + "\n";
    }
    return errmsg;
}
// ^^^ hasEmptyFields



// в строке str ескейпит символы из массива chars
function selectiveEscape( str, chars )
{
    var result = '';
    for (var s=0; s<str.length; s++) {
        if ($A(chars).include(str.charAt(s))) {
            result += encodeURIComponent(str.charAt(s));
        } else {
            result += str.charAt(s);
        }
    }
    return result;
}
// ^^^ selectiveEscape



// ---[ state: ordering/shops ]--- //

// обработка выбора магазина
function submitChooseShop(cityId, selectedShopId, elementId)
{
    elementId = elementId || 'selectedShop';
    if (!opener) return;

    // определяем выбраный магазин
    var selectedShop = document.getElementById('shop_'+selectedShopId);

    // записываем ид выбранного магазина
    opener.document.getElementById(elementId).value = selectedShopId;

    // теперь пробуем взять  див города и вписываем в него магазин (получится если это оформление заказа)
    var shopDiv = opener.document.getElementById('shopDivCity_'+cityId);

    if (shopDiv) {
        shopDiv.innerHTML = selectedShop.innerHTML;
        // нужно сделать чтоб контейнер отныне появлялся и при выборе города с cityId
        var shopsContainer = opener.document.getElementById('shopsContainer');
        // для этого добавляем радиобатон этого города в parentInput шоп контейнера
        var elems = opener.document.forms.regionForm.elements;
        var parentInput = null;
        // находим этот радиобатон
        for (var e=0; e<elems.length; e++) {
            if (elems[e].value != cityId) continue;
            parentInput = elems[e];
            break;
        }

        // смотрим, не добавлен ли он ещё
        for (var i=0; i<shopsContainer.parentInput.show.length; i++) {
            if (shopsContainer.parentInput.show[i] != parentInput) continue;
            parentInput = null;
            break;
        }
        if (parentInput) {

            shopsContainer.parentInput.show.push(parentInput);
            // вносим в ветку этого города shopsContainer (опять же, если его там ещё нет)
//!!был баг в IE на счёт соединения с сервером..
//            opener.iTree.show['c_'+cityId].push( [shopsContainer] );
            // вызываем пересчёт видимых-невидимых элементов
            var e = { target: parentInput };
            opener.showHideFields(e);

        }

    }
    else {
    // шопДив не нашли, значит мы вызвались из логина,чтоб изменить место
        // определяем название выбранного магазина
        var shopName = document.getElementById( 'shopName_'+selectedShopId );
        opener.document.getElementById('locationName').innerHTML = shopName.innerHTML.replace(/<\/?[^>]+>/gi, '');;
    }

    close();
}
// ^^^ submitChooseShop



// ---[ state: ordering/submit ]--- //

function blockCancel( block )
{
    var blockEdit = $(block+'edit');
    if (blockEdit.parentNode == $('editContainer')) return;
    var container = blockEdit.parentNode;
    $('editContainer').appendChild(blockEdit);

    if (AddingBlock.isAdding) {
        AddingBlock.container.removeChild(AddingBlock.clone);
        AddingBlock.off();
    } else {
        var blockElem = getElementByInnerId(container, block, 'div');
        Element.show(blockElem);
    }
    // снятие запрета на добавление блока
    if ($('addBlock2Button')) $('addBlock2Button').disabled = false;

    // обномляем цену доставки
    //
    recalcTotalPriceBySelectedBlock();
}
// ^^^ blockCancel



function blockEdit( elem, block )
{
    blockCancel( block );

    // снимаем галку с ДА ВСЁ ВЕРНО
    if ($('allRight')) {
        $('allRight').checked = false;
        canSubmit();
    }

    // запрет на добавление блока
    if ($('addBlock2Button')) $('addBlock2Button').disabled = true;

    var blockEdit = $(block+'edit');
    var container = findAncestorWithParent( elem, block+'container' );
    var blockElem = (container.getAttribute(INNER_ID) == block) ? container : getElementByInnerId(container, block, 'div');

    // прячем спаны и достаём формы
    Element.hide(blockElem);
    blockElem.parentNode.insertBefore(blockEdit, blockElem);

    // вносим данные из спанов в форму
    var forms = blockEdit.getElementsByTagName('form');
    for (var f=0; f<forms.length; f++) {
        var elems = Form.getElements(forms[f]);
        for (var i=0; i<elems.length; i++) {
            var elem = elems[i];
            var name = elem.name;
            var span = getElementByInnerId(blockElem, block + name, 'span');
            if (name && span) {
                var value = '';
                // исключение
                if (name == 'notify1Off' || name == 'notify2Off') {
                    if (span.style.display == 'none') {
                        if (getElementByInnerId(blockElem, block + 'notifyType_' + (name=='notify1Off'?'1':'2'), 'span').innerHTML.length > 0) {
                            value = 'on';
                        } else {
                            value = 'off';
                        }
                    } else {
                        value = 'off';
                    }
                } else {
                    value = span.innerHTML;
                }
                if (name == 'country') {
                    var opts = $('selectCountry').options;
                    for (var o=0; o < opts.length; o++) {
                        if (opts[o].value != value) continue;
                        $('selectCountry').selectedIndex = o;
                        break;
                    }
                    var helperBox = $('countryHelpers');
                    var helperInputs = helperBox.getElementsByTagName('input');
                    for (var hi=0; hi < helperInputs.length; hi++) {
                        if (helperInputs[hi].type == 'radio' && 
                            helperInputs[hi].name == 'countryType' && 
                            helperInputs[hi].value == getCountryTypeByCountryIndex(value)) {
                            helperInputs[hi].checked = true;
                            break;
                        }
                    }
                }
            
                if (name == 'shop') {
                    var subspan = getElementByInnerId(blockElem, block+name+'Value', 'span');
                    if (subspan) {
                        var cityId = getElementByInnerId(blockElem, block+'region', 'span').innerHTML;
                        var shopDiv = $('shopDivCity_'+cityId);
                        if (shopDiv) {
                            //shopDiv.innerHTML = subspan.innerHTML || '';
                            // нужно сделать чтоб контейнер отныне появлялся и при выборе города с cityId
                            var shopsContainer = $('shopsContainer');
                            // для этого добавляем радиобатон этого города в parentInput шоп контейнера
                            var elems = document.forms.regionForm.elements;
                            var parentInput = null;
                            // находим этот радиобатон
                            for (var e=0; e<elems.length; e++) {
                                if (elems[e].value != cityId) continue;
                                parentInput = elems[e];
                                break;
                            }

                            // смотрим, не добавлен ли он ещё
                            if (shopsContainer.parentInput && shopsContainer.parentInput.show) {
                                for (var i=0; i<shopsContainer.parentInput.show.length; i++) {
                                    if (shopsContainer.parentInput.show[i] != parentInput) continue;
                                    parentInput = null;
                                    break;
                                }
                            }
                            if (parentInput && shopsContainer.parentInput && shopsContainer.parentInput.show) {
                                shopsContainer.parentInput.show.push(parentInput);
                                // вносим в ветку этого города shopsContainer (опять же, если его там ещё нет)
                                //!!был баг в IE на счёт соединения с сервером..
                                //opener.iTree.show['c_'+cityId].push( [shopsContainer] );
                                // вызываем пересчёт видимых-невидимых элементов
                                //var e = { target: parentInput };
                                //opener.showHideFields(e);
                            }
                        }
                    }
                }

                if (typeof (value) == 'string' && value.length) {
                    if (elem.type.toLowerCase() == 'radio') {
                        elem.checked = (elem.value == value);
                    } else if (elem.type.toLowerCase() == 'checkbox') {
                        elem.checked = (value == 'on');
                    } else {
                        elem.value = span.innerHTML;
                    }
                }
            }
        }
    }

    // подготавливаем usableForms
    var inputs = getUsableInputs( blockEdit );
    for (var i=0; i<inputs.length; i++) {
        setChainState( SHO, iTree[SHO][inputs[i].getAttribute(SHO)], inputs[i].checked );
        setChainState( ENA, iTree[ENA][inputs[i].getAttribute(ENA)], inputs[i].checked );
    }
    showAttention();

    if (block == 'block2')
        selectCountry( $('countryHelperInput').value);
}
// ^^^ blockEdit



function blockSave( block, stayForms )
{
    var blockEdit = $(block+'edit');
    var container = blockEdit.parentNode;
    var blockElem = getElementByInnerId(container, block, 'div');
    // сохранять нечего
    if (blockElem == null) return true; 

    // снятие запрета на добавление блока
    if ($('addBlock2Button')) $('addBlock2Button').disabled = false;

    if (AddingBlock.isAdding) {
        // если добавляем второй элемент, то показываем "удалить" и радиобатоны
        if (AddingBlock.blocks.length == 1) {
            Element.show( getElementByInnerId(AddingBlock.blocks[0], AddingBlock.block+'radio', 'input') );
            Element.show( getElementByInnerId(AddingBlock.blocks[0], AddingBlock.block+'count', 'span') );
            Element.show( getElementByInnerId(AddingBlock.blocks[0], '_'+AddingBlock.block+'delete','span') );
        }
        Element.show( getElementByInnerId(AddingBlock.clone, AddingBlock.block+'radio', 'input') );
        Element.show( getElementByInnerId(AddingBlock.clone, AddingBlock.block+'count', 'span') );
        Element.show( getElementByInnerId(AddingBlock.clone, '_'+AddingBlock.block+'delete','span') );


        // радиобатону проставляем номер на 1 больше предыдущего и выделяем его
        var radio = getElementByInnerId(AddingBlock.clone,AddingBlock.block+'radio','input');
        radio.value++;
        radio.checked = true;

        // простовляем номер блока
        getElementByInnerId(AddingBlock.clone,AddingBlock.block+'count', 'span').innerHTML = '&nbsp;№&nbsp;' + (parseInt(radio.value) + 1);

        AddingBlock.off();
    }


    // заполненые формы
    var filledForms = new Array();
    // незаполненые, но обязательные для заполнения поля
    var requiredFields = new Array();

    var formNames  = null;
    var radioForms = null;

    if (block == 'block1') {
        formNames = [ 'nameForm', 'notifyForm', 'forRomaForm' ];
        radioForms = [];
    } else {
        formNames   = [ 'countryForm', 'regionForm', 'deliveryForm', 'delivAddressForm', 'shopsForm', 'paymentForm' ];
        radioForms  = [ 'regionForm', 'deliveryForm', 'paymentForm' ];
    }

    fillForms(formNames, radioForms, filledForms, requiredFields);

    var errmsg = '';
    if (errmsg = hasEmptyFields(requiredFields)) {
        alert( A('fill_all_fields') );
        requiredFields[0].focus();
        return false;
    }
    else {
        if (block=='block1') { // check email
            var email = document.forms.notifyForm.notifyType_2;
            if (email.value && !emailCheck(email.value)) {
                alert( A('wrong_email') );
                email.focus();
                return false;
            }
        }
        var forms = blockEdit.getElementsByTagName('form');
        for (var f=0; f<forms.length; f++) {
            var form = forms[f];

            if (form.name == 'regionForm' &&
                $('selectCountry').options[$('selectCountry').selectedIndex].value != 0) {
                    var regionSpan = getElementByInnerId(blockElem, block + 'region', 'span');
                    if (regionSpan) regionSpan.innerHTML = '';
                    regionSpan = getElementByInnerId(blockElem, block+ 'regionValue', 'span');
                    regionSpan.innerHTML = '';
                    continue;
            }

            var elems = $A(form.elements);
            if (elems.length) {
                var radio = elems.findAll( function(elem) {return elem.type=='radio'} );
                if (radio.length) {
                    radio = getRadioChecked(radio);
                    var notRadio = elems.findAll( function(elem) {return elem.type!='radio'} );
                    if (notRadio.length) {
                        if (radio) notRadio.push(radio);
                        elems = notRadio;
                    } else {
                        elems = [ radio ];
                    }
                }
            }
            if (elems[0] && elems[0].type == 'radio') {
                elems = [ getRadioChecked(elems) ];
            }

            var nickStr = -1;
            for (var i=0; i<elems.length; i++) {
                var elem = elems[i];
                var name  = elem.name;

                var span  = getElementByInnerId(blockElem, block + (name||''), 'span');
                if (name && span) {
                    var value = getValFromForms(filledForms, form.name, name);
                    if (typeof (value) == 'string' && value.length) {
                        // исключения
                        var subspan = getElementByInnerId(blockElem, block+name+'Value', 'span');
                        if (subspan) {
                            if (name == 'gender') {
                                subspan.innerHTML = (value=='1') ? 'Уважаемый ': (value=='2' ? 'Уважаемая ' : '');
                                if (nickStr == -1) nickStr = '';
                                nickStr += subspan.innerHTML;
                            }
                            //if ((name == 'region' && value!='0') || name == 'delivType' || name == 'payment') {
                            if (name == 'region' || name == 'delivType' || name == 'payment') {
                                subspan.innerHTML = elem.nextSibling.nodeValue || elem.nextSibling.innerHTML;
                            }
                            if (name == 'shop') {
                                var cityId = getElementByInnerId(blockElem, block+'region', 'span').innerHTML;
                                var selectedShopDiv = $('shopDivCity_'+cityId);
                                subspan.innerHTML = selectedShopDiv.innerHTML || '';
                            }
                            if (name == 'country') {
                                subspan.innerHTML = elem.nextSibling.nodeValue || elem.nextSibling.innerHTML;
                            }
                        }
                        if (name == 'nick') {
                            if (nickStr == -1) nickStr = '';
                            nickStr += value;
                        }

                        if (name == 'delivType') {
                            var shop = getElementByInnerId(blockElem, '_'+block+'shop', 'div');
                            var addr = getElementByInnerId(blockElem, '_'+block+'delivAddress', 'div');
                            shop.style.display = (value=='3') ? '':'none';
                            addr.style.display = (value!='3') ? '':'none';
                        }
                        if (name == 'notifyType_1' || name == 'notifyType_2') {
                            var element = getElementByInnerId(blockElem, block+'notify' + name.substr(name.length-1) + 'Exist', 'span');
                            Element.hide(element);
                        }
                        if (name == 'otherRegion') {
                            getElementByInnerId(blockElem, block + 'regionValue', 'span').innerHTML = value;
                        }
                        if (name == 'orderCond' || name == 'knowSelf') {
                            var element = getElementByInnerId(blockElem, block+name+'Exist', 'span');
                            element.style.display = elem.checked ? 'none':'';
                            span.innerHTML = elem.checked ? 'on' : 'off';
                        } else if (name == 'notify1Off' || name == 'notify2Off') {
                            span.style.display = (value == 'on') ? 'none' : '';
                        } else {
                            span.innerHTML = value;
                        }

                    } else if (elem.type.toLowerCase() == 'checkbox') {
                        if (name == 'notify1Off' || name == 'notify2Off') {
                            Element.show(span);
                        } else if (name == 'orderCond' || name == 'knowSelf') {
                            var element = getElementByInnerId(blockElem, block+name+'Exist', 'span');
                            Element.show(element);
                            span.innerHTML = 'off';
                        } else {
                            Element.hide(span);
                        }
                    } else {
                        if (name == 'notifyType_1' || name == 'notifyType_2') {
                            var element = getElementByInnerId(blockElem, block+'notify' + name.substr(name.length-1) + 'Exist', 'span');
                            Element.show(element);
                            element = getElementByInnerId(blockElem, block+'notify' + name.substr(name.length-1) + 'Off', 'span');
                            Element.hide(element);

                        }
                        if (name == 'nick') {
                            if (nickStr == -1) nickStr = '';
                        }


                        span.innerHTML = '';
                    }
                }
            }
            if (nickStr != -1) {
                var nickHide =  getElementByInnerId(blockElem, block+'nickHide', 'span');
                if (nickStr.length) {
                    Element.hide(nickHide);
                } else {
                    Element.show(nickHide);
                }
            }
        }

        // убераем формы в их контейнер и отображаем спаны
        if (!stayForms) {
            $('editContainer').appendChild(blockEdit);
            Element.show(blockElem);
        }

        recalcPrepay();
        return true;
    }

}
// ^^^ blockSave


var AddingBlock = {
    isAdding : false,
    container: null,
    blocks   : null,
    block    : '',
    clone    : null,

    on : function( container, blocks, block, clone) {
        this.isAdding = true;
        this.container = container;
        this.blocks = blocks;
        this.block = block;
        this.clone = clone;
        var btn = $('addBlock2Button');
        btn.blur();
        btn.disabled = true;

    },

    off : function() {
        this.isAdding = false;
        if ($('addBlock2Button')) $('addBlock2Button').disabled = false;
    }
}
// AddingBlock


function blockAdd( block )
{
    var container = $(block + 'container');

    var blocks = tool_getBlocks();

    // клонируем последний элемент
    var clone = blocks[blocks.length-1].cloneNode(true);
    container.appendChild( clone );
    Element.hide( getElementByInnerId(clone, block+'radio', 'input') );
    Element.hide( getElementByInnerId(clone, block+'count', 'span') );
    Element.hide( getElementByInnerId(clone, '_'+block+'delete','span') );


    blockEdit( clone, block );

    AddingBlock.on( container, blocks, block, clone );
}
// ^^^ blockAdd



function blockDelete( elem, block )
{
    if (!confirm(MsgClass.get( 'delete_block', 'ordering' ))) return;
    var container = $(block+'container');
    var tokill = findAncestorWithParent( elem, container );
    // был ли отмечен удаляемый блок?
    var wasChecked = getElementByInnerId(tokill, block+'radio', 'input').checked;
    container.removeChild(tokill);

    // если остался последний элемент, то убираем кнопку "удалить" и радиобатон
    var blocks = tool_getBlocks();
    if (blocks.length == 1 || (AddingBlock.isAdding && blocks.length == 2)) {
        Element.hide( getElementByInnerId(blocks[0], block+'radio', 'input') );
        Element.hide( getElementByInnerId(blocks[0], block+'count', 'span') );
        Element.hide( getElementByInnerId(blocks[0], '_'+block+'delete','span') );
    }
    // заново нумеруем блоки
    for (var b=0; b<blocks.length; b++) {
        getElementByInnerId(blocks[b], block+'radio', 'input').value = b;
        getElementByInnerId(blocks[b], block+'count', 'span').innerHTML = '&nbsp;№&nbsp;' + (b+1);
    }
    // если удалили выбранный блок, то отмечаем первый
    if (wasChecked) {
        getElementByInnerId(blocks[0], block+'radio', 'input').checked = true;
    }

    recalcTotalPriceBySelectedBlock();
}
// ^^^ blockDelete



function tool_getBlocks( container )
{
    if (!container) {
        container = $('block2container');
    }
    return $A(container.childNodes).findAll( function(child){return child.tagName.toLowerCase()=='div'} );
}
// ^^^ tool_getBlocks

/*
теперь она в лайтбоксе


function submitSignOrder()
{
    // проверка, введен ли логин и пароль
    var login = '', password = '';
    var saveData = $('saveData');
    if (saveData && saveData.checked) {
        login = $F('orderLogin');
        var pass1 = $F('orderPassword');
        var pass2 = $F('orderPasswordRepeat');

        if (login.length > 1) {
            if (pass1.length > 0) {
                if (pass1 != pass2) {
                    alert( A('check_password') );
                    return;
                }
                password = pass1;
            } else {
                alert( A('input_password') );
                $('orderPassword').focus();
                return;
            }
        } else {
            alert( A('input_login') );
            $('orderLogin').focus();
            return;
        }

        // пишем тип юзера для паши
        Cookie.set(COOKIE_UTYPE, 1);
    } else {
        if (parseInt(Cookie.get(COOKIE_UTYPE)) != 2) {
            Cookie.set(COOKIE_UTYPE, 0);
        }
    }


    var container1 = $('block1container');
    var container2 = $('block2container');
    var blocks = { block1 : [], block2 : [] };

    // первый блок
    var spans = container1.getElementsByTagName('span');
    for (var s=0; s<spans.length; s++) {
        if (!spans[s].getAttribute(INNER_ID) || spans[s].getAttribute(INNER_ID).indexOf('block1')!=0) continue;
        var span  = spans[s];
        var iid   = span.getAttribute(INNER_ID);
        var name  = iid.substr('block1'.length);
        if (name == 'notify1Off' || name == 'notify2Off' || name == 'orderCondExist' || name == 'knowSelfExist') {
            blocks.block1[name] = span.style.display != 'none';
        } else {
            blocks.block1[name] = span.innerHTML;
        }
    }
    // block1

    // вторые блоки
    var entries = tool_getBlocks(container2);
    for (var e=0; e<entries.length; e++) {
        var entry = entries[e];
        blocks.block2[e] = new Array();
        blocks.block2[e].selected = (entries.length==1) || getElementByInnerId(entry, 'block2radio', 'input').checked;
        spans = entry.getElementsByTagName('span');
        for (var s=0; s<spans.length; s++) {
            if (!spans[s].getAttribute(INNER_ID) || spans[s].getAttribute(INNER_ID).indexOf('block2')!=0) continue;
            var span  = spans[s];
            var iid   = span.getAttribute(INNER_ID);
            var name  = iid.substr('block2'.length);
            // исключение
            if (name == 'shop' && span.getElementsByTagName('input').length) {
                var tmp = span.getElementsByTagName('input');
                tmp = $A(tmp).find(function(i){return i.name=='shopId'});
                tmp = tmp.value;
                blocks.block2[e][name] = tmp;
            } else {
                blocks.block2[e][name] = span.innerHTML;
            }
        }
    }

    var block2str = '';

    // подготовка строки параметров для блока 2
    // pAddresses = <Address>;<Address>;...<Address>;
    // где Address = <pANum>,<pRegionID>,<pAddress>,<pCodes>,<pDelTypeID>,<pPayTypeID>,<pIsCurrent>,<pCountryCode>

    for (var b=0; b<blocks.block2.length; b++) {
        var block2 = blocks.block2[b];
        block2str += b + DD; // block num
        block2str += (block2.region || '') + DD;
        //var address = selectiveEscape(block2.otherRegion||'', [DD,BD,AD]) + AD + selectiveEscape(block2.delivAddress||'', [DD,BD,AD]);
        var address = selectiveEscape(block2.country||'', [DD,BD,AD]) + AD + selectiveEscape(block2.delivAddress||'', [DD,BD,AD]);
        block2str += address + DD;
        block2str += (block2.shop || '') + DD;
        block2str += block2.delivType + DD;
        block2str += block2.payment + DD;
        block2str += (block2.selected ? 1 : 0) + BD;
        block2str += block2.country || '';
    }


    var addInfoStr = '1,' + blocks.block1.knowSelf + ';2,' + blocks.block1.orderCond + ';';

    var inputs = new Array();

    inputs.push( ['block2', block2str] );
    inputs.push( ['addInfo', addInfoStr] );

    inputs.push( ['fio', blocks.block1.fio] );
    inputs.push( ['nick', blocks.block1.nick] );
    inputs.push( ['notifyType_1', (blocks.block1.notify1Off?'0':'1') + blocks.block1.notifyType_1] );
    inputs.push( ['notifyType_2', (blocks.block1.notify2Off?'0':'1') + blocks.block1.notifyType_2] );
    inputs.push( ['gender', blocks.block1.gender] );

    var bid = Cookie.get(COOKIE_BID) || ($('bid') ? $('bid').value : '');
    inputs.push( ['bid', bid] );
    Cookie.erase(COOKIE_BID);
    Cookie.erase(COOKIE_STR);
    
    if (login.length > 0) {
        inputs.push( ['login', login] );
        inputs.push( ['password', password] );
    }
    inputs.push( ['alias', $('userAlias').value] );

    var prepayElems = document.prepayForm.elements;
    for (var e=0; e<prepayElems.length; e++) {
        if (!prepayElems[e].checked) continue;
        inputs.push( [prepayElems[e].name, prepayElems[e].value] );
        break;
    }

    // передаём данные методом post
    //
    var form = document.createElement('form');
    form.action = '/-/a/order/submit';///z/debug/' + Math.round(Math.random()*100);
    form.method = 'post';
    for (var i=0; i<inputs.length; i++) {
        var input = document.createElement('input');
        input.type = 'hidden';
        input.name = inputs[i][0];
        input.value = inputs[i][1];
        form.appendChild(input);
    }

    // если заказ делается из магазина, то сохраняем в куках ид магазина
    // 
    var shopcode = document.getElementById('shop_code');
    if (shopcode) {
        Cookie.set('cookie_shop_code', shopcode.value);
    }

    document.body.appendChild(form);
    form.submit();
}
// ^^^ submitSignOrder
*/


// определяет какой тип предоплаты возможен в момент вызова
function recalcPrepay()
{
    // 1. определяем выделенный блок2, и в нём находим способ доставки и способ оплаты
    //    и инициализируем прочие всякие переменные
    //
    var blocks = tool_getBlocks();
    var selected = blocks.find( function(block){return getElementByInnerId(block, 'block2radio', 'input').checked} );
    var delivType = selected ? getElementByInnerId(selected, 'block2delivType', 'span').innerHTML : '';
    var payType = selected ? getElementByInnerId(selected, 'block2payment', 'span').innerHTML : '';
    var isCreditCardPayType = (payType*1 == 4);
    var deliveryRegion = selected ? getElementByInnerId(selected, 'block2region', 'span').innerHTML : '';
    var isMusInstrInBasket = document.getElementById('isMusicInstrumentsInBasket') && 
                            (document.getElementById('isMusicInstrumentsInBasket').value == 'true');
    var isShopDelivNotToMoscow = (delivType == 3) && (deliveryRegion != 125);
    var isMusInstrNotToMoscow = isMusInstrInBasket && isShopDelivNotToMoscow;

    // 2. пробегаем по инпутам и отключаем те, что не подходят для этого способа доставки
    //
    var elems = document.prepayForm.elements;
    var elem2select = null;
    for (var e=0; e<elems.length; e++) {
        // открываем способы предоплаты соответствующие способу доставки
        // при оплате кредиткой возможна только 100% предоплата
        // при доставке музинструментов не в москву запрещена нулевая предоплата
        //
        var delivTypes = elems[e].getAttribute('rel') ? elems[e].getAttribute('rel').split(',') : [];
        // открываем способы предоплаты соответствующие способу доставки
        var isDelivTypeSupporting = (delivTypes.length == 0) || delivTypes.include(delivType);
    
    // включаем, если поддерживается такой тип доставки, 
    // если это доставка муз инструментов в другой город и не 0%
    // если это оплата кредиткой и 100%
        if (isDelivTypeSupporting && 
                !(elems[e].value ==   0 && isMusInstrNotToMoscow) &&
                !(elems[e].value != 100 && isCreditCardPayType)
            ) {
            elems[e].disabled = '';
            elems[e].parentNode.disabled = '';
            Element.removeClassName( elems[e].parentNode, 'disable' );
            if (!elem2select) { // если только один вариант, то он будет checked
                elem2select = elems[e];
            } else { // если есть несколько вариантов,то юзер сам решит
                elem2select = -1;
            }
        } else {
            elems[e].disabled = 'true';
            elems[e].parentNode.disabled = 'true';
            Element.addClassName( elems[e].parentNode, 'disable' );
        }
    }


    // 3. если в результате остался только один инпут, то он чекед.

    if (elem2select && elem2select != -1) {
        elem2select.checked = true;
    }

    canSubmit();

    // отключаем предоплату, если не выбрано ДА ВСЁ ВЕРНО!
    //
    if ($('allRight') && $('allRight').checked == false) {
        var elems = document.prepayForm.elements;
        for (var e=0; e<elems.length; e++) {
            elems[e].disabled = 'true';
            elems[e].parentNode.disabled = 'true';
            Element.addClassName( elems[e].parentNode, 'disable' );
        }
    }
}
// ^^^ recalcPrepay



// смотрит, выбран ли вариант предоплаты. если да,то отлочивает субмит-кнопку
function canSubmit()
{
    var can = false;
    var elems = document.prepayForm.elements;
    for (var e=0; e<elems.length; e++) {
        if (!elems[e].checked) continue;
        can = true;
        break;
    }

    var allRight = $('allRight');
    if (allRight) {
        can = can && allRight.checked;
    }
    $('submitButton').disabled = !can;
}
// ^^^ canSubmit


function findAncestorWithParent( elem, parent )
{
    parent = $(parent);
    if (elem.parentNode.id == parent.id)
        return elem;
    else if (elem.parentNode.tagName.toLowerCase() == 'body')
        return null;
    else
        return findAncestorWithParent( elem.parentNode, parent );
}
// ^^^ findAncestorWithParent



function getElementByInnerId( root, iid, tag )
{
    if (!root) return null;
    var elems = root.getElementsByTagName(tag);
    for (var e=0; e<elems.length; e++) {
        if (elems[e].getAttribute(INNER_ID) == iid)
            return elems[e];
    }
    return null;
}
// ^^^ getElementByInnerId



function getValFromForms(filledForms, formName, name)
{
    if (filledForms[formName]) {
        for (var f=0; f<filledForms[formName].length; f++) {
            if (filledForms[formName][f][0] == name) {
                return filledForms[formName][f][1];
            }
        }
    }
    return null;
}
// getValFromForms


function fillForms( formNames, radioForms, filledForms, requiredFields )
{
    // пробегаем по всем формам
    for (var f=0; f<formNames.length; f++) {
        var formName = formNames[f];
        var form = document.forms[formName];
        var elems = Form.getElements(form);
        var filledElements = new Array();

        // пробегаем элементы формы и заносим их в filledElements либо в requiredFields
        var notify1Off = 'off';
        var notify2Off = 'off';
        for (var i=0; i<elems.length; i++) {
            var elem = elems[i];
            var name = elem.name;
            if (name) {
                var value = Form.Element.getValue(elem);
                if (value) {
                    filledElements.push([name,value]);
                } else {
                    if ( (elem.getAttribute('required') == 'true') ||
                         (notify1Off == 'on' && name == 'notifyType_1') || (notify2Off == 'on' && name == 'notifyType_2') )
                    {
                        requiredFields.push( elem );
                    }
                }
                
                // проверка пустого емайла и телефона, при включённой галочке
                if ( (name == 'notify1Off' && value == 'on') ) {
                    notify1Off = 'on';
                }
                if ( (name == 'notify2Off' && value == 'on') ) {
                    notify2Off = 'on';
                }
            }
        }
        // если во всей форме нет заполненых элементов то что-то не так
        if (filledElements.length == 0) {
            // если это форма с радиобатонами, указываем первый невыключеный её радиобатон как required
            if (radioForms.find(function(fname){return fname==formName;})) {
                for (var e=0; e<elems.length; e++) {
                    if (elems[e].disabled) continue;
                    requiredFields.push(elems[e]);
                    break;
                }
            }

            // исключения:
            // - если выбрана доставка в магазин, а магазин не выбран, то это плохо
            if (formName == 'shopsForm' && filledForms.deliveryForm && filledForms.deliveryForm[0] && filledForms.deliveryForm[0][1] == 3) {
                requiredFields.push($('chooseShopBtn'));
            }
            // - если выбран "другой город", а сам этот город не вписан, то ругаемся
            if (formName == 'otherRegionForm' && filledForms.regionForm && filledForms.regionForm[0] && filledForms.regionForm[0][1] == 0) {
                requiredFields.push(elems[0]);
            }
            // - если выбран способ доставки,требующий адреса, и не выбран "другой город", а адрес не указан, то ай-ай-ай
            if (formName == 'delivAddressForm' && filledForms.deliveryForm && filledForms.deliveryForm[0] && [1,2,4].include(filledForms.deliveryForm[0][1]) ) {
                requiredFields.push(elems[0]);
            }
            // - если выбрана другая страна, а какая именно - не указано, то ругаемся
            
        } else {
            // - если доставка в магазин не выбрана, то обнуляем переменную selectedShop
            if (formName == 'shopsForm' && filledForms.deliveryForm && filledForms.deliveryForm[0] && filledForms.deliveryForm[0][1] != 3) {
                filledElements[0][1] = '';
            }
        }
        
        filledForms[formName] = filledElements;
    }
}
// fillForms



// какая-то замута...
// надо открывать див, если отключено какое-то из уведомлений
function showAttention()
{
    if (document.notifyForm && document.notifyForm.notify1Off && document.notifyForm.notify2Off) { 
        var phoneOff = !document.notifyForm.notify1Off.checked;
        var emailOff = !document.notifyForm.notify2Off.checked;
        document.getElementById('phoneOff').style.display =  ( phoneOff &&!emailOff ? '' : 'none' );
        document.getElementById('emailOff').style.display =  (!phoneOff && emailOff ? '' : 'none' );
        document.getElementById('bothOff').style.display =   ( phoneOff && emailOff ? '' : 'none' );
    }
}
// ^^^ showAttention


// включает режим редактирования обоих блоков (симулирует нажатие кнопки "изменить")
function editBlocks(firstTime, onlyFirstBlock)
{
    var block1container = $('block1container');
    var block1editButton = getElementByInnerId(block1container, 'block1editButton', 'a');
    
    var block2container = $('block2container');
    var block2editButton = getElementByInnerId(block2container, 'block2editButton', 'a');

    blockEdit(block1editButton, 'block1');
    if (!onlyFirstBlock)
        blockEdit(block2editButton, 'block2');


    // ставит чекбоксы в уведомлении по телефону и по емайлу.
    //
    if (firstTime) {
        var form = document.forms['notifyForm'];
        var elems = Form.getElements(form);
        for (var e=0; e < elems.length; e++) {
            if (elems[e].name == 'notify1Off' || elems[e].name == 'notify2Off') 
                elems[e].checked = true;
        }
        // загружаем в фоне главную страницу
        //
        if (OrderBodyDiv == '') {
            var url = '/index-order/a/-/index';
            var myAjax = new Ajax.Request( url, { method: 'get', parameters:{}, onComplete: function() {
                OrderBodyDiv = myAjax.transport.responseText;
            }}); 
        }
        
        // для хрома - переносим фокус на инпут с фио
        //
        var fio = $('tFIO');
        if (fio && fio.focus) 
            fio.focus();
        
        showAttention();
    }
    // firstTime

}
// editBlocks

// переменная, в которой хранится содержимое главной страницы, для быстрого на неё возвращения после заказа
//
var OrderBodyDiv = '';
// переменная, в которую пропишется заголовок главной страницы, когда он будет доступен. Для использования его,когда будет закончено оформление заказа.
//
var MainPageTitle = '';

function checkAllRight(input, isUserOld, editOnlyFirstBlock)
{
    if (isUserOld) {
        canSubmit();
        recalcPrepay();
        return true;
    }

    var res = true;
    var stayForms = isUserOld ? false : true;
    if (input.checked) {
        res = blockSave('block1', stayForms) && blockSave('block2', stayForms);
    } else {
        editBlocks(false, editOnlyFirstBlock);
    }

    if (res == false || input.checked == false) {
        // отключаем предоплату
        //
        var elems = document.prepayForm.elements;
        for (var e=0; e<elems.length; e++) {
            elems[e].disabled = 'true';
            elems[e].parentNode.disabled = 'true';
            Element.addClassName( elems[e].parentNode, 'disable' );
        }
        $('submitButton').disabled = true;
    }

    return res;
}
// checkAllRight


function getCountryTypeByCountryIndex(index)
{
    var countryType;
    switch (index) {
        case 0: case '0': // russia
            countryType = 0;
        break; 
        case -1: case '-1': // other
            countryType = 2;
        break; 
        default: // some
            countryType = 1;
    }
    return countryType;
}
// getCountryTypeByCountryIndex



// отрабатывает при выборе какой-либо страны
// определяет тип выбранной страны и выбирает среди хелперов соответствующий радиобатон
// вносит инфу о выбранной стране в хелпер инпут
// вызывает перерисовку юзайбл формс
// обновляет цены
//
function selectCountry(index)
{
    // всего три варианта выбранной страны: россия, какая-либо ещё из списка, другая
    //
    var countryType = getCountryTypeByCountryIndex(index);

    // выбираем соответствующий выбранной стране радиобатон, 
    // и вызываем перерисовку юзайбл форм
    //
    var helperBox = $('countryHelpers');
    var inputs = helperBox.getElementsByTagName('input');
    for (var i=0; i < inputs.length; i++) {
        if (inputs[i].value == countryType) {
            if (!inputs[i].checked) {
                inputs[i].checked = true;
        
                var fakeE = {
                    target: inputs[i]
                };
                showHideFields(fakeE);
            }
            break;
        }
    }

    // вносим инфу о выбранной стране в хелпер инпут
    //
    $('countryHelperInput').value = index;
    $('countryHelperSpan').innerHTML = $('selectCountry').options[$('selectCountry').selectedIndex].innerHTML;

    // загружает цены доставки в какую-либо страну
    //
    loadDeliveryPrices(index);
}
// selectCountry


// загружает цены доставки в какую-либо страну
//
function loadDeliveryPrices(countryIndex)
{
    var bid = $('bid') ? $('bid').value : '';
    if (bid == '') return;

    // /order/price-basket-delivery/z/bid/031709032443.340/cid/0
    var url = '/order/price-basket-delivery/z/bid/' + bid + '/cid/' + countryIndex;

    new Ajax.Request(url,
    {
        method:'get',
        onSuccess: function(transport) {
            var dom = transport.responseXML;
            // заполняем стоимости доставки для разных почт
            //
            var companies = dom.getElementsByTagName('company');
            for (var c=0; c<companies.length; c++) {
                var company = companies[c];
                var delivSpan = $('deliveryPrice_' + company.getAttribute('id'));
                if (delivSpan) {
                    var price = company.getElementsByTagName('price')[0];
                    delivSpan.innerHTML = price.getAttribute('delivery');
                }
            }
            
            // пересчитываем итоговую стоимость заказа
            //
            recalcTotalPrice(dom.documentElement.getAttribute('basket'));
        },
        onFailure: function() {
            alert('cant update prices');
        }
    });
}
// loadDeliveryPrices


// пересчитывает итогую сумму заказа, исходя из выбранного способа доставки
//
function recalcTotalPrice(totalPriceBasket, delivPrice)
{
    if (!totalPriceBasket)
        totalPriceBasket = $('totalPriceBasket').innerHTML * 1;
    else 
        $('totalPriceBasket').innerHTML = totalPriceBasket;

    if (typeof delivPrice === 'undefined') {
        var selectedDeliveryType = getRadioChecked(document.deliveryForm.elements);
        if (selectedDeliveryType) {
            var delivType = selectedDeliveryType.value;
            var totalPriceDelivery = $('deliveryPrice_' + delivType).innerHTML;
            var totalPriceOrder = totalPriceBasket * 1 + totalPriceDelivery * 1;
            $('totalPriceDelivery').innerHTML = totalPriceDelivery;
            $('totalPriceOrder').innerHTML = totalPriceOrder;
        }
    } else {
        $('totalPriceDelivery').innerHTML = delivPrice;
        $('totalPriceOrder').innerHTML = totalPriceBasket * 1 + delivPrice * 1;;
    }
}
// recalcTotalPrice


function recalcTotalPriceBySelectedBlock()
{
    // получаем выбранный блок
    //
    var container2 = $('block2container');
    var entries = tool_getBlocks(container2);
    var selectedBlock = null;
    for (var e=0; e<entries.length; e++) {
        var entry = entries[e];
        if ((entries.length==1) || getElementByInnerId(entry, 'block2radio', 'input').checked) {
            selectedBlock = entry;
            break;
        }
    }

    var bid = $('bid') ? $('bid').value : '';
    if (bid == '' || selectedBlock == null) return;

    // получаем код страны в выбранном блоке
    //
    var countryIndex = getElementByInnerId(selectedBlock, 'block2country', 'span').innerHTML;

    // определяем способ доставки в выбранном блоке
    //
    var delivType = getElementByInnerId(selectedBlock, 'block2delivType', 'span').innerHTML;

    // запрашиваем цены для доставки в указанную страну
    //
    // /order/price-basket-delivery/z/bid/031709032443.340/cid/0
    var url = '/order/price-basket-delivery/z/bid/' + bid + '/cid/' + countryIndex;
    var delivPrice = 0;
    new Ajax.Request(url,
    {
        method:'get',
        onSuccess: function(transport) {
            var dom = transport.responseXML;
            // заполняем стоимости доставки для разных почт
            //
            var companies = dom.getElementsByTagName('company');
            for (var c=0; c<companies.length; c++) {
                if (companies[c].getAttribute('id') != delivType) continue;
                var company = companies[c];
                var price = company.getElementsByTagName('price')[0];
                delivPrice = price.getAttribute('delivery');
                break;
            }
            
            // пересчитываем итоговую стоимость заказа
            //
            recalcTotalPrice(dom.documentElement.getAttribute('basket'), delivPrice);
        },
        onFailure: function() {
            alert('cant update prices');
        }
    });

}
// recalcTotalPriceBySelectedBlock

// копирует таблицу с инфой о заказе в новое окошко
//
function printOrder()
{
    var container = document.getElementById('printContainer');
    if (!container) return;

    var printWindow = window.open('', 'print', '');

    var tmp = printWindow.document;
    if (tmp.body.innerHTML == '') {
        tmp.write('<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body>');
        tmp.write(container.innerHTML);
        tmp.write('</body></html>');
    }
    printWindow.focus && printWindow.focus();
}
// printOrder


var retryTimer = null;
var oneSecondTimer = null;
function resendOrderInfo()
{
    var delay = 10;
    var shopCode = document.getElementById('retry_shop_code').value;
    var orderName = document.getElementById('retry_order_name').value;
    var bid = document.getElementById('retry_bid').value;

    document.getElementById('order_packet_send_error_message').style.display = 'none';
    document.getElementById('order_packet_send_trying').style.display = 'block';

    // ajax send order info
    var xmlhttp = createXMLHttp();
    var url = "/elias/orderserver/resend_order_packet.php?shop_code=" + shopCode + "&order_name=" + orderName + "&bid=" + bid;
    url += '&random=' + Math.random();
    xmlhttp.open("GET",url,true);
    xmlhttp.onreadystatechange = function() {
        if(xmlhttp.readyState == 4) {
            if(xmlhttp.status == 200) {
                if(xmlhttp.responseText == 0) {
                    // success sending
                    //
                    clearTimeout(retryTimer);
                    clearTimeout(oneSecondTimer);

                    document.getElementById('order_packet_send_error').style.display = 'none';
                    document.getElementById('order_packet_send_successful').style.display = 'block';
                } else {
                    // still error while sending
                    //
                    document.getElementById('order_packet_send_error_message').style.display = 'block';
                    document.getElementById('order_packet_send_trying').style.display = 'none';
                    document.getElementById('order_packet_send_debug_message').innerHTML = xmlhttp.responseText;
                
                    // set timeout
                    if (retryTimer != null) {
                        clearTimeout(retryTimer);
                    }
                    retryTimer = setTimeout( resendOrderInfo, delay * 1000 );
                
                    // update timers
                    document.getElementById('timeToRetry').innerHTML = delay;
                    if (oneSecondTimer == null) {
                        oneSecondTimer = setInterval( function() {
                            var left = document.getElementById('timeToRetry').innerHTML;
                            document.getElementById('timeToRetry').innerHTML = Math.max(0, left - 1);
                        }, 1000);
                    }
                }
            }
        }
    };

    xmlhttp.send(null);
}
// resendOrderInfo



function createXMLHttp() {
    if(typeof XMLHttpRequest != "undefined") {
        return new XMLHttpRequest();
    } else if(window.ActiveXObject) {
        var aVersions = ["MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0",
                        "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp",
                        "Microsoft.XMLHttp"
        ];
        for (var i = 0; i < aVersions.length; i++) {
            try {
                var oXmlHttp = new ActiveXObject(aVersions[i]);
                //alert(aVersions[i]);
                return oXmlHttp;
            } catch (oError) {
            }
        }
        throw new Error("Невозможно создать объект XMLHttp.");
    }
}
