var minFontSize=1;
var maxFontSize=4;

// These variables are used to calculate the dimension of the choose color dialog
// and choose font dialog.
// They should be set according to the values used in the color.html and font.html files.
var colorsPerRow = 4;
var colorRows = 4;
var colorCellWidth = 20;
var colorCellHeight = 20;

var numberOfFonts = 4;
var fontCellHeight = 20;
var fontDialogWidth = 400;

var imagesList;

function bold(oDiv) {
	oDiv.focus(); document.execCommand("Bold"); 
	return;
}

function makeUnorderedList(oDiv) {
	oDiv.focus(); document.execCommand("InsertUnorderedList"); 
	return;
}

function itallic(oDiv) {
	oDiv.focus(); document.execCommand("Italic"); 
	return;
}

function left_justify(oDiv) {
	oDiv.focus(); document.execCommand("JustifyLeft"); 
	return;
}

function center(oDiv) {
	oDiv.focus(); document.execCommand("JustifyCenter"); 
	return;
}

function right_justify(oDiv) {
	oDiv.focus(); document.execCommand("JustifyRight"); 
	return;
}

function font_up(oDiv) {
	oDiv.focus(); 
	size = document.queryCommandValue("FontSize") +1 ;
	document.execCommand("FontSize", "false", size); 
	return;
}

function font_down(oDiv) {
	oDiv.focus(); 
	size = document.queryCommandValue("FontSize") -1 ;
	document.execCommand("FontSize", "false", size); 
	return;
}

function setImagesList(imgLst) {
    imagesList = imgLst;
}

function setcolor(oDiv, fromExtern) {
	var filePath = "color.html";
	if (!fromExtern) filePath = "htmledit/" + filePath;
    var color = "";
	oDiv.focus(); 
	var width = ((colorCellWidth*colorsPerRow)+70);
	var height = ((colorCellHeight*colorRows)+120)
	color = showModalDialog(filePath, "", "dialogHeight:" + height + "px;dialogWidth:" + width + "px;help:no;status:no;scroll:no");
	if (!(color)) return;
	document.execCommand("ForeColor", "false", color); 
	return;
}

function insertimage(oDiv, fromExtern, imagesList, baseURI) {
    oDiv.focus();
	var filePath = "images.html";
	if (!fromExtern) filePath = "htmledit/" + filePath;
    var imgpath = "";
	var width = (400);
	var height = (400);
	imgpath = showModalDialog(filePath, new Array(imagesList,baseURI) , "dialogHeight:" + height + "px;dialogWidth:" + width + "px;help:no;status:no;scroll:yes;resizable:yes");
	if (!(imgpath)) return;
        if (document.selection.type == "Control") {
            document.selection.clear();
        }
	var range = document.selection.createRange();
    range.pasteHTML('<IMG src="' + imgpath + '" webmlsrc="' + imgpath + '">');
	return;
}

function setfont(oDiv, fromExtern) {
	var filePath = "font.html";
	if (!fromExtern) filePath = "htmledit/" + filePath;
    var font = "";
	oDiv.focus(); 
	var height = numberOfFonts*fontCellHeight + 120;
	font = showModalDialog(filePath , "", "dialogHeight:" + height + "px;dialogWidth:" + fontDialogWidth + "px;help:no;status:no;scroll:no;");
	if (!(font)) return;
	document.execCommand("FontName", "false", font); 
	return;
}

function display(oDiv) {
	alert(oDiv.innerHTML);	
	return;
}

function fillTextarea() {
	var textareas = document.getElementsByTagName("textarea");
	for (i=0;i<textareas.length;i++) {
	    var currTextarea = textareas[i];
	    if (currTextarea.id.substring(0,5) != "webml") break;
	    currDiv = document.getElementById(currTextarea.id.substring(0, currTextarea.id.length - 8) + "div");
	    if (currDiv == null) break;
	    removeNonWebMLLinks(currDiv);
	    var html = unMakeWebMLLinks(currDiv.innerHTML);
	    currTextarea.value = cleanUpHtml(html);
	}
}

