[6092] | 1 | /** |
---|
| 2 | * Created by demis.bellot@gmail.com |
---|
| 3 | * Open Source under the New BSD Licence: https://github.com/AjaxStack/AjaxStack/blob/master/LICENSE |
---|
| 4 | */ |
---|
| 5 | |
---|
| 6 | //for non-modern browsers i.e: <=IE8 |
---|
| 7 | !window.JSON && document.write(unescape('%3Cscript src=""http://ajax.cdnjs.com/ajax/libs/json2/20110223/json2.js""%3E%3C/script%3E')); |
---|
| 8 | |
---|
| 9 | var cssText = |
---|
| 10 | ".jsonreport TABLE { border-collapse:collapse; border: solid 1px #ccc; clear: left; }\r\n" + |
---|
| 11 | ".jsonreport TH { text-align: left; padding: 4px 8px; text-shadow: #fff 1px 1px -1px; background: #f1f1f1; white-space:nowrap; cursor:pointer; font-weight: bold; }\r\n" + |
---|
| 12 | ".jsonreport TH, .jsonreport TD, .jsonreport TD DT, .jsonreport TD DD { font-size: 13px; font-family: Arial; }\r\n" + |
---|
| 13 | ".jsonreport TD { padding: 8px 8px 0 8px; vertical-align: top; }\r\n" + |
---|
| 14 | ".jsonreport DL { clear: left; }\r\n" + |
---|
| 15 | ".jsonreport DT { margin: 10px 0 5px 0; font: bold 18px Helvetica, Verdana, Arial; width: 200px; clear: left; float: left; display:block; white-space:nowrap; }\r\n" + |
---|
| 16 | ".jsonreport DD { margin: 5px 10px; font: 18px Arial; padding: 2px; display: block; float: left; }\r\n" + |
---|
| 17 | ".jsonreport DL DL DT { font: bold 16px Arial; }\r\n" + |
---|
| 18 | ".jsonreport DL DL DD { font: 16px Arial; }\r\n" + |
---|
| 19 | ".jsonreport HR { display:none; }\r\n" + |
---|
| 20 | ".jsonreport TD DL HR { display:block; padding: 0; clear: left; border: none; }\r\n" + |
---|
| 21 | ".jsonreport TD DL { padding: 4px; margin: 0; height:100%; max-width: 700px; }\r\n" + |
---|
| 22 | ".jsonreport DL TD DL DT { padding: 2px; margin: 0 10px 0 0; font-weight: bold; font-size: 13px; width: 120px; overflow: hidden; clear: left; float: left; display:block; }\r\n" + |
---|
| 23 | ".jsonreport DL TD DL DD { margin: 0; padding: 2px; font-size: 13px; display: block; float: left; }\r\n" + |
---|
| 24 | ".jsonreport TBODY>TR:last-child>TD { padding: 8px; }\r\n" + |
---|
| 25 | ".jsonreport THEAD { -webkit-user-select:none; -moz-user-select:none; }\r\n" + |
---|
| 26 | ".jsonreport .desc, .jsonreport .asc { background-color: #FAFAD2; }\r\n" + |
---|
| 27 | ".jsonreport .desc { background-color: #D4EDC9; }\r\n" + |
---|
| 28 | ".jsonreport TH B { display:block; float:right; margin: 0 0 0 5px; width: 0; height: 0; border-left: 5px solid transparent; border-right: 5px solid transparent; border-top: 5px solid #ccc; border-bottom: none; }\r\n" + |
---|
| 29 | ".jsonreport .asc B { border-left: 5px solid transparent; border-right: 5px solid transparent; border-top: 5px solid #333; border-bottom: none; }\r\n" + |
---|
| 30 | ".jsonreport .desc B { border-left: 5px solid transparent; border-right: 5px solid transparent; border-bottom: 5px solid #333; border-top: none; }\r\n" + |
---|
| 31 | ".jsonreport H3 { font-size: 18px; margin: 0 0 10px 0; }"; |
---|
| 32 | |
---|
| 33 | document.write('<style type="text/css">' + cssText + '</style>\r\n'); |
---|
| 34 | |
---|
| 35 | if (!_) var _ = {}; |
---|
| 36 | _.jsonreport = (function(){ |
---|
| 37 | var root = this, doc = document, |
---|
| 38 | $ = function(id) { return doc.getElementById(id); }, |
---|
| 39 | $$ = function(sel) { return doc.getElementsByTagName(sel); }, |
---|
| 40 | $each = function(fn) { for (var i=0,len=this.length; i<len; i++) fn(i, this[i], this); }, |
---|
| 41 | isIE = /msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent); |
---|
| 42 | |
---|
| 43 | $.each = function(arr, fn) { $each.call(arr, fn); }; |
---|
| 44 | |
---|
| 45 | var splitCase = function(t) { return typeof t != 'string' ? t : t.replace(/([A-Z]|[0-9]+)/g, ' $1').replace(/_/g,' '); }, |
---|
| 46 | uniqueKeys = function(m){ var h={}; for (var i=0,len=m.length; i<len; i++) for (var k in m[i]) h[k] = k; return h; }, |
---|
| 47 | keys = function(o){ var a=[]; for (var k in o) a.push(k); return a; } |
---|
| 48 | var tbls = []; |
---|
| 49 | |
---|
| 50 | function val(m) { |
---|
| 51 | if (m == null) return ''; |
---|
| 52 | if (typeof m == 'number') return num(m); |
---|
| 53 | if (typeof m == 'string') return str(m); |
---|
| 54 | if (typeof m == 'boolean') return m ? 'true' : 'false'; |
---|
| 55 | return m.length ? arr(m) : obj(m); |
---|
| 56 | } |
---|
| 57 | function num(m) { return m; } |
---|
| 58 | function str(m) { |
---|
| 59 | return m.substr(0,6) == '/Date(' ? dfmt(date(m)) : m; |
---|
| 60 | } |
---|
| 61 | function date(s) { return new Date(parseFloat(/Date\(([^)]+)\)/.exec(s)[1])); } |
---|
| 62 | function pad(d) { return d < 10 ? '0'+d : d; } |
---|
| 63 | function dfmt(d) { return d.getFullYear() + '/' + pad(d.getMonth() + 1) + '/' + pad(d.getDate()); } |
---|
| 64 | function obj(m) { |
---|
| 65 | var sb = '<dl>'; |
---|
| 66 | for (var k in m) sb += '<dt class="ib">' + splitCase(k) + '</dt><dd>' + val(m[k]) + '</dd>'; |
---|
| 67 | sb += '</dl>'; |
---|
| 68 | return sb; |
---|
| 69 | } |
---|
| 70 | function arr(m) { |
---|
| 71 | if (typeof m[0] == 'string' || typeof m[0] == 'number') return m.join(', '); |
---|
| 72 | var id=tbls.length, h=uniqueKeys(m); |
---|
| 73 | var sb = '<table id="tbl-' + id + '"><caption></caption><thead><tr>'; |
---|
| 74 | tbls.push(m); |
---|
| 75 | var i=0; |
---|
| 76 | for (var k in h) sb += '<th id="h-' + id + '-' + (i++) + '"><b></b>' + splitCase(k) + '</th>'; |
---|
| 77 | sb += '</tr></thead><tbody>' + makeRows(h,m) + '</tbody></table>'; |
---|
| 78 | return sb; |
---|
| 79 | } |
---|
| 80 | |
---|
| 81 | function makeRows(h,m) { |
---|
| 82 | var sb = ''; |
---|
| 83 | for (var r=0,len=m.length; r<len; r++) { |
---|
| 84 | sb += '<tr>'; |
---|
| 85 | var row = m[r]; |
---|
| 86 | for (var k in h) sb += '<td>' + val(row[k]) + '</td>'; |
---|
| 87 | sb += '</tr>'; |
---|
| 88 | } |
---|
| 89 | return sb; |
---|
| 90 | } |
---|
| 91 | |
---|
| 92 | function setTableBody(tbody, html) { |
---|
| 93 | if (!isIE) { tbody.innerHTML = html; return; } |
---|
| 94 | var temp = tbody.ownerDocument.createElement('div'); |
---|
| 95 | temp.innerHTML = '<table>' + html + '</table>'; |
---|
| 96 | tbody.parentNode.replaceChild(temp.firstChild.firstChild, tbody); |
---|
| 97 | } |
---|
| 98 | |
---|
| 99 | function clearSel() { |
---|
| 100 | if (doc.selection && doc.selection.empty) doc.selection.empty(); |
---|
| 101 | else if(root.getSelection) { |
---|
| 102 | var sel=root.getSelection(); |
---|
| 103 | if (sel && sel.removeAllRanges) sel.removeAllRanges(); |
---|
| 104 | } |
---|
| 105 | } |
---|
| 106 | |
---|
| 107 | function cmp(v1, v2){ |
---|
| 108 | var f1, f2, f1=parseFloat(v1), f2=parseFloat(v2); |
---|
| 109 | if (!isNaN(f1) && !isNaN(f2)) v1=f1, v2=f2; |
---|
| 110 | if (typeof v1 == 'string' && v1.substr(0,6) == '/Date(') v1=date(v1), v2=date(v2); |
---|
| 111 | if (v1 == v2) return 0; |
---|
| 112 | return v1 > v2 ? 1 : -1; |
---|
| 113 | } |
---|
| 114 | |
---|
| 115 | function enc(html) { |
---|
| 116 | if (typeof html != 'string') return html; |
---|
| 117 | return html.replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"'); |
---|
| 118 | } |
---|
| 119 | |
---|
| 120 | function addEvent(obj, type, fn) { |
---|
| 121 | if ( obj.attachEvent ) { |
---|
| 122 | obj['e'+type+fn] = fn; |
---|
| 123 | obj[type+fn] = function(){obj['e'+type+fn]( root.event );} |
---|
| 124 | obj.attachEvent( 'on'+type, obj[type+fn] ); |
---|
| 125 | } else |
---|
| 126 | obj.addEventListener( type, fn, false ); |
---|
| 127 | } |
---|
| 128 | |
---|
| 129 | addEvent(doc, 'click', function (e) { |
---|
| 130 | var e = e || root.event, el = e.target || e.srcElement, cls = el.className; |
---|
| 131 | if (el.tagName == 'B') el = el.parentNode; |
---|
| 132 | if (el.tagName != 'TH') return; |
---|
| 133 | el.className = cls == 'asc' ? 'desc' : (cls == 'desc' ? null : 'asc'); |
---|
| 134 | $.each($$('TH'), function(i,th){ if (th == el) return; th.className = null; }); |
---|
| 135 | clearSel(); |
---|
| 136 | var ids=el.id.split('-'), tId=ids[1], cId=ids[2]; |
---|
| 137 | var tbl=tbls[tId].slice(0), h=uniqueKeys(tbl), col=keys(h)[cId], tbody=el.parentNode.parentNode.nextSibling; |
---|
| 138 | if (!el.className){ setTableBody(tbody, makeRows(h,tbls[tId])); return; } |
---|
| 139 | var d=el.className=='asc'?1:-1; |
---|
| 140 | tbl.sort(function(a,b){ return cmp(a[col],b[col]) * d; }); |
---|
| 141 | setTableBody(tbody, makeRows(h,tbl)); |
---|
| 142 | }); |
---|
| 143 | |
---|
| 144 | return function(json) { |
---|
| 145 | return val(json); |
---|
| 146 | // var model = JSON.parse(json); |
---|
| 147 | // return val(model); |
---|
| 148 | }; |
---|
| 149 | })(); |
---|
| 150 | |
---|