/*global jQuery, define */
(function( factory ) {
"use strict";
if ( typeof define === "function" && define.amd ) {
// AMD. Register as an anonymous module.
define([
"jquery"
], factory );
} else {
// Browser globals
factory();
}
}(function() {
"use strict";
//module begin
window.jqGridUtils = {
stringify : function(obj) {
return JSON.stringify(obj,function(key, value){
return (typeof value === 'function' ) ? value.toString() : value;
});
},
parse : function(str) {
return JSON.parse(str,function(key, value){
if(typeof value === "string" && value.indexOf("function") !== -1) {
return eval('('+value+')');
}
return value;
});
},
encode : function ( text ) { // repeated, but should not depend on grid
return String(text).replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"');
},
jsonToXML : function ( tree, options ) {
var o = $.extend( {
xmlDecl : '\n',
attr_prefix : '-',
encode : true
}, options || {}),
that = this,
scalarToxml = function ( name, text ) {
if ( name === "#text" ) {
return (o.encode ? that.encode(text) : text);
} else if(typeof(text) ==='function') {
return "<"+name+">"+name+">\n";
} if(text === "") {
return "<"+name+">__EMPTY_STRING_"+name+">\n";
} else {
return "<"+name+">"+(o.encode ? that.encode(text) : text )+""+name+">\n";
}
},
arrayToxml = function ( name, array ) {
var out = [];
for( var i=0; i";
} else if ( typeof(val) === "object" && val.constructor == Array ) {
out[out.length] = arrayToxml( name, val );
} else if ( typeof(val) === "object" ) {
out[out.length] = hashToxml( name, val );
} else {
out[out.length] = scalarToxml( name, val );
}
}
if(!out.length) {
out[0] = "<"+ name+">__EMPTY_ARRAY_"+name+">\n";
}
return out.join("");
},
hashToxml = function ( name, tree ) {
var elem = [];
var attr = [];
for( var key in tree ) {
if ( ! tree.hasOwnProperty(key) ) continue;
var val = tree[key];
if ( key.charAt(0) !== o.attr_prefix ) {
if ( val == null ) { // null or undefined
elem[elem.length] = "<"+key+" />";
} else if ( typeof(val) === "object" && val.constructor === Array ) {
elem[elem.length] = arrayToxml( key, val );
} else if ( typeof(val) === "object" ) {
elem[elem.length] = hashToxml( key, val );
} else {
elem[elem.length] = scalarToxml( key, val );
}
} else {
attr[attr.length] = " "+(key.substring(1))+'="'+(o.encode ? that.encode( val ) : val)+'"';
}
}
var jattr = attr.join("");
var jelem = elem.join("");
if ( name == null ) { // null or undefined
// no tag
} else if ( elem.length > 0 ) {
if ( jelem.match( /\n/ )) {
jelem = "<"+name+jattr+">\n"+jelem+""+name+">\n";
} else {
jelem = "<"+name+jattr+">" +jelem+""+name+">\n";
}
} else {
jelem = "<"+name+jattr+" />\n";
}
return jelem;
};
var xml = hashToxml( null, tree );
return o.xmlDecl + xml;
},
xmlToJSON : function ( root, options ) {
var o = $.extend ( {
force_array : [], //[ "rdf:li", "item", "-xmlns" ];
attr_prefix : '-'
}, options || {} );
if(!root) { return; }
var __force_array = {};
if ( o.force_array ) {
for( var i=0; i< o.force_array.length; i++ ) {
__force_array[o.force_array[i]] = 1;
}
}
if(typeof root === 'string') {
root = $.parseXML(root);
}
if(root.documentElement) {
root = root.documentElement;
}
var addNode = function ( hash, key, cnts, val ) {
if(typeof val === 'string') {
if( val.indexOf('function') !== -1) {
val = eval( '(' + val +')'); // we need this in our implement
} else {
switch(val) {
case '__EMPTY_ARRAY_' :
val = [];
break;
case '__EMPTY_STRING_':
val = "";
break;
case "false" :
val = false;
break;
case "true":
val = true;
break;
}
}
}
if ( __force_array[key] ) {
if ( cnts === 1 ) {
hash[key] = [];
}
hash[key][hash[key].length] = val; // push
} else if ( cnts === 1 ) { // 1st sibling
hash[key] = val;
} else if ( cnts === 2 ) { // 2nd sibling
hash[key] = [ hash[key], val ];
} else { // 3rd sibling and more
hash[key][hash[key].length] = val;
}
},
parseElement = function ( elem ) {
// COMMENT_NODE
if ( elem.nodeType === 7 ) {
return;
}
// TEXT_NODE CDATA_SECTION_NODE
if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
var bool = elem.nodeValue.match( /[^\x00-\x20]/ );
if ( bool == null ) return; // ignore white spaces
return elem.nodeValue;
}
var retval, cnt = {}, i, key, val;
// parse attributes
if ( elem.attributes && elem.attributes.length ) {
retval = {};
for ( i=0; i