/* Demo Note:  This demo uses a FileProgress class that handles the UI for displaying the file name and percent complete.
The FileProgress class is not part of SWFUpload.
*/


function cancelQueue(instance) {
        document.getElementById(instance.customSettings.cancelButtonId).disabled = true;
        instance.stopUpload();
        var stats;
        
        do {
                stats = instance.getStats();
                instance.cancelUpload();
        } while (stats.files_queued !== 0);
        
}


/* **********************
   Event Handlers
   These are my custom event handlers to make my
   web application behave the way I went when SWFUpload
   completes different tasks.  These aren't part of the SWFUpload
   package.  They are part of my application.  Without these none
   of the actions SWFUpload makes will show up in my application.
   ********************** */

function fileDialogStart() {
        /* I don't need to do anything here */
//                        document.getElementById("divLoadingContent").style.display = "none";
//                        document.getElementById("divLongLoading").style.display = "none";
}


function swfUploadPreLoad() {
        var self = this;
        var loading = function () {
                document.getElementById("divSWFUploadUI").style.display = "none";
                document.getElementById("divLoadingContent").style.display = "";

                var longLoad = function () {
                        document.getElementById("divLoadingContent").style.display = "none";
                        document.getElementById("divLongLoading").style.display = "";
                };
                this.customSettings.loadingTimeout = setTimeout(function () {
                                longLoad.call(self)
                        },
                        15 * 1000
                );
        };
        
        this.customSettings.loadingTimeout = setTimeout(function () {
                        loading.call(self);
                },
                1*1000
        );
}
function swfUploadLoaded() {
        var self = this;
        clearTimeout(this.customSettings.loadingTimeout);
        //document.getElementById("divSWFUploadUI").style.visibility = "visible";
        document.getElementById("divSWFUploadUI").style.display = "block";
        document.getElementById("divLoadingContent").style.display = "none";
        document.getElementById("divLongLoading").style.display = "none";
        document.getElementById("divAlternateContent").style.display = "none";
        
        //document.getElementById("btnBrowse").onclick = function () { self.selectFiles(); };
        document.getElementById("btnCancel").onclick = function () { self.cancelQueue(); };
}
   
function swfUploadLoadFailed() {
        clearTimeout(this.customSettings.loadingTimeout);
        //document.getElementById("divSWFUploadUI").style.display = "none";
        document.getElementById("divLoadingContent").style.display = "none";
        document.getElementById("divLongLoading").style.display = "none";
        document.getElementById("divAlternateContent").style.display = "";
}
   
   
function fileQueued(file) {
        try {
                // You might include code here that prevents the form from being submitted while the upload is in
                // progress.  Then you'll want to put code in the Queue Complete handler to "unblock" the form
                var progress = new FileProgress(file, this.customSettings.progressTarget);
                progress.SetStatus("Ожидание...");
                progress.ToggleCancel(true, this);

        } catch (ex) { this.debug(ex); }

}

