﻿/* functions used by preferences and search */
function toggleMatchDiacritics(span) {
	var menuitem = span.parentNode
	var checkbox = menuitem.getElementsByTagName('input')[0]
	checkbox.checked = ! checkbox.checked
}

var UNACCENTED =
"ͰͱͲͳʹ͵Ͷͷ͸͹ͺͻͼͽ;Ϳ΀΁΂΃΄΅Α·ΕΗΙ΋Ο΍ΥΩϊΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩΪΫαεηιϋαβγδεζηθικλμνξοπρςστυφχψωϊϋουωϏ"
var UNACCENTEDEXT=
"ἀἁἀἁἀἁἀἁἈἉἈἉἈἉἈἉἐἑἐἑἐἑ἖἗ἘἙἘἙἘἙ἞἟ἠἡἠἡἠἡἠἡἨἩἨἩἨἩἨἩἰἱἰἱἰἱἰἱἸἹἸἹἸἹἸἹὀὁὀὁὀὁ὆὇ὈὉὈὉὈὉ὎὏ὐὑὐὑὐὑὐὑ὘Ὑ὚Ὑ὜Ὑ὞ὙὠὡὠὡὠὡὠὡὨὩὨὩὨὩὨὩααεεηηιιοουυωω὾὿ᾀᾁᾀᾁᾀᾁᾀᾁᾈᾉᾈᾉᾈᾉᾈᾉᾐᾑᾐᾑᾐᾑᾐᾑᾘᾙᾘᾙᾘᾙᾘᾙᾠᾡᾠᾡᾠᾡᾠᾡᾨᾩᾨᾩᾨᾩᾨᾩααᾳᾳᾳ᾵αᾳΑΑΑΑᾼ᾽ι᾿῀῁ῃῃῃ῅ηῃΕΕΗΗῌ῍῎῏ιιϊϊ῔῕ιϊΙΙΙΙ῜῝῞῟υυϋϋῤῥυϋΥΥΥΥῬ῭΅`῰῱ῳῳῳ῵ωῳΟΟΩΩῼ´῾῿"
var UNASPIRATEDEXT =
"ααὰὰάάᾶᾶΑΑᾺᾺΆΆἎἏεεὲὲέέ἖἗ΕΕῈῈΈΈ἞἟ηηὴὴήήῆῆΗΗῊῊΉΉἮἯιιὶὶίίῖῖΙΙῚῚΊΊἾἿοοὸὸόό὆὇ΟΟῸῸΌΌ὎὏υυὺὺύύῦῦ὘Υ὚Ὺ὜Ύ὞ὟωωὼὼώώῶῶΩΩῺῺΏΏὮὯὰάὲέὴήὶίὸόὺύὼώ὾὿ᾳᾳᾲᾲᾴᾴᾷᾷᾼᾼᾊᾋᾌᾍᾎᾏῃῃῂῂῄῄῇῇῌῌᾚᾛᾜᾝᾞᾟῳῳῲῲῴῴῷῷῼῼᾪᾫᾬᾭᾮᾯᾰᾱᾲᾳᾴ᾵ᾶᾷᾸᾹᾺΆᾼ᾽ι᾿῀῁ῂῃῄ῅ῆῇῈΈῊΉῌ῍῎῏ῐῑῒΐ῔῕ῖῗῘῙῚΊ῜῝῞῟ῠῡῢΰρρῦῧῨῩῪΎΡ῭΅`῰῱ῲῳῴ῵ῶῷῸΌῺΏῼ´῾῿"

function unaccent_Gr(charCode) {
	if ((charCode >= 0x0370) && (charCode <= 0x03cf)) return UNACCENTED.charCodeAt(charCode - 0x0370)
	else if ((charCode >= 0x1f00) && (charCode <= 0x1fff)) return UNACCENTEDEXT.charCodeAt(charCode - 0x1f00)
	else return charCode
}
function unaspirate_Gr(charCode) {
	if ((charCode >= 0x1f00) && (charCode <= 0x1fff)) return UNASPIRATEDEXT.charCodeAt(charCode - 0x1f00)
	else return charCode
}

