var req;
var blockreq;

function querycompleted() {
	return req.readyState == 4;
}
function resultsloaded() {
    return req.status == 200;
}
function blockcompleted() {
	return blockreq.readyState == 4;
}
function blockloaded() {

   	if(blockreq.status == 200)
	   	me.item("working").style.display="none";
	return blockreq.status == 200;
}
////////////////////////////////////
function brq(url) {

	delete	blockreq;

	if (window.XMLHttpRequest) {

		blockreq = new XMLHttpRequest();
	    blockreq.open("get", url, false);
	    blockreq.send(null);

	} else if (window.ActiveXObject) {

		try { blockreq = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e1) {
	  		try {	blockreq = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e2) {
	    		// No HTTP request for you! I suppose a message about a browser upgrade should go here.
	  		}//second try
		}//first try
	 	if (blockreq) {
	        blockreq.open("get", url, false);
	        blockreq.send();
	    }
	}// if activex
}
var idpass;
String.prototype.trim = function () {
  return this.replace(/^\s+/g, '').replace(/\s+$/g, '');
}
String.prototype.broken = function () {
  return this.replace(/\n/g, '<br/>');
}
String.prototype.unbroken = function () {

  var str = this.replace(/<br>/gi, '\n');
  return str.replace(/<br\/>/gi, '\n');
}
String.prototype.no_thans = function () {
    this.replace(/\</g, '&lt;')
  return this.replace(/\>/g, '&gt;');
}
String.prototype.uri = function (){
	return escape(encodeURIComponent( this.unbroken() ));
}
function getNodeValue(obj, nodeName) {

	var st = "";
	if (obj.hasChildNodes() ) {
		var i = 0;
		while ((st == "") && (i < obj.childNodes.length)) {
			if(!obj.childNodes[i].firstChild)
				return "";
			st = (obj.childNodes[i].nodeName == nodeName) ?
				obj.childNodes[i].firstChild.nodeValue :
				getNodeValue(obj.childNodes[i], nodeName);
			i++;
		}
	}
	return st;
}

function browserspecificstuff(){

	this.item = function (objectId){
	  if(document.getElementById && document.getElementById(objectId)){
	  	return document.getElementById(objectId);
	  }else if (document.all && document.all(objectId)){
	  	return document.all(objectId);
	  }else if (document.layers && document.layers[objectId]){
	  	return document.layers[objectId];
	  } else  {	return false; }
	}
}
var me = new browserspecificstuff();

function dbg(string){ me.item('debug').innerHTML += string+'<br/>'}