function cleanUpHtml(html) {
	var toConvert = escape(html);
    var converted = "";
    var index = toConvert.indexOf("%u");
    while (index != -1) {
    	converted += toConvert.substring(0, index) + "%26%23" + decfromhex(toConvert.substring(index+2, index+6)) + "%3B";
	    toConvert = toConvert.substring(index + 6);
    	index = toConvert.indexOf("%u");
    }
    converted += toConvert;
    converted = unescape(converted);
    var re = new RegExp ('<br>', 'gi') ;
    converted = converted.replace(re, '<BR/>\n') ;
//    converted = closeOpenTags(converted);
    converted = adjustNonQuotedAttributes(converted);
    return converted;
}

function fillDiv() {
    var divs = document.getElementsByTagName("div");
	for (i=0;i<divs.length;i++) {
	    var currDiv = divs[i];
	    if (currDiv.id.substring(0,5) != "webml") break;
	    currTextarea = document.getElementById(currDiv.id.substring(0, currDiv.id.length - 3) + "textarea");
	    var html = makeWebMLLinks(currTextarea.value);
	    currDiv.innerHTML = html;
	    currDiv.onkeydown=noctrlk;
	}
}


function makeLink(oDiv, fromExtern) {
	var filePath = "emaillink.html";
	if (!fromExtern) filePath = "htmledit/" + filePath;
    var urlink = "";
	oDiv.focus(); 
	var range = document.selection.createRange();
	var inner = range.htmlText;
	if (inner == "") return;
	var preText = range.text;
	urlink = showModalDialog(filePath, "", "dialogHeight:200px;dialogWidth:300px;help:no;status:no");
	if (!(urlink)) return;
	if (urlink == "") {
		document.execCommand("unlink", false); 
		return;
	}
	range.pasteHTML('<A href="mailto:' + urlink + '" webmlhref="mailto:' + urlink + '">' + preText + '</A>');
	return;
}

function MM_findObj(n, d) { //v3.0
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document); return x;
}

function MM_showHideLayers() { //v3.0
  var i,p,v,obj,args=MM_showHideLayers.arguments;
  for (i=0; i<(args.length-2); i+=3) if ((obj=MM_findObj(args[i]))!=null) { v=args[i+2];
    if (obj.style) { obj=obj.style; v=(v=='show')?'visible':(v='hide')?'hidden':v; }
    obj.visibility=v; }
}

function MM_callJS(jsStr) { //v2.0
  return eval(jsStr)
}

function MM_displayStatusMsg(msgStr) { //v1.0
  status=msgStr;
  document.MM_returnValue = true;
}

function decfromhex(num) {
    while (num.length < 4) {
       num = "0" + num;
    }
    return (eval(getnum(num.substring(3,4))) + eval(getnum(num.substring(2,3))) * 16 +eval(getnum(num.substring(1,2))) * 256 + eval(getnum(num.substring(0,1))) * 4096);
 }

 function getnum(letter) {
     if (letter <= "9") {
         return letter;
     }

     else {
     if ((letter == "a") || (letter == "A")) {
         return 10 }
     if ((letter == "b") || (letter == "B")) {
         return 11 }
     if ((letter == "c") || (letter == "C")) {
         return 12 }
     if ((letter == "d") || (letter == "D")) {
         return 13 }
     if ((letter == "e") || (letter == "E")) {
         return 14 }
     if ((letter == "f") || (letter == "F")) {
         return 15 }
         return 0;
     }
 }

function noctrlk() {
//	if (event.keyCode == 75 && event.ctrlKey == true) {
//		event.returnValue = true;
//	}
//	if (event.keyCode == 85 && event.ctrlKey == true) {
//		event.returnValue = true;
//	}
//	if (event.keyCode == 73 && event.ctrlKey == true) {
//		event.returnValue = true;
//	}
//	if (event.keyCode == 86 && event.ctrlKey == true) {
//		event.returnValue = true;
//	}

}

