Salome HOME
7bcb2499374ebd5524175157dd65d3acbb2c66ed
[modules/smesh.git] / doc / salome / gui / SMESH / ehlpdhtm.js
1 // eHelp® Corporation Dynamic HTML JavaScript 
2 // Copyright© 1998-2003 eHelp® Corporation.All rights reserved.
3 // Version=4.82
4
5 // Warning:Do not modify this file.It is generated by RoboHELP® and changes will be overwritten.
6
7 //// Segment Begin -- (JavaScript 1.0)
8
9 /// Section Begin - General and relative topics(JavaScript 1.0)
10
11 //{{HH_SYMBOL_SECTION
12 var HH_ChmFilename = "";
13 var HH_WindowName = "";
14 var HH_GlossaryFont = "";
15 var HH_Glossary = "";
16 var HH_Avenue = "";
17 var HH_ActiveX = false;
18 //}}HH_SYMBOL_SECTION
19
20 //Begin to support previous generic parameters
21 //Get the information about the browser.
22 var gstrBsAgent         = navigator.userAgent.toLowerCase();
23 var gnBsVer                     = parseInt(navigator.appVersion);
24
25 var gbBsOpera           = (gstrBsAgent.indexOf('opera') != -1);
26 var gbBsKonqueror       = (gstrBsAgent.indexOf('konqueror') != -1);
27 var gbBsSafari          = (gstrBsAgent.indexOf('safari') != -1);
28 var gbBsIE              = (gstrBsAgent.indexOf('msie') != -1) && !gbBsOpera && !gbBsKonqueror && !gbBsSafari;
29 var gbBsNS              = (gstrBsAgent.indexOf('mozilla') != -1) && ((gstrBsAgent.indexOf('spoofer') == -1) && (gstrBsAgent.indexOf('compatible') == -1)) && !gbBsOpera && !gbBsKonqueror && !gbBsSafari;
30
31 var gbBsMac                     = (gstrBsAgent.indexOf('mac') != -1);
32 var gbBsWindows         = ((gstrBsAgent.indexOf('win') != -1) || (gstrBsAgent.indexOf('16bit') != -1));
33 var gbBsSunOS           = (gstrBsAgent.indexOf("sunos") != -1);
34
35 var gbBsIE3Before       = ((gbBsIE) && (gnBsVer <= 2));
36 var gbBsNS3Before       = ((gbBsNS) && (gnBsVer <= 3));
37
38 var gbBsNS2                     = ((gbBsNS) && (gnBsVer <= 2));
39 var gbBsNS3                     = ((gbBsNS) && (gnBsVer == 3));
40 var gbBsIE300301        = ((gbBsIE) && (gnBsVer == 2) && ((gstrBsAgent.indexOf("3.00") != -1)||(gstrBsAgent.indexOf("3.0a") != -1)||(gstrBsAgent.indexOf("3.0b")!=-1)||(gstrBsAgent.indexOf("3.01")!=-1)));
41 var gbBsIE302           = ((gbBsIE) && (gnBsVer == 2) && (gstrBsAgent.indexOf("3.02") != -1));
42
43 var gbBsNS4                     = ((gbBsNS) && (gnBsVer >= 4));
44 var gbBsNS6                     = ((gbBsNS) && (gnBsVer >= 5));
45 var     gbBsNS7                 = false;
46
47 var gbBsIE4                     = ((gbBsIE) && (gnBsVer >= 4));
48 var gbBsIE5                     = false;
49 var gbBsIE55            = false;
50
51 var gbBsOpera6          = false;
52 var gbBsOpera7          = false;
53
54 var gbBsKonqueror3      = false;
55
56
57
58 gbBsIE = (navigator.appName.indexOf("Microsoft") != -1) && !gbBsOpera && !gbBsKonqueror && !gbBsSafari;;
59 if (gbBsIE)
60 {
61         if (parseInt(navigator.appVersion) >= 4) {
62                 gbBsIE4 = true;
63                 if (gbBsIE4) {
64                         var nPos = gstrBsAgent.indexOf("msie");
65                         var strIEversion = gstrBsAgent.substring(nPos + 5);
66                         var nVersion =  parseFloat(strIEversion);
67                         if (nVersion >= 5)
68                                 gbBsIE5 = true;
69                         if (nVersion >= 5.5)
70                                 gbBsIE55 = true;
71                 }
72         }
73 }
74 if (gbBsNS6)
75 {
76         var nPos=gstrBsAgent.indexOf("gecko");
77         if(nPos!=-1)
78         {
79                 var nPos2=gstrBsAgent.indexOf("/", nPos);
80                 if(nPos2!=-1)
81                 {
82                         var nVersion=parseFloat(gstrBsAgent.substring(nPos2+1));
83                         if (nVersion>=20020823)
84                                 gbBsNS7=true;
85                 }
86         }       
87 }
88 if (gbBsOpera)
89 {
90         var nPos = gstrBsAgent.indexOf("opera");
91         if(nPos!=-1)
92         {
93                 var nVersion = parseFloat(gstrBsAgent.substring(nPos+6));
94                 if (nVersion >= 6)
95                 {
96                         gbBsOpera6=true;
97                         if (nVersion >=7)
98                                 gbBsOpera7=true;        
99                 }
100         }
101 }
102 if (gbBsKonqueror)
103 {
104         var nPos = gstrBsAgent.indexOf("konqueror");
105         if(nPos!=-1)
106         {
107                 var nVersion = parseFloat(gstrBsAgent.substring(nPos+10));
108                 if (nVersion >= 3)
109                 {
110                         gbBsKonqueror3=true;
111                 }
112         }
113 }
114
115 function insertAdjacentHTML(obj, where, htmlStr)
116 {
117         if (gbBsIE || gbBsOpera7)
118         {
119                 obj.insertAdjacentHTML(where, htmlStr);
120         }
121         else if (gbBsNS6 || gbBsSafari)
122         {
123                 var r = obj.ownerDocument.createRange();
124                 r.setStartBefore(obj);
125                 var     parsedHTML = r.createContextualFragment(htmlStr);
126                 
127                 switch (where){
128                 case 'beforeBegin':
129                         obj.parentNode.insertBefore(parsedHTML,obj);
130                         break;
131                 case 'afterBegin':
132                         obj.insertBefore(parsedHTML,obj.firstChild);
133                         break;
134                 case 'beforeEnd':
135                         obj.appendChild(parsedHTML);
136                         break;
137                 case 'afterEnd':
138                         if (obj.nextSibling){
139                         obj.parentNode.insertBefore(parsedHTML,obj.nextSibling);
140                         } else {
141                         obj.parentNode.appendChild(parsedHTML);
142                         }
143                         break;
144                 }
145         }
146 }
147
148 // Utilities functions.
149 function BsscHasExtJs()
150 {
151         if( gbBsIE3Before || gbBsNS3Before)
152                 return false;
153         return true;
154 }
155
156 // Register event handler
157 var gBsOnLoads                  = new Array();  // An array holds all the onload event handler.
158 var gBsOnClicks                 = new Array();  // An array holds all the onClick event handler.
159 var gBsOnUnLoads                = new Array();  // An array holds all the OnUnLoad event handler.
160 var gBsOnMouseOvers     = new Array();  // An array holds all the OnMouseOver event handler.
161 var gBsOnMouseOuts              = new Array();  // An array holds all the OnMouseOut event handler.
162
163 var gbOrignalOnMouseDown = null;
164
165 function BsscRegisterOnLoad(funcHandler)
166 {
167         var nLength = gBsOnLoads.length;
168         gBsOnLoads[nLength] = funcHandler;
169 }
170
171 function BsscRegisterOnClick(funcHandler)
172 {
173         var nLength = gBsOnClicks.length;
174         gBsOnClicks[nLength] = funcHandler;
175 }
176
177 function BsscRegisterOnUnLoad(funcHandler)
178 {
179         var nLength = gBsOnUnLoads.length;
180         gBsOnUnLoads[nLength] = funcHandler;
181 }
182
183 function BsscRegisterOnMouseOver(funcHandler)
184 {
185         var nLength = gBsOnMouseOvers.length;
186         gBsOnMouseOvers[nLength] = funcHandler;
187 }
188
189 function BsscRegisterOnMouseOut(funcHandler)
190 {
191         var nLength = gBsOnMouseOuts.length;
192         gBsOnMouseOuts[nLength] = funcHandler;
193 }
194
195 function BsGeneralOnLoad()
196 {
197         if (!gbBsIE4 && !gbBsNS4)
198                 return;
199
200         // Make everything visible in navigator
201         if (gbBsNS4 && !gbBsNS6) {
202                 // Make some special effects items visible
203                 for (var iLayer = 0; iLayer < document.layers.length; iLayer++) {
204                         document.layers[iLayer].visibility = "show";
205                         document.layers[iLayer].left = 0;
206                 }
207         }
208 }
209
210 // If resize the netscape browser, need to reload it.
211 function BsReDo()
212 {
213   if (innerWidth != origWidth || innerHeight != origHeight)
214      location.reload();
215 }
216 // End of the local functions.
217
218 // The following functions are used by the html files.
219 function BSSCOnLoad()
220 {
221         if( !BsscHasExtJs() )
222                 return;
223         for (var nElement = gBsOnLoads.length - 1; nElement >= 0; nElement--)
224                 gBsOnLoads[nElement]();
225 }
226
227 function BSSCOnClick()
228 {
229         if (!BsscHasExtJs()) return;
230                 
231         for (var nElement = gBsOnClicks.length - 1; nElement >= 0; nElement--)
232                 gBsOnClicks[nElement]();
233 }
234
235 function BSSCOnUnload()
236 {
237         if (!BsscHasExtJs()) return;
238         for (var nElement = gBsOnUnLoads.length - 1; nElement >= 0; nElement--)
239                 gBsOnUnLoads[nElement]();
240 }
241
242 function BSSCOnMouseOver()
243 {
244         if (!BsscHasExtJs()) return;
245         for (var nElement = gBsOnMouseOvers.length - 1; nElement >= 0; nElement--)
246                 gBsOnMouseOvers[nElement]();
247 }
248
249 function BSSCOnMouseOut()
250 {
251         if (!BsscHasExtJs()) return;
252         for (var nElement = gBsOnMouseOuts.length - 1; nElement >= 0; nElement--)
253         {
254                 gBsOnMouseOuts[nElement]();
255         }
256 }
257 // End of invocation of the event handle functions.
258
259 // Add the GereralOnLoad to the onload array.
260 if (typeof(BsscRegisterOnLoad) != "undefined")
261 {
262         BsscRegisterOnLoad(BsGeneralOnLoad);
263 }
264 if (gbBsNS4&&!gbBsNS6) {
265         origWidth = innerWidth;
266         origHeight = innerHeight;
267         onresize = BsReDo;
268 }
269 //End to support previous generic parameters
270
271 //Begin to support previous HHActiveX invoking
272 function BsHHActivateComponents()
273 {
274         if( HH_ActiveX && (HH_ChmFilename != "") && ((self == top) || (self == top.frames[0])))
275         {
276                 var objBody = getElementsByTag(document,"BODY")[0];
277                 if( typeof(objBody) == "object" )
278                 {
279                         insertAdjacentHTML(objBody, "beforeEnd", '<OBJECT ID="HHComponentActivator" CLASSID="CLSID:399CB6C4-7312-11D2-B4D9-00105A0422DF" width=0 height=0></OBJECT>');
280                         if (HHComponentActivator.object)
281                                 HHComponentActivator.Activate(HH_ChmFilename, HH_WindowName, HH_GlossaryFont, HH_Glossary, HH_Avenue);
282                 }
283         }
284 }
285
286 function BsHHActivXOnLoad()
287 {       
288         if( gbBsIE4 )
289                 BsHHActivateComponents(); 
290 }
291
292 if( typeof(BsscRegisterOnLoad) != "undefined" )
293 {
294         BsscRegisterOnLoad(BsHHActivXOnLoad);
295 }
296 //End to support previous HHActiveX invoking
297
298 //Begin to support previous relative topics
299 //If webHelp needs Related Topics DHTMLcode, it's supposed to add it here
300 var gbPopupMenuTimeoutExpired = false;
301 var gbInPopupMenu = false;
302 var gbPopupMenuTopicList = null;
303 var gOlddocumentClick = null;
304
305 //////////////////////////////////////////////////////////////////////////////////////////
306 //
307 // Popup Menu code
308 //
309 //////////////////////////////////////////////////////////////////////////////////////////
310
311 var g_bIsPopupMenuInit = false;
312 function _WritePopupMenuLayer()
313 {
314         if (!g_bIsPopupMenuInit)
315         {
316           if (gbBsNS4&&!gbBsNS6) {
317 //Do not try to write ininle styles for NS!  NS can not handle it and will not stop downloading the html page...
318                 document.write("<DIV CLASS='WebHelpPopupMenu' ID='PopupMenu'></DIV>");
319           } else{
320           document.write("<DIV ID='PopupMenu' STYLE='position:absolute; left:0px; top:0px; z-index:4; visibility:hidden;'></DIV>");
321           if (!(gbBsNS4&&!gbBsNS6)) {
322                 document.write("<STYLE TYPE='text/css'>");
323                 if (gbBsMac&&gbBsIE4) {
324                         document.write(".PopupOver {font-family:'Arial'; color:white; background:navy; font-size:10pt; font-style:normal;font-weight:normal;text-decoration:none;}");
325                         document.write(".PopupNotOver {font-family:'Arial'; color:black; background:#c0c0c0; font-size:10pt; font-style:normal;font-weight:normal;text-decoration:none;}");
326                 } else {
327                         document.write(".PopupOver {font-family:'Arial'; color:white; background:navy; font-size:8pt; font-style:normal;font-weight:normal;text-decoration:none;}");
328                         document.write(".PopupNotOver {font-family:'Arial'; color:black; background:#c0c0c0; font-size:8pt; font-style:normal;font-weight:normal;text-decoration:none;}");
329                 }
330                 document.write("</STYLE>");
331            }
332           }
333           g_bIsPopupMenuInit = true;
334         }
335 }
336
337 //Seek for the bsscright frame 
338 function _SeekFrameByName( cRoot, strName )
339 {
340         if( cRoot == null )     return null;
341         if( cRoot.frames == null )      return null;
342         if( cRoot.frames[strName] != null )     return cRoot.frames[strName];
343         for (var i=0; i<cRoot.frames.length; i++)
344         {
345                 var cObj = null;
346                 if (!gbBsNS6) 
347                         cObj = _SeekFrameByName( cRoot.frames(i).document, strName );
348                 else
349                         cObj = _SeekFrameByName( cRoot.frames[i], strName );
350                 if( cObj != null )              return cObj;
351         };
352         return null;
353 }
354 function _GetFrameByName( cRoot, strName )
355 {
356         if( cRoot == null )     return null;
357         var cRet = _SeekFrameByName(cRoot, strName);
358         if( cRet != null )      return cRet;
359         if (cRoot.parent != cRoot)
360                 return _GetFrameByName( cRoot.parent, strName );
361         else
362                 return null;
363 }
364
365 var gfn_arguments = null;
366 function _PopupMenu_Invoke(fn_arguments)
367 {
368         gfn_arguments = fn_arguments;
369         if (gbBsOpera6&&gbBsMac)
370         {
371                 var wndOldPopupLinks= window.open(document.location.href, "popuplinks");
372                 wndOldPopupLinks.close();
373                 setTimeout("_PopupMenu_Invoke_2();",100);
374         }
375         else
376         {
377                 _PopupMenu_Invoke_2();
378         }
379 }
380
381 function _PopupMenu_Invoke_2()
382 {
383         var fn_arguments = gfn_arguments;
384         gfn_arguments = null;
385         
386         // Make sure we have reasonable arguments
387         var argLen = fn_arguments.length;
388         if (argLen < 3) {
389                 return false;
390         }
391
392         // Check to see if we only have one target
393         var strTarget = "";
394         var targetDoc = null;
395         if (fn_arguments[1] == '') {
396                 if (BSSCPopup_IsPopup()) {
397                         targetDoc = parent;
398                         strTarget = "TARGET= _parent";
399                 }
400                 else
401                         targetDoc = window.document;
402         } else {
403                 targetDoc = _GetFrameByName( parent, fn_arguments[1] );
404
405                 strTarget = "TARGET='" + fn_arguments[1] + "'";
406         }
407
408         if ((!gbBsIE4 && !gbBsNS4 && !gbBsOpera7 && !gbBsKonqueror3 &&!gbBsSafari) || ((gbBsMac) && (gbBsIE4) && (window.event.srcElement.tagName == "AREA"))) {
409         
410                 var argLen      = fn_arguments.length;
411
412                 // Create the window that the hyperlinks will go into
413                 var nHeight = argLen * 15;
414                 var nWidth = 400;
415                 var strParam = "titlebar=no,toolbar=no,status=no,location=no,menubar=no,resizable=yes,scrollbars=auto";
416                 strParam += ",height=" + nHeight + ",width=200";
417                 strParam += ",resizable";
418
419                 var wndTemp=null;
420                 // Create a temporary window first to ensure the real popup comes up on top
421                 if (!gbBsOpera)
422                         wndTemp = window.open("", "temp", strParam);
423
424                 // Create the real popup window
425                 var wndPopupLinks=null;
426                 if (gbBsOpera&&gbBsMac)
427                 {
428                         wndTemp = window.open(document.location.href, "temp", strParam);
429                         wndPopupLinks= window.open(document.location.href, "popuplinks", strParam);
430                 }
431                 else
432                         wndPopupLinks= window.open("", "popuplinks", strParam);
433                 wndPopupLinks.document.open("text/html");
434
435                 // Close the temporary
436                 if (wndTemp)
437                         wndTemp.close();
438
439                 var sHTML="<html><head></head>";
440                 sHTML+="<body onBlur=\'self.focus();\'>";
441                 var strParaLine = "";
442                 for (var i = 0; i < (argLen - 2) / 2; i++) {
443                         strParaLine = "";
444                         strParaLine += "<a href=\"javascript:";
445                         if (gbBsIE) {
446                                 strParaLine += "onBlur=null; ";
447                         }
448                         strParaLine += "opener.location=\'";
449                         strParaLine += fn_arguments[2 * i + 3];
450                         strParaLine += "\';close();\"";
451                         strParaLine += strTarget;
452
453                         strParaLine += ">";
454                         strParaLine += fn_arguments[2 * i + 2];
455                         strParaLine += "</a>";
456                         strParaLine += "<br>";
457                         sHTML+=strParaLine;
458                 }
459                 sHTML+="</body></html>";
460                 wndPopupLinks.document.write(sHTML);
461                 wndPopupLinks.document.close();
462                 window.gbInPopupMenu = true;
463                 if (!gbBsIE) {
464                         wndPopupLinks.focus();
465                 }
466                 return false;
467         }
468
469         if (((argLen < 5) && ((isNaN(fn_arguments[2])) || (gbPopupMenuTopicList == null))) ||
470                 ((argLen < 4) && ((!isNaN(fn_arguments[2])) && (gbPopupMenuTopicList != null)))) {
471                 // Get the place that we will be putting the topic into
472                 var strURL = "";
473                 if (isNaN(fn_arguments[2]) ||  (gbPopupMenuTopicList == null)) {
474                         strURL = fn_arguments[3];
475                 }
476                 else    {
477                         strURL = gbPopupMenuTopicList[fn_arguments[2]].strURL;
478                 }
479
480                 if (targetDoc != null) {
481                         targetDoc.location.href = strURL;
482                 }
483                 else {
484                         if (fn_arguments[1] != null && typeof(fn_arguments[1]) != "undefined")
485                                 window.open(strURL, fn_arguments[1]);
486                         else
487                                 window.open(strURL);
488                 }               
489                 window.gbInPopupMenu = true;
490                 return false;
491         }
492         
493         var strMenu = "";
494         if (gbBsNS4&&!gbBsNS6) {
495                 strMenu = '<TABLE BORDER="1" CELLSPACING=0 CELLPADDING=3 BGCOLOR="#c0c0c0">';
496         } else {
497                 strMenu = '<TABLE STYLE="border:2px outset white;" CELLSPACING=0';
498                 if (gbBsMac) {
499                         strMenu += ' CELLPADDING=4';
500                 } else {
501                         strMenu += ' CELLPADDING=2';
502                 }       
503                 strMenu += ' BGCOLOR=#c0c0c0>';
504         }
505         // Add each of the items
506         var i = 2;
507         while (i <= argLen - 1) {
508                 strMenu += '<TR><TD><NOBR>'
509                 // If the destination is a number then look it up in the topic list
510                 if (isNaN(fn_arguments[i]) ||  (gbPopupMenuTopicList == null)) {
511                         strMenu += '<DIV STYLE="padding-left:3pt; padding-right:3pt;"><A HREF="' + fn_arguments[i + 1] + '"' + strTarget;
512                 } else {
513                         strMenu += '<DIV STYLE="padding-left:3pt; padding-right:3pt;"><A HREF="' + gbPopupMenuTopicList[fn_arguments[i]].strURL + '"' + strTarget;
514                 }
515                 strMenu += ' onclick="PopupMenu_HandleClick(event);"';
516                 strMenu += ' onmouseover="PopupMenu_Over(event);"';
517                 strMenu += ' onmouseout="PopupMenu_Out(event);"';
518                 strMenu += '>';
519                 if (isNaN(fn_arguments[i]) || (gbPopupMenuTopicList == null)) {
520                         strMenu += '<SPAN CLASS="PopupNotOver">' + fn_arguments[i] + '</SPAN>';
521                 } else {
522                         strMenu += '<SPAN CLASS="PopupNotOver">' + gbPopupMenuTopicList[fn_arguments[i]].strTitle + '</SPAN>';
523                 }
524                 strMenu += '</A></DIV></NOBR></TD></TR>';
525
526                 if (isNaN(fn_arguments[i]) || (gbPopupMenuTopicList == null)) {
527                         i += 2;
528                 } else {
529                         i += 1;
530                 }
531         }
532         strMenu += "</TABLE>";
533
534         if (gbBsMac) {
535         // totally hack. because ie5 in mac need something. </TABLE> is one of them. mac is mad.
536                 strMenu +="<TABLE></TABLE>";
537         }
538
539         var layerPopup = null;
540         var stylePopup = null;
541         var nEventX = 0;
542         var nEventY = 0;
543         var nWindowWidth = 0;
544         if (gbBsIE4 || gbBsOpera7) {
545
546                 layerPopup = getElement("PopupMenu");
547                 layerPopup.innerHTML = strMenu;
548                 stylePopup = layerPopup.style;
549
550                 _BSPSGetClientSize();
551
552                 // Get the position of the item causing the event (relative to its parent)
553                 nEventX = window.event.clientX;
554                 nEventY = window.event.clientY;
555
556                 if (nEventY + layerPopup.scrollHeight + 10 < gBsClientHeight) {
557                         nEventY += document.body.scrollTop + 10;
558                 } else {
559                         nEventY = (document.body.scrollTop + gBsClientHeight) - layerPopup.scrollHeight - 20;
560                 }
561                 stylePopup.top = nEventY;
562                 
563                 var nPopupWidth = layerPopup.scrollWidth;
564                 if (gbBsMac) {
565                         nPopupWidth = 80; // we have no idea how to get the dynamic width of the popup.
566                 }
567                 if (nEventX + nPopupWidth + 20 > gBsClientWidth) {
568                         if (gBsClientWidth - nPopupWidth < 5) {
569                                 stylePopup.left = 5;
570                         } else {
571                                 stylePopup.left = gBsClientWidth - nPopupWidth - 5;
572                         }
573                 } else {
574                         stylePopup.left = nEventX + document.body.scrollLeft + 20;
575                 }
576
577                 stylePopup.visibility = "visible";
578                 if (!gOlddocumentClick && document.onclick)
579                         gOlddocumentClick = document.onclick;
580                 document.onclick = PopupMenu_HandleClick;
581
582         } else if (gbBsNS6 || gbBsKonqueror3||gbBsSafari) {
583                 layerPopup = getElement("PopupMenu");
584                 layerPopup.style.visibility = "hidden";
585         
586                 if (gbBsNS6)
587                 {
588                         var e = fn_arguments[0];
589                         nEventX = e.pageX;
590                         nEventY = e.pageY;
591                 }
592                 else
593                 {
594                         nEventX = window.event.clientX;
595                         nEventY = window.event.clientY;
596                 }
597                 _BSPSGetClientSize();
598                 layerPopup.innerHTML = strMenu;
599
600                 if (nEventY + layerPopup.offsetHeight + 20  <  window.pageYOffset + gBsClientHeight) {
601                         nEventY += 20;
602                 } else {
603                         nEventY = gBsClientHeight + window.pageYOffset - layerPopup.offsetHeight - 20;
604                 }
605
606                 if (nEventX + layerPopup.offsetWidth + 20 > gBsClientWidth + window.pageXOffset) {
607                         if (gBsClientWidth + window.pageXOffset - layerPopup.offsetWidth < 20) {
608                                 nEventX = 5;
609                         } else {
610                                 nEventX = gBsClientWidth + window.pageXOffset - layerPopup.offsetWidth - 20;
611                         }
612                 } else {
613                         nEventX += 20;
614                 }
615                 layerPopup.style.top = nEventY;
616                 layerPopup.style.left = nEventX;
617                 // set again to avoid the stupid frash in netscape 6.
618                 layerPopup.innerHTML = strMenu;
619                 layerPopup.style.visibility = "visible";
620                 //window.captureEvents(Event.MOUSEDOWN);
621                 if (!gOlddocumentClick && document.onclick)
622                         gOlddocumentClick = document.onclick;
623                 window.onclick = PopupMenu_HandleClick;
624         }
625         else if (gbBsNS4) {
626                 layerPopup = document.layers.PopupMenu;
627                 layerPopup.visibility = "hide";
628                 stylePopup = layerPopup.document;
629                 stylePopup.write(strMenu);
630                 stylePopup.close();
631                 var e = fn_arguments[0];
632                 nEventX = e.pageX;
633                 nEventY = e.pageY;
634                 _BSPSGetClientSize();
635                 if (nEventY + layerPopup.clip.height + 20 < window.pageYOffset + gBsClientHeight) {
636                         nEventY += 20;
637                 } else {
638                         nEventY = gBsClientHeight + window.pageYOffset- layerPopup.clip.height - 20;
639                 }
640                 layerPopup.top = nEventY;
641
642                 if (nEventX + layerPopup.clip.width + 20 > gBsClientWidth + window.pageXOffset) {
643                         if (gBsClientWidth + window.pageXOffset - layerPopup.clip.width < 20) {
644                                 nEventX = 5;
645                         } else {
646                                 nEventX = gBsClientWidth + window.pageXOffset - layerPopup.clip.width - 20;
647                         }
648                 } else {
649                         nEventX += 20;
650                 }
651
652                 layerPopup.left = nEventX;
653
654                 layerPopup.visibility = "show";
655
656                 window.captureEvents(Event.MOUSEDOWN);
657                 if (!gOlddocumentClick && document.onmousedown)
658                         gOlddocumentClick = document.onmousedown;
659                 window.onmousedown = PopupMenu_HandleClick;
660         }
661
662         window.gbInPopupMenu = true;
663         window.gbPopupMenuTimeoutExpired = false;
664         setTimeout("PopupMenu_Timeout();", 100);
665         return false;
666 }
667
668 function PopupMenu_Timeout()
669 {
670         window.gbPopupMenuTimeoutExpired = true;
671 }
672
673 function PopupMenu_Over(e)
674 {
675     if (gbBsIE4||gbBsOpera7)
676                 e.srcElement.className = "PopupOver";
677     else if (gbBsNS6)
678                 e.target.parentNode.className = "PopupOver";
679         return;
680 }
681
682 function PopupMenu_Out(e)
683 {
684     if (gbBsIE4||gbBsOpera7)
685                 e.srcElement.className = "PopupNotOver";
686     else if (gbBsNS6)
687                 e.target.parentNode.className = "PopupNotOver";
688         return;
689 }
690
691 function PopupMenu_HandleClick(e)
692 {
693         if (window.gbPopupMenuTimeoutExpired) {
694                 window.gbInPopupMenu = false;
695                 if (gbBsNS4 && !gbBsNS6) {
696                         window.releaseEvents(Event.MOUSEDOWN);
697                 }
698
699                 var layerPopup = null;
700                 if (gbBsNS4&&!gbBsNS6) {
701                         layerPopup = document.layers.PopupMenu;
702                         layerPopup.visibility = "hide";
703                 } else {
704                         layerPopup = getElement("PopupMenu");
705                         layerPopup.style.visibility = "hidden";
706                 }
707         
708                 if (gOlddocumentClick)
709                 {
710                         if (gbBsNS4 && !gbBsNS6)
711                                 document.onmousedown = gOlddocumentClick;
712                         else
713                                 document.onclick = gOlddocumentClick;
714                 }
715         }
716         return;
717 }
718
719 function BSSCPopup_ClickMac()
720 {
721         if ((!DHTMLPopupSupport()) && (gbBsIE4 || gbBsOpera7))
722         {       
723                 var bClickOnAnchor = false;
724                 var el;
725                 if ((window.event != null) &&
726                     (window.event.srcElement != null))
727                 {
728                     el = window.event.srcElement;
729                         while (el != null)
730                         {
731                                 if ((el.tagName == "A") || (el.tagName == "AREA"))      {
732                                         bClickOnAnchor = true;
733                                         break;
734                                 }
735                                 if (el.tagName == "BODY") {
736                                         break;
737                                 }
738                                 el = getParentNode(el);
739                         }
740                 }
741                 if (BSSCPopup_IsPopup())
742                 {
743                         if (!bClickOnAnchor) {
744                                 parent.window.gPopupWindow = null;
745                                 self.close();
746                         }
747                 }
748                 else
749                 {
750                         bClosePopupWindow = true;
751                         if ((bClickOnAnchor) &&
752                                 (el.href) &&
753                             ((el.href.indexOf("javascript:BSSCPopup") != -1) || (el.href.indexOf("javascript:null") != -1) || (el.href.indexOf("javascript:void(0)") != -1)))
754                         {
755                                 bClosePopupWindow = false;
756                         }
757                         if (bClosePopupWindow)
758                         {
759                                 if (window.gPopupWindow != null && !window.gPopupWindow.closed )
760                                 {
761                                         window.gPopupWindow.close();
762                                 }
763                         }
764                 }
765         }
766 }
767
768 function BsPopupOnClick()
769 {
770         if (!gbBsIE4 && !gbBsOpera7)
771                 return;
772
773         BSSCPopup_ClickMac();
774 }
775
776 function _BSSCOnError(message)
777 {
778         if(-1 != message.indexOf("denied") 
779                 || -1 != message.indexOf("Object required"))
780          return true;
781 }
782
783 //End to support previous relative topics
784
785 /// Section End - General and relative topics (JavaScript 1.0)
786
787 /// Section Begin  - Popup (JavaScript 1.0)
788 //Begin to support previous popup functions
789
790 //variables used to isolate the browser type
791 var gBsStyVisShow       = null;
792 var gBsStyVisHide       = null;
793 var gBsClientWidth      = 640;
794 var gBsClientHeight = 480;
795
796 // here is the varible for judge popup windows size. these parameter is for IE5.0, it may need adjust for others.
797 var gBRateH_W           = 0.618; // 1.618 Golden cut.
798 var gBMaxXOfParent      = 0.8; 
799 var gBMaxYOfParent      = 0.8;
800 var gBscrollHeight   = 16;
801 var gBscrollWidth   =  16;
802 var gBpermitXDelta      = 3;
803 var gBpermitYDelta      = 3;
804
805
806 var arrayPopupURL = new Array();
807 var arrayAbsPopupURL = new Array();
808
809 var arrayDirty = new Array();
810
811 function setAbsPopupURL(nIndex, strURL)
812 {
813         arrayAbsPopupURL[nIndex] = strURL;
814 }
815
816 function getAbsPopupURL(nIndex)
817 {
818         if (nIndex == -1 || arrayAbsPopupURL.length <= nIndex) return null;
819         else 
820                 return arrayAbsPopupURL[nIndex];
821 }
822
823 function getPopupURL(nIndex)
824 {
825         if (nIndex == -1 || arrayPopupURL.length <= nIndex) return null;
826         else 
827                 return arrayPopupURL[nIndex];
828 }
829
830 function getPopupID(nIndex)
831 {
832         return gstrPopupID + nIndex;
833 }
834
835 function getPopupShadowID(nIndex)
836 {
837         return gstrPopupShadowID + nIndex;
838 }
839
840 function getPopupTopicID(nIndex)
841 {
842         return gstrPopupTopicID + nIndex;
843 }
844
845 function getPopupIFrameID(nIndex)
846 {
847         return gstrPopupIFrameID + nIndex;
848 }
849
850 function getPopupIFrameName(nIndex)
851 {
852         return gstrPopupIFrameName + nIndex;
853 }
854
855
856 function getPopupTopicStyle(nIndex)
857 {
858         return getElement(getPopupTopicID(nIndex)).style;
859 }
860
861 function getPopupShadowStyle(nIndex)
862 {
863         return getElement(getPopupShadowID(nIndex)).style;
864 }
865
866 function getPopupIFrame(nIndex)
867 {
868         if (gbBsNS6)
869                 return eval("window.frames['" + getPopupIFrameName(nIndex) + "']");
870         else
871                 return eval("document.frames['" + getPopupIFrameName(nIndex) + "']");
872 }
873
874 function getPopupDivStyle(nIndex)
875 {
876         return getElement(getPopupID(nIndex)).style;
877 }
878
879 function getPopupIFrameStyle(nIndex)
880 {
881         return getElement(getPopupIFrameID(nIndex)).style;
882 }
883
884
885 function findDiv(strURL)
886 {
887         for (var i = 0; i < arrayPopupURL.length; i ++ ) {
888                 if (arrayPopupURL[i] == strURL) {
889                         return i;
890                 }
891         }
892         return -1;
893 }
894
895 var gnToken = -1;
896 function takeToken()
897 {
898         gnToken ++;
899         if (gnToken > 10000) gnToken = 0;
900         return gnToken;
901 }
902
903 function IsValidToken(nToken)
904 {
905         return (gnToken == nToken);
906 }
907
908 function addDiv(strURL)
909 {
910         for (var i = 0; i < arrayPopupURL.length; i ++) {
911                 if (arrayPopupURL[i] == null) {
912                         arrayPopupURL[i] = strURL;
913                         return i;
914                 }
915         }       
916         arrayPopupURL[i] = strURL;
917         arrayDirty[i] = true;
918         return i;
919 }
920
921 function setDirty()
922 {
923         for (var i = 0; i < arrayPopupURL.length; i ++ )
924                 arrayDirty[i] = true;
925 }
926
927 function IsDirty(nIndex)
928 {
929         if (nIndex == -1)
930                 return true;
931         else 
932                 if (arrayDirty.length > nIndex) 
933                         return arrayDirty[nIndex];
934                 else
935                         return true;
936 }
937
938 function hideAll()
939 {
940         for (var i = 0; i < arrayPopupURL.length; i ++ )
941         {
942                 getPopupDivStyle(i).visibility = gBsStyVisHide;
943                 getPopupIFrameStyle(i).visibility = gBsStyVisHide;
944         }
945 }
946
947 function getCurrentPopupIFrame()
948 {
949         for (var i = 0; i < arrayPopupURL.length; i ++)
950                 if (getPopupDivStyle(i).visibility == gBsStyVisShow)
951                         return getPopupIFrame(i);
952         return null;
953 }
954
955 function setClear(nIndex)
956 {
957         if (nIndex != -1)
958                 arrayDirty[nIndex] = false;
959 }
960
961 function _BSSCCreatePopupDiv(strURL)
962 {
963         var nIndex = findDiv(strURL);
964         if (nIndex == -1 ) {
965                 nIndex = addDiv(strURL);
966                 BsPopup_CreateDiv(nIndex);
967         }
968         else {
969                 if (IsDirty(nIndex)) {
970                         if("object" == typeof(getPopupIFrame(nIndex).document))
971                                 getPopupIFrame(nIndex).document.location.href = strURL;
972                 }
973         }
974         return nIndex;
975 }
976
977 //Here is the browser type 
978 function _BSPSGetBrowserInfo()
979 {
980         if (gbBsNS4&&!gbBsNS6)
981         {
982                 gBsStyVisShow   = "show";
983                 gBsStyVisHide   = "hide";
984         }
985         else
986         {
987                 gBsStyVisShow   = "visible";
988                 gBsStyVisHide   = "hidden";
989         }
990 }
991
992 _BSPSGetBrowserInfo();
993
994 //Get client size info
995 function _BSPSGetClientSize()
996 {
997         if (gbBsNS4||gbBsKonqueror3||gbBsSafari)
998         {
999                 gBsClientWidth  = innerWidth;
1000                 gBsClientHeight = innerHeight;
1001         }
1002         else if (gbBsIE4 || gbBsOpera7)
1003         {
1004                 gBsClientWidth  = document.body.clientWidth;
1005                 gBsClientHeight = document.body.clientHeight;
1006         }
1007 }
1008
1009 var gstrPopupID = 'BSSCPopup';
1010 var gstrPopupShadowID = 'BSSCPopupShadow';
1011 var gstrPopupTopicID = 'BSSCPopupTopic';
1012 var gstrPopupIFrameID = 'BSSCPopupIFrame';
1013 var gstrPopupIFrameName = 'BSSCPopupIFrameName';
1014
1015 var gstrPopupSecondWindowName = 'BSSCPopup';
1016
1017 var gPopupWindow = null;
1018 var gnPopupClickX = 0;
1019 var gnPopupClickY = 0;
1020
1021 var gnPopupScreenClickX = 0;
1022 var gnPopupScreenClickY = 0;
1023
1024 var gbPopupTimeoutExpired = false;
1025
1026 function DHTMLPopupSupport()
1027 {
1028         if (((gbBsIE4) && (!gbBsMac))||gbBsOpera7|| gbBsNS7) {
1029                 return true;
1030         }
1031         return false;
1032 }
1033
1034 function BSSCPopup_IsPopup()
1035 {
1036         if (DHTMLPopupSupport() && (this.name.indexOf(gstrPopupIFrameName) != -1)) {
1037                 return true;
1038         } else if ((gbBsNS4 || gbBsIE4 || gbBsOpera7) && (this.name.indexOf(gstrPopupID) != -1)) {
1039                 return true;
1040         } else {
1041                 return false;
1042         }
1043 }
1044
1045 // If there is a hyperlink in a popup window, display the hyperlink in
1046 // the original window. (bsscright)
1047 if (BSSCPopup_IsPopup() && !gbBsIE4 && !gbBsOpera7) {
1048         document.write("<base target=\"bsscright\">");
1049 }
1050
1051 // Local functions.
1052 function BsPopup_CreateDiv(nIndex)
1053 {
1054         if(!DHTMLPopupSupport())
1055                 return;
1056         // DO NOT SET Width and height for the div, otherwize it will make IE4 popup do not work when view the topic alone.
1057         var strPopupDiv = "<DIV ID='" + getPopupID(nIndex) + "' STYLE='position:absolute; top:-100; left:0; z-index:600; visibility:hidden;'>";
1058         strPopupDiv += "<DIV ID='" + getPopupShadowID(nIndex) + "' STYLE=\"position:absolute;top:0; left:0;  background-color:#C0C0C0;\"></DIV>";
1059         strPopupDiv += "<DIV ID='" + getPopupTopicID(nIndex) + "' STYLE=\"position:absolute;top:0; left:0;  background-color:#FFFFFF;border:1px #000000 outset;\">";
1060         strPopupDiv += "<IFRAME title=\"Popup Window\" ID='" + getPopupIFrameID(nIndex) + "' name='" + getPopupIFrameName(nIndex) + "' src = '" + getPopupURL(nIndex) + "' frameborder=0 scrolling=auto></IFRAME>";
1061         strPopupDiv += "</DIV></DIV>";
1062
1063         var objBody = getElementsByTag(document, "BODY")[0];
1064         if( typeof(objBody) != "object" )
1065                 return;
1066
1067         insertAdjacentHTML(objBody, "beforeEnd", strPopupDiv);
1068 }
1069
1070 function handleLoadNS()
1071 {
1072         if (this.id)
1073         {
1074                 var nIndex = parseInt(this.id.substring(gstrPopupIFrameID.length));
1075                 BSSCPopup_PostWork(nIndex);
1076         }
1077 }
1078
1079 function BSSCPopup_PostWork(nIndex)
1080 {
1081         getPopupDivStyle(nIndex).visibility = gBsStyVisShow;
1082         getPopupIFrameStyle(nIndex).visibility =gBsStyVisShow;
1083
1084         setClear(nIndex);
1085         window.gbPopupTimeoutExpired = true;
1086
1087         BSSCPopup_ChangeTargettoParent(getPopupIFrame(nIndex).document);
1088         if (gbBsNS6)
1089                 getPopupIFrame(nIndex).document.body.addEventListener("click",BSSCPopupClicked,false);
1090         else
1091                 getPopupIFrame(nIndex).document.body.onclick = BSSCPopupClicked;
1092
1093         if (!gbOrignalOnMouseDown && document.onmousedown)
1094                 gbOrignalOnMouseDown = document.onmousedown;
1095
1096         if (gbBsNS6)
1097                 document.addEventListener("mousedown", BSSCPopupParentClicked,false);
1098         else
1099                 document.onmousedown = BSSCPopupParentClicked;
1100 }
1101
1102 function BSSCPopup_Timeout(nIndex, nToken)
1103 {
1104     if (!IsValidToken(nToken)) return;
1105
1106         if (gbBsNS6||((getPopupIFrame(nIndex).document.readyState == "complete") &&
1107                 (getPopupIFrame(nIndex).document.body != null))) {
1108                 BSSCPopup_PostWork(nIndex);
1109         } else {
1110                 setTimeout("BSSCPopup_Timeout(" + nIndex + "," + nToken + ")", 100);
1111         }
1112 }
1113
1114 // VH 08/10/00 
1115 // do not change target to parent if the href is using javascript
1116 function BSSCPopup_ChangeTargettoParent(tagsObject)
1117 {
1118         var collA = getElementsByTag(tagsObject, "A");
1119         BSSCPopup_ChangeTargettoParent2(collA);
1120
1121         var collIMG = getElementsByTag(tagsObject,"IMG");
1122         BSSCPopup_ChangeTargettoParent2(collIMG);
1123 }
1124
1125 function BSSCPopup_ChangeTargettoParent2(colls)
1126 {
1127         if (colls != null)  {
1128                 for (var j = 0; j < colls.length; j ++ )
1129                 {
1130                         var strtemp = colls[j].href;
1131                         if (strtemp)
1132                         {
1133                                 strtemp = strtemp.toLowerCase();
1134                                 if (strtemp.indexOf("javascript:") == -1)
1135                                 if (colls[j].target == "")
1136                                         colls[j].target = "_parent";
1137                         }
1138                 }
1139         }
1140 }
1141
1142 function BSPSPopupTopicWinHelp(strURL)
1143 {
1144         _BSSCPopup(strURL);
1145         return;
1146 }
1147
1148 function _BSSCPopup(strURL, width, height)
1149 {
1150         var cuswidth = 0;
1151         var cusheight = 0;
1152         if ("undefined" != typeof(width) && "undefined" != typeof(height)) {
1153                 cuswidth = width;
1154                 cusheight= height;
1155         }
1156         
1157         if (DHTMLPopupSupport()) {
1158                 var nToken = takeToken(); // take  token first.
1159                 var nIndex = _BSSCCreatePopupDiv(strURL);
1160                 window.gbPopupTimeoutExpired = false;
1161                 var ntWidth = gBsClientWidth;
1162                 var ntHeight = gBsClientHeight;
1163                 _BSPSGetClientSize();
1164                 if (ntWidth != gBsClientWidth || ntHeight != gBsClientHeight) {
1165                         setDirty();
1166                 }
1167
1168                 if (IsDirty(nIndex)) {
1169                         if (gbBsMac) {
1170                                 setTimeout("BSSCPopup_AfterLoad(" + nIndex + "," + nToken + "," + cuswidth + "," + cusheight  +")", 400);
1171                         } else {
1172                                 setTimeout("BSSCPopup_AfterLoad(" + nIndex + "," + nToken + "," + cuswidth + "," + cusheight + ")", 100);
1173                         }
1174                 }
1175                 else {
1176                         MoveDivAndShow(nIndex ,nToken, cuswidth, cusheight);
1177                 }
1178         } else {
1179                 _BSSCPopup2(strURL, cuswidth, cusheight);
1180         }
1181         return;
1182 }
1183
1184 if (gbBsIE55)
1185 {
1186         var ehlpdhtm_fOldBefureUnload = window.onbeforeunload;
1187         var gnBsUnload=0;
1188         window.onbeforeunload = window_BUnload;
1189 }
1190         
1191 function window_BUnload()
1192 {
1193         gnBsUnload++;
1194         if (gnBsUnload>1)
1195                 return;
1196         for (var i = 0; i < arrayPopupURL.length; i ++)
1197                 removeThis(document.all(getPopupID(i)));
1198         arrayPopupURL.length = 0;       
1199         if (ehlpdhtm_fOldBefureUnload)
1200                 ehlpdhtm_fOldBefureUnload();
1201 }
1202
1203 function _BSSCPopup2(strURL, width, height)
1204 {
1205         if (gbBsOpera6&&gbBsMac)
1206         {
1207                 var wmTemp = window.open(document.location.href, gstrPopupSecondWindowName);
1208                 wmTemp.close();
1209                 setTimeout("_BSSCPopup3(\""+strURL+"\","+width+","+height+");",100);
1210         }
1211         else
1212                 _BSSCPopup3(strURL, width, height);
1213 }
1214                 
1215 function _BSSCPopup3(strURL, width, height)
1216 {
1217         if (window.name == gstrPopupSecondWindowName) {
1218                 window.location = strURL;
1219         } else {
1220                 if (!gbBsMac || !gbBsNS4) {
1221                         BSSCHidePopupWindow();
1222                 }
1223                 var nX = 0;
1224                 var nY = 0;
1225                 var nHeight = 300;
1226                 var nWidth = 400;
1227                 if (width > 0 && height > 0) {
1228                         nHeight = height;
1229                         nWidth = width;
1230                 }
1231                 _BSPSGetClientSize();
1232
1233                 nX = window.gnPopupScreenClickX;
1234                 nY = window.gnPopupScreenClickY;
1235
1236                 if (nY + nHeight + 40 > screen.availHeight) {
1237                         nY = screen.availHeight - nHeight - 40;
1238                 }
1239                 if (nX + nWidth + 40 > screen.availWidth) {
1240                         nX = screen.availWidth - nWidth - 40;
1241                 }
1242
1243                 // Launch a separate window
1244                 var strParam="titlebar=no,toolbar=no,status=no,location=no,menubar=no,resizable=yes,scrollbars=yes";
1245                 if (gbBsNS) {
1246                         if (gbBsNS6) {
1247                                 strParam += ",Height=" + nHeight + ",Width=" + nWidth;
1248                                 strParam += ",screenX=" + nX + ",screenY=" + nY;
1249                                 strParam += ",dependent=yes";
1250                         }
1251                         else {
1252                                 strParam += ",OuterHeight=" + nHeight + ",OuterWidth=" + nWidth;
1253                                 strParam += ",screenX=" + nX + ",screenY=" + nY;
1254                                 strParam += ",dependent=yes";
1255                         }
1256                 }
1257                 else {
1258                         strParam += ",height=" + nHeight + ",width=" + nWidth;
1259                         strParam += ",left=" + nX + ",top=" + nY;
1260                 }
1261                 if (gbBsSafari)
1262                 {
1263                         if (window.gPopupWindow)
1264                                 window.gPopupWindow.close();            
1265                         window.gPopupWindow = window.open(strURL, "", strParam);
1266                         window.gPopupWindow.name = gstrPopupSecondWindowName;
1267                         window.gPopupWindow.moveTo(nX, nY);
1268                         widnow.gPopupWindow.document.location.reload();
1269                 }       
1270                 else
1271                 {
1272                         var wmTemp=null;
1273                         if (gbBsKonqueror3)
1274                         {
1275                                 if (window.gPopupWindow)
1276                                         window.gPopupWindow.close();
1277                         }
1278                         if (gbBsOpera&&gbBsMac)
1279                         {
1280                                 wmTemp= window.open(document.location.href, "Temp", strParam);
1281                         }
1282                         window.gPopupWindow = window.open(strURL, gstrPopupSecondWindowName, strParam);
1283                         if (!gbBsIE)
1284                                 window.gPopupWindow.focus();
1285                                 
1286                         if (wmTemp)
1287                                 wmTemp.close();
1288                 }
1289
1290                 if (gbBsNS4)
1291                         setEventHandle();
1292                 else if (gbBsIE4 || gbBsOpera7||gbBsKonqueror3)
1293                         setTimeout("setPopupFocus();", 100);
1294         }
1295         return;
1296 }
1297
1298 function setEventHandle()
1299 {
1300         window.gPopupWindow.captureEvents(Event.CLICK | Event.BLUR);
1301         window.gPopupWindow.onclick = NonIEPopup_HandleClick;
1302         window.gPopupWindow.onblur = NonIEPopup_HandleBlur;
1303 }
1304
1305 function setPopupFocus()
1306 {
1307         window.gPopupWindow.focus();
1308 }
1309
1310 function NonIEPopup_HandleBlur(e)
1311 {
1312         window.gPopupWindow.focus();
1313 }
1314
1315 function NonIEPopup_HandleClick(e)
1316 {
1317         // Because navigator will give the event to the handler before the hyperlink, let's
1318         // first route the event to see if we are clicking on a Popup menu in a popup.
1319         document.routeEvent(e);
1320
1321         // If a popup menu is active then don't do anything with the click
1322         if (window.gPopupWindow.gbInPopupMenu) {
1323                 window.gPopupWindow.captureEvents(Event.CLICK);
1324                 window.gPopupWindow.onclick = NonIEPopup_HandleClick;
1325                 return false;
1326         }
1327
1328         // Close the popup window
1329         if(e.target.href)
1330         {
1331                 if(e.target.href.indexOf("javascript:")==-1) 
1332                 {
1333                         if (e.target.target=="")
1334                                 window.location.href = e.target.href;
1335                         else
1336                                 window.open(e.target.href, e.target.target);
1337                         this.close();
1338                 }
1339         } 
1340         else
1341                 this.close();
1342         return false;
1343 }
1344
1345 function BSSCPopup_AfterLoad(nIndex, nToken, cuswidth, cusheight)
1346 {       
1347         if (!window.getPopupIFrame(nIndex).document) {
1348                 _BSSCPopup2(getPopupURL(nIndex), cuswidth, cusheight);
1349                 return;
1350         }
1351         
1352     if (!IsValidToken(nToken)) return;
1353
1354         if (gbBsNS6)
1355         {
1356                 setAbsPopupURL(nIndex, window.getPopupIFrame(nIndex).document.location.href); // change URL to abs url.
1357                 BSSCPopup_ResizeAfterLoad(nIndex, nToken, cuswidth, cusheight);
1358                 return;
1359         }
1360         
1361         if ((window.getPopupIFrame(nIndex).document.readyState == "complete") &&
1362                 (window.getPopupIFrame(nIndex).document.body != null)) {
1363                         if (window.getPopupIFrame(nIndex).document.location.href.indexOf("about:blank") != -1) { // add this check. IE will use about:blank" as the default vaule for Iframe.
1364                                 window.getPopupIFrame(nIndex).document.location = getPopupURL(nIndex);
1365                                 setTimeout("BSSCPopup_AfterLoad(" + nIndex + "," + nToken + "," + cuswidth + "," + cusheight + ")", 200);
1366                         }
1367                         else
1368                                 {
1369                                         setAbsPopupURL(nIndex, window.getPopupIFrame(nIndex).document.location.href); // change URL to abs url.
1370                                         BSSCPopup_ResizeAfterLoad(nIndex, nToken, cuswidth, cusheight);
1371                                 }
1372         } else {
1373                 setTimeout("BSSCPopup_AfterLoad(" + nIndex + "," + nToken + "," + cuswidth + "," + cusheight + ")", 200);
1374         }
1375 }
1376
1377 function BSSCPopup_ResizeAfterLoad(nIndex, nToken, cuswidth, cusheight)
1378 {
1379         if (window.gbPopupTimeoutExpired) return;
1380
1381     if (!IsValidToken(nToken)) return;
1382
1383         getPopupDivStyle(nIndex).visibility = gBsStyVisHide;
1384         getPopupIFrameStyle(nIndex).visibility = gBsStyVisHide;
1385
1386         // Determine the width and height for the window
1387         _BSPSGetClientSize();
1388
1389         var size = new BSSCSize(0, 0);
1390
1391         if (cuswidth <= 0 || cusheight <= 0)
1392                 BSSCGetContentSize(window.getPopupIFrame(nIndex), size);
1393         else {
1394                 size.x = cuswidth;
1395                 size.y = cusheight;
1396         }
1397
1398         // Determine the width and height for the window
1399         var nWidth = size.x;
1400         var nHeight = size.y;
1401
1402         // for small popup size, we should allow any size.
1403         // The popup size should be ok if bigger than 0
1404         if (nWidth < 0 || nHeight < 0) return;  // there must be something terribly wrong.              
1405
1406         getPopupDivStyle(nIndex).width = nWidth;
1407         getPopupDivStyle(nIndex).height = nHeight;
1408
1409         getPopupShadowStyle(nIndex).width = nWidth;
1410         getPopupShadowStyle(nIndex).height = nHeight;
1411         getPopupTopicStyle(nIndex).width = nWidth;
1412         getPopupTopicStyle(nIndex).height = nHeight;
1413         if (gbBsIE55)
1414         {
1415                 getPopupShadowStyle(nIndex).width = nWidth + 2;
1416                 getPopupShadowStyle(nIndex).height = nHeight + 2;
1417                 getPopupTopicStyle(nIndex).width = nWidth + 2;
1418                 getPopupTopicStyle(nIndex).height = nHeight + 2;
1419         }
1420
1421         getPopupIFrameStyle(nIndex).width = nWidth;
1422         getPopupIFrameStyle(nIndex).height = nHeight;
1423         if (gbBsIE55 || gbBsNS6)
1424         {
1425                 getPopupIFrameStyle(nIndex).top = 0;
1426                 getPopupIFrameStyle(nIndex).left = 0;
1427         }
1428         
1429         var strURL = getPopupURL(nIndex);
1430         if (strURL.indexOf("#") != -1&&gbBsNS6)
1431                 getPopupIFrame(nIndex).location.reload();
1432         else if (strURL.indexOf("#") != -1||gbBsNS6)
1433                 getPopupIFrame(nIndex).location.href = strURL;  // reload again, this will fix the bookmark misunderstand in IE5.
1434                 
1435         MoveDivAndShow(nIndex, nToken, cuswidth, cusheight);
1436 }
1437
1438 function getScrollLeft()
1439 {
1440         if (document.body.scrollLeft)
1441                 return document.body.scrollLeft;
1442         else if (window.pageXOffset)
1443                 return window.pageXOffset;
1444         else
1445                 return 0;
1446 }
1447
1448 function getScrollTop()
1449 {
1450         if (document.body.scrollTop)
1451                 return document.body.scrollTop;
1452         else if (window.pageYOffset)
1453                 return window.pageYOffset;
1454         else
1455                 return 0;
1456 }
1457
1458
1459 function MoveDivAndShow(nIndex, nToken, cuswidth, cusheight)
1460 {
1461         if (window.getPopupIFrame(nIndex).document.location.href != getAbsPopupURL(nIndex)) { // if redirect, reload again.
1462                         window.getPopupIFrame(nIndex).document.location = getPopupURL(nIndex);
1463                         setTimeout("BSSCPopup_AfterLoad(" + nIndex + "," + nToken + "," + cuswidth + "," + cusheight + ")", 200);
1464                         return;
1465         }
1466
1467         // Determine the position of the window
1468         var nClickX = window.gnPopupClickX;
1469         var nClickY = window.gnPopupClickY;
1470         var nTop = 0;
1471         var nLeft = 0;
1472
1473         var nWidth = parseInt(getPopupDivStyle(nIndex).width);
1474         var nHeight = parseInt(getPopupDivStyle(nIndex).height);
1475
1476         if (nClickY + nHeight + 20 < gBsClientHeight + getScrollTop()) {
1477                 nTop = nClickY + 10;
1478         } else {
1479                 nTop = (getScrollTop() + gBsClientHeight) - nHeight - 20;
1480         }
1481         if (nClickX + nWidth < gBsClientWidth + getScrollLeft()) {
1482                 nLeft = nClickX;
1483         } else {
1484                 nLeft = (getScrollLeft() + gBsClientWidth) - nWidth - 8;
1485         }
1486
1487         if (nTop < getScrollTop()) nTop  = getScrollTop() + 1;
1488         if (nLeft< getScrollLeft())  nLeft = getScrollLeft() + 1;
1489
1490         getPopupDivStyle(nIndex).left = nLeft;
1491         getPopupDivStyle(nIndex).top = nTop;
1492
1493         // Set the location of the background blocks
1494         getPopupShadowStyle(nIndex).left = 6;
1495         getPopupShadowStyle(nIndex).top = 6;
1496         if (gbBsIE55)
1497         {
1498                 getPopupShadowStyle(nIndex).left = 4;
1499                 getPopupShadowStyle(nIndex).top = 4;
1500         }
1501
1502         if (gbBsMac&&gbBsIE4) {
1503                 // Total hack on the iMac to get the IFrame to position properly
1504                 getPopupIFrameStyle(nIndex).pixelLeft = 100;
1505                 getPopupIFrameStyle(nIndex).pixelLeft = 0;
1506                 // Explicitly call BSSCOnLoad because the Mac doesn't seem to do it
1507                 getPopupIFrame(nIndex).window.BSSCOnLoad();
1508         }
1509
1510         if (gbBsNS6&&IsDirty(nIndex))
1511                 getElement(getPopupIFrameID(nIndex)).addEventListener("load", handleLoadNS, false);
1512         else
1513                 BSSCPopup_Timeout(nIndex , nToken );
1514         return;
1515 }
1516
1517 function        BSSCSize(x, y)
1518 {
1519         this.x = x;
1520         this.y = y;
1521 }
1522
1523 function BSSCGetContentSize(thisWindow, size)
1524 {
1525         if (!gbBsIE4 && !gbBsOpera7 && !gbBsNS4)
1526                 return;
1527
1528         if ((gbBsMac&&gbBsIE4)||gbBsNS4||gbBsOpera7) {
1529                 size.x = 320;
1530                 size.y = 180;
1531                 return;
1532         }
1533
1534         // Resize the width until it is wide enough to handle the content
1535         // The trick is to start wide and determine when the scrollHeight changes
1536         // because then we know a scrollbar is necessary. We can then go back
1537         // to the next widest size (for no scrollbar)
1538
1539         var ClientRate = gBsClientHeight / gBsClientWidth;
1540
1541         
1542         var GoldenSize = new BSSCSize(0,0);
1543         GoldenSize.x = gBsClientWidth * gBMaxXOfParent;
1544         GoldenSize.y = gBsClientHeight *gBMaxYOfParent ;
1545
1546         if (ClientRate > gBRateH_W) {
1547                 GoldenSize.y = GoldenSize.x * gBRateH_W;
1548         }
1549         else {
1550                 GoldenSize.x = GoldenSize.y / gBRateH_W;
1551         }
1552
1553         // Try to using parent specified max x.
1554         var x = 0;
1555         var maxgoldx = GoldenSize.x;
1556         var maxx = gBsClientWidth * gBMaxXOfParent;
1557         
1558         // This double resize causes the document to re-render (and we need it to)
1559         if (!gbBsIE5)
1560                 thisWindow.moveTo(10000,10000); // this is used to fix the flash on IE4.
1561                 
1562         thisWindow.resizeTo(1, 1);
1563         thisWindow.resizeTo(1, 1);
1564         thisWindow.resizeTo(maxgoldx, thisWindow.document.body.scrollHeight + gBscrollHeight);
1565         thisWindow.resizeTo(maxgoldx, thisWindow.document.body.scrollHeight + gBscrollHeight);
1566                 
1567         var miny = thisWindow.document.body.scrollHeight + gBscrollHeight;
1568         
1569         if (miny > GoldenSize.y) // the popup does not fix in the parent wanted golden area. so try to expand itself as large as it can
1570         {
1571                 thisWindow.resizeTo(maxx , thisWindow.document.body.scrollHeight + gBscrollHeight);
1572                 thisWindow.resizeTo(maxx , thisWindow.document.body.scrollHeight + gBscrollHeight);
1573                 
1574                 miny =  thisWindow.document.body.scrollHeight + gBscrollHeight;
1575                 maxy = gBsClientHeight * gBMaxYOfParent;
1576                 
1577                 if (miny > maxy) { // the popup must have a scroll, OK let it be.
1578                         miny = maxy;
1579                         size.x = maxx;
1580                         size.y = maxy;
1581                         thisWindow.document.body.scroll = 'yes'; // At this time we do want to show scroll any more. so it will looks better a little.
1582                 }
1583                 else { // popup still can fit in the parent area by someway. now we choose the same h/w rate as parent.
1584                         size.y = miny;
1585                         
1586                         //  downsize from maxx , now I try to using binary divide.
1587                         x = maxx;
1588                         deltax = -maxx/2;
1589                         //j = 0;
1590                         while (true) {
1591                                 x = x + deltax;
1592                                 thisWindow.resizeTo(x, miny);
1593                                 thisWindow.resizeTo(x, miny);
1594                                 diffy = thisWindow.document.body.scrollHeight + gBscrollHeight - x * ClientRate;
1595                                 if (diffy >  gBpermitYDelta ) // it is higher than wanted, so x need to be wide a little bitter
1596                                         deltax = Math.abs(deltax) /2;
1597                                 else if (diffy <  -gBpermitYDelta) // it is shorter than wanted, so x need to be narrow a little bitter
1598                                         deltax = -Math.abs(deltax) /2;
1599                                 else 
1600                                         // the y is close enough to wanted.
1601                                         break;
1602                                 if (Math.abs(deltax) < gBpermitXDelta) // the next change is too slight and it can be ignore.
1603                                         break;
1604                         }
1605                         size.x = thisWindow.document.body.scrollWidth; //+ gBscrollWidth;
1606                         size.y = thisWindow.document.body.scrollHeight;// + gBscrollHeight;     
1607                         thisWindow.document.body.scroll = 'no';
1608                 }
1609         }
1610         else {
1611                 if (thisWindow.document.body.scrollWidth > maxgoldx) {
1612                         size.x = maxx; 
1613                         size.y = miny;  
1614                         thisWindow.document.body.scroll = 'yes';
1615                 }
1616                 else {
1617                         //  downsize from maxgoldx , now I try to using binary divide.
1618                         x = maxgoldx;
1619                         deltax = -maxgoldx/2;
1620                         while (true) {
1621                                 x = x + deltax;
1622                                 thisWindow.resizeTo(x, miny);
1623                                 thisWindow.resizeTo(x, miny);
1624                                 diffy = thisWindow.document.body.scrollHeight + gBscrollHeight - x * gBRateH_W;
1625                                 if (diffy >  gBpermitYDelta ) // it is higher than wanted, so x need to be wide a little bitter
1626                                         deltax = Math.abs(deltax) /2;
1627                                 else if (diffy <  -gBpermitYDelta) // it is shorter than wanted, so x need to be narrow a little bitter
1628                                         deltax = -Math.abs(deltax) /2;
1629                                 else 
1630                                         // the y is close enough to wanted.
1631                                         break;
1632                                 if (Math.abs(deltax) < gBpermitXDelta) // the next change is too slight and it can be ignore.
1633                                         break;
1634                         }
1635                         size.x = thisWindow.document.body.scrollWidth; //+ gBscrollWidth;
1636                         size.y = thisWindow.document.body.scrollHeight ;
1637                         thisWindow.document.body.scroll = 'no'; // At this time we do not want to show scroll any more. so it will looks better a little.
1638                         thisWindow.resizeTo(size.x, size.y);
1639                         if (thisWindow.document.body.scrollWidth > size.x)
1640                         {
1641                                 size.x = thisWindow.document.body.scrollWidth;
1642                         }
1643                         if (thisWindow.document.body.scrollHeight > size.y)
1644                         {
1645                                 size.y = thisWindow.document.body.scrollHeight;
1646                         }
1647                 }
1648         }
1649         thisWindow.resizeTo(size.x, size.y);
1650         thisWindow.resizeTo(size.x, size.y);
1651         return;
1652 }
1653
1654 function BSSCPopupParentClicked()
1655 {
1656         if (!window.gbPopupTimeoutExpired) {
1657                 return false;
1658         }
1659         
1660         document.onmousedown = gbOrignalOnMouseDown;
1661
1662         // Simply hide the popup
1663         hideAll();
1664
1665         window.gbPopupTimeoutExpired = false;
1666
1667         return true;
1668 }
1669
1670 function isInsideHyperLink(obj)
1671 {
1672         if (obj&&obj!=getParentNode(obj))
1673         {
1674                 if (obj.tagName=="A"||obj.tagName=="IMG")
1675                         return true;
1676                 else
1677                         return isInsideHyperLink(getParentNode(obj));
1678         }
1679         else
1680                 return false;
1681 }
1682
1683 function BSSCPopupClicked(e)
1684 {
1685         if (!window.gbPopupTimeoutExpired) {
1686                 return false;
1687         }
1688
1689         var popupIFrame = getCurrentPopupIFrame();
1690         if (popupIFrame == null) {
1691                 return true;
1692         }
1693
1694         if (gbBsIE4 && (!((popupIFrame.window.event != null) &&
1695                 (popupIFrame.window.event.srcElement != null) &&
1696                 isInsideHyperLink(popupIFrame.window.event.srcElement)))) {
1697                 document.onmousedown = gbOrignalOnMouseDown;
1698                 
1699                 // Simply hide the popup
1700                 hideAll();
1701                 window.gbPopupTimeoutExpired = false;
1702                 return true;
1703         }
1704         else if (gbBsNS6 && (!((e != null) &&
1705                         (e.target!= null) && isInsideHyperLink(e.target))))
1706         {
1707                 document.addEventListener("mousedown", gbOrignalOnMouseDown,false);
1708                 // Simply hide the popup
1709                 hideAll();
1710                 window.gbPopupTimeoutExpired = false;
1711                 return true;            
1712         }
1713 }
1714
1715 //trace the mouse over's position for hotspot
1716 function  BSPSPopupOnMouseOver(event)
1717 {
1718         if (gbBsIE4 || gbBsOpera7||gbBsKonqueror3) {
1719                 window.gnPopupClickX = event.clientX + getScrollLeft();
1720                 window.gnPopupClickY = event.clientY + getScrollTop();
1721                 window.gnPopupScreenClickX = event.screenX;
1722                 window.gnPopupScreenClickY = event.screenY;
1723         } else if (gbBsSafari) {
1724                 window.gnPopupClickX = event.clientX + getScrollLeft();
1725                 window.gnPopupClickY = event.clientY + getScrollTop();
1726                 window.gnPopupScreenClickX = event.screenX + window.screenX;
1727                 window.gnPopupScreenClickY = event.screenY + window.screenY;
1728         } else if (gbBsNS4) {
1729                 window.gnPopupClickX = event.pageX - window.pageXOffset;
1730                 window.gnPopupClickY = event.pageY - window.pageYOffset;
1731                 window.gnPopupScreenClickX = event.screenX - window.pageXOffset;
1732                 window.gnPopupScreenClickY = event.screenY - window.pageYOffset;
1733         }
1734 }
1735
1736 function BSSCHidePopupWindow()
1737 {
1738         if (window.gPopupWindow != null) {
1739                 if (gbBsNS4) {
1740                         if ((typeof window.gPopupWindow != "undefined") && (!window.gPopupWindow.closed)) {
1741                                 window.gPopupWindow.close();
1742                                 window.gPopupWindow = null;
1743                         }
1744                 }
1745         }
1746         return;
1747 }
1748
1749 // Add the PopupOnClick to the onclick array.
1750 if (typeof(BsscRegisterOnClick) != "undefined")
1751 {
1752         BsscRegisterOnClick(BsPopupOnClick);
1753 }
1754 //End to support previous popup functions
1755
1756 /// Section End  - Popup (JavaScript 1.0)
1757
1758 /// Section Begin - Embedded Stub (JavaScript 1.0)
1759
1760 function BSSCCreatePopupDiv()
1761 {
1762         return;
1763 }
1764
1765 function WritePopupMenuLayer()
1766 {
1767         if (BsscHasExtJs()) {_WritePopupMenuLayer();}
1768 }
1769
1770 function BSSCPopup(strURL, width, height)
1771 {
1772         var re = new RegExp("'", 'g');
1773         strURL = strURL.replace(re, "%27");
1774
1775         if (BsscHasExtJs())     { 
1776                 _BSSCPopup(strURL, width, height);
1777         }else{
1778                 //Create a temporary window first to ensure the real popup comes up on top
1779                 var wndTemp = null;
1780                 if (!gbBsNS3) {
1781                         wndTemp = window.open("", "temp", "titlebar=no,toolbar=no,status=no,location=no,menubar=no,resizable=yes,scrollbars=yes,height=3,width=4");
1782                 }
1783                 // Create the real popup window
1784                 var wndPopup = window.open(strURL, "BSSCPopup", "titlebar=no,toolbar=no,status=no,location=no,menubar=no,resizable=yes,scrollbars=yes,height=300,width=400");
1785                 // Close the temporary
1786                 if (!gbBsNS3) {
1787                         wndTemp.close();
1788                 } else {
1789                         wndPopup.focus();
1790                 }
1791         }
1792 }
1793
1794 var gbWndTemp = null, gbWndPopupLinks = null;
1795 var gbstrParaTotal = "";
1796
1797 function PopupMenu_Invoke()
1798 {
1799         if (typeof(wfRelatedTopic) == 'function' && typeof(IsFlashSupported) == 'function')
1800         {
1801                 if (Number(gsSkinVersion) > 2 && IsFlashSupported())
1802                 {
1803                         return wfRelatedTopic(PopupMenu_Invoke.arguments);
1804                 }
1805         }
1806         if (BsscHasExtJs()) {
1807                 return _PopupMenu_Invoke(PopupMenu_Invoke.arguments);
1808         }
1809         if (gbBsNS3Before || gbBsIE3Before )    {
1810                 var argLen      = PopupMenu_Invoke.arguments.length;
1811                 if (argLen < 5) {
1812                         window.document.location.href = PopupMenu_Invoke.arguments[3];
1813                         return false;
1814                 }
1815                 gbWndTemp = null;
1816                 gbWndPopupLinks = null;
1817                 gbstrParaTotal = "";
1818                 for (var i = 0; i < (argLen - 2) / 2; i++) {
1819                         var strParaLine = "";
1820                         if (gbBsNS2){
1821                                 strParaLine += "<a href=\"";
1822                                 strParaLine += PopupMenu_Invoke.arguments[2 * i + 3];
1823                                 strParaLine += "\">"
1824                                 strParaLine += PopupMenu_Invoke.arguments[2 * i + 2];
1825                                 strParaLine += "</a>";
1826                         } else {
1827                                 strParaLine += "<a href=\"javascript:";
1828                                 strParaLine += "gotoUrl(\'";
1829                                 strParaLine += PopupMenu_Invoke.arguments[2 * i + 3];
1830                                 strParaLine += "\');\"";
1831                                 if (PopupMenu_Invoke.arguments[1] != '') {
1832                                         strParaLine += " TARGET='" + PopupMenu_Invoke.arguments[1] + "'";
1833                                 }
1834                                 strParaLine += ">";
1835                                 strParaLine += PopupMenu_Invoke.arguments[2 * i + 2];
1836                                 strParaLine += "</a>";
1837                         }
1838                         strParaLine += "<br>";
1839                         gbstrParaTotal += strParaLine;
1840                 }
1841                 var nHeight = argLen * 15;
1842                 var nWidth = 400;
1843                 var strParam = "titlebar=no,toolbar=no,status=no,location=no,menubar=no,resizable=yes,scrollbars=auto";
1844                 strParam += ",height=" + nHeight + ",width=200,resizable";
1845                 
1846                 //Create a temporary window first to ensure the real popup comes up on top
1847                 //var wndTemp = null;
1848                 if (!gbBsNS3) {
1849                         gbWndTemp = window.open("", "temp", "titlebar=no,toolbar=no,status=no,location=no,menubar=no,resizable=yes,scrollbars=yes,height=3,width=4");
1850                 } 
1851                 gbWndPopupLinks = window.open("", "popuplinks", strParam);
1852
1853                 setTimeout("Wait_PopupMenuReady()", 100);
1854         }
1855         return true;
1856 }
1857
1858 function Wait_PopupMenuReady() 
1859 {
1860         if (gbWndPopupLinks != null && "object" == typeof(gbWndPopupLinks.document)) {
1861                 PopupMenu_InvokeReady();
1862         }
1863         else 
1864                 setTimeout("Wait_PopupMenuReady()", 100);
1865 }
1866
1867 function PopupMenu_InvokeReady()
1868 {
1869         if (gbWndPopupLinks != null) {
1870                 gbWndPopupLinks.document.open("text/html");
1871                 gbWndPopupLinks.document.write("<html><head>");
1872                 if (gbBsNS2) {
1873                         gbWndPopupLinks.document.write("<base href=\"" + location +"\">");
1874                 } else {
1875                         //YJ: IE301,302 and NS3.x works fine
1876                         gbWndPopupLinks.document.write("<");
1877                         gbWndPopupLinks.document.write("script>");
1878                         gbWndPopupLinks.document.write("function gotoUrl(aUrl) {opener.window.location=aUrl; close();}");
1879                         gbWndPopupLinks.document.write("<");
1880                         gbWndPopupLinks.document.write("/script>");
1881                 }
1882                 gbWndPopupLinks.document.write("</head><body onBlur=\'self.focus();\'>");
1883                 gbWndPopupLinks.document.write(gbstrParaTotal);
1884                 gbWndPopupLinks.document.write("</body></html>");
1885                 gbWndPopupLinks.document.close();
1886
1887                 // Close the temporary
1888                 if (!gbBsNS3 && gbWndTemp != null) {
1889                         gbWndTemp.close();
1890                 }else {
1891                         gbWndPopupLinks.focus();
1892                 }
1893
1894                 return true;
1895         }
1896         return false;
1897 }
1898
1899 /// Section End - Embedded Stub (JavaScript 1.0)
1900
1901 //// Segment End -- (JavaScript 1.0)
1902
1903 //// Segment Begin -- (JavaScript 1.2)
1904 /// Section Begin  - kadov DHTM (JavaScript 1.2)
1905
1906 //Begin to support extended and dropdown text effects.
1907 function kadovIsParagraph(el)
1908 {
1909         return( el.tagName == "P" || el.tagName.indexOf("H") == 0 ) ? true : false;
1910 }
1911
1912 function kadovInitEachChild(el)
1913 {       
1914         for(var i=0; i<getChildNodes(el).length; i++)
1915         {
1916                 var child = getChildNodes(el)[i];
1917                 if( child.tagName == "SCRIPT" || child.tagName == "!" )
1918                         continue;
1919
1920                 if( child.id != "" )
1921                 {
1922                         // to wipe out the onload effects
1923                         if (gbBsIE4&&!gbBsMac)
1924                         {
1925                                 var onLoadEffect = child.style.getAttribute( "x-on-pageload" );
1926                                 if( (onLoadEffect != null) && (onLoadEffect > "") )
1927                                         child.style.setAttribute( "x-on-pageload", "" );
1928                         }
1929                         
1930                         var href = child.getAttribute("href")
1931                         if( href != null && href > "" && href.indexOf( "BSSCPopup" ) >= 0 )
1932                                 kadovFilePopupInit(child.id); // Init for Popup
1933                         else if( child.className == "dropspot" || child.className == "expandspot" || 
1934                                          child.className == "glossterm" )
1935                                 kadovTextPopupInit(child.id);// Init for Expanding/Glossary or DropDown text
1936                         else if( child.className == "trigger")
1937                                 kadovInitTrigger(child.id);// Init for Trigger
1938                         else
1939                         {
1940                                 kadovInitEffects(child.id);// Init for DHTML effects
1941                                 CEngine.SetOneTargetInitialState( child.id );
1942                         }
1943                 }
1944                 
1945                 if( (child.tagName == "IMG") && (child.getAttribute("dynsrc") > "") )
1946                         child.start = "mouseover";// to start a AVI file. fileopen doesn't work
1947
1948                 kadovInitEachChild(child);
1949         }
1950 }
1951
1952 function kadovRetrieveTextInner(el)
1953 {       
1954         var x = "";
1955         if( (!el) || (el.tagName == "!") || (el.tagName == "SCRIPT" ))
1956                 return x;
1957
1958         if( kadovIsParagraph(el) )
1959         {
1960                 var strNewID = " ";
1961                 if( el.id != "" )
1962                         strNewID += "id=" + el.id + "_NewSpan ";
1963                 x = "<span" + strNewID + "style='" + el.style.cssText + "'>" + el.innerHTML + "</span>";
1964         }
1965         else
1966         {
1967                 for(var i=0; i<getChildNodes(el).length; i++)
1968                         x += kadovRetrieveTextInner( getChildNodes(el)[i] );
1969         }
1970         return x;
1971 }
1972
1973 function kadovRetrieveCleanHTML( strRawHTML, strTagOpen, strTagClose, nDistance )
1974 {       
1975         var nTagOpen = strRawHTML.indexOf( strTagOpen, 0 );
1976         if( nTagOpen < 0 )
1977                 return strRawHTML;
1978
1979         var nTagClose = strRawHTML.indexOf( strTagClose, nTagOpen);
1980         if( nTagClose < nTagOpen )
1981                 return strRawHTML;
1982                 
1983         if( typeof(nDistance) == "number" && nDistance > 0 )
1984                 if( (nTagClose - nTagOpen) != nDistance )
1985                         return strRawHTML;
1986                 
1987         var strCleanOnce = strRawHTML.substring(0, nTagOpen) + strRawHTML.substr(nTagClose + strTagClose.length) ;
1988         return  kadovRetrieveCleanHTML( strCleanOnce, strTagOpen, strTagClose );
1989 }
1990
1991 function kadovAdjustObjectTag(strRawHTML, nStartPos)
1992 {// adjust object tag for related topics HTML control, because innerHTML misses out the item settings
1993         
1994         //Is there any DTC?
1995         var strDTCTagOpen = '<!--Metadata type="DesignerControl" startspan';
1996         var strDTCTagClose = '<!--Metadata type="DesignerControl" endspan-->';
1997         var nDTCTagOpen = strRawHTML.indexOf( strDTCTagOpen, nStartPos );
1998         if( nDTCTagOpen < 0 )
1999                 return strRawHTML;
2000         var nDTCTagClose = strRawHTML.indexOf( strDTCTagClose, nDTCTagOpen );
2001         if( nDTCTagClose < nDTCTagOpen)
2002                 return strRawHTML; // no Design Time Controls;
2003                 
2004         //Is the DTC HTML Help Control?
2005         var strRTObjTagOpen = 'classid=clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11';
2006         var strRTObjTagClose = '</OBJECT>';
2007         var nRTObjTagOpen = strRawHTML.indexOf( strRTObjTagOpen, nDTCTagOpen );
2008         if( nRTObjTagOpen < nDTCTagOpen )
2009                 return strRawHTML;
2010         var nRTObjTagClose = strRawHTML.indexOf( strRTObjTagClose, nRTObjTagOpen );
2011         if( nRTObjTagClose < nRTObjTagOpen )
2012                 return strRawHTML; // is not a HTML help control
2013                 
2014         // Is it a related Topics html help control?
2015         var strRTObjLabel = '<PARAM NAME=\"Command\" VALUE=\"Related Topics';
2016         if( strRawHTML.indexOf(strRTObjLabel, nRTObjTagOpen) < 0 )
2017                 return strRawHTML;
2018         
2019         // does the commented object tag contain a items parameters             
2020         var strRTItemsOpen = '<param name="Items" value="';
2021         var strRTItemsClose = '$$**$$" >';
2022         var strRTItemsClose2 = '$$**$$">';
2023
2024         var nRTItemsOpen = strRawHTML.indexOf(strRTItemsOpen, nDTCTagOpen);
2025         if( nRTItemsOpen < nDTCTagOpen )
2026                 return strRawHTML;
2027         var nRTItemsClose = strRawHTML.indexOf(strRTItemsClose, nRTItemsOpen);
2028         if (nRTItemsClose == -1)
2029                 nRTItemsClose = strRawHTML.indexOf(strRTItemsClose2, nRTItemsOpen);
2030         if( nRTItemsClose < nRTItemsOpen )
2031                 return strRawHTML;
2032                 
2033         // found a items string
2034         var strItems = strRawHTML.substring( nRTItemsOpen + strRTItemsOpen.length, nRTItemsClose);
2035         if( strItems.length < 1 )
2036                 return strRawHTML;
2037         
2038         // to reconstruct the item(s) param tag(s)
2039         var strItemsArray = strItems.split('$$**$$');
2040         if( strItemsArray.length < 1 )
2041                 return strRawHTML;
2042         var strRunTimeItemParam = "";
2043         for( var i = 0; i < strItemsArray.length; i++ )
2044         {
2045                 strRunTimeItemParam += '<PARAM  NAME="Item' + (i+1);
2046                 strRunTimeItemParam += '"' + '  VALUE="';
2047                 strRunTimeItemParam += strItemsArray[i];
2048                 strRunTimeItemParam += '">';
2049         }
2050         
2051         // to insert the reconstructed item params into runtime object tag
2052         var strAdjustedHTML = strRawHTML.substring(0,nRTObjTagClose) + strRunTimeItemParam + strRawHTML.substring(nRTObjTagClose, strRawHTML.length);
2053         return kadovAdjustObjectTag(strAdjustedHTML, nDTCTagClose + strDTCTagClose.length);
2054 }
2055
2056 function kadovTextPopupOnLoad( el )
2057 {
2058         if( typeof(el) == "string" )
2059                 el = getElement(el);
2060
2061         var src = el.getAttribute( "x-use-popup" );
2062         var bNeedMove=true;
2063         if(!src&&el.id)
2064         {
2065                 for (var i=0;i<gPopupData.length;i++)
2066                         if (gPopupData[i].el==el.id)
2067                         {
2068                                 src=gPopupData[i].popupId;
2069                                 bNeedMove=false;
2070                                 break;
2071                         }
2072         }
2073         if(!src)
2074                 src = el.style.getAttribute( "x-use-popup" );   
2075         if (!src)       
2076                 return 0;
2077
2078         var name = src;
2079         if( src.substr(0,1) == "#" ) 
2080                 name = src.substr(1, src.length-1);
2081         var srcDiv = getElement(name);
2082         if( !srcDiv )
2083                 return 1;
2084
2085         if (bNeedMove)
2086         {
2087                 var type = el.getAttribute( "x-popup-type" );
2088                 if (!type)
2089                         type = el.style.getAttribute("x-popup-type");
2090                 if (!type)              
2091                         return 1;               
2092                 var setup = el.getAttribute( "x-tmp-setup" );
2093                 var newId = name;
2094                 if( newId.indexOf( "_tmp") <= 0 )
2095                         newId += "_tmp";
2096
2097                 if( !setup)
2098                 {
2099                         el.setAttribute( "x-tmp-setup", 1 );
2100
2101                         if( type == "pulldown"  )
2102                         {
2103                                 var strAdjust = kadovAdjustObjectTag(srcDiv.innerHTML,0);
2104                                 var strCleanHTML = kadovRetrieveCleanHTML(strAdjust, "<!--", "-->");
2105                                 strCleanHTML = kadovRetrieveCleanHTML(strCleanHTML, "<SCRIPT", "/SCRIPT>");
2106                                 
2107                                 //work around the bug in HH.exe that highlight the phrases when use Search tab
2108                                 //this approach is just removing the <FONT...> tag inserted by Microsoft in the runtime
2109                                 strCleanHTML = kadovRetrieveCleanHTML(strCleanHTML, "<FONT color=#", "\">", 52);
2110                                 
2111                                 var strStyle = " style='display:none; position:relative;";
2112                                 var newDiv = "<div class=droptext id=" + newId + strStyle + "'>" + strCleanHTML + "</div>";
2113
2114                                 removeThis(srcDiv); // empty the original DIV tag
2115                                 var elParentPra = kadovFindParentParagraph(el);
2116                                 if( elParentPra )
2117                                         insertAdjacentHTML(elParentPra, "afterEnd", newDiv );
2118                         }
2119                         else if( type == "expanding"  )
2120                         {
2121                                 var inner = kadovRetrieveTextInner(srcDiv);
2122                                 if( inner == "" )
2123                                         inner = srcDiv.innerHTML;
2124                                 var strAdjust = kadovAdjustObjectTag(inner,0);
2125                                 var strCleanHTML = kadovRetrieveCleanHTML(strAdjust, "<!--", "-->");
2126                                 strCleanHTML = kadovRetrieveCleanHTML(strCleanHTML, "<SCRIPT", "/SCRIPT>");
2127                                 var strClassName = (el.className == "glossterm") ? "glosstext" : "expandtext";
2128                                 var newSpan = "<span class=" + strClassName + " style='display: none;' id=" + newId + ">&nbsp;" + strCleanHTML + "</span>";
2129                                 removeThis(srcDiv); // empty the original DIV tag
2130                                 insertAdjacentHTML(el, "afterEnd", newSpan );
2131                         }
2132                 }
2133         }
2134         else
2135         {
2136                 srcDiv.style.display = "none";
2137         }
2138         return 0;
2139 }
2140
2141 function getElementsByTag(obj,sTagName)
2142 {
2143         if(obj.getElementsByTagName)
2144                 return obj.getElementsByTagName(sTagName);
2145         else if(obj.all)
2146                 return obj.all.tags(sTagName);
2147         return null;
2148 }
2149
2150 function getElement(sID)
2151 {
2152         if(document.getElementById)
2153                 return document.getElementById(sID);
2154         else if(document.all)
2155                 return document.all(sID);
2156         return null;
2157 }
2158
2159 function getParentNode(obj)
2160 {
2161         if(obj.parentNode)
2162                 return obj.parentNode;
2163         else if(obj.parentElement)
2164                 return obj.parentElement;
2165         return null;
2166 }
2167
2168 function getChildNodes(obj)
2169 {
2170         if(obj.childNodes)
2171         {
2172                 var children = new Array();
2173                 for (var i = 0; i < obj.childNodes.length; i++)
2174                 {
2175                         if (obj.childNodes[i].nodeType == 1)
2176                                 children[children.length] = obj.childNodes[i];
2177                 }
2178                 return children;
2179         }
2180         else if(obj.children)
2181                 return obj.children;
2182         return null;    
2183 }
2184
2185 function removeThis(obj)
2186 {
2187         if(obj.parentNode)
2188                 obj.parentNode.removeChild(obj);
2189         else
2190                 obj.outerHTML="";
2191 }
2192
2193 function kadovTextPopup( el )
2194 {
2195         if (!gbBsIE4 && !gbBsOpera7 && !gbBsSafari && !gbBsNS6 && !gbBsKonqueror3 )
2196                 return;
2197
2198         var bNeedMove=true;
2199         
2200         if (window.event)
2201                 window.event.cancelBubble = true;
2202
2203         if( typeof(el) == "string" )
2204                 el = getElement(el);
2205
2206         if (!el||el==window)
2207                 return;
2208         
2209         var src = el.getAttribute( "x-use-popup" );
2210         if(!src&&el.id)
2211         {
2212                 for (var i=0;i<gPopupData.length;i++)
2213                         if (gPopupData[i].el==el.id)
2214                         {
2215                                 src=gPopupData[i].popupId;
2216                                 bNeedMove=false;
2217                                 break;
2218                         }
2219         }
2220         if(!src)
2221                 src = el.style.getAttribute( "x-use-popup" );   
2222         if(!src)
2223                 return;
2224                 
2225         var name = src;
2226         if( src.substr(0,1) == "#" ) 
2227         if (bNeedMove)
2228                 name = src.substr(1, src.length-1) + "_tmp";
2229         else
2230                 name = src.substr(1, src.length-1);
2231
2232         var srcDiv = getElement(name);
2233         if( !srcDiv )
2234                 return;
2235
2236         if( srcDiv )
2237         {
2238                 if( srcDiv.style.display == "" )
2239                         srcDiv.style.display = "none";
2240                 else
2241                 {
2242                         srcDiv.style.display = "";
2243                         if( typeof(srcDiv.bInitialized) == "undefined" )
2244                         {
2245                                 srcDiv.bInitialized = true;
2246                                 kadovInitEffects(name);
2247                                 kadovInitEachChild(srcDiv);
2248                         }
2249                 }
2250         }
2251         if(gbBsIE4)
2252                 event.returnValue=false;
2253         return;
2254 }
2255
2256 function kadovFindParentParagraph( el )
2257 {
2258         if( typeof(el) == "string" )
2259                 el = getElement(el);
2260         if( (!el) || el.tagName == "BODY" )
2261                 return null;
2262         if( kadovIsParagraph(getParentNode(el)) )
2263                 return getParentNode(el);
2264         else
2265                 return kadovFindParentParagraph( getParentNode(el) );
2266 }
2267
2268 //Begin HTML code invoked function
2269 function kadovRegisterEventHandler( obj, strEvent, strEventHandler )
2270 {
2271         if( !gbBsIE4 )
2272                 return;
2273         CCSSP.RegisterEventHandler( obj, strEvent, strEventHandler );
2274 }
2275
2276 function textPopupData(el, popupId)
2277 {
2278         this.el = el;
2279         this.popupId = "#"+popupId;
2280 }
2281
2282 var gPopupData = new Array();
2283
2284 function kadovTextPopupInit( el, popupId)
2285 {
2286         if (!gbBsIE4 && !gbBsOpera7 && !gbBsSafari && !gbBsNS6 && !gbBsKonqueror3)
2287                 return;
2288                 
2289         if( typeof(el) == "string" )
2290         {
2291                 if (popupId)
2292                 {
2293                         gPopupData[gPopupData.length]=new textPopupData(el, popupId);
2294                 }
2295                 el = getElement(el);
2296         }
2297                 
2298         if( el != null )
2299         {
2300                 CCSSP.RegisterEventHandler( el, "onclick", "kadovTextPopup(\"" + el.id +"\");" );
2301                 CCSSP.RegisterEventHandler( window, "onload", "kadovTextPopupOnLoad(\"" + el.id +"\");" );
2302         }
2303 }
2304 //End HTML code invoked function
2305
2306 //End to support extended and dropdown text effects.
2307
2308 //Begin to convert iWrite format to RoboEditor Format for DHTML effects
2309 function kadovInitTriggersInHead( )
2310 {
2311   if( Object.xDelayedInitElements )
2312   {
2313      var x = Object.xDelayedInitElements;
2314      for(i=0; i<x.length; i++)
2315         kadovInitTrigger( x[i] );
2316   }
2317 }
2318
2319 //Begin HTML code invoked function
2320 function kadovFilePopupInit( el )
2321 {
2322         if( typeof(el) == "string" )
2323                 el = getElement(el);
2324
2325         if( el != null )
2326                 CCSSP.RegisterEventHandler( el, "onmouseover", "BSPSPopupOnMouseOver(event);" );
2327 }
2328
2329 function kadovInitTrigger( element )
2330 {
2331         if( !gbBsIE4 )
2332                 return;
2333         var srcElement = element;
2334         if( typeof(srcElement) == "string" )
2335         {
2336                 srcElement = getElement(element,0);
2337                 if(srcElement == null)
2338                         return;
2339         }
2340         
2341         if( !kadovIsParentVisible(srcElement) )
2342                 return;
2343
2344         var targets = srcElement.getAttribute( "x-targets" );
2345         if (!targets)
2346                 targets = srcElement.style.getAttribute("x-targets");
2347         if (!targets)
2348                 return; 
2349         var arrOneTarget = targets.split( "," );
2350         for( var i = 0; i < arrOneTarget.length; i ++ )
2351                 bsscFXInit( element, arrOneTarget[i], null, null, null, null );
2352 }
2353
2354 function kadovIsParentVisible( el )
2355 {
2356         if( typeof(el) == "string" )
2357                 el = getElement(el);
2358         if( (!el) || el.tagName == "BODY" )
2359                 return true;
2360         if( el.style.display == 'none' ) //el.visibility == 'hidden' || 
2361                 return false;
2362         else
2363                 return kadovIsParentVisible( getParentNode(el) );
2364 }
2365
2366 function kadovInitEffects( element )
2367 {
2368         if( !gbBsIE4 )
2369                 return;
2370         var srcElement = element;
2371         if( typeof(srcElement) == "string" )
2372         {
2373                 srcElement = getElement(element,0);
2374                 if(srcElement == null)
2375                         return;
2376         }
2377         
2378         if( !kadovIsParentVisible(srcElement) )
2379                 return;
2380         
2381         kadovInitEffect( srcElement, "x-on-hover" );
2382         kadovInitEffect( srcElement, "x-on-pageclick" );
2383         kadovInitEffect( srcElement, "x-on-pageload" );
2384         kadovInitEffect( srcElement, "x-on-trigger-1" );
2385         kadovInitEffect( srcElement, "x-on-trigger-2" );
2386 }
2387 //End HTML code invoked function
2388
2389 function kadovInitEffect( element, prop )
2390 {
2391         var values = null;
2392         if( element.getAttribute( "currentStyle" )  && element.currentStyle.getAttribute)
2393                 values = element.currentStyle.getAttribute( prop );
2394         else  if (element.style.getAttribute)
2395                 values = element.style.getAttribute( prop );
2396         if( !values )
2397                 return;
2398
2399         var functions = new Array();
2400         var nIdx = 0, nStart = 0;
2401         var nNext = values.indexOf( "\)", 0);
2402         while( nNext >= 0 && nNext < values.length )
2403         {
2404                 functions[nIdx] = values.substr( nStart, nNext-nStart+1);
2405                 nStart = nNext + 1;
2406                 nIdx++;
2407                 nNext = values.indexOf( "\)", nStart);
2408         }
2409                 
2410         for( var i=0; i<functions.length; i++)
2411         {
2412                 var id = element.getAttribute( "id" );
2413                 var translatedProp = kadovTranslateProp(prop);
2414
2415                 var lp = functions[i].indexOf( "(" );
2416                 var fnname = functions[i].substring(0, lp);
2417                 var srcargs = functions[i].substring(lp+1, functions[i].length-1);
2418                 
2419                 var nClickTimes = 1;
2420                 var arrForClickCount = srcargs.split( "," );
2421                 for( var j = 0; j < arrForClickCount.length; j++ )
2422                 {// to locate and get the "clicks=99" settings
2423                         var nPageClick = arrForClickCount[j].indexOf("clicks");
2424                         if( nPageClick >= 0 )
2425                         {
2426                                 nPageClick = arrForClickCount[j].indexOf("=");
2427                                 if( nPageClick > 0 )
2428                                 {
2429                                         nClickTimes = arrForClickCount[j].substring( nPageClick + 1, arrForClickCount[j].length) * 1;
2430                                         break;
2431                                 }
2432                         }
2433                 }
2434                 var args = srcargs;
2435                 if( j < arrForClickCount.length )
2436                 {// to strip out the "clicks=99" from the arguments string
2437                         args = "";
2438                         for( var k = 0; k < arrForClickCount.length; k ++ )
2439                         {
2440                                 if( k != j )
2441                                 {
2442                                         args += arrForClickCount[k];
2443                                         if( k < arrForClickCount.length - 1 )
2444                                                 args += ",";
2445                                 }
2446                         }
2447                 }
2448                 bsscFXInit( null, id, translatedProp, fnname, args, nClickTimes );
2449         }
2450 }
2451
2452 function kadovTranslateProp( prop )
2453 {
2454         switch( prop )
2455         {
2456         case "x-on-hover" :     return "bsschover";
2457         case "x-on-pageclick" : return "bsscpageclick";
2458         case "x-on-pageload" :  return "bsscpageload";
2459         case "x-on-trigger-1" : return "bssctrigger1";
2460         case "x-on-trigger-2" : return "bssctrigger2";
2461         }
2462         return null;
2463 }
2464 //End to convert iWrite format to RoboEditor Format for DHTML effects
2465
2466 //Begin the definition of one entry to DHTML effects
2467 function bsscFXInit( trigger_ID, target_ID, event_type, 
2468         action_type, action_setting, event_addional )
2469 {
2470         if( (!gbBsWindows && !gbBsSunOS  && !(gbBsMac&&gbBsIE5)) || typeof(target_ID) != "string" )//MUST have a target_ID
2471                 return; // we don't support Navigator yet
2472         
2473         if( typeof(event_type) == "string" )
2474                 event_type = event_type.toLowerCase();
2475         if( typeof(action_type) == "string" )
2476                 action_type = action_type.toLowerCase();
2477         if( typeof(action_setting) == "string" )
2478                  action_setting = action_setting.toLowerCase();
2479         
2480         // to get the target element then add it to the target list
2481         var eleTarget = CCSSP.GetObject( target_ID );
2482         if( (eleTarget != null) && (event_type != null) && (action_type != null) )
2483         {
2484                 CEngine.AddOneTarget( target_ID, eleTarget );
2485                 CEngine.BuildTargetObject(target_ID, event_type, action_type, action_setting, event_addional);
2486         }
2487         
2488         // to validate the trigger_ID parameter
2489         if( typeof(trigger_ID) == "string" && trigger_ID != "" )
2490                 CEngine.BuildTriggerObject( trigger_ID, target_ID );
2491 }       
2492 //End the definition of one entry to DHTML effects
2493
2494 /// Section End  - kadov DHTM (JavaScript 1.2)
2495
2496 /// Section Begin  - CCSSP DHTM (JavaScript 1.2)
2497
2498 //Begin JavaScript libary for cross-platform positioning object.
2499 function CCSSP(){} // constructor of CCSSP class
2500
2501 CCSSP.GetObject = function( obj )
2502 {//convert object name string or reference into a valid object reference
2503         if( typeof(obj) == "object" )
2504                 return obj;
2505         else if( typeof(obj) == "string" && obj != "")
2506         {
2507                 if( gbBsNS4 )
2508                         return eval("document." + obj);
2509                 else
2510                         return eval("document.all(\"" + obj + "\")");
2511         }
2512         else
2513                 return null;
2514 }
2515
2516 CCSSP.MoveObjectTo = function(obj, x, y)
2517 {//positioning an object at a specific pixel coordinate
2518         if( gbBsNS4 )
2519                 obj.moveTo(x,y);
2520         else
2521         {
2522                 obj.style.pixelLeft = x;
2523                 obj.style.pixelTop = y;
2524         }
2525 }
2526
2527 CCSSP.MoveObjectBy = function(obj, dx, dy)
2528 {//moveing a object by x and/or y pixel
2529         if( gbBsNS4 )
2530                 obj.moveBy(dx,dy);
2531         else
2532         {
2533                 obj.style.pixelLeft += dx;
2534                 obj.style.pixelTop += dy;
2535         }
2536 }
2537
2538 CCSSP.SetObjectBGColor = function(obj, color)
2539 {//set the background color of an object
2540         if( gbBsNS4 )
2541                 obj.bgColor = color;
2542         else
2543                 obj.style.backgroundColor = color;
2544 }
2545
2546 CCSSP.ShowObject = function(obj, bShow)
2547 {// set the object to be visible or invisible
2548         if( gbBsNS4 )
2549                 obj.visibility = (bShow == true) ? 'show' : 'hide';
2550         else
2551                 obj.style.visibility = (bShow == true) ? 'visible' : 'hidden';// when hidden, it still occupy some space.
2552 }
2553
2554 CCSSP.GetObjectLeft = function(obj)
2555 {// retrieve the x coordinate of a posionable object
2556         if( gbBsNS4 )
2557                 return obj.left;
2558         else
2559                 return obj.style.pixelLeft;
2560 }
2561
2562 CCSSP.GetObjectTop = function(obj)
2563 {// retrieve the y coordinate of a posionable object
2564         if( gbBsNS4 )
2565                 return obj.top;
2566         else
2567                 return obj.style.pixelTop;
2568 }
2569
2570 CCSSP.GetObjectContainLeft = function(obj)
2571 {// retrieve the x coordinate of a posionable object relative to it's parent element
2572         if( gbBsNS4 )
2573                 return obj.pageX;
2574         else
2575         {
2576                 if( obj == document.body )
2577                         return obj.clientLeft;
2578                 else
2579                         return obj.offsetLeft;
2580         }
2581 }
2582
2583 CCSSP.GetObjectWindowLeft = function(obj)
2584 {// retrieve the x coordinate of a posionable object relative to browser window
2585         if( gbBsNS4 )
2586                 return obj.pageX;
2587         else
2588         {
2589                 var nOffsetWindowLeft = 0;
2590                 for(var element = obj; element; element = element.offsetParent)
2591                         nOffsetWindowLeft += CCSSP.GetObjectContainLeft(element);
2592                 return nOffsetWindowLeft;
2593         }
2594 }
2595
2596 CCSSP.GetObjectContainTop = function(obj)
2597 {// retrieve the y coordinate of a posionable object relative to it's parent element
2598         if( gbBsNS4 )
2599                 return obj.pageY;
2600         else
2601         {
2602                 if( obj == document.body )
2603                         return obj.clientTop;
2604                 else
2605                         return obj.offsetTop;
2606         }
2607 }
2608
2609 CCSSP.GetObjectWindowTop = function(obj)
2610 {// retrieve the y coordinate of a posionable object relative to browser window
2611         if( gbBsNS4 )
2612                 return obj.pageY;
2613         else
2614         {
2615                 var nOffsetWindowTop = 0;
2616                 for(var element = obj; element; element = element.offsetParent)
2617                         nOffsetWindowTop += CCSSP.GetObjectContainTop(element);
2618                 return nOffsetWindowTop;
2619         }
2620 }
2621
2622 CCSSP.GetObjectHeight = function(obj)
2623 {// retrieve the height of a posionable object
2624         if( gbBsNS4 )
2625                 return obj.clip.height;
2626         else
2627                 return obj.offsetHeight;
2628 }
2629
2630 CCSSP.GetObjectWidth = function(obj)
2631 {// retrieve the width of a posionable object
2632         if( gbBsNS4 )
2633                 return obj.clip.width;
2634         else
2635                 return obj.offsetWidth;
2636 }
2637
2638 CCSSP.RegisterEventHandler = function( srcObj, rawEventName, funcHandler )
2639 { // to add the "funcHandler" as the "rawEventName" 's handler to the "srcObj" object,the original event handler will be combined
2640         if (gbBsNS4 && !gbBsNS6)
2641                 return ;
2642                 
2643         var oldHandler = "";
2644
2645         if (gbBsMac &&gbBsIE4&&!gbBsIE5)
2646         {
2647                 if (typeof(srcObj[rawEventName.toLowerCase()])=="unknown")
2648                 { //search for <SCRIPT> tag which define the event handler
2649                         for( var i = 0; i < document.scripts.length; i++ ) 
2650                         {
2651                                 var script = document.scripts[i];
2652                                 if( (script.htmlFor == srcObj.id || script.htmlFor == srcObj ) && script.event == rawEventName )
2653                                 {
2654                                         oldHandler = script.innerHTML;
2655                                         break;
2656                                 }
2657                         }
2658                 }
2659         }
2660         else
2661         {
2662                 var oldInlineHandler = srcObj[rawEventName.toLowerCase()];
2663                 if( oldInlineHandler != null && typeof(oldInlineHandler) != "undefined")
2664                 {
2665                         var functionDefinition = oldInlineHandler.toString();
2666                         var bodyStart = functionDefinition.indexOf( "{" );
2667                         var bodyEnd = functionDefinition.lastIndexOf( "}" );
2668                         if( bodyStart > 0 || bodyEnd > bodyStart )
2669                                 oldHandler = functionDefinition.substr( bodyStart + 1, bodyEnd - bodyStart - 2 );
2670                 }
2671                 else if( gbBsIE4 )
2672                 { //search for <SCRIPT> tag which define the event handler
2673                         for( var i = 0; i < document.scripts.length; i++ ) 
2674                         {
2675                                 var script = document.scripts[i];
2676                                 if( (script.htmlFor == srcObj.id || script.htmlFor == srcObj ) && script.event == rawEventName )
2677                                 {
2678                                         oldHandler = script.innerHTML;
2679                                         break;
2680                                 }
2681                         }
2682                 }
2683         }
2684         if( oldHandler.indexOf(funcHandler) >= 0 )
2685                 return;// to prevent register the funtion twice.
2686
2687         if( gbBsNS4 ) // only "onload, onresize, onfocus" apply to window
2688         {// other raw events will apply to layer
2689                 var noOn = rawEventName.substring(2, rawEventName.length);
2690                 if( typeof(noOn) == "string" && noOn.length > 3 ) {
2691                         if (srcObj.captureEvents)
2692                                 srcObj.captureEvents( Event[noOn.toUpperCase()] );
2693                 }
2694         }
2695         
2696         var newHandler = oldHandler;
2697         if( newHandler.length == 0 )
2698                 newHandler = funcHandler;
2699         else
2700                 newHandler += "; " + funcHandler;
2701         
2702         srcObj[rawEventName.toLowerCase()] = new Function( newHandler );
2703 }
2704
2705 CCSSP.GetWindowHeight = function()
2706 {// retrieve the height of available content in browser window
2707         if( gbBsNS4 )
2708                 return window.innerHeight;
2709         else
2710                 return document.body.clientHeight;
2711 }
2712
2713 CCSSP.GetWindowBottom = function()
2714 {// retrieve the bottom postion of browser window
2715         if( gbBsNS4 )
2716                 return window.outerHeight + window.pageYOffset;
2717         else
2718                 return document.body.clientHeight + document.body.scrollTop;
2719 }
2720
2721 CCSSP.GetWindowWidth = function()
2722 {// retrieve the width of available content in browser window
2723         if( gbBsNS4 )
2724                 return window.innerWidth;
2725         else
2726                 return document.body.clientWidth;
2727 }
2728
2729 CCSSP.GetWindowRight = function()
2730 {// retrieve the right postion of browser window
2731         if( gbBsNS4 )
2732                 return window.outerWidth + window.pageXOffset;
2733         else
2734                 return document.body.clientWidth + document.body.scrollLeft;
2735 }
2736
2737 CCSSP.TrimString = function( objString, subtrim )
2738 {// to trim the "subtrim" in the beginning and ending of a string object
2739         if( typeof(subtrim) != "string" || subtrim == null )
2740                 return objString;
2741         var strHead = objString.substring(0, 1);
2742         var strRear = objString.substring(objString.length-1, objString.length);
2743         if( strHead != subtrim && strRear != subtrim )
2744                 return objString;
2745         
2746         var spacePos = objString.indexOf(subtrim);
2747         if( spacePos < 0 )
2748                 return objString;
2749         else if( spacePos == objString.length - 1 )
2750                 return objString.substring(0, spacePos);
2751         else
2752         {
2753                 var newString = objString.substring( spacePos + 1, objString.length);
2754                 return CCSSP.TrimString( newString, subtrim );
2755         }
2756 }
2757
2758 CCSSP.TrimSpace = function( objString )
2759 {
2760         var Trim1 = CCSSP.TrimString( objString, " ");
2761         return CCSSP.TrimString( Trim1, "\'");
2762 }
2763
2764 CCSSP.GetEventElement = function( navEventObject )
2765 {// to get the element who fired the current event
2766         if(gbBsNS4) 
2767                 if (gbBsNS6)
2768                         return null;
2769                 else
2770                          navEventObject.target;
2771         else
2772                 return event.srcElement;
2773 }
2774
2775 CCSSP.PrepareFilter = function( Obj )
2776 {//to prepare for making the filter work
2777         Obj.style.filter = "";
2778         if( Obj.style.width != "" || Obj.style.height != "" || Obj.style.position == "absolute" )
2779                 return;
2780         Obj.style.height = CCSSP.GetObjectHeight(Obj);
2781 }
2782
2783 CCSSP.IsDescendant = function( progenitor, progeny )
2784 {
2785         if( typeof(progeny) == "undefined" || progeny == null )
2786                 return false;
2787         else if( progeny == progenitor )
2788                 return true; 
2789         else if( progeny.id == progenitor.id ) 
2790                 return true; 
2791         else if( getParentNode(progeny) == getParentNode(progenitor))
2792                 return false;
2793         else
2794                 return CCSSP.IsDescendant( progenitor, getParentNode(progeny));
2795 }
2796
2797 CCSSP.IsTextTag = function( Obj )
2798 {
2799         if( typeof( Obj.tagName ) == "undefined" )
2800                 return false;
2801         return( Obj.tagName.indexOf("H") == 0 || Obj.tagName == "P" || 
2802                         Obj.tagName == "FONT" || Obj.tagName == "SPAN" );
2803 }
2804
2805 //End JavaScript libary for cross-platform positioning object.
2806
2807 /// Section End  - CCSSP DHTM (JavaScript 1.2)
2808
2809 /// Section Begin  - CCSSP DHTM 1 (JavaScript 1.2)
2810
2811 //Begin the definition of class CTrigger
2812 function CTrigger( TriggerElement )
2813 {
2814         // object : the trigger element. Never be null. 
2815         this.eleTrigger = TriggerElement;
2816         
2817         // number : the click counter number: only 3 values: 0,1,2;
2818         this.nCounter = 0; 
2819         
2820         //object as associative array of string:
2821         // the associate target ID strings; one element at least.                       
2822         this.objStrTarget = new Object();
2823         this.eleTrigger.style.cursor = "hand";
2824         if( this.eleTrigger.tagName == "AREA" && this.eleTrigger.getAttribute("href") == "" )
2825                 this.eleTrigger.setAttribute("href", "#") // to make a hand cursor for image map
2826 }
2827
2828 CTrigger.prototype.AddTargetID = function( strTargetID )
2829 {// add one target ID string to the objStrTarget
2830         if( typeof(strTargetID) != "string" )
2831                 return ;
2832         if( typeof(this.objStrTarget[strTargetID]) != "string" )
2833                 this.objStrTarget[strTargetID] = strTargetID;
2834 }
2835
2836 CTrigger.prototype.OnTriggerClick = function()
2837 {// to activate all asociated target
2838         var strEventType = ( (this.nCounter++)% 2 == 0 ) ? 
2839                 "bssctrigger1" : "bssctrigger2";
2840                 
2841         // to enumerate associative target element's ID string
2842         for( var strTargetID in this.objStrTarget ) 
2843                 CEngine.SendEventToOneTarget( strTargetID, strEventType );
2844 }
2845 //End the definition of class CTrigger
2846
2847 //Begin the definition of class CTarget
2848 function CTarget( TargetElement )
2849 {
2850         // object : the target element. Never be null.
2851         this.eleTarget = TargetElement;
2852         this.objManager = new Object(); // object: the event manager
2853
2854
2855 CTarget.nPageClickCounter = 0;// static class property.
2856
2857 CTarget.prototype.GetAgencyObject = function(str_action_type,action_setting )
2858 {// return the action agency ( effect )object's refernece 
2859         switch( str_action_type )
2860         {
2861         case "show":return new CAgencyShow( this.eleTarget, true ) ;
2862         case "hide":return new CAgencyShow( this.eleTarget, false ) ;
2863
2864     case "flyin" : 
2865         return new CAgencyFly(this.eleTarget, action_setting, true);
2866     case "flyout" : 
2867         return new CAgencyFly(this.eleTarget, action_setting, false);
2868     case "spiralin" : 
2869         return new CAgencySpiral(this.eleTarget, action_setting, true);
2870     case "spiralout" : 
2871         return new CAgencySpiral(this.eleTarget, action_setting, false);
2872     case "zoomin" :
2873         return new CAgencyZoom(this.eleTarget, action_setting, true);
2874     case "zoomout" : 
2875         return new CAgencyZoom(this.eleTarget, action_setting, false);
2876     case "elastic" : 
2877                 return new CAgencyElastic(this.eleTarget, action_setting);
2878                 
2879     case "fadein" : 
2880         return (gbBsIE4)? new CAgencyAlpha(this.eleTarget, action_setting, true) : null;
2881     case "fadeout" :
2882         return (gbBsIE4)? new CAgencyAlpha(this.eleTarget, action_setting, false) : null;
2883     case "rockrollstatic" :
2884     case "rockroll" :
2885         return (gbBsIE4)? new CAgencyWave(this.eleTarget, action_setting, false) : null;
2886  
2887     case "glow":
2888         return (gbBsIE4)? new CAgencyGlow(this.eleTarget,action_setting) : null;
2889     case "dropshadow":
2890         return (gbBsIE4)? new CAgencyDropShadow(this.eleTarget,action_setting) : null;
2891     case "transition" :
2892         return (gbBsIE4)? new CAgencyRevealTrans(this.eleTarget,action_setting) : null;
2893     case "blur" :
2894         return (gbBsIE4)? new CAgencyBlur(this.eleTarget,action_setting) : null;
2895
2896     case "fliph" : // all these 4 do NOT need any parameters
2897     case "flipv" :
2898     case "invert":
2899     case "gray" :
2900         return (gbBsIE4)? new CAgencyChangeFilter(this.eleTarget, str_action_type) : null;
2901     
2902     case "fontchange": // the effects below change the style on the fly, so won't work in Navigator
2903         return (gbBsIE4)? new CAgencyFontChange(this.eleTarget,action_setting) : null;
2904     case "boderchange": 
2905     case "stylechange":
2906         return (gbBsIE4)? new CAgencyChangeStyle(this.eleTarget,action_setting) : null;
2907
2908         default: return null;
2909         }
2910 }
2911
2912 CTarget.prototype.SetEventManager = function( 
2913         one_event_type,str_action_type,action_setting,event_additional)
2914 {// to set the event manager with specified action 
2915         if( typeof( one_event_type ) != "string" ||     
2916                 typeof( str_action_type ) != "string"||
2917                 typeof( action_setting ) != "string" )
2918                 return false;
2919         if( typeof(this.objManager[one_event_type]) == "undefined" )
2920         {
2921                 this.objManager[one_event_type] = new Object();
2922                 this.objManager[one_event_type].length = 0;
2923         }
2924         
2925         var eventAgency = this.GetAgencyObject(str_action_type,action_setting);
2926         if( eventAgency != null )
2927         {
2928                 var ct = this.objManager[one_event_type].length ++;
2929                 this.objManager[one_event_type][ct] = eventAgency;
2930                 
2931                 if( one_event_type == "bsscpageclick" )
2932                 {// to deal with the "number of pageclick" stuff
2933                         if( typeof(event_additional) == "number" )
2934                                 this.objManager[one_event_type][ct].nPageClick = event_additional;
2935                         else // set the default number 
2936                                 this.objManager[one_event_type][ct].nPageClick = 1;
2937                         
2938                         if( (typeof(this.objManager.nMinPageClickIndex) == "undefined") ||
2939                             (this.objManager[one_event_type][ct].nPageClick < 
2940                                         this.objManager[one_event_type][this.objManager.nMinPageClickIndex].nPageClick) )
2941                                 this.objManager.nMinPageClickIndex = ct;
2942                 }
2943                 
2944                 //hide the object blindly,SetState function will take care of the final correct state
2945                 if( ((one_event_type == "bsscpageclick") && 
2946                          (this.objManager[one_event_type][ct].nPageClick == 1)) ||
2947                         one_event_type == "bsscpageload" ||
2948                         one_event_type == "bssctrigger1" )
2949                         CCSSP.ShowObject( this.eleTarget, false );
2950                 
2951                 if( one_event_type == "bssctrigger1" || one_event_type == "bssctrigger2" )
2952                         if( typeof( this.strTriggerEvent ) == "undefined" )
2953                                 this.strTriggerEvent = ( one_event_type == "bssctrigger1" ) ? "bssctrigger2" : "bssctrigger1";
2954                         
2955                 return true;
2956         }
2957         return false;
2958 }
2959
2960 CTarget.prototype.OnEvent = function( strBsscEvent )
2961 {// response to the event ( bssc format )
2962         if( typeof(this.objManager[strBsscEvent]) == "object" )
2963         { // to get the event agency from the event manager
2964                 var eventAgency = this.objManager[strBsscEvent];
2965                 for( var i = 0; i < eventAgency.length; i++ )
2966                 {
2967                         if( strBsscEvent == "bsscpageclick" && 
2968                                 eventAgency[i].nPageClick != CTarget.nPageClickCounter )
2969                                  continue;
2970                         else if( strBsscEvent == "bsschover" && event.type == "mouseout" )
2971                                 eventAgency[i].EndEffect();
2972                         else // to invoke the unified function in effect object 
2973                                 eventAgency[i].UpdateEffect(); 
2974                 }
2975         }
2976 }
2977
2978 CTarget.prototype.SetState = function( strBsscEvent )
2979 {
2980         if( typeof(this.objManager[strBsscEvent]) != "object" )
2981                 return false;
2982
2983         // to get the event agency from the event manager
2984         var eventAgency = this.objManager[strBsscEvent];
2985         
2986         if( strBsscEvent == "bsscpageclick" )
2987         {// we only set the initial state for the minium number of pageclick 
2988                 eventAgency[this.objManager.nMinPageClickIndex].PrepareEffect();
2989                 return true;
2990         }
2991         else
2992         {
2993                 for( var i = 0; i < eventAgency.length; i++ )
2994                         eventAgency[i].PrepareEffect(); // to invoke the unified function in effect object       
2995                 if( i > 0 )
2996                         return true;
2997                 else
2998                         return false;
2999         }
3000 }
3001 //End the definition of class CTarget
3002
3003 //Begin the definition of CEngine class
3004 function CEngine(){}// all properities are going be "class" properities
3005
3006 // object : as associative array of trigger objects
3007 CEngine.objTrigger = new Object();
3008 // object : as associative array of target objects 
3009 CEngine.objTarget = new Object(); 
3010
3011 // Array : each element is a CAgencyXXX animation object
3012 CEngine.arrAnimation = new Array();
3013 CEngine.PerformAnimation = function( nIndex )
3014 {// animation : update effects function
3015         CEngine.arrAnimation[nIndex].UpdateEffect();
3016 }
3017
3018 CEngine.AddOneTrigger = function(TriggerID,TriggerElement)
3019 {// add one Trigger object into the trigger array
3020         if( typeof(TriggerID) != "string" || TriggerElement == null ||
3021             typeof(TriggerElement) != "object" )
3022                 return;
3023         if( typeof(CEngine.objTrigger[TriggerID] ) != "object" )
3024                 CEngine.objTrigger[TriggerID] = new CTrigger(TriggerElement);
3025 }
3026         
3027 CEngine.AddOneTarget = function(TargetID, TargetElement)
3028 {// add one Target object into the target array
3029         if( typeof(TargetID) != "string" || TargetElement == null ||
3030                 typeof(TargetElement) != "object" )
3031                 return;
3032         if( typeof(CEngine.objTarget[TargetID]) != "object" )
3033                 CEngine.objTarget[TargetID] = new CTarget( TargetElement );
3034 }
3035
3036 CEngine.SendEventToOneTarget = function(strTargetID, strBsscEvent )
3037 {// to activate one target object
3038         if( typeof(CEngine.objTarget[strTargetID]) == "object" ) 
3039         {
3040                 if( strBsscEvent == "bssctrigger1" || strBsscEvent == "bssctrigger2" )
3041                 {//now, the "bssctrigger1" and "bssctrigger2" work like a toggle
3042                         if( strBsscEvent == CEngine.objTarget[strTargetID].strTriggerEvent )
3043                                 strBsscEvent = (strBsscEvent == "bssctrigger1") ? "bssctrigger2" : "bssctrigger1";
3044                         CEngine.objTarget[strTargetID].strTriggerEvent = strBsscEvent;
3045                 }
3046                 CEngine.objTarget[strTargetID].OnEvent( strBsscEvent );
3047         }
3048 }
3049
3050 CEngine.SendEventToAllTarget = function( strBsscEvent )
3051 { //to activate all target associative to the BSSC event
3052         for( var strTargetID in CEngine.objTarget ) //to enumerate all target
3053                 CEngine.SendEventToOneTarget( strTargetID, strBsscEvent );
3054 }
3055
3056 CEngine.SetOneTargetInitialState = function( strTargetID )
3057 {// only invoked after ALL effects for the target have been set
3058         if( typeof(CEngine.objTarget[strTargetID]) == "object" ) 
3059         {// to get target object
3060                 var objTarget = CEngine.objTarget[strTargetID];
3061                 if( objTarget.SetState( "bsscpageload" ) == false )
3062                 {
3063                         objTarget.SetState( "bsscpageclick" );
3064                         objTarget.SetState( "bssctrigger1" );
3065                 }
3066         }
3067 }
3068
3069 CEngine.AdjustPageClickCounter = function()
3070 {
3071         var nAdjustedClickCounter = CTarget.nPageClickCounter;
3072         var bAdjusted = false;
3073         for( var strTargetID in CEngine.objTarget ) //to enumerate all target
3074         {// try to find the minum pageCliclConter greater than CTarget.nPageClickCounter
3075                 var objEventPageClick = CEngine.objTarget[strTargetID].objManager.bsscpageclick;
3076                 if( objEventPageClick != null )
3077                 {
3078                         for( var i = 0; i < objEventPageClick.length; i++ )
3079                         {
3080                                 var nOtherPageClick = objEventPageClick[i].nPageClick;
3081                                 if( nOtherPageClick == CTarget.nPageClickCounter )
3082                                         return;
3083                                 if( nOtherPageClick > CTarget.nPageClickCounter )
3084                                 {
3085                                         if( !bAdjusted )
3086                                         {
3087                                                 nAdjustedClickCounter = nOtherPageClick;
3088                                                 bAdjusted = true;
3089                                         }
3090                                         else if( nOtherPageClick < nAdjustedClickCounter )
3091                                                 nAdjustedClickCounter = nOtherPageClick;
3092                                 }
3093                         }
3094                 }
3095         }
3096         CTarget.nPageClickCounter = nAdjustedClickCounter;
3097 }
3098
3099 CEngine.OnPageLoad = function()
3100 {       
3101         // first, to set all target's initial state
3102         for( var strTargetID in CEngine.objTarget )
3103                 CEngine.SetOneTargetInitialState( strTargetID );
3104         
3105         // to invoke all target's onpageload handler
3106         CEngine.SendEventToAllTarget( "bsscpageload" );
3107 }
3108
3109 CEngine.OnPageClick = function()
3110 { // to invoke all target's onpageclick handler
3111         var src = CCSSP.GetEventElement( arguments[0] );
3112         if( src == null )
3113                 return;
3114                 
3115         var objClickedTrigger = null;
3116         for( var strTriggerID in CEngine.objTrigger )
3117         { // to detect which trigger is clicked
3118                 if( CCSSP.IsDescendant( CEngine.objTrigger[strTriggerID].eleTrigger,src) )
3119                 {
3120                         objClickedTrigger = CEngine.objTrigger[strTriggerID];
3121                         break;
3122                 }
3123         }
3124         
3125         if( objClickedTrigger != null) // the clicked trigger found
3126                 objClickedTrigger.OnTriggerClick();
3127         else // no trigger is clicked
3128         { // to send PageClick event to all target
3129                 CTarget.nPageClickCounter++;
3130                 CEngine.AdjustPageClickCounter();
3131                 CEngine.SendEventToAllTarget( "bsscpageclick" );
3132         }
3133 }       
3134
3135 CEngine.OnMouseOver = function()
3136 { // to invoke all target's onpageload handler
3137         var src = CCSSP.GetEventElement( arguments[0] );
3138         if( src == null )
3139                 return;
3140                 
3141         var strHoveredTargetID = null;
3142         for( var strTargetID in CEngine.objTarget )
3143         { // to detect which Target is hovering on
3144                 if( CCSSP.IsDescendant( CEngine.objTarget[strTargetID].eleTarget, src ) )
3145             {
3146                         strHoveredTargetID = strTargetID;
3147                         break;
3148             }
3149         }
3150         
3151         if( strHoveredTargetID != null ) // the hovered target found
3152                 CEngine.SendEventToOneTarget( strHoveredTargetID, "bsschover" );
3153 }
3154
3155 CEngine.BuildTargetObject = function(target_ID,event_type,action_type,
3156                         action_setting, event_additional)
3157 {// to build target object 
3158         // to get the target object
3159         if( typeof( CEngine.objTarget[target_ID] ) != "object" )
3160                 return false;// the engine's AddOneTarget function might have failed.
3161         var TargetObject = CEngine.objTarget[target_ID];
3162         
3163         // to prepare the parameters for the event manager
3164         var arrEvent = event_type.split("|"); // to split the combined event_type string
3165         var arrAction = action_type.split("|");//to split the combined action_type string
3166         for( var trim = 0; trim < arrEvent.length; trim++ )
3167                 arrEvent[trim] = CCSSP.TrimSpace(arrEvent[trim]);
3168         
3169         for( trim = 0; trim < arrAction.length; trim++ )
3170                 arrAction[trim] = CCSSP.TrimSpace(arrAction[trim]);
3171         
3172         var arrSetting = new Array(); 
3173         if( typeof(action_setting) == "string" )
3174                 arrSetting = action_setting.split("|");// to split the combined action_setting string
3175         // to calibrate the arrays
3176         for( var i = arrSetting.length; i < arrAction.length; i++ )
3177         {
3178                 if( typeof(arrSetting[i]) != "string" )
3179                          arrSetting[i] = "";
3180         }                                
3181
3182         // to prepare for dealing with the absolute posioning element
3183         TargetObject.eleTarget.ABSX = CCSSP.GetObjectLeft( TargetObject.eleTarget );
3184         TargetObject.eleTarget.ABSY = CCSSP.GetObjectTop( TargetObject.eleTarget );
3185
3186         if( arrEvent.length > 1 )
3187         {// if event is combined, it must be : "bssctrigger1 | bssctrigger2"
3188                 if( arrAction.length != 2 )
3189                         return false; // if event is combined, there must be 2 actions
3190                 for( i = 0 ; i < 2; i++ )
3191                 {
3192                         if( TargetObject.SetEventManager(arrEvent[i], arrAction[i], 
3193                                 arrSetting[i], event_additional) == false )
3194                                 return false; // the event manager has not been set up
3195                 }
3196         }
3197         else // the event_type string is not combined
3198         {
3199                 for( i = 0 ; i < arrAction.length; i++ )
3200                 {
3201                         TargetObject.SetEventManager(event_type, arrAction[i], arrSetting[i], event_additional);
3202                         // to validate the event manager
3203                         if( typeof(TargetObject.objManager[event_type]) != "object" ||
3204                                         typeof(TargetObject.objManager[event_type][i]) != "object" )
3205                                 return false; // the event manager has not been set up
3206                 }
3207         }
3208         return true;
3209 }
3210
3211 CEngine.BuildTriggerObject = function(trigger_ID, target_ID)
3212 {// to build the trigger object
3213         var arrTrigger = trigger_ID.split("|"); // to split the combined trigger_ID string
3214         for( var i = 0; i < arrTrigger.length; i ++ )
3215         {// to get the trigger element then add it to the trigger list
3216                 arrTrigger[i] = CCSSP.TrimSpace( arrTrigger[i] );
3217                 var eleTrigger = CCSSP.GetObject( arrTrigger[i] );
3218                 if( eleTrigger == null )
3219                         continue; // the trigger_ID string in the HTML code maybe wrong
3220                 CEngine.AddOneTrigger( arrTrigger[i], eleTrigger );
3221
3222                 // to get the target object
3223                 if( typeof( this.objTrigger[arrTrigger[i]] ) != "object" )
3224                         continue;// the engine's AddOneTarget function might have failed.
3225                 CEngine.objTrigger[arrTrigger[i]].AddTargetID( target_ID );
3226         }
3227 }
3228 //End the definition of CEngine class
3229
3230 /// Section End  - CCSSP DHTM 1 (JavaScript 1.2)
3231
3232 /// Section Begin  - CCSSP DHTM 2 (JavaScript 1.2)
3233
3234 //Begin the definition of CAgencyXXXX classes
3235
3236 //Begin of the CAgencyShow definition
3237 function CAgencyShow( element, bIsShow )
3238 {
3239         this.ele = element;
3240         this.bIsShow = bIsShow;
3241 }
3242
3243 CAgencyShow.prototype.PrepareEffect = function()
3244 {
3245         CCSSP.ShowObject( this.ele, !this.bIsShow );
3246 }
3247
3248 CAgencyShow.prototype.UpdateEffect = function()
3249 {
3250         CCSSP.ShowObject( this.ele, this.bIsShow );
3251 }
3252
3253 CAgencyShow.prototype.EndEffect = function()
3254 {
3255         CCSSP.ShowObject( this.ele, !this.bIsShow );
3256 }
3257 // End of the CAgencyShow definition
3258
3259 // Begin of CAgencyFly definition
3260 function CAgencyFly( element, settings, bIsIn )
3261 {
3262         this.ele = element;
3263         this.bIsIn = bIsIn;
3264         this.duration = 1000; // default
3265         this.direction = "right";
3266
3267         var arrAllSet = settings.split(",");
3268         for( var i = 0; i < arrAllSet.length; i ++ )
3269         {// to retrieve the setting
3270                 arrAllSet[i] = CCSSP.TrimSpace(arrAllSet[i]);
3271                 var arrOneSet = arrAllSet[i].split("=");
3272                 for( var j = 0; j < arrOneSet.length; j++ )
3273                         arrOneSet[j] = CCSSP.TrimSpace(arrOneSet[j]);
3274                 switch( arrOneSet[0] )
3275                 {
3276                 case "speed" : this.duration = 100000/arrOneSet[1]; break;
3277                 case "direction" : this.direction = arrOneSet[1]; break;
3278                 }
3279         }
3280                 
3281         if( gbBsIE5 && this.ele.style.position != "absolute" )
3282                 this.ele.style.position = "relative";
3283         this.timer = null;
3284         this.aniIndex = CEngine.arrAnimation.length;
3285         CEngine.arrAnimation[this.aniIndex] = this;
3286 }
3287
3288 CAgencyFly.prototype.PrepareEffect = function()
3289 {
3290         CCSSP.ShowObject(this.ele, !this.bIsIn );
3291 }
3292
3293 CAgencyFly.prototype.UpdateEffect = function()
3294 {
3295         if( this.timer == null )
3296                 this.ResetParameters();
3297
3298         var percent = ((new Date()).getTime() - this.startTime)/this.duration;
3299         if( percent >= 1.0 )
3300                 this.EndEffect();
3301         else
3302         {
3303                 var newX = this.startX*(1.0-percent) +  this.finalX*percent;
3304                 var newY = this.startY*(1.0-percent) +  this.finalY*percent;
3305                 CCSSP.MoveObjectTo(this.ele, newX, newY);
3306                 if( this.timer == null )
3307                         this.timer = setInterval("CEngine.PerformAnimation(" + this.aniIndex + ")", 20 );
3308         }
3309 }
3310
3311 CAgencyFly.prototype.EndEffect = function()
3312 {
3313         clearInterval( this.timer );
3314         this.timer = null;
3315
3316         if( this.bIsIn ) // FlyIn
3317                 CCSSP.MoveObjectTo(this.ele, this.finalX, this.finalY);
3318         else // FlyOut
3319                 CCSSP.MoveObjectTo(this.ele, this.startX, this.startY);
3320         CCSSP.ShowObject(this.ele, this.bIsIn );
3321 }
3322
3323 CAgencyFly.prototype.ResetParameters = function()
3324 {
3325         this.PrepareEffect();
3326         CCSSP.ShowObject(this.ele, true );
3327
3328         this.startX = 0;
3329         this.startY = 0;
3330         this.finalX = 0;
3331         this.finalY = 0; 
3332         
3333         var offsetLeft = CCSSP.GetObjectWindowLeft(this.ele) + this.ele.offsetWidth;
3334         var offsetTop = CCSSP.GetObjectWindowTop(this.ele) + this.ele.offsetHeight;
3335         var offsetRight = CCSSP.GetWindowRight();
3336         var offsetBottom = CCSSP.GetWindowBottom();
3337
3338         if( this.bIsIn )
3339         { // FlyIn
3340                 this.finalX = this.ele.ABSX;
3341                 this.finalY = this.ele.ABSY;
3342
3343                 switch( this.direction )
3344                 {
3345                 case "right": this.startX = offsetRight; this.startY = this.finalY; break;
3346                 case "left": this.startX = -offsetLeft;  this.startY = this.finalY; break;
3347                 case "down": this.startY = offsetBottom; this.startX = this.finalX; break;
3348                 case "up":  this.startY = -offsetTop;    this.startX = this.finalX; break;
3349                 case "downright":
3350                         this.startX = ( offsetBottom < offsetRight) ? offsetBottom : offsetRight;
3351                         this.startY = this.startX;              break;
3352                 case "upright":
3353                         this.startX = (offsetTop < offsetRight)? offsetTop : offsetRight;
3354                         this.startY = -this.startX;             break;
3355                 case "upleft":
3356                         this.startX = -((offsetTop < offsetRight)? offsetTop : offsetRight);
3357                         this.startY = this.startX;              break;
3358                 case "downleft":
3359                         this.startX = -(( offsetBottom < offsetRight) ? offsetBottom : offsetRight);
3360                         this.startY = -this.startX;     break;
3361                 }
3362         }
3363         else
3364         { // FlyOut
3365                 this.startX = this.ele.ABSX;
3366                 this.startY = this.ele.ABSY;
3367
3368                 switch( this.direction )
3369                 {
3370                 case "right": this.finalX = offsetRight;  this.finalY = this.startY; break;
3371                 case "left": this.finalX = -offsetLeft;   this.finalY = this.startY;  break;
3372                 case "down": this.finalY = offsetBottom;  this.finalX = this.startX; break;
3373                 case "up":  this.finalY = -offsetTop;     this.finalX = this.startX; break;
3374                 case "downright":
3375                         this.finalX = ( offsetBottom < offsetRight) ? offsetBottom : offsetRight;
3376                         this.finalY = this.finalX;              break;
3377                 case "upright":
3378                         this.finalX = (offsetTop < offsetRight)? offsetTop : offsetRight;
3379                         this.finalY = -this.finalX;             break;
3380                 case "upleft":
3381                         this.finalX = -((offsetTop < offsetRight)? offsetTop : offsetRight);
3382                         this.finalY = this.finalX;              break;
3383                 case "downleft":
3384                         this.finalX = -(( offsetBottom < offsetRight) ? offsetBottom : offsetRight);
3385                         this.finalY = -this.finalX;     break;
3386                 }
3387         }
3388         CCSSP.MoveObjectTo(this.ele, this.startX, this.startY);
3389         this.startTime = (new Date()).getTime();
3390 }
3391 // End of the CAgencyFly definition
3392
3393 // Begin of CAgencySpiral
3394 function CAgencySpiral( element, settings, bIsIn )
3395 {
3396         this.ele = element;
3397         this.bIsIn = bIsIn;
3398         this.duration = 1000; // default
3399
3400         var arrAllSet = settings.split(",");
3401         for( var i = 0; i < arrAllSet.length; i ++ )
3402         {// to retrieve the setting
3403                 arrAllSet[i] = CCSSP.TrimSpace(arrAllSet[i]);
3404                 var arrOneSet = arrAllSet[i].split("=");
3405                 for( var j = 0; j < arrOneSet.length; j++ )
3406                         arrOneSet[j] = CCSSP.TrimSpace(arrOneSet[j]);
3407                 switch( arrOneSet[0] )
3408                 {
3409                 case "speed" : this.duration = 100000/arrOneSet[1]; break;
3410                 }
3411         }
3412
3413         if( gbBsIE5 && this.ele.style.position != "absolute" )
3414                 this.ele.style.position = "relative";
3415         this.timer = null;
3416         this.aniIndex = CEngine.arrAnimation.length;
3417         CEngine.arrAnimation[this.aniIndex] = this;
3418 }
3419
3420 CAgencySpiral.prototype.PrepareEffect = function()
3421 {
3422         CCSSP.ShowObject(this.ele, !this.bIsIn );
3423 }
3424
3425 CAgencySpiral.prototype.UpdateEffect = function()
3426 {
3427         if( this.timer == null )
3428                 this.ResetParameters();
3429
3430         var percent = ((new Date()).getTime() - this.startTime)/this.duration;
3431         if( percent >= 1.0 )
3432                 this.EndEffect();
3433         else
3434         {
3435                 var rf = (this.bIsIn)? (1.0 - percent) : percent; 
3436                 var t = (1.0-rf) * 4.0 * Math.PI
3437                 var rxP = (this.bIsIn)? this.startX : this.finalX; 
3438                 var ryP = (this.bIsIn)? this.startY : this.finalY; 
3439                 var rx = (Math.abs(rxP) < 200) ? Math.abs(rxP) : 200;
3440                 var ry = (Math.abs(ryP) < 200) ? Math.abs(ryP) : 200;
3441
3442                 var newX = Math.ceil(-rf*Math.cos(t)*rx) + this.ele.ABSX;
3443                 var newY = Math.ceil(-rf*Math.sin(t)*ry) + this.ele.ABSY;
3444                 CCSSP.MoveObjectTo(this.ele, newX, newY);
3445                 if( this.timer == null )
3446                         this.timer = setInterval("CEngine.PerformAnimation(" + this.aniIndex + ")", 20 );
3447         }
3448 }
3449
3450 CAgencySpiral.prototype.EndEffect = function()
3451 {
3452         clearInterval( this.timer );
3453         this.timer = null;
3454         
3455         if( this.bIsIn ) // In
3456                 CCSSP.MoveObjectTo(this.ele, this.finalX, this.finalY);
3457         else // Out
3458                 CCSSP.MoveObjectTo(this.ele, this.startX, this.startY);
3459         CCSSP.ShowObject(this.ele, this.bIsIn );
3460 }
3461
3462 CAgencySpiral.prototype.ResetParameters = function()
3463 {
3464         this.PrepareEffect();
3465         CCSSP.ShowObject(this.ele, true );
3466         this.startX = (this.bIsIn)? CCSSP.GetWindowRight() : this.ele.ABSX;
3467         this.startY = (this.bIsIn)? CCSSP.GetWindowBottom() : this.ele.ABSY;
3468         this.finalX = (this.bIsIn)? this.ele.ABSX : CCSSP.GetWindowRight();
3469         this.finalY = (this.bIsIn)? this.ele.ABSY : CCSSP.GetWindowBottom(); 
3470         
3471         CCSSP.MoveObjectTo(this.ele, this.startX, this.startY);
3472         this.startTime = (new Date()).getTime();
3473 }
3474 // End of CAgencySpiral
3475
3476 // Begin of CAgencyElastic
3477 function CAgencyElastic( element, settings)
3478 {
3479         this.ele = element;
3480         this.duration = 1000; // default
3481         this.direction = "right";
3482
3483         var arrAllSet = settings.split(",");
3484         for( var i = 0; i < arrAllSet.length; i ++ )
3485         {// to retrieve the setting
3486                 arrAllSet[i] = CCSSP.TrimSpace(arrAllSet[i]);
3487                 var arrOneSet = arrAllSet[i].split("=");
3488                 for( var j = 0; j < arrOneSet.length; j++ )
3489                         arrOneSet[j] = CCSSP.TrimSpace(arrOneSet[j]);
3490                 switch( arrOneSet[0] )
3491                 {
3492                 case "speed" : this.duration = 100000/arrOneSet[1]; break;
3493                 case "direction" : this.direction = arrOneSet[1]; break;
3494                 }
3495         }
3496                 
3497         if( gbBsIE5 && this.ele.style.position != "absolute" )
3498                 this.ele.style.position = "relative";
3499         this.timer = null;
3500         this.aniIndex = CEngine.arrAnimation.length;
3501         CEngine.arrAnimation[this.aniIndex] = this;
3502 }
3503
3504 CAgencyElastic.prototype.PrepareEffect = function()
3505 {
3506         CCSSP.ShowObject(this.ele, false );
3507 }
3508
3509 CAgencyElastic.prototype.UpdateEffect = function()
3510 {
3511         if( this.timer == null )
3512                 this.ResetParameters();
3513
3514         var percent = ((new Date()).getTime() - this.startTime)/this.duration;
3515         if( percent >= 1.0 )
3516                 this.EndEffect();
3517         else
3518         {
3519                 var newX = this.startX;
3520                 var newY = this.startY;
3521                 var rf = Math.exp(-percent*3);
3522                 var t = percent * 1.5 * Math.PI
3523                 var rx = (Math.abs(this.startX) > Math.abs(this.startY)) ? this.startX : this.startY;
3524                 switch (this.direction )
3525                 {
3526                 case "left":   
3527                 case "right" : newX = rf*Math.cos(t)*rx + this.ele.ABSX; break;
3528                 case "up":         
3529                 case "down" :  newY = rf*Math.cos(t)*rx + this.ele.ABSX; break;
3530                 }
3531                 CCSSP.MoveObjectTo(this.ele, newX, newY);
3532                 if( this.timer == null )
3533                         this.timer = setInterval("CEngine.PerformAnimation(" + this.aniIndex + ")", 20 );
3534         }
3535 }
3536
3537 CAgencyElastic.prototype.EndEffect = function()
3538 {
3539         CCSSP.MoveObjectTo(this.ele, this.finalX, this.finalY);
3540         clearInterval( this.timer );
3541         this.timer = null;
3542 }
3543
3544 CAgencyElastic.prototype.ResetParameters = function()
3545 {
3546         CCSSP.ShowObject(this.ele, true );
3547         this.startX = this.ele.ABSX;
3548         this.finalX = this.ele.ABSX;
3549         this.startY = this.ele.ABSY;
3550         this.finalY = this.ele.ABSY;
3551         
3552         switch (this.direction)
3553         { 
3554         case "left":  this.startX = -this.ele.offsetWidth; break;
3555         case "right": this.startX = this.ele.offsetWidth;  break;
3556         case "up":    this.startY = -this.ele.offsetHeight;break;
3557         case "down":  this.startY = this.ele.offsetHeight; break;
3558         }
3559         CCSSP.MoveObjectTo(this.ele, this.startX, this.startY);
3560         this.startTime = (new Date()).getTime();
3561 }
3562 // End of CAgencyElastic
3563
3564 // Begin of CAgencyZoom
3565 function CAgencyZoom( element, settings, bIsIn)
3566 {
3567         this.ele = element;
3568         this.duration = 1000; // default
3569         
3570         var arrAllSet = settings.split(",");
3571         for( var i = 0; i < arrAllSet.length; i ++ )
3572         {// to retrieve the setting
3573                 arrAllSet[i] = CCSSP.TrimSpace(arrAllSet[i]);
3574                 var arrOneSet = arrAllSet[i].split("=");
3575                 for( var j = 0; j < arrOneSet.length; j++ )
3576                         arrOneSet[j] = CCSSP.TrimSpace(arrOneSet[j]);
3577                 switch( arrOneSet[0] )
3578                 {
3579                 case "speed" : this.duration = 100000/arrOneSet[1]; break;
3580                 }
3581         }
3582
3583         this.bIsIn = bIsIn;
3584         this.timer = null;
3585         this.aniIndex = CEngine.arrAnimation.length;
3586         CEngine.arrAnimation[this.aniIndex] = this;
3587 }
3588
3589 CAgencyZoom.prototype.PrepareEffect = function()
3590 {
3591         CCSSP.ShowObject(this.ele, false);
3592 }
3593
3594 CAgencyZoom.prototype.UpdateEffect = function()
3595 {
3596         if( this.timer == null )
3597                 this.ResetParameters();
3598
3599         var percent = ((new Date()).getTime() - this.startTime)/this.duration;
3600         if( percent >= 1.0 )
3601                 this.EndEffect();
3602         else
3603         {
3604                 var nFactorIn = Math.ceil(50+50*percent);
3605                 var nFactorOut = Math.ceil(100+200*(1-percent));
3606                 var AlterFontsize = ((this.bIsIn)? nFactorIn : nFactorOut) + "%";
3607                 var AlterFactor = ((this.bIsIn)? nFactorIn : nFactorOut) / 100;
3608                 
3609                 this.UpdateEffectAllChildren(this.ele, AlterFontsize, AlterFactor);
3610                 for(var index = 0; index < this.ele.all.length; index++)
3611                         this.UpdateEffectAllChildren(this.ele.all[index], AlterFontsize, AlterFactor);
3612                         
3613                 if( this.timer == null )
3614                         this.timer = setInterval("CEngine.PerformAnimation(" + this.aniIndex + ")", 20 );
3615         }
3616 }
3617
3618 CAgencyZoom.prototype.UpdateEffectAllChildren = function(child, FontSize, Factor)
3619 {
3620         if( CCSSP.IsTextTag(child) )
3621                 child.style.fontSize = FontSize;
3622         else
3623         {
3624                 if( typeof(child.orgWidth) == "number" )
3625                         child.style.width = Factor * child.orgWidth;
3626                 if( typeof(child.orgHeight) == "number" )
3627                         child.style.height = Factor * child.orgHeight;
3628         }
3629 }
3630
3631 CAgencyZoom.prototype.EndEffect = function()
3632 {
3633         this.EndEffectAllChildren(this.ele);
3634         for(var index = 0; index < this.ele.all.length; index++)
3635                 this.EndEffectAllChildren(this.ele.all[index]);
3636         
3637         clearInterval( this.timer );
3638         this.timer = null;
3639 }
3640
3641 CAgencyZoom.prototype.EndEffectAllChildren = function( child )
3642 {       
3643         if( CCSSP.IsTextTag(child) )
3644                 child.style.fontSize = child.orgFontSize;
3645         else
3646         {
3647                 if( typeof(child.intactWidth) != "undefined" )
3648                 {
3649                         child.width = child.intactWidth;
3650                         child.height = child.intactHeight;
3651                 }
3652                 else if( typeof(child.style.intactPixelWidth) != "undefined" )
3653                 {
3654                         child.style.pixelWidth = child.style.intactPixelWidth;
3655                         child.style.pixelHeight = child.style.intactPixelHeight;
3656                 }
3657         }
3658 }
3659
3660 CAgencyZoom.prototype.ResetParameters = function()
3661 {
3662         this.PrepareEffect();
3663         this.ResetParametersAllChildren( this.ele );
3664         for(var index = 0; index < this.ele.all.length; index++)
3665                 this.ResetParametersAllChildren(this.ele.all[index]);
3666                 
3667         this.startTime = (new Date()).getTime();
3668 }
3669
3670 CAgencyZoom.prototype.ResetParametersAllChildren = function( child )
3671 {
3672         CCSSP.ShowObject(child, true );
3673         if( (child.tagName == "DIV") && (getParentNode(child).tagName == "TD") )
3674                 child.width = "100%";// if the div is inside a cell of table, we need the this hack
3675         
3676         if( CCSSP.IsTextTag(child) )
3677                 child.orgFontSize = child.style.fontSize;
3678         else
3679         {
3680                 if( child.width > "" || child.height > "" )
3681                 {
3682                         child.orgWidth = child.intactWidth = child.width;
3683                         child.orgHeight = child.intactHeight = child.height;
3684                 }
3685                 else if( ( typeof(child.orgWidth) != "number" ) && (typeof(child.orgHeight) != "number") )
3686                 {
3687                         child.orgWidth = child.style.intactPixelWidth = child.style.pixelWidth;
3688                         child.orgHeight = child.style.intactPixelHeight = child.style.pixelHeight;
3689                 }
3690         }
3691 }
3692 // End of CAgencyZoom
3693
3694 //// the following effects will use IE's exclusive "filter" function ////
3695 // Begin of CAgencyAlpha definition
3696 function CAgencyAlpha( element, settings, bIsIn )
3697 {// because of "visual filter" style, this won't work in Navigator
3698         this.ele = element;
3699         this.bIsIn = bIsIn;
3700
3701         // to set the default value
3702         this.startOpacity = (this.bIsIn) ? 0 : 100;
3703         this.endOpacity = (this.bIsIn) ? 100 : 0;
3704         
3705         this.duration = 1000; // default
3706         
3707         var arrAllSet = settings.split(",");
3708         for( var i = 0; i < arrAllSet.length; i ++ )
3709         {// to retrieve the setting
3710                 arrAllSet[i] = CCSSP.TrimSpace(arrAllSet[i]);
3711                 var arrOneSet = arrAllSet[i].split("=");
3712                 for( var j = 0; j < arrOneSet.length; j++ )
3713                         arrOneSet[j] = CCSSP.TrimSpace(arrOneSet[j]);
3714                 switch( arrOneSet[0] )
3715                 {
3716                 case "speed" : this.duration = 100000/arrOneSet[1]; break;
3717                 }
3718         }
3719         
3720         this.timer = null;
3721         this.aniIndex = CEngine.arrAnimation.length;
3722         CEngine.arrAnimation[this.aniIndex] = this;
3723 }
3724
3725 CAgencyAlpha.prototype.PrepareEffect = function()
3726 {// to set the visual filter function
3727         // the visual filter ONLY work when set by "Width and Height" or
3728         // absolute position for DIV, SPAN and normal tag ( such as p )
3729         // but, "absolute" cause the following elements overlap, so:
3730         CCSSP.PrepareFilter( this.ele );
3731         CCSSP.ShowObject(this.ele, !this.bIsIn );
3732 }
3733
3734 CAgencyAlpha.prototype.UpdateEffect = function()
3735 {// to set the visual filter function
3736         if( this.timer == null )
3737                 this.ResetParameters();
3738         if( typeof(this.ele.filters.alpha) != "object" )
3739         {
3740                 this.EndEffect();
3741                 return;
3742         }
3743
3744         var percent = ((new Date()).getTime() - this.startTime)/this.duration;
3745         if( percent >= 1.0 )
3746                 this.EndEffect();
3747         else if( typeof(this.ele.filters.alpha) == "object" )
3748         {
3749                 this.ele.filters.alpha.opacity = this.startOpacity*(1.0-percent) + this.endOpacity*percent;
3750                 if( this.timer == null )
3751                         this.timer = setInterval("CEngine.PerformAnimation(" + this.aniIndex + ")", 20 );
3752         }
3753 }
3754
3755 CAgencyAlpha.prototype.EndEffect = function()
3756 {// to remove the visual filter function
3757         clearInterval( this.timer );
3758         this.timer = null;
3759         this.ele.style.filter = "";
3760         CCSSP.ShowObject(this.ele, this.bIsIn );
3761 }
3762
3763 CAgencyAlpha.prototype.ResetParameters = function()
3764 {
3765         this.PrepareEffect();
3766         CCSSP.ShowObject(this.ele, true );
3767         this.ele.style.filter = "alpha(opacity=" + this.startOpacity + ")";
3768         this.startTime = (new Date()).getTime();
3769 }
3770 // End of the CAgencyAlpha definition
3771
3772 // Begin of CAgencyWave definition
3773 function CAgencyWave( element, settings )
3774 {// because of "visual filter" style, this won't work in Navigator
3775         this.ele = element;
3776
3777         this.duration = 0; // default
3778         this.strength = 10;
3779         this.freq = 1;
3780         this.lightstrength = 1;
3781         
3782         var arrAllSet = settings.split(",");
3783         for( var i = 0; i < arrAllSet.length; i ++ )
3784         {// to retrieve the setting
3785                 arrAllSet[i] = CCSSP.TrimSpace(arrAllSet[i]);
3786                 var arrOneSet = arrAllSet[i].split("=");
3787                 for( var j = 0; j < arrOneSet.length; j++ )
3788                         arrOneSet[j] = CCSSP.TrimSpace(arrOneSet[j]);
3789                 switch( arrOneSet[0] )
3790                 {
3791                 case "duration" : this.duration = 100000/arrOneSet[1]; break;
3792                 case "strength" : this.strength = arrOneSet[1]; break;
3793                 case "freq" : this.freq = arrOneSet[1]; break;
3794                 case "lightstrength" : this.lightstrength = arrOneSet[1]; break;
3795                 }
3796         }
3797
3798         this.timer = null;
3799         this.aniIndex = CEngine.arrAnimation.length;
3800         CEngine.arrAnimation[this.aniIndex] = this;
3801 }
3802
3803 CAgencyWave.prototype.PrepareEffect = function()
3804 {// to set the visual filter function
3805         CCSSP.PrepareFilter(this.ele);
3806
3807         CCSSP.ShowObject(this.ele, true );
3808 }
3809
3810 CAgencyWave.prototype.UpdateEffect = function()
3811 {// to set the visual filter function
3812         if( this.timer == null )
3813                 this.ResetParameters();
3814         if( typeof(this.ele.filters.wave) != "object" )
3815         {
3816                 this.EndEffect();
3817                 return;
3818         }
3819
3820         if( this.duration > 0 )
3821         {
3822                 var percent = ((new Date()).getTime() - this.startTime)/this.duration;
3823                 if( percent >= 1.0 )
3824                 {
3825                         this.EndEffect();
3826                         return;
3827                 }
3828         }
3829         
3830         this.ele.filters.wave.phase += 5;
3831         this.ele.filters.wave.phase %= 100;
3832         if( this.timer == null )
3833                 this.timer = setInterval("CEngine.PerformAnimation(" + this.aniIndex + ")", 50 );
3834 }
3835
3836 CAgencyWave.prototype.EndEffect = function()
3837 {// to remove the visual filter function
3838         this.ele.style.filter = "";
3839         clearInterval( this.timer );
3840         this.timer = null;
3841 }
3842
3843 CAgencyWave.prototype.ResetParameters = function()
3844 {
3845         this.PrepareEffect();
3846         this.ele.style.filter = "wave(strength=" + this.strength + ",freq=" + 
3847          this.freq +", lightstrength=" + this.lightstrength +",phase=0);";
3848         this.startTime = (new Date()).getTime();
3849 }
3850 // End of the CAgencyWave definition
3851
3852 // Begin of CAgencyGlow definition
3853 function CAgencyGlow( element, settings )
3854 {// because of "visual filter" style, this won't work in Navigator
3855         this.ele = element;
3856
3857         // to set the default value
3858         this.glowColor = "green";
3859         this.glowStrength = "3";
3860         
3861         var arrAllSet = settings.split(",");
3862         for( var i = 0; i < arrAllSet.length; i ++ )
3863         {
3864                 arrAllSet[i] = CCSSP.TrimSpace(arrAllSet[i]);
3865                 var arrOneSet = arrAllSet[i].split("=");
3866                 for( var j = 0; j < arrOneSet.length; j++ )
3867                         arrOneSet[j] = CCSSP.TrimSpace(arrOneSet[j]);
3868                 switch( arrOneSet[0] )
3869                 {
3870                 case "color" : this.glowColor = arrOneSet[1]; break;
3871                 case "strength" : this.glowStrength = arrOneSet[1]; break;
3872                 }
3873         }
3874 }
3875
3876 CAgencyGlow.prototype.PrepareEffect = function()
3877 {
3878         CCSSP.PrepareFilter(this.ele);
3879         CCSSP.ShowObject(this.ele, true );
3880         if( this.ele.style.backgroundColor != "" )
3881         {//style.backgroundColor somehow stop the visual filter
3882                 this.ele.intactBackgroundColor = this.ele.style.backgroundColor;
3883                 this.ele.style.backgroundColor = "";
3884         }
3885 }
3886
3887 CAgencyGlow.prototype.UpdateEffect = function()
3888 {// to set the visual filter function
3889         this.PrepareEffect();
3890         this.ele.style.filter = "glow(Color=" + this.glowColor + ", Strength=" + 
3891                 this.glowStrength + ", enabled=true" +")";
3892 }
3893
3894 CAgencyGlow.prototype.EndEffect = function()
3895 {// to remove the visual filter function
3896         this.ele.style.filter = "";
3897         if( typeof(this.ele.intactBackgroundColor) != "undefined" )
3898                 this.ele.style.backgroundColor = this.ele.intactBackgroundColor;
3899 }
3900 // End of the CAgencyGlow definition
3901
3902 // Begin of CAgencyDropShadow definition
3903 function CAgencyDropShadow( element, settings )
3904 {// because of "visual filter" style, this won't work in Navigator
3905         this.ele = element;
3906
3907         // to set the default value
3908         this.shadowColor = "black"; 
3909         this.shadowOffx = "1";
3910         this.shadowOffy = "1";
3911         
3912         var arrAllSet = settings.split(",");
3913         for( var i = 0; i < arrAllSet.length; i ++ )
3914         {
3915                 arrAllSet[i] = CCSSP.TrimSpace(arrAllSet[i]);
3916                 var arrOneSet = arrAllSet[i].split("=");
3917                 for( var j = 0; j < arrOneSet.length; j++ )
3918                         arrOneSet[j] = CCSSP.TrimSpace(arrOneSet[j]);
3919                 switch( arrOneSet[0] )
3920                 {
3921                 case "color" : this.shadowColor = arrOneSet[1]; break;
3922                 case "offx" : this.shadowOffx = arrOneSet[1]; break;
3923                 case "offy" : this.shadowOffy = arrOneSet[1]; break;
3924                 }
3925         }
3926 }
3927
3928 CAgencyDropShadow.prototype.PrepareEffect = function()
3929 {
3930         CCSSP.PrepareFilter(this.ele);
3931         CCSSP.ShowObject(this.ele, true );
3932         
3933         if( this.ele.style.backgroundColor != "" )
3934         {//style.backgroundColor somehow stop the visual filter
3935                 this.ele.intactBackgroundColor = this.ele.style.backgroundColor;
3936                 this.ele.style.backgroundColor = "";
3937         }
3938 }
3939
3940 CAgencyDropShadow.prototype.UpdateEffect = function()
3941 {// to set the visual filter function
3942         this.PrepareEffect();
3943         this.ele.style.filter = "dropshadow(color=" + this.shadowColor + ", offx=" + 
3944                 this.shadowOffx + ", offy=" + this.shadowOffy + ")";
3945 }
3946
3947 CAgencyDropShadow.prototype.EndEffect = function()
3948 {// to remove the visual filter function
3949         this.ele.style.filter = "";
3950         if( typeof(this.ele.intactBackgroundColor) != "undefined" )
3951                 this.ele.style.backgroundColor = this.ele.intactBackgroundColor;
3952 }
3953 // End of the CAgencyDropShadow definition
3954
3955 // Begin of CAgencyRevealTrans definition
3956 function CAgencyRevealTrans( element, settings )
3957 {// because of "visual filter" style, this won't work in Navigator
3958         this.ele = element;
3959
3960         // to set the default value
3961         this.duration = 1.0; //The value is specified in seconds.milliseconds format (0.0000).
3962         this.transition = 0;
3963         
3964         var arrAllSet = settings.split(",");
3965         for( var i = 0; i < arrAllSet.length; i ++ )
3966         {
3967                 arrAllSet[i] = CCSSP.TrimSpace(arrAllSet[i]);
3968                 var arrOneSet = arrAllSet[i].split("=");
3969                 for( var j = 0; j < arrOneSet.length; j++ )
3970                         arrOneSet[j] = CCSSP.TrimSpace(arrOneSet[j]);
3971                 switch( arrOneSet[0] )
3972                 {
3973                 case "type" : this.transition = arrOneSet[1]; break;
3974                 case "duration" : this.duration = 100/arrOneSet[1];     break;
3975                 }
3976         }
3977 }
3978
3979 CAgencyRevealTrans.prototype.PrepareEffect = function()
3980 {
3981         CCSSP.PrepareFilter(this.ele);
3982         CCSSP.ShowObject( this.ele, false);
3983 }
3984
3985 CAgencyRevealTrans.prototype.UpdateEffect = function()
3986 {// to set the visual filter function
3987         if( typeof( this.ele.filters.RevealTrans ) == "object" )
3988         {
3989                 if( this.ele.filters.RevealTrans.status == 2 )
3990                         this.ele.filters.RevealTrans.stop();  
3991         }
3992
3993         this.PrepareEffect();
3994         
3995         this.ele.style.filter = "RevealTrans(duration=" + this.duration + 
3996                 ", transition=" + this.transition + ")";
3997         
3998     if( typeof( this.ele.filters.RevealTrans ) == "object" )
3999     {
4000                 this.ele.filters.RevealTrans.apply();
4001                 CCSSP.ShowObject( this.ele, true);
4002                 this.ele.filters.RevealTrans.play();  
4003         }
4004         else
4005                 CCSSP.ShowObject( this.ele, true);
4006 }
4007
4008 CAgencyRevealTrans.prototype.EndEffect = function()
4009 {
4010     if( typeof( this.ele.filters.RevealTrans ) == "object" )
4011                 this.ele.filters.RevealTrans.stop();  
4012         this.ele.style.filter = "";
4013 }
4014 // End of the CAgencyRevealTrans definition
4015
4016 // Begin of CAgencyBlur definition
4017 function CAgencyBlur( element, settings )
4018 {// because of "visual filter" style, this won't work in Navigator
4019         this.ele = element;
4020
4021         // to set the default value
4022         this.strength = "5";
4023         this.direction = "90";
4024         
4025         var arrAllSet = settings.split(",");
4026         for( var i = 0; i < arrAllSet.length; i ++ )
4027         {
4028                 arrAllSet[i] = CCSSP.TrimSpace(arrAllSet[i]);
4029                 var arrOneSet = arrAllSet[i].split("=");
4030                 for( var j = 0; j < arrOneSet.length; j++ )
4031                         arrOneSet[j] = CCSSP.TrimSpace(arrOneSet[j]);
4032                 switch( arrOneSet[0] )
4033                 {
4034                 case "strength" : this.strength = arrOneSet[1]; break;
4035                 case "direction" : this.direction = arrOneSet[1]; break;
4036                 }
4037         }
4038 }
4039
4040 CAgencyBlur.prototype.PrepareEffect = function()
4041 {
4042         CCSSP.PrepareFilter(this.ele);
4043         CCSSP.ShowObject(this.ele, true );
4044 }
4045
4046 CAgencyBlur.prototype.UpdateEffect = function()
4047 {// to set the visual filter function
4048         CCSSP.PrepareFilter(this.ele);
4049         this.ele.style.filter = "blur(strength=" + this.strength + 
4050                 ", direction=" + this.direction + ")";
4051 }
4052
4053 CAgencyBlur.prototype.EndEffect = function()
4054 {// to remove the visual filter function
4055         this.ele.style.filter = "";
4056 }
4057 // End of the CAgencyBlur definition
4058
4059 // Begin of CAgencyChangeFilter definition
4060 function CAgencyChangeFilter( element, settings ) // flipH, flipV, invert, grey,
4061 {// because of "visual filter" style, this won't work in Navigator
4062         this.ele = element;
4063
4064         // to set the default value
4065         this.filterFunction = settings;
4066 }
4067
4068 CAgencyChangeFilter.prototype.PrepareEffect = function()
4069 {
4070         CCSSP.PrepareFilter(this.ele);
4071         CCSSP.ShowObject(this.ele, true );
4072 }
4073
4074 CAgencyChangeFilter.prototype.UpdateEffect = function()
4075 {// to set the visual filter function
4076         CCSSP.PrepareFilter(this.ele);
4077         this.ele.style.filter = this.filterFunction;
4078 }
4079
4080 CAgencyChangeFilter.prototype.EndEffect = function()
4081 {// to remove the visual filter function
4082         this.ele.style.filter = "";
4083 }
4084 // End of the CAgencyChangeFilter definition
4085
4086 // The effects below change the style on the fly, so they won't work in Navigator
4087
4088 // Begin of CAgencyFontChange definition, 
4089 function CAgencyFontChange( element, settings )
4090 {//this class can be replace by CAgencyChangeStyle,provided the "settings" is standard CSS string.
4091         this.ele = element;
4092         
4093         // to retrieve the original font style
4094         this.RetrieveOldFont( this.ele );
4095         
4096         // to set the default font to change
4097         this.newfontFamily = this.ele.oldFontFamily;
4098         this.newfColor = this.ele.oldColor;
4099         this.newtextDecoration = this.ele.oldTextDecoration;
4100         this.newfontWeight = this.ele.oldFontWeight;
4101         this.newfontStyle = this.ele.oldFontStyle;
4102         this.newfontSize = this.ele.oldFontSize;
4103         this.newBackgroundColor = this.ele.oldBackgroundColor;
4104         
4105         var arrAllSet = settings.split(",");
4106         for( var i = 0; i < arrAllSet.length; i ++ )
4107         {// to retrieve the setting
4108                 arrAllSet[i] = CCSSP.TrimSpace(arrAllSet[i]);
4109                 var arrOneSet = arrAllSet[i].split("=");
4110                 for( var j = 0; j < arrOneSet.length; j++ )
4111                         arrOneSet[j] = CCSSP.TrimSpace(arrOneSet[j]);
4112                 switch( arrOneSet[0] )
4113                 {
4114                 case "font-family" : this.newfontFamily = arrOneSet[1]; break;
4115                 case "color" : this.newfColor = arrOneSet[1]; break;
4116                 case "underline" : this.newtextDecoration = (arrOneSet[1]=="on")? "underline" : "none"; break;
4117                 case "bold" : this.newfontWeight = (arrOneSet[1]=="on")? "bold" : "normal"; break;
4118                 case "italic" : this.newfontStyle = (arrOneSet[1]=="on")? "italic" : "normal"; break;
4119                 case "size" : this.newfontSize = arrOneSet[1]; break;
4120                 case "background-color" : this.newBackgroundColor = arrOneSet[1]; break;
4121                 }
4122         }
4123 }
4124
4125 CAgencyFontChange.prototype.RetrieveOldFont = function(objChild)
4126 {
4127         if( typeof(objChild.oldFontFamily) == "undefined" )
4128                 objChild.oldFontFamily = objChild.style.fontFamily;
4129         if( typeof(objChild.oldColor) == "undefined" )
4130                 objChild.oldColor = objChild.style.color;
4131         if( typeof(objChild.oldTextDecoration) == "undefined" )
4132                 objChild.oldTextDecoration = objChild.style.textDecoration;
4133         if( typeof(objChild.oldFontWeight) == "undefined" )
4134                 objChild.oldFontWeight = objChild.style.fontWeight;
4135         if( typeof(objChild.oldFontStyle) == "undefined" )
4136                 objChild.oldFontStyle = objChild.style.fontStyle;
4137         if( typeof(objChild.oldFontSize) == "undefined" )
4138                 objChild.oldFontSize = objChild.style.fontSize;
4139         if( typeof(objChild.oldBackgroundColor) == "undefined" )
4140                 objChild.oldBackgroundColor = objChild.style.backgroundColor;
4141 }
4142
4143 CAgencyFontChange.prototype.PrepareEffect = function()
4144 {
4145         // as for expanding text, the child is created after the constructor called
4146         for(var index = 0; index < this.ele.all.length; index++)
4147                 this.RetrieveOldFont(this.ele.all[index]);
4148         CCSSP.ShowObject(this.ele, true );
4149 }
4150
4151 CAgencyFontChange.prototype.UpdateEffect = function()
4152 {// to change the font
4153         this.PrepareEffect();
4154         this.UpdateEffectAllChildren( this.ele );
4155         for( var index = 0; index < this.ele.all.length; index++)
4156                 this.UpdateEffectAllChildren(this.ele.all[index]);
4157 }
4158
4159 CAgencyFontChange.prototype.UpdateEffectAllChildren = function(objChild)
4160 {
4161         objChild.style.fontFamily = this.newfontFamily;
4162         objChild.style.color = this.newfColor;
4163         objChild.style.textDecoration = this.newtextDecoration;
4164         objChild.style.fontWeight = this.newfontWeight;
4165         objChild.style.fontStyle = this.newfontStyle;
4166         objChild.style.fontSize = this.newfontSize;
4167         objChild.style.backgroundColor = this.newBackgroundColor;
4168 }
4169
4170 CAgencyFontChange.prototype.EndEffect = function()
4171 {// to reinstate the original font style
4172         this.EndEffectAllChildren( this.ele );
4173         for( var index = 0; index < this.ele.all.length; index++)
4174                 this.EndEffectAllChildren(this.ele.all[index]);
4175 }
4176
4177 CAgencyFontChange.prototype.EndEffectAllChildren = function( objChild )
4178 {
4179         if( typeof(objChild.oldFontFamily) != "undefined" )
4180                 objChild.style.fontFamily = objChild.oldFontFamily;
4181         if( typeof(objChild.oldColor) != "undefined" )
4182                 objChild.style.color = objChild.oldColor;
4183         if( typeof(objChild.oldFontWeight) != "undefined" )
4184                 objChild.style.fontWeight = objChild.oldFontWeight;
4185         if( typeof(objChild.oldFontStyle) != "undefined" )
4186                 objChild.style.fontStyle = objChild.oldFontStyle;
4187         if( typeof(objChild.oldFontSize) != "undefined" )
4188                 objChild.style.fontSize = objChild.oldFontSize;
4189         if( typeof(objChild.oldTextDecoration) != "undefined" )
4190                 objChild.style.textDecoration = objChild.oldTextDecoration;
4191         if( typeof(objChild.oldBackgroundColor) != "undefined" )
4192                 objChild.style.backgroundColor = objChild.oldBackgroundColor;
4193 }
4194 // End of the CAgencyFontChange definition
4195
4196 // Begin of the CAgencyChangeStyle definition
4197 function CAgencyChangeStyle( element, settings )
4198 {//this class can be replace by CAgencyChangeStyle,provided the "settings" is standard CSS string.
4199         this.ele = element;
4200         
4201         // to retrieve the original style
4202         this.oldstyle = this.ele.style.cssText;
4203         
4204         // to set the default style
4205         this.newStyle = this.oldstyle;
4206         
4207         if( typeof(settings) == "string" && settings.length > 1 )
4208                 this.newStyle = this.oldstyle + " " + settings;
4209 }
4210
4211 CAgencyChangeStyle.prototype.PrepareEffect = function()
4212 {
4213         CCSSP.ShowObject(this.ele, true );
4214 }
4215
4216 CAgencyChangeStyle.prototype.UpdateEffect = function()
4217 {// to change the style
4218         this.ele.style.cssText = this.newStyle;
4219 }
4220
4221 CAgencyChangeStyle.prototype.EndEffect = function()
4222 {// to reinstate the original style
4223         this.ele.style.cssText = this.oldStyle;
4224 }
4225 // End of the CAgencyChangeStyle definition
4226
4227 //End the definition of CAgencyXXXX classes
4228
4229 //Begin to collaborate with other event handler settings 
4230 CCSSP.RegisterEventHandler( window, "onload", "CEngine.OnPageLoad();BSSCOnLoad();kadovInitTriggersInHead();");
4231 CCSSP.RegisterEventHandler( document, "onclick", "CEngine.OnPageClick();BSSCOnClick();");
4232 CCSSP.RegisterEventHandler( document, "onmouseover", "CEngine.OnMouseOver();BSSCOnMouseOver();" );
4233 CCSSP.RegisterEventHandler( document, "onmouseout", "CEngine.OnMouseOver();BSSCOnMouseOut();" );
4234 CCSSP.RegisterEventHandler( window, "onunload", "BSSCOnUnload();");
4235 //End to collaborate with other event handler settings
4236
4237 /// Section End  - CCSSP DHTM 2 (JavaScript 1.2)
4238
4239 //// Segment End -- (JavaScript 1.2)