Initial OpenECOMP policy/engine commit
[policy/engine.git] / ecomp-sdk-app / src / main / webapp / static / fusion / raptor / js / form-field-tooltip.js
1 /************************************************************************************************************
2
3         Form field tooltip
4         (C) www.dhtmlgoodies.com, September 2006
5
6         This is a script from www.dhtmlgoodies.com. You will find this and a lot of other scripts at our website.       
7         
8         Terms of use:
9         Look at the terms of use at http://www.dhtmlgoodies.com/index.html?page=termsOfUse
10         
11         Thank you!
12         
13         www.dhtmlgoodies.com
14         Alf Magne Kalleland
15
16 ************************************************************************************************************/
17
18 var DHTMLgoodies_globalTooltipObj;
19
20
21 /** 
22 Constructor 
23 **/
24 function DHTMLgoodies_formTooltip()
25 {
26         var tooltipDiv;
27         var tooltipText;
28         var tooltipContentDiv;                          // Reference to inner div with tooltip content
29         var imagePath;                                          // Relative path to images
30         var arrowImageFile;                                     // Name of arrow image
31         var arrowImageFileRight;                        // Name of arrow image
32         var arrowRightWidth;
33         var arrowTopHeight;
34         var tooltipWidth;                                       // Width of tooltip
35         var roundedCornerObj;                           // Reference to object of class DHTMLgoodies_roundedCorners
36         var tooltipBgColor;
37         var closeMessage;                                       // Close message
38         var activeInput;                                        // Reference to currently active input
39         var tooltipPosition;                            // Tooltip position, possible values: "below" or "right"
40         var tooltipCornerSize;                          // Size of rounded corners
41         var displayArrow;                                       // Display arrow above or at the left of the tooltip?
42         var cookieName;                                         // Name of cookie
43         var disableTooltipPossibility;          // Possibility of disabling tooltip
44         var disableTooltipByCookie;                     // If tooltip has been disabled, save the settings in cookie, i.e. for other pages with the same cookie name.
45         var disableTooltipMessage;
46         var tooltipDisabled;
47         var isMSIE;
48         var tooltipIframeObj;
49         var pageBgColor;                                        // Color of background - used in ie when applying iframe which covers select boxes
50         var currentTooltipObj;                          // Reference to form field which tooltip is currently showing for
51         
52         this.currentTooltipObj = false,
53         this.tooltipDiv = false,
54         this.tooltipText = false;
55         this.imagePath = 'static/fusion/raptor/images/';
56         this.arrowImageFile = 'green-arrow.gif';
57         this.arrowImageFileRight = 'green-arrow-right.gif';
58         this.tooltipWidth = 200;
59         this.tooltipBgColor = '#317082';
60         this.closeMessage = 'Close';
61         this.disableTooltipMessage = 'Don\'t show this message again';
62         this.activeInput = false;
63         this.tooltipPosition = 'right';
64         this.arrowRightWidth = 16;                      // Default width of arrow when the tooltip is on the right side of the inputs.
65         this.arrowTopHeight = 13;                       // Default height of arrow at the top of tooltip
66         this.tooltipCornerSize = 10;
67         this.displayArrow = true;
68         this.cookieName = 'DHTMLgoodies_tooltipVisibility';
69         this.disableTooltipByCookie = false;
70         this.tooltipDisabled = false;
71         this.disableTooltipPossibility = true;
72         this.tooltipIframeObj = false;
73         this.pageBgColor = '#FFFFFF';
74         
75         DHTMLgoodies_globalTooltipObj = this;
76         
77         if(navigator.userAgent.indexOf('MSIE')>=0)this.isMSIE = true; else this.isMSIE = false;
78 }
79
80
81 DHTMLgoodies_formTooltip.prototype = {
82         // {{{ initFormFieldTooltip()
83     /**
84      *
85          *
86      *  Initializes the tooltip script. Most set methods needs to be executed before you call this method.
87      * 
88      * @public
89      */         
90         initFormFieldTooltip : function()
91         {
92                 var formElements = new Array();
93                 var inputs = document.getElementsByTagName('IMG');
94                 for(var no=0;no<inputs.length;no++){
95                         var attr = inputs[no].getAttribute('tooltipText');
96                         if(!attr)attr = inputs[no].tooltipText;
97                         if(attr)formElements[formElements.length] = inputs[no];
98                 }
99
100                 var inputs = document.getElementsByTagName('INPUT');
101                 for(var no=0;no<inputs.length;no++){
102                         var attr = inputs[no].getAttribute('tooltipText');
103                         if(!attr)attr = inputs[no].tooltipText;
104                         if(attr)formElements[formElements.length] = inputs[no];
105                 }
106                         
107                 var inputs = document.getElementsByTagName('TEXTAREA');
108                 for(var no=0;no<inputs.length;no++){
109                         var attr = inputs[no].getAttribute('tooltipText');
110                         if(!attr)attr = inputs[no].tooltipText;
111                         if(attr)formElements[formElements.length] = inputs[no];
112                 }
113                 var inputs = document.getElementsByTagName('SELECT');
114                 for(var no=0;no<inputs.length;no++){
115                         var attr = inputs[no].getAttribute('tooltipText');
116                         if(!attr)attr = inputs[no].tooltipText;
117                         if(attr)formElements[formElements.length] = inputs[no];
118                 }
119                         
120                 window.refToFormTooltip = this;
121                 
122                 for(var no=0;no<formElements.length;no++){
123                         formElements[no].onfocus = this.__displayTooltip;
124                 }
125                 this.addEvent(window,'resize',function(){ window.refToFormTooltip.__positionCurrentToolTipObj(); });
126                 
127                 this.addEvent(document.documentElement,'click',function(e){ window.refToFormTooltip.__autoHideTooltip(e); });
128         }
129         
130         // }}}
131         ,               
132         // {{{ setTooltipPosition()
133     /**
134      *
135          *
136      *  Specify position of tooltip(below or right)
137      *  @param String newPosition (Possible values: "below" or "right") 
138      * 
139      * @public
140      */ 
141         setTooltipPosition : function(newPosition)
142         {
143                 this.tooltipPosition = newPosition;
144         }
145         // }}}
146         ,               
147         // {{{ setCloseMessage()
148     /**
149      *
150          *
151      *  Specify "Close" message
152      *  @param String closeMessage
153      * 
154      * @public
155      */
156         setCloseMessage : function(closeMessage)
157         {
158                 this.closeMessage = closeMessage;
159         }
160         // }}}
161         ,       
162         // {{{ setDisableTooltipMessage()
163     /**
164      *
165          *
166      *  Specify disable tooltip message at the bottom of the tooltip
167      *  @param String disableTooltipMessage
168      * 
169      * @public
170      */
171         setDisableTooltipMessage : function(disableTooltipMessage)
172         {
173                 this.disableTooltipMessage = disableTooltipMessage;
174         }
175         // }}}
176         ,               
177         // {{{ setTooltipDisablePossibility()
178     /**
179      *
180          *
181      *  Specify whether you want the disable link to appear or not.
182      *  @param Boolean disableTooltipPossibility
183      * 
184      * @public
185      */
186         setTooltipDisablePossibility : function(disableTooltipPossibility)
187         {
188                 this.disableTooltipPossibility = disableTooltipPossibility;
189         }
190         // }}}
191         ,               
192         // {{{ setCookieName()
193     /**
194      *
195          *
196      *  Specify name of cookie. Useful if you're using this script on several pages. 
197      *  @param String newCookieName
198      * 
199      * @public
200      */
201         setCookieName : function(newCookieName)
202         {
203                 this.cookieName = newCookieName;
204         }
205         // }}}
206         ,               
207         // {{{ setTooltipWidth()
208     /**
209      *
210          *
211      *  Specify width of tooltip
212      *  @param Int newWidth
213      * 
214      * @public
215      */ 
216         setTooltipWidth : function(newWidth)
217         {
218                 this.tooltipWidth = newWidth;
219         }
220         
221         // }}}
222         ,               
223         // {{{ setArrowVisibility()
224     /**
225      *
226          *
227      *  Display arrow at the top or at the left of the tooltip?
228      *  @param Boolean displayArrow
229      * 
230      * @public
231      */ 
232         
233         setArrowVisibility : function(displayArrow)
234         {
235                 this.displayArrow = displayArrow;
236         }
237         
238         // }}}
239         ,               
240         // {{{ setTooltipBgColor()
241     /**
242      *
243          *
244      *  Send true to this method if you want to be able to save tooltip visibility in cookie. If it's set to true,
245      *  It means that when someone returns to the page, the tooltips won't show.
246      * 
247      *  @param Boolean disableTooltipByCookie
248      * 
249      * @public
250      */ 
251         setDisableTooltipByCookie : function(disableTooltipByCookie)
252         {
253                 this.disableTooltipByCookie = disableTooltipByCookie;
254         }       
255         // }}}
256         ,               
257         // {{{ setTooltipBgColor()
258     /**
259      *
260          *
261      *  This method specifies background color of tooltip
262      *  @param String newBgColor
263      * 
264      * @public
265      */ 
266         setTooltipBgColor : function(newBgColor)
267         {
268                 this.tooltipBgColor = newBgColor;
269         }
270         
271         // }}}
272         ,               
273         // {{{ setTooltipCornerSize()
274     /**
275      *
276          *
277      *  Size of rounded corners around tooltip
278      *  @param Int newSize (0 = no rounded corners)
279      * 
280      * @public
281      */ 
282         setTooltipCornerSize : function(tooltipCornerSize)
283         {
284                 this.tooltipCornerSize = tooltipCornerSize;
285         }
286         
287         // }}}
288         ,
289         // {{{ setTopArrowHeight()
290     /**
291      *
292          *
293      *  Size height of arrow at the top of tooltip
294      *  @param Int arrowTopHeight
295      * 
296      * @public
297      */ 
298         setTopArrowHeight : function(arrowTopHeight)
299         {
300                 this.arrowTopHeight = arrowTopHeight;
301         }
302         
303         // }}}
304         ,       
305         // {{{ setRightArrowWidth()
306     /**
307      *
308          *
309      *  Size width of arrow when the tooltip is on the right side of inputs
310      *  @param Int arrowTopHeight
311      * 
312      * @public
313      */ 
314         setRightArrowWidth : function(arrowRightWidth)
315         {
316                 this.arrowRightWidth = arrowRightWidth;
317         }
318         
319         // }}}
320         ,       
321         // {{{ setPageBgColor()
322     /**
323      *
324          *
325      *  Specify background color of page.
326      *  @param String pageBgColor
327      * 
328      * @public
329      */ 
330         setPageBgColor : function(pageBgColor)
331         {
332                 this.pageBgColor = pageBgColor;
333         }
334         
335         // }}}
336         ,               
337         // {{{ __hideTooltip()
338     /**
339      *
340          *
341      *  This method displays the tooltip
342      *
343      * 
344      * @private
345      */         
346         __displayTooltip : function()
347         {
348                 if(DHTMLgoodies_globalTooltipObj.disableTooltipByCookie){
349                         var cookieValue = DHTMLgoodies_globalTooltipObj.getCookie(DHTMLgoodies_globalTooltipObj.cookieName) + '';       
350                         if(cookieValue=='1')DHTMLgoodies_globalTooltipObj.tooltipDisabled = true;
351                 }       
352                 
353                 if(DHTMLgoodies_globalTooltipObj.tooltipDisabled)return;        // Tooltip disabled
354                 var tooltipText = this.getAttribute('tooltipText');
355                 DHTMLgoodies_globalTooltipObj.activeInput = this;
356                 
357                 if(!tooltipText)tooltipText = this.tooltipText;
358                 DHTMLgoodies_globalTooltipObj.tooltipText = tooltipText;
359
360                 
361                 if(!DHTMLgoodies_globalTooltipObj.tooltipDiv)DHTMLgoodies_globalTooltipObj.__createTooltip();
362                 
363                 DHTMLgoodies_globalTooltipObj.__positionTooltip(this);
364                 
365                 
366                 
367         
368                 DHTMLgoodies_globalTooltipObj.tooltipContentDiv.innerHTML = tooltipText;
369                 DHTMLgoodies_globalTooltipObj.tooltipDiv.style.display='block';
370                 
371                 if(DHTMLgoodies_globalTooltipObj.isMSIE){
372                         if(DHTMLgoodies_globalTooltipObj.tooltipPosition == 'below'){
373                                 DHTMLgoodies_globalTooltipObj.tooltipIframeObj.style.height = (DHTMLgoodies_globalTooltipObj.tooltipDiv.clientHeight - DHTMLgoodies_globalTooltipObj.arrowTopHeight);
374                         }else{
375                                 DHTMLgoodies_globalTooltipObj.tooltipIframeObj.style.height = (DHTMLgoodies_globalTooltipObj.tooltipDiv.clientHeight);
376                         }
377                 }
378                 
379         }
380         // }}}
381         ,               
382         // {{{ __hideTooltip()
383     /**
384      *
385          *
386      *  This function hides the tooltip
387      *
388      * 
389      * @private
390      */         
391         __hideTooltip : function()
392         {
393                 try{
394                         DHTMLgoodies_globalTooltipObj.tooltipDiv.style.display='none';
395                 }catch(e){
396                 }
397                 
398         }
399         // }}}
400         ,
401         // {{{ getSrcElement()
402     /**
403      *
404          *
405      *  Return the source of an event.
406      *
407      * 
408      * @private
409      */         
410     getSrcElement : function(e)
411     {
412         var el;
413                 if (e.target) el = e.target;
414                         else if (e.srcElement) el = e.srcElement;
415                         if (el.nodeType == 3) // defeat Safari bug
416                                 el = el.parentNode;
417                 return el;      
418     }   
419         // }}}
420         ,
421         __autoHideTooltip : function(e)
422         {
423                 if(document.all)e = event;      
424                 var src = this.getSrcElement(e);
425                 if(src.tagName.toLowerCase()!='input' && src.tagName.toLowerCase().toLowerCase()!='textarea' && src.tagName.toLowerCase().toLowerCase()!='select')this.__hideTooltip();
426
427                 var attr = src.getAttribute('tooltipText');
428                 if(!attr)attr = src.tooltipText;
429                 if(!attr){
430                         this.__hideTooltip();
431                 }       
432                 
433         }
434         // }}}
435         ,               
436         // {{{ __hideTooltipFromLink()
437     /**
438      *
439          *
440      *  This function hides the tooltip
441      *
442      * 
443      * @private
444      */ 
445         __hideTooltipFromLink : function()
446         {
447                 
448                 this.activeInput.focus();
449                 window.refToThis = this;
450                 setTimeout('window.refToThis.__hideTooltip()',10);
451         }
452         // }}}
453         ,               
454         // {{{ disableTooltip()
455     /**
456      *
457          *
458      *  Hide tooltip and disable it
459      *
460      * 
461      * @public
462      */ 
463         disableTooltip : function()
464         {
465                 this.__hideTooltipFromLink();
466                 if(this.disableTooltipByCookie)this.setCookie(this.cookieName,'1',500); 
467                 this.tooltipDisabled = true;    
468         }       
469         // }}}
470         ,               
471         // {{{ __positionTooltip()
472     /**
473      *
474          *
475      *  This function creates the tooltip elements
476      *
477      * 
478      * @private
479      */ 
480         __createTooltip : function()
481         {
482                 this.tooltipDiv = document.createElement('DIV');
483                 this.tooltipDiv.style.position = 'absolute';
484                 
485                 if(this.displayArrow){
486                         var topDiv = document.createElement('DIV');
487                         
488                         if(this.tooltipPosition=='below'){
489                                 
490                                 topDiv.style.marginLeft = '20px';
491                                 var arrowDiv = document.createElement('IMG');
492                                 arrowDiv.src = this.imagePath + this.arrowImageFile + '?rand='+ Math.random();
493                                 arrowDiv.style.display='block';
494                                 topDiv.appendChild(arrowDiv);
495                                         
496                         }else{
497                                 topDiv.style.marginTop = '5px';
498                                 var arrowDiv = document.createElement('IMG');
499                                 arrowDiv.src = this.imagePath + this.arrowImageFileRight + '?rand='+ Math.random();     
500                                 arrowDiv.style.display='block';
501                                 topDiv.appendChild(arrowDiv);                                   
502                                 topDiv.style.position = 'absolute';                     
503                         }
504                         
505                         this.tooltipDiv.appendChild(topDiv);    
506                 }
507                 
508                 var outerDiv = document.createElement('DIV');
509                 outerDiv.style.position = 'relative';
510                 outerDiv.style.zIndex = 1000;
511                 if(this.tooltipPosition!='below' && this.displayArrow){                 
512                         outerDiv.style.left = this.arrowRightWidth + 'px';
513                 }
514                                 
515                 outerDiv.id = 'DHTMLgoodies_formTooltipDiv';
516                 outerDiv.className = 'DHTMLgoodies_formTooltipDiv';
517                 outerDiv.style.backgroundColor = this.tooltipBgColor;
518                 this.tooltipDiv.appendChild(outerDiv);
519
520                 if(this.isMSIE){
521                         this.tooltipIframeObj = document.createElement('<IFRAME name="tooltipIframeObj" width="' + this.tooltipWidth + '" frameborder="no" src="about:blank"></IFRAME>');
522                         this.tooltipIframeObj.style.position = 'absolute';
523                         this.tooltipIframeObj.style.top = '0px';
524                         this.tooltipIframeObj.style.left = '0px';
525                         this.tooltipIframeObj.style.width = (this.tooltipWidth) + 'px';
526                         this.tooltipIframeObj.style.zIndex = 100;
527                         this.tooltipIframeObj.background = this.pageBgColor;
528                         this.tooltipIframeObj.style.backgroundColor= this.pageBgColor;
529                         this.tooltipDiv.appendChild(this.tooltipIframeObj);     
530                         if(this.tooltipPosition!='below' && this.displayArrow){
531                                 this.tooltipIframeObj.style.left = (this.arrowRightWidth) +  'px';      
532                         }else{
533                                 this.tooltipIframeObj.style.top = this.arrowTopHeight + 'px';   
534                         }
535
536                         setTimeout("self.frames['tooltipIframeObj'].document.documentElement.style.backgroundColor='" + this.pageBgColor + "'",500);
537
538                 }
539                 
540                 this.tooltipContentDiv = document.createElement('DIV'); 
541                 this.tooltipContentDiv.style.position = 'relative';     
542                 this.tooltipContentDiv.id = 'DHTMLgoodies_formTooltipContent';
543                 outerDiv.appendChild(this.tooltipContentDiv);                   
544                 
545                 var closeDiv = document.createElement('DIV');
546                 closeDiv.style.textAlign = 'center';
547         
548                 closeDiv.innerHTML = '<A class="DHTMLgoodies_formTooltip_closeMessage" href="#" onclick="DHTMLgoodies_globalTooltipObj.__hideTooltipFromLink();return false">' + this.closeMessage + '</A>';
549                 
550                 if(this.disableTooltipPossibility){
551                         var tmpHTML = closeDiv.innerHTML;
552                         tmpHTML = tmpHTML + ' | <A class="DHTMLgoodies_formTooltip_closeMessage" href="#" onclick="DHTMLgoodies_globalTooltipObj.disableTooltip();return false">' + this.disableTooltipMessage + '</A>';
553                         closeDiv.innerHTML = tmpHTML;
554                 } 
555                 
556                 outerDiv.appendChild(closeDiv);
557                 
558                 document.body.appendChild(this.tooltipDiv);
559                 
560                 
561                                 
562                 if(this.tooltipCornerSize>0){
563                         this.roundedCornerObj = new DHTMLgoodies_roundedCorners();
564                         // (divId,xRadius,yRadius,color,backgroundColor,padding,heightOfContent,whichCorners)
565                         this.roundedCornerObj.addTarget('DHTMLgoodies_formTooltipDiv',this.tooltipCornerSize,this.tooltipCornerSize,this.tooltipBgColor,this.pageBgColor,5);
566                         this.roundedCornerObj.init();
567                 }
568                 
569
570                 this.tooltipContentDiv = document.getElementById('DHTMLgoodies_formTooltipContent');
571         }
572         // }}}
573         ,
574         addEvent : function(whichObject,eventType,functionName)
575         { 
576           if(whichObject.attachEvent){ 
577             whichObject['e'+eventType+functionName] = functionName; 
578             whichObject[eventType+functionName] = function(){whichObject['e'+eventType+functionName]( window.event );} 
579             whichObject.attachEvent( 'on'+eventType, whichObject[eventType+functionName] ); 
580           } else 
581             whichObject.addEventListener(eventType,functionName,false);             
582         }       
583         // }}}
584         ,
585         __positionCurrentToolTipObj : function()
586         {
587                 if(DHTMLgoodies_globalTooltipObj.activeInput)this.__positionTooltip(DHTMLgoodies_globalTooltipObj.activeInput);
588                 
589         }
590         // }}}
591         ,               
592         // {{{ __positionTooltip()
593     /**
594      *
595          *
596      *  This function positions the tooltip
597      *
598      * @param Obj inputObj = Reference to text input
599      * 
600      * @private
601      */ 
602         __positionTooltip : function(inputObj)
603         {       
604                 var offset = 0;
605                 if(!this.displayArrow)offset = 3;       
606                 if(this.tooltipPosition=='below'){
607                         this.tooltipDiv.style.left = this.getLeftPos(inputObj)+  'px';
608                         this.tooltipDiv.style.top = (this.getTopPos(inputObj) + inputObj.offsetHeight + offset) + 'px';
609                 }else{
610                 
611                         this.tooltipDiv.style.left = (this.getLeftPos(inputObj) + inputObj.offsetWidth + offset)+  'px';
612                         this.tooltipDiv.style.top = this.getTopPos(inputObj) + 'px';                    
613                 }
614                 this.tooltipDiv.style.width=this.tooltipWidth + 'px';
615                 
616         }
617         ,
618         // {{{ getTopPos()
619     /**
620      * This method will return the top coordinate(pixel) of an object
621      *
622      * @param Object inputObj = Reference to HTML element
623      * @public
624      */ 
625         getTopPos : function(inputObj)
626         {               
627           var returnValue = inputObj.offsetTop;
628           while((inputObj = inputObj.offsetParent) != null){
629                 if(inputObj.tagName!='HTML'){
630                         returnValue += inputObj.offsetTop;
631                         if(document.all)returnValue+=inputObj.clientTop;
632                 }
633           } 
634           return returnValue;
635         }
636         // }}}
637         
638         ,
639         // {{{ getLeftPos()
640     /**
641      * This method will return the left coordinate(pixel) of an object
642      *
643      * @param Object inputObj = Reference to HTML element
644      * @public
645      */ 
646         getLeftPos : function(inputObj)
647         {         
648           var returnValue = inputObj.offsetLeft;
649           while((inputObj = inputObj.offsetParent) != null){
650                 if(inputObj.tagName!='HTML'){
651                         returnValue += inputObj.offsetLeft;
652                         if(document.all)returnValue+=inputObj.clientLeft;
653                 }
654           }
655           return returnValue;
656         }
657         
658         ,
659         
660         // {{{ getCookie()
661     /**
662      *
663      *  These cookie functions are downloaded from 
664          *      http://www.mach5.com/support/analyzer/manual/html/General/CookiesJavaScript.htm
665          *
666      *  This function returns the value of a cookie
667      *
668      * @param String name = Name of cookie
669      * @param Object inputObj = Reference to HTML element
670      * @public
671      */ 
672         getCookie : function(name) { 
673            var start = document.cookie.indexOf(name+"="); 
674            var len = start+name.length+1; 
675            if ((!start) && (name != document.cookie.substring(0,name.length))) return null; 
676            if (start == -1) return null; 
677            var end = document.cookie.indexOf(";",len); 
678            if (end == -1) end = document.cookie.length; 
679            return unescape(document.cookie.substring(len,end)); 
680         }       
681         // }}}
682         ,       
683         
684         // {{{ setCookie()
685     /**
686      *
687      *  These cookie functions are downloaded from 
688          *      http://www.mach5.com/support/analyzer/manual/html/General/CookiesJavaScript.htm
689          *
690      *  This function creates a cookie. (This method has been slighhtly modified)
691      *
692      * @param String name = Name of cookie
693      * @param String value = Value of cookie
694      * @param Int expires = Timestamp - days
695      * @param String path = Path for cookie (Usually left empty)
696      * @param String domain = Cookie domain
697      * @param Boolean secure = Secure cookie(SSL)
698      * 
699      * @public
700      */ 
701         setCookie : function(name,value,expires,path,domain,secure) { 
702                 expires = expires * 60*60*24*1000;
703                 var today = new Date();
704                 var expires_date = new Date( today.getTime() + (expires) );
705             var cookieString = name + "=" +escape(value) + 
706                ( (expires) ? ";expires=" + expires_date.toGMTString() : "") + 
707                ( (path) ? ";path=" + path : "") + 
708                ( (domain) ? ";domain=" + domain : "") + 
709                ( (secure) ? ";secure" : ""); 
710             document.cookie = cookieString; 
711         }
712         // }}}
713                 
714                 
715 }