<public:component>
  <public:property name="controls" id="oControls" value="false" />
  <public:property name="expanded" id="oExpanded" value="true" />
  <public:property name="wrap" id="oWrap" value="true" />
  <public:property name="gutter" id="oGutter" value="true" />
  <public:property name="linenumbers" id="oLineNumbers" value="true" />
  <public:property name="isWrap" id="oIsWrap" put="setWrap" get="getWrap" value="true" />
  <public:property name="hasGutter" id="oHasGutter" put="setGutter" get="getGutter" value="true" />
  <public:property name="hasLinenumbers" id="oHasLineNumbers" put="setLineNumbers" get="getLineNumbers" value="true" />
  <public:property name="isExpanded" id="oIsExpanded" put="setExpanded" get="getExpanded" value="true" />
  <public:property name="startnumber" id="oStartnumber" put="setStartnumber" get="getStartnumber" value="1" />
  <script language="JavaScript" type="text/javascript">
  <!--
    var sWrap = (element.getAttribute('wrap') != 'undefined' && element.getAttribute('wrap') != null) ? eval(element.getAttribute('wrap')) : true;
    var sGutter = (element.getAttribute('gutter') != 'undefined' && element.getAttribute('gutter') != null) ? eval(element.getAttribute('gutter')) : true;
    var sLineNumbers = (element.getAttribute('linenumbers') != 'undefined' && element.getAttribute('linenumbers') != null) ? eval(element.getAttribute('linenumbers')) : true;
    var sExpanded = (element.getAttribute('expanded') != 'undefined' && element.getAttribute('expanded') != null) ? eval(element.getAttribute('expanded')) : true;
    var nStartnumber = (element.getAttribute('startnumber') != 'undefined' && element.getAttribute('startnumber') != null) ? parseInt(element.getAttribute('startnumber'), 10) : 1;
    var sControls = (element.getAttribute('controls') != 'undefined' && element.getAttribute('controls') != null) ? eval(element.getAttribute('controls')) : true;
    
