// JavaScript Document

/*-----------------------------------------------------
  Static variables
------------------------------------------------------*/
var FEED_NAME = 'Test_Feed';
var MAX_POSTS = 4;                                            // MAX posts to load at one time
var TXT_NEW_BLANK = "Do you have an idea?  Enter it here!";   // 'Blank' text for new posts
var TXT_COM_BLANK = "Write your comments here...";            // 'Blank' text for new comments
var TXT_FIL_BLANK = "Enter a word/phrase...";                 // 'Blank' text for filter
var MAX_POST_CHARS = 250;                                     // MAX chars to display initially in post
var MAX_COMM_CHARS = 250;                                     // MAX chars to display initially in comment
var MAX_COMMENTS = 2;                                         // MAX comments to display initially
var POST_BUTTON = "New Post";
var POST_EXPAND_TEXT = "Show Entire Post";                    // Text for link to show entire post
var COMM_EXPAND_TEXT = "Show Entire Comment";                 // Text for link to show entire comment
var FILTER_BUTTON_READY = "Filter";
var FILTER_BUTTON_FILTERING = "Clear Filter";
var NO_REMAINING_TEXT = "No More Posts to Display.";          // Text for alert box when there are no remaining posts
var ERROR_DEL_COMMENT = "An error occurred while attempting " +
						"to delete the comment."              // Text for error when deleting comment
var POLLING_TIME = 5000;                                      // Milliseconds between polling for new posts
var TEXT_POST_WIDTH = "185px";                                // Width (style) for new post textarea
var TEXT_COMM_WIDTH = "170px";                                // Width (style) for new comment textareas

/*-----------------------------------------------------
  Global variables
------------------------------------------------------*/
var g_first_comment_or_post = 0;             // Keep track of ID of first comment or post in list.
var g_first_type = "posts";                  // Either "posts" or "comments" -- based on type of g_first_comment_or_post.
var g_last_comment_or_post = 0;              // Keep track of ID of last comment or post in list.
var g_last_type = "posts";                   // Either "posts" or "comments" -- based on tyep of g_last_comment_or_post.
var g_base_url = "";
var g_is_gadget = false;
var g_base_css = "feedapp/css/feed.css";
var g_print_css = "feedapp/css/print.css";
var g_isadmin = false;
var g_use_jscroll = false;
var	g_parsing = false;
var g_filter_posts = false;
var g_filter_comments = false;
var g_filter_string = "";
var g_typing_post = false;                   // Is new post field in focus?
var g_typing_comment = 0;                    // Post ID associated with comment field in focus (0 if not in focus)
var g_typing_started = false;                // Has typing started in current post or comment field?


// Initialize settings, if function exists
if (typeof(initFeedAppSettings) != 'undefined') {
	initFeedAppSettings();
}

/* -------------------------------------------------------
  Load jquery and css, then run doLoad() function
------------------------------------------------------- */
//var jQueryScriptOutputted = false;
//function initJQueryForFSUFeedApp() {
    
	
	// If jQuery isn't yet available
    /*if (typeof(jQuery) == 'undefined') {
    
        if (! jQueryScriptOutputted) {

			// Initialize settings, if function exists
			if (typeof(initFeedAppSettings) != 'undefined') {
				initFeedAppSettings();
			}

			//only output the script once..
            jQueryScriptOutputted = true;

			loadJS(g_base_url + "feedapp/js/jquery-1.3.2.min.js");
			loadJS(g_base_url + "feedapp/js/jquery.timers-1.1.3.js");
			loadJS(g_base_url + "feedapp/js/jquery.mousewheel.min.js");
			loadJS(g_base_url + "feedapp/js/jScrollPane-1.2.3.min.js");
        }
        setTimeout("initJQueryForFSUFeedApp()", 50);
		
    }*/
	
	// Wait for other scripts
	/*else if ($(document).everyTime == null || $(document).mousewheel == null || typeof($(document).jScrollPane) == 'undefined') {
        setTimeout("initJQueryForFSUFeedApp()", 50);
	}*/
	
	// jQuery is loaded: other things to do on load...
	/*else {*/

		$(document).ready(function() {  
			
			// Include CSS
			loadStyleSheet(g_base_url + "feedapp/css/jScrollPane.css");
			loadStyleSheet(g_base_url + "feedapp/css/jquery-ui-1.7.2.custom.css");
			loadStyleSheet(g_base_css);

			// Initialize Page
			doLoad();
			
			// Start timer for polling
			$(document).everyTime(POLLING_TIME, function(i) {
				if (! g_parsing)
					checkForNewPosts();
			});
        });
    //}
            
//}
//initJQueryForFSUFeedApp();



/* -------------------------------------------------------
  Loads a JavaScript file into the page head.
  This function does NOT require JQuery
------------------------------------------------------- */
function loadJS(src) {
	var headObj = document.getElementsByTagName("head")[0];
	var scriptNode = document.createElement("script");
	scriptNode.language = "javascript";
	scriptNode.type = "text/javascript";
	scriptNode.src = src;
	headObj.appendChild(scriptNode);
}

