MediaWiki:Common.js/edit.js: Difference between revisions

From OniGalore
Jump to navigation Jump to search
(do we need to use mw.loader.load() every time to be sure insertTags() will work?)
(doesn't seem to help)
Line 569: Line 569:
code += '|}\n';
code += '|}\n';
hideXEBPopup();
hideXEBPopup();
mw.loader.load('mw.toolbar');
mw.toolbar.insertTags('', '', code);
mw.toolbar.insertTags('', '', code);
extendSummary('table');
extendSummary('table');
Line 808: Line 807:
call += '}}<noinclude>\n\n[[Category:BSL functions]]</noinclude>';
call += '}}<noinclude>\n\n[[Category:BSL functions]]</noinclude>';
hideXEBPopup();
hideXEBPopup();
mw.loader.load('mw.toolbar');
mw.toolbar.insertTags('', '', call);
mw.toolbar.insertTags('', '', call);
extendSummary('added ' + f.inputFuncName.value);
extendSummary('added ' + f.inputFuncName.value);
Line 862: Line 860:
call += '}}<noinclude>\n\n[[Category:BSL variables]]</noinclude>';
call += '}}<noinclude>\n\n[[Category:BSL variables]]</noinclude>';
hideXEBPopup();
hideXEBPopup();
mw.loader.load('mw.toolbar');
mw.toolbar.insertTags('', '', call);
mw.toolbar.insertTags('', '', call);
extendSummary('added ' + f.inputVarName.value);
extendSummary('added ' + f.inputVarName.value);
Line 1,091: Line 1,088:
code += '|type:' + f.geoType.value + '_region:' + f.geoRegion.value;
code += '|type:' + f.geoType.value + '_region:' + f.geoRegion.value;
code += '}}';
code += '}}';
mw.loader.load('mw.toolbar');
mw.toolbar.insertTags('', '', code);
mw.toolbar.insertTags('', '', code);
extendSummary('geo-location');
extendSummary('geo-location');
Line 1,137: Line 1,133:
};
};
hideXEBPopup();
hideXEBPopup();
mw.loader.load('mw.toolbar');
mw.toolbar.insertTags('', '', code[ itm ]);
mw.toolbar.insertTags('', '', code[ itm ]);
return false;
return false;
Line 1,182: Line 1,177:
code += '|' + f.imgCaption.value;
code += '|' + f.imgCaption.value;
code += ']]';
code += ']]';
mw.loader.load('mw.toolbar');
mw.toolbar.insertTags('', '', code);
mw.toolbar.insertTags('', '', code);
extendSummary('image');
extendSummary('image');

Revision as of 07:01, 5 August 2017

/* Version: 3.1
 * ============================================================
 * en: ADD SOME EXTRA BUTTONS TO THE EDITPANEL
 * de: FÜGE NEUE BUTTON IN DIE WERKZEUGLEISTE
 * pt: ACRESCENTA ALGUNS BOTÕES EXTRAS AO PAINEL DE EDIÇÃO
 * ============================================================
 * Vorschläge für neue Buttons werden gerne entgegengenommen
 * Die Reihenfolge und Anzahl der Buttons ist über die (alphabetische) Variable XEBOrder wählbar.
 *
 * ================================
 * Control Variables
 *
 * window.rmEditButtons - Removes standard toolbar buttons
 * window.XEBOrder - The order in which the buttons are displayed
 * window.myButtons - Add user defined buttons
 */

mw.loader.load( '//wiki.oni2.net/w/index.php?title=MediaWiki:live.css&action=raw&ctype=text/css', 'text/css' );

if (typeof XEBPopups === 'undefined') {
	XEBPopups = true;
}
if (typeof XEBHideDelay === 'undefined') {
	// Time before the popup disappears after the mouse moves out
	window.XEBHideDelay = 1.0;
}
if (typeof XEBExtendEditSummary === 'undefined') {
	// Is the edit summary extended after a popup
	window.XEBExtendEditSummary = true;
}

if (typeof usersignature === 'undefined') {
	var usersignature = '-- ~~' + '~~';
}

var Isrc = '//wiki.oni2.net/w/images/';

var BDict = {
'A':['e/e9/Button_headline2.png','Third-level headline','\n===','===','Secondary headline'],
'B':['1/13/Button_enter.png','Line break','<br />','',''],
'BF': ['b/b4/Button_BSL_func.png', 'Insert BSL function', "", "", ""],
'BV': ['6/62/Button_BSL_var.png', 'Insert BSL variable', "", "", ""],
'C':['f/f7/Button_align_center.png','Center-aligned text','<div style="text-align: center;">\n','\n<\/div>','Centered text'],
'D':['e/ea/Button_align_left.png','Left-aligned text','<div style="text-align: left; direction: ltr; margin-left: 1em;">\n','\n<\/div>','Left-aligned text'],
'D1':['a/a5/Button_align_right.png','Right-aligned text','<div style="text-align: right; direction: ltr; margin-left: 1em;">\n','\n<\/div>','Right-aligned text'],
'E':['7/79/Button_cmpl_table.png','Simple table','\n{| class="wikitable" \n|- \n| 1 || 2\n|- \n| 3 || 4','\n|}\n',''],
'E1':['8/80/Button_smart_table.png', 'Smart table wizard', '','',''],
'F':['1/1e/Button_font_color.png','Colored text','<span style="color: ','">Colored text<\/span>','ColorName'],
'FS':['6/6d/Button_unsigned.png','Unsigned post','{{subst:unsigned|','|date}}','user name or IP'],
'G':['1/12/Button_gallery.png','Image gallery',"\ngallery\nPlease put the word \"gallery\" above between <>s to \"activate\" that tag and then delete this note.\nImage:","|[[M63]]\nImage:Mona Lisa.jpg|[[Mona Lisa]]\nImage:Truite arc-en-ciel.jpg|Eine [[Forelle ]]\n<\/gallery>",'M63.jpg'],
'H':['7/74/Button_comment.png','Comment',"<!--","-->",'Comment'],
'I1':['d/d6/Button_superscript.png','Superscript','<sup>','<\/sup>','Superscript text'],
'I2':['b/bf/Button_subscript.png','Subscript','<sub>','<\/sub>','Subscript text'],
'J1':['d/d5/Button_small_text.png','Small text','<small>','<\/small>','Small Text'],
'J2':['9/99/Button_big_text.png','Big text','<big>','<\/big>','Big text'],
'K':['1/11/Button_category.png','Category',"[[Category:","]]",'Category name'],
'L':['e/e2/Button_tab_in.png','Insert tab',':','',':'],
'M':['f/fd/Button_blockquote.png','Quoted text block','<blockquote style="border: 1px solid blue; padding: 2em;">\n','\n<\/blockquote>','Block quote'],
'N':['4/4b/Button_nbsp.png','Insert non-breaking space','&nbsp;','',''],
'O':['2/23/Button_code.png','Code block','<code>','<\/code>','Code'],
'P':['3/3c/Button_pre.png','Pre-formatted text block','<pre>','<\/pre>','Pre-formatted text'],
'P1':['2/2e/Button_subpage.png','Link to sub-page','[[','/Sub_Page]]','Page'],
'Q':['1/1f/Button_list_tab.png','Definition (tabbed) list','\n; ','\n: Item 1\n: Item 2','Definition'],
'R':['e/ef/Button_reflink_start.png','Insert a reference','<ref>','<\/ref>','Insert reference material'],
'R1':['5/5f/Button_reflink_smart.png','Reference Wizard','<ref name="','','Reference name'],
'R2':['c/cb/Button_reflink_footer.png','Insert reference footer',"<references/>",'',''],
'R3': ['1/1a/Button_reflink_advanced_3.png', 'No reference material', '', '"/>', ''],
	'R4': ['9/9a/Button_references.png', 'Reference footer', "\n==Notes==\n<!--See http://en.wikipedia.org/wiki/Wikipedia:Footnotes for an explanation of how to generate footnotes using the <ref(erences/)> tags-->\n<div class=\'references-small\'>\n<references/>\n</div>", '', ''],
'S':['c/c9/Button_strike.png','Strikeout text','<s>','<\/s>','Struck-out text'],
'T':['5/59/Button_template.png','Template','{{','}}','Template name'],
'TS':['a/a1/Button_table_start.png','Start a table','{|','',''],
'TC':['5/59/Button_table_cell.png','Table cell','|','',''],
'TE':['f/f0/Button_table_end.png','End a table','','|}',''],
'TR':['7/70/Button_table_row.png','Start a table row','|-','',''],
'T1':['8/82/Button_teletype.png','Teletype text','<tt>','<\/tt>','Teletype Text'],
'TL':['d/d3/Button_subst_tmpl.png','Template (substituted)',"{{subst:"+"tl|",'}}','Template name'],
'U':['f/fd/Button_underline.png','Underlined text',"<u>","<\/u>",'Underlined text'],
'V':['c/c8/Button_redirect.png','Redirect',"#REDIRECT [[","]]",'Article Name'],
'W':['5/50/Button_list_num.png','Numbered list',"\n# ","\n# Element 2\n# Element 3",'Element 1'],
'X':['f/fa/Button_list_bull.png','Bulleted list',"\n* ","\n* Element B\n* Element C",'Element A'],
'Y1':['d/d5/Button_noinclude.png','No include',"<noinclude>","<\/noinclude>",'Text'],
'Y2':['6/63/Button_includeonly.png','Include only',"<includeonly>","<\/includeonly>",'Text'],
'Z':['3/35/Button_substitute.png','Substituted page link',"{{subst:","}}",'Template'],
'AI':['c/cc/Button_adv_image.png','Advanced image',"[[Image:","|thumb|right|px|Caption]]",'FileName.jpg'],
'GEO': ['b/b8/Button_Globe.png', 'Geo location', "", "", ""],
'TALK': ['4/49/Button_talk.png', 'Add talk template', "", "", ""]
};