function noctrlk_simple() {
//	if (event.keyCode == 75 && event.ctrlKey == true) {
//		event.returnValue = false;
//	}
//	if (event.keyCode == 85 && event.ctrlKey == true) {
//		event.returnValue = false;
//	}
//	if (event.keyCode == 73 && event.ctrlKey == true) {
//		event.returnValue = false;
//	}
//	if (event.keyCode == 86 && event.ctrlKey == true) {
//		event.returnValue = false;
//	}

}


function removeAnchor(div, anchor) {
	var index = div.innerHTML.indexOf(anchor.outerHTML);
	if (index == -1) {
		return;
	}
	var pre = div.innerHTML.substring(0, index);
	var post = div.innerHTML.substring(index + anchor.outerHTML.length); 
	div.innerHTML = pre + anchor.innerHTML + post;
}

function removeNonWebMLLinks(div) {
    var children = div.getElementsByTagName("A");
    var found = true;
    while (found) {
        found = false;
        for (k=0;k<children.length;k++) {
            currChild = children[k];
            if (currChild.getAttribute("webmlhref") == null) {
                removeAnchor(div, currChild);
                found = true;
            }
        }
        children = div.getElementsByTagName("A");
   }
}

function adjustNonQuotedAttributes(html) {
  	var fmatch = getAnyTagWithAttsFirstMatch(html);
  	if (fmatch == "") return html;
	var iofm = html.indexOf(fmatch);
	while (iofm != -1) {
        var attRe = new RegExp ('( [^\"\'= ]+[ ]*=[ ]*"[^\"]*")|( [^\"\'= ]+[ ]*=[ ]*\'[^\']*\')|( [^\"\'= ]+[ ]*=[ ]*[^ \"\'>]+)', 'gi') ;
        var intfm = indexOfFirstMatch(fmatch,attRe);
        var oldLength=fmatch.length;
        var attr = firstMatch(fmatch,attRe);
	    while (intfm != -1) {
            var intpluslength = attr.length;
            if (attr.substring(attr.length-1) != "'" && attr.substring(attr.length-1) != '"') {
                var newAttr = attr.substring(0,attr.indexOf('=')+1) + getSafeAttributeValue(attr);
                fmatch = fmatch.substring(0,intfm) + newAttr + fmatch.substring(intfm+attr.length);
                intpluslength = intpluslength+2;
            }
            attr = firstMatch(fmatch.substring(intfm + intpluslength),attRe);
            if (attr == null) break;
            intfm = intfm + intpluslength + fmatch.substring(intfm + intpluslength).indexOf(attr);
        }
		var plusLength = fmatch.length;
        html = replaceSubstring(html, fmatch, iofm, iofm+oldLength);
		fmatch = getAnyTagWithAttsFirstMatch(html.substring(iofm + plusLength));
		if (fmatch == "") return html;
		iofm = iofm + plusLength + html.substring(iofm + plusLength).indexOf(fmatch);
	}
	return html; 	
}

function closeOpenTags(html) {
	var fmatch = getOpenTagFirstMatch(html,'IMG');
  	if (fmatch == "") return html;
	var iofm = html.indexOf(fmatch);
	while (iofm != -1) {
	    html = replaceSubstring(html, '/>', iofm+fmatch.length-1, iofm+fmatch.length);
	    var pluslength = fmatch.length+1;
	    fmatch = getOpenTagFirstMatch(html.substring(iofm+pluslength),'IMG');
	    if (fmatch == "") return html;
	    iofm = iofm + pluslength + html.substring(iofm + pluslength).indexOf(fmatch);
	}
	return html; 	
}    

