// JavaScript Document

var undoable = false;
var undostore = "";

var recording = true;
var recordingstore = null;
var reclastelem = -1;

var selectedObj = null;
var serialNumber = 0;

var paneWidth = 500;
var paneHeight = 500;

var editing = false;
var playingback = false;
var showhelp = false;

function showrecorded()
{
	if(recordingstore == null)
		alert("nothing recorded");
	else
		alert(recordingstore.join("\n"));
}

function addfunction(fname,par)
{
	if(!playingback)
	{
		if(recordingstore == null)
			recordingstore = new Array();
		reclastelem++;
		//if(fname == null)
		//alert("fname: "+fname+" caller: "+addfunction.caller);
		if(selectedObj == null)
			recordingstore[reclastelem] = "namcom_"+fname+"(-1";
		else
			recordingstore[reclastelem] = "namcom_"+fname+"("+selectedObj.sernum;
		
		if(par != null)
			recordingstore[reclastelem] = recordingstore[reclastelem]+","+par;
		recordingstore[reclastelem] = recordingstore[reclastelem]+");";
			
		namlog(recordingstore[reclastelem]);
	}  
}

function nam_upper()
{
	do_transform_str("upper",function(str) {return str.toUpperCase();});
}

function nam_lower()
{
	do_transform_str("lower",function(str) {return str.toLowerCase();});
}

function nam_reverse()
{
	do_transform_str("reverse",reverseString);
}

function nam_dup()
{
	do_transform_str("dup",function(str) {return str+str;});
}

function nam_half()
{
	do_transform_str("half",function(str)
							{
								return str.substr(0,str.length/2);
							});
}

function nam_rip()
{
	do_transform_str("rip",ripString);
}

function nam_shuffle()
{
	do_transform_str("shuffle",shuffleString);
}

function nam_cmabridge()
{
	do_transform_str("cma",cmabridgeString);
}

function nam_spamizide()
{
	do_transform_str("spam",spamizideString);
}

function nam_sort()
{
	do_transform_str("sort",sortString);
}

function nam_rand()
{
	do_transform_str("rand",randomizeString);
}

function nam_nocons()
{
	do_transform_str("nocons",removeConsString);
}

function nam_novowels()
{
	do_transform_str("novow",removeVowelsString);
}

function nam_stretch()
{
	do_transform_str("stretch",stretchrndString);
}

function nam_contaminate()
{
	do_transform_str("contam",contaminaterndString);
}

function nam_alpha()
{
	do_transform_str("alpha",alphaOnlyString);
}

function nam_condense()
{
	do_transform_str("cond",condenseString);
}

function nam_part()
{
	do_transform_str("part",partrndString);
}

function nam_split()
{
	do_transform_str("split",splitlettersString);
}

function nam_bigger()
{
	do_transform("bigger",function(o)
					      {
							  o.fsize = o.fsize*1.2;
						  	  o.style.fontSize = o.fsize+"px";
						  });
}

function nam_smaller()
{
	do_transform("smaller",function(o)
					      {
							  o.fsize = o.fsize*0.8;
						  	  o.style.fontSize = o.fsize+"px";
						  });
}

function nam_italic()
{
	do_transform("italic",function(o)
					      {
							  	if(o.style.fontStyle == "italic")
							  		o.style.fontStyle = "normal";
							  	else
							  		o.style.fontStyle = "italic";
						  });
}

function nam_bold()
{
	do_transform("bold",function(o)
					      {
							  	if(o.style.fontWeight == "bold")
							  		o.style.fontWeight = "normal";
							  	else
							  		o.style.fontWeight = "bold";
						  });
}

// =================================== node functions =========================

function nam_nodesplit(distribute)
{
	if(distribute)
		name = "";
	else
		name = "node_split";
	do_transform(name,function(o)
								{
									var visbox = document.getElementById("namvisbox");
									var arrcont = o.firstChild.nodeValue.split(" ");
									var first = true;
									var rndFact = parseInt(o.style.fontSize,10)*6;

									//alert("l: "+arrcont.length+"\na:\n"+arrcont);
									for(var s= 0; s < arrcont.length; s++)
									{
										if(first)
										{
											o.firstChild.nodeValue = arrcont[s];
											first = false;
										}
										else
										{
											var newNode = DragArea.cloneObject(o);
											
											newNode.firstChild.nodeValue = arrcont[s];
											if(distribute == true)
											{
												newNode.style.left = randomNumber(paneWidth) + "px";
												newNode.style.top = randomNumber(paneHeight) + "px";
											}
											else
											{
												var alpha = randomNumber(360)*Math.PI/180;
												var l = randomNumber(rndFact);
												newNode.style.left = Math.floor(parseInt(o.style.left,10) + Math.cos(alpha)*l)+"px";
												newNode.style.top = Math.floor(parseInt(o.style.top,10) + Math.sin(alpha)*l)+"px";
											}
											visbox.appendChild(newNode);
										}										
									}
									selectObject(o);
								});
}