var XEBOrder2 = [];




initButtons();
if (!mw.config.get( 'wgIsArticle' )) {
	// only if edit
	if (XEBPopups) {
		$(extendButtons);
	}
}

function initButtons() {

	var bc, d, i, customTools = {};

	if (typeof XEBOrder !== 'string') {
		// can be modified
		XEBOrder2 = '0,1,U,F,D,C,D1,4,A,2,3,E,G,8,H,9,BF,BV'.split(',');
	} else if (XEBOrder.toLowerCase() === 'all') {
		$.each(BDict, function( b, value ){
			XEBOrder2.push(b);
		});
	} else {
		XEBOrder2 = XEBOrder.toUpperCase().split(',');
	}

	$.each(BDict, function( b, value ){
		// Add the start of the URL (Isrc) to the XEB buttons
		BDict[b][0] = Isrc + BDict[b][0];
	});
	// If the user has defined any buttons then add them into the available button lists
	if (typeof myButtons === 'object') {
		$.each(myButtons, function( b, value ){
			// custom user buttons
			BDict[b] = myButtons[b];
		});
	}

        mw.loader.using('user.options', function () {
		if ( mw.user.options.get('usebetatoolbar') ) {
			// Use the enhanced edit toolbar
			mw.loader.using('ext.wikiEditor.toolbar', function () {
				$(function(){
					// Build the new buttons
					for (i = 0; i < XEBOrder2.length; i++) {
						bc = BDict[XEBOrder2[i]];

						//Check if bc is an object
						// - protects if user specified a non-existant buttons
						// - IE causes a javascript error when viewing a page
						if (typeof bc === 'object') {
							customTools[ XEBOrder2[i] ] = {
								label: bc[1],
								type: 'button',
								icon:  bc[0],
								action: {
									type: 'encapsulate',
									options: {
										pre: bc[2],
										peri: bc[4],
										post: bc[3]
									}
								}
							};
						}
					}

					$('#wpTextbox1').wikiEditor( 'addToToolbar', {
						'sections': {
							'extra': {
								'type': 'toolbar',
								'label': 'Extras'
							}
						},
						'section': 'extra',
						'groups': {
							'my-buttons': {
								'label': 'My buttons',
								'tools': customTools
							}
						}
					} );
				});

			} );
		} else {
                    if (mw.toolbar) {
			// Use the old edit toolbar
			// Add the MediaWiki standard buttons into the available buttons
			/*$.each(mw.toolbar.buttons, function( b, value ){
				// add standard buttons for full XEB order changing
				//	BDict[b]=[];
				BDict[b] = [ value.imageFile, value.speedTip, value.tagOpen, value.tagClose, value.sampleText];

				// for (d in value) {BDict[b].push(value}[d]);
			});*/

			// Build the new buttons
			for (i = 0; i < XEBOrder2.length; i++) {
				bc = BDict[XEBOrder2[i]];

				//Check if bc is an object
				// - protects if user specified a non-existant buttons
				// - IE causes a javascript error when viewing a page
				if (typeof bc === 'object') {

					//Call addButton from module mediawiki.action.edit
					mw.toolbar.addButton(bc[0], bc[1], bc[2], bc[3], bc[4] /* , imageId, selectText */ );
				}
			}

			// Remove the default buttons (if requested by the user)
			//eraseButtons();
		   }
                   else {
                      //alert("mw.toolbar was not loaded in time for the custom editing toolbar.");
                   }
                }
        } );
}


/** en: Removes arbitrary standard buttons from the toolbar
 * @author: [[:de:User:Olliminatore]]
 * @version: 0.1 (01.10.2006) **/

/*function eraseButtons() {
	var x, i, enExtraButtons;

	//Remove the buttons the user doesn't want
	if (typeof rmEditButtons !== 'object') {
		return;
	}

	if (typeof rmEditButtons[0] === 'string' && rmEditButtons[0].toLowerCase() === 'all') {
		// English Wikipedia creates 11 extra buttons which are stored in mwCustomEditButtons
		// rather than mw.toolbar.buttons. However, there is no guarantee it will always be 11
		// so we count them here.
		enExtraButtons = window.mwCustomEditButtons.length;

		mw.toolbar.buttons = [];
		for (i = 0; i < enExtraButtons; i++) {
			window.mwCustomEditButtons.shift();
		}
	}
	//Sort the user's requests so we remove the button with the highest index first
	//- This ensures we remove the buttons the user expects whatever order he requested the buttons in
	window.rmEditButtons.sort(sortit);

	//Remove individual buttons the user doesn't want
	for (i = 0; i < rmEditButtons.length; i++) {
		var n = rmEditButtons[i];
		//Standard Wikimedia buttons
		if (n >= 0 && n < mw.toolbar.buttons.length) {
			if (n < mw.toolbar.buttons.length) {
				x = -1;
				while ((++x) < mw.toolbar.buttons.length) {
					if (x >= n) {
						mw.toolbar.buttons[x] = mw.toolbar.buttons[x + 1];
					}
				}
			}
			mw.toolbar.buttons.pop();
		}
		//Extra buttons in English Wikipedia
		n = n - mw.toolbar.buttons.length;
		if (n > 0 && n < window.mwCustomEditButtons.length) {
			if (n < window.mwCustomEditButtons.length) {
				x = -1;
				while ((++x) < window.mwCustomEditButtons.length) {
					if (x >= n) {
						window.mwCustomEditButtons[x] = window.mwCustomEditButtons[x + 1];
					}
				}
			}
			window.mwCustomEditButtons.pop();
		}
	}
}*/

//Function:
//	sortit
//Purpose:
//	Used to sort the rmEditButtons array into descending order
function sortit(a, b) {
	return (b - a);
}


