//handler for uploader
var FlashUploaderHander = {
	
	
    uploadLoaded : function ()
    {
        FlashUploader.start(this);
    }
	
}	



//main uploader class
function FlashUploader()
{
	
}

FlashUploader.prototype.swfUploader;
FlashUploader.prototype.maxFileSize = "102400";// 100MB
FlashUploader.prototype.uploadUrl =  "/zadmin/upload.php";
FlashUploader.prototype.postParams = new Array();
FlashUploader.prototype.fileName =  "uploadedFile";
FlashUploader.prototype.fileTypes = "*.*";
FlashUploader.prototype.fileTypesDescription = "All Files";
FlashUploader.prototype.maxFiles = "10";
FlashUploader.prototype.flashUrl = "/js/swfupload.swf";
FlashUploader.prototype.fileDialogComplete = fileDialogComplete;
FlashUploader.prototype.fileQueued = fileQueued;
FlashUploader.prototype.uploadStart = uploadStart;
FlashUploader.prototype.uploadSuccess = uploadSuccess;
FlashUploader.prototype.uploadProgress = uploadProgress;
FlashUploader.prototype.buttonUrl;
FlashUploader.prototype.buttonWidth;
FlashUploader.prototype.buttonHeight;
FlashUploader.prototype.mode = 'multi';
FlashUploader.prototype.buttonID = 'btnBrowse';
var allFinished;
var oneFinised;
var uploadDone;
FlashUploader.prototype.uploadComplete = uploadComplete;
FlashUploader.prototype.initialize = function()
{
    var mode;
	
    if (this.mode == 'single'){
        mode = SWFUpload.BUTTON_ACTION.SELECT_FILE;
    }
    else {
        mode = SWFUpload.BUTTON_ACTION.SELECT_FILES;
    }
	
    this.swfUploader = new SWFUpload({
        // Backend Settings
        upload_url: this.uploadUrl,
        post_params: this.postParams,
        //file_post_name: "Filedata",
        //file_name: this.fileName,
        // File Upload Settings
        file_size_limit : this.maxFileSize,
        file_types : this.fileTypes,
        file_types_description : this.fileTypesDescription,
        file_upload_limit : this.maxFiles,
        button_action:mode,
        button_width:this.buttonWidth,
        button_height:this.buttonHeight,
        button_image_url:this.buttonUrl,
        button_placeholder_id:this.buttonID,
        button_cursor:SWFUpload.CURSOR.HAND,
        button_window_mode: SWFUpload.WINDOW_MODE.OPAQUE,
        // Event Handler Settings
        //swfupload_loaded_handler : uploadLoaded,
        //file_dialog_start_handler : fileDialogStart,
        file_queued_handler : this.fileQueued,
        file_queue_error_handler : fileQueueError,
        file_dialog_complete_handler : this.fileDialogComplete,
        upload_start_handler : this.uploadStart,
        upload_progress_handler : this.uploadProgress,
        upload_error_handler : uploadError,
        upload_success_handler : this.uploadSuccess,
				
        upload_complete_handler : this.uploadComplete,
        //debug_handler : FeaturesDemoHandlers.debug,
				
        // Flash Settings
        flash_url : this.flashUrl,	// Relative to this file

        // Debug Settings
        debug: false
    });
			
}	

FlashUploader.prototype.cancelQueue = function()
{
    var files_left = this.swfUploader.getStats().files_queued;

    while (files_left > 0)
    {
        this.swfUploader.cancelUpload();
        files_left = this.swfUploader.getStats().files_queued;
    }
}

FlashUploader.prototype.updatePostParams = function()
{
    this.swfUploader.setPostParams(this.postParams);
						
}

FlashUploader.prototype.removeFiles = function()
{
    var queue = document.getElementById('selQueue');
    var noFiles = queue.length;

    for (var i = noFiles - 1;i >= 0;i--)
    {
        if (queue[i].selected)
        {
            this.swfUploader.cancelUpload(queue[i].value);
            queue[i] = null;
        }

    }
}

FlashUploader.prototype.selectFile = function()
{
    this.swfUploader.selectFile();
}

FlashUploader.prototype.selectFiles = function()
{
    this.swfUploader.selectFiles();
}

FlashUploader.prototype.uploadNextFile = function()
{
    if (this.swfUploader.getStats().files_queued > 0)
    {
        this.startUpload();
    }
}

FlashUploader.prototype.startUpload = function()
{
    this.swfUploader.startUpload();
}

function uploadLoaded()
{
	
}

function fileDialogStart()
{

}

function fileQueued()
{
	
}

function uploadStart()
{
    return true;
}

function uploadError()
{
	
}

function fileQueued(fileObj)
{
    var queuedFiles = document.getElementById("selQueue");
    queuedFiles.options[queuedFiles.options.length] = new Option(fileObj.name,fileObj.id);
}

function fileQueueError(fileObj, error_code, message) {
    try {
        var error_name = "";
        switch(error_code) {
            case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED:
                alert("You can only upload " + message + " more files");
                break;
        
            case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
                alert("Zero length file");
                break;
            case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
                alert("File exceeds maximum size (" + this.getSetting("file_size_limit") + "KB)");
                break;
            case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE:
            default:
                alert(message);
                break;
        }

        if (error_name !== "") {
            alert(error_name);
            return;
        }

    } catch (ex) {
        this.debug(ex);
    }

}

function fileDialogComplete(num_files_queued) {
	
}

