AjaMyAjax Site
AjaMyJSON.js source listing
/***
** AjaMyAjax --> JSON functions library
** use with the core AJAX lib routines in ajaMyCore.js.
**
** This software provided "AS IS," but is FREE to use and share.
** For details see the as-is doc and Creative Commons license:
** http://creativecommons.org/licenses/by-sa/3.0/
**
** See doc.txt or examples.html for syntax and more info at
** http://AjaMyAjax.com, (c) Mark Omohundro
*/
pbJSONLibReady = true; // notifies core that lib is available
var pbJSONLibHeader = "[AjaMyAjax JSON Lib]";
this.processJSON = function() {
var jsonData = (arguments[0]) ? arguments[0] : null;
var strcontainer = (arguments[1]) ? arguments[1] : null;
var strSearchElement = (arguments[2]) ? arguments[2] : null;
var stroutputFormat = (arguments[3]) ? arguments[3] : null;
if (jsonData) {
// search for a specific element by passed parameter
// note this is a native JavaScript JSON text parser...
if (strSearchElement) {
// remove quotes and bracketing tick marks only
var srchkey = strSearchElement.replace(/(^'|'$|")/g, "");
if (!srchkey) {
aja_empty(strcontainer);
if (pbshowAlertMsgs) {
aja_alertMsg(pbJSONLibHeader, "Invalid search key parameter");
}
return;
}
// if search string has any quotes, use "as is" for a case sensitive comparison
// (example, pass a string parameter like this for an exact match: '"myString"')
if (srchkey !== strSearchElement) {
var srchtmp = jsonData;
}
else {
// otherwise, will find any match
var srchtmp = jsonData.toLowerCase();
var srchkey = strSearchElement.toLowerCase();
}
var offset = srchtmp.indexOf(srchkey);
if (offset == -1) {
aja_empty(strcontainer);
if (pbshowAlertMsgs) {
aja_alertMsg(pbJSONLibHeader, "Sorry, cannot retrieve data requested: " + strSearchElement);
}
return;
}
var jsonhash = "";
var jsontmp = jsonData;
while (offset != -1) {
var datastart = offset, dataend = offset;
// find start/end of each name/value pair
while (datastart >= 0) {
if (jsontmp.charAt(datastart) == '{') {
break;
}
else datastart--;
}
var jsontmplen = jsontmp.length;
while (dataend < jsontmplen) {
if (jsontmp.charAt(dataend) == '}') {
break;
}
else dataend++;
}
if (dataend > datastart && dataend > 0) {
jsonhash += "{" + jsontmp.substr(datastart + 1, dataend - datastart - 1) + "}";
}
offset = srchtmp.indexOf(srchkey, dataend + 1);
}
// search results now a data subset to transform below
jsonData = jsonhash;
// clean up:
jsonhash = null;
jsontmp = null;
srchkey = null;
srchtmp = null;
offset = null;
datastart = null;
dataend = null;
}
jsonData = json_addAnchorTags(jsonData);
if (stroutputFormat == "HTABLE" || stroutputFormat == "VTABLE" || stroutputFormat == "ULIST") {
// try to format json data into a clean table,
// but there are many possible data formats..
var tablehdr = "<table id='myTableID'>";
if (!strSearchElement) {
var lbracket = jsonData.indexOf("[");
if (lbracket > 0) {
tablehdr += "<th id='myHeaderID'>";
jsonData = jsonData.replace(/\[/, "</th><tr id='myRowID'>");
}
else {
jsonData = jsonData.replace(/\[/g, "<tr id='myRowID'>");
jsonData = jsonData.replace(/\]/g, "</tr>");
}
if (jsonData.substr(0,1) == "{") {
jsonData = tablehdr + jsonData.substr(1, jsonData.length);
jsonData = jsonData.substr(0, jsonData.length-1) + "</table>";
}
else {
jsonData = tablehdr + jsonData + "</table>";
}
}
else {
jsonData = tablehdr + "<tr id='myRowID'>" + jsonData + "</tr></table>";
}
jsonData = jsonData.replace(/\[/g, "<tr id='myRowID'>");
jsonData = jsonData.replace(/\]/g, "</tr>");
jsonData = jsonData.replace(/\{/g, "<td>");
jsonData = jsonData.replace(/\}/g, "</td>");
jsonData = jsonData.replace(/[:,"]/g, "");
tablehdr = null;
if (stroutputFormat == "VTABLE") {
jsonData = jsonData.replace(/\<tr\>/g, "");
jsonData = jsonData.replace(/\<\/tr\>/g, "");
jsonData = jsonData.replace(/\<td\>/g, "<tr>");
jsonData = jsonData.replace(/\<\/td\>/g, "</tr>");
}
if (stroutputFormat == "ULIST") {
// then transform into a basic unordered list
jsonData = jsonData.replace(/(\<table>|\<\/table>)/gi, "");
jsonData = jsonData.replace(/(\<th id='myHeaderID'>)/gi, "<th>");
jsonData = jsonData.replace(/(\<tr id='myRowID'>)/gi, "<tr>");
jsonData = jsonData.replace(/(th>|tr>|td>)/gi, "li>");
jsonData = jsonData.replace(/\<li\>\<\li\>/gi, "<li>");
jsonData = jsonData.replace(/\<\/li\>\<\/li\>/gi, "</li>");
jsonData = jsonData.replace(/\<li\>\<\/li\>/gi, "");
}
}
else {
// transform json data into ordered text
jsonData = jsonData.replace(/"\s+},/g, "<br/>");
jsonData = jsonData.replace(/[{:,"]/g, "");
jsonData = jsonData.replace(/[\[\]}]/g, "<br/>");
}
// transform any tokens used
jsonData = jsonData.replace(/hypertext-./gi, "http:");
aja_fill(strcontainer, jsonData);
// clean up after:
try {
if (strcontainer) strcontainer = null;
if (strSearchElement) strSearchElement = null;
}
finally {
jsonData = null;
}
}
}
json_addAnchorTags = function(strmod) {
if (strmod) {
var srchtmp = strmod.toLowerCase();
if (srchtmp.indexOf("href") != -1) {
// anchor markup already there
return strmod;
}
// finds and adds multiple tags
var linkstart = srchtmp.indexOf("http:");
while (linkstart != -1) {
var linkend = linkstart;
var jsontmp = strmod;
// try to find the end of link
var jsontmplen = jsontmp.length;
while (linkend < jsontmplen) {
if (/[ "}]/.test(jsontmp.charAt(linkend))) {
break;
}
else linkend++;
}
if (linkend > linkstart && linkend > 0) {
var stranchor = jsontmp.substr(linkstart, linkend - linkstart);
jsontmp = jsontmp.replace(stranchor, "<a href='" + stranchor + "'>link</a>");
// use renamed key tokens to allow add'l anchor tag replaces
jsontmp = jsontmp.replace(/http:/i, "hypertext-.");
strmod = jsontmp;
jsontmp = null;
}
else break;
// start another search...
srchtmp = strmod.toLowerCase();
linkstart = srchtmp.indexOf("http:");
}
// clean up:
srchtmp = null;
linkstart = null;
linkend = null;
jsontmp = null;
stranchor = null;
}
return strmod;
}
[eof]
More Resources from AjaMyAjax.com