//Function:
//Purpose:
//	Adds extended onclick-function to some buttons
function extendButtons() {

	var allEditButtons = document.getElementById('toolbar');
	if ( !allEditButtons ) {
		return false;
	}
	if (typeof editform !== 'undefined') {
		if (!(window.editform = document.forms.editform)) {
			return false;
		}
	}

	//  table
	extendAButton(Isrc + '8/80/Button_smart_table.png',XEBPopupTable)
	extendAButton(Isrc + 'e/ef/Button_reflink_start.png',XEBPopupRef)
	extendAButton(Isrc + 'b/b8/Button_Globe.png', XEBPopupGeoLink);
	extendAButton(Isrc + '4/49/Button_talk.png', XEBPopupTalk);
	extendAButton(Isrc + 'c/cc/Button_adv_image.png',XEBPopupImage);
	extendAButton(Isrc + 'b/b4/Button_BSL_func.png',XEBPopupBSLfunc);
	extendAButton(Isrc + '6/62/Button_BSL_var.png',XEBPopupBSLvar);
	//extendAButton(Isrc+'d/d6/Button_superscript.png',XEBPopupFormattedText);

	// redirect -##IE doesn't like this line. Object doesn't support this property or method
	//c=XEBOrder2.getIndex('V');

	//	if(c != -1)
	//		allEditButtons[bu_len+c].onclick=function(){
	//		var a='#REDIRECT \[\['+prompt("Which page do you want to redirect to\?")+'\]\]';
	//		document.editform.elements['wpTextbox1'].value=a;
	//		document.editform.elements['wpSummary'].value=a;
	//		document.editform.elements['wpWatchthis'].checked=false
	//  };
}

function extendAButton(url, newfunc) {
	var i;
	var allEditButtons = document.getElementById('toolbar');
	if ( !allEditButtons ) {
		return false;
	}
	if (typeof editform !== 'undefined') {
		if (!(window.editform = document.forms.editform)) {
			return false;
		}
	}
	allEditButtons = allEditButtons.getElementsByTagName('img');

	for (i = 0; i < allEditButtons.length; i++) {
                if (allEditButtons[i].src.indexOf(url) != -1) {
		//if (allEditButtons[i].src === url) { // Cannot work because "url" does not start with "http://"; using indexOf() instead. -Iritscen
			allEditButtons[i].onclick = newfunc;
		}
	}
}

//==========================================================================================================
// General purpose popup code
//==========================================================================================================

function getXEBPopupDiv(name) {
	var XEBMainDiv = document.getElementById('XEB');
	if (XEBMainDiv === null) {
		XEBMainDiv = document.createElement('div');
		document.body.appendChild(XEBMainDiv);
		XEBMainDiv.id = 'XEB';
	}

	var me = document.getElementById('XEBPopup' && name);
	if (me !== null) {
		return me;
	}
	me = document.createElement('div');
	XEBMainDiv.appendChild(me);

	me.id = 'XEBPopup';
	me.style.position = 'absolute';
	me.display = 'none';
	me.visibility = 'hidden';
	//me.onmouseout = CheckHideXEBPopup;
	//me.onmouseover = cancelHidePopup;
	return me;
}

//Function:
//	CheckHideXEBPopup
//Purpose:
//	Looks at the cursor position and if it has moved outside the popup it will close the popup
//Called:
//	When the onMouseEvent is fired on the popup

function CheckHideXEBPopup(e) {
	var x, y, ph, s, pl, pt, pw;
	var m = document.getElementById('XEBmnu');
	if (typeof is_gecko !== 'undefined' && is_gecko) {
		ph = m.offsetHeight;
		x = e.clientX + window.scrollX;
		y = e.clientY + window.scrollY;
		s = window.getComputedStyle(m, '');
		ph = s.height;
		ph = Number(ph.substring(0, ph.length - 2));
	} else {
		x = event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
		y = event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
		ph = m.offsetHeight;
	}
	pl = curPopup.x;
	pt = curPopup.y;
	pw = m.style.width;
	pw = Number(pw.substring(0, pw.length - 2));

	if (x > (pl + 2) && x < (pl + pw - 5) && y > (pt + 2) && y < (pt + ph - 5)) {
		return;
	}
	curPopup.hideTimeout = setTimeout(hideXEBPopup, XEBHideDelay * 1000);
}

function cancelHidePopup() {
	clearTimeout(curPopup.hideTimeout);
}

function hideXEBPopup() {
	var XEBMainDiv = document.getElementById('XEB');
	var m = document.getElementById('XEBPopup');
	XEBMainDiv.removeChild(m);
}

function XEBstartDrag(e) {
	var m = new GetPos(e || event);
	curPopup.startDrag.mouse = m;
	curPopup.startDrag.floatpopup.y = parseInt(curPopup.div.style.top, 10);
	curPopup.startDrag.floatpopup.x = parseInt(curPopup.div.style.left, 10);
	curPopup.dragging = true;
}

function XEBstopDrag(e) {
	if (curPopup.dragging === false) {
		return;
	}
	curPopup.dragging = false;
}

function XEBDrag(e) {
	if (curPopup.dragging === false) {
		return;
	}

	var m = new GetPos(e || event);
	var x = parseInt(curPopup.startDrag.floatpopup.x + (m.x - curPopup.startDrag.mouse.x), 10);
	var y = parseInt(curPopup.startDrag.floatpopup.y + (m.y - curPopup.startDrag.mouse.y), 10);

	curPopup.div.style.top = y + 'px';
	curPopup.div.style.left = x + 'px';

	curPopup.x = x;
	curPopup.y = y;
}

//=============================================================================
// Popup: Table
//=============================================================================

function XEBPopup(name, x, y) {
	// Make sure the popup can appear on the screen
	this.IESelectedRange = XEBgetIESelectedRange();

	var winW = (typeof is_gecko !== 'undefined' && is_gecko) ? window.innerWidth : document.body.offsetWidth;
	if ((winW - this.width) < x) {
		x = (winW - this.width - 60);
	}

	this.div = getXEBPopupDiv(name);
	this.div.style.zIndex = 2000;
	this.div.display = 'inline';
	this.div.visibility = 'visible';
	this.div.style.top = y + 'px';
	this.x = x;
	this.y = y;
	this.name = name;

	this.startDrag = {};
	this.startDrag.floatpopup = {};
}

function setInnerHTML(html, title) {
	var i;
	var winW = (typeof is_gecko !== 'undefined' && is_gecko) ? window.innerWidth : document.body.offsetWidth;
	if ((winW - this.width) < this.x) {
		this.x = (winW - this.width);
	}
	this.div.style.left = this.x + 'px';

	var mt = '<div id="XEBmnu" style="width:' + this.width + 'px" >';
	mt += '<div id="XEBmnuTitle" class="XEBPopupTitle" onmousedown="XEBstartDrag(event)" onmouseup="XEBstopDrag(event)" onmousemove="XEBDrag(event)">' + title + '</div>';
	mt += html;
	mt += '</div>';
	this.div.innerHTML = mt;
	//Turn off autocomplete. If the mouse moves over the autocomplete popup then x,y in CheckHidePopup is relative to the
	// autocomplete popup and our popup is hidden
	var InTexts = this.div.getElementsByTagName('input');
	for (i = 0; i < InTexts.length; i++) {
		var theInput = InTexts[i];
		if (theInput.type === 'text') {
			theInput.setAttribute('autocomplete', 'off');
		}
	}
	//Add rollover features to menu items. Doing it here means we don't have to do it for each menu
	var x = XEBgetElementsByClassName(this.div, 'XEBMnuItm', 'span');
	for (i = 0; i < x.length; i++) {
		var theItm = x[i];
		theItm.onmouseout = XEBMenuMouseOut;
		theItm.onmouseover = XEBMenuMouseOver;
	}

	this.div.style.borderWidth = 'thin';
	this.div.style.borderStyle = 'solid';
	this.div.style.backgroundColor = '#D0D0D0';
}
XEBPopup.prototype.width = 250;
XEBPopup.prototype.dragging = false;
XEBPopup.prototype.setInnerHTML = setInnerHTML;

