function fileDialogStart() {
    /* I don't need to do anything here */
}
function fileQueued(fileObj) {
    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(fileObj, this.customSettings.progressTarget);
        progress.SetStatus("Pending...");
        progress.ToggleCancel(true, this);

    } catch (ex) { this.debug(ex); }

}

function fileQueueError(fileObj, error_code, message) {
    try {
        if (error_code === SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED) {
            alert("You have attempted to queue too many files.\n" + (message === 0 ? "You have reached the upload limit." : "You may select " + (message > 1 ? "up to " + message + " files." : "one file.")));
            return;
        }

        var progress = new FileProgress(fileObj, this.customSettings.progressTarget);
        progress.SetError();
        progress.ToggleCancel(false);

        switch(error_code) {
            case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
                progress.SetStatus("File is too big.");
                this.debug("Error Code: File too big, File name: " + fileObj.name + ", File size: " + fileObj.size + ", Message: " + message);
                var progressBar = this.customSettings.progressTarget;
                var dropOut = function() {
                    new Effect.DropOut(progressBar, {afterFinish:function() {
                        $(progressBar).update('');
                        $(progressBar).style.display = 'block';
                    }});
                }
                setTimeout(dropOut, 2000);
                break;
            case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
                progress.SetStatus("Cannot upload Zero Byte files.");
                this.debug("Error Code: Zero byte file, File name: " + fileObj.name + ", File size: " + fileObj.size + ", Message: " + message);
                break;
            case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE:
                progress.SetStatus("Invalid File Type.");
                this.debug("Error Code: Invalid File Type, File name: " + fileObj.name + ", File size: " + fileObj.size + ", Message: " + message);
                break;
            case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED:
                alert("You have selected too many files.  " +  (message > 1 ? "You may only add " +  message + " more files" : "You cannot add any more files."));
                break;
            default:
                if (fileObj !== null) {
                    progress.SetStatus("Unhandled Error");
                }
                this.debug("Error Code: " + error_code + ", File name: " + fileObj.name + ", File size: " + fileObj.size + ", Message: " + message);
                break;
        }
    } catch (ex) {
        this.debug(ex);
    }
}

function fileDialogComplete(num_files_queued) {
    try {
        if (this.getStats().files_queued > 0) {
            //document.getElementById(this.customSettings.cancelButtonId).disabled = false;
        }
        
        /* I want auto start and I can do that here */
        this.startUpload();
    } catch (ex)  {
        this.debug(ex);
    }
}

function uploadStart(fileObj) {
    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 */
        //new Effect.Opacity('sampleRequest', {from:1.0, to:0.5, duration:0.3});
        var progress = new FileProgress(fileObj, this.customSettings.progressTarget);
        progress.SetStatus('Uploading...');
        progress.ToggleCancel(true, this);
    }
    catch (ex) {}
    
    return true;
}

function uploadProgress(fileObj, bytesLoaded, bytesTotal) {

    try {
        var percent = Math.ceil((bytesLoaded / bytesTotal) * 100);

        var progress = new FileProgress(fileObj, this.customSettings.progressTarget);
        progress.SetProgress(percent);
        progress.SetStatus("Uploading...");
    } catch (ex) { this.debug(ex); }
}

function uploadSuccess(fileObj, server_data) {
    //alert(server_data);
    try {
        var progress = new FileProgress(fileObj, this.customSettings.progressTarget);
        /*progress.SetComplete();
        progress.SetStatus("Complete.");*/
        progress.ToggleCancel(false);

    } catch (ex) { this.debug(ex); }
}

