function Editor() {
    this.name="MYEditor";
    return this;
}


//window.onerror = handleErrors;
function handleErrors() {
    //----- Used For Browsers That Don't Want To Behave -----
    return true;
}
var viewMode = 1;
var restart_interval;
var Editor=new Editor();
var doc,cursor,focused;
var textarea;

function loadEditor() {
    try {
        doc = editbox.document;//alert(        doc);
        if(!doc.body) {
            setTimeout(loadEditor,500);
            return false;
        } else {
            // clearInterval(restart_interval);
        }

        textarea = document.getElementsByTagName("textarea")[0];   // alert(textarea.height);
        if(textarea.className!="htmlarea")     {
            return false;
        }


        doc.open();
        var html = "<html XMLNS:moodus><head><base href='" + wwwroot + currentposition_wwwdir + "' /><link rel = 'stylesheet' type = 'text/css' href = '/theme/course.css'></head><body>"+textarea.value+"</body></html>";
        doc.write(html);
        doc.close();
        cursorinterval=setInterval(saveCursor,500);
        doc.onkeydown=ParseTeX;
        doc.onkeyup=ParseTeX;
        doc.ondblclick =ParseTeX;
        //doc.addEventListener('keydown', 'ParseTeX', false);
        var editwindow=document.getElementById('editwindow');
        //var editwindow=document.createNode();
        // editwindow.innerHTML="--------+++++++++++++++++++++++++++++++++++++-----node";
        //document.writeln("<div id=\"editwindow\" class=editwindow style=\"display:n1one\">--------+++++++++++++++++++++++++++++++++++++-----</div>");
        textarea.parentNode.insertBefore(editwindow, textarea);
        editwindow.style.display="";
        var eb=document.getElementById('editbox');
       //alert(eb.style.width);
        eb.style.height=textarea.height+'px';      //alert(eb.style.width);
        if(textarea.height<200)
            document.getElementById('branch_editpanel').style.display="none";      //alert(eb.style.width);
        //alert(editbox.tagName);
        textarea.style.display = "none";
        if (textarea.form) {
            var f = textarea.form;
            if (typeof f.onsubmit == "function") {
                var funcref = f.onsubmit;
                if (typeof f.__msh_prevOnSubmit == "undefined") {
                    f.__msh_prevOnSubmit = [];
                }
                f.__msh_prevOnSubmit.push(funcref);
            }

            f.onsubmit = function() {
                             textarea.value = doc.body.innerHTML;
                             var a = this.__msh_prevOnSubmit;
                             // call previous submit methods if they were there.
                             if (typeof a != "undefined") {
                                 for (var i in a) {
                                     return a[i].apply(this);
                                 }
                             }
                         };
        }
        //doc.designMode="On";
        doc.body.contentEditable="true";
    }  catch(everything)  {
        // clearInterval(restart_interval);
        return false;
    }
    jsMath.Process();

}

function newDocument() {
    //----- Creates An Empty Workspace ------
    if (doc.body.innerHTML == "") {
        doc.execCommand('refresh', false, null);
    } else {
        if (confirm("Would you like to save your entry?")) {
            //var saveInsructions = "Click the back eButton in your browser \n" +
            "once your input has been saved inorder \n" +
            "to continue using the editor.";
            //alert(saveInsructions)
            var dataRep = null;
            dataRep = document.body.all.submitData;
            dataRep.value = doc.body.innerHTML;
            document.editor.submit();
            window.location.reload();
        } else {
            doc.execCommand('refresh', false, null);
        }
    }
}
function saveDocument() {
    //----- Saves User Input ------
    //==============================================
    //= To change the url that the editor posts to =
    //= change the action url in the form at the   =
    //= bottom of this page.                       =
    //==============================================
    if (doc.body.innerHTML == "") {
        return;
    } else {
        if (confirm("Would you like to save you entry?")) {
            var dataRep = null;
            dataRep = document.body.all.submitData;
            dataRep.value = doc.body.innerHTML;
            document.editor.submit();
        } else {
            return;
        }
    }
}


