var userVars = "nowhynovotes=1&thewar=%7B%22inventory%22%3A%7B%7D%2C%22strike%22%3A93%2C%22laststrike%22%3A1207132023%2C%22health%22%3A-39%2C%22fallen%22%3A1%7D&mission=&specialties=&wufoot=c%3Asocial%2Cc%3Avote%2Cc%3Acfull&ipaddy=62.253.128.7&votetime=2002-10-11&employment=&hasRecalculated=1&nwriteups=&showmessages_replylink=1&nwriteupsupdate=1265727189&chatterbox_msgs_descend=1&votesrefreshed=1&zenadinheader=1&displaypref_e2node=displayfull&oldexp=&nodelets=262%2C1922511%2C263&userstyle=1882070&motto=&numwriteups=&level=0%20(Initiate)%20%2F%200&can_weblog=&preferred_theme=1854183&favorite_noders=%2C1704834%2C1909366%2C1914469%2C1918487%2C1918596%2C1920070&includedJS=%2C1872965%2C1930065%2C1872990%2C1951752%2C1878034%2C&wuhead=c%3Atype%2Cl%3Aauthor%2Cr%3Adtcreate";

var siteVars = { node_id: 1144495, nodetype: "e2node"};
USERVARS = userVars.toQueryParams();
isZen = (USERVARS.preferred_theme == 1854183);

var Deferrer = {
	// Create a function that reports if the required object exists and is non-zero
	findObjectFromString: function (checkElement) {
		var elements = checkElement.split('.') ;
		var foundObject = window ;
		for (var elementChunk in elements) {
			foundObject = foundObject[ elements[ elementChunk ] ] ;
			if ( typeof foundObject == "undefined" ) return false ;
		}
		if (foundObject) return true ;
		return false ;
	},
	defer: function (callback, requiredObject) {
		if (!Deferrer.interval) {
			Deferrer.interval = window.setInterval(Deferrer.checkInterval, 500);
		}	
		Deferrer.callbacks.push({callback: callback, requiredObject: requiredObject});
	},
	callbacks: [],
	checkInterval: function () {
		var c = Deferrer.callbacks;
		var remaining = [];
		for (var i=0; i < c.length; i++) {
			if (Deferrer.findObjectFromString(c[i].requiredObject)) {
				c[i].callback();
			} else {
				remaining.push(c[i]);
			}
		}
		Deferrer.callbacks = remaining;
		if (Deferrer.callbacks.length == 0) {
			window.clearInterval(Deferrer.interval);
		}
	},
	onLoad: function (callback) {
		Deferrer.defer(callback, "document.getElementsByTagName('body').length");
	}
}

var Debugger = {
	log: function (str) {
		if (!Debugger.enabled) {
			return;
		}
		if (!Debugger.window) {
			Debugger.showWindow();
		}
		Debugger.window.innerHTML += "LOG: " + str + "<br>";
	},
	showWindow: function () {
		Debugger.window = document.createElement('div');
		with (Debugger.window.style) {
			width = '400px';
			height = '200px';
			backgroundColor = '#ffffff';
			border = '1px black solid';
			position = 'fixed';
			bottom = '10px';
			left = '20px';
			overflow = 'auto';
		}
		$$('body')[0].appendChild(Debugger.window);
	},
	window: false,
	enabled: false	
}

