// some XML related code based Leslie A. Hensley work.
// Original note:
//   Copyright 2004 Leslie A. Hensley
//   hensleyl@papermountain.org
//   you have a license to do what ever you like with this code
//   orginally from Avai Bryant
//   http://www.cincomsmalltalk.com/userblogs/avi/blogView?entry=3268075684
// Rest of the work is licensed by the author I. Badinov
// under Creative Commons License 2.5:
// You have license to do what ever you like with this code,
// if you give credits to the author.
// Full License terms: http://creativecommons.org/licenses/by/2.5/legalcode

if (navigator.userAgent.indexOf("Safari") > 0){
	var isSafari = true;
	var isMoz = false;
	var isIE = false;
	var isOpera = false;
}else if (navigator.product == "Gecko"){
	var isSafari = false;
	var isMoz = true;
	var isIE = false;
	var isOpera = false;
}else if (navigator.userAgent.indexOf("Opera") > 0){
	var isSafari = false;
	var isMoz = false;
	var isIE = false;
	var isOpera = true;
}else{
	var isSafari = false;
	var isMoz = false;
	var isIE = true;
	var isOpera = false;
}

function recreateTR(parentElement, subtree)
{
  for(var i = parentElement.childNodes.length-1; i>=0; i--)
  {
    parentElement.removeChild(parentElement.childNodes[i]);
  }

  for(var i=0; i<subtree.childNodes.length; i++)
  {
    var cell = document.createElement(subtree.childNodes[i].nodeName);
    copyAttributes(subtree.childNodes[i], cell);
    cell.innerHTML = flattenChildren(subtree.childNodes[i].childNodes)
    parentElement.appendChild(cell);
  }
}


/* Functions to handle browser incompatibilites */
function eventElement(event)
{
  if(isMoz)
  {
    return event.currentTarget;
  }
  else
  {
    return event.srcElement;
  }
}

/* XML Helper functions */
function flatten(node)
{
	if(node.nodeType == 1)
	{
		return '<' + node.nodeName + flattenAttributes(node) + '>' +
		flattenChildren(node.childNodes) + '</' + node.nodeName + '>';
	}
	else if(node.nodeType == 3)
	{
		return node.nodeValue;
	}
}

function flattenAttributes(node)
{
  var buffer = ''
  for(var i=0;i<node.attributes.length;i++)
  {
    var attribute = node.attributes[i];
    buffer += ' '+attribute.name+'="'+attribute.value+'"'
  }
  return buffer;
}

function flattenChildren(nodes)
{
	var buffer = '';
	if(nodes.length > 0)
	{
		for (var i=0;i<nodes.length;i++)
		{
			buffer += flatten(nodes[i]);
		}
	}
	return buffer;
}

function copyAttributes(source, destination)
{
  for(var i=0;i<source.attributes.length;i++)
  {
    var attribute = source.attributes[i];
    destination.setAttribute(attribute.name, attribute.value);
  }
  destination.className = source.getAttribute('class');
}

function getexpirydate( nodays){
var UTCstring;
Today = new Date();
nomilli=Date.parse(Today);
Today.setTime(nomilli+nodays*24*60*60*1000);
UTCstring = Today.toUTCString();
return UTCstring;
}
function ReadCookie(cookiename) {
 var cookiestring=""+document.cookie;
 var index1=cookiestring.indexOf(cookiename);
 if (index1==-1 || cookiename=="") return "";
 var index2=cookiestring.indexOf(';',index1);
 if (index2==-1) index2=cookiestring.length;
 return unescape(cookiestring.substring(index1+cookiename.length+1,index2));
}
function SetCookie(name,value,duration){
var cookiestring=name+"="+escape(value)+";EXPIRES="+getexpirydate(duration);
document.cookie=cookiestring;
if(!ReadCookie(name)){
return false;
}
else{
return true;
}
}

function UnSetCookie(cookieName) {
	var today = new Date();
	var expire = new Date();
	expire.setTime(today.getTime() - 3600000*24);
	document.cookie = cookieName+"=;expires="+expire.toGMTString();
}

