/* Communication Manager
 *
 * Requirements:
 *   - jQuery 1.2 or newer
 */

function CommunicationManagerSingleton() {
}

CommunicationManagerSingleton.prototype.get = function(url, data, callback) {
    return $.get(url, data, callback)
}

CommunicationManagerSingleton.prototype.post = function(url, data, callback) {
    return $.post(url, data, callback)
}

CommunicationManagerSingleton.prototype.getPaneContent = function(obj, url, data, callback) {
    if (!obj) return;
    obj.empty();

    // Make a throbber
    $('<div><img src="/icons/busy.gif"></div>').css("margin-top", "50%")
        .css("text-align", "center").appendTo(obj);

    return CommunicationManager.get(
        url, data, function(data, status) {
            if(typeof data == "string") obj.html(data);
            if (callback) {
                callback.call(this, data, status);
            }
        });
}

//
// Form management functions
//
CommunicationManagerSingleton.prototype.prepareForm = function(formname, url, callback) {
    $("form[name=" + formname + "]").bind('submit',
        { "url": url,
          "callback": callback,
          "name": formname }, 
        CommunicationManager.postForm);
}

CommunicationManagerSingleton.prototype.postForm = function(e) {
    var form = this;
    var data = new Object;

    e.preventDefault();

    $(form).find(":submit").each( function(i) {
        // Disable and add a little throbber
        this.disabled = true;
        $('<div><img src="/icons/busy.gif" width="16"></div>')
            .addClass("throbbersm")
            .css("padding-left", "5px")
            .css("display", "inline")
            .insertAfter( $(this) );
    } );

    for (var i=0; i<form.elements.length; ++i) {
        var el = form.elements[i];
        switch(el.type) {
            case "text":
            case "password":
            case "hidden":
                data[ el.name ] = el.value;
                break;
            case "checkbox":
                if (el.checked)
                    data[ el.name ] = el.value;
                break;
            default:
                if (el.tagName.toLowerCase() == 'textarea')
                    data[ el.name ] = el.value;
                else if (el.tagName.toLowerCase() == 'select')
                    data[ el.name ] = el.options[el.selectedIndex].value;
        }
    }

    var name = e.data.name;
    var callback = e.data.callback;

    return $.ajax({
                    url: e.data["url"],
                    data: data,
                    success: function(data, status) {
                        CommunicationManager.showFormSuccess(data, status, name, form, callback);
                    },
                    error: function(data, status, err) {
                        CommunicationManager.showFormError("error", name, form)
                    }
                 });
}

CommunicationManagerSingleton.prototype.showFormSuccess = function(data, status, name, form, callback) {
    if (form) {
        $(form).find(":submit").each( function(i) {
            this.disabled = false;
        } );
        $(form).find(".throbbersm").remove();
        $(form).find("label").parent().removeClass("missed");
    }

    var elem = data.documentElement;
    if (elem && elem.tagName == 'result') {
        var error_msg = elem.getAttribute('error_msg');
        var missed = elem.getAttribute('missed');
        var success = elem.getAttribute('success');
        if (error_msg) {
            CommunicationManager.showFormError(error_msg, missed, name, form);
        } else {
            if (success) {
                $("#" + name + "_errormsg").hide()
                                            .children().hide();
                $("#" + name + "_success").hide();
                $("#" + name + "_success").fadeIn("normal");
                window.scrollTo(0,0);
            }
        }
    }

    if (callback)
        callback(data, status);
}

CommunicationManagerSingleton.prototype.showFormError = function(msg, missed, name, form) {
    if (form) {
        $(form).find(":submit").each( function(i) {
            this.disabled = false;
        } );
        $(form).find(".throbbersm").remove();

        $(form).find("label").parent().removeClass("missed");
        if (missed) {
            missed = missed.split(",");
            for (i=0; i<missed.length; ++i) {
                var m = missed[i];
                $(form).find("label[for$=" + m + "]").parent().addClass("missed");
            }
        }
    }

    if (msg) {
        $("#" + name + "_success").hide();
        $("#" + name + "_errormsg_" + msg).parent().hide()
                                           .children().hide();
        $("#" + name + "_errormsg_" + msg).show()
                                           .parent().fadeIn("normal");
        window.scrollTo(0,0);
    }

}

CommunicationManagerSingleton.prototype.ajaxSubmitter = function(elem,form){
    elem.before("<span class=\"button_green_start\"></span>")
        .after("<span class=\"button_green_end\"></span>")
        .bind('click',function(){$("form[name=" + form + "]").triggerHandler("submit")})
        .hover(
            function () { $(this).addClass("show_pointer"); },
            function () { $(this).removeClass("show_pointer"); }
         );
}

CommunicationManagerSingleton.prototype.formSubmitter = function(elem,form){
    elem.before("<span class=\"button_green_start\"></span>")
        .after("<span class=\"button_green_end\"></span>")
        .bind('click',function(){$("form[name=" + form + "]").trigger("submit")})
        .hover(
            function () { $(this).addClass("show_pointer"); },
            function () { $(this).removeClass("show_pointer"); }
         );
}

// Create the Communication Manager when the document is "ready"
$(document).ready(function() {
    if (typeof CommunicationManager == 'undefined') CommunicationManager = new CommunicationManagerSingleton();
})



/*###############Copyright##################
 *####   Copyright 2008 Texterity, Inc  ####
 *###############Copyright##################
 */