function foreColor() {
    //----- Sets Foreground Color -----
    var fColor = showModalDialog("/lib/editor/color.htm","","dialogWidth:140px; dialogHeight:120px" );
    if (fColor != null) {
        doc.execCommand("ForeColor", false, fColor);
    }
    editbox.focus();
}
function backColor() {
    //----- Sets Background Color -----
    var bColor = showModalDialog("/lib/editor/color.htm","","dialogWidth:140px; dialogHeight:120px" );
    if (bColor != null) {
        doc.execCommand("BackColor", false, bColor);
    }
    editbox.focus();
}
function eStat(status) {
    //----- Updates Status Bar With Information -----
    var editStat = document.getElementById("editorStatus");
    editStat.innerHTML = status;
}
function modeSelect() {
    //----- Changes Editor Mode -----
    var HTMLtitle
    var WYSIWYGtitle
    var editorTitle
    if(viewMode == 1) {
        iHTML = doc.body.innerHTML;
        doc.body.innerText = iHTML;
        editbox.focus();
        viewMode = 2;
    } else {
        iText = doc.body.innerText;
        doc.body.innerHTML = iText;
        editbox.focus();
        viewMode = 1;
    }

}
function getParentElement () {
    //  var cursor = doc.selection.createRange();
    cursor = doc.selection.createRange();
    return cursor.parentElement? cursor.parentElement() : doc.body;
};

function setFocused(s) {
    focused=s;
}

var blockTags = "  FORM TEXTAREA FIELDSET UL OL DL LI DIV P H1 H2 H3 H4 H5 H6 QUOTE PRE  ADDRESS NOTE  ERROR TIP ";
var inlineTags = " TERM ABBR REF MATH VALUE SPAN STRONG EM STRIKE BR IMG EMBED SUP SUB REF ";
var stopTags = " BODY TABLE THEAD TBODY TFOOT TR TD EMBED ";
function saveCursor() {
  // return;
    if(focused ) {
      //      try {
        doc.cursor = doc.selection.createRange();
        var node=getParentElement();
        var edstat=document.all.editorStatus;//getElementById("editorStatus");
        var str_stat="";
        var i=0;
        var classstack=[];
        var inline_el;
        var block_el;
        var tagstack=[];
        while(node && i<20) {
            i++;

            if((stopTags.indexOf(node.tagName)!=-1)) {
                break;
            }
            // if((node.tagName=="P"))                continue;
            if((node.tagName=="SPAN" ||node.tagName=="DIV") && ( node.className=="")) {
                node.outerHTML=node.innerHTML;

            }
            tagname=node.tagName;
            node.tagName=="SPAN"?tagname=node.className.toUpperCase():0;


            str_stat=tagname+":"+str_stat;
            if(inlineTags.indexOf(" "+tagname+" ")!=-1) {
                /*
                if(!inline_el) {//classstack[node.className]
                     inline_el=node;
                     if(block_el) {alert("block_el Node: "+tagname+" == "+node.outerHTML);
                         block_el.outerHTML=block_el.innerHTML;
                         block_el=null;
                     }
                     //classstack[node.className]=node;
                 } else {
                     alert("inlineTags Node: "+tagname+" == "+node.outerHTML);
                     //node.outerHTML=node.innerHTML;
                     //oldnode=classstack[node.className];
                     //oldnode.outerHTML=oldnode.innerHTML;
                     inline_el.outerHTML=inline_el.innerHTML;
                     //classstack[node.className]=node;

                     inline_el=node;
                 }*/
            } else {
                if (blockTags.indexOf(" "+tagname+" ")!=-1) {
                    /*if(block_el){
                      //  if(node.tagName=="P"){                            }
                       // else{
                            //block_el.outerHTML=block_el.innerHTML;
                            node.outerHTML=node.innerHTML;
                            alert("block_el.outerHTML "+block_el.tagName);
                       // }
                    }else{
                    block_el=node;}
                    // tagstack[node.tagName]=node;
                    */
                } else {
                    //alert("undefined Node: "+tagname+" == "+node.outerHTML);
                    node.outerHTML=node.innerHTML;

                }
            }
            node=node.parentElement;
        }
        // lasttag= tagstack.pop();
        //lastclass= classstack.pop();
        // lastclass.innerHTML=lastclass.innerText;
        edstat.innerHTML=str_stat;
       //   } catch(er) {}
    } else {
        cursor = {};//doc.selection.createRange();
    }
}

