מדיה ויקי:Gadget-autocomplete.js

גרסה מ־12:55, 16 בספטמבר 2011 מאת wikipedia:he>ערן (השלמה אוטומטית)
(הבדל) → הגרסה הקודמת | הגרסה האחרונה (הבדל) | הגרסה הבאה ← (הבדל)

הערה: לאחר הפרסום, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.

  • פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload) או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
  • גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
  • אינטרנט אקספלורר / אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh) או ללחוץ על צירוף המקשים Ctrl-F5.
  • אופרה: ללחוץ על Ctrl-F5.
/*
Autocomplete for links and templates
Written by [[משתמש:ערן]]
*/
mw.loader.using('jquery.ui.autocomplete',function(){
	var mode="none";
	var templateNSName="תבנית:";
	function findLinks(res){
		var pos=$( "#wpTextbox1" ).textSelection('getCaretPosition')-1;
		var txt=$( "#wpTextbox1" ).val();

		var lastbegin=txt.lastIndexOf("[[",pos);
		var lastend=txt.lastIndexOf("]]",pos);
		var isLink=lastbegin>lastend;
		if(isLink) {
			fillLinksList(res,txt.substr(lastbegin+2,pos-lastbegin));
			mode='link';
		}
		else{
			lastbegin=txt.lastIndexOf("{{",pos);
			lastend=txt.lastIndexOf("}}",pos);
			var isTemplate=lastbegin>lastend;
			if(isTemplate){
				fillLinksList(res,templateNSName+txt.substr(lastbegin+2,pos-lastbegin));
				mode='template';
			}
			else{
				res([]);
				mode="none";
			}
		}
	}

	function fillLinksList(res,txt){
		if(txt.length<=1) res([]);
		else $.getJSON(mw.util.wikiScript('api'),{action:'opensearch',search:txt,format:'json'},function(data){if(data[1]) res(data[1]);});
	}

	function addAutocompleteLink(item){
		switch(mode){
		case "none": return;
		case "template":item=item.substr(templateNSName.length);break;
		}
		if(mode=="none") return;
		var pos=$( "#wpTextbox1" ).textSelection('getCaretPosition')-1;
		var txt=$( "#wpTextbox1" ).val();
		var lastbegin=txt.lastIndexOf((mode=="link"?"[[":"{{"),pos);
		
		var newTxt=txt.substr(0,lastbegin)+(mode=="link"?"[[":"{{")+item+(mode=="link"?"]]":"}}")+txt.substr(pos+1);
		$( "#wpTextbox1" ).val(newTxt);
		$( "#wpTextbox1" ).textSelection('setSelection',{start:lastbegin+item.length+4});
	}

	$( "#wpTextbox1" ).autocomplete( {
					source: function( request, response ) {
						findLinks(response);
                                                fixArrowsBug(this);
					},
					focus:function(){return false;},
					select:function(e,ui){
						addAutocompleteLink(ui.item.value);return false;
					},
					open:function(){
						$(".ui-autocomplete").css('width','400px');
						$(".ui-autocomplete").position({
														my: "left top",
														at: "left top",
														of: "#editform"
														});
									}
	});
        var fixed=false;
        //this is hack to prevent known serious bug in autocomplete.js that prevent default of the up and down key which may drive you crazy....
       function fixArrowsBug(self){
        if(fixed) return;
        fixed=true;
        $( "#wpTextbox1" ).unbind("keydown.autocomplete");
        $( "#wpTextbox1" ).bind("keydown.autocomplete",
        function(event ) {
				var keyCode = $.ui.keyCode;
				switch( event.keyCode ) {
				case keyCode.PAGE_UP:
					self._move( "previousPage", event );
					break;
				case keyCode.PAGE_DOWN:
					self._move( "nextPage", event );
					break;
				case keyCode.UP:
                                       if (!self.menu.element.is(":visible")) return;
					self._move( "previous", event );
					// prevent moving cursor to beginning of text field in some browsers
					event.preventDefault();
					break;
				case keyCode.DOWN:
                                       if (!self.menu.element.is(":visible")) return;
					self._move( "next", event );
					// prevent moving cursor to end of text field in some browsers
					event.preventDefault();
					break;
				case keyCode.ENTER:
				case keyCode.NUMPAD_ENTER:
					// when menu is open or has focus
					if ( self.menu.active ) {
						event.preventDefault();
					}
					//passthrough - ENTER and TAB both select the current element
				case keyCode.TAB:
					if ( !self.menu.active ) {
						return;
					}
					self.menu.select( event );
					break;
				case keyCode.ESCAPE:
					self.element.val( self.term );
					self.close( event );
					break;
				case keyCode.LEFT:
				case keyCode.RIGHT:
				case keyCode.SHIFT:
				case keyCode.CONTROL:
				case keyCode.ALT:
				case keyCode.COMMAND:
				case keyCode.COMMAND_RIGHT:
				case keyCode.INSERT:
				case keyCode.CAPS_LOCK:
				case keyCode.END:
				case keyCode.HOME:
					// ignore metakeys (shift, ctrl, alt)
					break;
				default:
					// keypress is triggered before the input value is changed
					clearTimeout( self.searching );
					self.searching = setTimeout(function() {
						self.search( null, event );
					}, self.options.delay );
					break;
	}});
       }
});