function togglepanel(id){
	var ele = me.item(id);
	if( ele.style.display=='none'){
	    ele.style.display='block';
	    me.item('wtitle').focus();
	}else{
	    ele.style.display='none';
	}
}
function yktogglepanel(id){

	clearmsgs();
	var ele = me.item(id);
	if( ele.style.display=='none'){
	    ele.style.display='block';
	    me.item('yktogglepanel'+id).innerHTML='hide replies';
	}else{
	    ele.style.display='none';
	    me.item('yktogglepanel'+id).innerHTML='show replies';
	}
}
function togglereplies(panelid, ykid, readtime){

	clearmsgs();
	var ele = me.item(panelid);
	if( ele.style.display=='none'){
		getreplies(ykid, readtime);
        	ele.style.display='block';
	    	me.item('yktogglepanel'+panelid).innerHTML='hide replies';
		object('parachute'+ykid).src='http://tvtropes.org/pmwiki/pub/smiles/parachute.png';
	}
	else{
	    	ele.style.display='none';
	    	me.item('yktogglepanel'+panelid).innerHTML='show replies';
	    	me.item('yktogglepanel'+panelid).focus();
		object('parachute'+ykid).src='http://tvtropes.org/pmwiki/pub/images/checkph.gif';
	}
}
function openpanel(id){

	clearmsgs();
    me.item(id).style.display='block';
}
function closeall(id){
	var divs = me.item('page').getElementsByTagName('div');
	for(var i=0;i<divs.length;i++){
		if(	divs[i].id != id && divs[i].getAttribute('paneltype')=='panel'){
				divs[i].style.display='none';
				var subpanels = divs[i].getElementsByTagName('div');
				for(var z=0;z<subpanels.length;z++){
					if(subpanels[z].getAttribute('paneltype')=='subpanel')
	                    subpanels[z].style.display='none';
				}
			}
	}
}
function kickoff(ykttw, inputid, msgid){
	if(me.item(inputid).value==''){
        me.item(msgid).innerHTML='<br/> No name, no kicky. Them\'s the rule.';
	}else{
		yktogglepanel(ykttw);
		dbg('What happens now is the YKTTW is removed from this list '
		+'and a page is created with the kickoff name and the original query text from the YKTTW. '
		+' We wait a mo, then jump to the new page.');
	}
}
function sendreply(button, parentid, input, dest, subpanel, countholder){

	var thetext = ""+me.item(input).value;
	if(thetext=='')return;
	var thisauthor = ""+me.item('authorholder').value;
	if(thisauthor=="")thisauthor="Unknown Troper";
	button.disabled=true;	
	var url = "ykcontrol.php?action=newreply"
	+"&parentid="+parentid	+"&author=" + thisauthor+"&replytext="+thetext.uri();
	
	brq(url);
	if ( blockreq &&  blockloaded() ){
	        me.item(dest).innerHTML +=  blockreq.responseText;
		delete blockreq;
		button.disabled=false;	
	}
    me.item(input).value='';
    var count = ""+me.item(countholder).innerHTML;
    me.item(countholder).innerHTML = new Number(count)+1;
    yktogglepanel(subpanel);
}
function getreplies(ykid, readtime){
	
	var url = "ykcontrol.php?action=getreplies&parentid="+ykid+"&userreadtime="+readtime;
	brq(url);
	if ( blockreq &&  blockloaded() ){
        me.item('lastreplyfor'+ykid).innerHTML ='';
        me.item('repliesholder'+ykid).innerHTML =  blockreq.responseText;
		delete blockreq;
	}
}
function editreply(id){
	
	yktogglepanel('replyeditor'+id);
	var url = "ykcontrol.php?action=getreplytext&id="+id;
	brq(url);
	if ( blockreq &&  blockloaded() ){
        me.item('replytextarea'+id).value =  getNodeValue(blockreq.responseXML, 'reply') ;
        setfocus('replytextarea'+id );
		delete blockreq;
	}
}
function editykttw(id){
	yktogglepanel('ykttweditor'+id);
	var url = "ykcontrol.php?action=getykttwtext&id="+id;
	dbg(url);
	brq(url);
	if ( blockreq ){
		if(  blockloaded() ){
		    me.item('ykttwtextarea'+id).value =  getNodeValue(blockreq.responseXML, 'thetext');
		    me.item('wtitle'+id).value =  getNodeValue(blockreq.responseXML, 'thetitle');
		    me.item("ykttwtextarea"+id).focus();
			delete blockreq;
		}
	}
}
function newYKTTW(){

	var wtitle = ""+me.item('wtitle').value;
	var thisauthor = ""+me.item('authorholder').value;
	if(thisauthor=="")thisauthor="Unknown Troper";
	var thetext = ""+me.item('newYKTTW').value;
	if(thetext=='')return;
	if(wtitle==''){
        me.item('wtitlenag').innerHTML ='Please enter something for a working title';
        me.item('wtitle').focus();
		return;
	}
	var url = "ykcontrol.php?action=newykttw"
	+"&author=" + thisauthor+"&querytext="+thetext.uri()+"&workingtitle="+witle.uri();
	brq(url);
	if ( blockreq &&  blockloaded() ){
        me.item('newYKTTWReceiver').innerHTML +=  blockreq.responseText;
		delete blockreq;
	}

    me.item('debug').innerHTML='';
	dbg('Your YKTTW has been added.');
	me.item('newYKTTW').value ='';
	me.item('wtitle').value ='';
}
function updatereply(id){

	var text = ""+me.item('replytextarea'+id).value;
	if(text=='')return;
	yktogglepanel('replyeditor'+id);
	var thisauthor = ""+me.item('authorholder').value;
	if(thisauthor=="")thisauthor="Unknown Troper";

	var url = "ykcontrol.php?action=updatereply"
	+"&id="+id+"&author=" + thisauthor+"&replytext="+text.uri();

	brq(url);
	if ( blockreq &&  blockloaded() ){
		var xml = blockreq.responseXML;
		me.item('timestampholder'+id).innerHTML = getNodeValue(xml, 'timestamp');
		delete blockreq;
	}
	var url = "ykcontrol.php?action=getreplyhtml&id="+id;
	brq(url);
	if ( blockreq &&  blockloaded() ){
		me.item('replytext'+id).innerHTML = blockreq.responseText;
		delete blockreq;
	}
}
function clearmsgs(){

    me.item('debug').innerHTML='';
	var spans = me.item('page').getElementsByTagName('span');
	for(var i=0;i<spans.length;i++){
		if(spans[i].getAttribute('class')=='KOmsg')
		    spans[i].innerHTML = '';
	}
	me.item('wtitlenag').innerHTML='';
}
function opener(id){ me.item(id).click();}
function openall(){

	// find all the ykttw ids, riff through and open its replies section,
	//and call getreplies
	me.item('openerworkingmessage').innerHTML = 'Working... There is a pause between each "open".';
	var openers = me.item('page').getElementsByTagName('button');
	var delay = 0
	for(var i=0;i<openers.length;i++ ){
		if(openers[i].getAttribute('class')
			&& openers[i].getAttribute('class') =="replyopener"){
			delay+=2000;
            window.setTimeout('opener("'+openers[i].getAttribute('id')+'")', delay);
		}
	}
}
function launch(){
	var tropetitle = ""+me.item('tropename').value;
	var workingtitle = ""+me.item('workingtitle').value;
	me.item('launchmessage').innerHTML = "Underway! May take a moment...";
	if(tropetitle==""){
        me.item('launchmessage').innerHTML = "We will need a title to do this.";
        return;
	}
	var url = "ykcontrol.php?action=launch&id="
	+me.item('id').value+"&title=" + tropetitle +"&workingtitle="+workingtitle;
	brq(url);
	if ( blockreq &&  blockloaded() ){
		var xml = blockreq.responseXML;
		var result =  ""+getNodeValue(xml, 'errormsg');
		if(result!="")	me.item('launchmessage').innerHTML = "<br/>"+result.replace('token', '<i>word</i>');
		else window.location.href = getNodeValue(xml, 'linky');
		delete blockreq;
	}
}
function discard(){
	object('tropename').value='DiscardedYKTTW';
}