function clearMe(obj) {
    if(!obj.onceCleared) {
        obj.onceCleared=true;
        obj.innerHTML="";
    }
}
function insertImage(input_el) {   // и не только
//alert(doc.cursor);
cursor=getCursor();
    if(!cursor)
        return;
    var new_input_el=input_el.cloneNode();
    var txt="", filename="";
    new_input_el.name="datafile"+Math.ceil(Math.random()*1000000);//input_el.name.substring(8,20);
    //alert(new_input_el.name);
    input_el.parentNode.insertBefore(new_input_el);
    input_el.style.display="none";

  //
    cursor.select();
    v=input_el.value.split(".").pop();
    
    if(v=="swf") {
        txt+="<p align=center>";
        txt+="<img src='"+input_el.value+"' alt='' width=400 height=370 bgcolor='#FFFFFF'  />";
        txt+="<span class=ref onClick='window.parent.clearMe(this);' >[подпись]</span></p>";
    } else {
        if (v=="gif" || v=="bmp" || v=="jpg" || v=="jpeg" || v=="tiff"){
            txt+="<p align=center>";
            txt+="<img src='"+input_el.value+"' alt='' />";
            txt+="<span class=ref onClick='window.parent.clearMe(this);' >[подпись]</span></p>";
            }
        else {
            if ( v!="exe" | v!="php" | v!="php3" | v!="asp" | v!="html" | v!="htm"){
                filename=input_el.value.split("\\").pop(); 
                txt+="<a href='"+input_el.value+"' alt='' >"+filename+"</a>";
              
            }
            }
    }
    //txt+="<span class=ref onClick='window.parent.clearMe(this);' >[подпись]</span></p>";  //this.innerHTML=\"\";alert(this.tagName);
    cursor.pasteHTML(txt);
}

/* //только картинки
function insertImage(input_el) {
//alert(doc.cursor);
cursor=getCursor();
    if(!cursor)
        return;
    var new_input_el=input_el.cloneNode();
    var txt="";
    new_input_el.name="datafile"+Math.ceil(Math.random()*1000000);//input_el.name.substring(8,20);
    //alert(new_input_el.name);
    input_el.parentNode.insertBefore(new_input_el);
    input_el.style.display="none";

  //
    cursor.select();
    v=input_el.value.split(".").pop();//alert(v);
    txt+="<p class=center>";
    if(v=="swf") {
        txt+="<embed src='" + input_el.value+"' alt='' />";
    } else {
        txt+="<img src='"+input_el.value+"' alt='' />";
    }
    txt+="<span class=ref onClick='window.parent.clearMe(this);' >[подпись]</span></p>";//this.innerHTML=\"\";alert(this.tagName);
    cursor.pasteHTML(txt);
}
*/
function insertMath() {
    ret = showModalDialog("/lib/editor/insert_math.php?id="+modid,"" ,"status:false;dialogWidth:31em;dialogHeight:16em");
    if(ret.char)
        getCursor().pasteHTML(ret.char);
    ParseTeX();
}
function insertChar() {
    ret = showModalDialog("/lib/editor/insert_char.php?id="+modid,"" ,"status:false;dialogWidth:31em;dialogHeight:16em");
    if(ret.char)
        getCursor().pasteHTML(ret.char);
}

function createLink(){
    ret = showModalDialog("/lib/editor/insert_link.php?id="+modid,"" ,"status:false;dialogWidth:31em;dialogHeight:8em");
   
    if(ret.address){
        if (ret.text)
            text=ret.text;
        else
            text=ret.address;
        getCursor().pasteHTML("<a href='"+ret.address+"'>"+text+"</a>");
        }
}