/*
    propStr = '';
    i = 0;
    for(key in element)
    {
      i++;
      if(i > 120)
        propStr += key + ': ' + element[key] + '\n';
    }
    alert(propStr);

    alert(element.id + '\n' +
    'element.getAttribute(\'wrap\'): ' + element.getAttribute('wrap') + '\nsWrap: ' + sWrap + '\n' + 
    'element.getAttribute(\'gutter\'): ' + element.getAttribute('gutter') + '\nsGutter: ' + sGutter + '\n' + 
    'element.getAttribute(\'linenumbers\'): ' + element.getAttribute('linenumbers') + '\nsLineNumbers: ' + sLineNumbers + '\n' + 
    'element.getAttribute(\'expanded\'): ' + element.getAttribute('expanded') + '\nsExpanded: ' + sExpanded + '\n' + 
    'element.getAttribute(\'startnumber\'): ' + element.getAttribute('startnumber') + '\nnStartnumber: ' + nStartnumber + '\n' + 
    'element.getAttribute(\'controls\'): ' + element.getAttribute('controls') + '\nsControls: ' + sControls
    );
*/
    
    if(element.tagName.toUpperCase() == 'PRE' && (!element.className || element.className.toLowerCase() != 'bookmarklet'))
    {
      var chars = new Object();
          chars.bad = ['&', '"', '<', '>']; // ,€,ƒ,„,…,†,‡,ˆ,‰,Š,‹,Œ,Ž,‘,’,“,”,•,–,—,™,š,›,œ,ž,Ÿ,¡,¢,£,¤,¥,¦,§,¨,©,ª,«,¬,­,®,¯,°,±,²,³,´,µ,¶,·,¸,¹,º,»,¼,½,¾,¿,À,Á,Â,Ã,Ä,Å,Æ,Ç,È,É,Ê,Ë,Ì,Í,Î,Ï,Ð,Ñ,Ò,Ó,Ô,Õ,Ö,×,Ø,Ù,Ú,Û,Ü,Ý,Þ,ß,à,á,â,ã,ä,å,æ,ç,è,é,ê,ë,ì,í,î,ï,ð,ñ,ò,ó,ô,õ,ö,÷,ø,ù,ú,û,ü,ý,þ,ÿ';
          chars.good = ['&amp;', '&quot;', '&lt;', '&gt;']; // ,&euro;,&##0131;,&##0132;,&##0133;,&##0134;,&##0135;,&circ;,&##0137;,&##0138;,&##0139;,&OElig;,&##0142;,&lsquo;,&rsquo;,&ldquo;,&rdquo;,&##0149;,&ndash;,&mdash;,&trade;,&##0154;,&##0155;,&oelig;,&##0158;,&Yuml;,&iexcl;,&cent;,&pound;,&curren;,&yen;,&##0166;,&sect;,&uml;,&copy;,&ordf;,&laquo;,&##0172;,&##0173;,&reg;,&macr;,&ordm;,&plusmn;,&sup2;,&sup3;,&acute;,&micro;,&para;,&middot;,&cedil;,&sup1;,&deg;,&raquo;,&frac14;,&frac12;,&frac34;,&iquest;,&Agrave;,&Aacute;,&Acirc;,&Atilde;,&Auml;,&Aring;,&AElig;,&Ccedil;,&Egrave;,&Eacute;,&Ecirc;,&Euml;,&Igrave;,&Iacute;,&Icirc;,&Iuml;,&ETH;,&Ntilde;,&Ograve;,&Oacute;,&Ocirc;,&Otilde;,&Ouml;,&times;,&Oslash;,&Ugrave;,&Uacute;,&Ucirc;,&Uuml;,&Yacute;,&THORN;,&szlig;,&agrave;,&aacute;,&acirc;,&atilde;,&auml;,&aring;,&aelig;,&ccedil;,&egrave;,&eacute;,&ecirc;,&euml;,&igrave;,&iacute;,&icirc;,&iuml;,&eth;,&ntilde;,&ograve;,&oacute;,&ocirc;,&otilde;,&ouml;,&divide;,&oslash;,&ugrave;,&uacute;,&ucirc;,&uuml;,&yacute;,&thorn;,&yuml;';
    
      window.setTimeout(initPre, 500);
    }
    
    function setWrap(bWrap)
    {
      try
      {
        var oPre = element.document.getElementById(element.id);
        var oPreOL = null;
        if(oPre)
        {
          oPreLI = oPre.getElementsByTagName('LI');
          for(var k = 0; k < oPreLI.length; k++)
            oPreLI[k].runtimeStyle.whiteSpace = (bWrap) ? 'normal' : 'nowrap';
          sWrap = bWrap;
          oWrap.fireChange();
        }
      }
      catch(e) { }
    }
    
    function getWrap()
    {
      return sWrap;
    }
    
    function setGutter(bGutter)
    {
      try
      {
        var oPre = element.document.getElementById(element.id);
        var oPreOL = null;
        if(oPre)
        {
          oPreOL = oPre.getElementsByTagName('OL');
          oPreOL[0].runtimeStyle.marginLeft = (bGutter) ? '45px' : '1px';
          sGutter = bGutter;
          sGutter.fireChange();
        }
      }
      catch(e) { }
    }
    
    function getGutter()
    {
      return sGutter;
    }
    
    function setExpanded(bExpanded)
    {
      try
      {
        var oPre = element.document.getElementById(element.id);
        var oPreOL = null;
        if(oPre)
        {
          oPreOL = oPre.getElementsByTagName('OL');
          oPreOL[0].runtimeStyle.display = (bExpanded) ? 'block' : 'none';
          sExpanded = bExpanded;
          sExpanded.fireChange();
        }
      }
      catch(e) { }
    }
    
    function getExpanded()
    {
      return sExpanded;
    }

    function setLineNumbers(bLineNumbers)
    {
      try
      {
        var oPre = element.document.getElementById(element.id);
        var oPreOL = null;
        if(oPre)
        {
          oPreOL = oPre.getElementsByTagName('OL');
          oPreOL[0].runtimeStyle.listStyleType = (bLineNumbers) ? 'decimal' : 'none';
          sLineNumbers = bLineNumbers;
          oLineNumbers.fireChange();
        }
      }
      catch(e) { }
    }
    
    function getLineNumbers()
    {
      return sLineNumbers;
    }
    
    function setStartnumber(sStartnumber)
    {
      try
      {
        var oPre = element.document.getElementById(element.id);
        var oPreOL = null;
        if(oPre)
        {
          oPreOL = oPre.getElementsByTagName('OL');
          oPreOL[0].setAttribute('start', sStartnumber);
          nStartnumber = sStartnumber;
          oStart.fireChange();
        }
      }
      catch(e) { }
    }
    
    function getStartnumber()
    {
      return nStartnumber;
    }
    
    function initPre()
    {
      var currentPreDiv = element.document.createElement('DIV');
          currentPreDiv.className = 'pseudoPreDiv';
          currentPreDiv.id = (element.id != '') ? element.id : element.uniqueID;
          currentPreDiv.wrap = sWrap;
          currentPreDiv.lineNumbers = sLineNumbers;
          currentPreDiv.startnumber = nStartnumber;
          currentPreDiv.expanded = sExpanded;
          currentPreDiv.addBehavior('pre.htc');
      if(element.title != 'undefined' && element.title != null && element.title != '')
      {
        var currentPreHeader = element.document.createElement('DIV');
            currentPreHeader.innerText = element.title;
            currentPreHeader.id = currentPreDiv.id + 'Header';
            currentPreHeader.className = 'pseudoPreHeader';
            currentPreDiv.appendChild(currentPreHeader);
      }
      var currentPreInnerDiv = element.document.createElement('DIV');
          currentPreInnerDiv.className = 'pseudoPreInnerDiv';
          currentPreDiv.appendChild(currentPreInnerDiv);
      if(sControls)
      {
        /*  Wrap Checkbox */
        var currentPreCheckboxWrap = element.document.createElement('INPUT');
            currentPreCheckboxWrap.type = 'checkbox';
            currentPreCheckboxWrap.id = currentPreDiv.id + 'Wrap';
            currentPreCheckboxWrap.htmlFor = currentPreDiv.id;
            currentPreCheckboxWrap.onclick = function()
            {
              self[this.htmlFor].wrap = this.checked;
            }
            currentPreCheckboxWrapLabel = element.document.createElement('LABEL');
            currentPreCheckboxWrapLabel.htmlFor = currentPreDiv.id + 'Wrap';
            currentPreCheckboxWrapLabel.innerText = 'Wrap long lines';
            currentPreInnerDiv.appendChild(currentPreCheckboxWrap);
            currentPreInnerDiv.appendChild(currentPreCheckboxWrapLabel);
        /*  /Wrap Checkbox */
        /*  Gutter Checkbox */
        var currentPreCheckboxGutter = element.document.createElement('INPUT');
            currentPreCheckboxGutter.type = 'checkbox';
            currentPreCheckboxGutter.id = currentPreDiv.id + 'Gutter';
            currentPreCheckboxGutter.htmlFor = currentPreDiv.id;
            currentPreCheckboxGutter.onclick = function()
            {
              self[this.htmlFor].gutter = this.checked;
            }
            currentPreCheckboxGutterLabel = element.document.createElement('LABEL');
            currentPreCheckboxGutterLabel.htmlFor = currentPreDiv.id + 'Gutter';
            currentPreCheckboxGutterLabel.innerText = 'Show gutter';
            currentPreInnerDiv.appendChild(currentPreCheckboxGutter);
            currentPreInnerDiv.appendChild(currentPreCheckboxGutterLabel);
        /*  /Gutter Checkbox */
        /*  Line Number Checkbox */
        var currentPreCheckboxLineNumbers = element.document.createElement('INPUT');
            currentPreCheckboxLineNumbers.type = 'checkbox';
            currentPreCheckboxLineNumbers.id = currentPreDiv.id + 'LineNumbers';
            currentPreCheckboxLineNumbers.htmlFor = currentPreDiv.id;
            currentPreCheckboxLineNumbers.onclick = function()
            {
              self[this.htmlFor].linenumbers = this.checked;
            }
            currentPreCheckboxLineNumbersLabel = element.document.createElement('LABEL');
            currentPreCheckboxLineNumbersLabel.htmlFor = currentPreDiv.id + 'LineNumbers';
            currentPreCheckboxLineNumbersLabel.innerText = 'Show line numbers.';
            currentPreInnerDiv.appendChild(currentPreCheckboxLineNumbers);
            currentPreInnerDiv.appendChild(currentPreCheckboxLineNumbersLabel);
        /*  /Line Number Checkbox */
        /*  Expanded Checkbox */
        var currentPreCheckboxExpanded = element.document.createElement('INPUT');
            currentPreCheckboxExpanded.type = 'checkbox';
            currentPreCheckboxExpanded.id = currentPreDiv.id + 'Expanded';
            currentPreCheckboxExpanded.htmlFor = currentPreDiv.id;
            currentPreCheckboxExpanded.onclick = function()
            {
              self[this.htmlFor].expanded = this.checked;
            }
            currentPreCheckboxExpandedLabel = element.document.createElement('LABEL');
            currentPreCheckboxExpandedLabel.htmlFor = currentPreDiv.id + 'Expanded';
            currentPreCheckboxExpandedLabel.innerText = 'Expanded';
            currentPreInnerDiv.appendChild(currentPreCheckboxExpanded);
            currentPreInnerDiv.appendChild(currentPreCheckboxExpandedLabel);
        /*  /Expanded Checkbox */
      }
      /*  Ordered List Creation and Population */
      var currentPreOL = element.document.createElement('OL');
          currentPreOL.style.listStyleType = (sLineNumbers) ? 'decimal' : 'none';
          currentPreOL.style.marginLeft = (sGutter) ? '45px' : '1px';
          currentPreOL.start = nStartnumber;
          currentPreInnerDiv.appendChild(currentPreOL);
      var currentPreLines = element.innerHTML.split('\n');
      for(var j = 0; j < currentPreLines.length; j++)
      {
        var currentPreRow = element.document.createElement('LI');
            currentPreRow.style.whiteSpace = (sWrap) ? 'normal' : 'nowrap';
            currentPreRow.innerHTML = currentPreLines[j].replace(/\r/g, '').replace(/  |\t/g, '&nbsp;&nbsp;');
        var currentPreRowContents = currentPreOL.appendChild(currentPreRow);
      }
      /*  /Ordered List Creation and Population */
      var currentPreReplaced = element.replaceNode(currentPreDiv);
      if(currentPreCheckboxWrap)
        currentPreCheckboxWrap.checked = (sWrap) ? true : false;
      if(currentPreCheckboxGutter)
        currentPreCheckboxGutter.checked = (sGutter) ? true : false;
      if(currentPreCheckboxLineNumbers)
        currentPreCheckboxLineNumbers.checked = (sLineNumbers) ? true : false;
      if(currentPreCheckboxExpanded)
        currentPreCheckboxExpanded.checked = (sExpanded) ? true : false;
    }
  //-->
  </script>
</public:component>
