////////////////////////////////////////////////////////////////////////////////////////////
// AJAX Functions
//var req;
var func;
var isIE = false;
var waiting = Array();


function setWaiting(id, len) {
	waiting[id] = 1;
	if (len) window.setTimeout("clearWaiting('" + id + "')", len);
}

function clearWaiting(id) {
	waiting[id] = 0;
}

function isWaiting(id) {
	return waiting[id];
}

function keepWaiting(fn) {
	window.setTimeout(fn, 500);
}

// Make the request
function loadAjaxDoc(url, fnpointer) {
	func = fnpointer;
    new Ajax.Request(url, {method:'get', onSuccess:gotAjaxResponse});    
}

function postAjaxDoc(url, data, fnpointer) {
	func = fnpointer;
	new Ajax.Request(url, {method:'post', postBody:data, onSuccess:gotAjaxResponse});
}

function gotAjaxResponse(req) {
	// See if we got a simple type (aka just text or HTML)
	var child = req.responseXML.getElementsByTagName('twajax');
	if (child[0].attributes.length) {
		var type = child[0].attributes.getNamedItem('type').value;
		if (type == "simple") {
			processSimpleRequest(req.responseXML, func);
			return;
		}
	}

}

function debugWindow(str) {
  var win = window.open("","AJAX DEBUG","width=680,height=600,resizable,scrollbars=yes");
  
  win.document.write("<html><body><pre>");
  win.document.write(str);
  win.document.write("</pre></body></html>");
  win.document.close();
}



// Simple data.  Like just text or already formatted HTML.
function processSimpleRequest(xml, f) {
	var child = xml.getElementsByTagName('twajax');
	var str = child[0].childNodes[0].nodeValue;
	str = str.replace(/%%CDATAEND%%/g, "]]>");
	f(trim(str));
	if (sitedebug) {
		var win = window.open("","AJAX DEBUG","width=680,height=600,resizable,scrollbars=yes");
		
		win.document.write("<html><body><pre>");
		win.document.write(child[0].childNodes[0].nodeValue.escapeHTML());
		win.document.write("</pre></body></html>");
		win.document.close();
	}
}

// Empty function for AJAX that does not return data
function devnull(nada) { 
	return;
}



function checkUsername() {
	var name = $('username').value;
	loadAjaxoxDoc(baseurl + '/ajax/user.php?action=checkuser&username='+name, checkUsernameResult);	
}

function checkUsernameResult(val) {
	$('checkname').innerHTML = val;
}

function checkEmail() {
	var email = $('email').value;
	loadAjaxDoc(baseurl + '/ajax/user.php?action=checkemail&email='+email, checkEmailResult);
}

function checkEmailResult(val) {
	$('checkemail').innerHTML = val;	
}


function bumpSmallNews(newsid) {
	Effect.FadeKeepSpace('bumps' + newsid, {queue: {position: 'front', scope: 'bumpnews'}, duration: 1});
        setWaiting(newsid);
	window.setTimeout("clearWaiting(" + newsid + ")", 1000);
	loadAjaxDoc(baseurl + "/ajax/news.php?action=bumpnews&small=1&newsid=" + newsid, newsBumped)
}

function bumpNews(newsid) {
	Effect.FadeKeepSpace('bumps' + newsid, {queue: {position: 'front', scope: 'bumpnews'}, duration: 1});
        setWaiting(newsid);
	window.setTimeout("clearWaiting(" + newsid + ")", 1000);
	loadAjaxDoc(baseurl + "/ajax/news.php?action=bumpnews&newsid=" + newsid, newsBumped)
}

// newsid|bumps
function newsBumped(str) {
	if (str == "ERROR") {
		return;
	}
	
	var s = str.split("|");
	var newsid = s[0];
	var bumps = s[1];

	$('bumplink' + newsid).innerHTML = "bumped";

	if (waiting[newsid]) {
		window.setTimeout("newsBumped('" + str + "')", 500);
		return;
	}
	
	$('bumps' + newsid).innerHTML = bumps;

	Effect.AppearKeepSpace('bumps' + newsid, {queue: {position: 'end', scope: 'bumpnews'}, duration: 1});
}


function reportNews(newsid, reason) {
	loadAjaxDoc(baseurl + "/ajax/news.php?action=reportnews&newsid=" + newsid + "&reason=" + reason, doneReportNews);
}