function fileQueueError(file, errorCode, message) {
        try {
                if (errorCode === SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED) {
                        alert("Вы выбрали слишком большое число файлов.\n" + (message === 0 ? "Выбрано слишком много файлов для загрузки." : "Вы должны выбрать  " + (message > 1 ? "до " + message + " файлов." : "один файлe.")));
                        return;
                }

                var progress = new FileProgress(file, this.customSettings.progressTarget);
                progress.setError();
                progress.toggleCancel(false);

                switch (errorCode) {
                case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
                        progress.setStatus("Слишком большой файл.");
                        this.debug("Error Code: Файл слишком большой, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
                        break;
                case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
                        progress.setStatus("Нельзя загружать файлы размером 0 байт.");
                        this.debug("Error Code: Файл нулевого размера, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
                        break;
                case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE:
                        progress.setStatus("Неверный тип файла.");
                        this.debug("Error Code: Неверный тип файла, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
                        break;
                default:
                        if (file !== null) {
                                progress.setStatus("Unhandled Error");
                        }
                        this.debug("Error Code: " + errorCode + ", File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
                        break;
                }
        } catch (ex) {
        this.debug(ex);
    }
}

function fileDialogComplete(numFilesSelected, numFilesQueued) {
        try {
                if (numFilesSelected > 0) {
                        document.getElementById(this.customSettings.cancelButtonId).disabled = false;
                }
                
                /* I want auto start the upload and I can do that here */
                this.startUpload();
        } catch (ex)  {
        this.debug(ex);
        }
}

function uploadStart(file) {
        try {
                /* I don't want to do any file validation or anything,  I'll just update the UI and
                return true to indicate that the upload should start.
                It's important to update the UI here because in Linux no uploadProgress events are called. The best
                we can do is say we are uploading.
                 */
                var progress = new FileProgress(file, this.customSettings.progressTarget);
                progress.setStatus("Загружаю...");
                progress.toggleCancel(true, this);
        }
        catch (ex) {}
        
        return true;
}

function uploadProgress(file, bytesLoaded, bytesTotal) {
        try {
                var percent = Math.ceil((bytesLoaded / bytesTotal) * 100);

                var progress = new FileProgress(file, this.customSettings.progressTarget);
                progress.setProgress(percent);
                progress.setStatus("Загружаю...");
        } catch (ex) {
                this.debug(ex);
        }
}

function uploadSuccess(file, serverData) {

        try {
                var progress = new FileProgress(file, this.customSettings.progressTarget);
                progress.SetComplete();
                progress.SetStatus("Загружено.");
                progress.ToggleCancel(false);                                           
                if(loading_user_img==1)
                {                       
                        doLoad('photo_list','ReloadPhotoUser',{user_id:user_id});                       
                }
                else
                        doLoad('photo_list','ReloadPhoto',{tovar_id:tovar_id});
        } catch (ex) { this.debug(ex); }        

        doLoad('photo_list','load_file',ge('form1'));return false;
}

function uploadError(file, errorCode, message) {
        try {
                var progress = new FileProgress(file, this.customSettings.progressTarget);
                progress.setError();
                progress.toggleCancel(false);

                switch (errorCode) {
                case SWFUpload.UPLOAD_ERROR.HTTP_ERROR:
                        progress.setStatus("Ошибка загрузки: " + message);
                        this.debug("Error Code: HTTP Error, File name: " + file.name + ", Message: " + message);
                        break;
                case SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED:
                        progress.setStatus("Загрузка неудалась.");
                        this.debug("Error Code: Upload Failed, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
                        break;
                case SWFUpload.UPLOAD_ERROR.IO_ERROR:
                        progress.setStatus("Серверная IO ошибка");
                        this.debug("Error Code: IO Error, File name: " + file.name + ", Message: " + message);
                        break;
                case SWFUpload.UPLOAD_ERROR.SECURITY_ERROR:
                        progress.setStatus("Ошибка безопастности");
                        this.debug("Error Code: Security Error, File name: " + file.name + ", Message: " + message);
                        break;
                case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:
                        progress.setStatus("Лимит загрузки исчерпан.");
                        this.debug("Error Code: Upload Limit Exceeded, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
                        break;
                case SWFUpload.UPLOAD_ERROR.FILE_VALIDATION_FAILED:
                        progress.setStatus("Failed Validation.  Upload skipped.");
                        this.debug("Error Code: File Validation Failed, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
                        break;
                case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:
                        // If there aren't any files left (they were all cancelled) disable the cancel button
                        if (this.getStats().files_queued === 0) {
                                document.getElementById(this.customSettings.cancelButtonId).disabled = true;
                        }
                        progress.setStatus("Отменено");
                        progress.setCancelled();
                        break;
                case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:
                        progress.setStatus("Остановлено");
                        break;
                default:
                        progress.setStatus("Unhandled Error: " + errorCode);
                        this.debug("Error Code: " + errorCode + ", File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
                        break;
                }
        } catch (ex) {
        this.debug(ex);
    }
}

function uploadComplete(file) {
        if (this.getStats().files_queued === 0) {
                document.getElementById(this.customSettings.cancelButtonId).disabled = true;
        }
}

// This event comes from the Queue Plugin
function queueComplete(numFilesUploaded) {
        var status = document.getElementById("divStatus");
        status.innerHTML = numFilesUploaded + " файл(ов)" + (numFilesUploaded === 1 ? "" : "s") + " загружено.";
}




function FileProgress(fileObj, target_id) {
        this.file_progress_id = fileObj.id;

        this.opacity = 100;
        this.height = 0;

        this.fileProgressWrapper = document.getElementById(this.file_progress_id);
        if (!this.fileProgressWrapper) {
                this.fileProgressWrapper = document.createElement("div");
                this.fileProgressWrapper.className = "progressWrapper";
                this.fileProgressWrapper.id = this.file_progress_id;

                this.fileProgressElement = document.createElement("div");
                this.fileProgressElement.className = "progressContainer";

                var progressCancel = document.createElement("a");
                progressCancel.className = "progressCancel";
                progressCancel.href = "#";
                progressCancel.style.visibility = "hidden";
                progressCancel.appendChild(document.createTextNode(" "));

                var progressText = document.createElement("div");
                progressText.className = "progressName";
                progressText.appendChild(document.createTextNode(fileObj.name));

                var progressBar = document.createElement("div");
                progressBar.className = "progressBarInProgress";

                var progressStatus = document.createElement("div");
                progressStatus.className = "progressBarStatus";
                progressStatus.innerHTML = "&nbsp;";

                this.fileProgressElement.appendChild(progressCancel);
                this.fileProgressElement.appendChild(progressText);
                this.fileProgressElement.appendChild(progressStatus);
                this.fileProgressElement.appendChild(progressBar);

                this.fileProgressWrapper.appendChild(this.fileProgressElement);

                document.getElementById(target_id).appendChild(this.fileProgressWrapper);
        } else {
                this.fileProgressElement = this.fileProgressWrapper.firstChild;
        }

        this.height = this.fileProgressWrapper.offsetHeight;

}
FileProgress.prototype.SetProgress = function(percentage) {
        this.fileProgressElement.className = "progressContainer green";
        this.fileProgressElement.childNodes[3].className = "progressBarInProgress";
        this.fileProgressElement.childNodes[3].style.width = percentage + "%";
};
FileProgress.prototype.SetComplete = function() {
        this.fileProgressElement.className = "progressContainer blue";
        this.fileProgressElement.childNodes[3].className = "progressBarComplete";
        this.fileProgressElement.childNodes[3].style.width = "";

        var oSelf = this;
        setTimeout(function() { oSelf.Disappear(); }, 5000);
};
FileProgress.prototype.SetError = function() {
        this.fileProgressElement.className = "progressContainer red";
        this.fileProgressElement.childNodes[3].className = "progressBarError";
        this.fileProgressElement.childNodes[3].style.width = "";

        var oSelf = this;
        setTimeout(function() { oSelf.Disappear(); }, 5000);
};
FileProgress.prototype.SetCancelled = function() {
        this.fileProgressElement.className = "progressContainer";
        this.fileProgressElement.childNodes[3].className = "progressBarError";
        this.fileProgressElement.childNodes[3].style.width = "";

        var oSelf = this;
        setTimeout(function() { oSelf.Disappear(); }, 2000);
};
FileProgress.prototype.SetStatus = function(status) {
        this.fileProgressElement.childNodes[2].innerHTML = status;
};

FileProgress.prototype.ToggleCancel = function(show, upload_obj) {
        this.fileProgressElement.childNodes[0].style.visibility = show ? "visible" : "hidden";
        if (upload_obj) {
                var file_id = this.file_progress_id;
                this.fileProgressElement.childNodes[0].onclick = function() { upload_obj.cancelUpload(file_id); return false; };
        }
};

FileProgress.prototype.Disappear = function() {

        var reduce_opacity_by = 15;
        var reduce_height_by = 4;
        var rate = 30;  // 15 fps

        if (this.opacity > 0) {
                this.opacity -= reduce_opacity_by;
                if (this.opacity < 0) {
                        this.opacity = 0;
                }

                if (this.fileProgressWrapper.filters) {
                        try {
                                this.fileProgressWrapper.filters.item("DXImageTransform.Microsoft.Alpha").opacity = this.opacity;
                        } catch (e) {
                                // If it is not set initially, the browser will throw an error.  This will set it if it is not set yet.
                                this.fileProgressWrapper.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=" + this.opacity + ")";
                        }
                } else {
                        this.fileProgressWrapper.style.opacity = this.opacity / 100;
                }
        }

        if (this.height > 0) {
                this.height -= reduce_height_by;
                if (this.height < 0) {
                        this.height = 0;
                }

                this.fileProgressWrapper.style.height = this.height + "px";
        }

        if (this.height > 0 || this.opacity > 0) {
                var oSelf = this;
                setTimeout(function() { oSelf.Disappear(); }, rate);
        } else {
                this.fileProgressWrapper.style.display = "none";
        }
};