/* -------------------------------------------------------
  Loads a stylesheet (requires JQuery).
------------------------------------------------------- */
function loadStyleSheet(href) {
	$("head").append("<link>");
	$("head").children(":last").attr({
		rel: "stylesheet",
		type: "text/css",
		href: href
	});
}

/* -------------------------------------------------------
  On document ready
------------------------------------------------------- */
var doLoad = function() {
	// Attach event handlers to fields:
	//   Handles blank text that appears in a lighter color on
	//   textarea fields when they are blank and out of focus.
	// --------------------------------------------------------
	// New post field
	$("#txtPostNew").html(TXT_NEW_BLANK);
	$("#txtPostNew").focus(textFocus);
	$("#txtPostNew").blur(textBlur);
	$("#txtPostNew").keydown(textKeyDown);
	$("#btnPostNew").attr('value', POST_BUTTON);
	
	// Tools area
	var tt = $("div.feed_tools");
	if (tt.length > 0) showTools(tt);

	// Printer-Friendly link
	$("a.print_friendly").click(printView);
	//$("a.print_friendly_all").click(printViewAll);
	$("a.export_excel").click(exportExcel);
	
	// Search area
	var ss = $("div.search");
	if (ss.length > 0) showSearch(ss);
	
	// Tools area classes and event handlers
	$("#togglepanels").addClass("ui-accordion ui-widget ui-helper-reset")
	.find("h3")
		.addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-top ui-corner-bottom")
		.prepend('<span class="ui-icon ui-icon-triangle-1-e"/>')
		.click(function() {
			$(this).toggleClass("ui-accordion-header-active").toggleClass("ui-state-active")
				.toggleClass("ui-state-default").toggleClass("ui-corner-bottom")
			.find("> .ui-icon").toggleClass("ui-icon-triangle-1-e").toggleClass("ui-icon-triangle-1-s")
			.end().next().toggleClass("ui-accordion-content-active").toggle();
			return false;
		})
		.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").hide();

	$("#toggle_1").click();
	$("#toggle_2").click();

	// Widths of text for new posts
	$("#post_new textarea.text").css("width", TEXT_POST_WIDTH);
	
	// Scrolling
	/*
	$("#feed_scroller_up")
		//.click(function(){scroller(-1, false);})
		.mousedown(function() {scrolling(-1);})
		.mouseup(function() {scrolling(0);})
		.mouseout(function() {scrolling(0);});
	$("#feed_scroller_down")
		//.click(function() {scroller(1, false);})
		.mousedown(function() {scrolling(1);})
		.mouseup(function() {scrolling(0);})
		.mouseout(function() {scrolling(0);});
	$("#feed_container").mousewheel(function(event, delta) { return wheel(event, delta); });
	*/

	// Check if the user is an admin
	isAdmin();

	// --------------------------------------------------------
	// Get list of posts via AJAX, then display each post
	g_parsing = true;
	ajaxCall({
		type: "GET",
		url: g_base_url + "feedapp/feed_ajax.cfm",
		data: {
			maxposts: MAX_POSTS,
			action: 'listposts',
			searchstring: g_filter_string,
			searchposts: g_filter_posts,
			searchcomments: g_filter_comments,
			typingstarted: g_typing_started,
			typingpost: g_typing_post,
			typingcomment: g_typing_comment
			//starttype: "posts", // REM this !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
			//startid: 33 // REM this !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		},
		dataType: "xml",
		success: function(xml) {
			parseIncomingPosts(xml, false, true);
			g_parsing = false;
			initScroll();
		}
	});
}

var initScroll = function() {
	if (g_use_jscroll)
		$(".scroll-pane").jScrollPane({showArrows:true});
}

var wheel = function(event, delta) {
	if (delta > 0)
		scroller(-1, false);
	else if (delta < 0)
		scroller(1, false);
	return false;
}
var scrolling = function(direction) {
	// Start timer for scrolling
	if (direction != 0) {
		$("#feed_scroller_up").everyTime(18, function(i) {
			scroller(direction, true);
		});
	} else {
		$("#feed_scroller_up").stopTime();
	}
}
var scroller = function(direction, smooth) {
	var maxScroll = $("#feed_scroller").attr("scrollHeight") -
				    $("#feed_scroller").height();
	var curTop = $("#feed_scroller").attr('scrollTop');
	$("#feed_scroller").attr('scrollTop', curTop + direction * ((smooth) ? 5 : (maxScroll / 25)));
}


/* -------------------------------------------------------
  Handle AJAX calls.  Needs to decide whether to submit
  using jQuery or the Google API.
------------------------------------------------------- */
var ajaxCall = function(obj) {
	if (! g_is_gadget) {
		$.ajax(obj);
	} else {
		var url = obj['url'];
		url += "?" + gadgets.io.encodeValues(obj['data']);
		var fn = obj['success'];
		var params = {};
		params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.DOM;
		makeCachedRequest(
			url,
			function(xml) { fn(xml.data) },
			params,
			1
		);
	}
}

/* -------------------------------------------------------
  Google API AJAX call, non-cached
------------------------------------------------------- */
function makeCachedRequest(url, callback, params, refreshInterval) {
  var ts = new Date().getTime();
  var sep = "?";
  if (refreshInterval && refreshInterval > 0) {
    ts = Math.floor(ts / (refreshInterval * 1000));
  }
  if (url.indexOf("?") > -1) {
    sep = "&";
  }
  url = [ url, sep, "nocache=", ts ].join("");
  gadgets.io.makeRequest(url, callback, params);
}


var checkForNewPosts = function() {

	// Check for posts
	showNewPosts();
	
	// Also check for comments
	checkForNewComments();

	// Display "Show x New Posts" link
	/* 
	ajaxCall({
		type: "GET",
		url: g_base_url + "feedapp/feed_ajax.cfm",
		data: {
			maxposts: MAX_POSTS,
			action: 'poll',
			starttype: g_first_type,
			startid: g_first_comment_or_post
		},
		dataType: "xml",
		success: function(xml) {
			// If new posts are waiting
			var iNew = $(xml).find('newposts').text();
			if (iNew > 0) {
				$('#shownew a').html('Show ' + iNew + ' New Posts');
				$('#shownew').removeClass("hidden");
				initScroll();
			} else {
				if (! $('#shownew').hasClass("hidden")) {
					$('#shownew').addClass("hidden");
					initScroll();
				}
			}
			
		}
	});
	*/
	return false;
}

var checkForNewComments = function() {
	
	g_parsing = true;
	ajaxCall({
		type: "GET",
		url: g_base_url + "feedapp/feed_ajax.cfm",
		data: {
			maxposts: MAX_POSTS,
			action: 'pollcomments',
			starttype: g_first_type,
			startid: g_first_comment_or_post,
			searchstring: g_filter_string,
			searchposts: g_filter_posts,
			searchcomments: g_filter_comments
		},
		dataType: "xml",
		success: function(xml) {
			// If new comments are waiting
			if ($(xml).find('row').size() > 0) {
				parsePolledComments(xml);
				initScroll();
			}
			g_parsing = false;
		}
	});
	return false;
}

var showNewPosts = function() {
	g_parsing = true;
	ajaxCall({
		type: "GET",
		url: g_base_url + "feedapp/feed_ajax.cfm",
		data: {
			maxposts: MAX_POSTS,
			action: 'listposts',
			starttype: g_first_type,
			startid: g_first_comment_or_post,
			newsince: true,
			searchstring: g_filter_string,
			searchposts: g_filter_posts,
			searchcomments: g_filter_comments,
			typingstarted: g_typing_started,
			typingpost: g_typing_post,
			typingcomment: g_typing_comment
		},
		dataType: "xml",
		success: function(xml) {
			showStats(xml);
			if ($(xml).find('row').size() > 0) {
				parseIncomingPosts(xml, true, true);
				initScroll();
			}
			g_parsing = false;
			//checkForNewPosts(); // Check again for new posts
		}
	});
	return false;
}


var getSinglePost = function(postid) {
	g_parsing = true;
	ajaxCall({
		type: "GET",
		url: g_base_url + "feedapp/feed_ajax.cfm",
		data: {
			maxposts: MAX_POSTS,
			action: 'loadpost',
			id: postid
		},
		dataType: "xml",
		success: function(xml) {
			if ($(xml).find('row').size() > 0) {
				parseIncomingPosts(xml, true, true);
				initScroll();
			}
			g_parsing = false;
			//checkForNewPosts(); // Check again for new posts
		}
	});
	return false;
}

var showMorePosts = function() {
	//////////////////////////////////
	// Test only: display auth user	
	//showAuthUser();	
	//////////////////////////////////
	
	g_parsing = true;
	ajaxCall({
		type: "GET",
		url: g_base_url + "feedapp/feed_ajax.cfm",
		data: {
			maxposts: MAX_POSTS,
			action: 'listposts',
			starttype: g_last_type,
			startid: g_last_comment_or_post,
			searchstring: g_filter_string,
			searchposts: g_filter_posts,
			searchcomments: g_filter_comments,
			typingstarted: g_typing_started,
			typingpost: g_typing_post,
			typingcomment: g_typing_comment
		},
		dataType: "xml",
		success: function(xml) {
			if ($(xml).find('row').size() > 0) {
				parseIncomingPosts(xml, false, false);
				initScroll();
			} else {
				alert(NO_REMAINING_TEXT);
			}
			g_parsing = false;
		}
	});
	return false;
}

var showAuthUser = function() {
	ajaxCall({
		type: "GET",
		url: g_base_url + "feedapp/feed_ajax.cfm",
		data: {
			action: 'getauthuser'
		},
		dataType: "xml",
		success: function(xml) {
			if ($(xml).find('user').size() > 0) {
				alert($(xml).find('user').text());
			}
		}
	});
	return false;
}

var isAdmin = function() {
	ajaxCall({
		type: "GET",
		url: g_base_url + "feedapp/feed_ajax.cfm",
		data: {
			action: 'isadmin'
		},
		dataType: "xml",
		success: function(xml) {
			if ($(xml).find('user').size() > 0) {
				g_isadmin = $(xml).find('user').text() == "YES";
			}
		}
	});
	return false;
}

var showStats = function(xml) {
	// User Stats
	$("span#numberloggedin").html( $(xml).find('numberloggedin').text() );
	$("span#numberanonymous").html( $(xml).find('numberanonymous').text() );
	$("span#newposttyping").html( $(xml).find('newposttyping').text() );
	$("span#commentidtyping").html( $(xml).find('commentidtyping').attr('count') );
	
	// Comments being typed
	$('span.typingcomment').html('');
	$(xml).find('commentidtyping').find('commentid').each(function() {
		var commentid = $(this);
		if (!(commentid.text() == g_typing_comment && g_typing_started)) {
			element = $('div#post_container').find('input[name="hdnPostId"][value="' + commentid.text() + '"]');
			span = element.parents('form').find('span.typingcomment');
			span.html('User/s Typing Comment...');
			div = element.parents('div.comments');
			if (div.hasClass('hidden')) {
				div.removeClass('hidden');
			}
		}
	});

}

var parseIncomingPosts = function(xml, insertAtTop, evaluateFirstPost) {

	// Record very first post, to check for updates
	if ($(xml).find('row').size() > 0) {
		if (evaluateFirstPost) {
			firstRow = (insertAtTop) ? $(xml).find('row:last') : $(xml).find('row:first');
			if (firstRow.find('comment').size() > 0) {
				g_first_comment_or_post = firstRow.find('comment:last').find('id').text();
				g_first_type = "comments";
			} else {
				g_first_comment_or_post = firstRow.find('id:first').text();
				g_first_type = "posts";
			}
		}
			
		// Find and record last comment or post, so we know where to start if user requests more
		if ( !insertAtTop) {
			lastRow = $(xml).find('row:last');
			if (lastRow.find('comment').size() > 0) {
				g_last_comment_or_post = lastRow.find('comment:last').find('id').text();
				g_last_type = "comments";
			} else {
				g_last_comment_or_post = lastRow.find('id:first').text();
				g_last_type = "posts";
			}
		}
	}
	
	// Display all info that was pulled in
	$(xml).find('row').each(function() {
		displayPost($(this), insertAtTop);
	});
	
}

var parsePolledComments = function(xml) {

	$(xml).find('row').each(function() {
		var comment = $(this); // The comment
		g_first_comment_or_post = comment.find('id').text(); // Set Flag
		g_first_type = "comments";                           // Set Flag
		
		var form = $("form").find(':hidden[name="hdnPostId"][value="' + comment.find('postid').text() + '"]').parents("form");
		if (form.length > 0) {
			// Display comment and set last comment id flag in form
			var comments = form.parents('div.comments:first');   // Container for comments
			var iPrev = comments.find('div.comment').size();     // # comments already shown for this post
			displayComment(comment, comments, iPrev+1, iPrev, true, true);
			form.find(':hidden[name="hdnLastCommentId"]').attr('value', comment.find('id').text());
			return false; // Break out of "each" function
		} else {
			getSinglePost(comment.find('postid').text());
		}
	});
	
}

var parseIncomingComments = function(xml, form) {
	
	var comments = $(form).parents('div.comments:first'); // Get container
	var commentcount = $(xml).find('row').size();         // Get number new comments being parsed
	var iPrev = comments.find('div.comment').size();      // Determine # comments already shown
	commentcount += iPrev;                                // Add the number of already-shown comments
	
	// Display all info that was pulled in
	var index = iPrev;
	$(xml).find('row').each(function() {
		var comment = $(this);
		g_first_comment_or_post = comment.find('id').text();
		g_first_type = "comments";
		displayComment(comment, comments, commentcount, index, true, false);
		$(form).find(':hidden[name="hdnLastCommentId"]').attr('value', comment.find('id').text());
		index++;
	});

}

var displayPost = function(post, insertAtTop) {
	var createdat = post.find('createdat:first').text();
	var postId = post.find('id:first').text();
	var userName = post.find('username:first').text();
	if (userName == "") userName = 'Anonymous';
	var unreadClass = post.find('isread:first').text() == 1 ? '' : 'unread';
	var commentcount = post.find('comment').size();
	var hide_showmore_class = (commentcount > 0) ? '' : 'hidden';
	
	// Set up basic post info and header for comments
	var postDiv =
	$('<div class="post_item clearfix ' + unreadClass + '"></div>').html(
		$('<div class="usr_icon posticon"><img class="profile_tan_50" src="/images/transp.gif" title="Mark Post Read/Unread" alt="User Icon" width="50" height="50" border="0" onclick="readUnread(this, ' + postId + ', 0);" /></div>')
		).append($(
		'<div class="post ' + unreadClass + '"></div>').html(
			$('<p class="post_text"><span class="name">' + userName + '</span> </p>')
			).append(
			$('<p class="post_footer"></p>').html(
				$('<span class="date"></span>').html(createdat)
			).append(' <span class="text">|</span> '
			).append(
				$('<a class="post_link" href="" onclick="return false;">Comment</a>')
				.click(commentLink)
			).append((g_isadmin) ? ' <span class="text">|</span> ' +
				'<a onclick="return confirmDelete(\'post\', this, ' + postId + ');" class="post_del" href="#">Delete</a>'
				: ''
			)
		)
		).append(
		$('<div class="comments ' + hide_showmore_class + '"></div>').html(
			(commentcount > MAX_COMMENTS)
				? 
					$('<div class="comment clearfix"></div>').html(
						$('<div class="comment_show"></div').html(
							$('<a class="a_all" onclick="return false;" href="">Show All ' + commentcount + ' comments</a>')
							.click(showAllComments)
						)
					)
				: ''
			)
		);
	
	if (insertAtTop) {
		$('<hr class="hr" size="1" />').prependTo('#post_container');
		postDiv.prependTo('#post_container');
	} else {
		postDiv.appendTo('#post_container');
	}
		
	// Add text to post
	shortenText(post.find('textcontent:first').text(), MAX_POST_CHARS, postDiv.find('p.post_text'), POST_EXPAND_TEXT);

	// Loop through comments, adding each
	var commentId = 0;
	post.find('comment').each(function(index){
									   
		comment = $(this);
		commentId = comment.find('id').text();
		displayComment(comment, postDiv.find('div.comments'), commentcount, index, false, false);

	});
	
	// New comment field
	postDiv.find('div.comments').append(
		$('<div class="comment_new"></div>').html(
			$('<form action="" method="post" onsubmit="return doComment(this);"></form>')
			.append(
				$('<span class="typingcomment"></span>')
			).append(
				$('<textarea class="text" type="text" name="txtCommentNew"></textarea>').css("width", TEXT_COMM_WIDTH).html(TXT_COM_BLANK)
				.focus(textFocus).blur(textBlur).keydown(textKeyDown)
			)
			.append(
				$('<input class="button" type="submit" name="btnCommentNew" value="Post Comment" />')
			).append(
				$('<input type="hidden" name="hdnPostId" value="' + postId + '"/>')
			).append(
				$('<input type="hidden" name="hdnLastCommentId" value="' + commentId + '"/>')
			)
		)
	);

	// Divider between posts
	if (! insertAtTop)
		$('<hr class="hr" size="1" />').appendTo('#post_container');

}


var displayComment = function(comment, comments, commentcount, index, bInsert, bFloat) {
	var commentdate = comment.find('createdat').text();
	var userName = comment.find('username').text();
	if (userName == "") userName = 'Anonymous';
	var unreadClass = comment.find('isread:first').text() == 1 ? '' : 'unread';
	commentId = comment.find('id').text();
	var commenthidden = (commentcount > 2 && (index+1) <= commentcount - MAX_COMMENTS) ? 'hidden' : '';

	// Create comment
	var commentDiv = 
	$('<div class="comment clearfix ' + unreadClass + ' ' + commenthidden + '"></div>').html(
		$('<div class="usr_icon commenticon"><img title="Mark Comment Read/Unread" class="profile_tan_35" src="/images/transp.gif" alt="User Icon" width="35" height="35" border="0" onclick="readUnread(this, 0, ' + commentId + ');" /></div>')
	).append(
	$('<div class="comment_text"></div>').html(
		'<p class="comment_text"><span class="name">' + userName + '</span> </p>' +
		'<p class="comment_footer"><span class="date">' + commentdate + '</span>' +
		((g_isadmin) ? (' <span class="text">|</span> ' + '<a onclick="return confirmDelete(\'comment\', this, ' + commentId + ');" href="#">Delete</a>') : '') +
		'</p>'
		)
	);
	
	// Display comment
	if (bInsert) {
		// If inserting after some comments are already shown
		if (commentcount > 1) {
			// If one or more comments are already shown
			comments.find("div.comment:last").after(commentDiv);
		} else {
			// If this is the first comment
			commentDiv.prependTo(comments);
			comments.removeClass('hidden');
		}
	} else {
		// If adding comments on page load (first time), before "new comment" form was created
		commentDiv.appendTo(comments);
	}
	
	// Float post to top
	if (bFloat) {
		var post_item = comments.parents("div.post_item");
		$('<hr class="hr" size="1" />').prependTo('#post_container');
		post_item.prependTo('#post_container');
	}
	
	// Add text to comment
	shortenText(comment.find('textcontent').text(), MAX_COMM_CHARS, commentDiv.find('p.comment_text'), COMM_EXPAND_TEXT);
}


// Shortens text down to iChars length and returns a JQuery object
var shortenText = function(text, iChars, element, expand_text) {
	if (text.length > iChars) {
		$('<span class="textcontent"></span>').html(text.substr(0, iChars)).appendTo(element);
		$('<span class="hider_text"></span>').html('... ')
			.append(
			$('<a href="" onclick="return false;" class="hider_text">' + expand_text + '</a>')
			.click(showEntire)
		).appendTo(element);
		$('<span class="hidden_text"></span>').html(text.substring(iChars, text.length)).appendTo(element);
	} else {
		$('<span class="textcontent"></span>').html(text).appendTo(element);
	}
}

// When post or comment icon is clicked
var readUnread = function(obj, postid, commentid) {
	g_parsing = true;
	ajaxCall({
		type: "GET",
		url: g_base_url + "feedapp/feed_ajax.cfm",
		data: {
			action: 'readunread',
			commentid: commentid,
			postid: postid
		},
		dataType: "xml",
		success: function(xml) {
			if (postid > 0) {
				if ($(xml).find('read').text() == 'true') {
					$(obj).parents('div.post_item').find('div.post').removeClass('unread');
				} else {
					$(obj).parents('div.post_item').find('div.post').addClass('unread');
				}
			} else if (commentid > 0) {
				if ($(xml).find('read').text() == 'true') {
					$(obj).parents('div.comment').removeClass('unread');
				} else {
					$(obj).parents('div.comment').addClass('unread');
				}
			}
			g_parsing = false;
		}
	});
}

// textFocus, textBlur, textKeyDown: New post and new comment boxes on focus/blur/keydown
var textFocus = function() {
	obj = $(this);
	blank = (obj.attr('id') == 'txtPostNew') ? TXT_NEW_BLANK : TXT_COM_BLANK;
	if (obj.val() == blank) {
		obj.val("");
		obj.addClass("focus");
		obj.next().addClass("focus");
	}

	// Typing tracking
	g_typing_started = false;
	if (blank == TXT_NEW_BLANK) {
		g_typing_post = true;
	} else {
		form = $(obj).parents('div.comments:first').find('form');
		g_typing_comment = form.find('input[name="hdnPostId"]').attr('value');
	}

	initScroll();
}
var textBlur = function() {
	obj = $(this);
	blank = (obj.attr('id') == 'txtPostNew') ? TXT_NEW_BLANK : TXT_COM_BLANK;
	if (obj.val() == '') {
		obj.val(blank);
		obj.removeClass("focus");
		obj.next().removeClass("focus");
		obj.parent("div.comments").removeClass("unhidden");
	}

	// Typing tracking
	g_typing_started = false;
	if (blank == TXT_NEW_BLANK) {
		g_typing_post = false;
	} else {
		g_typing_comment = 0;
	}
		
	initScroll();
}
var textKeyDown = function() {
	obj = $(this);
	blank = (obj.attr('id') == 'txtPostNew') ? TXT_NEW_BLANK : TXT_COM_BLANK;
	if (obj.val() != '' && obj.val() != blank) {
		g_typing_started = true;
	}
}

// Link to make a comment
var commentLink = function() {
	post = $(this).parents("div.post_item");
	coms = post.children("div.comments");
	com = coms.find("div.comment_new textarea.text");
	coms.addClass("unhidden");
	com.focus();
	initScroll();
	return false;
}
		
// Show entire post/comment
var showEntire = function() {
	obj = $(this);
	objP = obj.parents("p");
	spn1 = objP.find("span.hider_text");
	spn2 = objP.find("span.hidden_text");
	obj.css("display", "none");
	spn1.css("display", "none");
	spn2.addClass("show_text");
	initScroll();
	return false;
}

// Show all XX comments
var showAllComments = function() {
	post = $(this).parents("div.post_item");
	aryComs = post.find("div.comment");
	i = 0;
	$.each(aryComs, function(index, com) {
		com = $(com);
		if (i == 0) {
			com.addClass("hidden");
			i++;
		} else {
			com.removeClass("hidden");
		}
	});
	initScroll();
	return false;
}

// Printer-Friendly Views
var printViewAll = function() {
	alert('This function is not yet available.');
	return false;
}
var printView = function() {
	newwin = window.open('', FEED_NAME, 'location=no,menubar=no,toolbar=no,scrollbars=yes');
	var dd = newwin.document;
	dd.write('<html><head>');
	dd.write('<link type="text/css" rel="stylesheet" href="' + g_print_css + '" />');
	dd.write('</head><body>');
	dd.write('<a href="#" id="print-link" onclick="window.print(); return false;">[Print This Page]</a>');
	dd.write('<div id="feed_container">');
	dd.write($("#feed_container").html());
	dd.write('</div></body></html>');
	dd.close();
	return false;
}

// Export to excel
var exportExcel = function() {
	if (g_isadmin) {
		var url = g_base_url + "feedapp/feed_ajax.cfm?action=exportall";
		window.open(url, 'export', 'width=200,height=200');
	} else {
		alert("You must have administrative privileges to export data.");
	}
	return false;
}

// Initialize filter for posts and/or comments
var showSearch = function(div) {
	// Build form
	$('<form name="search" class="search"></form>').html(
		$('<input type="text" name="search" class="feed_search" value="' + TXT_FIL_BLANK + '"/>')).append(
		$('<div class="include"></div>').html("Filter").append(
			$('<label><input type="checkbox" name="posts" class="feed_search_check" checked="checked" /> Posts</label>')).append(
			$('<label><input type="checkbox" name="comments" class="feed_search_check" checked="checked" /> Comments</label>'))).append(
		$('<input type="submit" src="/images/transp.gif" name="submit" class="feed_search_submit" value="' + FILTER_BUTTON_READY + '" />')
	).appendTo(div);
	
	// Trap focus/blur events
	$('form.search input.feed_search').focus(function() {
		obj = $(this);
		if (obj.val() == TXT_FIL_BLANK) {
			obj.val("");
			obj.addClass("focus");
		}
	}).blur(function() {
		obj = $(this);
		if (obj.val() == '') {
			obj.val(TXT_FIL_BLANK);
			obj.removeClass("focus");
		}
	});
	
	// Trap filter events
	$('form.search').submit(function() {
			
		if (this.submit.value == FILTER_BUTTON_FILTERING) {
			
			// Unlock filter
			this.submit.value = FILTER_BUTTON_READY;
			this.search.disabled = false;
			this.posts.disabled = false;
			this.comments.disabled = false;
			
			// Clear filter variables
			g_filter_string   = "";
			g_filter_posts    = false;
			g_filter_comments = false;
			
			// Clear posts
			$('div#post_container').html('');

			// Show posts
			g_parsing = true;
			ajaxCall({
				type: "GET",
				url: g_base_url + "feedapp/feed_ajax.cfm",
				data: {
					maxposts: MAX_POSTS,
					action: 'listposts',
					searchstring: g_filter_string,
					searchposts: g_filter_posts,
					searchcomments: g_filter_comments,
					typingstarted: g_typing_started,
					typingpost: g_typing_post,
					typingcomment: g_typing_comment
				},
				dataType: "xml",
				success: function(xml) {
					parseIncomingPosts(xml, false, true);
					g_parsing = false;
					initScroll();
				}
			});		
			
		} else if ($.trim(this.search.value) != ''
						  && $.trim(this.search.value) != TXT_FIL_BLANK
						  && (this.posts.checked || this.comments.checked)) {
			
			// Clear posts
			$('div#post_container').html('');
			
			// Set filter variables
			g_filter_string   = $.trim(this.search.value);
			g_filter_posts    = this.posts.checked;
			g_filter_comments = this.comments.checked;
			
			// Lock filter
			this.search.disabled = true;
			this.posts.disabled = true;
			this.comments.disabled = true;
			this.submit.value = FILTER_BUTTON_FILTERING;
			
			// Show matching posts
			g_parsing = true;
			ajaxCall({
				type: "GET",
				url: g_base_url + "feedapp/feed_ajax.cfm",
				data: {
					maxposts: MAX_POSTS,
					action: 'listposts',
					searchstring: g_filter_string,
					searchposts: g_filter_posts,
					searchcomments: g_filter_comments,
					typingstarted: g_typing_started,
					typingpost: g_typing_post,
					typingcomment: g_typing_comment
				},
				dataType: "xml",
				success: function(xml) {
					parseIncomingPosts(xml, false, true);
					g_parsing = false;
					initScroll();
				}
			});			
		}
		return false;
	});
}

// Initialize filter for posts and/or comments
var showTools = function(div) {
	// Build form
	$('<div id="toolsheader">').html("Feed Tools").appendTo(div);
	$('<div id="toolsbody">').html(
		$('<div id="togglepanels">').html(

			'<h3 id="toggle_1"><a href="#">Filter Feed</a></h3>' +
			'<div>' +
				'<div class="search"></div>' +
			'</div>' +
			'<h3 id="toggle_2"><a href="#">Statistics</a></h3>' +
			'<div>' +
				'<p>Logged in: <span id="numberloggedin">?</span><!-- (view)--></p>' +
				'<p>Anonymous: <span id="numberanonymous">?</span></p>' +
				'<p>Typing (post): <span id="newposttyping">?</span></p>' +
				'<p>Typing (comment): <span id="commentidtyping">?</span></p>' +
			'</div>' +
			'<h3 id="toggle_3"><a href="#">Print</a></h3>' +
			'<div>' +
				'<p><a class="print_friendly" href="">Print current view</a></p>' +
				'<!--<p><a class="print_friendly_all" href="">Print entire feed</a></p>-->' +
			'</div>' +
			'<h3 id="toggle_4"><a href="#">Export</a></h3>' +
			'<div>' +
				'<p><a class="export_excel" href="">Export to Excel</a></p>' +
			'</div>'
			
		)
	).appendTo(div);
}


/*var addPrintLink = {
	init:function(sTargetEl,sLinkText) {
		if (!document.getElementById || !document.createTextNode) {return;} // Check for DOM support
		if (!document.getElementById(sTargetEl)) {return;} // Check that the target element actually exists
		if (!window.print) {return;} // Make sure the browser supports window.print
		var oTarget = document.getElementById(sTargetEl);
		var oLink = document.createElement("a");
		oLink.id = "print-link"; // Give the link an id to allow styling
		oLink.href = "#"; // Make the link focusable for keyboard users
		oLink.appendChild(document.createTextNode(sLinkText));
		oLink.onclick = function() {window.print(); return false;} // Return false prevents the browser from following the link and jumping to the top of the page after printing
		oTarget.appendChild(oLink);
	}
};*/

var confirmDelete = function(type, obj, id) {
	if (confirm("Delete this item?")) {
		
		var postid = 0;
		var commentid = 0;
		var form;
		
		if (type == "comment") {
			form = $(obj).parents('div.comments:first').find('form');
			postid = form.find('input[name="hdnPostId"]').attr('value');
			commentid = form.find('input[name="hdnLastCommentId"]').attr('value');
		}
		
		g_parsing = true;
		ajaxCall({
			type: "GET",
			url: g_base_url + "feedapp/feed_ajax.cfm",
			data: {
				action: 'delete' + type,
				id: id,
				commentid: commentid,
				postid: postid
			},
			dataType: "xml",
			success: function(xml) {
				if (type == "comment") {
					checkDeletedComment(obj, id);
					parseIncomingComments(xml, form);
				} else if (type == "post") {
					checkDeletedPost(obj, id, xml);
				}
				g_parsing = false;
				initScroll();
			}
		});
	}
	return false;
}

var checkDeletedComment = function(obj, id) {
	ajaxCall({
		type: "GET",
		url: g_base_url + "feedapp/feed_ajax.cfm",
		data: {
			action: 'loadcomment',
			id: id
		},
		dataType: "xml",
		success: function(xml) {
			// Item deleted
			if ($(xml).find('row').size() <= 0) {
				$(obj).parents('div.comment:first').remove();
				initScroll();
			}
			// Item was not deleted
			else {
				alert(ERROR_DEL_COMMENT);
			}
		}
	});
}

var checkDeletedPost = function(obj, id, xml) {
	// Item deleted
	if ($(xml).find('row').size() <= 0) {
		$(obj).parents('div.post_item:first').next().remove();
		$(obj).parents('div.post_item:first').remove().remove();
	}
	// Item not deleted
	else {
		$(obj).parents('div.post:first').find('span.textcontent').html(
			$(xml).find('row').find('textcontent:first').text()
		);
	}
}

var doPost = function(form) {
	if (form.txtPostNew.value != "" && form.txtPostNew.value != TXT_NEW_BLANK) {
		g_parsing = true;
		ajaxCall({
			type: "GET",
			url: g_base_url + "feedapp/feed_ajax.cfm",
			data: {
				action: 'addpost',
				maxposts: MAX_POSTS,
				text: form.txtPostNew.value,
				starttype: g_first_type,
				startid: g_first_comment_or_post,
				newsince: true,
				searchstring: g_filter_string,
				searchposts: g_filter_posts,
				searchcomments: g_filter_comments
			},
			dataType: "xml",
			success: function(xml) {
				form.txtPostNew.value = TXT_NEW_BLANK;
				$(form.txtPostNew).removeClass("focus");
				parseIncomingPosts(xml, true, true);
				g_parsing = false;
				initScroll();
			}
		});
	}
	return false;
}

var doComment = function(form) {
	if (form.txtCommentNew.value != "" && form.txtCommentNew.value != TXT_COM_BLANK) {
		g_parsing = true;
		ajaxCall({
			type: "GET",
			url: g_base_url + "feedapp/feed_ajax.cfm",
			data: {
				action: 'addcomment',
				postid: form.hdnPostId.value,
				commentid: form.hdnLastCommentId.value,
				text: form.txtCommentNew.value
			},
			dataType: "xml",
			success: function(xml) {
				form.txtCommentNew.value = TXT_COM_BLANK;
				obj = $(form.txtCommentNew)
				obj.removeClass("focus");
				obj.next().removeClass("focus");
				obj.parent("div.comments").removeClass("unhidden");
				parseIncomingComments(xml, form);
				g_parsing = false;
				initScroll();
			}
		});
	}
	return false;
}