/*search functions
A-Z:	=בצד==גה==כלמנ=פקרסת==וחיז	():	עא	#:	ש	+:	ט
*/


//the following complies with BETA code except for c and x which have been swapped

	//		keraia lower keraia	digamma	koppa	stigma	archaic koppa	sampi	san	lunate sigma
	//		ʹ	͵	Ϝϝ	Ϟϟ	Ϛϛ	Ϙϙ		Ϡϡ	Ϻϻ	Ϲϲ
	//beta code	#	#22	v	#1	#2	#3		#5	#711	s3

var GRAVE = '̀'; //0x0300
var ACUTE = '́'; //0x0301
var DIAERESIS = '̈'; //0x0308
var CIRCUMFLEX = '͂'; //0x0342
var SMOOTH = '̓'; //0x0313
var ROUGH = '̔'; //0x0314
var IOTA = 'ͅ'; //0x0345
//var GREEK = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
//beta: v = Ϝϝ; #1 = Ϟϟ; #2 = Ϛϛ; #3 = Ϙϙ; #5 = Ϡϡ; #711 = Ϻϻ
//var GREEK = "Ϟ\"Ϙ$Ϡ&’" + ROUGH + SMOOTH + "*" + DIAERESIS + ",-." + ACUTE + "0ϟϛϙ4ϡ6789·;<" + CIRCUMFLEX + ">?ϚΑΒΧΔΕΦΓΗΙϹΚΛΜΝΟΠΘΡΣΤΥϜΩΞΨΖ[" + GRAVE + "]^—`αβχδεφγηιϲκλμνοπθρςτυϝωξψζ{" + IOTA + "}" + CIRCUMFLEX + ""
var GREEK = "!\"ʹ$%&’" + ROUGH + SMOOTH + "%" + DIAERESIS + ",-." + ACUTE + "0123456789·;<" + CIRCUMFLEX + ">?ϛΑΒΧΔΕΦΓΗΙϹΚΛΜΝΟΠΘΡΣΤΥϜΩΞΨΖ[" + GRAVE + "]^—`αβχδεφγηιϲκλμνοπθρςτυϝωξψζ{" + IOTA + "}" + CIRCUMFLEX + ""
//ϟϛϙ4ϡ
//ϞϚϘ$Ϡ

//var HEBREW = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
var HEBREW = "!" + String.fromCharCode(0x05b5, 0x05e9, 0x05c1) + "%" + String.fromCharCode(0x05c2) + "'" + String.fromCharCode(0x05e2, 0x05d0) + "%" + String.fromCharCode(0x05d8, 0x05bf, 0x05be, 0x05bc) + "/0123456789" + String.fromCharCode(0x05b0) + ";<=>?@" + String.fromCharCode(0x05b2) + "BCD" + String.fromCharCode(0x05b1, 0x5b3) + "GHIJKLMN" + String.fromCharCode(0x05ba) + "PQRSTUVWXYZ[\\]^_`" + String.fromCharCode(0x05b7,0x05d1,0x05e5,0x05d3,0x05b6,0x05b8,0x05d2,0x05d4,0x05b4,0/*j*/,0x05da,0x05dc,0x05dd,0x05df,0x05b9,0x05e3,0x05e7,0x05e8,0x05e1,0x05ea,0x05bb,0/*v*/,0x05d5,0x05d7,0x05d9,0x05d6) + "{" + String.fromCharCode(0x05bd) + "}~"