void new function() { // no exposed names...
	var oldOnLoad = window.onload ;
	window.onload = function() {
		if (oldOnLoad) oldOnLoad() ;

		$$( '.showwidget' ).each( function(x) {
			var classtest = /\bwidget\b/ ;
			for ( var j=0 , family = [ x , x , x ] ,
				relations = [ 'previousSibling' , 'nextSibling' , 'parentNode' ]; family[2] ; j=(j+1)%3 ) {
				if ( family[j] ) family[j] = family[j][ relations[j] ] ;
				if ( family[j] && classtest.test( family[j].className ) ) {
					x.removeAttribute( 'href' ) ;
					x.onclick = showhide ;
					x.targetwidget = family[j] ;
					if ( family[j].parentNode != family[j].offsetParent )
						family[j].parentNode.style.position = "relative" ;
					if ( j == 2 || j == 5 ) break ;
					if ( !/\bopen\b/.test( x.className ) ) {
						x.className = x.className + ' closed' ;
					} else { // total kludge to set widget.openedBy and stabilise position in buggy browsers
						family[j].style.visibility = 'hidden';
						x.onclick() ;
					}
					break ;
				}
			}
		} ) ;

		$$( '.confirm' ).each( function(x) {
			x.originalhref = x.href ;
			x.onclick = confirmAction ;
		} ) ;

		$$( '.wuformaction' ).each( function(x) { x.onclick = wuFormAction ; } ) ;

		$$('textarea.expandable').each( expandableTextarea ) ;
		var hadFocus = ( document.activeElement && document.activeElement.id ) ;
		$$('input.expandable').each( expandableInput ) ;
		if ( hadFocus )
			$( hadFocus ).focus() ;
	}

	function showhide() {
		if ( typeof( this.targetwidget ) == 'undefined' ) alert('Sorry, this widget opener has lost its widget.') ;
		var x = this.targetwidget ;
		if ( x.style.visibility == 'hidden' || x.style.display == 'none' ) {
			x.style.visibility = 'visible' ; // a lot of redundancy here for buggy browsers
			x.style.display = 'block' ;
			x.openedBy = this ;
			this.className = this.className.replace( 'closed' , 'open' ) ;
			if ( /Opera.*Version\/10/.test( navigator.userAgent ) ) { // ignores position on in-line elements
				x.style.left = this.offsetLeft + this.scrollLeft;
				x.style.top = this.offsetTop + this.scrollTop ;
				x.style.marginTop = this.offsetHeight.toString() + 'px' ;
			}
		} else {
			x.style.visibility = 'hidden' ;
			x.style.display = 'none' ;
			x.openedBy.className = x.openedBy.className.replace( 'open' , 'closed' ) ;
  		}
		return false ;
	}

	function confirmAction() {
		if ( confirm( "Really " + this.title + "?" ) ) {
			parent.location= this.originalhref ;
		}
		return false ;
	}

	function wuFormAction() { // give the right controls the operative names for category or weblog
		this.form.op.value=this.value ;
		var nodeid = this.name.substr( 2 ) ;
		for ( var i = 0 , names = [ "nid" , "cid" , "target" , "source" ] ; names[i] ; i++ )
			if ( this.form[ names[i] + nodeid ] )
				this.form[ names[i] + nodeid ].name = names[i] ;
		this.form.submit() ;
	}

	function resizeTextarea(x) {
		var init = x.scrollHeight;
		x.style.height = init + 'px' ;
		var diff = x.scrollHeight - init ; // remove discrepancy...
		x.style.height = ( x.scrollHeight - 2*diff ) + 'px' ; //...twice because the removal repeats it
	}

	function changeTextarea(e) {
		var el = Event.element(e);
		if ( el.replaces && e.keyCode == 13 ) {
			el.value = el.value.replace( /[\r\n]/g , '' ) ;
			if ( el.form.onsubmit )
				if ( !el.form.onsubmit() ) return ;
			el.form.submit() ;
		}
		resizeTextarea(el) ;
	}

	function expandableTextarea(o) {
		o.style.overflow = 'hidden' ;
		o.setAttribute( 'rows' , '2' ) ;
		Event.observe(o, 'keyup', changeTextarea);
		Event.observe(o, 'textInput', changeTextarea);
		Event.observe(o, 'focus', changeTextarea);
	}

	function expandableInput( input ) {
		replacement = document.createElement( 'textarea' ) ;
		replacement.replaces = input ;
		replacement.innerHTML = input.value ;
		for ( var atts = input.attributes , i=0 ; atts[i] ; i++ )
			if ( !input.outerHTML || input.outerHTML.indexOf( atts[i].name + '=' ) > -1 ) // filter for IE8
				if ( !/size|type/.test( atts[i].name ) )
					replacement.setAttribute( atts[i].name , atts[i].value ) ;
		expandableTextarea( replacement ) ;
		replacement.rows = 1 ;

		replacement.style.verticalAlign = 'top' ;
		[ 'marginTop' , 'marginBottom' , 'marginLeft' , 'marginRight' ,
		'paddingTop' , 'paddingBottom' , 'paddingLeft' , 'paddingRight' ,
		'fontFamily' , 'fontSize' , 'width' ].each(
			function(x){ replacement.style[x] = input.getStyle(x) } ) ;

		if ( !/noflow/.test( input.className ) ) {
			input.parentNode.replaceChild( replacement , input ) ;
		} else {
			input.style.visibility = 'hidden' ;
			input.removeAttribute( 'name' );
			input.parentNode.insertBefore( replacement , input ) ;
			replacement.style.position = 'absolute' ;	// this has to be after insert for IE8
			if ( replacement.getStyle && !replacement.getStyle( 'borderBottomStyle' ) )
				replacement.style.border = '1px solid gray' ; // fix Opera 10 border fail
		}

		resizeTextarea( replacement ) ;
		input.replacement = replacement ;
		if ( /noshrink/.test( input.className ) ) return ;
		replacement.originalHeight = replacement.style.height ;
		Event.observe( replacement , 'blur' , function() {
			setTimeout( function(){ replacement.style.height = replacement.originalHeight ; } , 250 ) ; // let buttons react...
		} ) ;
	}
} ;



