/**
 * поддержка аплоада
 *
 */

/******************************************************************************/
var tmp = new Image; tmp.src=SKIN_STATIC_URL+"/img/upload_progress_bar.gif";

var submiting_sessions = new Array();           // в этом массиве лежат все 
                                                //…запущенные сессии (аплоды 
                                                //…файлов)
/******************************************************************************/
/**
 * Метод дёргается при выборе файла в поле ввода. Честно говоря не знаю для чего
 * он может пригодиться.
 */
function FileSelected(input_element){}
/******************************************************************************/
/**
 * Функция вызовется при сабмите хотя бы одной формы на странице, сменит
 * отображение всех форм. Активизирует отправку форм в таргеты и назначит
 * обработчики для определения того, что фрейм загрузился.
 */
function SubmitOneOfForms(form)
{
    form = $(form);                                     // оборачиваем форму
    holder = $(form.parentNode);                        // держатель формы
    form_holder = $(form.parentNode);                   // тоже держатель формы

    selected = false;
    
    forms = $A(holder.getElementsByTagName('form'));    // все формы
    forms.each(function (form){
            form = $(form);
            file = form.getInputs('file')[0]
            if(! file  ) return;
            if(file.getValue().length > 1){ selected = true; }
        }
    );

    if(!selected) { return; }
    
    forms.each(                                         // обрабатываем все формы
        function(form) 
        {
            form=$(form);                                   // оборачиваем форму

            try{
                /* Прячем сабмит */
                submit = form.getInputs('submit')[0];       // сабмит в форме
                submit_div = $(submit.parentNode);          // див держатель сабмита
                submit_div.hide();                          // прячем див сабмита
            }catch(e){}                                     // нету сабмита, ну и х сним

            try{
                /* Выбран ли файл */
                file = form.getInputs('file')[0];
                filevalue = '';
                try{filevalue = $(file).getValue();} catch(e){}
                if(filevalue == ''){ form.hide(); return;}  // если файл не выбран, спрятать форму
            
                file.hide();                                // прячем поле ввода
                file_holder = $(file.parentNode);           // див держатель

//                            <div class="loadview" id="progress_div">
//                            <div class="visual" style="display:none"><div style="width:0%">&nbsp;</div></div>
//                             0%
//                            </div>
                loadview_div = new Element('div', {'class':'loadview'});
                visual_div   = new Element('div', {'class':'visual'});
                justdiv      = new Element('div');
                justdiv.style.width = 0;
                justdiv.innerHTML   = '&nbsp;';
                textNode = document.createTextNode('0%');
                visual_div.appendChild(justdiv);
                loadview_div.appendChild(visual_div);
                loadview_div.appendChild(textNode);
                
                file_holder.appendChild(loadview_div);                // прогрессбар
                
                filename = filevalue.split('\\').pop();
                
                /* Собираем массив в котором хранятся работающие сессии */
                submiting_sessions.push(
                    {
                        form      :form,               
                        iframe    :$(form.target.replace('name', 'id')), // ага, именно вот так заумно
                        frame_done:false,
                        ajax_done :false,
                        group_id  :form.getInputs('hidden','upload_group_id')[0].getValue(),
                        file_id   :form.getInputs('hidden','UPLOAD_IDENTIFIER')[0].getValue(),
                        file_div  :file_holder,
                        div       :justdiv,
                        text_node :textNode,
                        file_name :filename
                        
                    }
                );
            }catch(e){}

            /* Отправляем данные */
            try{$(form).submit();}catch(e){ $(form).hide(); submiting_sessions.pop();}
        });

    if( submiting_sessions.length == 0 ) {
        alert('Не выбрано ни одного файла');
        location.reload(true);                  // перезагрузить страницу 
        return;
    }
        
    /* Запускаем мониторинг отправки */
    CheckSessions();
    /* Запускаем мониторинг прогресс аплода */
    ProgressUploadMonitor();
}

/**
 *  Функция вызывается когда форма загржуена, этакий 
 *  onload 
 */
function MyOnloadFrameHandler(form, div){
   //form.innerHTML = 'хуй';
   //div.innerHTML='готова';
   //form.hide();
   //text = $('span_file_sent_message').innerHTML;// текст
   //   text_node = document.createTextNode(text);   // текстовый узел
   //form.appendChild(text_node);                 // выводим текст
}

/**
 * Функция периодически проверяет загрузился ли 
 * фрейм. Алгоритм основан на том, что браузер
 * блокирует доступ к загруженному фрейму. 
 * Функция просто мониторит есть ли доступ к 
 * таргету. Как только доступ заблокирован, 
 * считаем, что загружено.
 */
function CheckSessions()
{
    count_not_finished_sessions = 0;
    count_ajax_uploaded = 0;
    groupid = '';
    submiting_sessions.each( function(session){
        groupid = session.group_id;
        if(session.ajax_uploaded == true){
            count_ajax_uploaded ++;
        }
        if(session.frame_done) return;
        count_not_finished_sessions ++;
        groupid = session.form.upload_group_id.value;
        try{
            session.iframe.contentWindow.document.body.innerHTML.toString();
        }
        catch(e){
            session.frame_done = true;
            MyOnloadFrameHandler(session.form, session.div );
        }
    });
    
    if(count_not_finished_sessions == 0 && count_ajax_uploaded > 0){
       document.location = '/upload/showgroup/'+groupid;
       return;
    }
    setTimeout(CheckSessions, 1000);
}

