diff options
Diffstat (limited to 'static/functions/class_ajax.js')
-rw-r--r-- | static/functions/class_ajax.js | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/static/functions/class_ajax.js b/static/functions/class_ajax.js new file mode 100644 index 0000000..e1d4611 --- /dev/null +++ b/static/functions/class_ajax.js @@ -0,0 +1,116 @@ +/* + TODO: Further optimize serialize function + + UPDATE: We were forced to create an individual XHR for each request + to avoid race conditions on slower browsers where the request would + be overwritten before the callback triggered, and leave it hanging. + This only happened in FF3.0 that we tested. + + Example usage 1: + ajax.handle = function () { + $('#preview' + postid).raw().innerHTML = ajax.response; + $('#editbox' + postid).hide(); + } + ajax.post("ajax.php?action=preview","#form-id" + postid); + + Example usage 2: + ajax.handle = function() { + $('#quickpost').raw().value = "[quote="+username+"]" + ajax.response + "[/quote]"; + } + ajax.get("?action=get_post&post=" + postid); + +*/ +"use strict"; +var json = { + encode: function (object) { + try { + return JSON.stringify(object); + } catch (err) { + return ''; + } + }, + decode: function (string) { + if (window.JSON && JSON.parse) { + return JSON.parse(string); + } else { + return eval("(" + string + ")"); + //return (new Function("return " + data))(); + } + } +}; + +var ajax = { + get: function (url, callback) { + var req = (typeof(window.ActiveXObject) === 'undefined') ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); + if (callback !== undefined) { + req.onreadystatechange = function () { + if (req.readyState !== 4 || req.status !== 200) { + return; + } + callback(req.responseText); + }; + } + req.open("GET", url, true); + req.send(null); + }, + post: function (url, data, callback) { + var req = isset(window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(); + var params = ajax.serialize(data); + if (callback !== undefined) { + req.onreadystatechange = function () { + if (req.readyState !== 4 || req.status !== 200) { + return; + } + callback(req.responseText); + }; + } + req.open('POST', url, true); + req.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + req.send(params); + }, + serialize: function (data) { + var query = '', + elements; + if (is_array(data)) { + for (var key in data) { + query += key + '=' + encodeURIComponent(data[key]) + '&'; + } + } else { + elements = document.getElementById(data).elements; + for (var i = 0, il = elements.length; i < il; i++) { + var element = elements[i]; + if (!isset(element) || element.disabled || element.name === '') { + continue; + } + switch (element.type) { + case 'text': + case 'hidden': + case 'password': + case 'textarea': + case 'select-one': + query += element.name + '=' + encodeURIComponent(element.value) + '&'; + break; + case 'select-multiple': + for (var j = 0, jl = element.options.length; j < jl; j++) { + var current = element.options[j]; + if (current.selected) { + query += element.name + '=' + encodeURIComponent(current.value) + '&'; + } + } + break; + case 'radio': + if (element.checked) { + query += element.name + '=' + encodeURIComponent(element.value) + '&'; + } + break; + case 'checkbox': + if (element.checked) { + query += element.name + '=' + encodeURIComponent(element.value) + '&'; + } + break; + } + } + } + return query.substr(0, query.length - 1); + } +}; |