(function () {

    var SUBMIT_POSITIONS_URL = "/pictures/update_positions";
    
    /**
     * Загрузка фотографий
     *
     * @param root
     * @param url
     *
     * @field root      root
     *
     */
    PICSA.Uploader = function (root, url) {
        var me = this;
        Observable(me);

        var uploader = $('<div class="mode">' +
                   '<h1>Загрузка картинок</h1>' +
                   
                   '<div class="form">' +
                   '<div id="hd"></div>' +
                     '<form action="'+url+'" id="upload-form" enctype="multipart/form-data" method="post" target="upload_target">' +
                       '<label>c компьютера</label>' +
                       '<input id="picture_uploaded_data" name="picture[uploaded_data]" size="28" type="file" class="textinput" />' +
                     '</form>' +
                   '</div><div class="form">' +
                     '<form action="'+url+'" id="url_upload_form" method="post" target="upload_target">' +
                       '<label>c другого сайта</label>' +
                       '<input id="picture_source_url" name="picture[source_url]" type="text" class="textinput" style="width:210px;" />' +
                       '<div class="button-div">' +
                         '<input id="url_submit" name="commit" type="submit" value="Загрузить" />' +
                       '</div>' +
                     '</form>' +
                   '</div>' +
                 '</div>');
        root.append(uploader);

        me.init(url);
    }

    $.extend(PICSA.Uploader.prototype, {
        init: function(url){
            var me = this;
            var total_size = 0,
                uploaded_files = 0,
                remote_upload = !(PICSA.uploadContext==window.location.pathname),
                stack = [];

            $("#toolbar .buttons .upload .btn-icon").append("<div id='up'></div>");

            var uploadOptions = {
                'uploader'       : '/files/uploadify.swf',
                'script'         : url + '/upload_flash',
                'scriptData'     : {'format': 'json'},
                'scriptAccess'   : 'always',
                'wmode'          : 'transparent',
                'multi'          : true,
                'fileDesc'       : 'Images',
                'fileExt'        : '*.jpg;*.jpeg;*.gif;*.png',
                'sizeLimit'      : PICSA.current_user ? 10485760 : 1048576,
                'simUploadLimit' : 2,
                'buttonImg'      : '/images/s.gif',
                'onError'        : function(event, g, file, error) {
                                       var message;
                                       if (error.status == 404){
                                           message = "Ошибка загрузки. Не найден путь для сохранения файла";
                                       }else if (error.type === "HTTP"){
                                           message = "Ошибка загрузки. "+error.type+": "+error.info;
                                       }else if (error.type ==="File Size"){
                                           message = "Размер файла не должен превышать" + (PICSA.current_user ? "10Мб" : "1Мб");
                                       }else{
                                           message = "Ошибка загрузки. "+error.type+": "+error.info;
                                       }

                                       $.growl('Ошибка', message);
                                       $("#upload-progress").addClass('hidden');
                                       $("#toolbar .buttons .upload .btn-icon").removeClass('loading');
                                       $('#picture_uploaded_data').val('');
                                       $('#toolbar .buttons .upload #url_submit').attr('disabled', false);
                                   },
                'onProgress'     : function(event, q, file, data){
                                       var loaded = data.allBytesLoaded;
                                       var pc = parseInt(loaded*100 / total_size);
                                       $("#upload-progress #bar").animate({'left': pc+'%'});

                                       $("#toolbar .buttons .upload .btn-icon").addClass('loading');
                                       $('#toolbar .buttons .upload #url_submit').attr('disabled', true);
                },
                'onComplete'     : function(event, q, file, resp) {
                                       var data = eval('(' + resp + ')');

                                       if(!data.success){
                                           $("#toolbar .buttons .upload .btn-icon #up").uploadifyClearQueue();
                                           $("#toolbar .buttons .upload .mode #hd").uploadifyClearQueue();

                                           $("#upload-progress").addClass('hidden');
                                           $("#toolbar .buttons .upload .btn-icon").removeClass('loading');

                                           $.growl('Ошибка', data.message);
                                       }else{
                                           $('#photos .empty-message').addClass('hidden');
                                           
                                           uploaded_files += 1;
                                           if(PICSA.Canvas){ //помещаем на холст
                                               PICSA.Canvas.safeShiftColumn(data.picture, false);
                                               PICSA.Canvas.incrementColumn();
                                           }
                                           if(remote_upload){ //новый стек
                                               stack.push({'id': data.picture.id,
                                                           't': PICSA.uploads*100 + (uploaded_files-1)*5 + 40,
                                                           'l': PICSA.uploads*25 + (uploaded_files-1)*8 + 30});
                                           }
                                       }
                },
                'onAllComplete'  : function(event, data){
                                       var timer = new Timer();
                                       timer.later(3000, function(){
                                           $("#upload-progress").addClass('hidden');
                                           $("#toolbar .buttons .upload .btn-icon").removeClass('loading');
                                           $('#picture_uploaded_data').val('');
                                           $('#toolbar .buttons .upload #url_submit').attr('disabled', false);

                                           if(uploaded_files > 0){
                                             $.growl('Ваши картинки загружены', 'Загружено файлов: '+uploaded_files+
                                             (remote_upload ? '<br /><a href="'+PICSA.uploadContext+'">Посмотреть</a>' : ''));
                                           }
                                       });

                                       if(remote_upload && uploaded_files > 0){ //создан стек позиций
                                           PICSA.uploads += 1;
                                           var out={};
                                           if(stack.length > 0){
                                               $.each(stack, function () {
                                                   out[this.id] = {'t': this.t, 'l': this.l};
                                               });
                                               $.post(SUBMIT_POSITIONS_URL, {'positions' : JSON.stringify(out),
                                                                             'uploads'   : PICSA.uploads},
                                                      function () {}, "json");
                                           }
                                       }
                }
            };

            $("#toolbar .buttons .upload .btn-icon #up").uploadify($.extend(uploadOptions,{
                'width'          : 100,
                'height'         : 20,
                'auto'           : true,
                'onSelectOnce'   : function(event, data){
                                      total_size = data.allBytesTotal;
                                      uploaded_files = 0;
                                      $("#upload-progress").removeClass('hidden');
                                      $("#upload-progress #bar").css('left', 0);

                                      $("#toolbar .buttons .upload .btn-icon").addClass('loading');
                }
            }));
            $("upUploader").css("padding-top", 0);

            $("#toolbar .buttons .upload .mode #hd").uploadify($.extend(uploadOptions, {
                'width'          : 290,
                'height'         : 20,
                'auto'           : false,
                'onSelectOnce'   : function(event, data){
                                      total_size = data.allBytesTotal;
                                      uploaded_files = 0;
                                      $("#upload-progress").removeClass('hidden');
                                      $("#upload-progress #bar").css('left', 0);

                                      var uploader = $("#toolbar .buttons .upload #upload-form #picture_uploaded_data");
                                      if(uploader.attr('type')=='file'){
                                        uploader.replaceWith(
                                          '<input id="picture_uploaded_data" name="picture[uploaded_data]" type="text" class="textinput" ' +
                                          ' value="Выбрано файлов: '+data.fileCount+'" style="width:210px;" />' +
                                          ' <input type="button" value="Обзор..." style="width:64px;height:22px;">'
                                       );
                                      }else{
                                          uploader.val('Выбрано файлов: ' +data.fileCount);
                                      }
                }
            }));

            $('#url_upload_form').submit(function(){
                if($(this).find('#picture_source_url').val().length > 0){
                    $("#toolbar .buttons .upload .btn-icon").addClass('loading');
                    $('#toolbar .buttons .upload #url_submit').attr('disabled', true);
                    $("#upload-progress").removeClass('hidden');
                    $("#upload-progress #bar").css('left', 0);
                    return true;
                }
                if($('#picture_uploaded_data').attr('type') == 'file' && $('#picture_uploaded_data').val().length>0){
                    $("#toolbar .buttons .upload .btn-icon").addClass('loading');
                    $('#toolbar .buttons .upload #url_submit').attr('disabled', true);
                    $("#upload-progress").removeClass('hidden');
                    $("#upload-progress #bar").css('left', 0);

                    $('#upload-form').submit();
                    return false;
                }
                $("#toolbar .buttons .upload .mode #hd").uploadifyUpload();
                return false;
            });
        }
    });
})();