var searchvalue = ""
function searchbox_keyup(textfield) { //changes medial characters to final characters on backspace or delete
	var lang = textfield.lang
	if (textfield.value.length < searchvalue.length) {
		switch (lang) {
		case 'he':
			//HEBREW
			if (textfield.value.substr(-1) == "כ")
				textfield.value = textfield.value.substr(0, textfield.value.length - 1) + "ך" //kaf
			else if (textfield.value.substr(-1) == "מ")
				textfield.value = textfield.value.substr(0, textfield.value.length - 1) + "ם" //mem
			else if (textfield.value.substr(-1) == "נ")
				textfield.value = textfield.value.substr(0, textfield.value.length - 1) + "ן" //nun
			else if (textfield.value.substr(-1) == "פ")
				textfield.value = textfield.value.substr(0, textfield.value.length - 1) + "ף" //pe
			else if (textfield.value.substr(-1) == "צ")
				textfield.value = textfield.value.substr(0, textfield.value.length - 1) + "ץ" //tsadi
			break
		case 'grc':
		case 'el':
		case 'el-polyton':
			//GREEK
			if (textfield.value.substr(-1) == "σ")
				textfield.value = textfield.value.substr(0, textfield.value.length - 1) + "ς" //sigma
			break
		}
	}
	searchvalue = textfield.value
}
var english = false
function searchbox_keypress(textfield, event, allowTabs, allowEnglish) {
	var lang = textfield.lang
	var keyPress = (event.which == 0 ? event.keyCode : 0) /*IE doesn't pass del, tab, up, down, left, and right events*/
	var charCode = (keyPress ? 0 : (event.which ? event.which : event.keyCode))
	if (event.altKey || event.ctrlKey)
		return true
	else if (allowEnglish && (keyPress == 27)) //esc key=27 (doesn't get passed in IE)
	{
		english = ! english
		return true
	}
	else if (keyPress && (keyPress != 9)) //tab=9, left arrow=, up arrow=38, right arrow=39, down arrow=40, del=46 (none of these get passed in IE)
		return true
	else if (english && (keyPress != 9))
		return true
	else if ((charCode >= 33) && (charCode <= 126) && textfield.value.search(/[0-9a-z]+$/i) >= 0) { //to allow for strongs numbers, do not convert if previous character is number or latin alphabet
		return true
	} else if ((allowTabs && (keyPress == 9)) || ((charCode >= 33) && (charCode <= 126))) {
		var letter = (keyPress == 9 ? "\t" : (lang == 'he' ? HEBREW.charAt(charCode - 33) : GREEK.charAt(charCode - 33)))
		if (lang == 'he' && letter >= 'A' && letter <='Z') return false; //discard unmapped Latin letters in Hebrew mode ('j', 'v', and all capitals except AEOF)
	 	if (textfield.selectionStart >= 0) { /* true for firefox, opera, chrome and safari */
			var cursorPosition = textfield.selectionStart
			var textfield_value = 
				textfield.value.substr(0, cursorPosition) + 
				"\1" + //insert marker
				letter + 
				textfield.value.substr(textfield.selectionEnd)

			switch (lang) {
			case 'he':
				//HEBREW (convert final characters to medial characters)
				textfield_value = textfield_value.replace(/(ך)(\x01[^\s.,·;’()\[\]])/, "כ$2") //kaf followed by non-whitespace character
				textfield_value = textfield_value.replace(/(ם)(\x01[^\s.,·;’()\[\]])/, "מ$2") //mem followed by non-whitespace character
				textfield_value = textfield_value.replace(/(ן)(\x01[^\s.,·;’()\[\]])/, "נ$2") //nun followed by non-whitespace character
				textfield_value = textfield_value.replace(/(ף)(\x01[^\s.,·;’()\[\]])/, "פ$2") //pe followed by non-whitespace character
				textfield_value = textfield_value.replace(/(ץ)(\x01[^\s.,·;’()\[\]])/, "צ$2") //tsadi followed by non-whitespace character
				break
			case 'grc':
			case 'el':
			case 'el-polyton':
				//GREEK (convert final sigma to medial sigma)
				textfield_value = textfield_value.replace(/(ς)(\x01[^\s.,·;’()\[\]])/, "σ$2") //sigma followed by non-whitespace character
				break
			}
			cursorPosition++

			textfield_value = convertDecompToPrecomp(lang, letter, textfield_value, cursorPosition)
			if (textfield_value.indexOf("\1") == -1) cursorPosition--
			else {
				textfield_value = convertFinalToMedial(lang, letter, textfield_value, cursorPosition)
				textfield_value = textfield_value.replace("\1", "")
			}
			textfield.value = textfield_value;

			textfield.setSelectionRange(cursorPosition, cursorPosition)
		}
		else if (document.selection) { /* true for both opera and ie */
			var range = document.selection.createRange()
			range.text = "\1" + letter /* inserting "\1" to determine the cursor position */
			var cursorPosition = textfield.value.indexOf("\1") + 1
			var textfield_value =  textfield.value;
			switch (lang) {
			case 'he':
				//HEBREW (convert final characters to medial characters)
				textfield_value = textfield_value.replace("ך\1", "כ\1") //change preceeding kaf, if applicable
				textfield_value = textfield_value.replace("ם\1", "מ\1") //change preceeding mem, if applicable
				textfield_value = textfield_value.replace("ן\1", "נ\1") //change preceeding nun, if applicable
				textfield_value = textfield_value.replace("ף\1", "פ\1") //change preceeding pe, if applicable
				textfield_value = textfield_value.replace("ץ\1", "צ\1") //change preceeding tsadi, if applicable
				break
			case 'grc':
			case 'el':
			case 'el-polyton':
				//GREEK (convert final sigma to medial sigma)
				textfield_value = textfield_value.replace("ς\1", "σ\1") //change preceeding sigma, if applicable
				break
			}

			textfield_value = convertDecompToPrecomp(lang, letter, textfield_value, cursorPosition)
			if (textfield_value.indexOf("\1") == -1) cursorPosition--
			else {
				textfield_value = convertFinalToMedial(lang, letter, textfield_value, cursorPosition)
				textfield_value = textfield_value.replace("\1", "")
			}
			textfield.value = textfield_value;

			range.collapse(true)
			range.moveEnd('character', cursorPosition)
			range.moveStart('character', cursorPosition)
			range.select()
		}
		else if (window.getSelection().baseOffset >= 0) {
			alert('hello')
		}
		return false
	}
	return true
}
function convertFinalToMedial(lang, letter, textfield_value, cursorPosition) {
	if ((cursorPosition + 1 < textfield_value.length) && (textfield_value.charAt(cursorPosition + 1) != " ")) {
		switch (lang) {
		case 'he':
			//HEBREW (convert final character to medial character, when inserted in middle of word)
			switch (letter) {
			case "ך": textfield_value = textfield_value.replace("\1ך", "כ"); break //kaf
			case "ם": textfield_value = textfield_value.replace("\1ם", "מ"); break //mem
			case "ן": textfield_value = textfield_value.replace("\1ן", "נ"); break //nun
			case "ף": textfield_value = textfield_value.replace("\1ף", "פ"); break //pe
			case "ץ": textfield_value = textfield_value.replace("\1ץ", "צ"); break //tsadi
			}
			break
		case 'grc':
		case 'el':
		case 'el-polyton':
			//GREEK (convert final sigma to medial sigma, when inserted in middle of word)
			if (letter == "ς") {
				textfield_value = textfield_value.replace("\1ς", "σ") //change current sigma if not end of word
			}
			break
		}
	}
	return textfield_value
}
function convertDecompToPrecomp(lang, letter, textfield, cursorPosition) {
	switch (lang) {
	case 'grc':
	case 'el':
	case 'el-polyton':
		if (letter == ACUTE) return searchAddDiacritic(true, false, letter, textfield, cursorPosition, ACUTE_BEFORE, ACUTE_AFTER)
		else if (letter == GRAVE) return searchAddDiacritic(true, false, letter, textfield, cursorPosition, GRAVE_BEFORE, GRAVE_AFTER)
		else if (letter == CIRCUMFLEX) return searchAddDiacritic(true, false, letter, textfield, cursorPosition, CIRCUMFLEX_BEFORE, CIRCUMFLEX_AFTER)
		else if (letter == SMOOTH) return searchAddDiacritic(false, true, letter, textfield, cursorPosition, SMOOTH_BEFORE, SMOOTH_AFTER)
		else if (letter == ROUGH) return searchAddDiacritic(false, true, letter, textfield, cursorPosition, ROUGH_BEFORE, ROUGH_AFTER)
		else if (letter == IOTA) return searchAddDiacritic(false, false, letter, textfield, cursorPosition, SUBSCRIPT_BEFORE, SUBSCRIPT_AFTER)
		else if (letter == DIAERESIS) return searchAddDiacritic(false, false, letter, textfield, cursorPosition, DIAERESIS_BEFORE, DIAERESIS_AFTER)
		break
	}
	return textfield
}

