aboutsummaryrefslogtreecommitdiffstats
path: root/js/jquery.htmlstream.js
blob: c62c538f775bb20c365506096b4d28b1cfb43ded (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/* 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;
        }
		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);