var ZenCollapser = {

ajaxUrl : "/index.pl",

	varChange: function(name, value) {
		data = {
			mode: "var",
			node_id: 1873513,
			name: name,
			 value: value};
		myAjax = new Ajax.Request(
		        ZenCollapser.ajaxUrl,
		        {method: 'get', parameters: data, onComplete: ZenCollapser.ajax_response}
		);
	},

	ajax_response: function(response) {
		var is_hidden = eval( '('+response.responseText +')' );
		var nodelet_id = is_hidden.name.substring(5);
		var nodelet_content =
			$(nodelet_id).select('.nodelet_content').first();
		var nodelet_header =
			$(nodelet_id).select('.nodelet_title').first();
		if (is_hidden.value) {
			Effect.BlindUp(nodelet_content);
			nodelet_header.addClassName('closed');
			nodelet_header.removeClassName('open');
		}
		else {
			Effect.BlindDown(nodelet_content);
			nodelet_header.addClassName('open');
			nodelet_header.removeClassName('closed');
		}
		ZenCollapser.hasInitted = true;
	},

 	init: function() {

		$$('.nodelet').each( function(nodelet) {
			var nodelet_header = nodelet.select('.nodelet_title').first();
			if(USERVARS && USERVARS['hide_'+nodelet.id] == 1) {
				nodelet.select('.nodelet_content').first().hide();
				nodelet_header.addClassName('closed');
			} else {
				nodelet_header.addClassName('open');
			}
		});
		$$('.nodelet_title').invoke('observe','click',function(event){
			nodelet_id = Event.element(event).parentNode.id;
			new Effect.Highlight(nodelet_id);
			if ($(nodelet_id).select('.nodelet_content').first().visible()) {
				ZenCollapser.varChange('hide_'+nodelet_id, 1);
			}
			else {
				ZenCollapser.varChange('hide_'+nodelet_id, 0);
			}
		});
		$$('.nodelet_title').invoke('setStyle', {cursor: 'pointer'});
	},
	
	hasInitted: false
	
};


Event.observe(window, 'load', ZenCollapser.init);