function makeWebMLLinks(html) {
  	var fmatch = getHrefTagFirstMatch(html);
  	if (fmatch == "") return html;
	var iofm = html.indexOf(fmatch);
	while (iofm != -1) {
		var href = (getAttributeSubstring(fmatch , "href") != "") ? getSafeAttributeValue(getAttributeSubstring(fmatch , "href")) : "";
		var src = (getAttributeSubstring(fmatch , "src") != "") ?  getSafeAttributeValue(getAttributeSubstring(fmatch , "src")) : "";
		var webmlsrc = "";
		var webmlhref = "";
		if (src != "") webmlsrc = ' webmlsrc=' + src;
		if (href != "") webmlhref = ' webmlhref=' + href;
		var plusLength = fmatch.length;
		if (webmlsrc != "" || webmlhref !="") {
		  var newTag = fmatch.substring(0, fmatch.length-1) + webmlhref + webmlsrc + ">";
		  html = replaceSubstring(html, newTag, iofm, iofm+fmatch.length);
		  plusLength=newTag.length;
		}
		fmatch = getHrefTagFirstMatch(html.substring(iofm + plusLength));
		if (fmatch == "") return html;
		iofm = iofm + plusLength + html.substring(iofm + plusLength).indexOf(fmatch);
	}
	return html; 	
}
	
function unMakeWebMLLinks(html) {
    var fmatch = getHrefTagFirstMatch(html);
  	if (fmatch == "") return html;
	var iofm = html.indexOf(fmatch);
	while (iofm != -1) {
		var webmlsrc = getAttributeSubstring(fmatch , "webmlsrc");
		var webmlhref = getAttributeSubstring(fmatch , "webmlhref");
		var plusLength = fmatch.length;
		var newTag = fmatch;
		if (webmlhref != "") {
			var href = getAttributeSubstring(newTag , "href");
			newTag = replaceSubstring(newTag, "", newTag.indexOf(webmlhref)-1, newTag.indexOf(webmlhref) + webmlhref.length);
			if (href != "") newTag = replaceSubstring(newTag, "href=" + getSafeAttributeValue(webmlhref), newTag.indexOf(href), newTag.indexOf(href) + href.length);
			html = replaceSubstring(html, newTag, iofm, iofm+plusLength);
			plusLength = newTag.length;
		}
		if (webmlsrc != "") {
			var src = getAttributeSubstring(newTag , "src");
			newTag = replaceSubstring(newTag, "", newTag.indexOf(webmlsrc)-1, newTag.indexOf(webmlsrc) + webmlsrc.length);
			if (newTag.toUpperCase().substring(0,5) == "<IMG ") {
			    newTag = newTag.substring(0,newTag.length-1) + " />";
			}
			if (src != "") newTag = replaceSubstring(newTag, "src=" + getSafeAttributeValue(webmlsrc), newTag.indexOf(src), newTag.indexOf(src) + src.length);
			html = replaceSubstring(html, newTag, iofm, iofm + plusLength);
			plusLength = newTag.length;
		}
		fmatch = getHrefTagFirstMatch(html.substring(iofm + plusLength));
		if (fmatch == "") return html;
		iofm = iofm + plusLength + html.substring(iofm + plusLength).indexOf(fmatch);
	}
	return html;
}
	
function callExternEditor(textarea, baseURI) {
    if (baseURI == "") {
        baseURI = window.location.href.substring(0,window.location.href.lastIndexOf('/') + 1); 
    }
    var params = new Array(textarea,imagesList,baseURI);
	var ret = showModalDialog(baseURI + "Resources/htmledit/edit.html", params, "dialogHeight:500px;dialogWidth:600px;help:no;status:no;scroll:no;resizable:yes");
	if (ret) textarea.value = ret;
	textarea.focus();
} 

function firstMatch(sText, rExp) 	{
	return (sText.match(rExp) != null) ? sText.match(rExp)[0] : null;
}


function indexOfFirstMatch(sText,rExp) {
	return (sText.match(rExp) != null) ? sText.indexOf(sText.match(rExp)[0]) : -1;
}


function firstMatchLength(sText,rExp) {
	return (sText.match(rExp) != null) ? sText.match(rExp)[0].length : -1;
}

function replaceSubstring(sText, newString , fromIndex, toIndex) {
	sText = sText.substring(0,fromIndex) + newString + sText.substring(toIndex);
	return sText;
}

