var debug=false;

function resizeWindow(){
    resetBookmarkDisplay();
    showBookmarks();
}


function formatTable(tabel){                
    tabel.className="formattedTable";
    // Over de nodes itereren:
    var rowclass="even";
    var rows = tabel.getElementsByTagName("TR");
    for(var counter = 0;counter < rows.length;counter++){
        rows[counter].className=rowclass;
        rowclass=rowclass=="even"?"odd":"even";
    }                
}

function doTableLayout(clickedItem, event){
    try{
        if(event.ctrlKey){
            if(confirm("Wilt u de opmaak van ALLE tabellen in het huidige veld aanpassen?")){
                // Tabel zoeken.
                var tabellen = clickedItem.getElementsByTagName("TABLE");
                for(var counter=0;counter<tabellen.length;counter++){
                    var tabel=tabellen[counter];
                    formatTable(tabel);
                }
            }
        }else if(event.altKey){
            if(confirm("Wilt u de opmaak wilt opschonen?")){
                cleanHtml(clickedItem);
            }
        }
    }catch(e){
        alert("Er is een fout opgetreden bij het weergeven van de tabel: "+e);
    }            
}

function cleanHtml(node){
        var value = node.innerHTML;
        var rep = new RegExp("(<.*?)(style=\".*?\")(.*?>)","gi");
        var classrep = new RegExp("(<.*?)(class=[^ >]+)(.*?>)","gi");
        var repxml = new RegExp("<\\?.*?xml:.*?/>","gi");
        var repo = new RegExp("<[ov]:.*?>","gi");
        var repoend = new RegExp("</[ov]:.*?>","gi");        
        value = value.replace(rep,"$1$3");       
        value = value.replace(classrep,"$1$3");
        value = value.replace(repxml,"");
        value = value.replace(repo,"");
        value = value.replace(repoend,"");
        node.innerHTML=value;
}

var bookmarksShown = false;

var showbmarks = false;
function morelloClick(clickedItem, event){
    try{
        if( event.altKey) {
            doManageAnchor(clickedItem,event);
            showBookmarks();            
        }else if(event.ctrlKey){
            if(!showbmarks){
                showbmarks=true;
                showBookmarks();
            }else{
                showbmarks=false;
                resetBookmarkDisplay();
            }
        }
    }catch(e){
        if(debug){alert(e);}
    }
}

function resetBookmarkDisplay(){
    var body = document.getElementsByTagName("body")[0];
    var divs = document.getElementsByTagName("div"); 
    for(var counter=0;counter<divs.length;counter++){
        var curBMark = divs[counter];
        if(curBMark.dynamic !=undefined && curBMark.bookmark!=undefined){        
            if(curBMark.bookmark!=null){
                curBMark.bookmark.div = null;
            }
            curBMark.style.display="none";            
        }
    }    
}

function showBookmarks(){
    if(showbmarks){
        if(window.onresize!=resizeWindow){
            window.onresize=resizeWindow;
        }
        var body = document.getElementsByTagName("body")[0];
        var bookmarks = document.getElementsByTagName("a");            
        for(var counter=0;counter<bookmarks.length;counter++){
            var bookmark = bookmarks[counter];
            var name = bookmark.getAttribute("name");
            if(name!=null){
                // See if the element is within an editable field:
                var bparent = bookmark.parentNode;
                var inSpan = false;                
                while(bparent!=null){                    
                    if(bparent.nodeName.toUpperCase() == "span" && bparent.getAttribute("mstagname")!=null){                        
                        bparent=null;
                        inSpan=true;
                    }else{
                        bparent=bparent.parentNode;
                    }
                }
                if(inSpan && bookmark.div == undefined){
                    bookmark.div = document.createElement("div");
                    var div = bookmark.div;
                    div.bookmarkName=name;
                    div.dynamic=true;
                    div.bookmark=bookmark;                        
                    body.appendChild(div);
                    div.style.position="absolute";
                    var pos = Position.cumulativeOffset(bookmark);                        
                    var top = pos[1] ; //- 10;
                    div.style.top=top + "px";
                    var left = pos[0] ;//+ bookmark.offsetWidth;
                    div.style.left=left + "px";
                    div.style.zIndex="100";
                    div.style.display="block";
                    div.style.visibility="visible";                
                    div.innerHTML=".";
                    div.style.backgroundColor="#ff0000";
                    div.style.color="#FFF";
                    div.style.padding="2px";
                    div.style.cursor="pointer";
                    div.style.width="2px";
                    div.style.height="2px";
                    div.style.fontSize="3px";                    
                    div.onclick=changeBookmarkFromDiv;
                    div.onmousemove=showName;
                    div.onmouseout=hideName;
                }else if(inSpan && bookmark.div!=null){
                    bookmark.div.bookmarkName=name;
                }
            }   
        }
    }
}

function showName(){
    if(this && this.bookmarkName){
        this.style.fontSize="12px";
        this.innerHTML="&#160;&#160;&#160;&#160;&#160;&#160;[&#160;"+this.bookmarkName + "&#160;]";        
    }
}

function hideName(){
    this.style.fontSize="3px";
    this.innerHTML=".";
}

function changeBookmarkFromDiv(){
    changeBookmark(this.bookmark);
    showBookmarks();
}

