var ____ajaxhome;
var ____ajaxcurrentpageid;
var ____ajaxepitagcontainer;
var ____wikied = false;
var ____close = true;
function delayDispose()
{
	____close = false;
}
function positionepitag()
{
	if (document.all)
	{
		var obj = document.getElementById('epitagarea');
		if (obj)
		{
			obj.style.position='absolute';
			obj.style.top=document.body.scrollTop+10;
		}		
	}
}
function closeepitag()
{
	var objo = document.getElementById('epitagopener');
	var objc = document.getElementById('epitagcloser');
	var obj  = document.getElementById('epitagarea');
	objo.style.display='block';
	objc.style.display='none';
	obj.style.width='10px';
}
function openepitag()
{
	var objo = document.getElementById('epitagopener');
	var objbuttons = document.getElementById('epitagbuttons');
	
	objbuttons.style.display='block';
	objo.style.display='none';
}
function confirmDispose()
{
	____close = true;
}
function tryToClose()
{
	window.setTimeout('disposeDescription()',1000);
}
function disposeDescription()
{
	if (____close)
	{
		ShowDescription('',false);
	} else {		
		tryToClose();
	}
}

function ShowDescription(word,enable)
{
	if (enable)
	{
		var x,y;
		var arg0 = ShowDescription.caller.arguments[0];
		var e = (window.event)?window.event:arg0;
		
		x = (e.clientX!=null)?e.clientX+document.documentElement.scrollLeft:e.pageX;
		y = (e.clientY!=null)?e.clientY+document.documentElement.scrollTop:e.pageY;
		
		
		var link = "/content/worddescription.aspx?id="+word+"&x="+x+"&y="+y;
		loadXml(link);
	} else {
		var obj = document.getElementById('epitagdescription');
		if (obj)
		{
			obj.innerHTML = "";
			obj.style.display='none';
		}		
	}
}
function ShowDescriptionOnScreen(xml)
{
	var obj = document.getElementById('epitagdescription');
	if (obj)
	{		
		var x = xml.getElementsByTagName("x")[0].firstChild.data;
		var y = xml.getElementsByTagName("y")[0].firstChild.data;
		var t = xml.getElementsByTagName("t")[0].firstChild.data;
		obj.innerHTML = t;
		obj.style.display='block';
		if (obj.style)
		{
			obj.style.left = x + "px";
			obj.style.top = y + "px";
		} else {
			obj.left = x;
			obj.top = y-0+10;			
		}
		tryToClose();
	}
}

function ShowWord(enable)
{
	if (!____wikied)
	{
		____wikied = true;		
		showProc('Loading....');
		window.setTimeout('loadWords()',1000);
		
	} else {
		____wikied = false;		
		disableHighlight();
	}
	
}

function loadWords()
{	
	loadXml("/content/wordlist.aspx");	
}

function enableHighlight(xml)
{
	
	var ws = xml.getElementsByTagName('w');
	var words = new Array();
	var ids = new Array();
	for (var i = 0 ; i<ws.length; i++)
	{
		words[words.length]=ws[i].getElementsByTagName('n')[0].firstChild.data;
		ids[ids.length]=ws[i].getElementsByTagName('i')[0].firstChild.data;
	}	
	
	var htmlbody = document.getElementsByTagName('body')[0];
	
	if (htmlbody)
	{
		for (var j=0;j<words.length;j++)
		{			
			replaceTextNode(htmlbody,words[j],ids[j]);
			var re =  eval("/(\\s?)(___)("+words[j]+")(___)(\\s+)/ig");			
			htmlbody.innerHTML = htmlbody.innerHTML.replace(re,"$1<span id='epitagtag' onmouseover='ShowDescription(\""+ids[j]+"\",true)' class='epitag'>$3</span>$5");
		}
	}
	showProc('');
}
function replaceTextNode(node,w,i)
{
	if (node.nodeType == 3)
	{
		var re =  eval("/(\\s?)("+w+")(\\s+)/ig");			
		node.data = node.data.replace(re,"$1___$2___$3");
	} else {
		var kids = node.childNodes;
		for ( var i=0;i<kids.length;i++)
		{
			replaceTextNode(kids[i],w,i);
		}
	}

}

