function ajax(url, post, callback, callbackParams) {
    var request = false;
    // Mozilla/Safari 
    if (window.XMLHttpRequest) {
        request = new XMLHttpRequest();
    }
    // IE
    else if (window.ActiveXObject) {
        request = new ActiveXObject("Microsoft.XMLHTTP");
    }
    request.open('POST', url, true);
    request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    request.onreadystatechange = function() {
        if (request.readyState == 4) {
            if(callback) {
                if(callbackParams) {
                    callbackParams.unshift(request.responseText);
                    callback.apply(null, callbackParams);
                }

                else {
                    callback(request.responseText);
                }
            }
        }
    };
    request.send(post);
    //wait
}



function sjax(url, post, callback) {
    var request = false;

    // Mozilla/Safari
    if (window.XMLHttpRequest) {
        request = new XMLHttpRequest();
//        if (request.overrideMimeType) {
//           request.overrideMimeType('text/xml');
           // See note below about this line
//        }
    } else if (window.ActiveXObject) {
        request = new ActiveXObject("Microsoft.XMLHTTP");
    }
    request.open('POST', url, false);
    request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    var done = request.send(post);

    if(callback){
        callback(request.responseText);
    }

    return request.responseText;
}

function sjaxCallback(v, obj) {
    if (!window.jQuery || obj.div==null) {
        return;
    }
    jQuery(obj.div).html(v);
    jQuery(document).trigger("ajaxFill", obj.div);
}

//We ask them to include the secureAppUrlString, so that this code doesn't have to be a generated jsp, and so that it will be cached by the browser...
function crossSiteAjaxFillDiv(secureAppUrlString, divName, remotePage, post, skipTemp){
	//Create url for script tag hack...
	var scriptTagSrcUrl = secureAppUrlString;
	scriptTagSrcUrl += '/js/ScriptTagAjax.jsp?';
	var remotePageParts = remotePage.split("?");
	var remotePageParams = '';
	while(remotePageParts.length > 1){
		remotePageParams += '&' + remotePageParts.pop();	
	}	
	scriptTagSrcUrl += 'requestedPage=' + remotePageParts.pop() + '&' + remotePageParams + '&';
	scriptTagSrcUrl += 'fillDivId=' + divName + '&';
	//Append a timestamp to the src tag...
	scriptTagSrcUrl += 'time=' + new Date().getTime() + '&';
	scriptTagSrcUrl += post;
	//create the script tag somewhere...
	var script = jQuery('<script>'); 
	script.attr('src', scriptTagSrcUrl); 		
	jQuery("body").prepend(script);
	//Cross Fingers...
}

function ajaxFillDiv(divName, remotePage, post, skipTemp) {
    var div = document.getElementById(divName);
    if (div == null) {
        return;
    }
    if(!skipTemp) {
        div.innerHTML = "<table><tr><td><img src=\"/slices/waiting.gif\"></td><td>Loading...</td></tr></table>";
    }
    sjax(remotePage, post, function(v) {
        sjaxCallback(v, {divName: divName, div: div});
    });
}

function ajaxFillDivAsync(divName, remotePage, post, skipTemp) {
    if (del(divName) == null) {
        return;
    }
    if(!skipTemp) {
        del(divName).innerHTML = "<table><tr><td><img src=\"/slices/waiting.gif\"></td><td>Loading...</td></tr></table>";
    }
    ajax(remotePage, post, function(v) {
        try {
            var x = /<script.*>((.|\s)*?)<\/script>/gi;
            var ss = v.match(x);
            v = v.replace(x, "");
            document.getElementById(divName).innerHTML = v;
            if(ss != null) {
                for(i=0; i<ss.length; i++) {
                    try {
                        eval(ss[i].replace(x, "$1"));
                    } catch(evalE){
                        //alert("Ajax error 1a: " + evalE.message + ":" + ss[i].replace(x, "$1"));
                    }
                }
            }
        } catch(error) {
            alert("Ajax error 2a: " + error.message + ":" + divName);
        }

    });
}

function ajaxSetFld(fld, remotePage, post) {
   ajax(remotePage, post, function(v) {
        try {
            document.getElementById(fld).value = v;
        } catch(error) {
            alert("Ajax error 2a: " + error.message + ":" + fld);
        }
    });
}

function ajaxQs(fldAry) {
    var post = "";
    for(var fld in fldAry) {

        var el = del(fld);
        if(el) {
            post += fld;

        }
    }
}

function ajaxDiv(divName, prefix, qs) {
    ajaxFillDiv(divName, prefix + "/" + divName + ".jsp?" + qs, null, true);
}

Infusion('Ajax');

Infusion.Ajax.ajaxSubmit = function(options) {

    var id = "";

    if(!options.id) {
        throw "Form ID not provided";
    }

    else {
        id = options.id;
    }

    Infusion.UI.setMessage('<img src="/slices/waiting.gif" class="ajax-saving">&nbsp;Saving...');
    
    var dataType = options.dataType? options.dataType : "json";
    var successHandler = options.successHandler ? options.successHandler :
                                                  function(data) {
                                                    Infusion.UI.setMessage(data["msg"], "success");

                                                      if(data["redirect"]) {                                                          
                                                          setTimeout(function() {
                                                              window.location = data["redirect"];
                                                          }, 1500);
                                                      }
                                                  };
    var errorHandler = options.errorHandler ? options.errorHandler :
                                              function(XMLHttpRequest, textStatus, errorThrown) {
                                                  var msg = "There was an error while saving your settings (" + textStatus + ", " + errorThrown + ")";
                                                  Infusion.UI.setMessage(msg, "warning");
                                              };
    var serializedData = jQuery("#" + id).serialize();
    var url = jQuery("#" + id).attr("action");
    
    jQuery.ajax({
        url: url,
        type: "POST",
        data: serializedData,
        cache: false,
        dataType: dataType,
        success: successHandler,
        error: errorHandler
    });
};
