//var XMLEND="";

function indexOf(val){
  for(var i=0;i<this.length;i++){if(this[i]==val){return i;}}
  return -1;
}
Array.prototype.indexOf=indexOf;
				    

function modEnum_change(dummy,real){
  if(dummy.selectedIndex){
  	real.value=dummy.options[dummy.selectedIndex].text;
  } else{
    real.value="";
    real.focus();
  }
}
function modEnum_input(dummy,real){
  tmp=real.value;
  dummy.selectedIndex=0;
  real.value=tmp;
  real.select();
}


function has_selection(txtarea){
    txtarea.focus();
    return (	document.selection 
		&& (selectn=txtarea.document.selection) 
		&& (selectn.createRange().text!="") 
	    ) 
	   || (  txtarea.selectionEnd 
		&& (txtarea.selectionEnd - txtarea.selectionStart > 0)
	    );
}
function get_selection(txtarea){
    txtarea.focus();
    if (txtarea.selectionEnd-txtarea.selectionStart){
	return (txtarea.value).substring(txtarea.selectionStart,txtarea.selectionEnd);
    } else if(document.selection){
	return txtarea.document.selection.createRange().text;
    } 
}

function before_selection(txtarea){
    txtarea.focus();
    if(selStart=txtarea.selectionStart){
	return (txtarea.value).substring(0,selStart);
    } else if(document.selection){
	var dummy = (txtarea.createTextRange()).duplicate();
	dummy.moveStart( 'textedit', -1 );
	return dummy.text;
    }
}
function replace_selection(txtarea,txt){
    txtarea.focus();
    if((selEnd=txtarea.selectionEnd)-(selStart=txtarea.selectionStart)){
	txtarea.value= (txtarea.value).substring(0,selStart) + txt +(txtarea.value).substring(selEnd,txtarea.value.length);
	txtarea.setSelectionRange(selStart+txt.length,selStart+txt.length);
    } else if(document.selection){
	txtarea.document.selection.createRange().text=txt;
    }
}
	
function before_position(txtarea){
    txtarea.focus();
    if(selStart=txtarea.selectionStart){
	return (txtarea.value).substring(0,selStart);
    } else if(document.selection){
	drange1 = document.selection.createRange().duplicate();
	drange2 = document.selection.createRange().duplicate();
	drange2.moveToElementText(txtarea);
	drange2.setEndPoint('EndToEnd',drange1);

	return drange2.text;
    } else {
	return txtarea.value;
    }
}

function insert_at_position(txtarea,txt){
    if ( (selStart=txtarea.selectionStart) !== undefined){
	var scrollto=txtarea.scrollTop
	txtarea.value= (txtarea.value).substring(0,selStart) + txt +(txtarea.value).substring(txtarea.selectionEnd,txtarea.value.length);
	txtarea.setSelectionRange(selStart+txt.length,selStart+txt.length);
	txtarea.scrollTop=scrollto;
	txtarea.focus();
    } else if(document.selection){
	txtarea.focus();
	range = document.selection.createRange();
	range.text = txt;
    } else {
	txtarea.value += txt;
    }
}
	