function nam_nodedup()
{
	do_transform("node_dup",function(o)
								{
									var visbox = document.getElementById("namvisbox");
									var newNode = DragArea.cloneObject(selectedObj);
		
									newNode.style.left = (parseInt(newNode.style.left,10) + 5)+"px";
									newNode.style.top = (parseInt(newNode.style.top,10) + 5)+"px";
									visbox.appendChild(newNode);
								});
}

function nam_nodedel()
{
	do_transform("node_del",function(o)
								{
									var visbox = document.getElementById("namvisbox");
									
									visbox.removeChild(selectedObj);
									
									selectedObj = null;
								});
}


// ============================================================================

function do_transform_str(name,func)
{
	if(name != "")
		addfunction(name);
	ta = $("tex");
	str = ta.value;
	ta.value = func(str);
	updateSelectedObject();
}

function do_transform(name,func)
{
	if(selectedObj != null)
	{
		if(name != "")
			addfunction(name);
		func(selectedObj);
		updateSelectedObject();
	}
}

function updateSelectedObject()
{
	if(selectedObj != null)
	{
		var ta = document.getElementById("tex");
		selectedObj.firstChild.nodeValue = ta.value;
	}
}

/// if obj = null the deselect
function selectObject(obj)
{
	var ta = $("tex");
	
	if(selectedObj != null)
		selectedObj.style.borderStyle = "none";
	selectedObj = obj;
	if(selectedObj == null)
	{
		ta.value = "";	
	}
	else
	{
		ta.value = obj.firstChild.nodeValue;
		if(editing && !playingback)
			obj.style.borderStyle = "dotted";
	}
}

// ============================ DRAG AND DROP ===================================

var DragArea = 
{
	dobj : null,
	cnt : 0,
	createObject : function(id,desc)
	{
		var obj = document.createElement("div");
		obj.id = serialNumber+"vo";
		obj.sernum = serialNumber++;
		obj.style.left = randomNumber(paneWidth) + "px";
		obj.style.top = randomNumber(paneHeight) + "px";
		obj.style.zIndex = "100";
		obj.className = "vispo";
		obj.style.position = "absolute";
		obj.appendChild(document.createTextNode(desc));
		obj.dobj = new DragObject(obj);
		obj.dobj.addHandler("mousedown",DragArea.down);
		obj.fsize = 10;
		obj.style.fontSize = obj.fsize+"px";
		
		selectObject(obj);
		
		return obj;
	},
	cloneObject : function(orig)
	{
		var obj = document.createElement("div");
		//obj.id = orig.id;
		obj.id = serialNumber+"vo";
		obj.sernum = serialNumber++;
		obj.style.left = (parseInt(orig.style.left,10) + 5)+"px";
		obj.style.top = (parseInt(orig.style.top,10) + 5)+"px";
		obj.style.zIndex = "0";
		obj.className = "vispo";
		obj.style.position = "absolute";
		obj.appendChild(document.createTextNode(orig.firstChild.nodeValue));
		obj.dobj = new DragObject(obj);
		obj.dobj.addHandler("mousedown",DragArea.down);
		obj.fsize = orig.fsize;
		obj.style.fontSize = obj.fsize+"px";
		obj.style.fontStyle = orig.style.fontStyle;
		obj.style.fontWeight = orig.style.fontWeight;
		//obj.style.clip = "rect(0px,0px,500px,500px)";
		
		selectObject(obj);
		
		return obj;
	},
	down : function(event)
	{
		if(editing)
		{
			var element = Compat.getTarget(event);
			if(!element || !element.dobj)
			{
				selectObject(null);
				return true;
			}
			DragArea.dobj = element.dobj;
			element.xoffset = xpos(event);
			element.yoffset = ypos(event);
			element.z = element.style.zIndex;
			element.style.zIndex = 999;
			element.dobj.addHandler("mousemove",DragArea.move);
			element.dobj.addHandler("mouseup",DragArea.up);
			element.oldleft = element.style.left;
			element.oldtop = element.style.top;
			selectObject(element);
		}
	},
	move : function(event)
	{
		if(editing)
		{
			if(!DragArea.dobj)
				return true;
			var element = DragArea.dobj.element;
			var ex = xpos(event);
			var ey = ypos(event);
			var x = parseInt(element.style.left,10);
			var y = parseInt(element.style.top,10);
			var nx,ny;
			nx = x + (ex - element.xoffset);
			ny = y + (ey - element.yoffset);
			//element.style.left = (nx > 0 ? nx : 0) + "px";
			//element.style.top = (ny > 0 ? ny : 0) + "px";
			element.style.left = nx+"px";
			element.style.top = ny+"px";
			element.style.position = "absolute";
			element.xoffset = ex;
			element.yoffset = ey;
			Compat.stopPropagation(event);
		}
	},
	up : function(event)
	{
		if(editing)
		{
			if(!DragArea.dobj)
				return true;
			var element = DragArea.dobj.element;
			if((element.oldleft != element.style.left) || (element.oldtop != element.style.top))
				addfunction("move","\""+element.style.left+"\",\""+element.style.top+"\"");
			element.style.zIndex = element.z;
			element.dobj.clearHandlers();
			DragArea.dobj = null;
			Compat.stopPropagation(event);
			selectObject(element);
		}
	},
	init : function()
	{
	}
}