var ACUTE_BEFORE = "ΑΕΗΙΟΥΩαεηιουωϊϋἀἁἈἉἐἑἘἙἠἡἨἩἰἱἸἹὀὁὈὉὐὑὙὠὡὨὩᾀᾁᾈᾉᾐᾑᾘᾙᾠᾡᾨᾩᾳῃῳ"
var ACUTE_AFTER = "ΆΈΉΊΌΎΏάέήίόύώΐΰἄἅἌἍἔἕἜἝἤἥἬἭἴἵἼἽὄὅὌὍὔὕὝὤὥὬὭᾄᾅᾌᾍᾔᾕᾜᾝᾤᾥᾬᾭᾴῄῴ"
var GRAVE_BEFORE = "ΑΕΗΙΟΥΩαεηιουωϊϋἀἁἈἉἐἑἘἙἠἡἨἩἰἱἸἹὀὁὈὉὐὑὙὠὡὨὩᾀᾁᾈᾉᾐᾑᾘᾙᾠᾡᾨᾩᾳῃῳ"
var GRAVE_AFTER = "ᾺῈῊῚῸῪῺὰὲὴὶὸὺὼῒῢἂἃἊἋἒἓἚἛἢἣἪἫἲἳἺἻὂὃὊὋὒὓὛὢὣὪὫᾂᾃᾊᾋᾒᾓᾚᾛὢὣᾪᾫᾲῂῲ"
var CIRCUMFLEX_BEFORE = "αηιυωϊϋἀἁἈἉἠἡἨἩἰἱἸἹὐὑὙὠὡὨὩᾀᾁᾈᾉᾐᾑᾘᾙᾠᾡᾨᾩᾳῃῳ"
var CIRCUMFLEX_AFTER = "ᾶῆῖῦῶῗῧἆἇἎἏἦἧἮἯἶἷἾἿὖὗὟὦὧὮὯᾆᾇᾎᾏᾖᾗᾞᾟᾦᾧᾮᾯᾷῇῷ"
var SMOOTH_BEFORE = "ΑΕΗΙΟΩαεηιορυωὰάὲέὴήὶίὸόὺύὼώᾲᾳᾴᾶᾷᾺΆᾼῂῃῄῆῇῈΈῊΉῌῖῚΊῦῲῳῴῶῷῸΌῺΏῼ"
var SMOOTH_AFTER = "ἈἘἨἸὈὨἀἐἠἰὀῤὐὠἂἄἒἔἢἤἲἴὂὄὒὔὢὤᾂᾀᾄἆᾆἊἌᾈᾒᾐᾔἦᾖἚἜἪἬᾘἶἺἼὖᾢᾠᾤᾦὊὌᾪᾬᾨ"
var ROUGH_BEFORE = "ΑΕΗΙΟΡΥΩαεηιορυωὰάὲέὴήὶίὸόὺύὼώᾲᾳᾴᾶᾷᾺΆᾼῂῃῄῆῇῈΈῊΉῌῖῚΊῦῪΎῲῳῴῶῷῸΌῺΏῼ"
var ROUGH_AFTER = "ἉἙἩἹὉῬὙὩἁἑἡἱὁῥὑὡἃἅἓἕἣἥἳἵὃὅὓὕὣὥᾃᾁᾅἇᾇἋἍᾉᾓᾑᾕἧᾗἛἝἫἭᾙἷἻἽὗὛὝᾣᾡᾥᾧὋὍᾫᾭᾩ"
var DIAERESIS_BEFORE = "ΙΥιυὶίῖὺύῦ"
var DIAERESIS_AFTER = "ΪΫϊϋῒΐῗῢΰῧ"
var SUBSCRIPT_BEFORE = "ἀἁἂἃἄἅἆἇἈἉἊἋἌἍἎἏἠἡἢἣἤἥἦἧἨἩἪἫἬἭἮἯὠὡὢὣὤὥὦὧὨὩὪὫὬὭὮὯὰαάᾶΑὴηήῆΗὼωώῶΩ"
var SUBSCRIPT_AFTER = "ᾀᾁᾂᾃᾄᾅᾆᾇᾈᾉᾊᾋᾌᾍᾎᾏᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾞᾟᾠᾡᾢᾣᾤᾥᾦᾧᾨᾩᾪᾫᾬᾭᾮᾯᾲᾳᾴᾷᾼῂῃῄῇῌῲῳῴῷῼ"