function resetlmsg(){
  me.item('launchmessage').innerHTML = "";
}
function showlauncher(id){
    window.location.href = "http://tvtropes.org/pmwiki/launch_new.php?id="+id;
}
function overrideinterval(){
	var interval = "" + object('intervaloverride').value;
    window.location.href = "http://tvtropes.org/pmwiki/ykttw.php?interval="+interval.trim();
}

// ajax POST handling
var http_request = false;
//////////////////////////////////////////
function requestPost(clienthandler, url, mimetype, postString) {
  http_request = false;
  if (window.XMLHttpRequest) { http_request = new XMLHttpRequest(); 
	if (http_request.overrideMimeType) { http_request.overrideMimeType(mimetype); }}
  else if (window.ActiveXObject) { try { http_request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e){try {http_request = new ActiveXObject("Microsoft.XMLHTTP");} catch (e) {} }}
  if (!http_request) { return false; }
  http_request.onreadystatechange = clienthandler;
  http_request.open('POST', url, true);
  http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=iso-8859-1; ");
  http_request.setRequestHeader("Content-length", postString.length);
  http_request.setRequestHeader("Connection", "close");
  http_request.send(postString);
  return true;
}

function showNewYKTTW() {
  if (http_request.readyState == 4) {
     if (http_request.status == 200) {
        me.item('newYKTTWReceiver').innerHTML +=  http_request.responseText;
		me.item('newYKTTW').value ='';
		me.item('wtitle').value ='';
		me.item('wtitlenag').innerHTML = 'Your YKTTW has been added.';
		me.item('add_button').click();
     } else {
        me.item('newYKTTWReceiver').innerHTML = 
		'There was a problem with the request. status: ' 
		+ http_request.status
		+ ': '
		+ http_request.statusText;
     }
  }
}
function getYKPostValues(button) {
	
	if(me.item('newYKTTW').value=='')return;
	var wtitle = ""+me.item('wtitle').value;
	wtitle = wtitle.trim();
	if(wtitle==""){
        me.item('wtitlenag').innerHTML ='Please enter something for a working title';
        me.item('wtitle').focus();
		return;
	}
	button.disabled=true;	
	var thisauthor = ""+me.item('authorholder').value;
	var thetext = ""+me.item('newYKTTW').value;
	if(thisauthor=="")thisauthor="Unknown Troper";
  	var postString = "querytext=" + thetext.uri() + "&workingtitle=" + wtitle.uri() + "&author=" + thisauthor.uri();
    	requestPost(showNewYKTTW, 'ykposthandler.php', 'html', postString);
}
function showUpdatedYKTTW() {
  if (http_request.readyState == 4) {
     if (http_request.status == 200) {
		var xml = http_request.responseXML;
   		me.item('timestampholderfor'+idpass).innerHTML =  getNodeValue(xml, 'timestamp');
		me.item( 'wtitleholder'+idpass).innerHTML = getNodeValue(xml, 'workingtitle');
		//me.item('ykttwtext'+idpass).innerHTML = getNodeValue(xml, 'html');//.broken();
		var url = "ykcontrol.php?action=getykttwhtml&id="+idpass;
		brq(url);
		if ( blockreq &&  blockloaded() ){
			me.item('ykttwtext'+idpass).innerHTML = blockreq.responseText;
			delete blockreq;
		}
		idpass='';
     }
  }
}
function updateykttw(id){
	var text = ""+me.item('ykttwtextarea'+id).value;
	if(text=='')return;
	var wtitle = ""+me.item('wtitle'+id).value;
	var thisauthor = ""+me.item('authorholder').value;
	if(thisauthor=="")thisauthor="Unknown Troper";
	yktogglepanel('ykttweditor'+id);
	var postString ="id="+id+"&author="+thisauthor.uri()+"&querytext="+text.uri()+"&workingtitle="+wtitle.uri();
	idpass = id;
    requestPost(showUpdatedYKTTW, 'ykupdatehandler.php', 'text/xml', postString);
}
function ykflag(ykid, troper){

	var url = "ykflag.php?action=flag&ykid="+ykid+"&troper="+troper;
	brq(url);
	if ( blockreq &&  blockloaded() ){
		var xml = blockreq.responseXML;
		var result =  ""+getNodeValue(xml, 'flagid');
        me.item('flagbutton'+ykid).innerHTML = '<img src="pub/flag_blue.png"/>';
        me.item('flagbutton2'+ykid).innerHTML = '<img src="pub/flag_blue.png"/>';
        var forclick = "dropflag('"+result+"', '"+ykid+"', '"+troper+"');";
        me.item('flagbutton'+ykid).setAttribute('onclick',forclick);
        me.item('flagbutton2'+ykid).setAttribute('onclick',forclick);
	}
	return false;
}
function dropflag(flagid, ykid, troper){

	var url = "ykflag.php?action=dropflag&flagid="+flagid;
	brq(url);
	if ( blockreq &&  blockloaded() ){
        me.item('flagbutton'+ykid).innerHTML = '<img src="pub/flag_yellow.png"/>';
        me.item('flagbutton2'+ykid).innerHTML = '<img src="pub/flag_yellow.png"/>';
        var forclick = "ykflag('"+ykid+"', '"+troper+"');";
        me.item('flagbutton'+ykid).setAttribute('onclick',forclick);
        me.item('flagbutton2'+ykid).setAttribute('onclick',forclick);
	}
	return false;
}
function yksearch(){
	var term = ""+object('yksearchterm').value;
	if(term=="")return;
	window.location.href = "http://tvtropes.org/pmwiki/ykttw_search.php?term="+term;
}