var curPopup;

function GetPos(e) {
	this.x = e.clientX - 10 + document.documentElement.scrollLeft + document.body.scrollLeft;
	this.y = e.clientY - 10 + document.documentElement.scrollTop + document.body.scrollTop;
}

function XEBPopupTable(e) {
	var m = new GetPos(e || event);

	curPopup = new XEBPopup('table', m.x, m.y);

	var mt = '<p>Enter the table parameters below: <\/p>' +
		'<form name="XEBPopupTableForm">' +
		'Table caption: <input type="checkbox" name="inputCaption"><p\/>' +
		'Table alignment: center<input type="checkbox" name="inputAlign"><p\/>' +
		'Table headline: colored<input type="checkbox" name="inputHead"><p\/>' +
		'Number of rows: <input type="text" name="inputRow" value="3" size="2"><p\/>' +
		'Number of columns: <input type="text" name="inputCol" value="3" size="2"><p\/>' +
		// 'Alternating grey lines: <input type="checkbox" name="inputLine" checked="1" ><p\/>' +
		'Item column: <input type="checkbox" name="inputItems" ><p\/>' +
		'Sortable: <input type="checkbox" name="inputSort" ><p\/>' +
		'<\/form>' +
		'<i>The default table allows for fields and values only.<\/i><p\/>' +
		'Check "Item column" to allow for the table to have fields, items, and values.<\/i><p\/>' +
		'<p><button onClick="javascript:insertTableCode()">Insert</button>' +
		'<button onClick="hideXEBPopup()">Cancel</button>';

	curPopup.setInnerHTML(mt, "Table parameters");

	return true;
}

function insertTableCode() {
	var i;
	var f = document.XEBPopupTableForm;
	var caption = (f.inputCaption.checked) ? '|+ TABLE CAPTION \n' : '';
	var exhead = (f.inputHead.checked) ? '|- style="background: #DDFFDD;"\n' : '';
	var nbRow = parseInt(f.inputRow.value, 10);
	var nbCol = parseInt(f.inputCol.value, 10);
	var exfield = f.inputItems.checked;
	var align = (f.inputAlign.checked) ? 'align="center"' : '';

	var code = '\n';
	code += '{| ' + align + ' ';
	code += (f.inputSort.checked) ? 'class="wikitable sortable" \n' : '\n';
	code += caption + exhead;
	if (exfield) {
		code += '!\n';
	}
	for (i = 1; i < nbCol + 1; i++) {
		code += '! COLUMN ' + i + '\n';
	}
	var items = 0;
	for (var j = 0; j < nbRow; j++) {
		if (exfield) {
			items++;
			code += '|-\n! style="background: #FFDDDD;"|ITEM ' + items + '\n';
		} else {
			code += '|-\n';
		}
		for (i = 0; i < nbCol; i++) {
			code += '| Element ' + i + '\n';
		}
	}
	code += '|}\n';
	hideXEBPopup();
	mw.toolbar.insertTags('', '', code);
	extendSummary('table');

	return false;
}

//=============================================================================
// Popup: BSL Function Template Wizard
//=============================================================================