function doneReportNews(txt) {
	if (txt == "ERROR") {
		twmsgbox.activate(baseurl + "/ajax/messages.php?msg=errorreporting");
	}
	else {
		twmsgbox.activate(baseurl + "/ajax/messages.php?msg=" + txt);
	}
}


function markNews(id) {
	newsid = id
	loadAjaxDoc(baseurl + "/ajax/news.php?action=marknews&newsid=" + newsid, doneMarkNews);
}

function profileMarkNews(id, showbody) {
	newsid = id;
	if (showbody == 1) {
		loadAjaxDoc(baseurl + "/ajax/news.php?action=smallmarknews&newsid=" + newsid, doneMarkNews);
	}
	else {
		loadAjaxDoc(baseurl + "/ajax/news.php?action=profilemarknews&newsid=" + newsid, doneMarkNews);
	}
}

function doneMarkNews(txt) {
	if (txt == "ERROR") {
		twmsgbox.activate(baseurl + "/ajax/messages.php?msg=ajaxerror");
		return;
	}

	var n = $('news' + newsid);
	n.innerHTML = txt;
	newsid = 0;
}

function showBumpers(newsid, page, friends) {
	if (friends == null) friends = 0;
	loadAjaxDoc(baseurl + "/ajax/news.php?action=showbumpers&newsid=" + newsid + "&page=" + page + "&friends=" + friends, doneShowBumpers);
}

function showComments(newsid, page) {
	loadAjaxDoc(baseurl + "/ajax/news.php?action=showcomments&newsid=" + newsid + "&page=" + page, doneShowBumpers);
}

function doneShowBumpers(txt) {
	if (txt == "ERROR") return;
	
	$('bumpedby').innerHTML = txt;
}

/////////////////////////////
// News inline editing
var newsid = 0;
var nextnewsid = 0;
var smallnews = 0;

function editNews(id, small) {
	if (newsid > 0) {
		nextnewsid = id;
		cancelNewsEdit();
		return;
	}
	
	if (small != null) smallnews=small;
	else smallnews = 0;
	
	newsid = id;
	loadAjaxDoc(baseurl + "/ajax/news.php?action=startedit&newsid=" + newsid + "&smallnews=" + smallnews, startNewsEdit);
}

function startNewsEdit(txt) {	
	if (txt == "ERROR") {
		twmsgbox.activate(baseurl + "/ajax/messages.php?msg=ajaxerror");
		return;
	}
	
	var n = document.getElementById('news' + newsid);
	n.innerHTML = txt;
	
}

function submitNewsEdit() {
	if (newsid == 0) return;
	
	var title = escape($('newstitle').value);
	var url = escape($('newsurl').value);
	var body = escape($('newsbody').value);
	var tags = escape($('tags').value);
	var category = escape($('category').value);
	
	var data = "action=submitedit&newsid=" + newsid + "&title=" + title + "&url=" + url + "&body=" + body + "&smallnews=" + smallnews + "&tags=" + tags + "&category=" + category;

	postAjaxDoc(baseurl + "/ajax/news.php", data, finishNewsEdit);
}

function cancelNewsEdit() {
	if (newsid == 0) return;
	loadAjaxDoc(baseurl + "/ajax/news.php?action=canceledit&newsid=" + newsid + "&smallnews=" + smallnews, finishNewsEdit)
}

function finishNewsEdit(txt) {
		
	if (txt == "ERROR") {
		twmsgbox.activate(baseurl + "/ajax/messages.php?msg=ajaxerror");
		return;
	}
	
	var n = document.getElementById('news' + newsid);
	n.innerHTML = txt;
	
	newsid = 0;
	if (nextnewsid > 0) {
		editNews(nextnewsid);
		nextnewsid = 0;
	}
}

function buryNews(id) {
	loadAjaxDoc(baseurl + "/ajax/news.php?action=bury&newsid=" + id, finishBuryNews);
}

function finishBuryNews(txt) {
	//txt = trim(txt);
	alert(txt);
}


function killNews(id) {
	if (confirm("This will remove the news from being seen (it will not be deleted)")) {
		loadAjaxDoc(baseurl + "/ajax/news.php?action=kill&newsid=" + id, finishBuryNews);
	}
}

function showBumpedBy(page, friends) {
	if (page == null) page = 1;
	if (friends == null) friends = 1;

	loadAjaxDoc(baseurl + "/ajax/news.php?action=showbumpedby&friends=" + friends + "&page=" + page, finishShowBumpedBy);
}

function finishShowBumpedBy(str) {
	if (str == "ERROR") {
		return;
	}

	$('bumpedby').innerHTML = str;
}