function disableHighlight()
{
	var objs = document.getElementById('epitagtag');	
	while (objs)
	{
		var text ;
		if (objs.textContent)
			text = objs.textContent;
		else
			text = objs.innerText;
		var newnode = document.createTextNode(text);
		var parent = objs.parentNode;
		parent.replaceChild(newnode,objs);
		objs = document.getElementById('epitagtag');
	}
}

function AddWord()
{
	var panel = document.getElementById('epitagpanel');
	var word = document.getElementById('textepitag');
	var description = document.getElementById('textareaepitag');
	word.value='';
	description.value='';
		
	panel.style.display=(panel.style.display=='block')?'none':'block';
	if (panel.style.display=='block')
		word.focus();
}

function SubmitWord()
{
	var word = document.getElementById('textepitag');
	var description = document.getElementById('textareaepitag');
	var url = "/content/UpdateWordList.aspx?id="+____ajaxepitagcontainer+"&word="+encodeURIComponent(word.value)+"&description="+encodeURIComponent(description.value);
	loadXml(url);
}
function confirmUpdate(xml)
{
	var result = xml.firstChild.data;
	if ((result=="OK"))
	{
		AddWord();
		disableHighlight();
		ShowWord(true);
	} else {
		alert(result);
	}
}

var inUse = false;
var req;
function loadXml(url)
{
	if (inUse)
	{
		window.setTimeout('loadXml(\''+url+'\')',1000);
		return;
	}
	
	inUse = true;
	
	if (window.XMLHttpRequest)
	{
		req = new XMLHttpRequest();
		req.onreadystatechange = processReqChange;
		req.open("GET",____ajaxhome + url,true);
		req.send(null);
		
	} else if (window.ActiveXObject)
	{
		req = new ActiveXObject("Microsoft.XMLHttp");
		if (req)
		{
			req.onreadystatechange = processReqChange;
			req.open("GET",____ajaxhome+url,true);
			req.send();
		}
	}
}
function processReqChange()
{
	if (req.readyState == 4)
	{
		if (req.status==200)
		{			
			var response = req.responseXML.documentElement;
			
			var method = response.getElementsByTagName('method')[0].firstChild.data;
						
			var result = response.getElementsByTagName('data')[0];
						
			if (method=='enableHighlight')
			{
				enableHighlight(result);
			} else if (method=="ShowDescriptionOnScreen") {
				ShowDescriptionOnScreen(result);
			} else if (method=="confirmUpdate")
			{
				confirmUpdate(result);
			} else if (method=="showequivalent")
			{
				showequivalent(result);
			} else if (method=="savepcssdone")
			{
				savepcssdone();
			} else if (method=='loadpcssdone')
			{
				loadpcssdone(result);
			}
		}
		inUse = false;
	}
}
/**/
function showUserActivity(username)
{
	var x,y;
	var arg0 = showUserActivity.caller.arguments[0];
	var e = (window.event)?window.event:arg0;
		
	x = (e.clientX!=null)?e.clientX+document.documentElement.scrollLeft:e.pageX;
	y = (e.clientY!=null)?e.clientY+document.documentElement.scrollTop:e.pageY;				
	var link = "/content/equivalent.aspx?id=12&word="+encodeURIComponent(username)+"&x="+x+"&y="+y;
	
	loadXml(link);
}
function showequivalent(xml)
{
	var obj = document.getElementById('divequivalent');
	if (obj)
	{		
		var x = xml.getElementsByTagName("x")[0].firstChild.data;
		var y = xml.getElementsByTagName("y")[0].firstChild.data;
		var t = xml.getElementsByTagName("t")[0].firstChild.data;
		obj.innerHTML = t;
		obj.style.display='block';
		if (obj.style)
		{
			obj.style.left = x + "px";
			obj.style.top = y + "px";
		} else {
			obj.left = x;
			obj.top = y-0+10;			
		}
	}
}