function XEBPopupBSLfunc(e)
{
	var m = new GetPos(e || event);

	curPopup = new XEBPopup('bslfunc', m.x, m.y + 22); // make pop-up 22px below cursor (height of button bar)

        /* Set width of popup (height has to be set in Live.css); labels on left are 115px,
           and each column requires 150px as long as Name field is "size 20"; the 8 arguments
           are broken into two rows, so that means the first row has five columns: Name and
           arguments 1-4 */
	XEBPopup.prototype.width = 115 + (150 * 5);

	var mt = '<form name="XEBPopupBSLFuncForm" id="XEBFormBSLFunc">' +
		'<div id="bsl_platform_label">Platform(s):</div>' +
		'<div id="bsl_platform_mac"><input type="checkbox" id="mac_ckbox" name="inputMac" checked><label for="mac_ckbox">Mac</label></div>' +
		'<div id="bsl_platform_win"><input type="checkbox" id="win_ckbox" name="inputWin" checked><label for="win_ckbox">Win</label></div>' +
		'<div id="bsl_func_label">Function</div>' +
		'<div id="bsl_arg1_label">Argument 1</div>' +
		'<div id="bsl_arg2_label">Argument 2</div>' +
		'<div id="bsl_arg3_label">Argument 3</div>' +
		'<div id="bsl_arg4_label">Argument 4</div>' +
		'<div id="bsl_arg5_label">Argument 5</div>' +
		'<div id="bsl_arg6_label">Argument 6</div>' +
		'<div id="bsl_arg7_label">Argument 7</div>' +
		'<div id="bsl_arg8_label">Argument 8</div>' +
		'<div id="bsl_optional_label1">Optional Arg.:</div>' +
		'<div id="bsl_optional_label2">Optional Arg.:</div>' +
		'<div id="bsl_optional_arg1"><input type="checkbox" name="inputArg1Opt"></div>' +
		'<div id="bsl_optional_arg2"><input type="checkbox" name="inputArg2Opt"></div>' +
		'<div id="bsl_optional_arg3"><input type="checkbox" name="inputArg3Opt"></div>' +
		'<div id="bsl_optional_arg4"><input type="checkbox" name="inputArg4Opt"></div>' +
		'<div id="bsl_optional_arg5"><input type="checkbox" name="inputArg5Opt"></div>' +
		'<div id="bsl_optional_arg6"><input type="checkbox" name="inputArg6Opt"></div>' +
		'<div id="bsl_optional_arg7"><input type="checkbox" name="inputArg7Opt"></div>' +
		'<div id="bsl_optional_arg8"><input type="checkbox" name="inputArg8Opt"></div>' +
		'<div id="bsl_type_label1">Type:</div>' +
		'<div id="bsl_type_label2">Type:</div>' +
		'<div id="bsl_type_func"><select name="inputFuncType"><option value="void">void</option><option value="bool">bool</option><option value="int">int</option><option value="float">float</option><option value="string">string</option></select></div>' +
		'<div id="bsl_type_arg1"><select name="inputArg1Type"><option value="void">void</option><option value="bool">bool</option><option value="int">int</option><option value="float">float</option><option value="string">string</option></select></div>' +
		'<div id="bsl_type_arg2"><select name="inputArg2Type"><option value="void">void</option><option value="bool">bool</option><option value="int">int</option><option value="float">float</option><option value="string">string</option></select></div>' +
		'<div id="bsl_type_arg3"><select name="inputArg3Type"><option value="void">void</option><option value="bool">bool</option><option value="int">int</option><option value="float">float</option><option value="string">string</option></select></div>' +
		'<div id="bsl_type_arg4"><select name="inputArg4Type"><option value="void">void</option><option value="bool">bool</option><option value="int">int</option><option value="float">float</option><option value="string">string</option></select></div>' +
		'<div id="bsl_type_arg5"><select name="inputArg5Type"><option value="void">void</option><option value="bool">bool</option><option value="int">int</option><option value="float">float</option><option value="string">string</option></select></div>' +
		'<div id="bsl_type_arg6"><select name="inputArg6Type"><option value="void">void</option><option value="bool">bool</option><option value="int">int</option><option value="float">float</option><option value="string">string</option></select></div>' +
		'<div id="bsl_type_arg7"><select name="inputArg7Type"><option value="void">void</option><option value="bool">bool</option><option value="int">int</option><option value="float">float</option><option value="string">string</option></select></div>' +
		'<div id="bsl_type_arg8"><select name="inputArg8Type"><option value="void">void</option><option value="bool">bool</option><option value="int">int</option><option value="float">float</option><option value="string">string</option></select></div>' +
		'<div id="bsl_name_label1">Name:</div>' +
		'<div id="bsl_name_label2">Name:</div>' +
		'<div id="bsl_name_func"><input type="text" name="inputFuncName" value="" size="20"></div>' +
		'<div id="bsl_name_arg1"><input type="text" name="inputArg1Name" value="" size="20"></div>' +
		'<div id="bsl_name_arg2"><input type="text" name="inputArg2Name" value="" size="20"></div>' +
		'<div id="bsl_name_arg3"><input type="text" name="inputArg3Name" value="" size="20"></div>' +
		'<div id="bsl_name_arg4"><input type="text" name="inputArg4Name" value="" size="20"></div>' +
		'<div id="bsl_name_arg5"><input type="text" name="inputArg5Name" value="" size="20"></div>' +
		'<div id="bsl_name_arg6"><input type="text" name="inputArg6Name" value="" size="20"></div>' +
		'<div id="bsl_name_arg7"><input type="text" name="inputArg7Name" value="" size="20"></div>' +
		'<div id="bsl_name_arg8"><input type="text" name="inputArg8Name" value="" size="20"></div>' +
		'<div id="bsl_default_label1">Default Value:</div>' +
		'<div id="bsl_default_label2">Default Value:</div>' +
		'<div id="bsl_default_func"><input type="text" name="inputFuncDefault" value="" size="10"></div>' +
		'<div id="bsl_default_arg1"><input type="text" name="inputArg1Default" value="" size="10"></div>' +
		'<div id="bsl_default_arg2"><input type="text" name="inputArg2Default" value="" size="10"></div>' +
		'<div id="bsl_default_arg3"><input type="text" name="inputArg3Default" value="" size="10"></div>' +
		'<div id="bsl_default_arg4"><input type="text" name="inputArg4Default" value="" size="10"></div>' +
		'<div id="bsl_default_arg5"><input type="text" name="inputArg5Default" value="" size="10"></div>' +
		'<div id="bsl_default_arg6"><input type="text" name="inputArg6Default" value="" size="10"></div>' +
		'<div id="bsl_default_arg7"><input type="text" name="inputArg7Default" value="" size="10"></div>' +
		'<div id="bsl_default_arg8"><input type="text" name="inputArg8Default" value="" size="10"></div>' +
		'<div id="bsl_alt_label1">Alternate Arg.:</div>' +
		'<div id="bsl_alt_label2">Alternate Arg.:</div>' +
		'<div id="bsl_alt_arg1"><input type="checkbox" name="inputArg1Alt"></div>' +
		'<div id="bsl_alt_arg2"><input type="checkbox" name="inputArg2Alt"></div>' +
		'<div id="bsl_alt_arg3"><input type="checkbox" name="inputArg3Alt"></div>' +
		'<div id="bsl_alt_arg4"><input type="checkbox" name="inputArg4Alt"></div>' +
		'<div id="bsl_alt_arg5"><input type="checkbox" name="inputArg5Alt"></div>' +
		'<div id="bsl_alt_arg6"><input type="checkbox" name="inputArg6Alt"></div>' +
		'<div id="bsl_alt_arg7"><input type="checkbox" name="inputArg7Alt"></div>' +
		'<div id="bsl_alt_arg8"><input type="checkbox" name="inputArg8Alt"></div>' +
		'<div id="bsl_alttype_label1">Alt. Arg. Type:</div>' +
		'<div id="bsl_alttype_label2">Alt. Arg. Type:</div>' +
		'<div id="bsl_alttype_arg1"><select name="inputArg1AltType"><option value="void">void</option><option value="bool">bool</option><option value="int">int</option><option value="float">float</option><option value="string">string</option></select></div>' +
		'<div id="bsl_alttype_arg2"><select name="inputArg2AltType"><option value="void">void</option><option value="bool">bool</option><option value="int">int</option><option value="float">float</option><option value="string">string</option></select></div>' +
		'<div id="bsl_alttype_arg3"><select name="inputArg3AltType"><option value="void">void</option><option value="bool">bool</option><option value="int">int</option><option value="float">float</option><option value="string">string</option></select></div>' +
		'<div id="bsl_alttype_arg4"><select name="inputArg4AltType"><option value="void">void</option><option value="bool">bool</option><option value="int">int</option><option value="float">float</option><option value="string">string</option></select></div>' +
		'<div id="bsl_alttype_arg5"><select name="inputArg5AltType"><option value="void">void</option><option value="bool">bool</option><option value="int">int</option><option value="float">float</option><option value="string">string</option></select></div>' +
		'<div id="bsl_alttype_arg6"><select name="inputArg6AltType"><option value="void">void</option><option value="bool">bool</option><option value="int">int</option><option value="float">float</option><option value="string">string</option></select></div>' +
		'<div id="bsl_alttype_arg7"><select name="inputArg7AltType"><option value="void">void</option><option value="bool">bool</option><option value="int">int</option><option value="float">float</option><option value="string">string</option></select></div>' +
		'<div id="bsl_alttype_arg8"><select name="inputArg8AltType"><option value="void">void</option><option value="bool">bool</option><option value="int">int</option><option value="float">float</option><option value="string">string</option></select></div>' +
		'<div id="bsl_altname_label1">Alt. Arg. Name:</div>' +
		'<div id="bsl_altname_label2">Alt. Arg. Name:</div>' +
		'<div id="bsl_altname_arg1"><input type="text" name="inputArg1AltName" value="" size="20"></div>' +
		'<div id="bsl_altname_arg2"><input type="text" name="inputArg2AltName" value="" size="20"></div>' +
		'<div id="bsl_altname_arg3"><input type="text" name="inputArg3AltName" value="" size="20"></div>' +
		'<div id="bsl_altname_arg4"><input type="text" name="inputArg4AltName" value="" size="20"></div>' +
		'<div id="bsl_altname_arg5"><input type="text" name="inputArg5AltName" value="" size="20"></div>' +
		'<div id="bsl_altname_arg6"><input type="text" name="inputArg6AltName" value="" size="20"></div>' +
		'<div id="bsl_altname_arg7"><input type="text" name="inputArg7AltName" value="" size="20"></div>' +
		'<div id="bsl_altname_arg8"><input type="text" name="inputArg8AltName" value="" size="20"></div>' +
		'<\/form>' +
		'<div id="bsl_notes"><i>Enter the name and type of the function, and the info for any arguments that it can take. If an argument can take one of two forms, check the "Alternate Arg." box and supply the information for the second form of that argument. If an argument can be optionally supplied, check the "Optional Arg." box.<\/i></div><p\/>' +
		'<div id="bsl_buttons"><p><button onClick="javascript:insertBSLFuncCode()">Insert</button>' +
		'<button onClick="hideXEBPopup()">Cancel</button></div>';

	curPopup.setInnerHTML(mt, "BSL function information");

	return true;
}

