var cookies = new CookieJar({
				expires:90*3600*24   // 90 days
		});
var mode;

function wrap2(str){
	return '!open2tag;'+str+'!close2tag;';
}

function wrap(str){
	
	return '!opentag;'+str+'!closetag;';
}

function normalize(str){
	return str.escapeHTML()
	.replace(/(\r\n|[\r\n])/gim,'<small>ꞈ</small><br/>')
	.replace(/!open2tag;/gim,'<u>')
	.replace(/!close2tag;/gim,'</u>')
	.replace(/!opentag;/gim,'<span>')
	.replace(/!closetag;/gim,'</span>');
}

function updateresult(){
	_regex=$('regex').value;
	_test=$('test').value;
	_replace=$('replace').value;
	_flag_1=$('flag_1').checked?'g':'';
	_flag_2=$('flag_2').checked?'i':'';
	_flag_3=$('flag_3').checked?'m':'';
	_flag_4=$('flag_4').checked?'s':'';

	if ($('mode_1').checked){
		mode=1;
		try{
			var re= new RegExp (_regex?_regex:"",""+_flag_1+_flag_2+_flag_3/*+_flag_4*/);
			var m=re.exec(_test);
			i=0;
			_replace_result='';
			_find_result=_test.replace(re,function (){
					return wrap(arguments[0]);
			});
			// alert(_find_result);
			$('find_result').update(normalize(_find_result));
			_replace_result=_test.replace(re,wrap2(_replace.replace(/\$([^\d&])/gim,'$$$1')));
				$('replace_result').update(normalize(_replace_result));
				matches='';
				if(m)m.each(function(x,k){
						if (k==0)k='&amp;';
						matches+='<b>$'+k+'</b> [<span>'+x+'</span>]<br/>';
				});
				$('matches').update(matches);
		}catch(e){
			$('find_result').update("invalid REGEX");
		}
	}else if($('mode_2').checked){
		
		mode=2;
		var params={
			mode:1,
			regex:_regex,
			test:_test,
			replace:_replace,
			flags:_flag_1+','+_flag_2+','+_flag_3+','+_flag_4
		}
		new Ajax.Request('regtest2.php', {
				method:'get',
				parameters:params,
				onSuccess: function(transport){
					var response = transport.responseText.evalJSON() || "no response text";

					$('find_result').update(response.a1);
					$('replace_result').update(response.a2);
					$('matches').update(response.a3);
				},
				onFailure: function(){ alert('Something went wrong...') }
		});
		// alert(Object.toJSON(params));
	}else if($('mode_3').checked){
		mode=3;
		var params={
			mode:2,
			regex:_regex,
			test:_test,
			replace:_replace,
			flags:_flag_1+','+_flag_2+','+_flag_3+','+_flag_4
		}
		new Ajax.Request('regtest2.php', {
				method:'get',
				parameters:params,
				onSuccess: function(transport){
					var response = transport.responseText.evalJSON() || "no response text";

					$('find_result').update(response.a1);
					$('replace_result').update(response.a2);
					$('matches').update(response.a3);
				},
				onFailure: function(){ alert('Something went wrong...') }
		});
	}


}