var DragObject = function(element)
{
	this.element = element;
	this.handlers = new Array();
	this.addHandler = function(event, cb)
	{
		Compat.addEventHandler(this.element,event,cb);
		this.handlers[event] = cb;
	}
	this.removeHandler = function(event)
	{
		if(this.handlers[event])
		{
			Compat.removeEventHandler(this.element, event, this.handlers[event]);
			this.handlers.splice(event,1);
		}
	}
	this.clearHandlers = function()
	{
		this.removeHandler("mousemove");
		this.removeHandler("mosueup");
	}
}

DragArea.init = function()
{
	Compat.addEventHandler(document.getElementById("namvisbox"),"mousedown",DragArea.down);
	Compat.addEventHandler(document.getElementById("namvisbox"),"mousemove",DragArea.move);
	Compat.addEventHandler(document.getElementById("namvisbox"),"mouseup",DragArea.up);
	
	clearlog();
}

Compat.addEventHandler(window,"load",DragArea.init);

//------------------- create a visual element

function makeNewVis(str)
{
	var visbox = $("namvisbox");
	var newNode = DragArea.createObject("vo",str);
	
	newNode.nodeValue = str;
	
	visbox.appendChild(newNode);		
	
	return newNode;
}

function new_vis()
{
	var ta = document.getElementById("tex");
	var str = ta.value;
	if(str != "")
	{
		return makeNewVis(str);
	}
	
	return null;
}

//------------------- change a visual element

function change_vis()
{
	var ta = document.getElementById("tex");
	var str = ta.value;
	if((str != "") && (selectedObj != null))
	{
		selectedObj.nodeValue = str;
	}
}

//====================== load webpage content

function walkXML(obj)
{
	//Compat.log(obj);
	//alert("walk length: "+obj.childNodes.length);
	if(obj == null)
		return false;
	if(obj.childNodes.length == 0)
		return false;
	
	for(var i = 0; i < obj.childNodes.length; i++)
	{
		if(!walkXML(obj.childNodes[i]))
			if(obj.childNodes[i].nodeValue != null)
			{
				//alert("newvis: "+obj.childNodes[i].nodeValue);
				if(obj.childNodes[i].nodeName != "xml")
					selectObject(makeNewVis(obj.childNodes[i].nodeValue));
			}
	}
	return true;
}

function loadurl(url,noscript,async)
{
	//var oDomDoc = Sarissa.getDomDocument();
	var xmlhttp = new XMLHttpRequest();

	//oDomDoc.async = async; // this is the important part
	if(async)
	{
		//oDomDoc.onreadystatechange = function() 
		xmlhttp.onreadystatechange = function() 
									 {
										 if(this.readyState == 4)
										 {
											//alert(oDomDoc.status+" "+oDomDoc.statusText);
											walkXML(this.responseXML);
											nam_nodesplit(true.responseXML);
											$('namedit').testtest = this.responseXML;
											$('loading').style.display = "none";
										 }
									 };
		$('loading').style.display = "inline";
		if(noscript)
			xmlhttp.open("GET","geturl.php?url="+url+"&noscript=1",true);	
		else
			xmlhttp.open("GET","geturl.php?url="+url,true);	
		xmlhttp.send(null);	
	}
	else
	{
		if(noscript)
			xmlhttp.open("GET","geturl.php?url="+url+"&noscript=1",false);	
		else
			xmlhttp.open("GET","geturl.php?url="+url,false);	
		xmlhttp.send(null);
		
		walkXML(xmlhttp.responseXML);
		nam_nodesplit(true);
		$('namedit').testtest = xmlhttp.responseXML;
		$('loading').style.display = "none";
	}
}