function getAttributeSubstring(tag, attr) {
	var re1 = new RegExp ('( [^\"\'= ]+[ ]*=[ ]*"[^\"]*")|( [^\"\'= ]+[ ]*=[ ]*\'[^\']*\')|( [^\"\'= ]+[ ]*=[ ]*[^ \"\'>]+)', 'gi') ;
	var iofm = indexOfFirstMatch(tag, re1);
	while (iofm != -1) {
		var fmatch = firstMatch(tag.substring(iofm), re1);
		if ((firstMatch(fmatch, new RegExp('[^ \"\'=]+', 'gi')) != null) && (firstMatch(fmatch, new RegExp('[^ \"\'=]+', 'gi')) == attr)) {
			return fmatch.substring(1);
		}
		iofm = (indexOfFirstMatch(tag.substring(iofm + fmatch.length), re1) != -1) ? indexOfFirstMatch(tag.substring(iofm + fmatch.length), re1) + iofm + fmatch.length : -1; 
	}
	return "";
}

function getTagFirstMatch(htmltext, tagname) { 
	var tagRe = new RegExp( '<[ ]*' + tagname + '[ ]*((' + '( [^\"\'= ]+[ ]*=[ ]*"[^\"]*")|( [^\"\'= ]+[ ]*=[ ]*\'[^\']*\')|( [^\"\'= ]+[ ]*=[ ]*[^ \"\'>]+)' + ')[ ]*)*>' , 'gi');
	var match = htmltext.match(tagRe);
	if (match != null) return match[0];
	return "";
}

function getAnyTagWithAttsFirstMatch(htmltext) { 
	var tagRe = new RegExp( '<[ ]*[a-zA-z]+[ ]*((' + '( [^\"\'= ]+[ ]*=[ ]*"[^\"]*")|( [^\"\'= ]+[ ]*=[ ]*\'[^\']*\')|( [^\"\'= ]+[ ]*=[ ]*[^ \"\'>]+)' + ')[ ]*)+(/)?>' , 'gi');
	var match = htmltext.match(tagRe);
	if (match != null) return match[0];
	return "";
}

function getHrefTagFirstMatch(htmltext) { 
	var tagRe = new RegExp( '<[ ]*' + '(A|IMG|AREA|LINK|FRAME|APPLET|EMBED|IFRAME|IMPUT|XML)' + '[ ]*((' + '( [^\"\'= ><]+[ ]*=[ ]*"[^\"]*")|( [^\"\'= ><]+[ ]*=[ ]*\'[^\']*\')|( [^\"\'= ><]+[ ]*=[ ]*[^ \"\'><]+)' + ')[ ]*)+(/)?>' , 'gi');
	var match = htmltext.match(tagRe);
	if (match != null) return match[0];
	return "";
}

function getOpenTagFirstMatch(htmltext, tagname) { 
	var tagRe = new RegExp( '<[ ]*' + '(' + tagname + ')' + '[ ]*((' + '( [^\"\'= ><]+[ ]*=[ ]*"[^\"]*")|( [^\"\'= ><]+[ ]*=[ ]*\'[^\']*\')|( [^\"\'= ><]+[ ]*=[ ]*[^ \"\'><]+)' + ')[ ]*)*(/)?>' , 'gi');
	var match = htmltext.match(tagRe);
	if (match != null) return match[0];
	return "";
}

function getSafeAttributeValue(attrsubstring) {
    var safevalue = firstMatch(attrsubstring, new RegExp('"[^"]*"$|\'[^\']*\'$|[^ "\'=]*$', 'gi'));
	if (safevalue == null) return "";
	if (!((safevalue.substring(0,1) == "'") || (safevalue.substring(0,1) == '"'))) {
		safevalue = '"' + safevalue + '"';
	} 
	return safevalue;
}

function getAttributeName(attrsubstring) {
    var name = firstMatch(attrsubstring, new RegExp('^[^=]+', 'gi'));
	if (name == null) return "";
	return name;
}