var is_empty = function(v){return typeof(v) == 'undefined' || undefined==v || null==v || ''==v;}

var is_function = function(f) { return typeof(f) == 'function'; }

var my_ajax = function(args){
    var url = args.url || "";
    var params = args.params || "";
    var error_fn = args.error_fn || "";
    var on_error_fn = args.on_error_fn || "";
    var after_fn = args.after_fn || "";
    var before_ajax_fn = args.before_ajax_fn || "";
    var max_timeout;
    var second = 1000;
    if (args.no_timeout){
        max_timeout = 999 * second;
    } else {
        max_timeout = 50 * second;
    }
    
    if (before_ajax_fn){
        before_ajax_fn();
    }
    
    $.ajax({
        type: "POST",
        url: url,
        data: {params: params},
        'dataType': 'json',
        success: function(result) {
            if (!result || result.code != "OK") {
                if (on_error_fn)
                    on_error_fn(result);
                else {
                    alert('Logic error');
                }
            } else if (result.redirection == "INNER"){
                if (!is_empty(after_fn)) {
                    after_fn(result);
                }
                if (result.success_div){
                    $("#" + result.success_div).show();
                    $("." + result.success_div).show();
                }
                
                if (result.redirection_position){
                    if ("AFTER" == result.redirection_position){
                        $("#" + result.success_div).after(result.inner_html);
                        $("." + result.success_div).after(result.inner_html);
                    } else if ("INSIDE" == result.redirection_position){
                        $("#" + result.success_div).html(result.inner_html);
                        $("." + result.success_div).html(result.inner_html);
                    };
                } else {
                    if (result.success_div){
                        $("#" + result.success_div).html(result.inner_html);
                        $("." + result.success_div).html(result.inner_html);
                    }
                }

                if (result.succes_div_timeout){
                    console.debug(result.succes_div_timeout);
                    setTimeout(function(){
                        $("#" + result.success_div).hide('slow');
                        $("." + result.success_div).hide('slow');
                    }, result.succes_div_timeout);
                }
                    
                return false;
            }
            else if (result.redirection == "REDIRECT"){
                if (!is_empty(after_fn)){
                    after_fn();
                }

                outofpage_allow_to_exit = true;
                window.location = result.success_url;
                return false;
            }
        },
        error: function(req, message, error) {
            if (error_fn) 
                error_fn(req);
            else
                if (message == "timeout")
                    alert("timeout occurs, check your internet connection and try again later");
                else {
                    console.warn('http error: ' + message);
                }
        },
        timeout: max_timeout
    });
};

