var ToolBar             = null;
var ContentWindow       = null;
var VowelsLower         = ["a","e","i","o","u","v"];
var VowelsUpper         = ["A","E","I","O","U","V"];
var PinyinVowels        = ["ā","á","ǎ","à","ē","é","ě","è","ī","í","ǐ","ì","ō","ó","ǒ","ò","ū","ú","ǔ","ù","ǖ","ǘ","ǚ","ǜ"];
var PinyinReplacement   = "";
var Convert             = true;
var Dom                 = false;
var IE                  = false;
var HelpWindow          = null;
var languages           = ["da", "en"];
var language            = "en";
var langIdx             = -1;
var elementStrings      =
                          [
                              ["h1Main", "Pīnyīn-editor", "Pīnyīn editor"],
                              ["btnHelp", "Hjælp", "Help"]
                          ];
var ConvertLabels       = 
                          [
                              ["Aktivér konvertering", "Enable conversion"],
                              ["Deaktivér konvertering", "Disable conversion"]
                          ];
var LanguageCookieName  = "PinyinEditor_language";


function InitEditor()
{
    if (!DetermineBrowserType())
    {
        alert("This editor won't work on your browser");
        return;
    }
    if (IE)
    {
        ContentWindow.document.onkeypress = IEKeyPress;
    }
    else if (Dom)
    {
        document.addEventListener("keypress", KeyHandler, true);
        document.getElementById("frmEdit").contentWindow.document.addEventListener("keypress", KeyHandler, true);
    }
    SetPreferredLanguage();
    Localize();
    InitToolbar();
    ContentWindow.focus();
}

function InitToolbar()
{
    ToolBar = document.getElementById("divToolBar");
    ToolBar.innerHTML = "<div id='divLower' class='ToolBar'></div><div id='divUpper' class='ToolBar'></div>";
    for (var I=0; I<PinyinVowels.length; I++)
    {
        if ((I > 0) && (I % 4 == 0))
        {
            document.getElementById("divLower").innerHTML += "&nbsp;";
        }
        document.getElementById("divLower").innerHTML += "<button onclick='InsertPinyin(" + I + ",false)'>" + PinyinVowels[I] + "</button>&nbsp;";
    }
    for (var I=0; I<PinyinVowels.length; I++)
    {
        if ((I > 0) && (I % 4 == 0))
        {
            document.getElementById("divUpper").innerHTML += "&nbsp;";
        }
        document.getElementById("divUpper").innerHTML += "<button onclick='InsertPinyin(" + I + ",true)'>" + PinyinVowels[I].toUpperCase() + "</button>&nbsp;";
    }
}

function DetermineBrowserType()
{
    IE = false;
    Dom = false;
    try
    {
        ContentWindow = document.getElementById("frmEdit").contentWindow;
        ContentWindow.document.designMode = "on";
    }
    catch (ex)
    {
        return false;
    }
    try
    {
        if (document.body.textContent != null)
        {
            Dom = true;
        }
    }
    catch (ex) {}
    try
    {
        if (document.body.innerText != null)
        {
            IE = true;
        }
    }
    catch (ex) {}
    return IE || Dom;
}

