1 
  2 /**
  3  * @name	CeL function for debug
  4  * @fileoverview
  5  * 本檔案包含了 debug 用的 functions。
  6  * @since	
  7  */
  8 
  9 /*
 10 
 11 http://code.google.com/apis/ajax/playground/
 12 
 13 */
 14 
 15 if (typeof CeL === 'function')
 16 CeL.setup_module('application.debug',
 17 function(library_namespace, load_arguments) {
 18 
 19 
 20 //	nothing required
 21 
 22 
 23 
 24 
 25 
 26 /**
 27  * null module constructor
 28  * @class	code.debug 的 functions
 29  */
 30 CeL.application.debug
 31 = function() {
 32 	//	null module constructor
 33 };
 34 
 35 /**
 36  * for JSDT: 有 prototype 才會將之當作 Class
 37  */
 38 CeL.application.debug
 39 .prototype = {
 40 };
 41 
 42 
 43 
 44 
 45 
 46 
 47 
 48 
 49 
 50 //JSalert[generateCode.dLK]='getScriptName';//,*var ScriptName=getScriptName();
 51 CeL.application.debug
 52 .
 53 /**
 54  * 顯示訊息視窗<br/>
 55  * alert() 改用VBScript的MsgBox可產生更多效果,但NS不支援的樣子。
 56  * @param message	message or object
 57  * @param {Number} [wait]	the maximum length of time (in seconds) you want the pop-up message box displayed.
 58  * @param {String} [title]	title of the pop-up message box.
 59  * @param {Number} [type]	type of buttons and icons you want in the pop-up message box.
 60  * @return	{Integer} number of the button the user clicked to dismiss the message box.
 61  * @requires	CeL.get_script_name
 62  * @see	<a href="http://msdn.microsoft.com/library/en-us/script56/html/wsmthpopup.asp">Popup Method</a>
 63  * @memberOf	CeL.application.debug
 64  */
 65 JSalert=function (message, wait, title, type) {
 66 	var _f=arguments.callee;
 67 	if (typeof _f.cmd === 'undefined') // 控制是否彈跳出視窗
 68 		_f.cmd = typeof WScript === 'object'
 69 				&& /cscript\.exe$/i.test(WScript.FullName);
 70 
 71 	// if(!message)message+='';//if(typeof message==='undefined')message='';else if(!message)message+=''; //
 72 	// 有時傳入如message==null會造成error
 73 	// WScript.Echo()會視情況:視窗執行時彈跳出視窗,cmd執行時直接顯示。但需要用cscript執行時才有效果。
 74 	// http://www.microsoft.com/technet/scriptcenter/guide/sas_wsh_mokz.mspx
 75 	// 可以用 WScript.Echo(t1,t2,..),中間會以' '間隔
 76 	if (_f.cmd && argument.length < 2)
 77 		return WScript.Echo(message);
 78 
 79 	if (!title &&
 80 			// typeof getScriptName === 'function'
 81 			this.get_script_name
 82 			)
 83 		title = getScriptName();
 84 
 85 	if (isNaN(type))// typeof type!=='number'
 86 		type = 64;
 87 
 88 /*
 89 	if (typeof WshShell != 'object')
 90 		if (typeof WScript === 'object')
 91 			WshShell = WScript.CreateObject("WScript.Shell");
 92 		else
 93 			return undefined;
 94 */
 95 	if (this.WshShell != 'object')
 96 		if (typeof WScript === 'object')
 97 			this.WshShell = WScript.CreateObject("WScript.Shell");
 98 		else
 99 			return undefined;
100 
101 
102 	return this.WshShell.Popup(
103 			//	''+message: 會出現 typeof message==='object' 卻不能顯示的
104 			'' + message,
105 			wait, title, type
106 			);
107 };
108 
109 // popup object Error(錯誤)
110 //popErr[generateCode.dLK]='JSalert,setTool,parse_Function';
111 function popErr(e,t,f){	//	error object, title, additional text(etc. function name)
112  var T=typeof e;
113  //alert((T=='object')+','+(e.constructor)+','+(Error)+','+(e instanceof Error))
114  //	這裡e instanceof Error若是T=='object'&&e.constructor==Error有時不能達到效果!
115  //	use: for(i in e)
116  T=e instanceof Error?'Error '+(e.number&0xFFFF)+(e.name?' ['+e.name+']':'')+' (facility code '+(e.number>>16&0x1FFF)+'):\n'+e.description+(!e.message||e.message==e.description?'':'\n\n'+e.message):!e||T=='string'?e:'('+T+')'+e;
117  f=f?(''+f).replace(/\0/g,'\\0')+'\n\n'+T:T;
118  //	.caller只在執行期間有效。_function_self_.caller可用 arguments.callee.caller 代替,卻不能用arguments.caller
119  //	arguments.callee.caller 被取消了。	http://www.opera.com/docs/specs/js/ecma/	http://bytes.com/forum/thread761008.html	http://www.javaeye.com/post/602661	http://groups.google.com/group/comp.lang.javascript/browse_thread/thread/cd3d6d6abcdd048b
120  if(typeof WshShell=='object')
121   WshShell.Popup(f,0,t||'Error '+(arguments.callee.caller==null?'from the top level':'on '+(typeof parse_Function=='function'?parse_Function(arguments.callee.caller).funcName:'function'))+' of '+ScriptName,16);
122  else alert(f);
123  return T;
124 }
125 
126 
127 
128 
129 
130 
131 /*	debug用:	show function Class	2008/7/23 16:33:42
132 	!! unfinished !!
133 	//	http://fillano.blog.ithome.com.tw/post/257/59403
134 	//	** 一些內建的物件,他的屬性可能會是[[DontEnum]],也就是不可列舉的,而自訂的物件在下一版的ECMA-262中,也可以這樣設定他的屬性。
135 
136 
137 usage:
138 showClass('registryF');
139 showClass(registryF);
140 
141 
142 trace 的技巧:
143 
144 對沒 prototype 的,可能是:
145 var cl=(function(){
146  return new ((function(){var kkk='xsa',aa=function(){return kkk;},init=function(){kkk='22';},_=function(){init();};_.prototype.get=function(){return aa();};return _;})());
147 })();
148 cl.constructor=null;	//	絕技…無效
149 
150 sl(cl.get());
151 showClass('cl');
152 eval('sl(kkk)',cl.get);
153 
154 
155 */
156 
157 function showClass(c,n){
158  var i,sp='<hr style="width:40%;float:left;"/><br style="clear:both;"/>',h='<span style="color:#bbb;font-size:.8em;">'
159 	,p=function(m,p){sl(h+n+(p?'.prototype':'')+'.</span><em>'+m+'</em> '+h+'=</span> '+f(c[m]));}
160 	,f=function(f){return (''+f).replace(/\n/g,'<br/>').replace(/ /g,' ');};
161  if(typeof c=='string'){
162   if(!n)n=c;
163   c=eval(c);
164  }
165  if(!n)n='';
166  sl('<hr/>Show class: ('+(typeof c)+')'+(n?' [<em>'+n+'</em>]':'')+'<br/>'
167 	//+(n?'<em>'+n+'</em> '+h+'=</span> ':'')
168 	+f(c));
169  if(c){
170   sl(sp+'class member:');
171   for(i in c)
172    if(i!='prototype')p(i);
173   sl(sp+'prototype:');
174   c=c.prototype;
175   for(i in c)
176    p(i,1);
177  }
178  sl('<hr/>');
179 }
180 
181 showClass.repository={};
182 showClass.repositoryName='';
183 showClass.setRepository=function(n){
184  var _f=arguments.callee;
185  _f.repositoryName=n;
186  _f.repository=eval(n);
187  if(!_f.repository)_f.repository=eval(n+'={}');
188 };
189 /**
190  * ** loop?
191  * @param	name	name
192  * @param	scope	scope
193  * @ignore
194  * @return
195  */
196 showClass.showOnScope = function(name, scope) {
197 	var _f = arguments.callee, r = _f.repository;
198 	// 遇到 _f.repositoryName 剛好為 local 值時會失效。
199 	eval(_f.repositoryName + '.' + name + '=' + name, typeof scope == 'string' ? r[scope] : scope);
200 	return _f(r[name], name);
201 };
202 
203 
204 //	debug用:	show contents of object	2000-2003/2/22 15:49
205 //var i,t='';for(i in o)t+=i+':'+o[i];alert(t);
206 function showObj(obj,mode,searchKey,printmode,range){//object,mode,search string
207  var Obj,m='',M=[],M_=0,i,v,search,r2=99,sp='	';if(!range)range=2e3;
208  if(typeof obj=='object')Obj=obj;else if(typeof obj=='string'&&typeof document!='undefined')
209   if((i=obj.indexOf('.'))<1)Obj=document.getElementById(obj);
210   else if(Obj=document.getElementById(obj.slice(0,i)),typeof Obj=='object')Obj=eval('Obj.'+obj.substr(i+1));
211  if(!Obj)try{Obj=eval(obj);}catch(e){Obj=obj;}
212  search=searchKey?isNaN(searchKey)?searchKey==''?0:2:1:searchKey==0?1:0;//0:not search,1:num,2:string
213  if(search==1&&searchKey!=''+parseFloat(searchKey))search=2;
214  //if(searchKey)if(isNaN(searchKey))if(searchKey=='')search=0;else search=2;else search=1;else search=0;
215  //if(!mode&&mode!=0&&is.ns4)mode=1;
216  if(typeof Obj=='object'&&Obj)
217   if(!mode){for(i in Obj)m+=i+sp;if(m)M.push(m),M_+=m.length,m='';}
218   else if(mode==1){
219    for(i in Obj){v=''+Obj[i];//''+eval('Obj.'+i);
220     if(search&&i.indexOf(searchKey)==-1&&(!v||search==2&&v.indexOf(searchKey)==-1||v!=searchKey))continue;
221     m+=i+'='+(v?typeof v=='string'&&v.length>r2?v.slice(0,r2)+'..(string length '+v.length+')':v:'(nothing:'+typeof v+')')+sp;
222     if(m.length>range)M.push(m),M_+=m.length,m='';
223    }
224    if(m)M.push(m),M_+=m.length,m='';
225   }else m+='Error mode '+mode+' .';
226  else m='** No such object: '+obj+' ! **\n('+typeof obj+')'+obj+'='+Obj;
227  if(printmode&&printmode==1&&typeof document!='undefined')
228   with(document)open('text/plain'),clear(),write('content of '+obj+':'+(search?'search for '+searchKey+(search==1?'(num)':'(str)'):'')+' <!-- reload to HTML --><br/>\n'+m),close();
229  else if(M_)for(v=i=0;i<M.length;i++)t=obj+' : '+v+'-'+(v+=M[i].length)+'/'+M_+(search?', search for '+searchKey+(search==1?'(number)':'(string)')+'.':''),alert(t+' [Enter] to continue..\n\n'+M[i]);
230  else alert('showObj() error:\n'+(m||'show '+obj+': Got nothing!'));
231 }
232 
233 
234 
235 
236 
237 
238 
239 return (
240 	CeL.application.debug
241 );
242 }
243 
244 
245 );
246 
247