1 | /*
|
---|
2 | * DEMO HELPERS
|
---|
3 | */
|
---|
4 |
|
---|
5 |
|
---|
6 | /**
|
---|
7 | * debugData
|
---|
8 | *
|
---|
9 | * Pass me a data structure {} and I'll output all the key/value pairs - recursively
|
---|
10 | *
|
---|
11 | * @example var HTML = debugData( oElem.style, "Element.style", { keys: "top,left,width,height", recurse: true, sort: true, display: true, returnHTML: true });
|
---|
12 | *
|
---|
13 | * @param Object o_Data A JSON-style data structure
|
---|
14 | * @param String s_Title Title for dialog (optional)
|
---|
15 | * @param Hash options Pass additional options in a hash
|
---|
16 | */
|
---|
17 | function debugData (o_Data, s_Title, options) {
|
---|
18 | options = options || {};
|
---|
19 | var
|
---|
20 | str=(s_Title || 'DATA')
|
---|
21 | // maintain backward compatibility with OLD 'recurseData' param
|
---|
22 | , recurse=(typeof options=='boolean' ? options : options.recurse !==false)
|
---|
23 | , keys=(options.keys?','+options.keys+',':false)
|
---|
24 | , display=options.display !==false
|
---|
25 | , html=options.returnHTML !==false
|
---|
26 | , sort=options.sort !==false
|
---|
27 | , D=[], i=0 // Array to hold data, i=counter
|
---|
28 | , hasSubKeys = false
|
---|
29 | , k, t, skip, x // loop vars
|
---|
30 | ;
|
---|
31 | s_Title=s_Title ? s_Title+'\n':'';
|
---|
32 |
|
---|
33 | if (typeof o_Data != 'object') {
|
---|
34 | alert( s_Title + o_Data );
|
---|
35 | return;
|
---|
36 | }
|
---|
37 | if (o_Data.jquery) {
|
---|
38 | str=s_Title+'jQuery Collection ('+ o_Data.length +')\n context="'+ o_Data.context +'"';
|
---|
39 | }
|
---|
40 | else if (o_Data.tagName && typeof o_Data.style == 'object') {
|
---|
41 | str=s_Title+o_Data.tagName;
|
---|
42 | var id = o_Data.id, cls=o_Data.className, src=o_Data.src, hrf=o_Data.href;
|
---|
43 | if (id) str+='\n id="'+ id+'"';
|
---|
44 | if (cls) str+='\n class="'+ cls+'"';
|
---|
45 | if (src) str+='\n src="'+ src+'"';
|
---|
46 | if (hrf) str+='\n href="'+ hrf+'"';
|
---|
47 | }
|
---|
48 | else {
|
---|
49 | parse(o_Data,''); // recursive parsing
|
---|
50 | if (sort && !hasSubKeys) D.sort(); // sort by keyName - but NOT if has subKeys!
|
---|
51 | str+='\n***'+'****************************'.substr(0,str.length);
|
---|
52 | str+='\n'+ D.join('\n'); // add line-breaks
|
---|
53 | }
|
---|
54 |
|
---|
55 | if (display) alert(str); // display data
|
---|
56 | if (html) str=str.replace(/\n/g, ' <br>').replace(/ /g, ' '); // format as HTML
|
---|
57 | return str;
|
---|
58 |
|
---|
59 | function parse ( data, prefix ) {
|
---|
60 | if (typeof prefix=='undefined') prefix='';
|
---|
61 | try {
|
---|
62 | $.each( data, function (key, val) {
|
---|
63 | k = prefix+key+': ';
|
---|
64 | skip = (keys && keys.indexOf(','+key+',') == -1);
|
---|
65 | if (typeof val=='function') { // FUNCTION
|
---|
66 | if (!skip) D[i++] = k +'function()';
|
---|
67 | }
|
---|
68 | else if (typeof val=='string') { // STRING
|
---|
69 | if (!skip) D[i++] = k +'"'+ val +'"';
|
---|
70 | }
|
---|
71 | else if (typeof val !='object') { // NUMBER or BOOLEAN
|
---|
72 | if (!skip) D[i++] = k + val;
|
---|
73 | }
|
---|
74 | else if (isArray(val)) { // ARRAY
|
---|
75 | if (!skip) {
|
---|
76 | if (val.length && typeof val[0] == "object") { // array of objects (hashs or arrays)
|
---|
77 | D[i++] = k +'{';
|
---|
78 | parse( val, prefix+' '); // RECURSE
|
---|
79 | D[i++] = prefix +'}';
|
---|
80 | }
|
---|
81 | else
|
---|
82 | D[i++] = k +'[ '+ val.toString() +' ]'; // output delimited array
|
---|
83 | }
|
---|
84 | }
|
---|
85 | else if (val.jquery) {
|
---|
86 | if (!skip) D[i++] = k +'jQuery ('+ val.length +') context="'+ val.context +'"';
|
---|
87 | }
|
---|
88 | else if (val.tagName && typeof val.style == 'object') {
|
---|
89 | var id = val.id, cls=val.className, src=val.src, hrf=val.href;
|
---|
90 | if (skip) D[i++] = k +' '+
|
---|
91 | id ? 'id="'+ id+'"' :
|
---|
92 | src ? 'src="'+ src+'"' :
|
---|
93 | hrf ? 'href="'+ hrf+'"' :
|
---|
94 | cls ? 'class="'+cls+'"' :
|
---|
95 | '';
|
---|
96 | }
|
---|
97 | else { // Object or JSON
|
---|
98 | if (!recurse || !hasKeys(val)) { // show an empty hash
|
---|
99 | if (!skip) D[i++] = k +'{ }';
|
---|
100 | }
|
---|
101 | else { // recurse into JSON hash - indent output
|
---|
102 | D[i++] = k +'{';
|
---|
103 | parse( val, prefix+' '); // RECURSE
|
---|
104 | D[i++] = prefix +'}';
|
---|
105 | }
|
---|
106 | }
|
---|
107 | });
|
---|
108 | } catch (e) {}
|
---|
109 | function isArray(o) {
|
---|
110 | return (o && typeof o==='object' && !o.propertyIsEnumerable('length') && typeof o.length==='number');
|
---|
111 | }
|
---|
112 | function hasKeys(o) {
|
---|
113 | var c=0;
|
---|
114 | for (x in o) c++;
|
---|
115 | if (!hasSubKeys) hasSubKeys = !!c;
|
---|
116 | return !!c;
|
---|
117 | }
|
---|
118 | }
|
---|
119 | };
|
---|
120 |
|
---|
121 | if (!window.console) window.console = { log: debugData };
|
---|
122 |
|
---|
123 |
|
---|
124 | /**
|
---|
125 | * timer
|
---|
126 | *
|
---|
127 | * Utility for debug timing of events
|
---|
128 | * Can track multiple timers and returns either a total time or interval from last event
|
---|
129 | * @param String timerName Name of the timer - defaults to debugTimer
|
---|
130 | * @param String action Keyword for action or return-value...
|
---|
131 | * action: 'reset' = reset; 'clear' = delete; 'total' = ms since init; 'step' or '' = ms since last event
|
---|
132 | */
|
---|
133 | /**
|
---|
134 | * timer
|
---|
135 | *
|
---|
136 | * Utility method for timing performance
|
---|
137 | * Can track multiple timers and returns either a total time or interval from last event
|
---|
138 | *
|
---|
139 | * returns time-data: {
|
---|
140 | * start: Date Object
|
---|
141 | * , last: Date Object
|
---|
142 | * , step: 99 // time since 'last'
|
---|
143 | * , total: 99 // time since 'start'
|
---|
144 | * }
|
---|
145 | *
|
---|
146 | * USAGE SAMPLES
|
---|
147 | * =============
|
---|
148 | * timer('name'); // create/init timer
|
---|
149 | * timer('name', 'reset'); // re-init timer
|
---|
150 | * timer('name', 'clear'); // clear/remove timer
|
---|
151 | * var i = timer('name'); // how long since last timer request?
|
---|
152 | * var i = timer('name', 'total'); // how long since timer started?
|
---|
153 | *
|
---|
154 | * @param String timerName Name of the timer - defaults to debugTimer
|
---|
155 | * @param String action Keyword for action or return-value...
|
---|
156 | * @param Hash options Options to customize return data
|
---|
157 | * action: 'reset' = reset; 'clear' = delete; 'total' = ms since init; 'step' or '' = ms since last event
|
---|
158 | */
|
---|
159 | function timer (timerName, action, options) {
|
---|
160 | var
|
---|
161 | name = timerName || 'debugTimer'
|
---|
162 | , Timer = window[ name ]
|
---|
163 | , defaults = {
|
---|
164 | returnString: true
|
---|
165 | , padNumbers: true
|
---|
166 | , timePrefix: ''
|
---|
167 | , timeSuffix: ''
|
---|
168 | }
|
---|
169 | ;
|
---|
170 |
|
---|
171 | // init the timer first time called
|
---|
172 | if (!Timer || action == 'reset') { // init timer
|
---|
173 | Timer = window[ name ] = {
|
---|
174 | start: new Date()
|
---|
175 | , last: new Date()
|
---|
176 | , step: 0 // time since 'last'
|
---|
177 | , total: 0 // time since 'start'
|
---|
178 | , options: $.extend({}, defaults, options)
|
---|
179 | };
|
---|
180 | }
|
---|
181 | else if (action == 'clear') { // remove timer
|
---|
182 | window[ name ] = null;
|
---|
183 | return null;
|
---|
184 | }
|
---|
185 | else { // update existing timer
|
---|
186 | Timer.step = (new Date()) - Timer.last; // time since 'last'
|
---|
187 | Timer.total = (new Date()) - Timer.start; // time since 'start'
|
---|
188 | Timer.last = new Date();
|
---|
189 | }
|
---|
190 |
|
---|
191 | var
|
---|
192 | time = (action == 'total') ? Timer.total : Timer.step
|
---|
193 | , o = Timer.options // alias
|
---|
194 | ;
|
---|
195 |
|
---|
196 | if (o.returnString) {
|
---|
197 | time += ""; // convert integer to string
|
---|
198 | // pad time to 4 chars with underscores
|
---|
199 | if (o.padNumbers)
|
---|
200 | switch (time.length) {
|
---|
201 | case 1: time = "   "+ time; break;
|
---|
202 | case 2: time = "  "+ time; break;
|
---|
203 | case 3: time = " "+ time; break;
|
---|
204 | }
|
---|
205 | // add prefix and suffix
|
---|
206 | if (o.timePrefix || o.timeSuffix)
|
---|
207 | time = o.timePrefix + time + o.timeSuffix;
|
---|
208 | }
|
---|
209 |
|
---|
210 | return time;
|
---|
211 | };
|
---|
212 |
|
---|
213 |
|
---|
214 | /**
|
---|
215 | * showOptions
|
---|
216 | *
|
---|
217 | * Pass a layout-options object, and the pane/key you want to display
|
---|
218 | */
|
---|
219 | function showOptions (o_Settings, key, options) {
|
---|
220 | var data = o_Settings.options;
|
---|
221 | $.each(key.split("."), function() {
|
---|
222 | data = data[this]; // resurse through multiple levels
|
---|
223 | });
|
---|
224 | debugData( data, 'options.'+key, options );
|
---|
225 | };
|
---|
226 |
|
---|
227 | /**
|
---|
228 | * showState
|
---|
229 | *
|
---|
230 | * Pass a layout-options object, and the pane/key you want to display
|
---|
231 | */
|
---|
232 | function showState (o_Settings, key) {
|
---|
233 | debugData( o_Settings.state[key], 'state.'+key );
|
---|
234 | };
|
---|
235 |
|
---|
236 |
|
---|
237 | /**
|
---|
238 | * addThemeSwitcher
|
---|
239 | *
|
---|
240 | * Remove the cookie set by the UI Themeswitcher to reset a page to default styles
|
---|
241 | *
|
---|
242 | * Dependancies: /lib/js/themeswitchertool.js
|
---|
243 | */
|
---|
244 | function addThemeSwitcher ( container, position ) {
|
---|
245 | var pos = { top: '10px', right: '10px', zIndex: 10 };
|
---|
246 | $('<div id="themeContainer" style="position: absolute; overflow-x: hidden;"></div>')
|
---|
247 | .css( $.extend( pos, position ) )
|
---|
248 | .appendTo( container || 'body')
|
---|
249 | .themeswitcher()
|
---|
250 | ;
|
---|
251 | };
|
---|
252 |
|
---|
253 | /**
|
---|
254 | * removeUITheme
|
---|
255 | *
|
---|
256 | * Remove the cookie set by the UI Themeswitcher to reset a page to default styles
|
---|
257 | */
|
---|
258 | function removeUITheme ( cookieName, removeCookie ) {
|
---|
259 | $('link.ui-theme').remove();
|
---|
260 | $('.jquery-ui-themeswitcher-title').text( 'Switch Theme' );
|
---|
261 | if (removeCookie !== false)
|
---|
262 | $.cookie( cookieName || 'jquery-ui-theme', null );
|
---|
263 | };
|
---|
264 |
|
---|