[ Index ]

PHP Cross Reference of Web Application Component Toolkit

title

Body

[close]

/framework/template/tags/form/ -> inputautocomplete.tag.php (source)

   1  <?php
   2  //--------------------------------------------------------------------------------
   3  // Copyright 2004 Procata, Inc.
   4  // Released under the LGPL license (http://www.gnu.org/copyleft/lesser.html)
   5  //--------------------------------------------------------------------------------
   6  /**
   7   * @package WACT_TAG
   8   * @version $Id: inputautocomplete.tag.php,v 1.13 2004/11/18 04:22:48 jeffmoore Exp $
   9   */
  10  //--------------------------------------------------------------------------------
  11  /**
  12   * Includes
  13   */
  14  require_once WACT_ROOT . 'template/tags/form/input.tag.php';
  15  
  16  /**
  17  * Register the tags
  18  */
  19  $taginfo =& new TagInfo('form:INPUTAUTOCOMPLETE', 'InputAutocompleteTag');
  20  $taginfo->setEndTag(ENDTAG_FORBIDDEN);
  21  $taginfo->setCompilerAttributes(array('errorclass', 'errorstyle', 'displayname'));
  22  $taginfo->setKnownParent('FormTag');
  23  TagDictionary::registerTag($taginfo, __FILE__);
  24  
  25  /**
  26  * EXPERIMATAL!
  27  * Allows text input tags with support for autocompletion (using JavaScript)
  28  * @see http://wact.sourceforge.net/index.php/InputAutoCompleteTag
  29  * @todo i18n for message displayed to browsers that dont support this JavaScript
  30  * @todo Check it works with stuff like wrap tags
  31  * @access protected
  32  * @package WACT_TAG
  33  */
  34  class InputAutoCompleteTag extends ControlTag {
  35      /**
  36       * File to include at runtime
  37       * @var string path to runtime component relative to WACT_ROOT
  38       * @access private
  39       */
  40      var $runtimeIncludeFile = 'template/components/form/inputautocomplete.inc.php';
  41  
  42      /**
  43       * Name of runtime component class
  44       * @var string
  45       * @access private
  46       */
  47      var $runtimeComponentName = 'InputAutoCompleteComponent';
  48  
  49      /**
  50      * Stores the name of a JavaScript variable reference
  51      * @var string
  52      * @access private
  53      */
  54      var $javascriptvarref;
  55  
  56  	function preParse() {
  57      static $added=false;
  58      if (!$added) {
  59          $javascript = <<<EOD
  60  function wactjavascript_autoComplete (dataArray, input, evt) {
  61    if (input.value.length == 0) {
  62      return;
  63    }
  64    //allow backspace to work in IE
  65    if (typeof input.selectionStart == 'undefined' && evt.keyCode == 8) { input.value = input.value.substr(0,input.value.length-1); }
  66    var match = false;
  67    for (var i = 0; i < dataArray.length; i++) {
  68      if ((match = dataArray[i].toLowerCase().indexOf(input.value.toLowerCase()) == 0)) {
  69        break;
  70      }
  71    }
  72    if (match) {
  73      var typedText = input.value;
  74      if (typeof input.selectionStart != 'undefined') {
  75        switch (evt.keyCode) {
  76         case 37: //left arrow
  77         case 39: //right arrow
  78         case 33: //page up  
  79         case 34: //page down  
  80         case 36: //home  
  81         case 35: //end
  82         case 13: //enter
  83         case 9: //tab
  84         case 27: //esc
  85         case 16: //shift  
  86         case 17: //ctrl  
  87         case 18: //alt  
  88         case 20: //caps lock
  89         case 8: //backspace  
  90         case 46: //delete 
  91          return;
  92         case 38: //up arrow 
  93             if (i > 0) { input.value = dataArray[i-1]; }
  94             return; 
  95         case 40: //down arrow
  96             if (i < dataArray.length - 1) { input.value = dataArray[i+1]; }
  97             return; 
  98         break;
  99        }
 100        input.value = dataArray[i];
 101        input.setSelectionRange(typedText.length, input.value.length);
 102      }
 103      else if (input.createTextRange) {
 104        if (evt.keyCode == 16) {
 105          return;
 106        }
 107        if (evt.keyCode == 38) {
 108            if (i > 0) { input.value = dataArray[i-1]; return; }
 109        }
 110        if (evt.keyCode == 40) {
 111            if (i < dataArray.length - 1) { input.value = dataArray[i+1]; return; }
 112        }
 113        input.value = dataArray[i];
 114        var range = input.createTextRange();
 115        range.moveStart('character', typedText.length);
 116        range.moveEnd('character', input.value.length);
 117        range.select();
 118      }
 119      else {
 120        if (confirm("Are you looking for '" + dataArray[i] + "'?")) {
 121          input.value = dataArray[i];
 122        }
 123      }
 124    }
 125  }
 126  EOD;
 127          $ComponentTree = & $this->findParentByClass('ComponentTree') ;
 128          if ( !$ComponentTree ) {
 129              RaiseError(
 130                  'compiler',
 131                  'COMPONENTNOTFOUND',
 132                  array(
 133                      'ServerId' => 'ComponentTree',
 134                      'file' => $this->SourceFile
 135                  )
 136              );
 137          }
 138          $JContainer = & $ComponentTree->findChildByClass('CoreScriptTag');
 139          if ( !$JContainer ) {
 140              RaiseError(
 141                  'compiler',
 142                  'COMPONENTNOTFOUND',
 143                  array(
 144                      'ServerId' => 'CoreScriptTag',
 145                      'file' => $this->SourceFile
 146                  )
 147              );
 148          }
 149          $JContainer->writeJavaScript($javascript);
 150          $added=true;
 151          } 
 152          return PARSER_REQUIRE_PARSING;
 153      }
 154  
 155      /**
 156      * @return void
 157      * @access protected
 158      */
 159  	function preGenerate() {
 160          $this->tag = 'input';
 161          $this->javascriptvarref = 'wactjavascript_'.$this->getServerId().'_choices';
 162      }
 163  
 164      /**
 165      * @param CodeWriter
 166      * @return void
 167      * @access protected
 168      */
 169  	function generateConstructor(&$code) {
 170      
 171          $attrValue = 'wactjavascript_autoComplete('.$this->javascriptvarref.',this,event)';
 172          $this->setAttribute('type','text');
 173          $this->setAttribute('onkeyup',$attrValue);
 174          $this->setAttribute('autocompletion','off');
 175          parent::generateConstructor($code);
 176      }
 177  
 178      /**
 179       * @param CodeWriter
 180       * @return void
 181        * @access protected
 182       */
 183  	function generateContents(&$code)
 184      {
 185          $code->writeHTML('<script type="text/javascript">');
 186  
 187          if ( $escapestyle = $this->getAttribute('escapestyle') ) {
 188              $escapestyles = array('comment','cdata','both');
 189              $escapestyle = strtolower($escapestyle);
 190              if ( !in_array($escapestyle,$escapestyles) ) {
 191                  $escapestyle = 'comment';
 192              }
 193          } else {
 194              $escapestyle = 'comment';
 195          }
 196          switch ( $escapestyle ) {
 197              case 'both':
 198                  $code->writeHTML("<!--//<![CDATA[\n");
 199              break;
 200              case 'cdata':
 201                  $code->writeHTML("<![CDATA[\n");
 202              break;
 203              default:
 204                  $code->writeHTML("<!--\n");
 205              break;
 206          }
 207  
 208          $code->writeHTML('var '.$this->javascriptvarref.' = [');
 209          $listVar = $code->getTempVariable();
 210          $itemVar = $code->getTempVariable();
 211          $code->writePHP('$'.$listVar.'='.$this->getComponentRefCode().'->getAutocompleteList();');
 212          $code->writePHP('foreach ($'.$listVar.' as $'.$itemVar.') {');
 213          $code->writePHP('echo "\"$'.$itemVar.'\",";');
 214          $code->writePHP('}');
 215          $code->writeHTML('];');
 216          
 217          switch ( $escapestyle ) {
 218              case 'both':
 219                  $code->writeHTML("\n//]]>-->\n");
 220              break;
 221              case 'cdata':
 222                  $code->writeHTML("\n]]>\n");
 223              break;
 224              default:
 225                  $code->writeHTML("\n//-->\n");
 226              break;
 227          }
 228  
 229          $code->writeHTML('</script>');
 230          parent::preGenerate($code);
 231          parent::generateContents($code);
 232      }
 233  }
 234  ?>


Generated: Sun Nov 28 19:36:09 2004 Cross-referenced by PHPXref 0.5