function insertBSLFuncCode()
{
	var f = document.XEBPopupBSLFuncForm;

	var call = '{{BSLjunc\n';
	call += '|tableform={{{tableform|no}}}\n';
	call += '|group={{{group}}}\n';
	call += '|kind=func\n';
	call += '|type=' + f.inputFuncType.value + '\n';
	call += '|default=' + f.inputFuncDefault.value + '\n';
	call += '|name=' + f.inputFuncName.value + '\n';
	if (!f.inputMac.checked) call += '|mac=no\n';
	if (!f.inputWin.checked) call += '|win=no\n';

	if (f.inputArg1Name.value)
	{
		if (f.inputArg1Opt.checked) call += '|arg1optional=yes\n';
		call += '|arg1default=' + f.inputArg1Default.value + '\n';
		call += '|arg1type=' + f.inputArg1Type.value + '\n';
		call += '|arg1name=' + f.inputArg1Name.value + '\n';
		if (f.inputArg1Alt.checked)
		{
			call += '|arg1alttype=' + f.inputArg1AltType.value + '\n';
			call += '|arg1altname=' + f.inputArg1AltName.value + '\n';
		}
	}

	if (f.inputArg2Name.value)
	{
		if (f.inputArg2Opt.checked) call += '|arg2optional=yes\n';
		call += '|arg2default=' + f.inputArg2Default.value + '\n';
		call += '|arg2type=' + f.inputArg2Type.value + '\n';
		call += '|arg2name=' + f.inputArg2Name.value + '\n';
		if (f.inputArg2Alt.checked)
		{
			call += '|arg2alttype=' + f.inputArg2AltType.value + '\n';
			call += '|arg2altname=' + f.inputArg2AltName.value + '\n';
		}
	}

	if (f.inputArg3Name.value)
	{
		if (f.inputArg3Opt.checked) call += '|arg3optional=yes\n';
		call += '|arg3default=' + f.inputArg3Default.value + '\n';
		call += '|arg3type=' + f.inputArg3Type.value + '\n';
		call += '|arg3name=' + f.inputArg3Name.value + '\n';
		if (f.inputArg3Alt.checked)
		{
			call += '|arg3alttype=' + f.inputArg3AltType.value + '\n';
			call += '|arg3altname=' + f.inputArg3AltName.value + '\n';
		}
	}

	if (f.inputArg4Name.value)
	{
		if (f.inputArg4Opt.checked) call += '|arg4optional=yes\n';
		call += '|arg4default=' + f.inputArg4Default.value + '\n';
		call += '|arg4type=' + f.inputArg4Type.value + '\n';
		call += '|arg4name=' + f.inputArg4Name.value + '\n';
		if (f.inputArg4Alt.checked)
		{
			call += '|arg4alttype=' + f.inputArg4AltType.value + '\n';
			call += '|arg4altname=' + f.inputArg4AltName.value + '\n';
		}
	}

	if (f.inputArg5Name.value)
	{
		if (f.inputArg5Opt.checked) call += '|arg5optional=yes\n';
		call += '|arg5default=' + f.inputArg5Default.value + '\n';
		call += '|arg5type=' + f.inputArg5Type.value + '\n';
		call += '|arg5name=' + f.inputArg5Name.value + '\n';
		if (f.inputArg5Alt.checked)
		{
			call += '|arg5alttype=' + f.inputArg5AltType.value + '\n';
			call += '|arg5altname=' + f.inputArg5AltName.value + '\n';
		}
	}

	if (f.inputArg6Name.value)
	{
		if (f.inputArg6Opt.checked) call += '|arg6optional=yes\n';
		call += '|arg6default=' + f.inputArg6Default.value + '\n';
		call += '|arg6type=' + f.inputArg6Type.value + '\n';
		call += '|arg6name=' + f.inputArg6Name.value + '\n';
		if (f.inputArg6Alt.checked)
		{
			call += '|arg6alttype=' + f.inputArg6AltType.value + '\n';
			call += '|arg6altname=' + f.inputArg6AltName.value + '\n';
		}
	}

	if (f.inputArg7Name.value)
	{
		if (f.inputArg7Opt.checked) call += '|arg7optional=yes\n';
		call += '|arg7default=' + f.inputArg7Default.value + '\n';
		call += '|arg7type=' + f.inputArg7Type.value + '\n';
		call += '|arg7name=' + f.inputArg7Name.value + '\n';
		if (f.inputArg7Alt.checked)
		{
			call += '|arg7alttype=' + f.inputArg7AltType.value + '\n';
			call += '|arg7altname=' + f.inputArg7AltName.value + '\n';
		}
	}

	if (f.inputArg8Name.value)
	{
		if (f.inputArg8Opt.checked) call += '|arg8optional=yes\n';
		call += '|arg8default=' + f.inputArg8Default.value + '\n';
		call += '|arg8type=' + f.inputArg8Type.value + '\n';
		call += '|arg8name=' + f.inputArg8Name.value + '\n';
		if (f.inputArg8Alt.checked)
		{
			call += '|arg8alttype=' + f.inputArg8AltType.value + '\n';
			call += '|arg8altname=' + f.inputArg8AltName.value + '\n';
		}
	}
	
	call += '}}<noinclude>\n\n[[Category:BSL functions]]</noinclude>';
	hideXEBPopup();
	mw.toolbar.insertTags('', '', call);
	extendSummary('added ' + f.inputFuncName.value);

	return false;
}

//=============================================================================
// Popup: BSL Variable Template Wizard
//=============================================================================

function XEBPopupBSLvar(e)
{
	var m = new GetPos(e || event);

	curPopup = new XEBPopup('bslvar', m.x, m.y + 22); // make pop-up 22px below cursor (height of button bar)
	XEBPopup.prototype.width = 245;

	var mt = '<form name="XEBPopupBSLVarForm" id="XEBFormBSLVar">' +
		'<div id="bsl_var_platform_label">Platform(s):</div>' +
		'<div id="bsl_var_platform_mac"><input type="checkbox" id="mac_ckbox" name="inputVarMac" checked><label for="mac_ckbox">Mac</label></div>' +
		'<div id="bsl_var_platform_win"><input type="checkbox" id="win_ckbox" name="inputVarWin" checked><label for="win_ckbox">Win</label></div>' +
		'<div id="bsl_var_name_label">Name:</div>' +
		'<div id="bsl_var_name"><input type="text" name="inputVarName" value="" size="10"></div>' +
		'<div id="bsl_var_type_label">Type:</div>' +
		'<div id="bsl_var_type"><select name="inputVarType"><option value="bool">bool</option><option value="int">int</option><option value="float">float</option><option value="string">string</option></select></div>' +
		'<div id="bsl_var_default_label">Default:</div>' +
		'<div id="bsl_var_default"><input type="text" name="inputVarDefault" value="" size="10"></div>' +
		'<\/form>' +
		'<div id="bsl_var_notes"><i>Enter the name of the variable, its data type, and the default return value at level-load time (if known).<\/i></div><p\/>' +
		'<div id="bsl_var_buttons"><p><button onClick="javascript:insertBSLVarCode()">Insert</button>' +
		'<button onClick="hideXEBPopup()">Cancel</button></div>';

	curPopup.setInnerHTML(mt, "BSL variable information");

	return true;
}

function insertBSLVarCode()
{
	var f = document.XEBPopupBSLVarForm;

	var call = '{{BSLjunc\n';
	call += '|tableform={{{tableform|no}}}\n';
	call += '|group={{{group}}}\n';
	call += '|kind=var\n';
	call += '|name=' + f.inputVarName.value + '\n';
	call += '|type=' + f.inputVarType.value + '\n';
	call += '|default=' + f.inputVarDefault.value + '\n';
	if (!f.inputVarMac.checked) call += '|mac=no\n';
	if (!f.inputVarWin.checked) call += '|win=no\n';
	
	call += '}}<noinclude>\n\n[[Category:BSL variables]]</noinclude>';
	hideXEBPopup();
	mw.toolbar.insertTags('', '', call);
	extendSummary('added ' + f.inputVarName.value);

	return false;
}

// Get the text currently selected by user in the textAra
// This code is based on part of the insertTags function in wikibits.js

function XEBGetSelectedText() {
	var txtarea, theSelection;
	if (document.editform) {
		txtarea = document.editform.wpTextbox1;
	} else {
		// some alternate form? take the first one we can find
		var areas = document.getElementsByTagName('textarea');

		txtarea = areas[0];
	}
	// IE & Opera
	if (document.selection && (typeof is_gecko === 'undefined' || !is_gecko)) {
		theSelection = document.selection.createRange().text;
		if (!theSelection) {
			theSelection = '';
		}
	}
	// Mozilla
	else if (txtarea.selectionStart || txtarea.selectionStart === 0) {
		var replaced = false;
		var startPos = txtarea.selectionStart;
		var endPos = txtarea.selectionEnd;
		theSelection = (txtarea.value).substring(startPos, endPos);
		if (!theSelection) {
			theSelection = '';
		}
	}
	return theSelection;
}