function uploadProgress(fileObj, bytesLoaded) {

    try {
        var percent = Math.ceil((bytesLoaded / fileObj.size) * 100)

        var progress = new FileProgress(fileObj,   "divFileProgressContainer");
        progress.SetProgress(percent);
        if (percent === 100) {
            progress.SetStatus("Finished");
			
            if (typeof(oneFinished) === "function")
            {
                oneFinished.call(this,fileObj);
            }
		
            progress.ToggleCancel(false);
            progress.ToggleCancel(true, this, fileObj.id);
        } else {
            progress.SetStatus("Uploading...");
            progress.ToggleCancel(true, this, fileObj.id);
        }
    } catch (ex) {
        this.debug(ex);
    }
}

function uploadSuccess(fileObj, server_data) {
    try {
        var progress = new FileProgress(fileObj,   "divFileProgressContainer");

        progress.SetStatus("Upload Finished.");
        progress.ToggleCancel(false);
                
        if (typeof(uploadDone) === "function")
        {
            uploadDone.call(this,server_data);
        }

    } catch (ex) {
        this.debug(ex);
    }
}

function uploadComplete(fileObj) {
    try {
        if (this.getStats().files_queued == 0) {
            var progress = new FileProgress(fileObj,  "divFileProgressContainer");
            progress.SetComplete();
            progress.SetStatus("All Files Uploaded.");
            progress.ToggleCancel(false);
            clearQueue();
            if (typeof(allFinished) === "function")
            {
                allFinished.call(this,fileObj);
            }
			
        }
        else
        {
            this.startUpload();
        }
    } catch (ex) {
        this.debug(ex);
    }
}

function clearQueue()
{
    var queue = document.getElementById("selQueue");
    var length = queue.length;
		
    for (i = length-1;i >= 0;i--)
    {
        queue[i] = null;
    }
}

function uploadError(fileObj, error_code, message) {
    var image_name =  "error.gif";
    try {
        switch(error_code) {
            case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:
                try {
                    var progress = new FileProgress(fileObj,  this.customSettings.upload_target);
                    progress.SetCancelled();
                    progress.SetStatus("Stopped");
                    progress.ToggleCancel(true, this, fileObj.id);
                }
                catch (ex) {
                    this.debug(ex);
                }
            case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:
                alert("Please only upload " + message + " files at a time");
                break;
            default:
                alert(message);
                break;
        }

		

    } catch (ex) {
        this.debug(ex);
    }

}

/* ******************************************
 *	FileProgress Object
 *	Control object for displaying file info
 * ****************************************** */

function FileProgress(fileObj, target_id) {
    this.file_progress_id = "divFileProgress";

    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.id = "progressText";
        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);
        FadeIn(this.fileProgressWrapper, 0);

    } else {
        this.fileProgressElement = this.fileProgressWrapper.firstChild;
        this.fileProgressElement.childNodes[1].firstChild.nodeValue = fileObj.name;
    }

    this.height = this.fileProgressWrapper.offsetHeight;
    this.fileName = fileObj.name;
}
FileProgress.prototype.SetProgress = function(percentage) {
    this.fileProgressElement.className = "progressContainer green";
    this.fileProgressElement.childNodes[3].className = "progressBarInProgress";
    this.fileProgressElement.childNodes[3].style.width = percentage + "%";
    document.getElementById("progressText").innerHTML = this.fileName + " " + percentage + "%";
}
FileProgress.prototype.SetComplete = function() {
    this.fileProgressElement.className = "progressContainer blue";
    this.fileProgressElement.childNodes[3].className = "progressBarComplete";
    this.fileProgressElement.childNodes[3].style.width = "";

}
FileProgress.prototype.SetError = function() {
    this.fileProgressElement.className = "progressContainer red";
    this.fileProgressElement.childNodes[3].className = "progressBarError";
    this.fileProgressElement.childNodes[3].style.width = "";

}
FileProgress.prototype.SetCancelled = function() {
    this.fileProgressElement.className = "progressContainer";
    this.fileProgressElement.childNodes[3].className = "progressBarError";
    this.fileProgressElement.childNodes[3].style.width = "";

}
FileProgress.prototype.SetStatus = function(status) {
    this.fileProgressElement.childNodes[2].innerHTML = status;
}

FileProgress.prototype.ToggleCancel = function(show, upload_obj, file_id) {
    this.fileProgressElement.childNodes[0].style.visibility = show ? "visible" : "hidden";
    if (upload_obj) {
        this.fileProgressElement.childNodes[0].onclick = function() {
            upload_obj.cancelUpload(); return false;
        };
    }
}

function AddImage(src) {
    var new_img = document.createElement("img");
    new_img.style.margin = "5px";

    document.getElementById("thumbnails").appendChild(new_img);
    if (new_img.filters) {
        try {
            new_img.filters.item("DXImageTransform.Microsoft.Alpha").opacity = 0;
        } catch (e) {
            // If it is not set initially, the browser will throw an error.  This will set it if it is not set yet.
            new_img.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + 0 + ')';
        }
    } else {
        new_img.style.opacity = 0;
    }

    new_img.onload = function () {
        FadeIn(new_img, 0);
    };
    new_img.src = src;
}

function FadeIn(element, opacity) {
    var reduce_opacity_by = 15;
    var rate = 30;	// 15 fps


    if (opacity < 100) {
        opacity += reduce_opacity_by;
        if (opacity > 100) opacity = 100;

        if (element.filters) {
            try {
                element.filters.item("DXImageTransform.Microsoft.Alpha").opacity = 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.
                element.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + opacity + ')';
            }
        } else {
            element.style.opacity = opacity / 100;
        }
    }

    if (opacity < 100) {
        setTimeout(function() {
            FadeIn(element, opacity);
        }, rate);
    }
}