///////////////////////////////////////////////////////////////////////////////////////////
// Buddy list
var buddy = 0;

function addBuddy(id) {
	buddy = id;
	loadAjaxDoc(baseurl + "/ajax/user.php?action=addbuddy&buddy=" + id, doneBuddy);
}


function removeBuddy(id) {
	buddy = id;
	loadAjaxDoc(baseurl + "/ajax/user.php?action=removebuddy&buddy=" + id, doneBuddy);
}

function doneBuddy(txt) {
	txt = trim(txt);
	if (buddy == 0) {
		return;
	}
	
	$('user' + buddy).innerHTML = txt;
	buddy = 0;
}

function profileAddBuddy(id) {
	buddy = id;
	loadAjaxDoc(baseurl + "/ajax/user.php?action=profileaddbuddy&buddy=" + id, doneProfileBuddy);
}


function profileRemoveBuddy(id) {
	buddy = id;
	loadAjaxDoc(baseurl + "/ajax/user.php?action=profileremovebuddy&buddy=" + id, doneProfileBuddy);
}


function doneProfileBuddy(txt) {
	if (buddy == 0) return;	

	$('buddylink').innerHTML = txt;
	buddy = 0;
}


///////////////////////////////////////////////////////////////////////////////////////////
// Strings

function trim(s) {
	return s.replace(/^\s+|\s+$/g, ""); 
}

function ucfirst(s) {
	var c = s.charAt(0);

	if (parseInt(s.length)==1) {
		return c.toUpperCase();
	}
	else {
		return c.toUpperCase() + s.slice(1).toLowerCase();
	}
}

///////////////////////////////////////////////////////////////////////////////////////////
// Cookies -- C is for cookies that's good enough for me.  Cookie cookie cookie starts with C

function set_cookie(cookieName, cookieValue, nDays) {
	var today = new Date();
	var expire = new Date();
	if (nDays==null || nDays==0) nDays=1;
	expire.setTime(today.getTime() + 3600000*24*nDays);
	document.cookie = cookieName+"="+escape(cookieValue) + ";expires="+expire.toGMTString();
}

function get_cookie(name) { 
	var index = document.cookie.indexOf(name + "=");
	if (index == -1) return null;
	index = document.cookie.indexOf("=", index) + 1;
	var endstr = document.cookie.indexOf(";", index);
	if (endstr == -1) endstr = document.cookie.length;
	return unescape(document.cookie.substring(index, endstr));
}

////////////////////////////////////////////////////////////////////////////////////////////
// Localization functions
function checkTimeZone() {
	var rightNow = new Date();
	var date1 = new Date(rightNow.getFullYear(), 0, 1, 0, 0, 0, 0);
	var date2 = new Date(rightNow.getFullYear(), 6, 1, 0, 0, 0, 0);
	var temp = date1.toGMTString();
	var date3 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1));
	var temp = date2.toGMTString();
	var date4 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1));
	var hoursDiffStdTime = (date1 - date3) / (1000 * 60 * 60);
	var hoursDiffDaylightTime = (date2 - date4) / (1000 * 60 * 60);
	if (hoursDiffDaylightTime == hoursDiffStdTime) {
		alert("Time zone is GMT " + hoursDiffStdTime + ".\nDaylight Saving Time is NOT observed here.");
	} else {
		alert("Time zone is GMT " + hoursDiffStdTime + ".\nDaylight Saving Time is observed here." + hoursDiffDaylightTime);
	}
}

// Actual timezone from GMT (i.e. US East is -5)
function getRealTimezone() {
	var rightNow = new Date();
	var date1 = new Date(rightNow.getFullYear(), 0, 1, 0, 0, 0, 0);
	var date2 = new Date(rightNow.getFullYear(), 6, 1, 0, 0, 0, 0);
	var temp = date1.toGMTString();
	var date3 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1));
	var temp = date2.toGMTString();
	var date4 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1));
	var hoursDiffStdTime = (date1 - date3) / (1000 * 60 * 60);
	
	return hoursDiffStdTime;	
}

// Current offset from GMT (i.e. during DST US East is -4)
function getCurrentTimezoneOffset() {
	var rightNow = new Date();
	return (rightNow.getTimezoneOffset()/-60);
}

// Is DST currently in effect
function isDst() {
	var tz1 = getRealTimezone();
	var tz2 = getCurrentTimezoneOffset();
	
	return !(tz1 == tz2);	
}