//Notes:
//	IE loses the cursor position in the textarea when the popup is used.
//	So we save the cursor position here
function XEBgetIESelectedRange() {
	var IESel = {};
	var txtarea;
	if (document.editform) {
		txtarea = document.editform.wpTextbox1;
	} else {
		// some alternate form? take the first one we can find
		var areas = document.getElementsByTagName('textarea');

		txtarea = areas[0];
	}
	// IE & Opera
	if (document.selection && (typeof is_gecko === 'undefined' || !is_gecko)) {
		txtarea.focus();
		IESel.Rng = document.selection.createRange();
		return IESel;
	}
}

function XEBinsertText(beforeText, selText, afterText, IESelectedRange) {
	var newText = beforeText + selText + afterText;
	var txtarea, tr;
	if (document.editform) {
		txtarea = document.editform.wpTextbox1;
	} else {
		// some alternate form? take the first one we can find
		var areas = document.getElementsByTagName('textarea');
		txtarea = areas[0];
	}

	// IE
	if (document.selection && (typeof is_gecko === 'undefined' || !is_gecko)) {

		tr = IESelectedRange.Rng;
		tr.text = newText;
		txtarea.focus();
		//txtarea.caretpos=tr.duplicate();
		tr.select();

		return;

		// Mozilla
	} else if (txtarea.selectionStart || txtarea.selectionStart === 0) {
		var replaced = false;
		var startPos = txtarea.selectionStart;
		var endPos = txtarea.selectionEnd;

		if (endPos - startPos) {
			replaced = true;
		}
		var scrollTop = txtarea.scrollTop;
		//		var myText = (txtarea.value).substring(startPos, endPos);
		//		if (!myText) {
		//			myText=sampleText;
		//		}
		//		if (myText.charAt(myText.length - 1) == " ") { // exclude ending space char, if any
		//			subst = tagOpen + myText.substring(0, (myText.length - 1)) + tagClose + " ";
		//		} else {
		//			subst = tagOpen + myText + tagClose;
		//		}
		txtarea.value = txtarea.value.substring(0, startPos) + newText + txtarea.value.substring(endPos, txtarea.value.length);
		txtarea.focus();
		//set new selection
		if (!replaced) {
			var cPos = startPos + (newText.length);
			txtarea.selectionStart = cPos;
			txtarea.selectionEnd = cPos;
		} else {
			txtarea.selectionStart = startPos + beforeText.length;
			txtarea.selectionEnd = startPos + beforeText.length + selText.length;
		}
		txtarea.scrollTop = scrollTop;

		// All other browsers get no toolbar.
		// There was previously support for a crippled "help"
		// bar, but that caused more problems than it solved.
	}
	// reposition cursor if possible
	if (txtarea.createTextRange) {

		txtarea.caretPos = document.selection.createRange().duplicate();
		//txtarea.caretPos =IESelectedRange.Rng;
	}
	txtarea.focus();
}

function XEBPopupRef(e) {

	var m = new GetPos(e || event);

	curPopup = new XEBPopup('ref', m.x, m.y);
	curPopup.width = 300;
	var mt = '<p>Enter the reference parameters below: <\/p>' +
		'<form name="XEBPopupRefForm">' +
		'Name:<input type="text" name="refName" value="" size="10"><p\/>' +
		'Material:<input type="text" name="refMaterial" value="' + XEBGetSelectedText() +
		'" size="20">' +
		'<\/form>' +
		'<p><button onClick="javascript:insertRef()">Insert</button>' +
		'<button onClick="hideXEBPopup()">Cancel</button>';

	curPopup.setInnerHTML(mt, "Reference parameters");
	//	document.XEBPopupRefForm.refName.focus();
	return true;
}

function insertRef() {
	var f = document.XEBPopupRefForm;
	var refName = f.refName.value;
	var refMaterial = f.refMaterial.value;

	hideXEBPopup();
	var code1 = '<ref';
	code1 += (refName) ? ' name="' + refName + '">' : '>';
	var code2 = refMaterial;
	var code3 = '<\/ref>';
	XEBinsertText(code1, code2, code3, curPopup.IESelectedRange);

	extendSummary('ref');
	return false;
}

//===GEO LINK Function==================================================

function XEBPopupGeoLink(e) {
	var m = new GetPos(e || event);

	curPopup = new XEBPopup('geo', m.x, m.y);
	curPopup.width = 300;
	var mt = '<p>Enter the location parameters below: <\/p>' +
		'<form name="XEBPopupGeoLinkForm">' +
		'Location:<p\/>' +
		'<table style="background: transparent;">' +
		'<tr><td>Latitude:<\/td><td><input type="text" autocomplete="off" name="geoLatDeg" value="" size="4"><\/td>' +
		'<td><input type="text" name="geoLatMin" size="4"><\/td>' +
		'<td><input type="text" name="geoLatSec" size="4"><\/td>' +
		'<td><select name="geoLatNS"><option value="N">N<option value="S">S</select><\/td><\/tr>' +
		'<tr><td>Longitude:<\/td><td><input type="text" name="geoLonDeg" value="" size="4"><\/td>' +
		'<td><input type="text" name="geoLonMin" value="" size="4"><\/td>' +
		'<td><input type="text" name="geoLonSec" value="" size="4"><\/td>' +
		'<td><select name="geoLonEW"><option value="E">E<option value="W">W</select><\/td><\/tr>' +
		'<\/table>' +
		'Region:<input type="text" name="geoRegion" value="" size="4"><p\/>' +
		'Type:' +
		'<SELECT NAME="geoType" size="5">' +
		'<OPTION VALUE="country">Country<OPTION VALUE="state">State' +
		'<OPTION VALUE="adm1st">Admin unit, 1st level<OPTION VALUE="adm2st">Admin unit, 2nd level' +
		'<OPTION VALUE="city">City<OPTION VALUE="airport">Airport' +
		'<OPTION VALUE="mountain">Mountain<OPTION VALUE="isle">Isle' +
		'<OPTION VALUE="waterbody">Waterbody<OPTION VALUE="landmark" SELECTED>Landmark' +
		'<OPTION VALUE="forest">forest</SELECT><br>' +
		'Title: <input type="checkbox" name="geoTitle" ><p\/>' +
		'<\/form>' +
		'<p><button onClick="javascript:insertGeoLink()">Insert</button>' +
		'<button onClick="hideXEBPopup()">Cancel</button>';

	curPopup.setInnerHTML(mt, "Location parameters");
	document.paramForm.refName.focus();
	return true;

}
function insertGeoLink() {
	var f = document.XEBPopupGeoLinkForm;

	var code = '{{Coor ';
	if (f.geoTitle.checked) {
		code += 'title ';
	}
	var ft = 'dms';
	if (f.geoLatSec.value === '' && f.geoLonSec.value === '') {
		ft = 'dm';
	}
	if (ft === 'dm' && f.geoLatMin.value === '' && f.geoLonMin.value === '') {
		ft = 'd';
	}
	code += ft;
	code += '|' + f.geoLatDeg.value;
	code += (ft === 'dm' || ft === 'dms') ? '|' + f.geoLatMin.value : '';
	code += (ft === 'dms') ? '|' + f.geoLatSec.value : '';
	code += '|' + f.geoLatNS.value;
	code += '|' + f.geoLonDeg.value;
	code += (ft === 'dm' || ft === 'dms') ? '|' + f.geoLonMin.value : '';
	code += (ft === 'dms') ? '|' + f.geoLonSec.value : '';
	code += '|' + f.geoLonEW.value;
	code += '|type:' + f.geoType.value + '_region:' + f.geoRegion.value;
	code += '}}';
	mw.toolbar.insertTags('', '', code);
	extendSummary('geo-location');
	hideXEBPopup();
	return false;
}

//===Talk Page entry Function===========================================

