home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / chipcd20010102.iso / software / internet / thirdvoice / setup3v.exe / %MAINDIR% / htm / PsnNotes / PsnNotes.js < prev   
Encoding:
JavaScript  |  2000-11-26  |  17.7 KB  |  648 lines

  1. // /////////////////////////////////////////////////////////////////////////
  2. // GLOBAL VARIABLES                                                       //
  3. //                                                                        //
  4.   var TV__PsnNotes        = new TV__LAB_AnnotTree();
  5.   var TV__LAB_FolderArray = new Array();
  6.  
  7.   var TV__TVP           = "<tvp>";
  8.   var TV__MODULEID      = 500;
  9.   var TV__TV_CLIENT_HDR = "AweAnnotMsg" + TV__TVP + TV__MODULEID;
  10.  
  11.   var TV__DHTML_ADD_PFOLDER     = 5000;
  12.   var TV__DHTML_ADD_ANNOTATION  = 5001;
  13.   var TV__DHTML_DEL_ANNOTATION  = 5002;
  14.   var TV__DHTML_EDIT_ANNOTATION = 5003;
  15.  
  16.   var TV__TVM_ONCLOSE   = 10;
  17.   var TV__TVM_ONLOAD    = 20;
  18.   var TV__TVM_UPDATE    = 5010;
  19.   var TV__TVM_DELETE    = 5011;
  20.   var TVM_POSTTOPUBLIC  = 5012;
  21.   var TVM_POSTTOPRIVATE = 5013;
  22.  
  23.   var TV__annotlistPrefix   = "annotlist";
  24.   var TV__annotPrefix       = "annot";
  25.   var TV__folderCountPrefix = "folderCnt";
  26.   var TV__trackSelectedFolder = null;
  27.  
  28.   var TV__highlightColor    = "yellow";
  29. //                                                                        //
  30. ////////////////////////////////////////////////////////////////////////////
  31.  
  32. function onLoad()
  33. {
  34.   var TV__event = TV__TV_CLIENT_HDR + TV__TVP + TV__TVM_ONLOAD;
  35.   TV__raiseEvent(TV__event);
  36. }
  37.  
  38. function onUnLoad()
  39. {
  40.   //TV__raiseEvent(TV__TV_CLIENT_HDR + TV__TVP + TV__TVM_ONCLOSE);
  41. }
  42.  
  43. ////////////////////////////////////////////////////////////////////////////
  44. // EVENT MAP                                                              //
  45. //                                                                        //
  46.   function TV_500_Invoke(TV__eventid, TV__params)
  47.   {
  48.     var TV__A = new Array;
  49.  
  50.     switch (TV__eventid)
  51.     {
  52.     case TV__DHTML_ADD_PFOLDER:
  53.       if (!TV__getParams(TV__A, TV__params, 2))
  54.         alert("add folder: wrong number of parameters");
  55.       else
  56.         TV__AddFolder(TV__A[0], TV__A[1]);
  57.       break;
  58.  
  59.     case TV__DHTML_ADD_ANNOTATION:
  60.       if (!TV__getParams(TV__A, TV__params, 7))
  61.         alert("add annotation: wrong number of parameters");
  62.       else
  63.         TV__AddAnnotation(TV__A[0], TV__A[1], TV__A[2], TV__A[3], TV__A[4], TV__A[5], TV__A[6]);
  64.       break;
  65.  
  66.     case TV__DHTML_DEL_ANNOTATION:
  67.       if (!TV__getParams(TV__A, TV__params, 1))
  68.         alert("delete annotation: wrong number of parameters");
  69.       else
  70.         TV__DeleteAnnotation(TV__A[0]);
  71.       break;
  72.  
  73.     case TV__DHTML_EDIT_ANNOTATION:
  74.       if (!TV__getParams(TV__A, TV__params, 3))
  75.         alert("edit annotation: wrong number of parameters");
  76.       else
  77.         TV__EditAnnot(TV__A[0], TV__A[1], TV__A[2]);
  78.       break;
  79.     }
  80.   }
  81. //                                                                        //
  82. // /////////////////////////////////////////////////////////////////////////
  83.  
  84.  
  85. // /////////////////////////////////////////////////////////////////////////
  86. // OBJECT DECLARATION                                                     //
  87. //                                                                        //
  88.    function TV__LAB_AnnotTree()
  89.    {
  90.      this.addFolder = annotTree_addFolder;
  91.    }
  92.    
  93.    function annotTree_addFolder(TV__strID, TV__strName)
  94.    {
  95.      var TV__treeID     = "tree" + TV__strID;
  96.      var treeFolder = document.all.item(TV__treeID);
  97.  
  98.      if (treeFolder != null)
  99.        return false;
  100.  
  101.      var insertEle = document.all.item("treelist");
  102.      if (insertEle == null)
  103.        return false;
  104.  
  105.      var newFolder = new TV__LAB_AnnotFolder(TV__strID, TV__strName);
  106.      TV__LAB_FolderArray[TV__strID] = newFolder;
  107.      insertEle.insertAdjacentHTML("beforeEND", newFolder.TV__markup());
  108.  
  109.      return true;
  110.   }
  111.   
  112.   function TV__LAB_AnnotFolder(TV__strID, TV__strName)
  113.   {
  114.    this.TV__id         = TV__strID;
  115.    this.TV__name       = TV__strName;
  116.    this.TV__annotCount = 0;
  117.    this.TV__filled     = false;
  118.    this.TV__annotArray = new Array();
  119.    
  120.    this.TV__updateCount = TV__FDR_UpdateCount;
  121.    this.TV__markup      = TV__FDR_Markup;
  122.    this.TV__addAnnot    = TV__FDR_AddAnnot;
  123.    this.TV__removeAnnot = TV__FDR_RemoveAnnot;
  124.    this.TV__fillAnnots  = TV__FDR_fillAnnots;
  125.    this.TV__editAnnot   = TV__FDR_editAnnot;
  126.    this.TV__getAnnot    = TV__FDR_getAnnot;
  127.   }
  128.  
  129.   function TV__FDR_Markup()
  130.   {
  131.     var TV__treeID = "tree" + this.TV__id;
  132.     return "<li id=" + TV__treeID + " class=foldername>" + this.TV__name + " <ul id=" + TV__annotlistPrefix + this.TV__id + " class=annotlist></ul></li>";
  133.   }
  134.  
  135.   function TV__FDR_AddAnnot(TV__strID, TV__strTitle, TV__strContent, TV__strUrl, TV__strRefStr, TV__strDate)
  136.   {
  137.     var TV__newAnnot = new TV__LAB_Annotation(TV__strID, TV__strTitle, TV__strContent, TV__strUrl, TV__strRefStr, TV__strDate, this);
  138.     this.TV__annotArray[this.TV__annotArray.length] = TV__newAnnot;
  139.     this.TV__annotCount++;
  140.     this.TV__updateCount();
  141.     return true;
  142.   }
  143.  
  144.   function TV__FDR_RemoveAnnot(TV__strID)
  145.   {
  146.     for (var i = 0; i < this.TV__annotArray.length; i++)
  147.     {
  148.       var TV__annot = this.TV__annotArray[i] 
  149.       if ( (TV__annot != null) && (TV__annot.TV__id == TV__strID) )
  150.       {
  151.         this.TV__annotArray[i] = null;
  152.         break;
  153.       }
  154.     }
  155.     
  156.     this.TV__annotCount--;
  157.     this.TV__updateCount();
  158.     return true;
  159.   }
  160.  
  161.   function TV__FDR_fillAnnots()
  162.   {
  163.     var TV__folderEle = document.all.item(TV__annotlistPrefix + this.TV__id);
  164.  
  165.     if (TV__folderEle != null)
  166.     {
  167.       var TV__strInsert = "";  
  168.  
  169.       for (var  i = 0; i < this.TV__annotArray.length; i++)
  170.         TV__strInsert += this.TV__annotArray[i].TV__markup();
  171.  
  172.       if (TV__strInsert != "")
  173.         TV__folderEle.insertAdjacentHTML("beforeEnd", TV__strInsert);
  174.     }
  175.     
  176.     this.TV__filled = true;
  177.     return false;
  178.   }
  179.  
  180.   function TV__FDR_editAnnot(TV__strID, TV__strTitle, TV__strContent)
  181.   {
  182.     var TV__annot = this.TV__getAnnot(TV__strID);
  183.  
  184.     if (TV__annot != null)
  185.     {
  186.       TV__annot.TV__update(TV__strTitle, TV__strContent);
  187.       TV__enableButton(true);
  188.       return true;
  189.     }
  190.     return false;
  191.   }
  192.  
  193.   function TV__FDR_getAnnot(TV__strID)
  194.   {
  195.     for (var i = 0; i < this.TV__annotArray.length; i++)
  196.     {
  197.       var TV__annot = this.TV__annotArray[i];
  198.  
  199.       if ( (TV__annot != null) && (TV__annot.TV__id == TV__strID) )
  200.         return TV__annot;
  201.     }
  202.     return null;
  203.   }
  204.  
  205.   function TV__FDR_UpdateCount()
  206.   {
  207.     var TV__folder = TV__LAB_FolderArray[this.TV__id];
  208.     if (TV__folder == null)
  209.       return false;
  210.     
  211.     var TV__objFolder = document.all.item(TV__annotlistPrefix + this.TV__id);
  212.  
  213.     var TV__innerHTML = TV__objFolder.parentElement.innerHTML;
  214.     var TV__label = (this.TV__annotCount == 0) ? this.TV__name : this.TV__name + " [" + this.TV__annotCount + "]";
  215.  
  216.     var TV__startidx = TV__innerHTML.indexOf(this.TV__name);
  217.     var TV__endidx   = TV__innerHTML.indexOf("<", TV__startidx + 1);
  218.  
  219.     TV__innerHTML = TV__innerHTML.substring(0, TV__startidx) + TV__label + TV__innerHTML.substring(TV__endidx);
  220.     var TV__parent = TV__objFolder.parentElement;
  221.     TV__parent.innerHTML = TV__innerHTML;
  222.     TV__parent.style.color= 'black';
  223.         
  224.     return true;
  225.   }
  226.  
  227.   function TV__LAB_Annotation(TV__strID, TV__strTitle, TV__strContent, TV__strUrl, TV__strRefStr, TV__strDate, TV__objParent)
  228.   {
  229.     this.TV__id      = TV__strID;
  230.     this.TV__title   = TV__strTitle;
  231.     this.TV__content = TV__strContent;
  232.     this.TV__url     = TV__strUrl;
  233.     this.TV__refStr  = TV__strRefStr;
  234.     this.TV__date    = TV__strDate;
  235.     this.TV__parent  = TV__objParent;
  236.     this.TV__parentID= TV__objParent.TV__id;
  237.  
  238.     this.TV__markup    = TV__ANN_Markup;
  239.     this.TV__update    = TV__ANN_Update;
  240.     this.TV__showAnnot = TV__ANN_ShowAnnot;
  241.   }
  242.  
  243.   function TV__ANN_Markup()
  244.   {
  245.     var TV__treeID = TV__annotPrefix + this.TV__id;
  246.     return "<li id=" + TV__treeID  + " class=annotitem parentid=" + this.TV__parentID + " onclick=TV__ShowAnnotation(\"" + TV__treeID + "\")>" + this.TV__title + "</li>";
  247.   }
  248.  
  249.   function TV__ANN_Update(TV__strTitle, TV__strContent)
  250.   {
  251.     this.TV__title   = TV__strTitle;
  252.     this.TV__content = TV__strContent;
  253.  
  254.     // change the list tree
  255.     var TV__annotid = "treeannot" + this.TV__id;
  256.     var TV__annottree = document.all.item(TV__annotid);
  257.  
  258.     if (TV__annottree == null)
  259.       return false;
  260.  
  261.     TV__annottree.innerText = this.TV__title;
  262.     return this.TV__showAnnot();
  263.   }
  264.  
  265.   function TV__ANN_ShowAnnot()
  266.   {
  267.     TV__HideAnnotContent();
  268.  
  269.     var TV__doc      = document.all;
  270.     var TV__treeID   = TV__annotPrefix + this.TV__id; 
  271.     var TV__objAnnot = TV__doc[TV__treeID];
  272.     TV__objAnnot.style.backgroundColor = TV__highlightColor;
  273.  
  274.     TV__trackSelectedFolder = TV__objAnnot.parentElement.parentElement;
  275.     TV__doc.annotdetail.currID = this.TV__id;
  276.     TV__doc.atitle.value       = this.TV__title;
  277.     TV__doc.acontent.value     = this.TV__content;
  278.     TV__doc.aurl.innerText     = this.TV__url;
  279.     TV__doc.aurl.href          = this.TV__url;
  280.     TV__doc.adate.innerText    = this.TV__date;
  281.   }
  282.  
  283. //                                                                        //
  284. ////////////////////////////////////////////////////////////////////////////
  285.  
  286. function TV__AddFolder(TV__strID, TV__strName)
  287. {
  288.   return TV__PsnNotes.addFolder(TV__strID, TV__strName);
  289. }
  290.  
  291. function TV__AddAnnotation(TV__strID, TV__strTitle, TV__strContent, TV__strUrl, TV__strRefStr, TV__strDate, strFolderID)
  292. {
  293.   var TV__folder = TV__LAB_FolderArray[strFolderID];
  294.  
  295.   if (TV__folder == null)
  296.     return false;
  297.  
  298.   return TV__folder.TV__addAnnot(TV__strID, TV__strTitle, TV__strContent, TV__strUrl, TV__strRefStr, TV__strDate);
  299. }
  300.  
  301. // /////////////////////////////////////////////////////////////////////////
  302. // 
  303. // EDIT ANNOTATION
  304. //
  305. function TV__EditAnnot(TV__strID, TV__strTitle, TV__strContent)
  306. {
  307.   var TV__annotEle = document.all[TV__annotPrefix + TV__strID];
  308.  
  309.   if (TV__annotEle != null)
  310.   {
  311.     var TV__folder = TV__LAB_FolderArray[TV__annotEle.getAttribute("parentid")];
  312.  
  313.     if (TV__folder != null)
  314.     {
  315.       TV__annotEle.innerText = TV__strTitle;
  316.       return TV__folder.TV__editAnnot(TV__strID, TV__strTitle, TV__strContent);
  317.     }
  318.   }
  319.   
  320.   return false;
  321. }
  322.  
  323. // /////////////////////////////////////////////////////////////////////////
  324. //
  325. // DELETE ANNOTATION
  326. //
  327. function TV__DeleteAnnotation(TV__strID)
  328. {
  329.   var TV__bDeleted = false;
  330.   var TV__annotEle = document.all[TV__annotPrefix + TV__strID];
  331.  
  332.   if (TV__annotEle != null)
  333.   {
  334.     TV__annotEle.outerHTML = "";
  335.     var TV__folder = TV__LAB_FolderArray[TV__annotEle.getAttribute("parentid")];
  336.  
  337.     if (TV__folder != null)
  338.       TV__bDeleted = TV__folder.TV__removeAnnot(TV__strID);
  339.   }
  340.     
  341.   if (TV__bDeleted == true)
  342.     TV__clearDetailBox();
  343.  
  344.   return TV__bDeleted;
  345. }
  346.  
  347.  
  348. // /////////////////////////////////////////////////////////////////////////
  349. // 
  350. // SHOW/HIDE ANNOTATION DETAILS
  351. //
  352. function TV__ShowAnnotation(TV__id)
  353. {
  354.   TV__ShowAnnotContent(TV__id);
  355.  
  356.   event.cancelBubble = true;
  357.   event.returnValue = false;
  358. }
  359.  
  360. function TV__ShowAnnotContent(TV__strID)
  361. {
  362.   if (TV__strID.substring(0, TV__annotPrefix.length) != TV__annotPrefix)
  363.     return;
  364.  
  365.   var TV__annotEle = document.all[TV__strID];
  366.  
  367.   if (TV__annotEle != null)
  368.   {
  369.     var TV__folder = TV__LAB_FolderArray[TV__annotEle.getAttribute("parentid")];
  370.     TV__strID = TV__strID.substring(TV__annotPrefix.length);
  371.  
  372.     var TV__annot = TV__folder.TV__getAnnot(TV__strID);
  373.     if (TV__annot != null)
  374.     {
  375.       TV__annot.TV__showAnnot();
  376.       TV__enableButton(true);
  377.       return true;
  378.     }
  379.   }
  380.   return false;
  381. }
  382.  
  383. function TV__HideAnnotContent()
  384. {
  385.   var TV__doc = document.all;
  386.  
  387.   if (TV__doc.annotdetail.currID != null)
  388.   {
  389.     var TV__treeID = TV__annotPrefix + TV__doc.annotdetail.currID;
  390.     var TV__objAnnot = TV__doc[TV__treeID];
  391.     TV__objAnnot.style.backgroundColor = "transparent";
  392.   }
  393.   TV__clearDetailBox();
  394. }
  395.  
  396. function TV__clearDetailBox()
  397. {
  398.   var TV__doc = document.all;
  399.  
  400.   TV__doc.annotdetail.currID = null;
  401.   TV__doc.atitle.value       = "";
  402.   TV__doc.acontent.value     = "";
  403.   TV__doc.aurl.innerText     = "";
  404.   TV__doc.adate.innerText    = "";
  405.  
  406.   TV__enableButton(false);
  407. }
  408.  
  409. // /////////////////////////////////////////////////////////////////////////
  410. // 
  411. // BUTTONS
  412. //
  413. function OnClickUpdate()
  414. {
  415.   var TV__annotid = document.all.annotdetail.currID;
  416.  
  417.   if(TV__annotid != null)
  418.   {
  419.     var TV__title = TV__trim(document.all.atitle.value);
  420.  
  421.     if (TV__title == "")
  422.     {
  423.       alert("Please pick a title for the annotation");
  424.       return;
  425.     }
  426.  
  427.     if (TV__hasTag(TV__title))
  428.     {
  429.       alert("HTML tag is not allowed in title, please try again.");
  430.       return;
  431.     }
  432.  
  433.     var TV__event = TV__TV_CLIENT_HDR + TV__TVP + TV__TVM_UPDATE + TV__TVP + TV__annotid + TV__TVP + TV__title;
  434.     TV__raiseEvent(TV__event);    
  435.   }
  436. }
  437.  
  438. function OnClickDelete()
  439. {
  440.   if (confirm('Do you want to delete this note?') == false)
  441.     return;
  442.   
  443.   var TV__annotid = document.all.annotdetail.currID;
  444.  
  445.   if(null != TV__annotid)
  446.   {
  447.     var TV__event = TV__TV_CLIENT_HDR + TV__TVP + TV__TVM_DELETE + TV__TVP + TV__annotid;
  448.     TV__raiseEvent(TV__event);    
  449.   }
  450. }
  451.  
  452. function OnClickUndo()
  453. {
  454.   var TV__annotid = document.all.annotdetail.currID;
  455.  
  456.   if(TV__annotid != null)
  457.   {
  458.     TV__ShowAnnotContent(TV__annotPrefix + TV__annotid);
  459.     setUpdateUndoBtn(false);
  460.   }
  461. }
  462.  
  463. function OnPost(Destination)
  464. {
  465.   var TV__annotid = document.all.annotdetail.currID;
  466.   
  467.   if(TV__annotid == null) // no annotation selected
  468.     return;
  469.  
  470.   var TV__sMessage = eval("TVM_POSTTO" + Destination);
  471.   
  472.   var TV__annotEle = document.all[TV__annotPrefix + TV__annotid];
  473.  
  474.   if (TV__annotEle != null)
  475.   {
  476.     var TV__folder = TV__LAB_FolderArray[TV__annotEle.getAttribute("parentid")];
  477.  
  478.     if (TV__folder != null)
  479.     {
  480.       var TV__annot = TV__folder.TV__getAnnot(TV__annotid);
  481.       var TV__title   = TV__trim(document.all.atitle.value);
  482.       var TV__content = TV__trim(document.all.acontent.value);
  483.  
  484.       if (TV__title == "" || TV__content == "")
  485.       {
  486.         alert("Sorry, we cannot forward note without title or content");
  487.         return;
  488.       }
  489.  
  490.       var TV__event = TV__TV_CLIENT_HDR + TV__TVP + TV__sMessage + TV__TVP + TV__annot.TV__url + TV__TVP + TV__annot.TV__refStr + TV__TVP + TV__title;
  491.       TV__raiseEvent(TV__event);
  492.     }
  493.   }
  494. }
  495.  
  496. function TV__enableButton(TV__bEnable)
  497. {
  498.   var TV__state = !TV__bEnable;
  499.  
  500.   var TV__doc = document.all;
  501.   TV__doc.atitle.disabled      = TV__state;
  502.   TV__doc.acontent.disabled    = TV__state;
  503.   TV__doc.del.disabled         = TV__state;
  504.   TV__doc.postpublic.disabled  = TV__state;
  505.   TV__doc.postprivate.disabled = TV__state;
  506.   setUpdateUndoBtn(false);
  507. }
  508.  
  509. function setUpdateUndoBtn(TV__bState, TV__e, TV__bHandleEnter)
  510. {
  511.   if (TV__e != null)
  512.   {
  513.     var TV__enterKey = 13;
  514.     if ( (TV__e.keyCode == TV__enterKey) && (TV__bHandleEnter == false) )
  515.       return; 
  516.   }
  517.  
  518.   document.all.update.disabled = !TV__bState;
  519.   document.all.undo.disabled = !TV__bState;
  520. }
  521.  
  522. function checkupchanges(TV__e, TV__bHandleEnter)
  523. {
  524.   var TV__backspKey =  8;
  525.   var TV__delKey    = 46;
  526.   var TV__CtrlV     = 86;
  527.   var TV__SHIFTINS  = 45;
  528.   var TV__CtrlDel   = 88;
  529.  
  530.   var TV__key = TV__e.keyCode
  531.  
  532.   if ( (TV__key == TV__backspKey) || (TV__key == TV__delKey) || (TV__key == TV__CtrlV) || (TV__key == TV__SHIFTINS) || (TV__key == TV__CtrlDel))
  533.     setUpdateUndoBtn(true);
  534. }
  535.  
  536. // /////////////////////////////////////////////////////////////////////////
  537. // 
  538. // MISCELLANEOUS
  539. //
  540. function OutLiner()
  541. {
  542.   var TV__el = null, TV__child = null;
  543.   TV__el = event.srcElement;
  544.   TV__child = document.all[event.srcElement.sourceIndex+1];
  545.  
  546.   if ( (TV__child.tagName == 'UL'))
  547.   {
  548.     if(TV__el.className == 'foldername')
  549.     {
  550.       if (TV__fillAnnot(TV__child.id.substring(TV__annotlistPrefix.length)))
  551.       {
  552.         TV__child.style.display = 'block';
  553.         TV__el.className = 'foldernameopen';
  554.       }
  555.     }
  556.     else
  557.     {
  558.       TV__child.style.display = 'none';
  559.       TV__el.className = 'foldername';
  560.  
  561.       if (TV__el == TV__trackSelectedFolder)
  562.       {
  563.         TV__trackSelectedFolder = null;
  564.         TV__HideAnnotContent();
  565.       }
  566.     }
  567.   }
  568.   event.cancelBubble = true;
  569.   event.returnValue = false;
  570. }
  571.  
  572. function TV__fillAnnot(TV__folderid)
  573. {
  574.   var TV__folder = TV__LAB_FolderArray[TV__folderid];
  575.  
  576.   if (TV__folder != null)
  577.   {
  578.     if (TV__folder.TV__filled == false)
  579.       TV__folder.TV__fillAnnots();
  580.   }
  581.  
  582.   return (TV__folder.TV__annotCount > 0);
  583. }
  584.  
  585. function TV__getParams(TV__A, TV__params, TV__num)
  586. {
  587.   if (TV__params.substring(0, TV__TVP.length) != TV__TVP)
  588.     return false;
  589.  
  590.   TV__params = TV__params.substring(TV__TVP.length);
  591.   var TV__idx = TV__params.indexOf(TV__TVP);
  592.  
  593.   while (TV__idx != -1)
  594.   {
  595.     TV__A[TV__A.length] = TV__params.substring(0, TV__idx);
  596.     TV__params = TV__params.substring(TV__idx +TV__TVP.length);
  597.     TV__idx = TV__params.indexOf(TV__TVP);
  598.   }
  599.  
  600.   if (TV__idx != "")
  601.     TV__A[TV__A.length] = TV__params;
  602.  
  603.   if (TV__A.length != TV__num)
  604.     return false;
  605.  
  606.   return true;
  607. }
  608.  
  609. function TV__raiseEvent(TV__event)
  610. {
  611.   window.status = TV__event;
  612.   window.status = "";
  613. }
  614.  
  615. function TV__trim(TV__instr)
  616. {
  617.   var TV__str = new String();
  618.   var TV__count = TV__instr.length;
  619.  
  620.   for (var i = TV__instr.length-1 ; i >= 0; i--)
  621.   {
  622.     if (TV__instr.charAt(i) != " ")
  623.       break;
  624.     TV__count--;
  625.   }
  626.  
  627.   if (TV__count == TV__instr.length)
  628.     return TV__instr;
  629.  
  630.   if (TV__count == 0)
  631.     return "";
  632.  
  633.   for (var i = 0; i < TV__count; i++)
  634.     TV__str = TV__str + TV__instr.charAt(i);
  635.  
  636.   return TV__str;
  637. }
  638.  
  639. function TV__hasTag(TV__str)
  640. {
  641.   var TV__reg = /(<\S.+>)/;
  642.   
  643.   if (TV__reg.test(TV__str))
  644.     return true;
  645. }
  646.  
  647. /** Copyright (c) 1999 ThirdVoice Inc. All rights reserved. **/
  648.