/* global jQuery, mw, charinsertCustom */

window.updateEditTools = function {

jQuery( document ).ready( function ( $ ) {
	var $currentFocused,
		editTools;

 function getSelectedSection {
		var selectedSection = mw.storage.get( editTools.storageKey )
		
		return selectedSection;
 
 function saveSelectedSection( newIndex ) {
		mw.storage.set
 
 editTools = {
 // Entries prefixed with ␥ (U+2425 SYMBOL FOR DELETE FORM TWO) will not appear in the article namespace (namespace 0).
 // Please make any changes to MediaWiki:Edittools as well, however, instead of using the ␥ symbol, use || | }}.
 charinsert: {
 '기본': '· … – — ― | [+] [\[+]] {\{+}} 〈+〉 + ‘+’ “+” € † ← → ° ′ ″ ≈ ≒ ≠ ≤ ≥ ± − × ÷ ← → ·  {\{풀기:+}} 분류:+ #넘겨주기.[\[+]] {\{토막글|+}} {\{IPA|+}} {\{lang||+}} {\{llang||+}}',
 '위키문법': '삽입: · … – — ° ′ ″ ≈ ≠ ≤ ≥ ± − × ÷ ← → · § ␥~~\~~ 위키문법: {\{+}} {\{\{+}}} | [+] [\[+]] [\[분류:+]] #넘겨주기.[\[+]] &nbsp;  {\{풀기:+}} {\{첫가끝|+}}',
 '기호': '~ | ¡¿†‡↔↑↓•¶#∞ 〈+〉 + ‘+’ “+” ‹+› «+» ¤₳฿₵¢₡₢$₫₯€₠₣ƒ₴₭₤ℳ₥₦№₧₰£៛₨₪৳₮₩¥ ♠♣♥♦ ♭♯♮ ©®™ ◌',
 '로마자': 'A a Á á À à Â â Ä ä Ǎ ǎ Ă ă Ā ā Ã ã Å å Ą ą Æ æ Ǣ ǣ B b C c Ć ć Ċ ċ Ĉ ĉ Č č Ç ç D d Ď ď Đ đ Ḍ ḍ Ð ð E e É é È è Ė ė Ê ê Ë ë Ě ě Ĕ ĕ Ē ē Ẽ ẽ Ę ę Ẹ ẹ Ɛ ɛ Ǝ ǝ Ə ə F f G g Ġ ġ Ĝ ĝ Ğ ğ Ģ ģ H h Ĥ ĥ Ħ ħ Ḥ ḥ I i İ ı Í í Ì ì Î î Ï ï Ǐ ǐ Ĭ ĭ Ī ī Ĩ ĩ Į į Ị ị J j Ĵ ĵ K k Ķ ķ L l Ĺ ĺ Ŀ ŀ Ľ ľ Ļ ļ Ł ł Ḷ ḷ Ḹ ḹ M m Ṃ ṃ N n Ń ń Ň ň Ñ ñ Ņ ņ Ṇ ṇ Ŋ ŋ O o Ó ó Ò ò Ô ô Ö ö Ǒ ǒ Ŏ ŏ Ō ō Õ õ Ǫ ǫ Ọ ọ Ő ő Ø ø Œ œ Ɔ ɔ P p Q q R r Ŕ ŕ Ř ř Ŗ ŗ Ṛ ṛ Ṝ ṝ S s Ś ś Ŝ ŝ Š š Ş ş Ș ș Ṣ ṣ ß T t Ť ť Ţ ţ Ț ț Ṭ ṭ Þ þ U u Ú ú Ù ù Û û Ü ü Ǔ ǔ Ŭ ŭ Ū ū Ũ ũ Ů ů Ų ų Ụ ụ Ű ű Ǘ ǘ Ǜ ǜ Ǚ ǚ Ǖ ǖ V v W w Ŵ ŵ X x Y y Ý ý Ŷ ŷ Ÿ ÿ Ỹ ỹ Ȳ ȳ Z z Ź ź Ż ż Ž ž ß Ð ð Þ þ Ŋ ŋ Ə ə',
 '그리스 문자': 'ΆάΈέΉήΊίΌόΎύΏώ ΑαΒβΓγΔδ ΕεΖζΗηΘθ ΙιΚκΛλΜμ ΝνΞξΟοΠπ ΡρΣσςΤτΥυ ΦφΧχΨψΩω Ϝϝυ̯ι̯ ᾼᾳᾴᾺὰᾲᾶᾷἈἀᾈᾀἉἁᾉᾁἌἄᾌᾄἊἂᾊᾂἎἆᾎᾆἍἅᾍᾅἋἃᾋᾃἏἇᾏᾇ ῈὲἘἐἙἑἜἔἚἒἝἕἛἓ ῌῃῄῊὴῂῆῇἨἠᾘᾐἩἡᾙᾑἬἤᾜᾔἪἢᾚᾒἮἦᾞᾖἭἥᾝᾕἫἣᾛᾓἯἧᾟᾗ ῚὶῖἸἰἹἱἼἴἺἲἾἶἽἵἻἳἿἷΪϊΐῒῗ ῸὸὈὀὉὁὌὄὊὂὍὅὋὃ ῤῬῥ ῪὺῦὐὙὑὔὒὖὝὕὛὓὟὗΫϋΰῢῧ ῼῳῴῺὼῲῶῷὨὠᾨᾠὩὡᾩᾡὬὤᾬᾤὪὢᾪᾢὮὦᾮᾦὭὥᾭᾥὫὣᾫᾣὯὧᾯᾧ ᾹᾱᾸᾰῙῑῘῐῩῡῨῠ ',
 '키릴 문자': 'АаБбВвГг ҐґЃѓДдЂђ ЕеЁёЄєЖж ЗзЅѕИиІі ЇїЙйЈјКк ЌќЛлЉљМм НнЊњОоПп РрСсТтЋћ УуЎўФфХх ЦцЧчЏџШш ЩщЪъЫыЬь ЭэЮюЯя ӘәӨөҒғҖҗ ҚқҜҝҢңҮү ҰұҲҳҸҹҺһ ҔҕӢӣӮӯҘҙ ҠҡҤҥҪҫӐӑ ӒӓӔӕӖӗӰӱ ӲӳӸӹӀ ҞҟҦҧҨҩҬҭ ҴҵҶҷҼҽҾҿ ӁӂӃӄӇӈӋӌ ӚӛӜӝӞӟӠӡ ӤӥӦӧӪӫӴӵ ́',
 'IPA (영어)': 'ˈ ˌ ŋ ɡ tʃ dʒ ʃ ʒ θ ð ʔ ɑː ɒ æ aɪ aʊ ɛ eɪ ɪ iː ɔː ɔɪ oʊ ʊ uː ʌ ɜr ə ər ᵻ ᵿ ɒ̃ æ̃ {\{angle.bracket|+}} {\{IPA|+}} {\{IPA.링크|+}}',
 'IPA': '닿소리: ɱɳɲŋɴ : t̪ d̪ ʈɖɟɡɢʡʔ : ɸβθð ʃʒʂʐɕʑ çʝɣχʁ ħʕʜʢɦɧ : ʋɹɻɥɰʍ : ʙⱱɾɽʀ ɺ ɫɬɮɭʎʟ : ɓɗᶑʄɠʛ ʘǀǃǂǁ 홀소리: ɪʏɨʉɯʊ : øɘɵɤ ə ɚ ɛœɜɝɞʌɔ : æɶɐɑɒ Spacing_diacritics: ˈˌːˑʼˀˤᵝᵊᶢˠʰʱʲˡⁿᵑʷᶣ˞‿˕˔ Combining_diacritics: ̚ ̪ ̺ ̻ ̼ ̬ ̊ ̥ ̞ ̝ ̘ ̙ ̽ ̟ ̠ ̈ ̤ ̹ ̜ ̍ ̩ ̆ ̯ ̃ ̰ ͡ ͜ 성조: ̋ ́ ̄ ̀ ̏ ̌ ̂ ᷄ ᷅ ᷇ ᷆ ᷈ ᷉ ˥˦˧˨˩ꜛꜜ : ↗↘‖ extIPA: ͈ ͉ ͎ ̣ ̫ ͊ ᷽ ͇ : ˭ᵻᵿ {\{angle.bracket|+}} {\{IPA|+}} {\{IPA.링크|+}}',
 '수학·논리학': '− × ÷ ⋅ ° ∗ ∘ ± ∓ ≤ ≥ ≠ ≡ ≅ ≜ ≝ ≐ ≃ ≈ ⊕ ⊗ ⇐ ⇔ ⇒ ∞ ← ↔ → ≪ ≫ ∝ √ ∤ ≀ ◅ ▻ ⋉ ⋊ ⋈ ∴ ∵ ↦ ¬ ∧ ∨ ⊻ ∀ ∃ ∈ ∉ ∋ ⊆ ⊈ ⊊ ⊂ ⊄ ⊇ ⊉ ⊋ ⊃ ⊅ ∪ ∩ ∑ ∏ ∐ ′ ∫ ∬ ∭ ∮ ∇ ∂ ∆ ∅ ℂ ℍ ℕ ℙ ℚ ℝ ℤ ℵ ⌊ ⌋ ⌈ ⌉ ⊤ ⊥ ⊢ ⊣ ⊧ □ ∠ ⟨ ⟩  {\{수학|+}} {\{수학.변수|+}} {\{분수|+|}} {\{수직분수|+|}}'

 charinsertDivider: "\240",

 storageKey: 'edittoolscharsubset',

 createEditTools: function ( placeholder ) {
 var sel, id;
 var box = document.createElement( 'div' );
 var prevSubset = 0, curSubset = 0;
 box.id = 'editpage-specialchars';
 box.className = "nopopups";
 box.title = '편집 창에 입력할 글자 혹은 태그를 클릭하세요';

 // append user-defined sets
 if ( window.charinsertCustom ) {
 for ( id in charinsertCustom ) {
 if ( !editTools.charinsert[id] ) {
 editTools.charinsert[id] = '';

 // create drop-down select
 sel = document.createElement( 'select' );
 for ( id in editTools.charinsert ) {
 sel.options[sel.options.length] = new Option;
 sel.selectedIndex = 0;
 sel.style.marginRight = '.3em';
 sel.title = 'Choose character subset';
 sel.onchange = sel.onkeyup = selectSubset;
 box.appendChild( sel );

 // create "recall" switch
 if ( window.editToolsRecall ) {
 var recall = document.createElement( 'span' );
 recall.appendChild( document.createTextNode( '↕' ) ); // ↔
 recall.onclick = function {
 sel.selectedIndex = prevSubset;
 selectSubset;
 recall.style.cssFloat = 'left';
 recall.style.marginRight = '5px';
 recall.style.cursor = 'pointer';
 box.appendChild( recall );

			if ( getSelectedSection ) {
				sel.selectedIndex = getSelectedSection;

 placeholder.parentNode.replaceChild;
 selectSubset;
 return;

 function selectSubset {
 // remember previous (for "recall" button)
 prevSubset = curSubset;
 curSubset = sel.selectedIndex;
 //save into web storage for persistence
 saveSelectedSection( curSubset );
 
 //hide other subsets
 var pp = box.getElementsByTagName( 'p' ) ;
 for ( var i = 0; i < pp.length; i++ ) {
 pp[i].style.display = 'none';
 //show/create current subset
 var id = sel.options[curSubset].value;
 var p = document.getElementById( id );
 if ( !p ) {
 p = document.createElement( 'p' );
 p.className = 'nowraplinks';
 p.id = id;
 if ( id == 'Arabic' || id == 'Hebrew' ) {
 p.style.fontSize = '120%';
 p.dir = 'rtl';
 var tokens = editTools.charinsert[id];
 if ( window.charinsertCustom && charinsertCustom[id] ) {
 if ( tokens.length > 0 ) {
 tokens += ' ';
 tokens += charinsertCustom[id];
 editTools.createTokens;
 box.appendChild( p );
 p.style.display = 'inline';

 createTokens: function  {
 var tokens = str.split( ' ' ), token, i, n;
 for ( i = 0; i < tokens.length; i++ ) {
 token = tokens[i];
 n = token.indexOf( '+' );
 if ( token.charAt( 0 ) === '␥' ) {
 if ( token.length > 1 && mw.config.get( 'wgNamespaceNumber' ) === 0 ) {
 continue;
 token = token.substring( 1 );
 if ( token === '' || token === '_' ) {
 addText( editTools.charinsertDivider + ' ' );
 paragraph.appendChild( document.createElement( 'br' ) );
 paragraph.appendChild( document.createElement( 'hr' ) );
 addBold( token );
 addLink( token.substring( 1 ), '</' + token.substring( 2 ), token.substring( 1 ) );
 addLink( token.substring, token.substring( n+1 ) );
 for ( var j = 0; j < token.length; j++ ) {
 addLink( token.charAt( j ), '' );
 addLink;
 return;

 function addLink {
 var handler;
 var dle = tagOpen.indexOf( '\x10' );
 var a = document.createElement( 'a' );
 
 if ( dle > 0 ) {
 var path = tagOpen.substring( dle + 1 ).split( '.' );
 tagOpen = tagOpen.substring;
 handler = window;
 for ( var i = 0; i < path.length; i++ ) {
 handler = handler[path[i]];
	 $( a ).on;
 tagOpen = tagOpen.replace;
 tagClose = tagClose ? tagClose.replace : '';
 $( a ).on( 'click', {
 	tagOpen: tagOpen,
 	sampleText: '',
 	tagClose: tagClose

 name = name || tagOpen + tagClose;
 name = name.replace;
 a.appendChild( document.createTextNode( name ) );
 a.href = '';
 paragraph.appendChild( a );
 addText( ' ' );

 function addBold( text ) {
 var b = document.createElement( 'b' );
 b.appendChild( document.createTextNode( text.replace ) );
 paragraph.appendChild( b );
 addText( ' ' );
 function addText( txt ) {
 paragraph.appendChild( document.createTextNode( txt ) );
 function insertTags( e ) {
 	e.preventDefault;
 	if ( $currentFocused && $currentFocused.length && !$currentFocused.prop( 'readonly' ) ) {
					$currentFocused.textSelection;

 setup: function {
 var placeholder;
 if ( $( '#editpage-specialchars' ).length ) {
 placeholder = $( '#editpage-specialchars' )[0];
 placeholder = $( '' ).prependTo( '.mw-editTools' )[0];
 if ( !placeholder ) {
 return;
 if ( !window.charinsertDontMove ) {
 $( '.editOptions' ).before( placeholder );
 // Find the element that is focused
 $currentFocused = $( '#wpTextbox1' );
 // Apply to dynamically created textboxes as well as normal ones
			$( document ).on( 'focus', 'textarea, input:text', function {
				$currentFocused = $( this );

			// Used to determine where to insert tags
 editTools.createEditTools( placeholder );
 window.updateEditTools = function {
 editTools.createEditTools( $( '#editpage-specialchars' )[0] );

 editTools.setup;