var HybridBlobTestUtil = function(testFunc, opt_filePaths, opt_useOpenPanel) {
    this.testCallbackFunc = testFunc;

    this.testFilePaths = opt_filePaths;
    this.testUseOpenPanel = opt_useOpenPanel;
    this.testFiles = [];
    this.testFileMap = {};
    this.fileInput = null;

    this.dragBaseDir = "";
    this.urlPathBaseDir = "";

    this.testUrl = "http://127.0.0.1:8000/resources/post-and-verify-hybrid.cgi";

    this.uploadBlob = function(blob, urlParameter)
    {
        var xhr = new XMLHttpRequest();
        xhr.open("POST", this.testUrl + "?" + urlParameter, false);

        var passed;
        var message;
        try {
            xhr.send(blob);
            if (xhr.responseText == "OK") {
                passed = true;
                message = "Expected response data received: " + xhr.responseText;
            } else {
                passed = false;
                message = "Unexpected response data received: " + xhr.responseText;
            }
        } catch (ex) {
            passed = false;
            message = "Unexpected exception thrown: " + ex;
        }

        if (passed)
            testPassed(message);
        else
            testFailed(message + ' params:' + urlParameter);
    };

    this.onInputFileChange = function()
    {
        var files = document.getElementById("file").files;
        this.testFiles = new Array();
        for (var i = 0; i < files.length; i++) {
            this.testFiles.push(files[i]);
            this.testFileMap[testFilePaths[i]] = files[i];
        }
        this.testCallbackFunc();
    };

    this.setupForTests = function()
    {
        this.fileInput = document.createElement("input");
        this.fileInput.id = "file";
        this.fileInput.type = "file";
        this.fileInput.style.width = "100px";
        this.fileInput.style.height = "100px";
        this.fileInput.multiple = true;
        var obj = this;
        this.fileInput.addEventListener("change", function() { obj.onInputFileChange() }, false);
        document.body.insertBefore(this.fileInput, document.body.firstChild);

        if (this.dragBaseDir) {
            var filePaths = [];
            for (var i = 0; i < this.testFilePaths.length; ++i) {
                filePaths.push(this.dragBaseDir + this.testFilePaths[i]);
            }
            this.testFilePaths = filePaths;
        }
    };

    this.runTestsWithDrag = function()
    {
        this.setupForTests();

        eventSender.beginDragWithFiles(this.testFilePaths);
        eventSender.mouseMoveTo(10, 10);
        eventSender.mouseUp();
    };

    this.runTestsWithOpenPanel = function()
    {
        this.setupForTests();

        testRunner.setOpenPanelFiles(this.testFilePaths);
        UIHelper.activateAt(10, 10);
    };

    this.runTests = function() {
        if (!this.testCallbackFunc)
            testFailed("Test body function is not initialized.");
        else if (!this.testFilePaths)
            this.testCallbackFunc();
        else if (this.testUseOpenPanel)
            this.runTestsWithOpenPanel();
        else
            this.runTestsWithDrag();
    };

    this.FileItem = function(path)
    {
        var item = new Object();
        item.type = 'file';
        item.path = path;
        item.value = this.testFileMap[path];
        return item;
    }

    this.DataItem = function(data)
    {
        var item = new Object();
        item.type = 'data';
        item.value = data;
        return item;
    }

    this.createItemParamArray = function(items, itemParams, opt_ending)
    {
        for (var i = 0; i < items.length; i++) {
            if (items[i] instanceof Array)
                this.createItemParamArray(items[i], itemParams, opt_ending);
            else if (items[i].type == "data") {
                var data = items[i].value;
                if (opt_ending)
                    data = data.replace(/\r\n/g, "[NL]").replace(/[\n\r]/g, "[NL]");
                itemParams.push("data:" + escape(data));
            } else if (items[i].type == "file")
                itemParams.push("file:" + this.urlPathBaseDir + items[i].path);
        }
    };

    this.createUrlParameter = function(items, opt_range, opt_ending)
    {
        var itemParams = [];
        this.createItemParamArray(items, itemParams, opt_ending);
        var urlParameter = "items=" + itemParams.join(",");
        if (opt_range) {
            urlParameter += "&start=" + opt_range.start;
            urlParameter += "&length=" + opt_range.length;
        }
        if (opt_ending)
            urlParameter += "&convert_newlines=1";
        return urlParameter;
    };

    this.appendAndCreateBlob = function(items, opt_ending, opt_type)
    {
        var builder = [];
        for (var i = 0; i < items.length; i++) {
            if (items[i] instanceof Array) {
                // If it's an array, combine its elements and append as a blob.
                builder.push(this.appendAndCreateBlob(items[i], opt_ending, opt_type));
            } else
                builder.push(items[i].value);
        }
        var options = {};
        if (opt_ending)
            options.endings = opt_ending;
        if (opt_type)
            options.type = opt_type;
        return new Blob(builder, options);
    };
};