function getCursor() {
  //
    var cursor = doc.cursor;editbox.focus();
    return cursor;
}
/*function insertImageDialog() {
    var cursor = doc.selection.createRange();
    if(!cursor)
        return;
    ret = showModalDialog("/lib/editor/insert_image.php?id="+modid,"" ,"status:false;dialogWidth:30em;dialogHeight:40em");
    //  alert("doc ="+doc);


    cursor.pasteHTML("<img src='"+ret.src+"' alt='"+ret.alt+"'/>");
}*/
if (1) {//TABLES
    function tableDialog() {
        //----- Creates A Table Dialog And Passes Values To createTable() -----
        var rtNumRows = null;
        var rtNumCols = null;
        var rtTblAlign = null;
        var rtTblWidth = null;
        showModalDialog("/lib/editor/table.htm",window,"status:false;dialogWidth:16em;dialogHeight:12em");
    }
    function createTable() {
        //----- Creates User Defined Tables -----
        var cursor = doc.selection.createRange();
        if (rtNumRows == "" || rtNumRows == "0") {
            rtNumRows = "2";
        }
        if (rtNumCols == "" || rtNumCols == "0") {
            rtNumCols = "2";
        }
        var rttrnum=1;
        var rttdnum=1;
        var rtNewTable = "<table border='1' align='" + rtTblAlign + "' cellpadding='0' cellspacing='0' width='" + rtTblWidth + "'>";
        while (rttrnum <= rtNumRows) {
            rttrnum=rttrnum+1;
            rtNewTable = rtNewTable + "<tr>";
            while (rttdnum <= rtNumCols) {
                rtNewTable = rtNewTable + "<td>&nbsp;</td>";
                rttdnum=rttdnum+1;
            }
            rttdnum=1;
            rtNewTable = rtNewTable + "</tr>";
        }
        rtNewTable = rtNewTable + "</table>";
        cursor.pasteHTML(rtNewTable);
        editbox.focus();
    }
    function insertRow() {
        var td=getParentElement();
        var table=td.parentElement.parentElement.parentElement;
        if(td.tagName=="TD") {
            var tr=table.insertRow(td.parentElement.rowIndex+1);//
            for(var i=0;i<td.parentElement.cells.length;i++) {
                tr.insertCell(i);
            }
        }
    }
    function splitCell() {
        var td=getParentElement();
        var thead=td.parentElement.parentElement;
        insertCell();

        for(var i=0;i<thead.rows.length;i++) {
            var tr=thead.rows[i];
            if(tr!=td.parentElement) {
                //alert("thead "+thead);
                //alert("td.cellIndex "+td.cellIndex);
                tr.cells[td.cellIndex].colSpan+=1;
            }
        }
    }

    function deleteRow() {
        var td=getParentElement();
        var table=td.parentElement.parentElement.parentElement;
        td.parentElement.removeNode();
    }
    function insertCell() {
        var td=getParentElement();
        if(td.tagName=="TD") {
            td.parentElement.insertCell(td.cellIndex+1);
        }
    }
    function deleteCell() {
        var td=getParentElement();
        if(td.tagName=="TD") {
            td.parentElement.deleteCell(td.cellIndex);
        }
    }
    function insertCol() {
        var td=getParentElement();
        if(td.tagName=="TD") {
            var r =td.parentElement.parentElement.rows;
            for(var i=0;i<r.length;i++) {
                r[i].insertCell(td.cellIndex+1);
            }
        }
    }
    function deleteCol() {
        var td=getParentElement();
        if(td.tagName=="TD") {
            var r =td.parentElement.parentElement.rows;
            for(var i=0;i<r.length;i++) {
                r[i].deleteCell(td.cellIndex);
            }
        }
    }
}
function alert1(s) {
    var ta = document.getElementById('debug');
    if (!ta) {
        var ta = document.createElement('textarea');
        ta.id = 'debug';
        ta.rows = 8;
        ta.cols = 160;
        document.body.appendChild(ta);
    }
    ta.value += s+'\n';
}
function exec(cname) {
    editbox.focus();
    doc.execCommand(cname, false, null);
    editbox.focus();
}
function removeFormatting() {
    editbox.focus();
    //   var cursor = doc.selection.createRange();
    //   var parent=cursor.parentElement();
    var parent=getParentElement();//alert(parent.tagName);
    if(parent==doc.body)
        return;
    parent.className="";
    parent.outerHTML=parent.innerHTML;
    doc.execCommand('formatBlock', false, 'Normal');
    cursor.pasteHTML(cursor.text);
    editbox.focus();
}
function setFormatStyle(format) {
    editbox.focus();
    if(!format)
        return;
    var cursor = doc.selection.createRange();
    var parent=cursor.parentElement();
    var myformat=format.split(":")[1];
    // parent.className="";
    if(myformat) {
        cursor.pasteHTML("<span class='"+myformat+"'>"+cursor.text +"</span>");
    } else {
        doc.execCommand('formatBlock', false, format);
    }
    document.all.selectFormatStyle.selectedIndex=0;
    editbox.focus();
}
function ParseTeX() {
    try {
        cursor = doc.selection.createRange();
        var parent=cursor.parentElement();
        if(parent.className=="math") {
            //alert(parent.innerText);

            var text = jsMath.GetElementText(parent);
            document.all.editorStatus.innerHTML =jsMath.DisplayMode(text);
            // parent.className = 'typeset';
        }
        //document.all.editorStatus.innerHTML="1111111111";
    } catch(e) {}
}
