/* jQuery ajax stream plugin * Version 0.1 * Copyright (C) 2009 Chris Tarquini * Licensed under a Creative Commons Attribution-Share Alike 3.0 Unported License (http://creativecommons.org/licenses/by-sa/3.0/) * Permissions beyond the scope of this license may be available by contacting petros000[at]hotmail.com. */ (function($) { // Save the original AJAX function var ajax_old = $.ajax; var get_old = $.get; var post_old = $.post; var active = true; // Add our settings $.ajaxSetup({stream: false,pollInterval: 500/*, onDataRecieved: function(){}*/ }); $.enableAjaxStream = function(enable) { if(typeof enable == 'undefined') enable = !active; if(!enable) { $.ajax = ajax_old; $.get = get_old; $.post = post_old; active = false; } else { $.ajax = ajax_stream; $.get = ajax_get_stream; $.post = ajax_post_stream; active = true; } } var ajax_stream = $.ajax = function(options) { //copied from original ajax function options = jQuery.extend(true, options, jQuery.extend(true, {}, jQuery.ajaxSettings, options)); if(options.stream) { var timer = 0; var offset = 0; var xmlhttp = null; var lastlen = 0; var done = false; var hook = function(xhr) { xmlhttp = xhr; checkagain(); } var fix = function(){ check('stream'); };// fixes weird bug with random numbers as arg var checkagain = function(){if(!done) timer = setTimeout(fix,options.pollInterval);} var check = function(status) { if(typeof status == 'undefined') status = "stream"; if(xmlhttp.status < 3) return; //only get the latest packet if data has been sent var text = xmlhttp.responseText; if(status == 'stream') //if we arent streaming then just flush the buffer { if(text.length <= lastlen) { checkagain(); return;} lastlength = text.length; if(offset == text.length) { checkagain(); return;} } var pkt = text.substr(offset); offset = text.length; if($.isFunction(options.OnDataRecieved)) { options.OnDataRecieved(pkt, status, xmlhttp.responseText, xmlhttp); } if(xmlhttp.status != 4) checkagain(); } var complete = function(xhr,s) { clearTimeout(timer);//done..stop polling done = true; // send final call check(s); } // If the complete callback is set create a new callback that calls the users and outs if($.isFunction(options.success)) { var oc = options.success; options.success = function(xhr,s){ complete(xhr,s); oc(xhr,s);}; } else options.success = complete; // Set up our hook on the beforeSend if($.isFunction(options.beforeSend)) { var obs = options.beforeSend; options.beforeSend = function(xhr){ obs(xhr); hook(xhr);}; } else options.beforeSend = hook; } ajax_old(options); } var ajax_get_stream = $.get = function(url,data,callback,type,stream) { if($.isFunction(data)) { var orgcb = callback; callback = data; if($.isFunction(orgcb)) { stream = orgcb; } data = null; } if($.isFunction(type)) { stream = type; type = undefined; } var dostream = $.isFunction(stream); return jQuery.ajax({ type: "GET", url: url, data: data, success: callback, dataType: type, stream: dostream, OnDataRecieved: stream }); } var ajax_post_stream = $.post = function(url,data,callback,type,stream) { if($.isFunction(data)) { var orgcb = callback; callback = data; data = {}; if($.isFunction(orgcb)) { stream = orgcb;} } if($.isFunction(type)) { stream = type; type = undefined; } var dostream = $.isFunction(stream); return jQuery.ajax({ type: "POST", url: url, data: data, success: callback, dataType: type, stream: dostream, OnDataRecieved: stream }); } })(jQuery);