var writeupAjaxExists = undefined;
var WriteupAJAX = undefined;
Deferrer.defer( function() {
 WriteupAJAX = Class.create( {

header: "",

initialize: function (el) {
this.header = el;
this.node_id = el.id.substring(8);
this.author = el.select(".writeup_author a").first().innerHTML;
},

getItem: function(item) {
if (item == "box") {
box = this.header.select(".writeup_"+item).first();
box.style.display = "block";
return box;
}
return this.header.select(".writeup_"+item).first();
},

writeupMessage: function() {
this.getItem("box").update("<input type=\'text\' size=\'70\' value=\'\' id=\'msg_"+this.node_id+"\' name= \'msgauthor\'/> <input type=\'button\' value=\'send\' onClick=\'WU"+this.node_id+".sendmessage()\' /> <input type=\'button\' value=\'cancel\' onClick=\'WU"+this.node_id+".getItem(\"box\").hide()\' />");

},

sendmessage: function() {
E2AJAX.privateMessage(this.author.gsub(" ","_"), $("msg_"+this.node_id).value);
this.getItem("box").update("message sent");
Element.hide.delay(2, this.getItem("box"));
},

bookmark: function() {
E2AJAX.bookmarkNode(this.node_id);
this.getItem("bookmark").update("bookmarked");
},

favorite: function() {
this.getItem("favorite").update("favorited");
},

vote: function(weight) {
E2AJAX.voteNode(this.node_id, weight);
show = "up";
if (weight == -1) {show = "down";}
this.getItem("vote").update("voted " + show);
},

cool: function () {
E2AJAX.coolNode(this.node_id);
this.getItem("cool").update("cooled");
},

killBox: function() {
this.getItem("box").update("kill box");
},

kill: function() {
this.getItem("kill").update("killed");
},

toolSet: function() {
this.getItem("box").update("Publish   Hide");
}

});
 writeupAjaxExists = 1;},"Prototype");

var nsCollapser = {
 init: function() {$$('.nodelet_section .ns_title').invoke('observe','click',function(event){  Event.element(event).nextSibling.toggle(); });}
};

if (window.onload) {
  var f = window.onload;
  window.onload = function() { nsCollapser.init(); f() };
} else {
  window.onload = nsCollapser.init;
}