function uploadComplete(fileObj) {
    try {
        /*  I want the next upload to continue automatically so I'll call startUpload here */
        if (this.getStats().files_queued === 0) {
            $('uploadThumb').update('<p class="alignCenter"><img src="' + sDomainRoot + '/img/loading.gif" alt="Loading..." /></p>');
            new Effect.DropOut(this.customSettings.progressTarget, {afterFinish:function() {
                //new Effect.Opacity('sampleRequest', {from:0.5, to:1.0, duration:0.5});
                $('SampleImage').value = 1;
                new Ajax.Request((typeof openSampleRequest == 'function') ? 'sample_upload.php?t=1' : './sample/thumbnail', {
                    method: 'post',
                    postBody: $('sampleRequestForm').serialize(),
                    onComplete: function(r) {
                        //alert(r.responseText);
                        $('uploadThumb').update(r.responseText);
                        // change button
                        $(this.customSettings.progressTarget).update().show();
                    }.bind(this)
                });
            }.bind(this)});
        } else {    
            this.startUpload();
        }
    } catch (ex) { this.debug(ex); }

}

function uploadError(fileObj, error_code, message) {
    try {
        var progress = new FileProgress(fileObj, this.customSettings.progressTarget);
        progress.SetError();
        progress.ToggleCancel(false);

        switch(error_code) {
            case SWFUpload.UPLOAD_ERROR.HTTP_ERROR:
                progress.SetStatus("Upload Error: " + message);
                this.debug("Error Code: HTTP Error, File name: " + fileObj.name + ", Message: " + message);
                break;
            case SWFUpload.UPLOAD_ERROR.MISSING_UPLOAD_URL:
                progress.SetStatus("Configuration Error");
                this.debug("Error Code: No backend file, File name: " + fileObj.name + ", Message: " + message);
                break;
            case SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED:
                progress.SetStatus("Upload Failed.");
                this.debug("Error Code: Upload Failed, File name: " + fileObj.name + ", File size: " + fileObj.size + ", Message: " + message);
                break;
            case SWFUpload.UPLOAD_ERROR.IO_ERROR:
                progress.SetStatus("Server (IO) Error");
                this.debug("Error Code: IO Error, File name: " + fileObj.name + ", Message: " + message);
                break;
            case SWFUpload.UPLOAD_ERROR.SECURITY_ERROR:
                progress.SetStatus("Security Error");
                this.debug("Error Code: Security Error, File name: " + fileObj.name + ", Message: " + message);
                break;
            case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:
                progress.SetStatus("Upload limit exceeded.");
                this.debug("Error Code: Upload Limit Exceeded, File name: " + fileObj.name + ", File size: " + fileObj.size + ", Message: " + message);
                break;
            case SWFUpload.UPLOAD_ERROR.SPECIFIED_FILE_ID_NOT_FOUND:
                progress.SetStatus("File not found.");
                this.debug("Error Code: The file was not found, File name: " + fileObj.name + ", File size: " + fileObj.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: " + fileObj.name + ", File size: " + fileObj.size + ", Message: " + message);
                break;
            case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:
                if (this.getStats().files_queued === 0) {
                    //document.getElementById(this.customSettings.cancelButtonId).disabled = true;
                }
                progress.SetStatus("Cancelled");
                progress.SetCancelled();
                break;
            case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:
                progress.SetStatus("Stopped");
                break;
            default:
                progress.SetStatus("Unhandled Error: " + error_code);
                this.debug("Error Code: " + error_code + ", File name: " + fileObj.name + ", File size: " + fileObj.size + ", Message: " + message);
                break;
        }
    } catch (ex) {
        this.debug(ex);
    }
}



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(); }, 10000);
};
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() {
    //new Effect.Fade(this);
};
var sDomainRoot;
function loadSampleRequest(sRootUri) {
    sDomainRoot = sRootUri;
    swfu = new SWFUpload({
        upload_url: sRootUri + '/sample/upload?' + $('sampleRequestForm').serialize(),
        flash_url: sRootUri + '/js/swfupload.swf',
        file_post_name: 'sampleImage',
        post_params: $('sampleRequestForm').serialize(true),
        file_types: '*.jpg',
        file_size_limit: '4096',
        //file_upload_limit: '1',
        //file_queue_limit: '0',
        file_dialog_start_handler : fileDialogStart,
        file_queued_handler : fileQueued,
        file_queue_error_handler : fileQueueError,
        file_dialog_complete_handler : fileDialogComplete,
        upload_start_handler : uploadStart,
        upload_progress_handler : uploadProgress,
        upload_error_handler : uploadError,
        upload_success_handler : uploadSuccess,
        upload_complete_handler : uploadComplete,
        custom_settings: {
            progressTarget: 'SWFUploadTarget',
            cancelButtonId: 'cancelUpload'
        },
        button_placeholder_id: 'uploadImageButton',
        button_image_url: sRootUri + '/img/button_image_upload.gif',
        button_width: '120',
        button_height: '20',
        debug: false
    });
    $('previewIt').onclick = function() {
        $('SampleSampleAction').value = 'preview';
    }
    $('mailIt').onclick = function() {
        $('SampleSampleAction').value = "default";
    }
    $('sampleRequestForm').onsubmit = function() {
        var bValid = true;
        var oInput;
        var aRequired = Array('SampleFirstName', 'SampleLastName', 'SampleEmail', 'SampleAddress', 'SamplePostalCode', 'SampleImage', 'SampleCaption');
        this.getInputs().each(function(elem) {
            if (elem.id && aRequired.inArray(elem.id) && elem.value == '') {
                if (bValid) {
	                bValid = false;
	                oInput = elem;
	            }
            }
        });
        if (!bValid) {
            if (oInput.id == 'SampleImage') alert('Please upload an image!');
            else {
                alert('You are missing required fields!');
                oInput.focus();
            }
            return false;
        }
        $('sampleResponse').update('<img src="' + sRootUri + '/img/loading.gif" alt="Loading..." />');
        $('mailIt').disable();
        $('previewIt').disable();
        new Ajax.Request((typeof openSampleRequest == 'function') ? 'sample_upload.php' : sRootUri + '/sample/send', {
            method: 'post',
            postBody: this.serialize(),
            onComplete: function(r) {
                switch (true) {
                    case (r.responseText.search(/error code/i) > -1):
                        $('sampleResponse').update('<span class="req">Invalid address entry. Please try again.<br /><strong>NOTE:</strong> Do not include a city and state in the &quot;Street Address&quot; field, only the house number and street name.</span>');
                    break;
                    case (r.responseText.search(/error/i) > -1):
                        $('sampleResponse').update(r.responseText);
                    break;
                    case (r.responseText.search(/\[previewResponse\]/i) > -1):
                        // clear out our flag
                        cPDFlink = r.responseText.replace(/\[previewResponse\]/,'');
                        $('sampleResponse').update('<p><a id="pdfLink" href="' + cPDFlink + '" target="_blank">View My Sample Postcard</a></p>');
                        $('pdfLink').click();
                    break;
                    default:
                        $('sampleResponse').update('');
                        $('sampleRequestContainer').update(r.responseText);
                        ga('/sample/complete');
                    break;
                }
                $('mailIt').enable();
                $('previewIt').enable();
                externalLinks();
            },
            onFailure: function() {
                alert('Your Sample Request has failed. Please try again.');
            }
        });
        return false;
    };
    $('SampleFirstName').focus();
}

if (typeof( HTMLElement ) != 'undefined') {
    HTMLElement.prototype.click = function() {
        var oEvent = document.createEvent("MouseEvents");
        oEvent.initEvent("click", true, true);
        var blnRet = this.dispatchEvent(oEvent);
        if(window.event === undefined) return; // prevent errors for events like faux clicks
        if (blnRet || typeof event.returnValue == "boolean" && event.returnValue) {
            var elRoot = this;
            while (elRoot) {
                if (elRoot.tagName == "A" && elRoot.href != "") {
                    if(elRoot.target) { 
                        window.open(elRoot.href, elRoot.target);
                    } else {
                        document.location = elRoot.href;
                        elRoot = null;
                    }
                }
            }
        } else { 
            elRoot = elRoot.parentElement;
        }
    }
}