/**
 * Периодическая отправка аякс запросов о текущем состоянии аплоадов.
 *
 */
function ProgressUploadMonitor()
{
    file_ids = new Array();                     // массив идентификаторов
    action = '';                                // адрес куда сабмитилисаь форма
    group_id = '';                              // идентификатор группы 
    submiting_sessions.each( function(session){ // вытаскиваем все фиды
        if(session.ajax_done) return;           // готовые сессии нам не нужны
        file_ids.push(session.file_id);         // айдишник аплода
        group_id = session.group_id;            // айдишник аплода
        action = session.form.action;           // куда аплодится
    });


    if( file_ids.length == 0 ) return;        // а больше делать и нечего
    
    try {
        uploader = action.match( /http:\/\/([^\/]*)\// )[1].match(/\d+/g );
        //сначала тягается домен, затем из него тягаются циферьки 8)
    } catch(e){ alert(e + 'Не смог вытащить аплодырьid');}
    
    if( !uploader ) { uploader = new Array(1, 80); }
    
    uploader[0] = (uploader[0]) ? (uploader[0]) : '1';
    uploader[1] = (uploader[1]) ? (uploader[1]) : '80';

    uploaderid = uploader[0] + '&' + uploader[1];
    url = '/upload/progress/'+uploaderid+'/' + group_id + '/';   // куда отправить
    
    file_ids.each(function(file_id){
        url += file_id+'/';
    });
    
    send_ajax(url,'',ajaxCallbackOnUploadProgress);
}

/**
 *  Колбек для аяксового запроса на аплод прогресс
 */
function ajaxCallbackOnUploadProgress(response)
{
    if(!response.isJSON()) {                    // пришёл джейсон или херь
        alert(response); return;                // херь нам не нужна
    }

    data = response.evalJSON();                 // преобразуем к разбору
    data = data.sessions;
    
    submiting_sessions.each( function(session){ // вытаскиваем все интересные нам сессии
        if(session.ajax_done) return;           // 
        dat = data[session.file_id];

         if(dat.status == 'processing'){
            session.text_node.nodeValue = session.div.style.width = dat.part+'%';
         }else if(dat.status == 'uploaded'){
            //alert('done');
            session.text_node.nodeValue = session.div.style.width = '100%';
            session.ajax_done = true;
            session.frame_done = true;
            session.ajax_uploaded = true;
         }else if(dat.status == 'error'){

             reason = dat.reason;
             dat.reason = Object();
             dat.reason.title   = upload_error_messages['Error'];
             switch(reason){
                 case 'too big':
                 case 'no file':
                     dat.reason.message = upload_error_messages[ reason ];
                     break;
                 default:
                     dat.reason.message = upload_error_messages['unknown_reason'] + reason;
             }
//            <div class="fileinput errorinput">
//                <div class="loadview">
//                    <div class="visual"><div class="wrong" style="width: 100%;">&nbsp;</div></div>
//                    <span class="small red">Ошибка</span>
//                    <div class="errorbox">
//                        Файл jdklfnmdnflk.text не удалось загрузить.<br>
//                        Ошибка: превышен максимальный размер.
//                    </div>
//                </div>
//            </div>    

            if($(session.file_div).hasClassName('fileinputfirst')) {
                $(session.file_div).addClassName('errorinputfirst');
            } else if($(session.file_div).hasClassName('fileinput')) {
                $(session.file_div).addClassName('errorinput');
            }
            
            $(session.div).addClassName('wrong');
            session.div.style.width = "100%";
            loadview_div = session.text_node.parentNode;
            loadview_div.removeChild(session.text_node);
            span = new Element('span', {'class':'small red'});
            span.innerHTML = dat.reason.title;
            loadview_div.appendChild(span);
            
            div =  new Element('div', {'class':'errorbox'});
            message = dat.reason.message;
            message = message.replace('%FILENAME%', session.file_name);
            div.innerHTML  = message;                           

            loadview_div.appendChild(div);
            session.ajax_done = true;
         }
    });
    setTimeout(ProgressUploadMonitor, 1000);
    
}

/******************************************************************************/
/**
 * Пользовтаель попросил ему смылить, отсылаем оягз
 */
function sendUploadedByEmail(what)
{
    url = $(what).action;                          // куда пойдут данные
    data = $(what).serialize();                    // данные
    
    send_ajax( url, data, callbackUploadedByEmail); // шлём ПРЕВЕД
}

/******************************************************************************/
/**
 * Пришёл вердикт пользователю

 */
function callbackUploadedByEmail(response)
{
    if(!response.isJSON()){alert(response); return;}
    response = response.evalJSON();
    if( response['type'] == 'error' ){
        alert(response['message']);
        return;
    }
    $('email_uploaded_holder').innerHTML = response['message'];
}


/******************************************************************************/
///**
// * Функция для отправки оягза, сокращает код. Принимает на вход 3 аргумента.
// * destinastion   адрес по которому отослать оягз
// * data           данные, которые надо отолсать
// * callback       колбэк при получении ответа
// */
//function send_ajax( destination, data, callback)
//{
//    new Ajax.Request( destination,
//    {
//        parameters: data,
//        onFailure  : function () {alert('Ошибка при отправке оягза');},
//        onSuccess: function(transport)
//        {     
//            var response = transport.responseText;
//            callback(response);
//        }
//    });
//}
