function getHttpObject() {

 var http_request = false;

   if (window.XMLHttpRequest) { // Mozilla, Safari,...
      http_request = new XMLHttpRequest();
      //if (http_request.overrideMimeType) {
         //http_request.overrideMimeType('text/xml');
      //}
   } else if (window.ActiveXObject) { // IE
      try {
         http_request = new ActiveXObject("Msxml2.XMLHTTP");
      } catch (e) {
         try {
            http_request = new ActiveXObject("Microsoft.XMLHTTP");
         } catch (e) {}
      }
   }

   return http_request;
}

function deleteElement(elementId) {
	var el = document.getElementById(elementId);
	if (el) {
		el.parentNode.removeChild(el);
	}
}

function updateById(http_request, elementId) {
   if (http_request.readyState == 4) {
      if (http_request.status == 200) {
         document.getElementById(elementId).innerHTML = http_request.responseText;
      }
   }
}

function updateByIdTimed(http_request, elementId, time) {
   if (http_request.readyState == 4) {
      if (http_request.status == 200) {
			var temp = document.getElementById(elementId).innerHTML;
         document.getElementById(elementId).innerHTML = http_request.responseText;
			setTimeout(function() { document.getElementById(elementId).innerHTML = temp}, time);
      }
   }
}

function evalOnSuccess(http_request) {
   if (http_request.readyState == 4) {
		showLoadingDisplay(false);
      if (http_request.status == 200) {
			eval(http_request.responseText);
		}
	}
}

function evalOnSuccessFunction(http_request, evalFunction) {
   if (http_request.readyState == 4) {
      showLoadingDisplay(false);
      if (http_request.status == 200) {
         eval(http_request.responseText);
			evalFunction();
      }
   }
}

function updateCSSRule(className, style) {
	cssArray = new Array();
	if (document.styleSheets[0].cssRules) {
		cssArray = document.styleSheets[0].cssRules;
	} else {
		cssArray = document.styleSheets[0].rules;
	}
	for (i = 0; i < cssArray.length; i++) {
		if (cssArray[i].selectorText == className) {
			cssArray[i].style.cssText = style;
			return;
		}
	}
	if (document.styleSheets[0].cssRules) {
		document.styleSheets[0].insertRule(className + "{ " + style + " }", 0);
	} else {
		document.styleSheets[0].addRule(className, style);
	}
}

function showLoadingDisplay(visible) {
   var loadingDisplay = document.getElementById('loadingDisplay');
	if (visible) {
		verticalCenter('loadingDisplay');
		loadingDisplay.style.display = "";
	} else {
		loadingDisplay.style.display = "none";
	}
}

function showMessage(text) {
	showMessageWidth(text, 30);
}

function showMessageWidth(text, newwidth) {
	clearTimeout(messageTimeout);
	if (messageFadeEffect) {
		messageFadeEffect.cancel();
		new Effect.Opacity('messageDisplay', {duration: 0, to: 1.0})
	}
   var messageDisplay = document.getElementById('messageDisplay');
	messageDisplay.style.width = newwidth + "%";
	messageDisplay.style.left = Math.round((100 - newwidth) / 2) + "%";
	messageDisplay.innerHTML = text;
	verticalCenter('messageDisplay');
	messageDisplay.style.display = "";
}

var messageTimeout;

var messageFadeEffect;
function showTimedMessage(text, time) {
	clearTimeout(messageTimeout);
	showMessage(text);
	messageTimeout = setTimeout(function () { messageFadeEffect = new Effect.Fade('messageDisplay') }, time);
}

function hideMessage() {
	clearTimeout(messageTimeout);
   var messageDisplay = document.getElementById('messageDisplay');
	messageDisplay.style.display = "none";
}


function getScrollXY() {
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  return [ scrOfX, scrOfY ];
}

function getWindowHeight() {
	var windowHeight = 0;
	if (typeof(window.innerHeight) == 'number') {
		windowHeight = window.innerHeight;
	} else {
		if (document.documentElement && document.documentElement.clientHeight) {
			windowHeight = document.documentElement.clientHeight;
		} else {
			if (document.body && document.body.clientHeight) {
				windowHeight = document.body.clientHeight;
			}
		}
	}
	return windowHeight;
}

