Difference between revisions of "MediaWiki:Common.js"
From Baloogan Campaign Wiki
| (24 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
| + | /** | ||
| + | * Collapsible tables | ||
| + | * | ||
| + | * @version 2.0.1 (2013-03-26) | ||
| + | * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-collapsibleTables.js | ||
| + | * @author [[User:R. Koot]] | ||
| + | * @author [[User:Krinkle]] | ||
| + | * @deprecated Since MediaWiki 1.20: Use class="mw-collapsible" instead which | ||
| + | * is supported in MediaWiki core. | ||
| + | */ | ||
| + | |||
| + | var autoCollapse = 2; | ||
| + | var collapseCaption = 'hide'; | ||
| + | var expandCaption = 'show'; | ||
| + | |||
| + | function collapseTable( tableIndex ) { | ||
| + | var Button = document.getElementById( 'collapseButton' + tableIndex ); | ||
| + | var Table = document.getElementById( 'collapsibleTable' + tableIndex ); | ||
| + | |||
| + | if ( !Table || !Button ) { | ||
| + | return false; | ||
| + | } | ||
| + | |||
| + | var Rows = Table.rows; | ||
| + | |||
| + | if ( Button.firstChild.data == collapseCaption ) { | ||
| + | for ( var i = 1; i < Rows.length; i++ ) { | ||
| + | Rows[i].style.display = 'none'; | ||
| + | } | ||
| + | Button.firstChild.data = expandCaption; | ||
| + | } else { | ||
| + | for ( var i = 1; i < Rows.length; i++ ) { | ||
| + | Rows[i].style.display = Rows[0].style.display; | ||
| + | } | ||
| + | Button.firstChild.data = collapseCaption; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | function createClickHandler( tableIndex ) { | ||
| + | return function ( e ) { | ||
| + | e.preventDefault(); | ||
| + | collapseTable( tableIndex ); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | function createCollapseButtons() { | ||
| + | var tableIndex = 0; | ||
| + | var NavigationBoxes = {}; | ||
| + | var Tables = document.getElementsByTagName( 'table' ); | ||
| + | |||
| + | for ( var i = 0; i < Tables.length; i++ ) { | ||
| + | if ( $( Tables[i] ).hasClass( 'collapsible' ) ) { | ||
| + | /* only add button and increment count if there is a header row to work with */ | ||
| + | var HeaderRow = Tables[i].getElementsByTagName( 'tr' )[0]; | ||
| + | if ( !HeaderRow ) { | ||
| + | continue; | ||
| + | } | ||
| + | var Header = HeaderRow.getElementsByTagName( 'th' )[0]; | ||
| + | if ( !Header ) { | ||
| + | continue; | ||
| + | } | ||
| + | |||
| + | NavigationBoxes[tableIndex] = Tables[i]; | ||
| + | Tables[i].setAttribute( 'id', 'collapsibleTable' + tableIndex ); | ||
| + | |||
| + | var Button = document.createElement( 'span' ); | ||
| + | var ButtonLink = document.createElement( 'a' ); | ||
| + | var ButtonText = document.createTextNode( collapseCaption ); | ||
| + | |||
| + | Button.style.styleFloat = 'right'; | ||
| + | Button.style.cssFloat = 'right'; | ||
| + | Button.style.fontWeight = 'normal'; | ||
| + | Button.style.textAlign = 'right'; | ||
| + | Button.style.width = '6em'; | ||
| + | |||
| + | ButtonLink.style.color = Header.style.color; | ||
| + | ButtonLink.setAttribute( 'id', 'collapseButton' + tableIndex ); | ||
| + | $( ButtonLink ).on( 'click', createClickHandler( tableIndex ) ); | ||
| + | ButtonLink.appendChild( ButtonText ); | ||
| + | |||
| + | Button.appendChild( document.createTextNode( '[' ) ); | ||
| + | Button.appendChild( ButtonLink ); | ||
| + | Button.appendChild( document.createTextNode( ']' ) ); | ||
| + | |||
| + | Header.insertBefore( Button, Header.childNodes[0] ); | ||
| + | tableIndex++; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | for ( var i = 0; i < tableIndex; i++ ) { | ||
| + | if ( $( NavigationBoxes[i] ).hasClass( 'collapsed' ) || | ||
| + | ( tableIndex >= autoCollapse && $( NavigationBoxes[i] ).hasClass( 'autocollapse' ) ) | ||
| + | ) { | ||
| + | collapseTable( i ); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | $( createCollapseButtons ); | ||
/* Any JavaScript here will be loaded for all users on every page load. */ | /* Any JavaScript here will be loaded for all users on every page load. */ | ||
| − | $( document ). | + | /** |
| + | * Dynamic Navigation Bars. See [[Wikipedia:NavFrame]] | ||
| + | * | ||
| + | * Based on script from en.wikipedia.org, 2008-09-15. | ||
| + | * | ||
| + | * @source www.mediawiki.org/wiki/MediaWiki:Gadget-NavFrame.js | ||
| + | * @maintainer Helder.wiki, 2012–2013 | ||
| + | * @maintainer Krinkle, 2013 | ||
| + | */ | ||
| + | ( function () { | ||
| + | |||
| + | // Set up the words in your language | ||
| + | var collapseCaption = 'hide'; | ||
| + | var expandCaption = 'show'; | ||
| + | |||
| + | var navigationBarHide = '[' + collapseCaption + ']'; | ||
| + | var navigationBarShow = '[' + expandCaption + ']'; | ||
| + | |||
| + | /** | ||
| + | * Shows and hides content and picture (if available) of navigation bars. | ||
| + | * | ||
| + | * @param {number} indexNavigationBar The index of navigation bar to be toggled | ||
| + | * @param {jQuery.Event} e Event object | ||
| + | */ | ||
| + | function toggleNavigationBar( indexNavigationBar, e ) { | ||
| + | var navChild, | ||
| + | navToggle = document.getElementById( 'NavToggle' + indexNavigationBar ), | ||
| + | navFrame = document.getElementById( 'NavFrame' + indexNavigationBar ); | ||
| + | |||
| + | // Prevent browser from jumping to href "#" | ||
| + | e.preventDefault(); | ||
| + | |||
| + | if ( !navFrame || !navToggle ) { | ||
| + | return false; | ||
| + | } | ||
| + | |||
| + | // If shown now | ||
| + | if ( navToggle.firstChild.data == navigationBarHide ) { | ||
| + | for ( navChild = navFrame.firstChild; navChild != null; navChild = navChild.nextSibling ) { | ||
| + | if ( hasClass( navChild, 'NavPic' ) ) { | ||
| + | navChild.style.display = 'none'; | ||
| + | } | ||
| + | if ( hasClass( navChild, 'NavContent' ) ) { | ||
| + | navChild.style.display = 'none'; | ||
| + | } | ||
| + | } | ||
| + | navToggle.firstChild.data = navigationBarShow; | ||
| + | |||
| + | // If hidden now | ||
| + | } else if ( navToggle.firstChild.data == navigationBarShow ) { | ||
| + | for ( navChild = navFrame.firstChild; navChild != null; navChild = navChild.nextSibling ) { | ||
| + | if ( $( navChild ).hasClass( 'NavPic' ) || $( navChild ).hasClass( 'NavContent' ) ) { | ||
| + | navChild.style.display = 'block'; | ||
| + | } | ||
| + | } | ||
| + | navToggle.firstChild.data = navigationBarHide; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | /** | ||
| + | * Adds show/hide-button to navigation bars. | ||
| + | * | ||
| + | * @param {jQuery} $content | ||
| + | */ | ||
| + | function createNavigationBarToggleButton( $content ) { | ||
| + | var i, j, navFrame, navToggle, navToggleText, navChild, | ||
| + | indexNavigationBar = 0, | ||
| + | navFrames = $content.find( 'div.NavFrame' ).toArray(); | ||
| + | |||
| + | // Iterate over all (new) nav frames | ||
| + | for ( i = 0; i < navFrames.length; i++ ) { | ||
| + | navFrame = navFrames[i]; | ||
| + | // If found a navigation bar | ||
| + | indexNavigationBar++; | ||
| + | navToggle = document.createElement( 'a' ); | ||
| + | navToggle.className = 'NavToggle'; | ||
| + | navToggle.setAttribute( 'id', 'NavToggle' + indexNavigationBar ); | ||
| + | navToggle.setAttribute( 'href', '#' ); | ||
| + | $( navToggle ).on( 'click', $.proxy( toggleNavigationBar, null, indexNavigationBar ) ); | ||
| + | |||
| + | navToggleText = document.createTextNode( navigationBarHide ); | ||
| + | for ( navChild = navFrame.firstChild; navChild != null; navChild = navChild.nextSibling ) { | ||
| + | if ( $( navChild ).hasClass( 'NavPic' ) || $( navChild ).hasClass( 'NavContent' ) ) { | ||
| + | if ( navChild.style.display == 'none' ) { | ||
| + | navToggleText = document.createTextNode( navigationBarShow ); | ||
| + | break; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | navToggle.appendChild( navToggleText ); | ||
| + | // Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked) | ||
| + | for ( j = 0; j < navFrame.childNodes.length; j++ ) { | ||
| + | if ( $( navFrame.childNodes[j] ).hasClass( 'NavHead' ) ) { | ||
| + | navFrame.childNodes[j].appendChild( navToggle ); | ||
| + | } | ||
| + | } | ||
| + | navFrame.setAttribute( 'id', 'NavFrame' + indexNavigationBar ); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | mw.hook( 'wikipage.content' ).add( createNavigationBarToggleButton ); | ||
| + | |||
| + | }()); | ||
| + | |||
| + | /* | ||
| + | * AutoSuggest | ||
| + | * Copyright 2009-2010 Drew Wilson | ||
| + | * www.drewwilson.com | ||
| + | * code.drewwilson.com/entry/autosuggest-jquery-plugin | ||
| + | * | ||
| + | * Version 1.4 - Updated: Mar. 23, 2010 | ||
| + | * | ||
| + | * This Plug-In will auto-complete or auto-suggest completed search queries | ||
| + | * for you as you type. You can add multiple selections and remove them on | ||
| + | * the fly. It supports keybord navigation (UP + DOWN + RETURN), as well | ||
| + | * as multiple AutoSuggest fields on the same page. | ||
| + | * | ||
| + | * Inspied by the Autocomplete plugin by: Jšrn Zaefferer | ||
| + | * and the Facelist plugin by: Ian Tearle (iantearle.com) | ||
| + | * | ||
| + | * This AutoSuggest jQuery plug-in is dual licensed under the MIT and GPL licenses: | ||
| + | * http://www.opensource.org/licenses/mit-license.php | ||
| + | * http://www.gnu.org/licenses/gpl.html | ||
| + | */ | ||
| + | |||
| + | (function($){ | ||
| + | $.fn.autoSuggest = function(data, options) { | ||
| + | var defaults = { | ||
| + | asHtmlID: false, | ||
| + | startText: "Database Search...", | ||
| + | emptyText: "No Results Found", | ||
| + | preFill: {}, | ||
| + | limitText: "No More Selections Are Allowed", | ||
| + | selectedItemProp: "value", //name of object property | ||
| + | selectedValuesProp: "value", //name of object property | ||
| + | searchObjProps: "value", //comma separated list of object property names | ||
| + | queryParam: "q", | ||
| + | retrieveLimit: false, //number for 'limit' param on ajax request | ||
| + | extraParams: "", | ||
| + | matchCase: false, | ||
| + | minChars: 3, | ||
| + | keyDelay: 400, | ||
| + | resultsHighlight: true, | ||
| + | neverSubmit: true, | ||
| + | selectionLimit: false, | ||
| + | showResultList: true, | ||
| + | start: function(){}, | ||
| + | selectionClick: function(elem){}, | ||
| + | selectionAdded: function(elem){}, | ||
| + | selectionRemoved: function(elem){ elem.remove(); }, | ||
| + | formatList: false, //callback function | ||
| + | beforeRetrieve: function(string){ return string; }, | ||
| + | retrieveComplete: function(data){ return data; }, | ||
| + | resultClick: function(data){}, | ||
| + | resultsComplete: function(){} | ||
| + | }; | ||
| + | var opts = $.extend(defaults, options); | ||
| + | |||
| + | var d_type = "object"; | ||
| + | var d_count = 0; | ||
| + | if(typeof data == "string") { | ||
| + | d_type = "string"; | ||
| + | var req_string = data; | ||
| + | } else { | ||
| + | var org_data = data; | ||
| + | for (k in data) if (data.hasOwnProperty(k)) d_count++; | ||
| + | } | ||
| + | if((d_type == "object" && d_count > 0) || d_type == "string"){ | ||
| + | return this.each(function(x){ | ||
| + | if(!opts.asHtmlID){ | ||
| + | x = x+""+Math.floor(Math.random()*100); //this ensures there will be unique IDs on the page if autoSuggest() is called multiple times | ||
| + | var x_id = "as-input-"+x; | ||
| + | } else { | ||
| + | x = opts.asHtmlID; | ||
| + | var x_id = x; | ||
| + | } | ||
| + | opts.start.call(this); | ||
| + | var input = $(this); | ||
| + | input.attr("autocomplete","off").addClass("as-input").attr("id",x_id).val(opts.startText); | ||
| + | var input_focus = false; | ||
| + | |||
| + | // Setup basic elements and render them to the DOM | ||
| + | input.wrap('<ul class="as-selections" id="as-selections-'+x+'"></ul>').wrap('<li class="as-original" id="as-original-'+x+'"></li>'); | ||
| + | var selections_holder = $("#as-selections-"+x); | ||
| + | var org_li = $("#as-original-"+x); | ||
| + | var results_holder = $('<div class="as-results" id="as-results-'+x+'"></div>').hide(); | ||
| + | var results_ul = $('<ul class="as-list"></ul>'); | ||
| + | var values_input = $('<input type="hidden" class="as-values" name="as_values_'+x+'" id="as-values-'+x+'" />'); | ||
| + | var prefill_value = ""; | ||
| + | if(typeof opts.preFill == "string"){ | ||
| + | var vals = opts.preFill.split(","); | ||
| + | for(var i=0; i < vals.length; i++){ | ||
| + | var v_data = {}; | ||
| + | v_data[opts.selectedValuesProp] = vals[i]; | ||
| + | if(vals[i] != ""){ | ||
| + | add_selected_item(v_data, "000"+i); | ||
| + | } | ||
| + | } | ||
| + | prefill_value = opts.preFill; | ||
| + | } else { | ||
| + | prefill_value = ""; | ||
| + | var prefill_count = 0; | ||
| + | for (k in opts.preFill) if (opts.preFill.hasOwnProperty(k)) prefill_count++; | ||
| + | if(prefill_count > 0){ | ||
| + | for(var i=0; i < prefill_count; i++){ | ||
| + | var new_v = opts.preFill[i][opts.selectedValuesProp]; | ||
| + | if(new_v == undefined){ new_v = ""; } | ||
| + | prefill_value = prefill_value+new_v+","; | ||
| + | if(new_v != ""){ | ||
| + | add_selected_item(opts.preFill[i], "000"+i); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | if(prefill_value != ""){ | ||
| + | input.val(""); | ||
| + | var lastChar = prefill_value.substring(prefill_value.length-1); | ||
| + | if(lastChar != ","){ prefill_value = prefill_value+","; } | ||
| + | values_input.val(","+prefill_value); | ||
| + | $("li.as-selection-item", selections_holder).addClass("blur").removeClass("selected"); | ||
| + | } | ||
| + | input.after(values_input); | ||
| + | selections_holder.click(function(){ | ||
| + | input_focus = true; | ||
| + | input.focus(); | ||
| + | }).mousedown(function(){ input_focus = false; }).after(results_holder); | ||
| + | var timeout = null; | ||
| + | var prev = ""; | ||
| + | var totalSelections = 0; | ||
| + | var tab_press = false; | ||
| + | |||
| + | // Handle input field events | ||
| + | input.focus(function(){ | ||
| + | if($(this).val() == opts.startText && values_input.val() == ""){ | ||
| + | $(this).val(""); | ||
| + | } else if(input_focus){ | ||
| + | $("li.as-selection-item", selections_holder).removeClass("blur"); | ||
| + | if($(this).val() != ""){ | ||
| + | results_ul.css("width",selections_holder.outerWidth()); | ||
| + | results_holder.show(); | ||
| + | } | ||
| + | } | ||
| + | input_focus = true; | ||
| + | return true; | ||
| + | }).blur(function(){ | ||
| + | if($(this).val() == "" && values_input.val() == "" && prefill_value == ""){ | ||
| + | $(this).val(opts.startText); | ||
| + | } else if(input_focus){ | ||
| + | $("li.as-selection-item", selections_holder).addClass("blur").removeClass("selected"); | ||
| + | results_holder.hide(); | ||
| + | } | ||
| + | }).keydown(function(e) { | ||
| + | // track last key pressed | ||
| + | lastKeyPressCode = e.keyCode; | ||
| + | first_focus = false; | ||
| + | switch(e.keyCode) { | ||
| + | case 38: // up | ||
| + | e.preventDefault(); | ||
| + | moveSelection("up"); | ||
| + | break; | ||
| + | case 40: // down | ||
| + | e.preventDefault(); | ||
| + | moveSelection("down"); | ||
| + | break; | ||
| + | case 8: // delete | ||
| + | if(input.val() == ""){ | ||
| + | var last = values_input.val().split(","); | ||
| + | last = last[last.length - 2]; | ||
| + | selections_holder.children().not(org_li.prev()).removeClass("selected"); | ||
| + | if(org_li.prev().hasClass("selected")){ | ||
| + | values_input.val(values_input.val().replace(","+last+",",",")); | ||
| + | opts.selectionRemoved.call(this, org_li.prev()); | ||
| + | } else { | ||
| + | opts.selectionClick.call(this, org_li.prev()); | ||
| + | org_li.prev().addClass("selected"); | ||
| + | } | ||
| + | } | ||
| + | if(input.val().length == 1){ | ||
| + | results_holder.hide(); | ||
| + | prev = ""; | ||
| + | } | ||
| + | if($(":visible",results_holder).length > 0){ | ||
| + | if (timeout){ clearTimeout(timeout); } | ||
| + | timeout = setTimeout(function(){ keyChange(); }, opts.keyDelay); | ||
| + | } | ||
| + | break; | ||
| + | case 9: case 188: // tab or comma | ||
| + | tab_press = true; | ||
| + | var i_input = input.val().replace(/(,)/g, ""); | ||
| + | if(i_input != "" && values_input.val().search(","+i_input+",") < 0 && i_input.length >= opts.minChars){ | ||
| + | e.preventDefault(); | ||
| + | var n_data = {}; | ||
| + | n_data[opts.selectedItemProp] = i_input; | ||
| + | n_data[opts.selectedValuesProp] = i_input; | ||
| + | var lis = $("li", selections_holder).length; | ||
| + | add_selected_item(n_data, "00"+(lis+1)); | ||
| + | input.val(""); | ||
| + | } | ||
| + | case 13: // return | ||
| + | tab_press = false; | ||
| + | var active = $("li.active:first", results_holder); | ||
| + | if(active.length > 0){ | ||
| + | active.click(); | ||
| + | results_holder.hide(); | ||
| + | } | ||
| + | if(opts.neverSubmit || active.length > 0){ | ||
| + | e.preventDefault(); | ||
| + | } | ||
| + | break; | ||
| + | default: | ||
| + | if(opts.showResultList){ | ||
| + | if(opts.selectionLimit && $("li.as-selection-item", selections_holder).length >= opts.selectionLimit){ | ||
| + | results_ul.html('<li class="as-message">'+opts.limitText+'</li>'); | ||
| + | results_holder.show(); | ||
| + | } else { | ||
| + | if (timeout){ clearTimeout(timeout); } | ||
| + | timeout = setTimeout(function(){ keyChange(); }, opts.keyDelay); | ||
| + | } | ||
| + | } | ||
| + | break; | ||
| + | } | ||
| + | }); | ||
| + | |||
| + | function keyChange() { | ||
| + | // ignore if the following keys are pressed: [del] [shift] [capslock] | ||
| + | if( lastKeyPressCode == 46 || (lastKeyPressCode > 8 && lastKeyPressCode < 32) ){ return results_holder.hide(); } | ||
| + | var string = input.val().replace(/[\\]+|[\/]+/g,""); | ||
| + | if (string == prev) return; | ||
| + | prev = string; | ||
| + | if (string.length >= opts.minChars) { | ||
| + | selections_holder.addClass("loading"); | ||
| + | if(d_type == "string"){ | ||
| + | var limit = ""; | ||
| + | if(opts.retrieveLimit){ | ||
| + | limit = "&limit="+encodeURIComponent(opts.retrieveLimit); | ||
| + | } | ||
| + | if(opts.beforeRetrieve){ | ||
| + | string = opts.beforeRetrieve.call(this, string); | ||
| + | } | ||
| + | $.getJSON(req_string+"?"+opts.queryParam+"="+encodeURIComponent(string)+limit+opts.extraParams, function(data){ | ||
| + | d_count = 0; | ||
| + | var new_data = opts.retrieveComplete.call(this, data); | ||
| + | for (k in new_data) if (new_data.hasOwnProperty(k)) d_count++; | ||
| + | processData(new_data, string); | ||
| + | }); | ||
| + | } else { | ||
| + | if(opts.beforeRetrieve){ | ||
| + | string = opts.beforeRetrieve.call(this, string); | ||
| + | } | ||
| + | processData(org_data, string); | ||
| + | } | ||
| + | } else { | ||
| + | selections_holder.removeClass("loading"); | ||
| + | results_holder.hide(); | ||
| + | } | ||
| + | } | ||
| + | var num_count = 0; | ||
| + | function processData(data, query){ | ||
| + | if (!opts.matchCase){ query = query.toLowerCase(); } | ||
| + | var matchCount = 0; | ||
| + | results_holder.html(results_ul.html("")).hide(); | ||
| + | for(var i=0;i<d_count;i++){ | ||
| + | var num = i; | ||
| + | num_count++; | ||
| + | var forward = false; | ||
| + | if(opts.searchObjProps == "value") { | ||
| + | var str = data[num].value; | ||
| + | } else { | ||
| + | var str = ""; | ||
| + | var names = opts.searchObjProps.split(","); | ||
| + | for(var y=0;y<names.length;y++){ | ||
| + | var name = $.trim(names[y]); | ||
| + | str = str+data[num][name]+" "; | ||
| + | } | ||
| + | } | ||
| + | if(str){ | ||
| + | if (!opts.matchCase){ str = str.toLowerCase(); } | ||
| + | if(str.search(query) != -1 && values_input.val().search(","+data[num][opts.selectedValuesProp]+",") == -1){ | ||
| + | forward = true; | ||
| + | } | ||
| + | } | ||
| + | if(forward){ | ||
| + | var formatted = $('<li class="as-result-item" id="as-result-item-'+num+'"></li>').click(function(){ | ||
| + | var raw_data = $(this).data("data"); | ||
| + | var number = raw_data.num; | ||
| + | if($("#as-selection-"+number, selections_holder).length <= 0 && !tab_press){ | ||
| + | var data = raw_data.attributes; | ||
| + | input.val("").focus(); | ||
| + | prev = ""; | ||
| + | add_selected_item(data, number); | ||
| + | opts.resultClick.call(this, raw_data); | ||
| + | results_holder.hide(); | ||
| + | } | ||
| + | tab_press = false; | ||
| + | }).mousedown(function(){ input_focus = false; }).mouseover(function(){ | ||
| + | $("li", results_ul).removeClass("active"); | ||
| + | $(this).addClass("active"); | ||
| + | }).data("data",{attributes: data[num], num: num_count}); | ||
| + | var this_data = $.extend({},data[num]); | ||
| + | if (!opts.matchCase){ | ||
| + | var regx = new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + query + ")(?![^<>]*>)(?![^&;]+;)", "gi"); | ||
| + | } else { | ||
| + | var regx = new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + query + ")(?![^<>]*>)(?![^&;]+;)", "g"); | ||
| + | } | ||
| + | |||
| + | if(opts.resultsHighlight){ | ||
| + | this_data[opts.selectedItemProp] = this_data[opts.selectedItemProp].replace(regx,"<em>$1</em>"); | ||
| + | } | ||
| + | if(!opts.formatList){ | ||
| + | formatted = formatted.html(this_data[opts.selectedItemProp]); | ||
| + | } else { | ||
| + | formatted = opts.formatList.call(this, this_data, formatted); | ||
| + | } | ||
| + | results_ul.append(formatted); | ||
| + | delete this_data; | ||
| + | matchCount++; | ||
| + | if(opts.retrieveLimit && opts.retrieveLimit == matchCount ){ break; } | ||
| + | } | ||
| + | } | ||
| + | selections_holder.removeClass("loading"); | ||
| + | if(matchCount <= 0){ | ||
| + | results_ul.html('<li class="as-message">'+opts.emptyText+'</li>'); | ||
| + | } | ||
| + | results_ul.css("width", selections_holder.outerWidth()); | ||
| + | results_holder.show(); | ||
| + | opts.resultsComplete.call(this); | ||
| + | } | ||
| + | |||
| + | function add_selected_item(data, num){ | ||
| + | values_input.val(values_input.val()+data[opts.selectedValuesProp]+","); | ||
| + | var item = $('<li class="as-selection-item" id="as-selection-'+num+'"></li>').click(function(){ | ||
| + | opts.selectionClick.call(this, $(this)); | ||
| + | selections_holder.children().removeClass("selected"); | ||
| + | $(this).addClass("selected"); | ||
| + | }).mousedown(function(){ input_focus = false; }); | ||
| + | var close = $('<a class="as-close">×</a>').click(function(){ | ||
| + | values_input.val(values_input.val().replace(","+data[opts.selectedValuesProp]+",",",")); | ||
| + | opts.selectionRemoved.call(this, item); | ||
| + | input_focus = true; | ||
| + | input.focus(); | ||
| + | return false; | ||
| + | }); | ||
| + | org_li.before(item.html(data[opts.selectedItemProp]).prepend(close)); | ||
| + | opts.selectionAdded.call(this, org_li.prev()); | ||
| + | } | ||
| + | |||
| + | function moveSelection(direction){ | ||
| + | if($(":visible",results_holder).length > 0){ | ||
| + | var lis = $("li", results_holder); | ||
| + | if(direction == "down"){ | ||
| + | var start = lis.eq(0); | ||
| + | } else { | ||
| + | var start = lis.filter(":last"); | ||
| + | } | ||
| + | var active = $("li.active:first", results_holder); | ||
| + | if(active.length > 0){ | ||
| + | if(direction == "down"){ | ||
| + | start = active.next(); | ||
| + | } else { | ||
| + | start = active.prev(); | ||
| + | } | ||
| + | } | ||
| + | lis.removeClass("active"); | ||
| + | start.addClass("active"); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | }); | ||
| + | } | ||
| + | } | ||
| + | })(jQuery); | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | jQuery( document ).ready( function( $ ) { | ||
$(function(){ | $(function(){ | ||
| − | + | // $("input[type=text]").autoSuggest("https://wiki.baloogancampaign.com/search.php", { | |
| + | $("input[id=bodySearchInput]").autoSuggest("https://wiki.baloogancampaign.com/search.php", { | ||
resultClick: function(data){ | resultClick: function(data){ | ||
window.location.href = data.attributes.name; | window.location.href = data.attributes.name; | ||
| Line 9: | Line 586: | ||
} | } | ||
}); | }); | ||
| + | }); | ||
| + | $("img").error(function(){ | ||
| + | $(this).hide(); | ||
}); | }); | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
}); | }); | ||
| Line 44: | Line 617: | ||
document.getElementById('baloogan_image').onclick = handleClick; | document.getElementById('baloogan_image').onclick = handleClick; | ||
| − | |||
| − | |||
| − | |||
| − | |||
Latest revision as of 10:31, 17 August 2016
/**
* Collapsible tables
*
* @version 2.0.1 (2013-03-26)
* @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-collapsibleTables.js
* @author [[User:R. Koot]]
* @author [[User:Krinkle]]
* @deprecated Since MediaWiki 1.20: Use class="mw-collapsible" instead which
* is supported in MediaWiki core.
*/
var autoCollapse = 2;
var collapseCaption = 'hide';
var expandCaption = 'show';
function collapseTable( tableIndex ) {
var Button = document.getElementById( 'collapseButton' + tableIndex );
var Table = document.getElementById( 'collapsibleTable' + tableIndex );
if ( !Table || !Button ) {
return false;
}
var Rows = Table.rows;
if ( Button.firstChild.data == collapseCaption ) {
for ( var i = 1; i < Rows.length; i++ ) {
Rows[i].style.display = 'none';
}
Button.firstChild.data = expandCaption;
} else {
for ( var i = 1; i < Rows.length; i++ ) {
Rows[i].style.display = Rows[0].style.display;
}
Button.firstChild.data = collapseCaption;
}
}
function createClickHandler( tableIndex ) {
return function ( e ) {
e.preventDefault();
collapseTable( tableIndex );
}
}
function createCollapseButtons() {
var tableIndex = 0;
var NavigationBoxes = {};
var Tables = document.getElementsByTagName( 'table' );
for ( var i = 0; i < Tables.length; i++ ) {
if ( $( Tables[i] ).hasClass( 'collapsible' ) ) {
/* only add button and increment count if there is a header row to work with */
var HeaderRow = Tables[i].getElementsByTagName( 'tr' )[0];
if ( !HeaderRow ) {
continue;
}
var Header = HeaderRow.getElementsByTagName( 'th' )[0];
if ( !Header ) {
continue;
}
NavigationBoxes[tableIndex] = Tables[i];
Tables[i].setAttribute( 'id', 'collapsibleTable' + tableIndex );
var Button = document.createElement( 'span' );
var ButtonLink = document.createElement( 'a' );
var ButtonText = document.createTextNode( collapseCaption );
Button.style.styleFloat = 'right';
Button.style.cssFloat = 'right';
Button.style.fontWeight = 'normal';
Button.style.textAlign = 'right';
Button.style.width = '6em';
ButtonLink.style.color = Header.style.color;
ButtonLink.setAttribute( 'id', 'collapseButton' + tableIndex );
$( ButtonLink ).on( 'click', createClickHandler( tableIndex ) );
ButtonLink.appendChild( ButtonText );
Button.appendChild( document.createTextNode( '[' ) );
Button.appendChild( ButtonLink );
Button.appendChild( document.createTextNode( ']' ) );
Header.insertBefore( Button, Header.childNodes[0] );
tableIndex++;
}
}
for ( var i = 0; i < tableIndex; i++ ) {
if ( $( NavigationBoxes[i] ).hasClass( 'collapsed' ) ||
( tableIndex >= autoCollapse && $( NavigationBoxes[i] ).hasClass( 'autocollapse' ) )
) {
collapseTable( i );
}
}
}
$( createCollapseButtons );
/* Any JavaScript here will be loaded for all users on every page load. */
/**
* Dynamic Navigation Bars. See [[Wikipedia:NavFrame]]
*
* Based on script from en.wikipedia.org, 2008-09-15.
*
* @source www.mediawiki.org/wiki/MediaWiki:Gadget-NavFrame.js
* @maintainer Helder.wiki, 2012–2013
* @maintainer Krinkle, 2013
*/
( function () {
// Set up the words in your language
var collapseCaption = 'hide';
var expandCaption = 'show';
var navigationBarHide = '[' + collapseCaption + ']';
var navigationBarShow = '[' + expandCaption + ']';
/**
* Shows and hides content and picture (if available) of navigation bars.
*
* @param {number} indexNavigationBar The index of navigation bar to be toggled
* @param {jQuery.Event} e Event object
*/
function toggleNavigationBar( indexNavigationBar, e ) {
var navChild,
navToggle = document.getElementById( 'NavToggle' + indexNavigationBar ),
navFrame = document.getElementById( 'NavFrame' + indexNavigationBar );
// Prevent browser from jumping to href "#"
e.preventDefault();
if ( !navFrame || !navToggle ) {
return false;
}
// If shown now
if ( navToggle.firstChild.data == navigationBarHide ) {
for ( navChild = navFrame.firstChild; navChild != null; navChild = navChild.nextSibling ) {
if ( hasClass( navChild, 'NavPic' ) ) {
navChild.style.display = 'none';
}
if ( hasClass( navChild, 'NavContent' ) ) {
navChild.style.display = 'none';
}
}
navToggle.firstChild.data = navigationBarShow;
// If hidden now
} else if ( navToggle.firstChild.data == navigationBarShow ) {
for ( navChild = navFrame.firstChild; navChild != null; navChild = navChild.nextSibling ) {
if ( $( navChild ).hasClass( 'NavPic' ) || $( navChild ).hasClass( 'NavContent' ) ) {
navChild.style.display = 'block';
}
}
navToggle.firstChild.data = navigationBarHide;
}
}
/**
* Adds show/hide-button to navigation bars.
*
* @param {jQuery} $content
*/
function createNavigationBarToggleButton( $content ) {
var i, j, navFrame, navToggle, navToggleText, navChild,
indexNavigationBar = 0,
navFrames = $content.find( 'div.NavFrame' ).toArray();
// Iterate over all (new) nav frames
for ( i = 0; i < navFrames.length; i++ ) {
navFrame = navFrames[i];
// If found a navigation bar
indexNavigationBar++;
navToggle = document.createElement( 'a' );
navToggle.className = 'NavToggle';
navToggle.setAttribute( 'id', 'NavToggle' + indexNavigationBar );
navToggle.setAttribute( 'href', '#' );
$( navToggle ).on( 'click', $.proxy( toggleNavigationBar, null, indexNavigationBar ) );
navToggleText = document.createTextNode( navigationBarHide );
for ( navChild = navFrame.firstChild; navChild != null; navChild = navChild.nextSibling ) {
if ( $( navChild ).hasClass( 'NavPic' ) || $( navChild ).hasClass( 'NavContent' ) ) {
if ( navChild.style.display == 'none' ) {
navToggleText = document.createTextNode( navigationBarShow );
break;
}
}
}
navToggle.appendChild( navToggleText );
// Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)
for ( j = 0; j < navFrame.childNodes.length; j++ ) {
if ( $( navFrame.childNodes[j] ).hasClass( 'NavHead' ) ) {
navFrame.childNodes[j].appendChild( navToggle );
}
}
navFrame.setAttribute( 'id', 'NavFrame' + indexNavigationBar );
}
}
mw.hook( 'wikipage.content' ).add( createNavigationBarToggleButton );
}());
/*
* AutoSuggest
* Copyright 2009-2010 Drew Wilson
* www.drewwilson.com
* code.drewwilson.com/entry/autosuggest-jquery-plugin
*
* Version 1.4 - Updated: Mar. 23, 2010
*
* This Plug-In will auto-complete or auto-suggest completed search queries
* for you as you type. You can add multiple selections and remove them on
* the fly. It supports keybord navigation (UP + DOWN + RETURN), as well
* as multiple AutoSuggest fields on the same page.
*
* Inspied by the Autocomplete plugin by: Jšrn Zaefferer
* and the Facelist plugin by: Ian Tearle (iantearle.com)
*
* This AutoSuggest jQuery plug-in is dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*/
(function($){
$.fn.autoSuggest = function(data, options) {
var defaults = {
asHtmlID: false,
startText: "Database Search...",
emptyText: "No Results Found",
preFill: {},
limitText: "No More Selections Are Allowed",
selectedItemProp: "value", //name of object property
selectedValuesProp: "value", //name of object property
searchObjProps: "value", //comma separated list of object property names
queryParam: "q",
retrieveLimit: false, //number for 'limit' param on ajax request
extraParams: "",
matchCase: false,
minChars: 3,
keyDelay: 400,
resultsHighlight: true,
neverSubmit: true,
selectionLimit: false,
showResultList: true,
start: function(){},
selectionClick: function(elem){},
selectionAdded: function(elem){},
selectionRemoved: function(elem){ elem.remove(); },
formatList: false, //callback function
beforeRetrieve: function(string){ return string; },
retrieveComplete: function(data){ return data; },
resultClick: function(data){},
resultsComplete: function(){}
};
var opts = $.extend(defaults, options);
var d_type = "object";
var d_count = 0;
if(typeof data == "string") {
d_type = "string";
var req_string = data;
} else {
var org_data = data;
for (k in data) if (data.hasOwnProperty(k)) d_count++;
}
if((d_type == "object" && d_count > 0) || d_type == "string"){
return this.each(function(x){
if(!opts.asHtmlID){
x = x+""+Math.floor(Math.random()*100); //this ensures there will be unique IDs on the page if autoSuggest() is called multiple times
var x_id = "as-input-"+x;
} else {
x = opts.asHtmlID;
var x_id = x;
}
opts.start.call(this);
var input = $(this);
input.attr("autocomplete","off").addClass("as-input").attr("id",x_id).val(opts.startText);
var input_focus = false;
// Setup basic elements and render them to the DOM
input.wrap('<ul class="as-selections" id="as-selections-'+x+'"></ul>').wrap('<li class="as-original" id="as-original-'+x+'"></li>');
var selections_holder = $("#as-selections-"+x);
var org_li = $("#as-original-"+x);
var results_holder = $('<div class="as-results" id="as-results-'+x+'"></div>').hide();
var results_ul = $('<ul class="as-list"></ul>');
var values_input = $('<input type="hidden" class="as-values" name="as_values_'+x+'" id="as-values-'+x+'" />');
var prefill_value = "";
if(typeof opts.preFill == "string"){
var vals = opts.preFill.split(",");
for(var i=0; i < vals.length; i++){
var v_data = {};
v_data[opts.selectedValuesProp] = vals[i];
if(vals[i] != ""){
add_selected_item(v_data, "000"+i);
}
}
prefill_value = opts.preFill;
} else {
prefill_value = "";
var prefill_count = 0;
for (k in opts.preFill) if (opts.preFill.hasOwnProperty(k)) prefill_count++;
if(prefill_count > 0){
for(var i=0; i < prefill_count; i++){
var new_v = opts.preFill[i][opts.selectedValuesProp];
if(new_v == undefined){ new_v = ""; }
prefill_value = prefill_value+new_v+",";
if(new_v != ""){
add_selected_item(opts.preFill[i], "000"+i);
}
}
}
}
if(prefill_value != ""){
input.val("");
var lastChar = prefill_value.substring(prefill_value.length-1);
if(lastChar != ","){ prefill_value = prefill_value+","; }
values_input.val(","+prefill_value);
$("li.as-selection-item", selections_holder).addClass("blur").removeClass("selected");
}
input.after(values_input);
selections_holder.click(function(){
input_focus = true;
input.focus();
}).mousedown(function(){ input_focus = false; }).after(results_holder);
var timeout = null;
var prev = "";
var totalSelections = 0;
var tab_press = false;
// Handle input field events
input.focus(function(){
if($(this).val() == opts.startText && values_input.val() == ""){
$(this).val("");
} else if(input_focus){
$("li.as-selection-item", selections_holder).removeClass("blur");
if($(this).val() != ""){
results_ul.css("width",selections_holder.outerWidth());
results_holder.show();
}
}
input_focus = true;
return true;
}).blur(function(){
if($(this).val() == "" && values_input.val() == "" && prefill_value == ""){
$(this).val(opts.startText);
} else if(input_focus){
$("li.as-selection-item", selections_holder).addClass("blur").removeClass("selected");
results_holder.hide();
}
}).keydown(function(e) {
// track last key pressed
lastKeyPressCode = e.keyCode;
first_focus = false;
switch(e.keyCode) {
case 38: // up
e.preventDefault();
moveSelection("up");
break;
case 40: // down
e.preventDefault();
moveSelection("down");
break;
case 8: // delete
if(input.val() == ""){
var last = values_input.val().split(",");
last = last[last.length - 2];
selections_holder.children().not(org_li.prev()).removeClass("selected");
if(org_li.prev().hasClass("selected")){
values_input.val(values_input.val().replace(","+last+",",","));
opts.selectionRemoved.call(this, org_li.prev());
} else {
opts.selectionClick.call(this, org_li.prev());
org_li.prev().addClass("selected");
}
}
if(input.val().length == 1){
results_holder.hide();
prev = "";
}
if($(":visible",results_holder).length > 0){
if (timeout){ clearTimeout(timeout); }
timeout = setTimeout(function(){ keyChange(); }, opts.keyDelay);
}
break;
case 9: case 188: // tab or comma
tab_press = true;
var i_input = input.val().replace(/(,)/g, "");
if(i_input != "" && values_input.val().search(","+i_input+",") < 0 && i_input.length >= opts.minChars){
e.preventDefault();
var n_data = {};
n_data[opts.selectedItemProp] = i_input;
n_data[opts.selectedValuesProp] = i_input;
var lis = $("li", selections_holder).length;
add_selected_item(n_data, "00"+(lis+1));
input.val("");
}
case 13: // return
tab_press = false;
var active = $("li.active:first", results_holder);
if(active.length > 0){
active.click();
results_holder.hide();
}
if(opts.neverSubmit || active.length > 0){
e.preventDefault();
}
break;
default:
if(opts.showResultList){
if(opts.selectionLimit && $("li.as-selection-item", selections_holder).length >= opts.selectionLimit){
results_ul.html('<li class="as-message">'+opts.limitText+'</li>');
results_holder.show();
} else {
if (timeout){ clearTimeout(timeout); }
timeout = setTimeout(function(){ keyChange(); }, opts.keyDelay);
}
}
break;
}
});
function keyChange() {
// ignore if the following keys are pressed: [del] [shift] [capslock]
if( lastKeyPressCode == 46 || (lastKeyPressCode > 8 && lastKeyPressCode < 32) ){ return results_holder.hide(); }
var string = input.val().replace(/[\\]+|[\/]+/g,"");
if (string == prev) return;
prev = string;
if (string.length >= opts.minChars) {
selections_holder.addClass("loading");
if(d_type == "string"){
var limit = "";
if(opts.retrieveLimit){
limit = "&limit="+encodeURIComponent(opts.retrieveLimit);
}
if(opts.beforeRetrieve){
string = opts.beforeRetrieve.call(this, string);
}
$.getJSON(req_string+"?"+opts.queryParam+"="+encodeURIComponent(string)+limit+opts.extraParams, function(data){
d_count = 0;
var new_data = opts.retrieveComplete.call(this, data);
for (k in new_data) if (new_data.hasOwnProperty(k)) d_count++;
processData(new_data, string);
});
} else {
if(opts.beforeRetrieve){
string = opts.beforeRetrieve.call(this, string);
}
processData(org_data, string);
}
} else {
selections_holder.removeClass("loading");
results_holder.hide();
}
}
var num_count = 0;
function processData(data, query){
if (!opts.matchCase){ query = query.toLowerCase(); }
var matchCount = 0;
results_holder.html(results_ul.html("")).hide();
for(var i=0;i<d_count;i++){
var num = i;
num_count++;
var forward = false;
if(opts.searchObjProps == "value") {
var str = data[num].value;
} else {
var str = "";
var names = opts.searchObjProps.split(",");
for(var y=0;y<names.length;y++){
var name = $.trim(names[y]);
str = str+data[num][name]+" ";
}
}
if(str){
if (!opts.matchCase){ str = str.toLowerCase(); }
if(str.search(query) != -1 && values_input.val().search(","+data[num][opts.selectedValuesProp]+",") == -1){
forward = true;
}
}
if(forward){
var formatted = $('<li class="as-result-item" id="as-result-item-'+num+'"></li>').click(function(){
var raw_data = $(this).data("data");
var number = raw_data.num;
if($("#as-selection-"+number, selections_holder).length <= 0 && !tab_press){
var data = raw_data.attributes;
input.val("").focus();
prev = "";
add_selected_item(data, number);
opts.resultClick.call(this, raw_data);
results_holder.hide();
}
tab_press = false;
}).mousedown(function(){ input_focus = false; }).mouseover(function(){
$("li", results_ul).removeClass("active");
$(this).addClass("active");
}).data("data",{attributes: data[num], num: num_count});
var this_data = $.extend({},data[num]);
if (!opts.matchCase){
var regx = new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + query + ")(?![^<>]*>)(?![^&;]+;)", "gi");
} else {
var regx = new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + query + ")(?![^<>]*>)(?![^&;]+;)", "g");
}
if(opts.resultsHighlight){
this_data[opts.selectedItemProp] = this_data[opts.selectedItemProp].replace(regx,"<em>$1</em>");
}
if(!opts.formatList){
formatted = formatted.html(this_data[opts.selectedItemProp]);
} else {
formatted = opts.formatList.call(this, this_data, formatted);
}
results_ul.append(formatted);
delete this_data;
matchCount++;
if(opts.retrieveLimit && opts.retrieveLimit == matchCount ){ break; }
}
}
selections_holder.removeClass("loading");
if(matchCount <= 0){
results_ul.html('<li class="as-message">'+opts.emptyText+'</li>');
}
results_ul.css("width", selections_holder.outerWidth());
results_holder.show();
opts.resultsComplete.call(this);
}
function add_selected_item(data, num){
values_input.val(values_input.val()+data[opts.selectedValuesProp]+",");
var item = $('<li class="as-selection-item" id="as-selection-'+num+'"></li>').click(function(){
opts.selectionClick.call(this, $(this));
selections_holder.children().removeClass("selected");
$(this).addClass("selected");
}).mousedown(function(){ input_focus = false; });
var close = $('<a class="as-close">×</a>').click(function(){
values_input.val(values_input.val().replace(","+data[opts.selectedValuesProp]+",",","));
opts.selectionRemoved.call(this, item);
input_focus = true;
input.focus();
return false;
});
org_li.before(item.html(data[opts.selectedItemProp]).prepend(close));
opts.selectionAdded.call(this, org_li.prev());
}
function moveSelection(direction){
if($(":visible",results_holder).length > 0){
var lis = $("li", results_holder);
if(direction == "down"){
var start = lis.eq(0);
} else {
var start = lis.filter(":last");
}
var active = $("li.active:first", results_holder);
if(active.length > 0){
if(direction == "down"){
start = active.next();
} else {
start = active.prev();
}
}
lis.removeClass("active");
start.addClass("active");
}
}
});
}
}
})(jQuery);
jQuery( document ).ready( function( $ ) {
$(function(){
// $("input[type=text]").autoSuggest("https://wiki.baloogancampaign.com/search.php", {
$("input[id=bodySearchInput]").autoSuggest("https://wiki.baloogancampaign.com/search.php", {
resultClick: function(data){
window.location.href = data.attributes.name;
// console.log(data);
}
});
});
$("img").error(function(){
$(this).hide();
});
});
/* Any JavaScript here will be loaded for users using the Vector skin */
function handleClick()
{
try{ TOGGLEA=(TOGGLEA % 2)}catch(e){
TOGGLEA=0;
}; // initialize TOGGLEA, HOLDX, and HOLDY
switch(TOGGLEA){
case 0: // this makes it four times as big as it was originally
// document.getElementById('baloogan_image').setAttribute('width' ,HOLDX*4);
document.getElementById('baloogan_image').className = "baloogan_big_image";
break;
case 1: // this sets to a original size
// document.getElementById('baloogan_image').setAttribute('width' ,HOLDX);
document.getElementById('baloogan_image').className = "baloogan_small_image";
break;
}
TOGGLEA++;
}
document.getElementById('baloogan_image').onclick = handleClick;