| [ Index ] |
PHP Cross Reference of Web Application Component Toolkit |
[Summary view] [Print] [Text view]
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 ?>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Sun Nov 28 19:36:09 2004 | Cross-referenced by PHPXref 0.5 |