/*css stuff*/
function showProc(txt)
{

	var divproc=document.getElementById('procdiv');
	
	if (txt=='')
	{
		divproc.style.display='none';
	} else {
		divproc.style.display='block';
		divproc.innerHTML=txt;
	}
	
}
var classes = new Array();
function showcss()
{
	showProc('Loading site css.....');
	var csss = document.styleSheets;
	var htmlbody = document.getElementsByTagName('body')[0];
	if (classes.length>0)
	{
		deactivenode(htmlbody);
		classes = new Array();
		disablecookie();
		showProc('');
		return;
	}
	classes = new Array();
	for ( var i = 0; i< csss.length; i++)
	{
		for (var j=0; j<csss[i].rules.length;j++)
		{
			var txt = csss[i].rules[j].selectorText;
			var id = '';
			var tag = '';
			var classname='';
			if (txt.match(/^#/ig))
			{
				id = txt.replace(/^#/ig,"");				
			} else {
				if (txt.indexOf('.')>0)
				{	
					tag = txt.substr(0,txt.indexOf('.'));
					classname=txt.substr(txt.indexOf('.')+1);
				} else {
					if (txt.indexOf('.')==0)
					{
						classname=txt.substr(1);
					} else {
						tag = txt;
					}
				}
			}
			classes[classes.length]=new CRule(tag,classname,id);				
		}
	}
	var ret='';
	
	for (var k = 0; k<classes.length;k++)
	{
		ret+=classes[k].ID+":"+classes[k].Tag+":"+classes[k].CssClass+"\n";
		activateNode(htmlbody,classes[k]);
	}
	
	showProc('');
	enablecookie();
	loadpcss();	
}
var cookiename='__editcss';
function enablecookie()
{
	SetCookie(cookiename,"true");
}
function disablecookie()
{
	SetCookie(cookiename,"false");
}
var rlcookiename='__enablerelatedlinks';
function enablerlcookie()
{
	SetCookie(rlcookiename,"true");
}
function disablerlcookie()
{
	SetCookie(rlcookiename,"false");
}
function SetCookie(name,value)
{
	document.cookie = name + "=" + value +"; path=/; ";
}
function enableRelatedLinks()
{
	if (GetCookie(rlcookiename)=='true')
	{
		disablerlcookie();
		__closegsa=true;
		closediv();
	} else {
		enablerlcookie();
		__closegsa=false;
		loadRelatedSite();
	}
}
function GetCookie(sName)
{
  // cookies are separated by semicolons
  var aCookie = document.cookie.split("; ");
  for (var i=0; i < aCookie.length; i++)
  {
    // a name/value pair (a crumb) is separated by an equal sign
    var aCrumb = aCookie[i].split("=");
    if (sName == aCrumb[0]) 
      return unescape(aCrumb[1]);
  }

  // a cookie with the requested name does not exist
  return null;
}
function loadpcss()
{
	if (appliedcss.length>0)
	{
	} else {
		showProc('Load personal css');
		var url = "/content/loadpcss.aspx?id="+____ajaxepitagcontainer;
		loadXml(url);		
	}
}
var runcompare = false;
var comparestate = 0;
function comparechanges()
{
	if (runcompare)
	{
		runcompare = false;
	} else {	
		runcompare = true;
		setTimeout('doCompare()',1000);
	}
}
function doCompare()
{
	var ss = document.styleSheets[document.styleSheets.length-1];
	if (comparestate==0)
	{
		ss.removeRule(ss.rules.length-1);
		comparestate=1;
	} else {
		ss.addRule(_lastchanges.name,_lastchanges.value);
		comparestate=0;
	}
	if (runcompare)
	{
		setTimeout('doCompare()',1000);
	} else {
		if (comparestate==1)
		{
			ss.addRule(_lastchanges.name,_lastchanges.value);
		}
	}
		
}
function loadpcssdone(ret)
{
	showProc('Personal css loaded');
	if ( (ret) && (ret.firstChild) && (ret.firstChild.data))
	{		
		appliedcss = new Array();
		var a =ret.firstChild.data.split('_||_');
		var ss = document.styleSheets[document.styleSheets.length-1];

		for ( var i = 0; i< a.length; i++)
		{
			if (a[i]!='')
			{
				var rulename=a[i].split('_|_')[0];
				var rulestring=a[i].split('_|_')[1];
				ss.addRule(rulename,rulestring);			
				appliedcss[appliedcss.length]=new myrule(rulename,rulestring);
			}
		}
	}
	setTimeout('showProc("")',1000);
}
function unloadpcss()
{
	showProc('Unloading personal css');

	var ss = document.styleSheets[document.styleSheets.length-1];
	for (var i=0;i<appliedcss.length;i++)
	{
		ss.removeRule(ss.rules.length-1);
	}
	appliedcss=new Array();
	setTimeout('showProc("")',1000);
}
function deactivenode(node)
{
	if (node.nodeType == 3) 
	{
	} else {
		if (node.getAttribute('proced',0))
		{
			node.detachEvent('onmouseover',Hilite);
			node.detachEvent('onmouseout',Restore);
			node.detachEvent('onclick',Modify);		
			node.removeAttribute('proced',0);
		}
		var kids = node.childNodes;
		for ( var i=0;i<kids.length;i++)
		{
			deactivenode(kids[i]);
		}
		
	}
}
function activateNode(node,cl)
{

	if (node.nodeType == 3)
	{
	} else {
		if (node.getAttribute('proced',0))
			return;
		if (cl.IsMatchID(node))
		{
			node.attachEvent('onmouseover',Hilite);
			node.attachEvent('onmouseout',Restore);
			node.setAttribute('proced','true',0);
			
		} else {
			if (cl.IsMatchTagClass(node))
			{
				node.attachEvent('onmouseover',Hilite);
				node.attachEvent('onmouseout',Restore);
				node.setAttribute('proced','true',0);		
			} else {
				if (cl.IsMatchClass(node))
				{
					node.attachEvent('onmouseover',Hilite);
					node.attachEvent('onmouseout',Restore);
					node.setAttribute('proced','true',0);
					
				} else {
					node.detachEvent('onmouseover',Hilite);
					node.detachEvent('onmouseout',Restore);
				}
			}
		}
		var kids = node.childNodes;
		for ( var i=0;i<kids.length;i++)
		{
			activateNode(kids[i],cl);
		}
	}
}
function Nada()
{
}

function Modify()
{
	if (event.srcElement.runtimeStyle)
	{
		var el = event.srcElement;
		window.event.cancelBubble = true;	
		var matchedclass = new Array();
		for (var i = 0 ;i < classes.length;i++)
		{
			if (classes[i].IsMatchID(el))
			{
				matchedclass[matchedclass.length]=classes[i];
			}
			if (classes[i].IsMatchTagClass(el))
			{
				matchedclass[matchedclass.length]=classes[i];
			} else {
				if (classes[i].IsMatchClass(el))
				{
					matchedclass[matchedclass.length]=classes[i];
				}
			}
		}
		var ret=''
		if ((___cssMenu==null))
		{
			___cssMenu = document.createElement("div");
			___cssMenu.className = 'ContextMenu';
			___cssMenu.style.position='absolute';
			___cssMenu.attachEvent('onmouseover',keepmenu);
			document.body.appendChild(___cssMenu);
		} else {
			___cssMenu.innerHTML='';
		}
		for ( var j =0 ;j<matchedclass.length;j++)
		{
			ret+="<div class='ContextMenuItem' style='cursor:hand;' onclick=\"editrule(\'"+matchedclass[j].ToString()+"\')\">";
			ret+=matchedclass[j].ToString();
			ret+="</div>";
		}				
		___cssMenu.innerHTML = '<div class="ContextMenuItem-Active" style="cursor:default;border:outset 0.1em;padding 2 2 2 2;maring:2 2 2 2;font-weight:bolder;">Edit</div>'+ret;
		
		// position the menu
		{
			___cssMenu.style.display='';
			___doClose=false;
			___cssMenu.style.top=event.clientY+document.body.scrollTop-3;
			___cssMenu.style.left=event.clientX+document.body.scrollLeft-3;
		}
		
		return false;
    }
}

var ___cssMenu=null;

var appliedcss = new Array();

function keepmenu()
{
	___doClose=false;
	trytoClose();
}
function myrule(sn,sv)
{
	this.name=sn;
	this.value = sv;
}
function fakewin()
{
	this.getEditor=function(obj)
	{
		return window;
	}
}
function savecss()
{
	alert('not implemented');
}
function savepcss()
{
	if (appliedcss.length>0)
	{
		var s = '';
		for ( var i = 0; i<appliedcss.length;i++)
		{
			s +=appliedcss[i].name+'_|_' + appliedcss[i].value+'_||_';
		}
		// save it
		showProc('save personal css');
		var url = "/content/savepcss.aspx?id="+____ajaxepitagcontainer+"&css="+encodeURIComponent(s);
		loadXml(url);
	}
}
function savepcssdone()
{
	showProc('personal css saved');
	setTimeout('showProc("")',1000);
}
var _lastchanges='';
function undocss()
{
	if (appliedcss.length>0)
	{
		var ss = document.styleSheets[document.styleSheets.length-1];
		var l = ss.rules.length;
		
		if (l>0)
		{
			ss.removeRule(l-1);
			_lastchanges = appliedcss[appliedcss.length-1];
			appliedcss.pop();
		}
		else
			alert('nothing to undo');
		
		
	} else {
		alert('nothing to undo');
	}
}

function editrule(rulename)
{
	var obj = new Array();
	obj[0]=new fakewin();
	obj[1]='';
	var fontlist = CreateDefaultFontColorList();
	obj[2]= fontlist;
	var ret = OpenDialog(____ajaxhome+'/../styleedit.aspx',obj,540,290);
	if (ret)
	{
		var s='';
		s='font-family:'+ret[0]+';';
		if ( (ret[1]) && (ret[1]!='undefined'))
			s+='color:#'+ret[1]+';';
		if ( (ret[2]) && (ret[2]!='undefined'))
		{			
			if (ret[2]==1)
			{
				s+='font-weight:normal;font-style:italic;';
			} else {
				if (ret[2]==2)
				{
					s+='font-weight:bold;font-style:normal;';				
				} else {
					if (ret[2]==3)
					{
						s+='font-weight:bold;font-style:italic;';				
					}
				}
			}
		} else 
		{
			s+='font-weight:normal;font-style:normal;';			
		}
		if ( (ret[3]) && (ret[3]!='undefined'))
			s+='font-size:'+fontlist.sizes[ret[3]-1]+'pt;';
		if (ret[5])
			s+='text-decoration:underline;';
		else
			s+='text-decoration:none;';
		if (ret[6])
			s+='background-color:'+ret[6]+";";
		if (ret[7])
			s+=ret[7];
		if (ret[8])
			s+=ret[8];
		//window.status=s;
		if ( (s) && (s!='undefined'))
		{			
			var ss = document.styleSheets[document.styleSheets.length-1];
			
			var i =ss.addRule(rulename,s);
			appliedcss[appliedcss.length]=new myrule(rulename,s);
			_lastchanges = new myrule(rulename,s);
		}
	}
	return false;	
}
function OpenDialog(dialogURL, dialogArguments, width, height)
{
	width = (!width) ? 560 : parseInt(width);
	height = (!height) ? 465 : parseInt(height);

	var dialogParameters = 'dialogWidth:' + width + 'px;dialogHeight:' + height + 'px;help=no;resizable:no;scroll:no;status:no;';
	
	return OpenDialogWithParameters(dialogURL, dialogArguments, dialogParameters);
}

function OpenDialogWithParameters(dialogURL, dialogArguments, dialogParameters)
{
	var returnedObject;
	var ex;

	// The following flag is used by the editor to track if focus is lost because of a dialog is being opened.
	// When the flag is true, the caret position is not lost in the editor when the focusout event is triggered.
	window.OpeningDialog = true;

	try
	{
		returnedObject = window.showModalDialog(dialogURL, dialogArguments, dialogParameters);
	}
	catch (ex)
	{
		ShowMsg("Popups are blocked for this site, you need to enable popups to access this function.");
		returnedObject = "";
	}

	window.OpeningDialog = false;
	
	return returnedObject;
}
function CreateDefaultFontColorList()
{  
  var fontList =
	{
		names: ['Aqua',  'Black', 'Blue',  'Fuchsia','Gray',  'Green', 'Maroon','Navy',  'Olive', 'Purple','Red',   'Silver','Teal',  'White' ],
		values:['00ffff','000000','0000ff','ff00ff', '808080','008000','800000','000080','808000','800080','ff0000','c0c0c0','008080','ffffff'],
		sizes: ['8','10','12','14','18','24','36']		
	};

  return fontList;
}

function Hilite()
{	
	if (event.srcElement.runtimeStyle)
	{
		var el = event.srcElement;
		window.event.cancelBubble = true;	
		var matchedclass = new Array();
		for (var i = 0 ;i < classes.length;i++)
		{
			if (classes[i].IsMatchID(el))
			{
				matchedclass[matchedclass.length]=classes[i];
			}
			if (classes[i].IsMatchTagClass(el))
			{
				matchedclass[matchedclass.length]=classes[i];
			}
			if (classes[i].IsMatchClass(el))
			{
				matchedclass[matchedclass.length]=classes[i];
			}
		}	
		if (matchedclass.length>0)
		{
			var namedItem = document.createAttribute("oldstyle");
			namedItem.value = event.srcElement.runtimeStyle.backgroundColor;
			event.srcElement.attributes.setNamedItem(namedItem);
			event.srcElement.runtimeStyle.backgroundColor  = "yellow";			
			event.srcElement.runtimeStyle.cursor = "crosshair";
			Modify();
		}
    }

}
var ___doClose=true;
function Restore()
{
	if (event.srcElement.runtimeStyle)
   {
      event.srcElement.runtimeStyle.backgroundColor = '';
      if (event.srcElement.attributes["oldstyle"])
		event.srcElement.runtimeStyle.backgroundColor = event.srcElement.attributes["oldstyle"].value;
      event.srcElement.runtimeStyle.cursor = "";
      if(___cssMenu)
      {	
		___doClose=true;	
		window.setTimeout('trytoClose()',500);
      }
   }
}
function trytoClose()
{
	if (___doClose)
	{
		___cssMenu.style.display='none';
	} else {
		
		window.setTimeout('trytoClose()',500);
	}
}
function CRule(tag,classname,id)
{
	this.Tag = tag;
	this.CssClass = classname;
	this.ID = id;
	this.IsMatchID=function(xnode){		
		if (this.ID!="") //only check id
		{
			if (xnode.id==this.ID)
				return true;			
		}
		return false;
	}
	this.IsMatchTagClass=function(xnode){		
		if (this.Tag!="") //both classname and tag must match
		{
			if ((this.Tag==xnode.tagName) && (this.CssClass==xnode.className))
				return true;			
		}
		return false;
	}
	this.IsMatchClass=function(xnode){		
		if (this.CssClass!="")
		{
			if (xnode.className==this.CssClass)
				return true;
		}
		return false;
	}
	this.ToString=function()
	{
		if (this.ID!='')
			return '#'+this.ID;
		if (this.Tag=='')
			return '.'+this.CssClass;
		if ((this.Tag!='') && (this.CssClass!=''))
			return this.Tag + '.' + this.CssClass;
		if (this.Tag!='')
			return this.Tag;
		return '.'+this.CssClass;
		return this.ID+":"+this.CssClass+":"+this.Tag;
	}
}