function wrapOrInsert(tag,txtarea){
    var etag=(tag.split(" "))[0];
    // Als het om een < /> tag gaat kunnen we meteen inserten
    if(noEndReqd(tag)){
	insert_at_position(txtarea,"<"+tag+XMLEND+">");
    } else if(has_selection(txtarea)){
	preTxt=before_selection(txtarea);
	if(!(preTagStack=checkHtmlSyntax(txtarea,txtarea.name,preTxt)))
	    return;
	
	if(blockTag(tag) && preTagStack.length>0){
	    // We kunnen ook alle tags sluiten. We weten alleen niet of we zo 
	    // niet problemen verderop in het document
	    alert("Je probeert een <"+tag+"> binnen in een <"+
	    preTagStack.pop()+"> te plaatsen, dat kan niet");
	    return false;
	}
	
	txt=get_selection(txtarea);

	/*
	if(!(tagStack=checkHtmlSyntax(txtarea,txtarea.name,txt)))
	    return;

	if(tagStack.length>0){
	    alert("Je probeert <"+tag+"> om een stuk tekst, dat niet-"+
	    "gesloten tags bevat, te plaatsen.\nHet resultaat zou dan bijv "+
	    "<"+tag+">  <i>  <"+tag+">  </i> kunnen zijn, dat mag niet.");
	    return false;
	}
	*/
	// We controleren nu meteen ook op <p> <p></p> </p> ...

	txt="<"+tag+">"+txt+"</"+etag+">";
	if(!(tagStack=checkHtmlSyntax(txtarea,txtarea.name,txt,1)))
	    return;

	replace_selection(txtarea,txt);
    }
    else {
	// Insert <> or </ >. We controleren alleen syntax, tot het
	// insert punt.
	preTxt=before_position(txtarea);
	newTxt="";
	if(!(preTagStack=checkHtmlSyntax(txtarea,txtarea.name,preTxt)))
	    return;

	// We inserten </ >
	if((last=preTagStack.indexOf(tag)) != -1){
	    while (preTagStack[last]) {
		cTag=preTagStack.pop();
		newTxt += "</"+cTag+">";
	    }
	} else if(blockTag(tag) && preTagStack.length>0){
	    //alert("Je probeert een <"+tag+"> binnen in een <"+
	    //preTagStack.pop()+" te plaatsen, dat kan niet");
	    //return false;
	    while( preTagStack.length>0 ) {
		cTag=preTagStack.pop();
		newTxt += "</"+cTag+">";
	    }

	    newTxt += "<"+tag+">";
	} else {
	    newTxt += "<"+tag+">";
	    //preTagStack.push(tag);
	}

	insert_at_position(txtarea,newTxt);
	txtarea.focus();
    }
}

var acceptingField=null;
var surfDialog=0;
function openSurfDialog(fld){
    if( surfDialog || (surfDialog=window.open("","surfdialog")) ){
	try{ surfDialog.close();} catch(e) { }
	surfDialog=0;
    }
    surfDialog=window.open("/surf/","surfdialog","width=600,height=400,alwaysRaised=yes,dependent=yes,scrollbars=yes");
    acceptingfield=fld;
}
function openImageDialog(fld){
    if( surfDialog || (surfDialog=window.open("","surfdialog")) ){
	try{ surfDialog.close();} catch(e) { }
	surfDialog=0;
    }
    surfDialog=window.open("/images.php","surfdialog","width=600,height=400,alwaysRaised=yes,dependent=yes,scrollbars=yes");
    acceptingfield=fld;
}

function noEndReqd(tag){
    var notTags=new Array('img','br','hr','input');
    return (notTags.indexOf(tag)!=-1);
}

function blockTag(tag){
    var blockTag=/^(p|h[1-9]|form|div|iframe|object)$/i;
    return blockTag.exec(tag);
}

function checkHtmlSyntax(fld,ftitle){
    var tag=/<([\/]?)([-\w]+)(?:\s+[^>]*)*([\/]?>)/g;
    var test=false;
    var msg="";

    if(arguments.length<3){ txt=fld.value;}
    else{txt=arguments[2];}
    
    if(arguments.length>3) { 
	test=true; 
	msg="Wat je probeert in te voegen zal leiden tot ongeldige html-code:\n";
    } else {
	msg="Je hebt een fout gemaakt in de html-code van "+ftitle+":\n";
    }

    
    var tagStack= new Array();
    while(curTag=tag.exec(txt)){
	if(curTag[1]=="" && blockTag(curTag[2]) && tagStack.length>0 ) {
	    /*&& !blockTag(tagStack[tagStack.length-1])){
	    / <p>, <h?> can't be a child of any of the allowed tags */

	    alert(msg+"<"+curTag[2]+"> is een zogenaamd blok-element en mag "+
	    "niet voorkomen in het element <"+tagStack[tagStack.length-1]+">");
	    
	    if(!test) fld.focus();

	    return false;
	}   
	else if(noEndReqd(curTag[2]) && XMLEND==" /" && curTag[0].charAt(curTag[0].length - 2)!='/') {
	    alert(msg+"We accepteren alleen XML, dat betekent dat tags zonder"+
	    " eind-tag moeten eindigen met '/>'. Zo dus: <"+curTag[2]+" />");

	    return false;
	}
        else if(curTag[1]=="" && !noEndReqd(curTag[2]) ){
	    tagStack.push(curTag[2]);
	}
        else if(curTag[1]=='/'){
            if( ( (ff=tagStack.pop()) != curTag[2]) && !noEndReqd(curTag[2]) ){

		alert(msg+"Je moet stijlen altijd weer sluiten in de volgorde waarin je ze geopend hebt. <"+curTag[2]+">Dit mag<"+ff+">dus</"+curTag[2]+">niet</"+ff+">");
		
		if(!test) fld.focus(); 
		
                return false;
            }
        }
    }
    return tagStack;
}