function save(saved){
	for (var i=0;i<100;i++){
		UnSetCookie(saved.id+i);
	}
	var j=0;
	for (i=0;i<saved.options.length;i++){
		j++;
		SetCookie(saved.id+j,saved.options[i].value,3500);
	}
}
function add(jo,saver){
if (document.getElementById(saver))var saved=document.getElementById(saver);
	if (jo.value){
		var nn=saved.options.length;
		var skipsave=false;
		for (var i=0;i<nn;i++){
			if (jo.value==saved.options[i].value) skipsave=true;
		}
		if (!skipsave){
			saved.options[nn]=new Option(jo.value,jo.value);
			save(saved);
		}
	}
}
function del(saved){
	if (saved.selectedIndex>=0){
		var nn=saved.options.length;
		saved.options[saved.selectedIndex]=null;
		save(saved);
		UnSetCookie(saved.id+nn);
		enumstored(saved);
	}
}
function enumstored(saved){
	saved.options.length=0;
	var ll='';
	for (var i=0;i<100;i++){
		ll=ReadCookie(saved.id+i);
		// UnSetCookie("s"+i);
		if (ll!='') {
			saved.options[saved.options.length]=new Option(ll,ll);
			// SetCookie("s"+(saved.options.length-1),saved.options[saved.options.length-1].value,3500);
		}
	}
	genpreview();
}
function genpreview() {
	var jo=document.getElementById('jo');
	var repl=document.getElementById('repl');
	var test=document.getElementById('test');
	var replace=document.getElementById('replace');
	var lreplview=document.getElementById('lreplview');
	var replview=document.getElementById('replview');
	var preview=document.getElementById('preview');
    var z=jo.value;
	var flagi=window.document.getElementById("flagi").checked?"i":"";
	var flagg=window.document.getElementById("flagg").checked?"g":"";
	var flagm=window.document.getElementById("flagm").checked?"m":"";
	var flags=window.document.getElementById("flags").checked?"s":"";
	try{
		var re= new RegExp (z?z:"",""+flagi+flagg+flagm);
		var m=re.exec(test.value);
	}catch(e){
	 repl.innerHTML="Invalid REGEX";
	}
		var str=test.value;
		var r;
		r=str.replace(re, "&a1;u&a2;$&&a1;/u&a2;");
		g=replace.value;
		g=g.replace(/</g,"&lt;");
		g=g.replace(/>/g,"&gt;");
		f=str.replace(re, "&a1;u&a2;"+g+"&a1;/u&a2;");
		r=r.replace(/</g,"&lt;");
		r=r.replace(/>/g,"&gt;");
		r=r.replace(/&a1;/g,"<");
		r=r.replace(/&a2;/g,">");
		r=r.replace(/\"/g,"&quot;");
		f=f.replace(/</g,"&lt;");
		f=f.replace(/>/g,"&gt;");
		f=f.replace(/&a1;/g,"<");
		f=f.replace(/&a2;/g,">");
		f=f.replace(/\"/g,"&quot;");
		r=r.replace(/\r/g,"");
		f=f.replace(/\r/g,"");
		document.expando = true;
		r=r.replace(/\n/g,"<span class='nl'></span><br>");
		f=f.replace(/\n/g,"<span class='nl'></span><br>");
		preview.innerHTML=r;
		repl.innerHTML=replace.value;
		replview.innerHTML=f;

		if (m == null) {
    lreplview.innerHTML="No match";
  } else {
    var s = "matches: ";

   if(m.length>0){

        for(i=0; i< m.length; i++){
            s = s + i+": (" + m[i] + ")<br>";
        }

    }
     lreplview.innerHTML=s;
  }
}
function copy1() {
	var test=document.getElementById('test');
	var replace=document.getElementById('replace');
    test.value=preview.innerText;
    replace.value=repl.innerText;
}
function aonkeyup(){document.getElementById('jo').focus();genpreview()};
function aonkeypress(){genpreview()};
function aonchange(){genpreview()};
function aonblur(){add(document.getElementById('jo'),'saved')};
function bonblur(){add(document.getElementById('replace'),'savedrepl')};
function constructUri(z){
	var uri='regtest.php?z='+z;
	var id='jo';
	var id2='test';
	var id3='replace';
	var id4='flagi';
	var id5='flagm';
	var id6='flagg';
	var id7='flags';
    var elementValue = escape(document.getElementById(id).value.replace(/\+/g,'&43;').replace(/\\/g,'&92;'));
	var elementValue2 = escape(document.getElementById(id2).value.replace(/\+/g,'&43;').replace(/\\/g,'&92;'));
	var elementValue3 = escape(document.getElementById(id3).value.replace(/\+/g,'&43;').replace(/\\/g,'&92;'));
	var elementValue4 = escape(document.getElementById(id4).checked);
	var elementValue5 = escape(document.getElementById(id5).checked);
	var elementValue6 = escape(document.getElementById(id6).checked);
	var elementValue7 = escape(document.getElementById(id7).checked);


	var separator = "?";
	if(uri.indexOf("?") >= 0)separator = "&";
	newuri = uri + separator + "s1=" + elementValue + "&s2=" + elementValue2 +"&s3=" + elementValue3 +
		"&s4=" + elementValue4+ "&s5=" + elementValue5 + "&s6=" + elementValue6 + "&s7=" + elementValue7;
	return newuri;
}

/*function start() {
	if (timeout)window.clearTimeout(timeout);
	timeout = window.setTimeout(updater, 300);
}*/

function replaceUpdate(){
	var request = false;
    if (window.XMLHttpRequest) {
        request = new XMLHttpRequest();
    }else{
		request = new ActiveXObject("Microsoft.XMLHTTP");
	}

    function update(){
        if(request && request.readyState < 4)
            request.abort();
        request.onreadystatechange = processRequestChange;
        var typereg2=document.getElementById('typereg2');
		if(typereg2.checked){
			request.open("GET", constructUri(1));
		}else{
			request.open("GET", constructUri(2));
		}

        request.send(null);
        return true;
    }

    function processRequestChange(){
		if(request.readyState == 4){
			var xmlDoc=document.createElement("span");
			xmlDoc.innerHTML = request.responseText;
			var nodes = xmlDoc.getElementsByTagName("div");
			for(var i=0;i<nodes.length;i++){
				if(nodes[i].nodeType==1 && nodes[i].getAttribute("id")!=null){
					var id = nodes[i].getAttribute("id");
					document.getElementById(id+"w").innerHTML = nodes[i].innerHTML;
				}
			}
		}
    }
    if (request)
		update();
}
function typechange(){
	var requt=false;
	if (window.XMLHttpRequest) {
		requt = new XMLHttpRequest();
	}else{
		requt = new ActiveXObject("Microsoft.XMLHTTP");
	}
	if (!requt){
		typereg2.style.display='none';
		typereg3.style.display='none';
	}
	var oJo=document.getElementById('jo');
	var oTest=document.getElementById('test');
	var oReplace=document.getElementById('replace');
	var typereg1=document.getElementById('typereg1');
	var typereg2=document.getElementById('typereg2');
	var typereg3=document.getElementById('typereg3');
	var replacet=document.getElementById('replacet');
	if(typereg1.checked){
		replacet.title='JScript special chars: $& - found text, $1..$99 - substrings';
	}
	if(typereg2.checked){
		replacet.title='PCRE special chars: $0 - found text, $1..$99 - substrings';
	}
	if(typereg3.checked){
		replacet.title='POSIX special chars: \\0 - found text, \\1..\\99 - substrings';
	}

	if(!typereg1.checked){
		oJo.onkeypress = replaceUpdate;
		oJo.onchange = replaceUpdate;
		oJo.onkeyup = replaceUpdate;
		oJo.onblur = replaceUpdate;

		oTest.onkeypress = replaceUpdate;
		oTest.onchange = replaceUpdate;
		oTest.onkeyup = replaceUpdate;
		oTest.onblur = replaceUpdate;

		oReplace.onkeypress = replaceUpdate;
		oReplace.onchange = replaceUpdate;
		oReplace.onkeyup = replaceUpdate;
		oReplace.onblur = replaceUpdate;

		replaceUpdate();
	}else{
		oJo.onkeypress = aonkeypress;
		oJo.onchange = aonchange;
		oJo.onkeyup = aonkeyup;
		oJo.onblur = aonblur;

		oTest.onkeypress = genpreview;
		oTest.onchange = genpreview;
		oTest.onkeyup = genpreview;
		oTest.onblur = genpreview;

		oReplace.onkeypress = genpreview;
		oReplace.onchange = genpreview;
		oReplace.onkeyup = genpreview;
		oReplace.onblur = bonblur;
		genpreview();
	}

}


var ss=0;
var sx=0;
var sy=0;
var sxn=0;
var syn=0;
function tabdown(e){
	if (window.event){
		sx = (event.clientX + document.body.scrollLeft);
		sy = (event.clientY + document.body.scrollTop);
	}else{
		sx = (e.clientX + document.body.scrollLeft);
		sy = (e.clientY + document.body.scrollTop);
	}
	ss=1;
}

function tabdown2(e){
	if (window.event){
		sx = (event.clientX + document.body.scrollLeft);
		sy = (event.clientY + document.body.scrollTop);
	}else{
		sx = (e.clientX + document.body.scrollLeft);
		sy = (e.clientY + document.body.scrollTop);
	}
	ss=2;
	window.cancelBubble=true;
}
function tabdown3(e){
	if (window.event){
		sx = (event.clientX + document.body.scrollLeft);
		sy = (event.clientY + document.body.scrollTop);
	}else{
		sx = (e.clientX + document.body.scrollLeft);
		sy = (e.clientY + document.body.scrollTop);
	}
	ss=2;
	window.cancelBubble=true;
}
function tabup(e){
	var oTest=document.getElementById('test');
	var oJo=document.getElementById('jo');
	ss=0;
	SetCookie('testwidth',oTest.style.width,3600);
	SetCookie('testheight',oTest.style.height,3600);
	SetCookie('jowidth',oJo.style.width,3600);

}



function mmousemove(e){
	if (window.event){
		var newX = (event.clientX + document.body.scrollLeft);
		var newY = (event.clientY + document.body.scrollTop);
	}else{
		var newX = (e.clientX + document.body.scrollLeft);
		var newY = (e.clientY + document.body.scrollTop);
	}

	if (ss==1){

		var oTest=document.getElementById('test');

		var distanceX = (newX - sx);
		var distanceY = (newY - sy);
		sx= newX;
		sy = newY;
		ndx=(oTest.offsetWidth+distanceX);
		ndy=(oTest.offsetHeight+distanceY);
		if ((ndx>30) && (ndy>30)&&(ndx<1000)&& (ndy<1000)){
		oTest.style.width=ndx+'px';
		oTest.style.height=ndy+'px';
		/*window.status="w= "+ndx+", h= "+ndy+"";*/
		}
	}
	if (ss==2){

		var oJo=document.getElementById('jo');
		var moJo=document.getElementById('saved');
		var distanceX = (newX - sx);
		var distanceY = (newY - sy);
		sx= newX;
		sy = newY;
		ndx=(oJo.offsetWidth+distanceX);
		qdx=ndx+15;
		q2dx=-(ndx+3);
		rightVal=(ndx+15);
		leftVal=(ndx-1);
		if (ndx>30){
		/*opera.postError(moJo.style.marginLeft);*/
		oJo.style.width=ndx+'px';
		moJo.style.width=qdx+'px';
		moJo.style.marginLeft=q2dx+'px';
		moJo.style.clip="rect(1px "+rightVal+"px 20px "+leftVal+"px)";
		}
	}
}
/* Get the selected text at onmouseup, and save it. then use it later. */
/*var selectedText = "";
window.addEventListener( 'load', init, false );

function init() {
if( window.getSelection || ( document.selection && document.selection.createRange ) )
document.addEventListener( 'mouseup', setSelectedText, false );
}

function setSelectedText() {
var txt = window.getSelection ? window.getSelection().toString() : document.selection.createRange().text;
if( txt.length > 0 ) selectedText = txt;
}

function getSelectedText() {
return selectedText;
}*/
function init(){

	var tabbl=document.getElementById('tabb');
	var tabal=document.getElementById('taba');
	var oTest=document.getElementById('test');
	enumstored(document.getElementById('saved'));
	enumstored(document.getElementById('savedrepl'));
	document.getElementById('content').style.display='block';
	typechange();

	tabbl.onmousedown = tabdown;
	tabbl.onmouseup = tabup;

	tabal.onmousedown = tabdown2;
	tabal.onmouseup = tabup;
	/*document.body.onselect = function(){
		alert(document.selection.createRange().text.toString());
		document.selection.cancel();
	}*/

	document.onmousemove=mmousemove;
	document.onmouseup=tabup;
	zw=ReadCookie('testwidth');
	zw=parseInt(zw.replace('px',''));
	zh=ReadCookie('testheight');
	zh=parseInt(zh.replace('px',''));
	ndx=ReadCookie('jowidth');
	ndx=parseInt(ndx.replace('px',''));
	if ((zw>30)&&(zw<1000))oTest.style.width=zw+'px';
	if ((zh>30)&&(zh<1000))oTest.style.height=zh+'px';
	if (ndx>30){
		var oJo=document.getElementById('jo');
		var moJo=document.getElementById('saved');
		qdx=ndx+15;
		q2dx=-(ndx+3);
		rightVal=(ndx+15);
		leftVal=(ndx-1);
		if ((ndx>30)&&(ndx<1000)){
			oJo.style.width=ndx+'px';
			moJo.style.width=qdx+'px';
			moJo.style.marginLeft=q2dx+'px';
			moJo.style.clip="rect(1px "+rightVal+"px 20px "+leftVal+"px)";
		}
	}
}