// Does this timezone have DST?
function getTimezoneDst() {
	var rightNow = new Date();
	var date1 = new Date(rightNow.getFullYear(), 0, 1, 0, 0, 0, 0);
	var date2 = new Date(rightNow.getFullYear(), 6, 1, 0, 0, 0, 0);
	var temp = date1.toGMTString();
	var date3 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1));
	var temp = date2.toGMTString();
	var date4 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1));
	var hoursDiffStdTime = (date1 - date3) / (1000 * 60 * 60);
	var hoursDiffDaylightTime = (date2 - date4) / (1000 * 60 * 60);
	if (hoursDiffDaylightTime == hoursDiffStdTime) {
		return false;
	} else {
		return true;
	}	
}


function checkDSTChange(currentdst) {
	var isdst = isDst();
	
	if (isdst != currentdst) {
		var dst = (isdst) ? 1 : 0;
		loadXMLDoc('ajax/user.php?action=setdst&value='+dst, dummy);
		showDstUpdated(dst);
	}
}

// Might not do this at all
function checkTimezoneChange(currenttz) {
	var tz = getRealTimezone();
	return;
	if (tz != currenttz) {
		loadXMLDoc('ajax/user.php?action=settimezone&value='+tz, dummy);
		alert("Timezone changed");	
	}
	
}


function showDstUpdated(nowdst) {
	if (nowdst) {	
		alert("The system detected that daylight savings is now in effect");
	}
	else {
		alert("The system detected that daylight savings is no longer in effect");
	}
}
///////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
// Effects helpers


Effect.FadeKeepSpace = function(element) {
  var oldOpacity = Element.getInlineOpacity(element);
  var options = Object.extend({
  from: Element.getOpacity(element) || 1.0,
  to:   0.0,
  afterFinishInternal: function(effect) { with(Element) { 
    if(effect.options.to!=0) return;
    blank(effect.element);
    setStyle(effect.element, {opacity: oldOpacity}); }}
  }, arguments[1] || {});
  return new Effect.Opacity(element,options);
}

Effect.AppearKeepSpace = function(element) {
  var options = Object.extend({
  from: (Element.getStyle(element, 'visibility') == 'hidden' ? 0.0 : Element.getOpacity(element) || 0.0),
  to:   1.0,
  beforeSetup: function(effect) { with(Element) {
    setOpacity(effect.element, effect.options.from);
    unblank(effect.element); }}
  }, arguments[1] || {});
  return new Effect.Opacity(element,options);
}

Object.extend(Element, {blank:function(){for(var i=0;i<arguments.length;i++){var element=$(arguments[i]);element.style.visibility='hidden';}},unblank:function(){for(var i=0;i<arguments.length;i++){var element=$(arguments[i]);element.style.visibility='visible';}}});

//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
// Cloud stuff

function toggleCloudControl() {
	cloudControl = (cloudControl == "filtering") ? "surfing" : "filtering";
	$('cloudlabel').value = ucfirst(cloudControl);
	set_cookie("cloudcontrol", cloudControl);
	buildCloudLinks();	
}

function buildCloudLinks() {
	var tags = document.getElementsByClassName("tagchain");
	var cloudtags = document.getElementsByClassName("tagcloud");
	
	if (cloudControl == "filtering") {
		var taglist = new Array();
		for (var i = 0 ; i < tags.length ; i++) {
			var tag = tags[i].href.replace(/^.*tagids=([0-9+]+).*$/, "$1");
			taglist.push(tag);
			tags[i].href = tags[i].href.replace(/^([^?]+\?.*tagids=)([0-9+]+)(.*)$/, "$1" + taglist.join(",") + "$3");
		}

		for (var i = 0 ; i < cloudtags.length ; i++) {
			cloudtags[i].href = cloudtags[i].href.replace(/^([^?]+\?.*tagids=)([0-9+]+)(.*)$/, "$1" + tagids + ",$2");
		}
	}
	else {
		for (var i = 0 ; i < tags.length ; i++) {
			tags[i].href = tags[i].href.replace(/^([^?]+\?.*tagids=)(?:[0-9+]+\,)+([0-9]+.*)$/, "$1$2");
		}

		for (var i = 0 ; i < cloudtags.length ; i++) {
			cloudtags[i].href = cloudtags[i].href.replace(/^([^?]+\?.*tagids=)(?:[0-9+]+\,)+([0-9]+.*)$/, "$1$2");
		}
		
	}

	
}