function GetPinyin(iTonePressed)
{
    if (IE)
    {
        var strConverted;
        var oOrigCursorPos = ContentWindow.document.selection.createRange().duplicate();
        var iOrigX = oOrigCursorPos.getBoundingClientRect().left;
        var iOrigY = oOrigCursorPos.getBoundingClientRect().top;
        var range = ContentWindow.document.selection.createRange();
        range.moveStart("character",-4);
        range.select();
        strConverted = PreparePinyin(range.text,iTonePressed);
        if (strConverted != range.text)
        {
            range.text = strConverted;
            oNextCursorPos = ContentWindow.document.body.createTextRange();
            oNextCursorPos.moveToPoint(iOrigX,iOrigY);
            oNextCursorPos.select();	    
        }
        else
        {
            range.text = range.text + iTonePressed;
            oNextCursorPos = ContentWindow.document.body.createTextRange();
            oNextCursorPos.moveToPoint(iOrigX,iOrigY);
            oNextCursorPos.select();	    
            var range = ContentWindow.document.selection.createRange();
            range.moveStart("character",1);
            range.select();
        }
    }
    else if (Dom)
    {
        var selection;
        var range;
        var container;
        var syllableLen;
        for (syllableLen=4; syllableLen>=1; syllableLen--)
        {
            try
            {
                selection = ContentWindow.getSelection();
                range = selection.getRangeAt(0);
                container = range.startContainer;
                range.setStart(container, range.startOffset - syllableLen);
                break;
            }
            catch (err) { }
        }
        try
        {
            var converted = PreparePinyin(range.toString(), iTonePressed);
            range.deleteContents();
            var newNode = ContentWindow.document.createTextNode(converted);
            range.insertNode(newNode);
            range.selectNode(newNode);
            range.collapse(false);
        }
        catch (err)
        {
            document.getElementById("divError").innerHTML = " Error: " + syllableLen;
        }
    }
}

function IEKeyPress()
{
    if (Convert)
    {
        var keyCode = ContentWindow.event.keyCode;
        if ((keyCode >= 49) && (keyCode <= 52))
        {
            GetPinyin(keyCode - 48);
            ContentWindow.event.returnValue = false;
        }
    }
}

function KeyHandler(e)
{
    if (Convert)
    {
        if (Dom)
        {
            if ((e.charCode >= 49) && (e.charCode <= 52))
            {
                e.preventDefault();
                GetPinyin(e.charCode - 48);
            }
        }
    }
}

function PreparePinyin(strToConvert, iTone)
{
    var strVowel;
    strToConvert += iTone;
    strToConvert = eval("strToConvert.replace(/(n|ng|r)" + iTone + "$" + "$/i,\"" + iTone + "$1" + "\")");
    strToConvert = eval("strToConvert.replace(/([aeo])([iou])" + iTone + "/i,\"$1" + iTone + "$2" + "\")");
    strVowel = strToConvert.substr(strToConvert.lastIndexOf(iTone)-1,1);
    return eval("strToConvert.replace(/(.)" + iTone + "/,\"" + MakePinyin(strVowel,iTone) + "\")");
}

function MakePinyin(strNum, tone)
{
    var arVowels;
    var arPinyin;
    var count;
    var iIndex;
    count = 0;
    //  Try lower
    for (var vowel=0; vowel<VowelsLower.length; vowel++)
    {
        if (VowelsLower[vowel] == strNum)
        {
            iIndex = (count * 4) + tone - 1;
            return PinyinVowels[iIndex];
        }
        else
        {
            count++;
        }
    }
    //  No? Try upper
    count = 0;
    for (var vowel=0; vowel<VowelsUpper.length; vowel++)
    {
        if (VowelsUpper[vowel] == strNum)
        {
            iIndex = (count * 4) + tone - 1;
            return PinyinVowels[iIndex].toUpperCase();
        }
        else
        {
            count++;
        }
    }
    return strNum;
}

function InsertPinyin(iIndex, boolUpper)
{
	if (IE)
	{
        var oRange;
        var strInserted;
        ContentWindow.focus();
        oRange = GetRange();
        if (boolUpper)
        {
            strInserted = PinyinVowels[iIndex].toUpperCase();
        }
        else
        {
            strInserted = PinyinVowels[iIndex];
        }
        oRange.pasteHTML(strInserted);
        ContentWindow.focus();
	}
    else if (Dom)
    {
        var strInserted = "";
        if (boolUpper)
        {
            strInserted = PinyinVowels[iIndex].toUpperCase();
        }
        else
        {
            strInserted = PinyinVowels[iIndex];
        }
        var selection = ContentWindow.getSelection();
        var range = selection.getRangeAt(0);
        var container = range.startContainer;
        var newNode = document.createTextNode(strInserted);
        range.insertNode(newNode);
        range.selectNode(newNode);
        selection.collapseToEnd();
        ContentWindow.focus();
    }	
}