function searchAddDiacritic(unaccent, unaspirate, letter, textfield_value, cursorPosition, DIACRITIC_BEFORE, DIACRITIC_AFTER) {
	var codept = textfield_value.charCodeAt(cursorPosition - 2)
	var oldChar = String.fromCharCode(codept)
	var tmpChar = (unaccent ? String.fromCharCode(unaccent_Gr(codept) ) : ( unaspirate ? String.fromCharCode(unaspirate_Gr(codept)) : oldChar))
	var i = DIACRITIC_BEFORE.indexOf(tmpChar)
	if (i > -1) textfield_value = textfield_value.replace(oldChar + "\1" + letter, DIACRITIC_AFTER.charAt(i))
	return textfield_value
}

//the following complies with BETA code except for c and x which have been swapped

var BETACODE =
'Ͱ,ͱ,Ͳ,ͳ,#,#22,Ͷ,ͷ,͸,͹,ͺ,ͻ,ͼ,ͽ,;,Ϳ,΀,΁,΂,΃,΄,΅,*/A,·,*/E,*/H,*/I,΋,*/O,΍,*/U,*/W,i/+,*A,*B,*G,*D,*E,*Z,*H,*Q,*I,*K,*L,*M,*N,*X,*O,*P,*R,΢,*S,*T,*U,*F,*C,*Y,*W,*I+,*U+,a/,e/,h/,i/,u/+,a,b,g,d,e,z,h,q,i,k,l,m,n,x,o,p,r,s,s,t,u,f,c,y,w,i+,u+,o/,u/,w/'.split(',')
var BETACODE_EXT =
'a),a(,a)\\,a(\\,a)/,a(/,a)=,a(=,*)A,*(A,*)\\A,*(\\A,*)/A,*(/A,*)=A,*(=A,e),e(,e)\\,e(\\,e)/,e(/,἖,἗,*)E,*(E,*)\\E,*(\\E,*)/E,*(/E,἞,἟,h),h(,h)\\,h(\\,h)/,h(/,h)=,h(=,*)H,*(H,*)\\H,*(\\H,*)/H,*(/H,*)=H,*(=H,i),i(,i)\\,i(\\,i)/,i(/,i)=,i(=,*)I,*(I,*)\\I,*(\\I,*)/I,*(/I,*)=I,*(=I,o),o(,o)\\,o(\\,o)/,o(/,὆,὇,*)O,*(O,*)\\O,*(\\O,*)/O,*(/O,὎,὏,u),u(,u)\\,u(\\,u)/,u(/,u)=,u(=,὘,*(U,὚,*(\\U,὜,*(/U,὞,*(=U,w),w(,w)\\,w(\\,w)/,w(/,w)=,w(=,*)W,*(W,*)\\W,*(\\W,*)/W,*(/W,*)=W,*(=W,a\\,a/,e\\,e/,h\\,h/,i\\,i/,o\\,o/,u\\,u/,w\\,w/,὾,὿,a)|,a(|,a)\\|,a(\\|,a)/|,a(/|,a)=|,a(=|,*)A|,*(A|,*)\\A|,*(\\A|,*)/A|,*(/A|,*)=A|,*(=A|,h)|,h(|,h)\\|,h(\\|,h)/|,h(/|,h)=|,h(=|,*)H|,*(H|,*)\\H|,*(\\H|,*)/H|,*(/H|,*)=H|,*(=H|,w)|,w(|,w)\\|,w(\\|,w)/|,w(/|,w)=|,w(=|,*)W|,*(W|,*)\\W|,*(\\W|,*)/W|,*(/W|,*)=W|,*(=W|,ᾰ,ᾱ,a\\|,a|,a/|,᾵,a=,a=|,Ᾰ,Ᾱ,*\\A,*/A,*A|,᾽,ι,᾿,῀,῁,h\\|,h|,h/|,῅,h=,h=|,*\\E,*/E,*\\H,*/H,*H|,῍,῎,῏,ῐ,ῑ,i\\+,i/+,῔,῕,i=,i=+,Ῐ,Ῑ,*\\I,*/I,῜,῝,῞,῟,ῠ,ῡ,u\\+,u/+,r),r(,u=,u=+,Ῠ,Ῡ,*\\U,*/U,*(R,῭,΅,`,῰,῱,w\\|,w|,w/|,῵,w=,w=|,*\\O,*/O,*\\W,*/W,*W|,´,῾,῿'.split(',')
var BETACODE_DIACRITICS =
'\\/??????+??????????)(?????????????????????????????????????????????=*?|'
var BETACODE_ARCHAIC =
'?,?,?,?,?,?,?,?,*#3,#3,*#2,#2,*V,v,*#1,#1,*#5,#5,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,s3,?,?,?,?,?,?,*S3,*#711,#711,?,?,?,?'.split(',')
var MICH_CLAREMONT =
'92 01 65 80 85 73 81 82 03 10 91 61 11 62 84 14 83 ? 74 70 71 72 94 63 04 93 60 64 13 02 ? : :E :A :F I " E A F O OW U . | - , ? $ & ; 52 53 N]8 ? ? ? ? ? ? ? ? ? ) B G D H W Z X + Y K K L M M N N S ( P P C C Q R # T'.split(' ')