function XEBPopupTalk(e) {
	var m = new GetPos(e || event);

	curPopup = new XEBPopup('talk', m.x, m.y);
	curPopup.width = 200;
	var mt = '<div style="font-size:medium"><p>Please choose:<\/p>';
	mt += '<span class="XEBMnuItm" onclick="XEBInsertTalk(1)">Test1<\/span><br>';
	mt += '<span class="XEBMnuItm" onclick="XEBInsertTalk(2)">Self Test<\/span><br>';
	mt += '<span class="XEBMnuItm" onclick="XEBInsertTalk(3)">Nonsense<\/span><br>';
	mt += '<span class="XEBMnuItm" onclick="XEBInsertTalk(4)">Please stop<\/span><br>';
	mt += '<span class="XEBMnuItm" onclick="XEBInsertTalk(5)">Last chance<\/span><br>';
	mt += '<span class="XEBMnuItm" onclick="XEBInsertTalk(6)">Blanking<\/span><br>';
	mt += '<span class="XEBMnuItm" onclick="XEBInsertTalk(7)">Blatant<\/span><br>';
	mt += '<span class="XEBMnuItm" ;onclick="XEBInsertTalk(8)">*BLOCKED*<\/span><br>';
	mt += '<span class="XEBMnuItm" onclick="XEBInsertTalk(9)">Spam<\/span><br>';
	mt += '<span class="XEBMnuItm" onclick="XEBInsertTalk(10)">Npov<\/span><br>';

	curPopup.setInnerHTML(mt, "Talk Page");

	return true;

}

function XEBInsertTalk(itm) {
	var code = {
		1: '{' + '{subst:test1-n|}}',
		2: '{' + '{subst:selftest-n|}}',
		3: '{' + '{subst:test2-n|}}',
		4: '{' + '{subst:test3-n|}}',
		5: '{' + '{subst:test4-n|}}',
		6: '{' + '{subst:test2a-n|}}',
		7: '{' + '{subst:bv-n|}}',
		8: '{' + '{subst:blantant|}}',
		9: '{' + '{subst:spam-n|}}',
		10: '{' + '{subst:NPOV user}}'
	};
	hideXEBPopup();
	mw.toolbar.insertTags('', '', code[ itm ]);
	return false;
}
function XEBPopupImage(e) {
	var m = new GetPos(e || event);

	curPopup = new XEBPopup('image', m.x, m.y);
	curPopup.width = 300;

	var mt = '<p>Enter the image parameters below: <\/p>' +
		'<form name="XEBPopupImageForm">' +
		'File:<input type="text" name="imgFile" value="' + XEBGetSelectedText() + '" size="30"><br>' +
		'Type:<SELECT NAME="imgType">' +
		'<OPTION VALUE="thumb">Thumbnail' +
		'<OPTION VALUE="frame">Frame' +
		'<OPTION VALUE="none">[not specified]' +
		'</SELECT><br>' +
		'Location:<SELECT NAME="imgLocation">' +
		'<OPTION VALUE="left">Left' +
		'<OPTION VALUE="center">Centre' +
		'<OPTION VALUE="right">Right' +
		'<OPTION VALUE="none">None' +
		'</SELECT><br>' +
		'Size:<input type="text" name="imgSize" value="100" size="3">px<br>' +
		'Caption:<input type="text" name="imgCaption" value="" size="30"><\/p>' +
		'<\/form>' +
		'<p><button onClick="javascript:XEBInsertImage()">Insert</button>' +
		'<button onClick="hideXEBPopup()">Cancel</button>';

	curPopup.setInnerHTML(mt, "Image Parameters");

	return true;
}

function XEBInsertImage() {
	var f = document.XEBPopupImageForm;
	hideXEBPopup();
	var code = '[[Image:';
	code += f.imgFile.value;
	code += '|' + f.imgType.value;
	code += '|' + f.imgLocation.value;
	code += '|' + f.imgSize.value;
	code += '|' + f.imgCaption.value;
	code += ']]';
	mw.toolbar.insertTags('', '', code);
	extendSummary('image');

	return false;
}

function XEBPopupFormattedText(e) {
	var m = new GetPos(e || event);

	curPopup = new XEBPopup('image', m.x, m.y);
	curPopup.width = 300;

	var mt = '<form name="XEBPopupImageForm">' +
		'<table  style="background: transparent;">' +
		'<tr><td>Bold:<\/td><td><input type="checkbox" name="textBold"><\/td>' +
		'<td>Superscript:<\/td><td><input type="checkbox" name="textSuperscript"><\/td><\/tr>' +
		'<tr><td>Italic:<\/td><td><input type="checkbox" name="textItalic"><\/td>' +
		'<td>Subscript:<\/td><td><input type="checkbox" name="textSubscript"><\/td><\/tr>' +
		'<tr><td>Strike:<\/td><td><input type="checkbox" name="textStrike"><\/td>' +
		'<td>&nbsp;<\/td><\/tr>' +
		'</table>' +
		'Size:<SELECT NAME="textSize">' +
		'<OPTION VALUE="small">small' +
		'<OPTION VALUE="normal">[Normal]' +
		'<OPTION VALUE="big">big' +
		'</SELECT><br><table style="background:transparent;"><tr><td>Colour:<\/td><td>' +
		'<table width="100px">' +
		'<tr><td colspan="4">None<\/td></tr>' +
		'<tr><td bgcolor="aqua">&nbsp;<\/td><td bgcolor="gray"> &nbsp;<\/td>' +
		'<td bgcolor="olive">&nbsp;<\/td><td bgcolor="navy">&nbsp;<\/td><\/tr>' +
		'<tr><td bgcolor="black">&nbsp;<\/td><td bgcolor="green"> &nbsp;<\/td>' +
		'<td bgcolor="purple">&nbsp;<\/td><td bgcolor="teal">&nbsp;<\/td><\/tr>' +
		'<tr><td bgcolor="blue">&nbsp;<\/td><td bgcolor="lime">&nbsp;<\/td>' +
		'<td bgcolor="red">&nbsp;<\/td><td bgcolor="white">&nbsp;<\/td><\/tr>' +
		'<tr><td bgcolor="fuchsia">&nbsp;<\/td><td bgcolor="maroon">&nbsp;<\/td>' +
		'<td bgcolor="silver">&nbsp;<\/td><td bgcolor="yellow">&nbsp;<\/td><\/tr>' +
		'</table><\/td><\/tr>' +
		'<\/form>' +
		'Sample:' +
		'<span id="sampleText">Text</span>"' +
		'<p><button onClick="javascript:XEBInsertFormattedText()">Insert</button>' +
		'<button onClick="hideXEBPopup()">Cancel</button>';

	curPopup.setInnerHTML(mt, "Text Format Options");

	return true;
}

function XEBUpdateSampleText() {
	var f = document.XEBPopupImageForm;
}

//====================

function XEBMenuMouseOut(e) {
	var targ;
	if (!e) {
		e = window.event;
	}
	if (e.target) {
		targ = e.target;
	} else if (e.srcElement) {
		targ = e.srcElement;
	}

	targ.style.color = 'black';
}

function XEBMenuMouseOver(e) {
	var targ;
	if (!e) {
		e = window.event;
	}
	if (e.target) {
		targ = e.target;
	} else if (e.srcElement) {
		targ = e.srcElement;
	}

	targ.style.color = 'red';
}

//=======================================================================
// Other functions
//=======================================================================

function XEBgetElementsByClassName(parent, clsName, htmltag) {
	var arr = [], elem;
	var elems = parent.getElementsByTagName(htmltag);
	for (var cls, i = 0;
	(elem = elems[i]); i++) {
		if (elem.className === clsName) {
			arr[arr.length] = elem;
		}
	}
	return arr;
}

function extendSummary(newText) {
	if (!XEBExtendEditSummary) {
		return;
	}
	var s = document.editform.elements.wpSummary.value;
	s += (s === '') ? newText : ' +' + newText;
	document.editform.elements.wpSummary.value = s;
}

function bug(msg) {
	if (mw.config.get( 'wgUserName' ) === 'MarkS') {
		alert(msg);
	}
}