function AjaxFileUpload(params)
{
    var baseLink = params.baseLink;
    var serviceName = params.serviceName;
    var input = params.input;
    var callback = params.callback;

    var serviceParamsArray = [];


    function findCommonParent(obj) {
        var pObjs = $(obj).parents();
        var i, j, c;

        for (i = 0; i < pObjs.length - 1; i++) {
            c = $("*", pObjs[i]).filter(function () {
                var flag = false;
                for (j = 0; j < obj.length; j++) {
                    if (this === obj[j]) {
                        flag = true;
                        break;
                    }
                }
                return flag;
            });
            if (c.length === obj.length) {
                break;
            }
        }

        return pObjs[i];
    }

    var form = $('<form action="' + baseLink + '" method="post" enctype="multipart/form-data"></form>');
    form.submit(function () {
        return AIM.submit(this, {'onComplete' : callback});
    });

    if (input.length && input.length > 1) {
        var pObj = findCommonParent(input);
        var cObj = $(pObj).children();
        $(pObj).append(form);
        $(form).append(cObj);
    } else {
        $(input).before(form);
        form.append(input);
    }

    form.append('<input type="hidden" name="command" value="' + serviceName + '" />');

    this.setServiceParameters = function(parameters) {
        serviceParamsArray = parameters;
    };

    this.upload = function() {
        var i;
        for (i = 0; i < serviceParamsArray.length; i++) {
            form.append('<input type="hidden" name="sp" value="' + serviceParamsArray[i] + '" />');
        }
        form.submit();
    };
}

/**
 *
 *  AJAX IFRAME METHOD (AIM)
 *  http://www.webtoolkit.info/
 *
 */
var AIM = {

    frame: function(c) {
        var n = 'f' + Math.floor(Math.random() * 99999);
        var d = document.createElement('div');
        d.innerHTML = '<iframe style="display:none" src="about:blank" id="'+n+'" name="'+n+'" onload="AIM.loaded(\''+n+'\')"></iframe>';
        document.body.appendChild(d);

        var i = document.getElementById(n);
        if (c && typeof c.onComplete === 'function') {
            i.onComplete = c.onComplete;
        }

        return n;
    },

    form: function(f, name) {
        f.setAttribute('target', name);
    },

    submit: function(f, c) {
        AIM.form(f, AIM.frame(c));
        if (c && typeof c.onStart === 'function') {
            return c.onStart();
        } else {
            return true;
        }
    },

    loaded: function(id) {
        var i = document.getElementById(id), d;
        if (i.contentDocument) {
            d = i.contentDocument;
        } else if (i.contentWindow) {
            d = i.contentWindow.document;
        } else {
            d = window.frames[id].document;
        }
        if (d.location.href === "about:blank") {
            return;
        }

        if (typeof i.onComplete === 'function') {
            i.onComplete(d.body.innerHTML);
        }
    }
};