function verticalCenter(elementId) {
	var windowHeight = getWindowHeight();
	if (windowHeight > 0) {
		var contentElement = document.getElementById(elementId);
		var contentHeight = contentElement.offsetHeight;
		if (windowHeight - contentHeight > 0) {
			//contentElement.style.top = ((windowHeight / 2) - (contentHeight / 2) + getScrollXY()[1]) + "px";
			contentElement.style.top = ((windowHeight / 2) - 100 + getScrollXY()[1]) + "px";
		} else {
			contentElement.style.position = 'static';
		}
	}
}

var ajaxDelay = 30000;

function getRecentlyVisited() {
   var http_request = getHttpObject();

   if (!http_request) {
      return false;
   }

	var parameters = "";
   http_request.onreadystatechange = function() { evalOnSuccess(http_request) };
   http_request.open('POST', "recentlyVisited.php", true);
   http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
   http_request.setRequestHeader("Content-length", parameters.length);
   http_request.setRequestHeader("Connection", "close");
   http_request.send(parameters);
   setTimeout("getRecentlyVisited()", ajaxDelay);
	updateAjaxDelay();
}

var loadCount = 0;
function updateAjaxDelay() {
	loadCount++;

	if (loadCount == 30) { //15 minutes
		ajaxDelay *= 2; //reload every 1 minute
	} else if (loadCount == 75) { //1 hour 
		ajaxDelay *= 60; //reload every 1 hour 
	} else if (loadCount == 75 + 47) { //2 days
		ajaxDelay *= 24; //reload every 1 day 
	}
}


function sendVote(poll_id, global_id, nullVote) {
  	var parameters = "poll_id=" + poll_id;
	parameters += "&global_id=" + global_id;

	if (!nullVote) {
		for (i = 0; i < document.forms.length; i++) {
			if (document.forms[i].name == "pollForm_" + global_id) {
				var checked = false;
				for(j = 0; j < document.forms[i].elements.length; j++) {
					if (document.forms[i].elements[j].checked) {
						parameters += "&" + encodeURIComponent("optionNumber[]") + "=" + document.forms[i].elements[j].value;
						checked = true;
					}
				}
				if (!checked) {
					return;
				}
			}
		}
	}

   var http_request = getHttpObject();

   if (!http_request) {
      return false;
   }

   http_request.onreadystatechange = function() { evalOnSuccess(http_request); };
   http_request.open('POST', "polls/processVoteAjax.php", true);
   http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
   http_request.setRequestHeader("Content-length", parameters.length);
   http_request.setRequestHeader("Connection", "close");
   http_request.send(parameters);
}

function addPoll(poll_id) {
	document.form.comment.value += "<poll>" + poll_id + "</poll>\n";
}

function hide(element){
   document.getElementById(element).style.display = "none";
}

function show(element){
   document.getElementById(element).style.display = "";
}

function toggleHide(element){
   var temp = document.getElementById(element);
   if (temp.style.display == "none") {
      temp.style.display = "";
   } else {
      temp.style.display = "none";
   }
}


function markPostAsFavorite(postId, action) {
   var http_request = getHttpObject();

   if (!http_request) {
      return false;
   }

   var parameters = "postId=" + postId;
	parameters += "&action=" + action;

   http_request.onreadystatechange = function() { updateMarkLink(http_request, "markFavorite_" + postId, "favorite", action); };
   http_request.open('POST', "favoritePostAjax.php", true);
   http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
   http_request.setRequestHeader("Content-length", parameters.length);
   http_request.setRequestHeader("Connection", "close");
   http_request.send(parameters);
}

function startPostHide(postId) {
	showMessageWidth("How do you want to hide this post?<br/><br/>" +
   	"<a style = 'font-size: 1.2' href = 'javascript: hideMessage();togglePostHidden(" + postId + ", false, false);'>Partial</a><br/>" + 
	"(the title of the post will still be displayed;<br/>replies <span style = 'font-style: italic'>will</span> show up as new posts)<br/><br/>" +
	"<a style = 'font-size: 1.2' href = 'javascript: hideMessage();togglePostHidden(" + postId + ",false, true);'>Total</a><br/>" + 
	"(the post will only show up in the archive;<br/>replies will <span style = 'font-style: italic'>not</span> show up as new posts)<br/><br/>" +
   	"<a href = \"javascript: hideMessage();\">Cancel</a>", 40);
}