var E2AJAX = {

	ajaxNode : 1873513,
	ajaxUrl : "/index.pl",

	varChange: function(name, value, callback) {
		USERVARS[name] = value;
		varString = Hash.toQueryString(USERVARS);
		data = {node_id:  E2AJAX.ajaxNode,
			mode: "allvars",
			varString: varString,
			name: name
		 };
		myAjax = new Ajax.Request(E2AJAX.ajaxUrl,{method: 'get', parameters: data, onComplete: callback});
	},

	privateMessage: function(recipient, msgText) {
		E2AJAX.sendMessage("/msg "+recipient+" "+msgText);
	},

getLastMessage: function() {

},

	sendMessage: function(msgText,checkmsg,callback) {
		if ((msgText.length ==0)&&(checkmsg == '')) {
			E2AJAX.update("chatterbox_chatter", "showchatter", {}, 0);
			$('talk_button').update('<input type="button" value="talk" onclick="updateTalk()"/>'); 
		}
		else {
			data = {
				node_id: E2AJAX.ajaxNode,
				mode: "message",
				deletelist: checkmsg,
				msgtext: msgText.replace( /[^ -~]/gm , function(x) { return "&#" + x.charCodeAt(0) + ";" ; } )
			};
			myAjax = new Ajax.Request(E2AJAX.ajaxUrl,{method: 'get', parameters: data, requestHeaders: "Thu, 1 Jan 1970 00:00:00 GMT", onComplete: callback});
		}


	},

	update: function(id, htmlcode, args, replaceID, callback) {
		args = Object.toJSON(args);

		if (replaceID == null) {replaceID = 1;}
		data = {node_id:  E2AJAX.ajaxNode,
			mode: "update",
			htmlcode: htmlcode,
			 args: args
			};

		myAjax = new Ajax.Request(E2AJAX.ajaxUrl,{method: 'post', parameters: data, requestHeaders: "Thu, 1 Jan 1970 00:00:00 GMT", onComplete: function(response) {
		var success = response.request.success()
				&& response.responseText != ''
				;
		if (success) {
			if (replaceID) {
				$(id).replace(response.responseText);
			}
			else {
				$(id).update(response.responseText);
			}
		}
		if (callback != null) {
			callback(response);
		}

		}
		});
	},

	voteNode: function(node_vote, weight) {
		data = {node_id:  E2AJAX.ajaxNode,
			mode: "vote"
	
			};
		data["vote__" + node_vote] = weight;
		$("voteinfo_"+node_vote).select(".vote_buttons").first().update("Voting ...");
		myAjax = new Ajax.Request(E2AJAX.ajaxUrl,
			{
				method: 'get', 
				parameters: data, 
				onSuccess: function() {  E2AJAX.update("voteinfo_"+node_vote, "voteit", node_vote+",2", 0);} } );
	},

	bookmarkNode: function(node_bookmark) {
		data = {
			op : "bookmark",
			node_id : node_bookmark
		};
		myAjax = new Ajax.Request(E2AJAX.ajaxUrl, {method: 'get', parameters: data});
	},

	coolNode: function (node_cool) {
		data = {
			op : "cool",
			cool_id : node_cool
		};
		myAjax = new Ajax.Request(E2AJAX.ajaxUrl, {method: 'get', parameters: data});
	},
	
	starRateNode: function (node_rate, weight, seed, nonce) {
		data = {
			op : "starRate",
			rating_node : node_rate,
			rating: weight,
			starrating_seed: seed,
			starrating_nonce: nonce
		};
		myAjax = new Ajax.Request(E2AJAX.ajaxUrl, {method: 'get', parameters: data});
	},

	updateNodelet: function(nodeletName, args, callback) {
		nodeletID = nodeletName.toLowerCase().replace(/\W/g,'');
		if (args == null) {args = {};}
		args.nodelet = nodeletName;
		E2AJAX.update(nodeletID,'updateNodelet',args, 1, callback);
	},

	createTitle: function(title) {
		data = {type : "e2node", 
			op : "new",
			node : title};
		myAjax = new Ajax.Request(E2AJAX.ajaxUrl, {parameters: data, onSuccess: function() {E2AJAX.titleCreated = 1;}});
	},

	createWriteup: function(parent_e2node, doctext, writeuptype) {
		data = {op: "new",
			type: "writeup",
			writeup_doctext: doctext,
			writeup_parent_e2node: parent_e2node,
			writeuptype: writeuptype
		};
		new Ajax.Request(E2AJAX.ajaxUrl, {parameters: data, method: "post"});
	},

	postWriteup: function(title, doctext, writeuptype) {
		E2AJAX.createTitle(title);
		Deferrer.defer(function() {E2AJAX.getNodeInfo(title,"e2node","node_id");}, "E2AJAX.titleCreated");
		Deferrer.defer(function() {E2AJAX.createWriteup(E2AJAX.parentNode, doctext, writeuptype);}, "E2AJAX.parentNode");
	},

	getNodeInfo: function(nodeTitle, nodeType, field) {
		data = {node_id:  E2AJAX.ajaxNode,
			mode: "getNodeInfo",
			type: nodeType,
			field: field,
			title: nodeTitle
		};
		myAjax = new Ajax.Request(E2AJAX.ajaxUrl,{method: "get", parameters: data, onComplete: function(response) { E2AJAX.parentNode = response.responseText;} });
},

	markNotificationSeen: function(notified_id) {
		//$("notified_"+notified_id).fade();
		Effect.BlindUp("notified_"+notified_id);
		data = {
			node_id:  E2AJAX.ajaxNode,
			notified_id: notified_id,
			mode: "markNotificationSeen"
		};
		myAjax = new Ajax.Request(E2AJAX.ajaxUrl,{method: "get", parameters: data});
},

	checkNotifications: function() {
		E2AJAX.checkList("checkNotifications", E2AJAX.notificationOn, E2AJAX.notificationOff, ".notified", "notified_");
	},

	checkCools: function(){
		E2AJAX.checkList("checkCools", E2AJAX.coolOn, E2AJAX.coolOff, ".cooled", "cooled_");
	},

	checkMessages: function(){

		E2AJAX.checkList("checkMessages", E2AJAX.messageOn, E2AJAX.messageOff, ".messaged", "messaged_");
	},

	checkFeedItems: function(){

		E2AJAX.checkList("checkFeedItems", E2AJAX.feedItemOn, E2AJAX.feedItemOff, ".feeditem", "feeditem_");
	},

	itemOff: function(id) {
		Effect.BlindUp($(id));
},

	itemOn: function(id, IDGroup, holder, content, position) {
		if (position == "top") {
			$(holder).insert({ top: content});
		} else if (position == "bottom") {
			$(holder).insert({ bottom: content});
		} else {
			var nextElement = $(holder).childElements().find(
				function(el) {
					var match = /\btimestamp_(\d+\b)/.exec(el.className);
					if (match && match[1] < position) return true;
					else return false;
				}
			);
			if (nextElement) $(nextElement).insert({ before: content});
			else $(holder).insert({ bottom: content});
		}

		Effect.BlindDown($(IDGroup+id));
		(function() { new Effect.Highlight($(IDGroup+id)); } ).defer();
	},

	messageOff: function(messaged_id) {
		E2AJAX.itemOff(messaged_id);
	},

	messageOn: function(id, content, position) {

		content = "<div class='messaged' id='messaged_"+id+"'>"+content+"</div>";
		E2AJAX.itemOn(id,'messaged_','chatterbox_chatter',content,'bottom');
	},

	feedItemOff: function(id) {
		E2AJAX.itemOff(id);
	},

	feedItemOn: function(id, content, position) {
		content = "<div class='feeditem' id='feeditem_"+id+"' style='padding: .5em; margin-bottom: .2em'>"+content+"</div>";
		E2AJAX.itemOn(id,'feeditem_','feed_list',content,'top');
	},

	notificationOff: function(notified_id) {
		E2AJAX.itemOff(notified_id);
	},

	notificationOn: function(notified_id, content, position) {
		var notifyli = document.createElement('li');
		notifyli.className = 'notified timestamp_' + position;
		notifyli.id = 'notified_' + notified_id;
		notifyli.position = position;
		var notifya = document.createElement('a');
		notifya.className = 'closebox';
		notifya.title = 'hide notification';
		notifya.href = "javascript:E2AJAX.markNotificationSeen(" + notified_id + ")";
		notifya.innerHTML = '&#91;x&#93;';
		notifyli.appendChild(notifya);
		notifyli.innerHTML += content;
		finalContent = notifyli;
		E2AJAX.itemOn(notified_id,'notified_','notifications_list',finalContent,position);
	},

	checkList: function(mode, callbackOn, callbackOff, currentListClass, currentListIDGroup) {
		data = {node_id:  E2AJAX.ajaxNode,
			mode: mode
		};
		myAjax = new Ajax.Request(E2AJAX.ajaxUrl,
		{
			method: "get",
			parameters: data,
			onComplete: function(response) {
				responseJSON = response.responseText.evalJSON();
				i = 1;
				while (responseJSON[i]) {
					var position = responseJSON[i].timestamp || "top";
					if ($(currentListIDGroup+responseJSON[i].id) === null) {
						callbackOn.defer(responseJSON[i].id, responseJSON[i].value, position);
					}
					i++;
				}
				$$(currentListClass).each(function(item) {
					if (typeof(responseJSON[item.id.replace(currentListIDGroup,'')]) === 'undefined') {
						callbackOff.defer(item.id);
					}
				});
			}
		});

	},

	addFeedItem: function(doctext) {
		data = {
			type : "feeditem",
			node_id : E2AJAX.ajaxNode,
			title: "feeditem",
			op : "new",
			doctext : doctext
		};
		myAjax = new Ajax.Request(E2AJAX.ajaxUrl, {
			parameters: data, 
			onSuccess: 
				function() {
					E2AJAX.checkFeedItems(); $('new_feed_item').value = '';
				}
		});
	},

	deleteFeedItem: function(item_id) {
		data = {
			mode : "deleteFeedItem",
			node_id : E2AJAX.ajaxNode,
			feeditem_nodeid : item_id
		};
		myAjax = new Ajax.Request(E2AJAX.ajaxUrl, {
			parameters: data, 
			onSuccess: 
				function() {
					E2AJAX.checkFeedItems();
				}
		});
		
	}

	

};