function load_webpage()
{
	addfunction("load","\""+$('urlinput').value.replace(/[\"\n\r\s]+/,"")+"\","+($('noscripts').checked ? "true" : "false"));
	loadurl($('urlinput').value,$('noscripts').checked,true);
}

//====================== start editing

function start_edit()
{
	if(editing) // stop editing
	{
		selectObject(null);
		editing = false;
		Effect.Fade('namedit',{ duration: 0.3, afterFinished : function() {$('namedit').style.visibility = "hidden";}});
		$('editlink').firstChild.nodeValue = "[edit]";
	}
	else // start editing
	{
		editing = true;
		$('namedit').style.visibility = "visible";
		Effect.Appear('namedit',{ duration: 0.3});
		$('editlink').firstChild.nodeValue = "[stop editing]";
	}
}


// ========================= commands ========================================

function standardcmd(nr,func)
{
	var o = findObject(nr);
	
	if(o != null)
	{
		selectObject(o);
		func();
	}
}

function namcom_load(nr,arg1,arg2)
{
	namlog("loading...");
	loadurl(arg1,arg2,false);
}

function namcom_move(nr,left,top)
{
	var o = findObject(nr);
	
	if(o != null)
	{
		o.style.left = left;
		o.style.top = top;
	}
}

function namcom_upper(nr)
{
	standardcmd(nr,nam_upper);
}

function namcom_lower(nr)
{
	standardcmd(nr,nam_lower);
}

function namcom_rip(nr)
{
	standardcmd(nr,nam_rip);
}

function namcom_dup(nr)
{
	standardcmd(nr,nam_dup);
}

function namcom_half(nr)
{
	standardcmd(nr,nam_half);
}

function namcom_rand(nr)
{
	standardcmd(nr,nam_rand);
}

function namcom_reverse(nr)
{
	standardcmd(nr,nam_reverse);
}

function namcom_nocons(nr)
{
	standardcmd(nr,nam_nocons);
}

function namcom_novow(nr)
{
	standardcmd(nr,nam_novowels);
}

function namcom_shuffle(nr)
{
	standardcmd(nr,nam_shuffle);
}

function namcom_sort(nr)
{
	standardcmd(nr,nam_sort);
}

function namcom_stretch(nr)
{
	standardcmd(nr,nam_stretch);
}

function namcom_contam(nr)
{
	standardcmd(nr,nam_contaminate);
}

function namcom_spam(nr)
{
	standardcmd(nr,nam_spamizide);
}

function namcom_split(nr)
{
	standardcmd(nr,nam_split);
}

function namcom_part(nr)
{
	standardcmd(nr,nam_part);
}

function namcom_cma(nr)
{
	standardcmd(nr,nam_cmabridge);
}

function namcom_alpha(nr)
{
	standardcmd(nr,nam_alpha);
}

function namcom_cond(nr)
{
	standardcmd(nr,nam_condense);
}

function namcom_bigger(nr)
{
	standardcmd(nr,nam_bigger);
}

function namcom_smaller(nr)
{
	standardcmd(nr,nam_smaller);
}

function namcom_italic(nr)
{
	standardcmd(nr,nam_italic);
}

function namcom_bold(nr)
{
	standardcmd(nr,nam_bold);
}

function namcom_node_split(nr)
{
	standardcmd(nr,nam_nodesplit);
}

function namcom_node_dup(nr)
{
	standardcmd(nr,nam_nodedup);
}

function namcom_node_del(nr)
{
	standardcmd(nr,nam_nodedel);
}
// ========================= play the commands back ==========================

function findObject(nr)
{
	return $(nr+'vo');
}

function play(commands)
{
	var i = 0;
	
	clearlog();
	for(i = 0; i < commands.length; i++)
	{
		doCommand(commands[i]+";");
	}
}

function doCommand(com)
{
	//namlog(com);
	eval(com);
}

function clearScreen()
{
	var visbox = $("namvisbox");
	
	while(visbox.hasChildNodes())
	{
		visbox.removeChild(visbox.childNodes[0]);
	}
	serialNumber = 0;
}

function playback()
{
	playingback = true;
	if(recordingstore != null)
	{
		clearScreen();
		play(recordingstore);
	}
	playingback = false;
	selectObject(selectedObj);
}

function load_rules(nr,direction,getstring)
{
	//var oDomDoc = Sarissa.getDomDocument();
	var xmlhttp = new XMLHttpRequest();
	
	//oDomDoc.async = true; // this is the important part
	//oDomDoc.onreadystatechange = function() 
	xmlhttp.onreadystatechange = function() 
									 {
										 if(this.readyState == 4)
										 {
											 clearScreen();
											 var page = this.responseXML.selectSingleNode('/nam'); 
											 var rules = this.responseXML.selectNodes('/nam/rule');
											 $('namtitle').pagenr = parseInt(page.getAttribute('page'),10);
											 $('vistitle').value = page.getAttribute('title');
											 recordingstore = new Array();
											 if(rules.length > 0)
											 {
												 for(reclastelem = 0; reclastelem < rules.length; reclastelem++)
												 {
													 recordingstore[reclastelem] = rules.item(reclastelem).firstChild.nodeValue;
												 }
											 }
											 else
											 {
											 	reclastelem=-1;
											 }
											 playback();
											 $('namtitle').firstChild.nodeValue = page.getAttribute('title');
											 $('namtitle').style.textDecoration = "none";
									 	}
									 };
	if(Sarissa._SARISSA_IS_IE == true)
		$('namtitle').firstChild.nodeValue = 'loading... and waiting... (internet explorer is slow slow slow...)';
	else
		$('namtitle').firstChild.nodeValue = 'loading...';
	$('namtitle').style.textDecoration = "blink";
	/*if(nr >= 0)
		oDomDoc.load("getrules.php?page="+nr+"&dir="+direction+getstring);	
	else
		oDomDoc.load("getrules.php");	
	*/
	if(nr >= 0)
		xmlhttp.open("GET","getrules.php?page="+nr+"&dir="+direction+getstring,true);	
	else
		xmlhttp.open("GET","getrules.php",true);	
	xmlhttp.send(null);
}

function load_randompage()
{
	load_rules(-1,0,"");
}

function load_nextpage()
{
	load_rules($('namtitle').pagenr,1,"");
}

function load_prevpage()
{
	load_rules($('namtitle').pagenr,-1,"");
}

function load_firstpage()
{
	load_rules(0,0,"&index=0");
}

function load_lastpage()
{
	load_rules(0,-1,"&index=0");
}

function init_page()
{
	clearScreen();
	$('namtitle').firstChild.nodeValue = 'title';
	$('vistitle').value = '';
	reclastelem=-1;
	recordingstore = new Array();
}

// ==================================== saveing

function save_commands()
{
	var xmlhttp =  new XMLHttpRequest();
	var i;
	
	$('namtitle').firstChild.nodeValue = $('vistitle').value;
	_body = "title=" + $('vistitle').value + "&";
	_body = _body + "userstring=" + $('userstring').value + "&";
	_body = _body + "rule=";
	for(i = 0; i < recordingstore.length; i++)
		if(recordingstore[i] != null)
			_body = _body + escape(recordingstore[i]);
	//alert(_body);
	xmlhttp.onreadystatechange = function() 
									{
										if (xmlhttp.readyState == 4) 
										{
											alert(xmlhttp.responseText);
										}
									};
	xmlhttp.open('POST','sendrules.php',true,'','');
	xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
	xmlhttp.send(_body);
}

//============================================

function help()
{
	if(showhelp) // stop editing
	{
		showhelp = false;
		Effect.Fade('helpwindow',{ duration: 0.3, afterFinished : function() {$('helpwindow').style.visibility = "hidden";}});
		$('helplink').firstChild.nodeValue = "[help]";
	}
	else // start editing
	{
		showhelp = true;
		$('helpwindow').style.visibility = "visible";
		Effect.Appear('helpwindow',{ duration: 0.3});
		$('helplink').firstChild.nodeValue = "[hide help]";
	}
}


//======================================================================

function namlog(str)
{
	//$('trace').value = $('trace').value+str+"\n";
}

function clearlog()
{
	//$('trace').value = '';
}
