|
11 | 11 | }(this,function(){
|
12 | 12 | "use strict";
|
13 | 13 |
|
| 14 | +varindexOf=[].indexOf||function(item){for(vari=0,l=this.length;i<l;i++){if(iinthis&&this[i]===item)returni;}return-1;}; |
| 15 | + |
14 | 16 | functionmakePrefixer(prefix){
|
15 | 17 | returnfunction(name){
|
16 | 18 | returnprefix+"-"+name;
|
|
47 | 49 | returnresult;
|
48 | 50 | }
|
49 | 51 |
|
| 52 | +functionlinkNode(child,href,target){ |
| 53 | +vara=scn("a",HYPERLINK_CLASS_NAME,child); |
| 54 | +a.setAttribute('href',href); |
| 55 | +a.setAttribute('target',target); |
| 56 | +returna; |
| 57 | +} |
| 58 | + |
50 | 59 | vartoString=Object.prototype.toString,
|
51 | 60 | prefixer=makePrefixer("jh"),
|
52 | 61 | p=prefixer,
|
|
78 | 87 | ARRAY_CLASS_NAME=p("type-array"),
|
79 | 88 | ARRAY_EMPTY_CLASS_NAME=p("type-array")+" "+p("empty"),
|
80 | 89 |
|
| 90 | +HYPERLINK_CLASS_NAME=p('a'), |
| 91 | + |
81 | 92 | UNKNOWN_CLASS_NAME=p("type-unk");
|
82 | 93 |
|
83 | 94 | functiongetType(obj){
|
|
103 | 114 | }
|
104 | 115 | }
|
105 | 116 |
|
106 |
| -function_format(data){ |
107 |
| -varresult,container,key,keyNode,valNode,len,childs,tr, |
| 117 | +function_format(data,options,parentKey){ |
| 118 | + |
| 119 | +varresult,container,key,keyNode,valNode,len,childs,tr,value, |
108 | 120 | isEmpty=true,
|
109 | 121 | accum=[],
|
110 | 122 | type=getType(data);
|
111 | 123 |
|
| 124 | +// Initialized & used only in case of objects & arrays |
| 125 | +varhyperlinksEnabled,aTarget,hyperlinkKeys; |
| 126 | + |
112 | 127 | switch(type){
|
113 | 128 | caseBOOL:
|
114 | 129 | result=data ?sn("span",BOOL_CLASS_NAME,"true")
|
|
129 | 144 | break;
|
130 | 145 | caseOBJECT:
|
131 | 146 | childs=[];
|
| 147 | + |
| 148 | +aTarget=options.hyperlinks.target; |
| 149 | +hyperlinkKeys=options.hyperlinks.keys; |
| 150 | + |
| 151 | +// Is Hyperlink Key |
| 152 | +hyperlinksEnabled= |
| 153 | +options.hyperlinks.enable&& |
| 154 | +hyperlinkKeys&& |
| 155 | +hyperlinkKeys.length>0; |
| 156 | + |
132 | 157 | for(keyindata){
|
133 | 158 | isEmpty=false;
|
134 | 159 |
|
| 160 | +value=data[key]; |
| 161 | + |
| 162 | +valNode=_format(value,options,key); |
135 | 163 | keyNode=sn("th",OBJ_KEY_CLASS_NAME,key);
|
136 |
| -valNode=scn("td",OBJ_VAL_CLASS_NAME,_format(data[key])); |
| 164 | + |
| 165 | +if(hyperlinksEnabled&& |
| 166 | +typeof(value)==='string'&& |
| 167 | +indexOf.call(hyperlinkKeys,key)>=0){ |
| 168 | + |
| 169 | +valNode=scn("td",OBJ_VAL_CLASS_NAME,linkNode(valNode,value,aTarget)); |
| 170 | +}else{ |
| 171 | +valNode=scn("td",OBJ_VAL_CLASS_NAME,valNode); |
| 172 | +} |
137 | 173 |
|
138 | 174 | tr=document.createElement("tr");
|
139 | 175 | tr.appendChild(keyNode);
|
|
154 | 190 | caseARRAY:
|
155 | 191 | if(data.length>0){
|
156 | 192 | childs=[];
|
| 193 | +varshowArrayIndices=options.showArrayIndex; |
| 194 | + |
| 195 | +aTarget=options.hyperlinks.target; |
| 196 | +hyperlinkKeys=options.hyperlinks.keys; |
| 197 | + |
| 198 | +// Hyperlink of arrays? |
| 199 | +hyperlinksEnabled=parentKey&&options.hyperlinks.enable&& |
| 200 | +hyperlinkKeys&& |
| 201 | +hyperlinkKeys.length>0&& |
| 202 | +indexOf.call(hyperlinkKeys,parentKey)>=0; |
| 203 | + |
157 | 204 | for(key=0,len=data.length;key<len;key+=1){
|
| 205 | + |
158 | 206 | keyNode=sn("th",ARRAY_KEY_CLASS_NAME,key);
|
159 |
| -valNode=scn("td",ARRAY_VAL_CLASS_NAME,_format(data[key])); |
| 207 | +value=data[key]; |
| 208 | + |
| 209 | +if(hyperlinksEnabled&&typeof(value)==="string"){ |
| 210 | +valNode=_format(value,options,key); |
| 211 | +valNode=scn("td",ARRAY_VAL_CLASS_NAME,linkNode(valNode,value,aTarget)); |
| 212 | +}else{ |
| 213 | +valNode=scn("td",ARRAY_VAL_CLASS_NAME,_format(value,options,key)); |
| 214 | +} |
160 | 215 |
|
161 | 216 | tr=document.createElement("tr");
|
162 |
| -tr.appendChild(keyNode); |
| 217 | + |
| 218 | +if(showArrayIndices){ |
| 219 | +tr.appendChild(keyNode); |
| 220 | +} |
163 | 221 | tr.appendChild(valNode);
|
164 | 222 |
|
165 | 223 | childs.push(tr);
|
|
179 | 237 | }
|
180 | 238 |
|
181 | 239 | functionformat(data,options){
|
182 |
| -options=options||{}; |
| 240 | +options=validateOptions(options||{}); |
| 241 | + |
183 | 242 | varresult;
|
184 | 243 |
|
185 |
| -result=_format(data); |
| 244 | +result=_format(data,options); |
186 | 245 | result.className=result.className+" "+prefixer("root");
|
187 | 246 |
|
188 | 247 | returnresult;
|
189 | 248 | }
|
190 | 249 |
|
| 250 | + |
| 251 | +functionvalidateOptions(options){ |
| 252 | +options=validateArrayIndexOption(options); |
| 253 | +options=validateHyperlinkOptions(options); |
| 254 | + |
| 255 | +// Add any more option validators here |
| 256 | + |
| 257 | +returnoptions; |
| 258 | +} |
| 259 | + |
| 260 | + |
| 261 | +functionvalidateArrayIndexOption(options){ |
| 262 | +if(options.showArrayIndex===undefined){ |
| 263 | +options.showArrayIndex=true; |
| 264 | +}else{ |
| 265 | +// Force to boolean just in case |
| 266 | +options.showArrayIndex=options.showArrayIndex ?true:false; |
| 267 | +} |
| 268 | + |
| 269 | +returnoptions; |
| 270 | +} |
| 271 | + |
| 272 | +functionvalidateHyperlinkOptions(options){ |
| 273 | +varhyperlinks={ |
| 274 | +enable :false, |
| 275 | +keys :null, |
| 276 | +target :'' |
| 277 | +}; |
| 278 | + |
| 279 | +if(options.hyperlinks&&options.hyperlinks.enable){ |
| 280 | +hyperlinks.enable=true; |
| 281 | + |
| 282 | +hyperlinks.keys=isArray(options.hyperlinks.keys) ?options.hyperlinks.keys :[]; |
| 283 | + |
| 284 | +if(options.hyperlinks.target){ |
| 285 | +hyperlinks.target=''+options.hyperlinks.target; |
| 286 | +}else{ |
| 287 | +hyperlinks.target='_blank'; |
| 288 | +} |
| 289 | +} |
| 290 | + |
| 291 | +options.hyperlinks=hyperlinks; |
| 292 | + |
| 293 | +returnoptions; |
| 294 | +} |
| 295 | + |
191 | 296 | return{
|
192 | 297 | format:format
|
193 | 298 | };
|
|