function translit(text) {
	var newstring = ''
	text = text.replace(/שׁ/, '$').replace(/שׂ/, '&')
	for (var i = 0; i< text.length; i++) {
		var codept = text.charCodeAt(i)
		newstring += translit_ch(codept)
	}
	return newstring
	//return preg_replace('/(\*)([\/()=+\\\|]+)([A-Z])/', "$1$3$2", newstring); //convert utf8 to betacode w/o molesting b-greek (don't convert h and i to uppercase)
}
function translit_ch(codept) {
	//GREEK
	if ((codept == 0x00b7) || (codept == 0x0387)) return ':' //Greek middle dot (0x00b7 is the "preferred" character)
	else if ((codept >= 0x0370) && (codept <= 0x03cf)) return BETACODE[codept - 0x0370].toUpperCase()
	else if ((codept >= 0x1f00) && (codept <= 0x1fff)) return BETACODE_EXT[codept - 0x1f00].toUpperCase()
	else if ((codept >= 0x0300) && (codept <= 0x0345)) return BETACODE_DIACRITICS[codept - 0x0300]
	else if ((codept >= 0x03d0) && (codept <= 0x03ff)) return BETACODE_ARCHAIC[codept - 0x03d0].toUpperCase()
	else if (codept == 0x2014) return '_' //em dash
	else if (codept == 0x2019) return "'" //apostrophe
	//HEBREW
	else if ((codept >= 0x0591) && (codept <= 0x05ea)) return MICH_CLAREMONT[codept - 0x0591]
	//OTHER
	else return String.fromCharCode(codept);
}