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