function changeBookmark(anchor){
    var newval = prompt("Wijzig de naam voor deze bookmark (leeg laten verwijdert de bookmark).",anchor.getAttribute("name"));
    if(newval=="" || newval==null){
        removeBookmark(anchor);
    }else{        
        anchor.div=null;
        anchor.outerHTML="<a id=\""+newval+"\" name=\""+newval+"\">" + anchor.innerHTML + "</a>";        
    }
}

function setBookmark(parentNode, childNode, name){
    
    var bookmark = document.createElement("A");                    
    // insert the bookmark node in splace of 
    parentNode.replaceChild(bookmark,childNode);
    // Fill the bookmark node:
    bookmark.setAttribute("name",name);
    bookmark.appendChild(childNode);                    
    bookmark.outerHTML="<a id=\""+name+"\" name=\""+name+"\">" + bookmark.innerHTML + "</a>";     

}

function removeBookmark(anchor){
    var pre_anchor_html="";
    var post_anchor_html="";                                
    var pnode = anchor.parentNode;
    var anchorFound = false;
    for(var counter=0;counter<pnode.childNodes.length;counter++){
        var curNode = pnode.childNodes[counter];
        if(curNode!=anchor && !anchorFound){
            pre_anchor_html+=curNode.outerHTML!=undefined?curNode.outerHTML:curNode.nodeValue;
        }else if(curNode!=anchor && anchorFound){
            post_anchor_html+=curNode.outerHTML!=undefined?curNode.outerHTML:curNode.nodeValue;
        }else if(curNode==anchor){
            anchorFound=true;
        }
    }    
    anchor.div=null;
    pnode.removeChild(anchor);
    pnode.innerHTML=pre_anchor_html + anchor.innerHTML + post_anchor_html;
    resetBookmarkDisplay();
}

/**
 * Function to manage the bookmarks in a page.
 */
function doManageAnchor(clickedItem, event){
    try{ 
        var nodeParent=null;
        // Eerst controleren of er een selectie is:
        var selection=null;
        if (window.getSelection){
            selection = window.getSelection();		
	}else if (document.getSelection){
            selection = document.getSelection();		
	}else if (document.selection){
		selection = document.selection;		
	}

        if(selection!=null && selection!=undefined && !selection.isCollapsed && getSelectionRange(selection).text!=""){
            if(debug) { alert("Selection is available, working on that."); }
            var range = getSelectionRange(selection);
            if(range.execCommand){
                var name = prompt("Geef de naam van de nieuwe bookmark.","");
                if(name!=null){
                    range.execCommand("CreateBookMark",false,name);
                }
            }else{
                alert("Bookmarken van selectie is niet mogelijk.");
            }   
            resetBookmarkDisplay();
        }else{
            if(debug){ alert("No selection, working on DOM from clicked item"); }
            // No selection, just a click. Get the surrounding item and see if it is an anchor 
            // if not, insert an anchor.
            var eventTarget = getEventTarget(event);
            
            // Get the node:
            var child = eventTarget.firstChild;
            
            // see if we need to work on the parent node:
            if( child.nodeName.toUpperCase()=="#TEXT" && 
                (child.parentNode.nodeName.toUpperCase() != "span" ||
                 child.parentNode.parentNode != clickedItem)){
                // Work on the outer item:
                if(debug){ alert("Working on parent node."); }
                child=child.parentNode;
            }

            if(child.nodeName.toUpperCase()=="#TEXT"){
                // No link yet, prompt for name:
                var name = prompt("Geef een naam voor de nieuwe bookmark.","");                
                if(name==null || name == ""){
                   // alert("U heeft geen naam opgegeven, de bookmark kan niet worden gemaakt..");
                }else{
                    setBookmark(eventTarget,child,name);
                }
            }else if(child.nodeName.toUpperCase()=="A"){
                if(debug){ alert("Anchor is surrounding the clicked node."); }
                // possibly there is an anchor defined already:
                var attr = child.getAttribute("name");
                if(attr==null){
                    // no bookmark available yet.
                    attr = prompt("Geef een naam voor de nieuwe bookmark.","");
                    if(attr!=null){
                        setBookmark(eventTarget,child,attr);
                    }
                }else{
                    changeBookmark(child);
                }
            }else{
                // Search for bookmarks
                var parent = child.parentNode;
                var anchor = null;
                // loop untie the outer span node is found
                while(anchor == null && parent!=null && parent!=clickedItem.firstChild){
                    if(parent.nodeName.toUpperCase()=="A"){
                        if(parent.getAttribute("name")!=null){
                            // Anchor is a bookmark:
                            anchor=parent;
                        }
                    }
                    parent = parent.parentNode;
                }
                
                if(anchor !=null ){
                    changeBookmark(anchor);
                }else{
                    // create the anchor:
                    var name = prompt("Geef een naam voor de nieuwe bookmark.","");                
                    if(name==null || name == ""){
                       // alert("U heeft geen naam opgegeven, de bookmark kan niet worden gemaakt..");
                    }else{
                        setBookmark(child.parentNode,child,name);
                    }                    
                }
            }
        }
    }catch(e){
        if(debug){
            alert("doManageAnchor: " + e.toString());
        }
    }
}

function getSelectionRange(selection){
    var range = null;
    if(selection!=null){
        if(document.selection && document.selection.createRange){
            range = selection.createRange();
        }else if(window.getSelection){
            range = selection.getRangeAt(0);
        }
    }
    return range;
}

function getEventTarget(event){
    if(event.originalTarget){
        return event.originalTarget;
    }else{
        return event.srcElement;
    }
}