function GetRange ()
{
	if (ContentWindow.document.selection.type != "Control")
	{
		var oRange = ContentWindow.document.selection.createRange();
		oRange.execCommand("GetRange");
		return oRange;
	}
	return null;
}

function ToggleConversion()
{
    document.getElementById("btnTogglePinyin").innerHTML = Convert ? ConvertLabels[0][langIdx] : ConvertLabels[1][langIdx];
    Convert = !Convert;
    ContentWindow.focus();
}

function ShowHelp()
{
    if (IE)
    {
        if (HelpWindow == null)
        {
            showModelessDialog("HTML/" + language + "ModalHelp.htm", window, "dialogLeft:50px;dialogTop:50px;dialogWidth:400px;dialogHeight:500px;status:no");
            HelpWindow = "modeless";
        }
    }
    else if (Dom)
    {
        try
        {
            HelpWindow.focus();
        }
        catch (ex)
        {
            HelpWindow = window.open("HTML/" + language + "ModalHelp.htm", "helpWindow", "toolbar=no,location=no, status=no, menubar=no, directories=no, scrollbars=yes, resizable=yes, width=400px, top=50px, height=500px, left=50px");
        }
    }
}



/* Language section ------------------------------------------------- */

function SelectLanguage(lang)
{
    language = lang;
    SetLangCookie();
}

function Localize()
{
    for (var I=0; I<languages.length; I++)
    {
        if (language == languages[I])
        {
            langIdx = I;
            break;
        }
    }
    if (IE)
    {
        for (var I=0; I<elementStrings.length; I++)
        {
            document.getElementById(elementStrings[I][0]).innerText = elementStrings[I][langIdx+1];
        }
    }
    else if (Dom)
    {
        for (var I=0; I<elementStrings.length; I++)
        {
            document.getElementById(elementStrings[I][0]).textContent = elementStrings[I][langIdx+1];
        }
    }
    var convertIdx = Convert ? 1 : 0;
    document.getElementById("btnTogglePinyin").innerHTML = ConvertLabels[convertIdx][langIdx];
    var divNotice = document.getElementById("divNotice");
    var langDivNotice = document.getElementById("divNotice_" + language);
    divNotice.innerHTML = langDivNotice.innerHTML
}

function GetCookie(oDocument, soughtName )
{
	var tCookie = oDocument.cookie;
	var arCookies = tCookie.split(/ *; */);
	for (var I=0; I<arCookies.length; I++)
	{
		var tTestedName = arCookies[I].split(/=/)[0];
		if (tTestedName == soughtName)
		{
		    return unescape(arCookies[I].split(/=/)[1]);
		}
	}
	return "";
}

function SetCookie ( tName, tValue, dExpiration)
{
	if (dExpiration == null) dExpiration = new Date();
	document.cookie = tName + "=" + escape(tValue) + "; expires=" + dExpiration.toGMTString() + "; path=/";
}

function SetLangCookie()
{
    try
    {
	    var dateExpires = new Date();
	    dateExpires.setTime(dateExpires.getTime() + (24 * 60 * 60 * 1000 * 31));
	    SetCookie(LanguageCookieName, language, dateExpires);
    }
    catch (ex)
    {
        alert("SetLangCookie, error: " + ex);
    }
}

function GetLangCookie ()
{
    try
    {
        var cookieValue = this.GetCookie(document, LanguageCookieName);
        return cookieValue;
    }
    catch (ex)
    {
        return "";
    }
}

function SetPreferredLanguage()
{
    var lang = GetLangCookie();
    if (lang != "")
    {
        language = lang;
        for (var I=0; I<document.getElementById("selLanguage").options.length; I++)
        {
            if (document.getElementById("selLanguage").options[I].value == language)
            {
                document.getElementById("selLanguage").selectedIndex = I;
                break;
            }
        }
    }
}

function Select(selectName)
{
    var selIdx = document.getElementById(selectName).selectedIndex;
    if (selIdx != 0) {
        var selValue = document.getElementById(selectName).options[selIdx].value;
        ContentWindow.document.execCommand(selectName, false, selValue);
        document.getElementById(selectName).selectedIndex = 0;
    }
    ContentWindow.focus();
}