function init(){
	$('regex').observe('keyup',updateresult);
	$('test').observe('keyup',updateresult);
	$('replace').observe('keyup',updateresult);

	$('regex').observe('onchange',updateresult);
	$('test').observe('onchange',updateresult);
	$('replace').observe('onchange',updateresult);

	$('replace').title='JS special chars $&,$1..$99';
	
	$('flag_1').onclick=updateresult;
	$('flag_2').onclick=updateresult;
	$('flag_3').onclick=updateresult;
	$('flag_4').onclick=updateresult;

	$('mode_1').onclick=function(){mode=1;load($('sel'));$('matches').update('');updateresult();$('replace').title='JS special chars $&,$1..$99';}
	$('mode_2').onclick=function(){mode=2;load($('sel'));$('matches').update('');updateresult();$('replace').title='PCRE special chars \\0..\\99';}
	$('mode_3').onclick=function(){mode=3;load($('sel'));$('matches').update('');updateresult();$('replace').title='POSIX special chars \\0..\\99';}

	$('sel_drag').ondragstart=function(e){
		if (window.event) e=window.event;
		moveit='lsel';
		clickX=e.clientX+document.body.scrollLeft;
		clickY=e.clientY+document.body.scrollTop;
		oldWidth=parseInt($(moveit).getStyle('width'));
		oldHeight=parseInt($(moveit).getStyle('height'));
		return false;
	};

	$('sel_drag').onmousedown=$('sel_drag').ondragstart;
	$('regex').onkeyup=function(e){
		if (window.event) e=window.event;
		if(e.keyCode==46) del($('sel'));
		$('regex').focus();
	}

	$('test_drag').ondragstart=function(e){
		if (window.event) e=window.event;
		moveit='test';
		clickX=e.clientX+document.body.scrollLeft;
		clickY=e.clientY+document.body.scrollTop;
		oldWidth=parseInt($(moveit).getStyle('width'));
		oldHeight=parseInt($(moveit).getStyle('height'));
		return false;
	};
	$('test_drag').onmousedown=$('test_drag').ondragstart;

	$('sel_del').onmousedown=function(e){
		del($('sel'));
		$('regex').value='';
		updateresult();
		$('regex').focus();
	}
	$('sel').onchange=function(e){
		if (window.event) e=window.event;
		$('regex').value=this.value;
		updateresult();
		$('regex').focus();
		e.cancelBubble=true;
		if (navigator.userAgent.indexOf('Firefox')>=0) return false;
	};
	$('regex').onblur=function(e){
		if (window.event) e=window.event;
		add($('regex'),'sel');
		e.cancelBubble=true;
		if (navigator.userAgent.indexOf('Firefox')>=0) return false;
	};

	$('sel').onmousedown=function(e){
		if (window.event) e=window.event;
		add($('regex'),'sel');
		$('sel').selectedIndex=-1;
		if (navigator.userAgent.indexOf('Firefox')>=0) return false;

	};
	$('sel').onmouseup=function(e){
		if (window.event) e=window.event;
		e.cancelBubble=true;
	}
	// $('sel').onkeydown=checkKeycode;
	// $('sel').onmousedown=checkKeycode;
	document.onmouseup=function(e){
		if (window.event) e=window.event;
		moveit='';
		coords=$H({
			lsel_w:$('lsel').getStyle('width'),
			lsel_h:$('lsel').getStyle('height'),
			test_w:$('test').getStyle('width'),
			test_h:$('test').getStyle('height')
		});
		cookies.put('coords',coords.toJSON());

	}
	$('lsel').resizeit= function(newX, newY){
					newWidth=oldWidth+(newX-clickX);
					window.status=newWidth;
					if(newWidth<100)newWidth=100;
					if(newWidth>1000)newWidth=1000;
					$('lsel').setStyle({
							width:newWidth+'px'
					});
					$('sel').setStyle({
							clip:'rect('+1+', '+(newWidth-1)+', '+21+', '+(newWidth-19)+')'
					});
				}

	$('test').resizeit= function(newX, newY){
					newWidth=oldWidth+(newX-clickX);
					newHeight=oldHeight+(newY-clickY);
					if(newWidth<100)newWidth=100;
					if(newWidth>1000)newWidth=1000;
					if(newHeight<100)newHeight=100;
					if(newHeight>1000)newHeight=1000;
					$('test').setStyle({
							width:newWidth+'px',
							height:newHeight+'px'
					});
				}
	document.onmousemove = function(e){
		if (window.event) e=window.event;
		newX=e.clientX+document.body.scrollLeft;
		newY=e.clientY+document.body.scrollTop;
		if(moveit!=''){
			$(moveit).resizeit(newX,newY);
		}
	}

	mode=1;
	load($('sel'));
	if(cookies.get('coords')){
		var coords=cookies.get('coords').evalJSON();
		$('lsel').setStyle({
				width:coords.lsel_w
		});
		$('sel').setStyle({
				clip:'rect('+1+', '+(parseInt(coords.lsel_w)-1)+', '+21+', '+(parseInt(coords.lsel_w)-19)+')'
		});
		$('test').setStyle({
				width:coords.test_w,
				height:coords.test_h
		});
	}
	updateresult();
	window.event.cancelBubble=true;
}
var moveit='';
var clickX=0;
var clickY=0;
var oldWidth=0;
var oldHeight=0;


function save(saved){
	var cookies = new CookieJar({
			expires:90*3600*24   // 90 days
	});
	if (!cookies.put(mode+$(saved).id,Array.from($(saved).options).pluck('value').toJSON()))alert('cant save');

}

function load(saved){
	var cookies = new CookieJar({
			expires:90*3600*24   // 90 days
	});
	$(saved).options.length=0;
	if(cookies.get(mode+$(saved).id))cookies.get(mode+$(saved).id).evalJSON().each(function(item){
			$(saved).options[$(saved).options.length]=new Option(item,item);
	});
}

function add(jo,saver){
if ($(saver))var saved=$(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){
		saved.options[saved.selectedIndex]=null;
		save(saved);
	}
}