function togglePostHidden(postId, hidePost, showReplies, totalHide) {
   var http_request = getHttpObject();

   if (!http_request) {
      return false;
   }

   var action = hidePostHelper(postId, hidePost, showReplies, totalHide, true);	

   var parameters = "postId=" + postId;
	parameters += "&action=" + action;
	if (totalHide) {
		parameters += "&total=true";
	}
	if (showReplies) {
		parameters += "&showReplies=true";
	}

   //http_request.onreadystatechange = function() { updateMarkLink(http_request, "markHidden_" + postId, "hidden", action); };
   http_request.open('POST', "hiddenPostAjax.php", true);
   http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
   http_request.setRequestHeader("Content-length", parameters.length);
   http_request.setRequestHeader("Connection", "close");
   http_request.send(parameters);
}

function hidePostHelper(postId, hidePost, showReplies, totalHide, updateLinks) {
        var postHideLink = document.getElementById("postHideLink_" + postId);
        var action = "";
	if (hidePost == false) {
		action = "unhide";
		show("postContent_" + postId);
		show("postContentR_" + postId);
		hide("postHideLinkSpan_" + postId);
		if (updateLinks) {
			show("hide_li_" + postId);
			show("hideAll_li_" + postId);
			hide("unhide_li_" + postId);
			hide("remove_li_" + postId);
		}
	} else if (totalHide) {
		deleteElement("postWrapper_" + postId);
		deleteElement("postContent_" + postId);
		deleteElement("postContentR_" + postId);
	} else if (hidePost && showReplies) {
		postHideLink.href = "javascript:toggleHide('postContent_" + postId + "');";
		action = "hide";
		hide("postContent_" + postId);
		show("postContentR_" + postId);
		show("postHideLinkSpan_" + postId);
		if (updateLinks) {
			hide("hide_li_" + postId);
			show("unhide_li_" + postId);
		}
	} else if (showReplies) {
		hide("postContent_" + postId);
		show("postContentR_" + postId);
	} else { //hide all
		postHideLink.href = "javascript:toggleHide('postContent_" + postId + "');toggleHide('postContentR_" + postId + "')";
		action = "hide";
		hide("postContent_" + postId);
		hide("postContentR_" + postId);
		show("postHideLinkSpan_" + postId);
		if (updateLinks) {
			hide("hide_li_" + postId);
			hide("hideAll_li_" + postId);
			show("unhide_li_" + postId);
			show("remove_li_" + postId);
		}
	}
	return action;
}

function showOnlyNew(postId) {
	var newPostRegex = /(\d+)(_new)?(_edited)?(_noNewReply)?/i;
	if (postId == 0) {
		var divs = document.getElementsByTagName('div');
	} else {
		var postWrapper = document.getElementById("postWrapper_" + postId);
		if (!postWrapper) {
			return;
		}
	
		var matches = newPostRegex.exec(postWrapper.className);
		showNewPostHelper(matches);
		var divs = postWrapper.getElementsByTagName('div');
	}
	
	for (i = 0; i < divs.length; i++) {
		var matches = newPostRegex.exec(divs[i].className);	
		showNewPostHelper(matches);
	}
}

function showNewPostHelper(matches) {
	if (matches != null) {
		var postId = matches[1];
		if (matches[2] == "_new") {
			if (matches[4] == "_noNewReply") {
				hidePostHelper(postId, false, false, false, false);
			} else {
				hidePostHelper(postId, false, true, false, false);
			}
		} else {
			if (matches[4] == "_noNewReply") {
				hidePostHelper(postId, true, false, false, false);
			} else {
				hidePostHelper(postId, true, true, false, false);
			}
		}
	}
}

function updateMarkLink(http_request, elementId, type, action) {
   if (http_request.readyState == 1) {
		document.getElementById(elementId).innerHTML = "Updating...";
	}
   if (http_request.readyState == 4) {
      if (http_request.status == 200) {
			document.getElementById(elementId).innerHTML = "Success!";
			var regex = /(\d+)/;
			var buffer = regex.exec(elementId);
			var post_id = buffer[1];
			var href, html;
			if (type == "favorite") {
				if (action == "create") {
					href = "javascript:markPostAsFavorite(" + post_id + ",'remove')";
					html = "Remove Favorite";
				} else {
					href = "javascript:markPostAsFavorite(" + post_id + ",'create')";
					html = "Mark as Favorite";
				}
			} else if (type == "hidden") {
				if (action == "create") {
					href = "javascript:markPostAsHidden(" + post_id + ",'remove')";
					html = "Unhide";
				} else {
					href = "javascript:markPostAsHidden(" + post_id + ",'create')";
					html = "Hide";
				}
			}
   		setTimeout(function() {document.getElementById(elementId).innerHTML = html; document.getElementById(elementId).href = href;} , 2000);
      }
   }
}