function replaceTags(txt){
    txt=txt.replace(/<(darkred|red|orange|brown|yellow|green|olive|cyan|blue|darkblue|indigo|violet|white|black)>/g,"<span style='color:$1'>");
    txt=txt.replace(/<(xx-small|x-small|small|medium|large|x-large|xx-large)>/g,"<span style='font-size:$1'>");
    txt=txt.replace(/<\/(xx-small|x-small|small|medium|large|x-large|xx-large|darkred|red|orange|brown|yellow|green|olive|cyan|blue|darkblue|indigo|violet|white|black)>/g,"</span>");
    return txt;
}


function pseudoTags(txt,ftitle){
    var tag=/<([\/]?)(\w+)(\s+[^>]+)*>/g;
    var tagStack= new Array();
    var replaceStack = new Array();
    var trStr= [ /\s+style=\'color:([-\w]+)(?:;)*\'/ , /\s+style=\'font-size:([-\w]+)(?:;)*\'/ ]; 
    while(curTag=tag.exec(txt)){
        ff="";
        if(curTag[1]==""){
            if(noEndReqd(curTag[2])){continue;}
    
	    tagStack.push(curTag[2]);
            
            if(curTag[2]=="span"){
              for (var i=0; i<trStr.length; i++) {
                if(!curTag[3]){ff="";break;}
                ff=curTag[3].replace(trStr[i],"$1");
                if(ff!=curTag[3]){ break;}
              }
              if(ff==curTag[3]){ff="";}

              if(ff!=""){
                txt=txt.substr(0,curTag.index) + "<" + ff + ">"+ txt.substr(tag.lastIndex);
                tag.lastIndex=curTag.index + 2 + ff.length;
              }
            }
            replaceStack.push(ff);
        }
        else if(curTag[1]=='/'){
            if( (tagStack.pop()!=curTag[2]) && !noEndReqd(curTag[2]) ){
                alert("Je hebt een fout gemaakt in de html-code van "+ftitle+".\nJe moet stijlen altijd weer sluiten in de volgorde waarin je ze geopend hebt. <i>Dit mag<b>dus</i>niet</b>");
                /*return false;*/
            } else {
                if( (ff=replaceStack.pop()) != ""){
                    txt=txt.substr(0,curTag.index) + "</" + ff + ">" + txt.substr(tag.lastIndex);
                    tag.lastIndex=curTag.index + 3 + ff.length;
                }
            }
        }
    }
    return txt;
}


function changeHelp(txt,prop,val,fld){fld.value=txt;fld.style.setProperty(prop,val,'important');}
      
function showPreview(name){
    viewer=document.getElementById(name+'_VIEWER');
    editor=document.getElementById(name);
    document.getElementById(name+'_EC').style.display='none';
    document.getElementById(name+'_MENUBAR').style.display='none';
    

    //viewer.style.overflow='auto';
    //viewer.style.width=editor.style.width;
    // viewer.parentNode.setProperty("overflow","auto","important")
    //viewer.style.height=editor.parentNode.style.height; 

    viewer.innerHTML=replaceTags(editor.value);

    try{viewer.parentNode.style.display='table-cell';}
    catch(err){viewer.parentNode.style.display='block';}
    
    //viewer.style.height='20ex;';

}
function showEditor(name){
    //MSIE doesn't like table-cell ...
    try{document.getElementById(name+'_EC').style.display='table-cell';}
    catch(err){document.getElementById(name+'_EC').style.display='block';}
   
    try{document.getElementById(name+'_MENUBAR').style.display='table';}
    catch(err){document.getElementById(name+'_MENUBAR').style.display='block';}
	
    document.getElementById(name+'_VC').style.display='none';    

}

function truncate(txt,len) {
    if(txt.length>len) return txt.substr(0,len-3) + "...   ";
    //while(txt.length<len){ txt +="&nbsp;"; }
    return txt+"   ";
}
