﻿var helper = {};
helper.mvc = {};
$(function() {

    helper.mvc.init();
});

helper.mvc.init = function(container) {
    $("*[rel='ajax']", container).each(function() {
        var elm = $(this);
        var href = elm.attr('href');
        var cb = elm.attr('cb');
        var target = elm.attr('target');

        this.href = "javascript:helper.ajaxCallback('" + href + "','" + target + "','" + cb + "');";
    });


    $("*[rel='autopostback']", container).each(function() {
        var elm = $(this);

        switch (this.tagName) {
            case 'SELECT':
                elm.bind('change', { elm: elm }, helper.autoPostback);
                break;
        }

    });

    helper.mvc.partial.init(container);
    helper.mvc.serialize.init(container);
    helper.mvc.postToIframe.init(container);
}

helper.ajaxCallback = function(url, target, cb) {

    function success(data) {
        if (target != '' && data != undefined && data != '')
            $(target).html(data);
        else
            alert(data);

        if (cb != undefined) {
            eval(cb);
        }
    }

    $.get(url, success);
}

helper.autoPostback = function(e) {
    e.data.elm.parents().filter('form')[0].submit();

}

helper.addElement = function(selector, html) {
    var elm = $(html);
    elm.appendTo($(selector));
}


helper.mvc.partial = function(e) {

    var data = e.data;
    function complete(res) {

        var container = data.attr('container');
        if (container == undefined) {
            var parent = data.parents().filter("*[container]");
            if (parent.length > 0) {
                container = parent.attr('container');
                if (container == 'this')
                    container = parent;
            }
        }


        //callback
        var callback = data.attr('callback');
        if (callback == undefined) {
            var parent = data.parents().filter("*[callback]");
            if (parent.length > 0) {
                callback = parent.attr('callback');
            }
        }

        //onSuccess
        var onSuccess = data.attr('onSuccess');
        if (onSuccess == undefined) {
            var parent = data.parents().filter("*[onSuccess]");
            if (parent.length > 0) {
                onSuccess = parent.attr('onSuccess');
            }
        }

        if (container != undefined) {
            container = $(container);
            if (container != undefined) {

                var base = function() {
                    container.html(res);
                }

                if (callback != undefined) {

                    try {

                        var fn = new Function("container", "res", "elm", "base", callback);
                        fn(container, res, data, base);
                    } catch (e) { }

                }
                else {

                    base();

                }
                
                //todo: on success not working.
                if (onSuccess != undefined) {

                    try {
                        var fn = new Function("res", onSuccess);
                        fn({ container: container, data: res });
                    } catch (e) { }

                }

                helper.mvc.init(container);
            }
        }

    }
    try {

        var method = e.data.attr('method');
        if (method == undefined) {
            var parent = e.data.parents().filter("*[method]");
            if (parent.length > 0) {
                method = parent.attr('method');
            }
        }

        if (method == undefined) method = "get";

        var url = e.data.attr('url');

        if (method == 'get')
            $.get(url, complete);
        else {
            var form = e.data.parents().filter('form');
            if (form == undefined) return;
            url = form.attr('action');

            $.post(url, form.serialize(), complete);





        }
    } catch (ex) {
        alert(ex);
    }

    return false;
}
helper.mvc.partial.init = function(container) {

    $("*[rel='mvc.partial']", container).each(function() {
        var elm = $(this);
        elm.bind('click', elm, helper.mvc.partial);

    });
}

helper.mvc.serialize = function(e) {
    var postData = e.data.serialize();

    function complete(res) {

        var container = e.data.attr('container') || e.data;
        var callback = e.data.attr('callback');


        if (container != undefined) {
            container = $(container);
            if (container != undefined) {
                if (callback != undefined) {

                    try {
                        var fn = new Function("container", "res", callback);
                        fn(container, res);
                    } catch (e) { }

                }
                else {
                    e.data.html(res);
                }

                helper.mvc.init(container);
            }
        }
    }

    var onStart = e.data.attr("onstart");

    if (onStart != undefined) {
        try {
            var fn = new Function("container", onStart);
            fn(e.data);
        } catch (e) { }
    }

    setTimeout(function() {
        var action = e.data.attr("action");

        if (action != undefined)
            $.post(action, e.data.serialize(), complete);
    }, 500);

    return false;
}
helper.mvc.serialize.init = function(container) {
    $("form[rel='mvc.serialize']", container).each(function() {
        var elm = $(this);
        elm.bind('submit', elm, helper.mvc.serialize);

    });
}

helper.mvc.postToIframe = function(e) {
    var iframeName = new Date().getTime();
    var iframe = $('<iframe/>').attr('name', iframeName).css('display', 'none').appendTo('body');
    e.data.attr('target', iframeName);

    iframe.bind('load', function() {
        helper.mvc.postToIframe.iframeLoadCallback({ iframe: iframe, form: e.data, body:  iframe.contents().find('body').html() });
    });
}

helper.mvc.postToIframe.iframeLoadCallback = function(e) {

    var callback = e.form.attr('callback');

    if (callback != undefined) {
        var fn = new Function("e", callback);
        fn(e);
    }
    e.iframe.remove();
}

helper.mvc.postToIframe.init = function(container) {
    $("form[rel='mvc.postToIframe']", container).each(function() {
        var elm = $(this);
        elm.bind('submit', elm, helper.mvc.postToIframe);

    });
}


