var importHandlerHolder;
var importNewWindow = false;
var importCallback = null;
var importErrorCallback = null;

// Maps importhandlers to a document-level map so
// they can be accessed from a timeout, e.g.
document.importHandlerMap = {};

function ImportHandler() {
    this.noImportProgressMapFoundCounter = 0;
    this.noUploadProgressMapFoundCounter = 0;

    var getRandIdentifier = function() {
        var LEN = 8;
        var chars = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890'.split('');

        var i = 0;
        var str = '';

        while(i++ < LEN) {
            str += chars[Math.floor(Math.random() * chars.length)];
        }

        return str;
    };

    this.init = function() {
        importHandlerHolder = this;
        importHandlerHolder.resetProgressBar();

        try {
            var safeCount = 0;
            var identifier;

            do {
                identifier = getRandIdentifier();
            } while(document.importHandlerMap[identifier] && safeCount++ < 100);

            this.identifier = identifier;
            document.importHandlerMap[this.identifier] = this;
        } catch(e) {
            // ignore
        }
    };

    this.openToNewWindow = function() {
        importNewWindow = true;
    }

    this.setImportCallback = function(callback) {
        importCallback = callback;
    }

    this.setImportErrorCallback = function(callback) {
        importErrorCallback = callback;
    }

    this.showImportProgressBar = function() {
        this.showImportProgressBar(false,{});
    }

    this.showImportProgressBar = function(massImport, opts) {
        var time = new Date().getTime();
        var url = lvinumero_import_import_info;
        var timeOut = 500;
        if ( massImport ) {
            url = lvinumero_mass_import_import_info;
            timeOut = 100;
        }

        var squelchCallbacks = false;

        try {
            if(opts['squelchCallbacks']) {
                if(opts['squelchCallbacks'] === 'true' || opts['squelchCallbacks'] === true) {
                    squelchCallbacks = true;
                }
            }
        } catch(e) {
            // ignore
        }

        jQuery.getJSON(
            url + "?t=" + time,
            function(data) {
                var s = data.itemsRead;
                s += "/" + data.totalItems;
                s += " (" + data.status + ")";

                //alert(s);

                if(data.failReason && data.failReason == 'No ProgressMap found!') {
                    if(this.noImportProgressMapFoundCounter++ < 10) {
                        setTimeout("importHandlerHolder.showImportProgressBar("+massImport+", {'squelchCallbacks': "+squelchCallbacks+"})",timeOut);
                    } else {
                        this.noImportProgressMapFoundCounter = 0;
                    }
                } else {
                    importHandlerHolder.updateProgressBar("importProgressBar",data.itemsRead, data.totalItems);
                    if (data.status == null || data.status == lvinumero_import_status_uploading) {
                        setTimeout("importHandlerHolder.showImportProgressBar("+massImport+", {'squelchCallbacks': "+squelchCallbacks+"})",timeOut);
                    }
                    else {
                        if (data.status == lvinumero_import_status_failed && importErrorCallback) {
                            if(squelchCallbacks === false) {
                                importErrorCallback(data);
                            }
                            
                            jQuery("#overlayUploadIndicator").hide();
                        }
                        else if (data.status = lvinumero_import_status_done) {
                            if (importCallback != null) {
                                if(squelchCallbacks === false) {
                                    importCallback();
                                }

                                jQuery("#overlayUploadIndicator").hide();
                            }
                            else if (importNewWindow) {
                                jQuery("#overlayUploadIndicator").hide();
                                window.open(lvinumero_base_url + data.forwardUrl);
                            }
                            else {
                                window.location = lvinumero_base_url + data.forwardUrl;
                            }
                        }
                    }
                }
            }
        );
    };

    this.showUploadProgressBar = function() {
        this.showUploadProgressBar(false);
    }

    this.showUploadProgressBar = function(massImport) {
        var time = new Date().getTime();
        var url = lvinumero_import_upload_info;
        var timeOut = 500;
        if ( massImport ) {
            url = lvinumero_mass_import_upload_info;
            timeOut = 100;
        }
        
        jQuery.getJSON(
            url + "?t=" + time,
            function(data) {
                if(data.failReason && data.failReason == 'No ProgressMap found!') {
                    if(this.noUploadProgressMapFoundCounter++ < 10) {
                        setTimeout("importHandlerHolder.showUploadProgressBar("+massImport+")",timeOut);
                    } else {
                        this.noUploadProgressMapFoundCounter = 0;
                    }
                } else {
                    var s = data.bytesRead;
                    s += "/" + data.totalSize;
                    s += " (" + data.status + ")";
                    if ( massImport ) {
                        importHandlerHolder.updateProgressBar("uploadProgressBar",data.filesRead, data.totalFiles);
                    } else {
                        importHandlerHolder.updateProgressBar("uploadProgressBar",data.bytesRead, data.totalSize);
                    }
                    if (data.status == null || data.status != lvinumero_import_status_done) {
                        setTimeout("importHandlerHolder.showUploadProgressBar("+massImport+")",timeOut);
                    }
                }
            }
        );
    };

    this.updateProgressBar = function(progressBarName, current, total) {
        var progressBar = jQuery('#' + progressBarName);
        var indicator = jQuery('#' + progressBarName + 'Indicator');
        var count = jQuery('#' + progressBarName + 'Count');

        var p = 0;

        if(total != 0) {
            p = current/total;
        } else {
            p = 1;
        }

        var pBarWidth = progressBar.width();

        if(isNaN(pBarWidth) || pBarWidth == '') {
            pBarWidth = 1;
        }

        var px = parseInt(pBarWidth * p);
        var i = parseInt(p * 100, 10);
        indicator.width(px);

        if(isNaN(i) || i == '') {
            i = 0;
        }

        count.html(i + "%");
    };

    this.resetProgressBar = function() {
        jQuery("#importProgressBarIndicator").width(0);
        jQuery("#uploadProgressBarIndicator").width(0);
    };
}
