AutocompleteModule={};

ThemedSelectModule={};

/*
	Description:

	This takes a regular select element and turns it into a YUI menu button, with Nexopia's custom
	button style.


	Usage:
	
		<select minion_name="themed_select">
			<option value="-1">{DisplayName}</option>
			<option value="{Value1}">{Option1}</option>
			<option value="{Value2}">{Option2}</option>
			<option value="{Value3}">{Option3}</option>
				.
				.
				.
			<option value="{ValueN}">{OptionN}</option>
		</select>
	
	for a basic themed select box, where the width of the select box will be based on the width
	of the widest option in the original list. Note that the first <option> tag will be used to
	set a starting label for the button and removed from the list of selectable options.
	
	
	Optional:
	
		style="max-width: {MaximumWidth}"
		
	can be set on the <select> tag for a themed select box that is {MaximumWidth} pixels wide.
	
	
	Functions:
	
		getSelected():
			returns an object with "label" and "value" properties, corresponding to the "innerHTML"
			and "value" of the original <option> tags. So, in the above usage example, if {Option1}
			is selected, getSelected().label would return {Option1} and getSelected().value would
			return {Value1}. If nothing is selected, this function returns null.
*/

if(YAHOO.nexopia == undefined){
	YAHOO.namespace("nexopia");
}

if(YAHOO.nexopia.Select == undefined){
	YAHOO.namespace("nexopia.Select");
}

YAHOO.nexopia.Select.generatedIDSequence = 0;

Overlord.assign({
	minion: "themed_select",
	load: function(element)
	{
		if (YAHOO.nexopia.Select.list == undefined)
		{
			YAHOO.nexopia.Select.list = [];
		}
		
		// In case there's no id on the select element, just generate one.
		if (element.id == "")
		{
			element.id = "themed_select_" + YAHOO.nexopia.Select.generatedIDSequence;

			YAHOO.nexopia.Select.generatedIDSequence = YAHOO.nexopia.Select.generatedIDSequence + 1;
		}
		
		YAHOO.nexopia.Select.list[element.id] = new ThemedSelect(element);
	},
	order: -1
});


function ThemedSelect(element)
{
	// If the select element has a CSS "max-width" style setting, use that. Otherwise, we 
	// set the size to be the original size of the select tag plus a little extra to make 
	// sure all the options will fit in the display.
	var originalWidth = parseInt(element.offsetWidth, 10);
	var maxWidth = parseInt(element.style.maxWidth, 10);
	var newWidth = (originalWidth + 14);
	if (maxWidth != undefined && newWidth > maxWidth)
	{
		newWidth = maxWidth;
	}

	// Need to generate an INPUT component for YUI to base the button part of the menu
	// button off of.
	this.inputElement = document.createElement("input");
	this.inputElement.id = element.id + "_button";
	this.inputElement.name = element.name;
	
	// Use the first element of the select list to get the display name of the button
	// and then remove it from the actual list so that it doesn't display as an option.
	this.nullLabel = element.options[0].innerHTML;
	this.inputElement.value = this.nullLabel;
	element.remove(0);
		
	// Put the generated button into the document for YUI's Menu Button component to use
	element.parentNode.insertBefore(this.inputElement, element);
	
	// Create the menu button to replace both the generated button and the selector	
	this.menuButton = new YAHOO.widget.Button(this.inputElement.id,
		{ 
			type: "menu", 
			menu: element.id,
			lazyloadmenu: false
		});
	this.menuButton.getMenu().cfg.setProperty("iframe", true);
	this.menuButton.getMenu().cfg.setProperty("zindex", "500");
	this.menuButton.addClass("themed_select_button");
	
	var buttonElement = this.menuButton.getElementsByTagName("button")[0];
	buttonElement.style.width = newWidth + "px";
	buttonElement.style.maxHeight = buttonElement.offsetHeight + "px";
	
	var containerElement = YAHOO.util.Dom.getAncestorByClassName(buttonElement, "yui-menu-button");
	containerElement.style.width = newWidth + "px";
	
	// Set up the menu button so that it changes its label to reflect the selected element
	function onMenuClick(eventType, args, that) 
	{  	
		var menuItem = args[1];
	
		if (menuItem) 
		{
			if (menuItem.cfg.getProperty("disabled"))
			{
				that.setSelected(null);
			}
			else
			{
				var newLabel = menuItem.cfg.getProperty("text");
				that.menuButton.set("label", newLabel);
			}
		}
	}
	this.menuButton.getMenu().subscribe("click", onMenuClick, this);
	
	YAHOO.util.Dom.addClass(this.menuButton.getMenu().element, "themed_select_menu");

	// Set the menu popup to be the same width as the button
	this.menuButton.getMenu().cfg.setProperty("width", newWidth + "px");
	// IE needs some help doing this because it likes to make web development as painful as possible
	var menuBody = YAHOO.util.Dom.getElementsByClassName("bd", "div", this.menuButton.getMenu().element)[0];
	// This won't exist if there are no options to select.
	if (menuBody)
	{
		menuBody.style.width = newWidth + "px";
	}
};


ThemedSelect.prototype = 
{
	getSelected: function()
	{
		var item = this.menuButton.getMenu().activeItem;
		if (item == null || item == undefined)
		{
			return null;
		}
		else
		{
			return { label: item.cfg.getProperty("text"), value: item.value };
		}
	},
	
	
	setSelected: function(value)
	{
		if (value == null)
		{
			this.menuButton.getMenu().activeItem = null;
			this.menuButton.set("label", this.nullLabel);
			
			return;
		}
		
		var items = this.menuButton.getMenu().getItems();
		for (var i=0; i < items.length; i++)
		{
			if (items[i].value == value)
			{
				this.menuButton.getMenu().activeItem = items[i];
				this.menuButton.set("label", items[i].cfg.getProperty("text"));
				break;
			}
		}
	},
	
	
	setEnabled: function(value, enabled)
	{
		var items = this.menuButton.getMenu().getItems();
		for (var i=0; i < items.length; i++)
		{
			if (items[i].value == value)
			{
				items[i].cfg.setProperty("disabled", ! enabled);
				break;
			}
		}
	},
	
	
	enable: function(value)
	{
		this.setEnabled(value, true);
	},
	
	
	disable: function(value)
	{
		this.setEnabled(value, false);
	},
	
	
	subscribe: function(eventName, handlerFunction, object)
	{
		this.menuButton.getMenu().subscribe(eventName, handlerFunction, object);
	}
};
ProfileModule={};

if(YAHOO.profile == undefined){
	YAHOO.namespace ("profile");
}

YAHOO.profile.ControlBlock =
{
	init: function()
	{
		this.setupCommentLink();
	},
	
	gotoComments: function(event, element) {
		
		YAHOO.util.Event.preventDefault(event);
		
		var block = document.getElementById("comments_profile_block");
	
		if (block) {
			var xy = YAHOO.util.Dom.getXY(block);
			window.scrollTo(xy[0], xy[1]);
		} else {
			window.location = href;
		}
		
	},
	
	setupCommentLink: function()
	{
		if (document.getElementById('comments_links')) {
			var links = YAHOO.util.Dom.getElementsByClassName("comment_control_block_link", "a", "comments_links");
			YAHOO.util.Event.addListener(links, "click", this.gotoComments);
		}
	},
	
	toggleFriend: function(hrefElement, username)
	{
		var parts = hrefElement.href.split("?");
		var link = parts[0];
		var params = parts[1];
		var dialogQuestion = hrefElement.attributes["dialog_question"].value;
		
		if (confirm(dialogQuestion))
		{
			YAHOO.util.Connect.asyncRequest('POST', link, new ResponseHandler({
				success: function(o) 
				{
					// Add in the time, because IE7 was caching this *hard*.
					YAHOO.util.Connect.asyncRequest('GET', "/users/"+username+"/profile_blocks/Profile/control/0:Body?cache_breaker="+(new Date().getTime()), new ResponseHandler({
						success: function(o) {
						},
						failure: function(o) {
						}
					}), "");
				},
				failure: function(o) 
				{
				},
				scope: this
			}), "ajax=true&" + params);
		}
	},
	
	
	toggleIgnore: function(userID, authKey, hrefElement)
	{
		var action = "ignore";
		var dialogQuestion = "Ignore this user?";
		var newLabelText = "UNIGNORE USER";
		var newAction = "unignore";
		
		var trElement = YAHOO.util.Dom.getAncestorByTagName(hrefElement, "tr");
		var hrefTextElement = YAHOO.util.Dom.getElementsByClassName("ignore_toggle_text_link", "a", trElement)[0];
		
		if (hrefTextElement.innerHTML == newLabelText)
		{
			action = "unignore";
			dialogQuestion = "Unignore this user?";
			newLabelText = "IGNORE USER";
			newAction = "ignore";
		}
		
		var link = "/messages.php?action="+action+"&id="+userID+"&k="+authKey;
		
		if (confirm(dialogQuestion))
		{
			YAHOO.util.Connect.asyncRequest('GET', link,
			{
				success: function(o) 
				{
					hrefTextElement.setAttribute("href", "/messages.php?action="+newAction+"&id="+userID+"&k="+authKey);
					hrefTextElement.innerHTML = newLabelText;
				},
				failure: function(o) 
				{
				
				},
				scope: this
			}, "ajax=true");
		}
	}
};

Overlord.assign({
	minion: "profile:control_block",
	load: function(element) {
		YAHOO.profile.ControlBlock.init();
	},
	order: 2
	
});

// These two Overlord calls are partially a hack for IE6 to make :hover work.  IE6 doesn't support :hover for anything other than <a> tags.
// So instead we add a "hover class" to table row element whenever we mouseover and set the colours that way.
// I also moved in some code to change the custom color icon color on mouseover/out.
Overlord.assign({
	minion: "profile:ie6_hover_hack",
	mouseover: function(event, element) {
		YAHOO.util.Dom.addClass(element, 'hover');		

		YAHOO.util.Dom.getElementsByClassName('color_icon', null, element, function() {
			this.setColor(YAHOO.util.Dom.getStyle(this.parentNode, "color"));
		});
		
	},
	mouseout: function(event, element) {
		YAHOO.util.Dom.removeClass(element, 'hover');		
		
		YAHOO.util.Dom.getElementsByClassName('color_icon', null, element, function() {
			this.resetColor();			
		});
	}	
});
/*
	Note: This borrows heavily from the YUI drag and drop list element example. It was modified to work with
	DIV elements instead and to set some of the default behavior that we want for the profile blocks.
*/

var Dom = YAHOO.util.Dom;
var Event = YAHOO.util.Event;
var DDM = YAHOO.util.DragDropMgr;

if(YAHOO.profile == undefined){
	YAHOO.namespace ("profile");
}

//DDM.stopPropagation = true;

YAHOO.profile.DraggableBlock = function(id, handleID, noDrag, profileDisplayBlock, sGroup, config) {
    YAHOO.profile.DraggableBlock.superclass.constructor.call(this, id, sGroup, config);
	
	this.profileDisplayBlock = profileDisplayBlock;
	
	// Make the DraggableBlock functionality accessible via the element
	var el = Dom.get(id);
	//el.draggableBlock = this;
	
	this.dragListeners = new Array();

	if (handleID != null) 
	{
		this.setHandleElId(handleID);
		Dom.setStyle(handleID, "cursor", "move");
	
		if (noDrag == null) { noDrag = false; } 

		if (!noDrag)
		{
			// Build overlay to show an indication that the object in question can be dragged and dropped.
			var overlay = new YAHOO.widget.Overlay("overlay", { height: 22, width: 22, visible: false });
	
			overlay.setBody("<div style='background-color: white; border-width: 1px; border-style: solid; width: 20px; height: 20px; overflow: hidden'><img src='" +
				Site.staticFilesURL + 
				"/profile/images/icon_movable.gif' width='20px' height='20px'/></div>");
	
			overlay.render(document.body);
	
			function overlayOn(e, obj)
			{
				obj.cfg.setProperty("context", [id, "tl", "tl"]);
				obj.cfg.setProperty("visible", true);
			}
	
			function overlayOff(e, obj)
			{
				obj.cfg.setProperty("visible", false);
			}
	
			YAHOO.util.Event.addListener(handleID, "mouseover", overlayOn, overlay);
			YAHOO.util.Event.addListener(handleID, "mouseout", overlayOff, overlay);
		}
	}
	else
	{
		Dom.setStyle(id, "cursor", "move");
	}
	
    this.logger = this.logger || YAHOO;
    var el = this.getDragEl();

    this.goingUp = false;
    this.lastY = 0;
	
	// Set up an overlay to use to indicate valid drop spots for a profile block that is
	// being dragged.
	this.dropSpotBorder = new YAHOO.widget.Overlay("drop_spot_border", { visible: false });
	this.dropSpotBorder.render(document.body);
	
	Dom.setStyle("drop_spot_border", "border-style", "dotted");
	Dom.setStyle("drop_spot_border", "border-width", "2px");
};


YAHOO.extend(YAHOO.profile.DraggableBlock, YAHOO.util.DDProxy, {

	startDrag: function(x, y) 
	{
		// make the proxy look like the source element
		var dragEl = this.getDragEl();
		var clickEl = this.getEl();

		Dom.setStyle(clickEl, "visibility", "hidden");

		dragEl.innerHTML = clickEl.innerHTML;
		dragEl.className = clickEl.className;
		clickEl.parentNode.appendChild(dragEl);

		Dom.addClass(dragEl, "drag_block");
				
		this.fireDragListeners(clickEl);
		
		YAHOO.profile.DraggableBlockMgr.resizeColumnBottomMarkers(dragEl.offsetHeight);
	},


    endDrag: function(e)
	{
		var srcEl = this.getEl();
		var proxy = this.getDragEl();

		// Show the proxy element and animate it to the src element's location
		Dom.setStyle(proxy, "visibility", "");
		var a = new YAHOO.util.Motion( 
			proxy, 
			{ 
				points: 
				{ 
					to: Dom.getXY(srcEl)
				}
			},
			0.2, 
			YAHOO.util.Easing.easeOut 
		);
		
		var proxyid = proxy.id;
		var thisid = this.id;

		// Hide the proxy and show the source element when finished with the animation
		a.onComplete.subscribe(
			function() 
			{
				Dom.setStyle(proxyid, "visibility", "hidden");
				Dom.setStyle(thisid, "visibility", "");
			});
		a.animate();

		var glassDiv = Dom.getElementsByClassName("glass_div", "div", srcEl)[0];
		if (glassDiv)
		{
			Dom.setStyle(glassDiv, "width", srcEl.offsetWidth + "px");
			Dom.setStyle(glassDiv, "height", srcEl.offsetHeight + "px");
		}

		var glassIframe = Dom.getElementsByClassName("glass_iframe", "iframe", srcEl)[0];
		if (glassIframe)
		{
			Dom.setStyle(glassIframe, "width", srcEl.offsetWidth + "px");
			Dom.setStyle(glassIframe, "height", srcEl.offsetHeight + "px");
		}

		// At the end of the drag, we no longer need a visual cue as to where the
		// block can be dropped, so we hide the drop spot border.
		this.dropSpotBorder.cfg.setProperty("visible", false);
		
		this.fireDragListeners(this.getEl());
		this.saveDrop(srcEl);
		YAHOO.profile.DraggableBlockMgr.resizeColumnBottomMarkers();	
	},


    onDrag: function(e) 
	{
		// Keep track of the direction of the drag for use during onDragOver
		var y = Event.getPageY(e);

		if (y < this.lastY)
		{
			this.goingUp = true;
		}
		else if (y > this.lastY)
		{
			this.goingUp = false;
		}

		this.lastY = y;

		// Size the overlay for the drop spot to be the width and height of the invisible
		// source block (for which, we're dragging the proxy). The overlay will follow the
		// source element so that a dotted border will be shown in each valid drop spot.
		var srcEl = this.getEl();
		this.dropSpotBorder.cfg.setProperty("width", (srcEl.offsetWidth - 4) + "px");
		this.dropSpotBorder.cfg.setProperty("height", (srcEl.offsetHeight - 4) + "px");
		this.dropSpotBorder.cfg.setProperty("context", [srcEl.id,"tl","tl"]);
		this.dropSpotBorder.cfg.setProperty("visible", true);
		
		this.fireDragListeners(this.getDragEl());
	},


	onDragOver: function(e, id) 
	{
		var srcEl = this.getEl();
		var destEl = Dom.get(id);

		// We are only concerned with div items
		if (destEl.nodeName.toLowerCase() == "div")
		{
			var orig_p = srcEl.parentNode;
			var p = destEl.parentNode;

			// Particularly, we are only concerned with "block_container" items
			// Note: This will need to be changed to whatever the actual class
			// of the div blocks is.
			if (YAHOO.util.Dom.hasClass(destEl, "block_container"))
			{
				if (this.profileDisplayBlock.form_factor() == "both" ||
					this.profileDisplayBlock.form_factor() == this.columnFormFactor(destEl))
				{
					if (ProfileDisplayBlock.getBlockById(id).moveable())
					{
						if (this.goingUp)
						{
							p.insertBefore(srcEl, destEl); // insert above
						} 
						else 
						{
							p.insertBefore(srcEl, destEl.nextSibling); // insert below
						}
			
						this.fireDragListeners(destEl);
						this.fireDragListeners(this.getDragEl());
					}
					else if (YAHOO.util.Dom.hasClass(destEl.nextSibling, "column_bottom_marker"))
					{
						p.insertBefore(srcEl, destEl.nextSibling); // insert below
					}
				}
			}
			// Handle the case where there are no draggable blocks in a column, but we want
			// to drag a block from another column into it. For this, we're putting invisible
			// placeholder marker divs at the bottoms of the columns.
			else if (YAHOO.util.Dom.hasClass(destEl, "column_bottom_marker"))
			{
				if (this.profileDisplayBlock.form_factor() == "both" ||
					this.profileDisplayBlock.form_factor() == this.columnFormFactor(destEl))
				{
					p.insertBefore(srcEl, destEl);					
				}
			}

			DDM.refreshCache();
		}
	},
	
	
	saveDrop: function(srcEl)
	{	
		var srcBlockID = this.profileDisplayBlock.blockid;
		var destColumn = this.getColumn(srcEl);
		var destPosition = this.getPosition(srcEl);

		//var formKey1 = document.getElementById("profile_block_form_key").value;
		var formKey2 = document.getElementById("profile_form_key").value;
		
		YAHOO.util.Connect.asyncRequest('POST', "/my/profile/edit/" + srcBlockID + "/position", {
			success: function(o) {
			},
			failure: function(o) {
			},
			scope: this
		}, "ajax=true&column=" + destColumn + "&position=" + destPosition + /*"&form_key[]=" + formKey1 +*/ "&form_key[]=" + formKey2);
	},
	
	
	columnFormFactor: function(blockContainer)
	{
		if (Dom.getAncestorByClassName(blockContainer, "profile_left_column") != null)
		{
			return "narrow";
		}
		else
		{
			return "wide";
		}
	},
	
	
	getColumn: function(blockContainer)
	{
		if (Dom.getAncestorByClassName(blockContainer, "profile_left_column") != null)
		{
			return 0;
		}
		else
		{
			return 1;
		}
	},
	
	
	getPosition: function(blockContainer)
	{
		var position = 0;
		var currentEl = blockContainer.previousSibling;
		
		while(currentEl != null)
		{
			position = position + 1;

			if (YAHOO.util.Dom.hasClass(currentEl, "block_container"))
			{
				currentEl = currentEl.previousSibling;
			}
			else
			{
				currentEl = null;
			}
		}
		
		return position;
	},
	
	
	fireDragListeners: function(ref)
	{
		for (var i = 0; i < this.dragListeners.length; i++)
		{
			this.dragListeners[i][0](ref, this.dragListeners[i][1]);
		}
	},
	
	
	registerDragListener: function(listener, object)
	{
		this.dragListeners.push([listener, object]);
	}
});


YAHOO.profile.DraggableBlockMgr = 
{
	resizeColumnBottomMarkers: function(offset)
	{
		if (!offset) { offset = 10; }
	
		var leftBottomMarker = document.getElementById("column_bottom_marker_0");
		var rightBottomMarker = document.getElementById("column_bottom_marker_1");
	
		var leftRegion = YAHOO.util.Region.getRegion(leftBottomMarker);
		var rightRegion = YAHOO.util.Region.getRegion(rightBottomMarker);
	
		if (leftRegion.top > rightRegion.top)
		{
			YAHOO.util.Dom.setStyle(leftBottomMarker, "height", offset + "px");
			var newHeight = leftRegion.top - rightRegion.top + offset;
			if (newHeight < offset) { newHeight = offset };
			YAHOO.util.Dom.setStyle(rightBottomMarker, "height", newHeight + "px");
		
		}
		else if (rightRegion.top > leftRegion.top)
		{
			YAHOO.util.Dom.setStyle(rightBottomMarker, "height", offset + "px");
			var newHeight = rightRegion.top - leftRegion.top + offset;
			if (newHeight < 10) { newHeight = 10 };
			YAHOO.util.Dom.setStyle(leftBottomMarker, "height", newHeight + "px");
		
		}
	}
};
if(YAHOO.profile == undefined){
	YAHOO.namespace("profile");
}

YAHOO.profile.EditableBlock = function(element, profileDisplayBlock) 
{
	this.profileDisplayBlock = profileDisplayBlock;
	
	if((profileDisplayBlock.editable() && !profileDisplayBlock.in_place_editable()) || profileDisplayBlock.removable())
	{
		this.buttonBar = document.createElement("div");
		this.buttonBar.className = "button_bar";
		element.appendChild(this.buttonBar);
		
		var root_div = document.getElementById(profileDisplayBlock.html_id);
		var header_accessory_list = YAHOO.util.Dom.getElementsByClassName("header_accessory", "div", root_div, function(){});
		
		for(var i=0; i<header_accessory_list.length; i++)
		{
			YAHOO.util.Dom.setStyle(header_accessory_list[i], "display", "none");
		}	
	}
	
	if (profileDisplayBlock.editable() || profileDisplayBlock.in_place_editable())
	{
		if(!profileDisplayBlock.in_place_editable())
		{
			this.editButton = new YAHOO.widget.Button({
				id: "edit_button_" + element.id,
				type: "button",
				label: "edit",
				container: this.buttonBar
			});
		}
		else
		{
			this.editButton = new YAHOO.widget.Button(profileDisplayBlock.custom_edit_button(),
				{
					type: "button",
					name: profileDisplayBlock.custom_edit_button(),
					value: "nuts"
				});
		}

		function editClick(e, editableBlock) {
			var editPath = 	profileDisplayBlock.edit_path();

			YAHOO.profile.Blocks.disableAllButtons();
			var editPanel = new YAHOO.profile.EditDialog("edit_panel", editableBlock.profileDisplayBlock);
			editPanel.beforeOpen = editableBlock.profileDisplayBlock.javascript_init_function();
			editPanel.setBody("<div class='edit_block'><div class='edit_title'>" + 
				"<img src=\"" + Site.staticFilesURL + "/Legacy/images/spinner.gif\"/>" + "</div></div>");
			editPanel.render(document.body);
			editPanel.show();
			editPanel.disableButtons();
			
			var formKey1 = document.getElementById("profile_block_form_key").value;
			var formKey2 = document.getElementById("profile_form_key").value;
			
			var callback = {
				success : function(o) {
					editPanel.setBody(o.responseText);
					editPanel.render();
					
					// YUI isn't always properly setting the zIndex when it is a property on a Panel, so it has
					// to be set here after the render call.
					editPanel.cfg.setProperty("zIndex", 300);
					
					// Fix problems in IE and Firefox when allowing some content to overflow (i.e. location lookups)
					YAHOO.util.Dom.setStyle(editPanel.body, 'overflow', 'visible');
					
					editPanel.enableButtons();
					
					YAHOO.profile.Blocks.enableAllButtons();
				},
				failure : function(o) {
					alert("Error accessing handler for: " + editPath);
					YAHOO.profile.Blocks.enableAllButtons();
				}
			}

			var conn = YAHOO.util.Connect.asyncRequest("POST", editPath, callback, "form_key[]=" + formKey1 + "&form_key[]=" + formKey2);
		}
		
		this.editButton.addListener("click", editClick, this);
	}
	
	if (profileDisplayBlock.removable())
	{
		this.removeButton = new YAHOO.widget.Button({
			id: "remove_button_" + element.id,
			type: "button",
			label: "remove",
			container: this.buttonBar
		});
		
		if(profileDisplayBlock.editable())
		{
			this.removeButton.addClass("yui-button-spacer");
		}
	
		function removeClick(e, editableBlock) {
			if (confirm("Remove block?")) 
			{
				var removePath = profileDisplayBlock.remove_path();
		
				var formKey1 = document.getElementById("profile_block_form_key").value;
				var formKey2 = document.getElementById("profile_form_key").value;
				
				YAHOO.profile.Blocks.disableAllButtons();
				
				var callback = {
					success : function(o) {
						var elementToRemove = document.getElementById(profileDisplayBlock.html_id);
						elementToRemove.parentNode.removeChild(elementToRemove);
						for (var i = 0; i < YAHOO.profile.display_block_list.length; i++)
						{
							if (profileDisplayBlock === YAHOO.profile.display_block_list[i])
							{
								YAHOO.profile.display_block_list.splice(i,1);
								break;
							}
						}
						YAHOO.profile.Blocks.enableAllButtons();
					},
					failure : function(o) {
						alert("Error accessing handler for: " + removePath);
						YAHOO.profile.Blocks.enableAllButtons();
					}
				}

				var conn = YAHOO.util.Connect.asyncRequest("POST", removePath, callback, "form_key[]=" + formKey1 + "&form_key[]=" + formKey2);
			}
		}

		this.removeButton.addListener("click", removeClick, this);
	}
	
	if(this.buttonBar)
	{
		Dom.setStyle(element, "position", element.style.position || "relative");
	
		Dom.setStyle(this.buttonBar, "right", "6px");
		Dom.setStyle(this.buttonBar, "top", "6px");
		Dom.setStyle(this.buttonBar, "position", "absolute");
		Dom.setStyle(this.buttonBar, "z-index", "22");
	
		// Fix a stupid IE6 rendering bug
		if (element.offsetWidth - (this.buttonBar.offsetLeft + this.buttonBar.offsetWidth) < 6)
		{
			Dom.setStyle(this.buttonBar, "right", "12px");
		}

	/*
		// Stupid YUI version that would do all the ifram shim stuff IF IT WORKED!!!
		// This is the path to madness!!! I leave it here only as a warning to all who
		// may venture near. You may uncomment these lines and say, "I see nothing wrong!"
		// But just wait! Drag an object and then find that you can't drag it again until
		// you drag another object over it. Or see the edit and remove buttons suddenly
		// become inaccessible for no reason after a drag and drop, even though the z-index
		// properties suggest that there is nothing wrong. Try positioning without using
		// the "context" property and find that YUI replaces your positions with its own
		// strange calculations. Could it work some day (i.e. after a new version of YUI)? 
		// Is there some fundamental switch that would fix it all that I'm just missing? 
		// Maybe. But make sure to have a psychiatrist on speed dial before attempting
		// any changes.
	
		var glassDiv = new YAHOO.widget.Overlay("glass_div_" + element.id, { 
			context: [element.id, "tl", "tl"],
			width: element.offsetWidth + "px", 
			height: element.offsetHeight + "px",
			zIndex: 21,
			iframe: true }); 
		glassDiv.render(element);
		Dom.setStyle(glassDiv.element, "top", "0px");
		Dom.setStyle(glassDiv.element, "left", "0px");
		Dom.setStyle(glassDiv.element, "position", "absolute");
	*/

		var height = element.offsetHeight;
		var width = element.offsetWidth;

		var glassDiv = document.createElement("div");
		glassDiv.className = "glass_div";

		element.appendChild(glassDiv);

		Dom.setStyle(glassDiv, "height", height + "px");
		Dom.setStyle(glassDiv, "width", width + "px");
		Dom.setStyle(glassDiv, "z-index", "21"); 
		Dom.setStyle(glassDiv, "position", "absolute");
		Dom.setStyle(glassDiv, "top", "0px");
		Dom.setStyle(glassDiv, "left", "0px");
		if (profileDisplayBlock.moveable())
		{
			Dom.setStyle(glassDiv, "cursor", "move");
		}	

		// iframe shim needed to work in IE
		if (YAHOO.env.ua.ie > 5 && YAHOO.env.ua.ie <= 7) 
		{
			var glassIframe = document.createElement("iframe");
			glassIframe.className = "glass_iframe";
		
			element.appendChild(glassIframe);
		
			Dom.setStyle(glassIframe, "height", height + "px");
			Dom.setStyle(glassIframe, "width", width + "px");
			Dom.setStyle(glassIframe, "z-index", "20");
			Dom.setStyle(glassIframe, "position", "absolute");
			Dom.setStyle(glassIframe, "top", "0px");
			Dom.setStyle(glassIframe, "left", "0px");
			Dom.setStyle(glassIframe, "opacity", "0");
		}
	}
};


YAHOO.profile.EditableBlock.prototype = 
{
	setVisible: function(visible)
	{
		var display = "none";
		if (visible)
		{
			display = "block";
		}
		
		Dom.setStyle(this.buttonBar, "display", display);
		
		this.visible = visible;
	},
	
	
	toggleVisibility: function()
	{
		this.setVisible(!this.visible);
	},
	
	
	enableButtons: function()
	{
		if (this.editButton)
		{
			this.editButton.set("disabled", false);
		}
		
		if (this.removeButton)
		{
			this.removeButton.set("disabled", false);
		}
	},
	
		
	disableButtons: function()
	{
		if (this.editButton)
		{
			this.editButton.set("disabled", true);
		}
		
		if (this.removeButton)
		{
			this.removeButton.set("disabled", true);
		}
	}
};
if(YAHOO.profile == undefined){
	YAHOO.namespace("profile");
}

YAHOO.profile.EditDialog = function(el, profileDisplayBlock) {
    YAHOO.profile.EditDialog.superclass.constructor.call(this, el, 
	{
		xy: [(YAHOO.util.Dom.getDocumentWidth() - 580) / 2, YAHOO.util.Dom.getDocumentScrollTop() + 140],
		width:"580px",
		close:false,
		draggable:false,
		zindex:300,
		modal:true,
		visible:false,
		profileDisplayBlock: profileDisplayBlock
	});
};


YAHOO.extend(YAHOO.profile.EditDialog, YAHOO.widget.Panel, {
	init: function(el, config)
	{
		YAHOO.profile.EditDialog.superclass.init.call(this, el, config);
		this.profileDisplayBlock = config["profileDisplayBlock"];
		
		this.dialogButtonBar = document.createElement("div");
		this.dialogButtonBar.className = "button_bar";

		this.innerElement.appendChild(this.dialogButtonBar);

		var dialog = this;
		var refreshPath = this.profileDisplayBlock.refresh_path();
		var savePath = 	this.profileDisplayBlock.save_path();
		
		if(!YAHOO.profile.admin_user)
		{
			this.visibilitySelector = document.createElement("select");
			this.visibilitySelector.name = "block_visibility";
	
			var exclude_list = this.profileDisplayBlock.visibility_exclude();
			for (var i = 0; i < YAHOO.profile.visibility_options.length; i++)
			{
				var add_option = true;
				for (var j=0; j < exclude_list.length; j++)
				{
					if (YAHOO.profile.visibility_options[i][1] == exclude_list[j])
					{
						add_option = false;
						break;
					}
				}
				
				if (add_option)
				{
					var option = document.createElement('option');
					option.text = YAHOO.profile.visibility_options[i][0];
					option.value = YAHOO.profile.visibility_options[i][1];
					try
					{
						this.visibilitySelector.add(option, null); // standards compliant
					}
					catch(ex)
					{
						this.visibilitySelector.add(option); // IE only
					}
				}
			}
	
			for(var i = 0; i < this.visibilitySelector.options.length; i++)
			{
				if (this.visibilitySelector.options[i].value == this.profileDisplayBlock.visibility ||
					this.visibilitySelector.options.length - 1 == i)
				{
					this.visibilitySelector.selectedIndex = i;
					break;				
				}
			}
			
			// If we have one option or less, don't show the visibility selector because it serves no
			// purpose to allow selection of only one item.
			if (this.visibilitySelector.options.length <= 1)
			{
				this.visibilitySelector.style.display = "none";
			}
			
			this.dialogButtonBar.appendChild(this.visibilitySelector);
		}

		
		var formKey1 = document.getElementById("profile_block_form_key").value;
		var formKey2 = document.getElementById("profile_form_key").value;			
		
		function save(onSuccess)
		{
			dialog.disableButtons();			
			
			var visibilityPostArg = "";
			if(!YAHOO.profile.admin_user)
			{
				var visibility = dialog.visibilitySelector.options[dialog.visibilitySelector.selectedIndex].value;
				visibilityPostArg = "&visibility=" + visibility;
				dialog.profileDisplayBlock.visibility = visibility;
			}
			
			var editForm = document.getElementById("block_edit_form");
			YAHOO.util.Connect.setForm(editForm);
			YAHOO.util.Connect.asyncRequest('POST', savePath, {
				success: function(o) {
					onSuccess(o.responseText);
				},
				failure: function(o) {
					dialog.enableButtons();
					
					dialog.destroy();
				},
				scope: this
			}, "ajax=true&form_key[]=" + formKey1 + "&form_key[]=" + formKey2 + "&module_name=" + dialog.profileDisplayBlock.module_name() +
				"&path=" + dialog.profileDisplayBlock.path + visibilityPostArg);
		}
		
		function refresh()
		{			
			dialog.disableButtons();
			
			YAHOO.util.Connect.asyncRequest('POST', refreshPath , new ResponseHandler({
				success: function(o) {
					dialog.enableButtons();
					
					dialog.destroy();
				},
				failure: function(o) {
					dialog.enableButtons();
					
					dialog.destroy();
				},
				scope: this
			}), "ajax=true&form_key[]=" + formKey1 + "&form_key[]=" + formKey2);
		}
		
		if (!this.profileDisplayBlock.explicit_save())
		{
			// Done Button
			this.doneButton = new YAHOO.widget.Button({
				id: "done_button_" + this.id,
				type: "button",
				label: "done",
				container: this.dialogButtonBar
			});
			this.doneButton.addClass("yui-button-spacer");
			
			function doneClick(e)
			{
				function done(response)
				{
					if (!dialog.afterDone && !dialog.profileDisplayBlock.in_place_editable())
					{
						refresh();
					}
					else
					{
						if(dialog.afterDone)
						{
							dialog.afterDone(response);
						}
						
						dialog.enableButtons();
						dialog.destroy();
					}
				}

				var avail_visibility_options = YAHOO.profile.visibility_options.length - dialog.profileDisplayBlock.visibility_exclude().length;
				
				if (dialog.profileDisplayBlock.new_block())
				{
					save(done);
				}
				else if(avail_visibility_options > 2)
				{
					var formKey1 = document.getElementById("profile_block_form_key").value;
					var formKey2 = document.getElementById("profile_form_key").value;
					
					var visibilityPostArg = "";
					if(!YAHOO.profile.admin_user)
					{
						var visibility = dialog.visibilitySelector.options[dialog.visibilitySelector.selectedIndex].value;
						visibilityPostArg = "&visibility=" + visibility;
						dialog.profileDisplayBlock.visibility = visibility;
					}
					
					YAHOO.util.Connect.asyncRequest('POST', savePath, {
						success: function(o) {},
						failure: function(o) {},
						scope: this
					}, "ajax=true&form_key[]=" + formKey1 + "&form_key[]=" + formKey2 + "&module_name=" + dialog.profileDisplayBlock.module_name() +
						"&path=" + dialog.profileDisplayBlock.path + visibilityPostArg);
					
					done();
				}
				else
				{
					done();
				}
			}

			this.doneButton.addListener("click", doneClick);
		}
		else
		{
			// Cancel Button
			this.cancelButton = new YAHOO.widget.Button({
				id: "cancel_button_" + this.id,
				type: "button",
				label: "cancel",
				container: this.dialogButtonBar
			});
			this.cancelButton.addClass("yui-button-spacer");

			function cancelClick(e)
			{
				dialog.destroy();
				if (dialog.afterClose)
				{
					dialog.afterClose();
				}
			}

			this.cancelButton.addListener("click", cancelClick);
			
			// Save Button
			this.saveButton = new YAHOO.widget.Button({
				id: "save_button_" + this.id,
				type: "button",
				label: "save",
				container: this.dialogButtonBar
			});
			this.saveButton.addClass("yui-button-spacer");

			function saveClick(e)
			{
				if (dialog.beforeSave)
				{
					if (!dialog.beforeSave())
					{
						return;
					}
				}
				
				function onSuccess(response)
				{
					if (!dialog.afterSave)
					{
						refresh();
					}
					else
					{
						dialog.afterSave(response);
						
						dialog.enableButtons();

						dialog.destroy();
					}
					
					if (dialog.afterClose)
					{
						dialog.afterClose();
					}
				}
				
				save(onSuccess);				
			}

			this.saveButton.addListener("click", saveClick);
		}

		Dom.setStyle(this.dialogButtonBar, "right", "12px");
		Dom.setStyle(this.dialogButtonBar, "top", "12px");
		Dom.setStyle(this.dialogButtonBar, "position", "absolute");
		Dom.setStyle(this.dialogButtonBar, "z-index", "25"); 

		function changeBodyHandler(type, args, dialog)
		{
			Overlord.summonMinions(dialog.innerElement);
			
			if (dialog.beforeOpen)
			{
				dialog.beforeOpen(dialog);
			}
			
			var inputWrapperDiv = YAHOO.util.Dom.getElementsByClassName("edit_form", "div", dialog.body)[0];
			if(inputWrapperDiv)
			{
				inputWrapperDiv.style.display = 'none';
				
				var bdParent = YAHOO.util.Dom.getAncestorByClassName(inputWrapperDiv, 'bd');
				bdParent.style.overflow = 'auto';
				setTimeout(function() {inputWrapperDiv.style.display = 'block';}, 20);
			}
		}
		this.changeBodyEvent.subscribe(changeBodyHandler, this);
				
		function afterOpenHandler(type, args, dialog)
		{	
			var inputWrapperDiv = YAHOO.util.Dom.getElementsByClassName("edit_form", "div", dialog.body)[0];
			var bdParent = YAHOO.util.Dom.getAncestorByClassName(inputWrapperDiv, 'bd');
			bdParent.style.overflow = 'auto';
			inputWrapperDiv.style.display = 'block';
		}
		this.showEvent.subscribe(afterOpenHandler, this);
		
	},
	
	
	disableButtons: function()
	{
		if (this.doneButton)
		{
			this.doneButton.set("disabled", true);
		}
		
		if (this.saveButton)
		{
			this.saveButton.set("disabled", true);
		}
		
		if (this.cancelButton)
		{
			this.cancelButton.set("disabled", true);
		}
	},
	
	
	enableButtons: function()
	{
		if (this.doneButton)
		{
			this.doneButton.set("disabled", false);
		}
		
		if (this.saveButton)
		{
			this.saveButton.set("disabled", false);
		}
		
		if (this.cancelButton)
		{
			this.cancelButton.set("disabled", false);
		}
	},
	
	/*
	afterSave: function(saveResponse)
	{
		
	},
	*/
	
	/*
	afterDone: function(doneResponse)
	{
		
	},
	*/
	/*
	beforeOpen: function(dialog)
	{
		
	},
	*/
	
	afterCancel: function(cancelResponse)
	{
		
	}
});
// /* 
// 	The purpose of this file is to bypass the scriptmanager loading process for the profile page.
// 	This is known to be very brittle and any changes to dom or javascript structures may force 
// 	changes to this file.
// */
// YAHOO.util.Event.onAvailable("disable_script_manager", function() {
// 	YAHOO.util.Event.onContentReady('profile', function() {
// 		FriendsProfileBlock.ListView.init(document.getElementById("list_view"));
// 		ClassicFilmStrip.init();
// 		FilmStripInstance.init();
// 		var eti = YAHOO.util.Dom.getElementsByClassName('enhanced_text_input', 'textarea', 'comment_write_form');
// 		for (var i=0; i<eti.length;i++) {
// 			new EnhancedTextInput(eti[i]);
// 		}
// 		// initialize_auto_shading(eti[0].parentNode);
// 		YAHOO.profile.ControlBlock.init();
// 		var rpv = document.getElementById("request_profile_view");
// 		if (rpv) {
// 			YAHOO.profile.Profile.init(rpv);
// 		}
// 		var fpb = document.getElementById('friends_pages');
// 		YAHOO.util.Dom.getElementsByClassName('add_friend', 'a', fpb, function(element) {
// 			new YAHOO.widget.Tooltip(document.createElement("div"), {context: element, text: "Add as Friend"});
// 			new FriendsProfileBlock.AddLink(element, "<img class=\"color_icon\" src=\""+Site.coloredImgURL(Nexopia.Utilities.deduceImgColor(element))+
// 				"/friends/images/icon_friend_true.gif\"/>");
// 		});
// 		YAHOO.util.Dom.getElementsByClassName('send_message', 'a', fpb, function(element) {
// 			new YAHOO.widget.Tooltip(document.createElement("div"), {context: element, text: "Send Message"});
// 		});
// 		YAHOO.util.Dom.getElementsByClassName('comment', 'a', fpb, function(element) {
// 			new YAHOO.widget.Tooltip(document.createElement("div"), {context: element, text: "Comment"});
// 		});
// 		var friendsPages = document.getElementById("friends_pages");
// 		var pageCount = YAHOO.util.Dom.get("friends_pages_count").value;
// 		var ajaxPath = YAHOO.util.Dom.get("friends_ajax_path").value;
// 		if (pageCount > 1) {
// 			var paginator = new Paginator(friendsPages, {
// 				orientation: "vertical", 
// 				height: 440, 
// 				pageIndicatorStyle: "none",
// 				ajaxLoadURL: ajaxPath,
// 				numPages: pageCount,
// 				prefetchPages: 3,
// 				pageGrouping: 10,
// 				duration: 0.5
// 			});
// 			//This will start the paginator loading the second page as soon as you hover
// 			//over the paginator the first time.
// 			YAHOO.util.Event.on(friendsPages, 'mouseover', function() {paginator.getPageAt(1);});
// 		} else {
// 			YAHOO.util.Dom.setStyle("friends_arrow_btns", "display", "none");
// 		}
// 		var hoverOn = function(event, element) {
// 			YAHOO.util.Dom.addClass(element, "block_hover");
// 			YAHOO.util.Dom.removeClass(element, "block_regular");			
// 		};
// 		var hoverOff = function(event, element) {
// 			YAHOO.util.Dom.addClass(element, "block_regular");
// 			YAHOO.util.Dom.removeClass(element, "block_hover");
// 		};
// 		YAHOO.util.Dom.getElementsByClassName('block_hover', 'a', fpb, function(element) {
// 			YAHOO.util.Event.addListener(element, "mouseover", hoverOn);
// 			YAHOO.util.Event.addListener(element, "mouseout", hoverOff);
// 		});
// 		FriendsProfileBlock.init(document.getElementById('friends_toolbar'));
// 		//This is currently broken but only affects there being a hover color on the utility block rows
// 		//in IE6 so for now I'm commenting it out and moving on to more critical tasks -Nathan
// 		// var rows = document.getElementById("profile_control_block").getElementsByTagName('tr');
// 		// for (var i = 0; i< rows.length; i++) {
// 		// 	YAHOO.util.Event.on(rows[i], 'mouseover', function(event, row) {
// 		// 		YAHOO.util.Dom.addClass(row, 'hover');		
// 		// 		YAHOO.util.Dom.getElementsByClassName('custom_color_icon', null, row, function() {
// 		// 			this.setColor(YAHOO.util.Dom.getStyle(this.parentNode, "color"));
// 		// 		});
// 		// 	});
// 		// 	YAHOO.util.Event.on(rows[i], 'mouseout', function(event, row) {
// 		// 		YAHOO.util.Dom.removeClass(row, 'hover');		
// 		// 		YAHOO.util.Dom.getElementsByClassName('custom_color_icon', null, row, function() {
// 		// 			this.resetColor();			
// 		// 		});
// 		// 	});
// 		// }
// 		var commentsBlock = document.getElementById("comment_write");
// 		if (commentsBlock) {
// 			CommentsTextArea.init(commentsBlock);
// 		}
// 		// var icons = YAHOO.util.Dom.getElementsByClassName('custom_color_icon', 'img', 'profile');
// 		// init_custom_color_icons(icons);
// 		YAHOO.util.Dom.getElementsByClassName('gallery_profile_block', 'div', 'profile', function(element) {
// 			new Paginator(element, {height:105, width: 492});
// 			YAHOO.util.Event.on(element, 'mouseover', function() {
// 				Nexopia.DelayedImage.loadImages(this);
// 			});
// 		});
// 		YAHOO.util.Dom.getElementsByClassName('description', 'div', 'recent_galleries', function(element) {
// 			new Truncator(element, {height: 40, width: 149});
// 		});
// 		if (document.getElementById("blog_profile_block")) {
// 			YAHOO.profile.BlogBlock.init();
// 		}
// 		YAHOO.util.Dom.getElementsByClassName('user_content_image', 'img', 'profile', Nexopia.DelayedImage.loadImage);
// 	});	
// });

function initialize_enhanced_text_input_for_dialog(dialog)
{
	var textField = document.getElementById("freeform_content");
	var titleField = document.getElementById("freeform_content_title");

	function checkTextEntered()
	{
		if (textField.value == "")
		{
			alert("You need to enter some text before you can save.");

			return false;
		}

		return true;
	}

	dialog.beforeSave = checkTextEntered;
}
if(YAHOO.profile == undefined){
	YAHOO.namespace ("profile");
}

YAHOO.profile.NewUserTaskBlock = {
	close_block: function(e)
	{
		if(e)
		{
			YAHOO.util.Event.preventDefault(e);
		}
		
		var close_form = document.getElementById("user_task_block_close");
		
		if(close_form == null)
		{
			return;
		}
		
		YAHOO.util.Connect.setForm(close_form);
		YAHOO.util.Connect.asyncRequest(close_form.method, close_form.action, new ResponseHandler({
			success: function(o) {
			},
			failure: function(o) {
			},
			scope: this
		}), "");
		
		var header_block = document.getElementById("new_user_header_block");
		
		if(header_block == null)
		{
			return;
		}
		
		header_block.parentNode.removeChild(header_block);
	}
};

Overlord.assign({
	minion: "profile:new_user_task_block_close",
	click: function(event, element){
		YAHOO.profile.NewUserTaskBlock.close_block(event);
	}
});
PROFILE = {};

function ProfileBlockInfo(module_id, path){
	this.module_id = module_id;
	this.path = path;
}

ProfileBlockInfo.prototype = {
	generate_key: function(){
		if(this.key == null || this.key == ""){
			var s;
			s = this.module_id + "-" + this.path;
			this.key = s;
		}
		
		return this.key;
	},
	
	create_display_block: function(){
		var temp;

		temp = new ProfileDisplayBlock();
		temp.init(this.generate_key);
		
		return temp;
	},
	
	visibility_exclude: function(){
		if(this.visibility_exclude_list == null)
		{
			var temp = this.javascript_visibility_exclude.split(",");
			this.visibility_exclude_list = new Array();
			for(var i=0; i<temp.length; i++)
			{
				this.visibility_exclude_list.push(parseInt(temp[i], 10));
			}
		}
		return this.visibility_exclude_list;
	},
	
	default_visibility: function()
	{
		return this.javascript_default_visibility;
	},
	
	can_make_more: function()
	{
		// Count the existing blocks
		var count = 0;
		for (var i=0; i < YAHOO.profile.display_block_list.length; i++)
		{
			var existingBlock = YAHOO.profile.display_block_list[i];
			if (existingBlock.moduleid === this.module_id &&
				existingBlock.path === this.path)
			{
				count++;
			}

		}
		
		return count < this.max_number;
	}
};
function ProfileDisplayBlock()
{
	this.html_id = "";
}
ProfileDisplayBlock.prototype = {
	init: function(key)
	{
		block_info = this.get_block_info(key);
		
		this.path = block_info.path;
		this.moduleid = block_info.module_id;
		this.visibility = block_info.default_visibility();
		this.columnid = block_info.initial_column;
		this.position = block_info.initial_position;
	},

	get_block_info: function(key)
	{
		if(key == null)
		{
			key = this.moduleid + "-" + this.path;
		}
		
		if(this.block_info == null)
		{
			this.block_info = YAHOO.profile.block_info_list[key];
		}
		
		return this.block_info;
	},
	
	new_block: function()
	{
		if(this.blockid == null)
		{
			return true;
		}
		return false;
	},
	
	save_path: function()
	{
		var path;
		if(YAHOO.profile.admin_user)
		{
			path = YAHOO.profile.admin_uri_base + "/profile/edit/" + this.blockid + "/save";
			return path;
		}
		
		if(this.new_block())
		{
			path = "/my/profile/edit/create";
		}
		else if(!this.explicit_save())
		{
			path = "/my/profile/edit/" + this.blockid + "/visibility?module_name=" + this.module_name() + "&path=" + this.path;;
		}
		else
		{
			path = "/my/profile/edit/" + this.blockid + "/save";
		}
		return path;
	},
	
	refresh_path: function()
	{
		var path;
		if(YAHOO.profile.admin_user)
		{
			path = YAHOO.profile.admin_uri_base + "/profile/block/" + this.blockid + "/refresh";
			return path;
		}
		path = "/my/profile/block/" + this.blockid + "/refresh";
		return path;
	},
	
	edit_path: function()
	{
		var path;
		if(YAHOO.profile.admin_user)
		{
			path = YAHOO.profile.admin_uri_base + "/profile/edit/block/" + this.blockid + "/view";
			return path;
		}
		
		if(this.new_block())
		{
			path = "/my/profile/edit/block/new?module_name=" + this.module_name() + "&path=" + this.path;
		}
		else
		{
			path = "/my/profile/edit/block/" + this.blockid + "/view";
		}
		return path;
	},
	
	
	remove_path: function()
	{
		var path;
		if(YAHOO.profile.admin_user)
		{
			path = YAHOO.profile.admin_uri_base + "/profile/edit/block/" + this.blockid + "/remove";
		}
		else
		{
			var path = "/my/profile/edit/block/" + this.blockid + "/remove";
		}
		
		return path;
	},
	
	update: function (block_id)
	{
		this.blockid = block_id;
		this.html_id = "block" + this.columnid + "_" + this.blockid;
	}
};

ProfileDisplayBlock.prototype.moveable = function()
{
	block_info = this.get_block_info();
	
	return block_info.moveable;
};

ProfileDisplayBlock.prototype.removable = function()
{	
	block_info = this.get_block_info();
	
	return block_info.removable;
};

ProfileDisplayBlock.prototype.title = function()
{
	block_info = this.get_block_info();
	
	return block_info.title;
};

ProfileDisplayBlock.prototype.editable = function()
{
	if(this.content_error)
	{
		return false;
	}
	
	block_info = this.get_block_info();
	
	if(this.new_block())
	{
		return block_info.editable;
	}
	else
	{
		return block_info.editable && !block_info.immutable_after_create;
	}
};

ProfileDisplayBlock.prototype.in_place_editable = function()
{
	if(this.content_error)
	{
		return false;
	}
	
	block_info = this.get_block_info();
	
	return block_info.in_place_editable;
};

ProfileDisplayBlock.prototype.custom_edit_button = function()
{
	if(this.content_error)
	{
		return false;
	}
	
	block_info = this.get_block_info();
	
	return block_info.custom_edit_button;
};

ProfileDisplayBlock.prototype.plus_only = function()
{
	block_info = this.get_block_info();
	
	return block_info.plus_only;
};

ProfileDisplayBlock.prototype.multiple = function()
{
	block_info = this.get_block_info();
	
	return block_info.multiple;
};

ProfileDisplayBlock.prototype.max_number = function()
{
	block_info = this.get_block_info();
	
	return block_info.max_number;
};

ProfileDisplayBlock.prototype.form_factor = function()
{
	block_info = this.get_block_info();
	
	return block_info.form_factor;
};

ProfileDisplayBlock.prototype.module_name = function()
{
	block_info = this.get_block_info();
	
	return block_info.module_name;
};

ProfileDisplayBlock.prototype.explicit_save = function()
{
	if(YAHOO.profile.admin_user)
	{
		return true;
	}
		
	block_info = this.get_block_info();
	
	return block_info.explicit_save;
};

ProfileDisplayBlock.prototype.javascript_init_function = function()
{
	block_info = this.get_block_info();
	
	return block_info.javascript_init_function;
};

ProfileDisplayBlock.prototype.visibility_exclude = function()
{
	block_info = this.get_block_info();
	
	return block_info.visibility_exclude();
};

ProfileDisplayBlock.getBlockById = function(id)
{
	for (var i = 0; i < YAHOO.profile.display_block_list.length; i++)
	{
		if (YAHOO.profile.display_block_list[i].html_id == id)
		{
			return YAHOO.profile.display_block_list[i];
		}
	}

	return null;
};
if(YAHOO.profile == undefined){
	YAHOO.namespace ("profile");
}

/*
	This is needed for the profile views count. It get inclued on the profile page when the
	 profile user account has been view rate limited. It's included from view_profile.
*/
YAHOO.profile.Profile =
{
	init: function(request_form)
	{
		if(request_form.tagName.toLowerCase() == "form" && request_form.id == "request_profile_view")
		{
			YAHOO.util.Connect.setForm(request_form);
			YAHOO.util.Connect.asyncRequest(request_form.method, request_form.action, {
				success: function(o) {
				},
				failure: function(o) {
				},
				scope: this
			}, "");
		}
	}
};

Overlord.assign({
	minion: "request_profile_view",
	load: function(element) {
		YAHOO.profile.Profile.init(element);
	}
});
if(YAHOO.profile == undefined){
	YAHOO.namespace ("profile");
}

/*
	Setup drag and drop for profile blocks.
*/
YAHOO.profile.Blocks = {
	init: function() {
		YAHOO.profile.draggableBlocks = [];
		YAHOO.profile.editableBlocks = [];
		
		YAHOO.profile.block_info_list = [];
		YAHOO.profile.display_block_list = [];

		PROFILE.init_block_query_info_list();
		PROFILE.init_display_blocks();
		PROFILE.init_admin_values();

		for (var i = 0; i < YAHOO.profile.display_block_list.length; i++)
		{
			var displayBlock = YAHOO.profile.display_block_list[i];
			var block = document.getElementById(displayBlock.html_id);

			if (displayBlock.moveable())
			{
				YAHOO.profile.draggableBlocks.push(new YAHOO.profile.DraggableBlock(block, null, null, displayBlock));
			}
			
			if (displayBlock.editable() || displayBlock.removable() || (displayBlock.in_place_editable() && displayBlock.custom_edit_button() && displayBlock.custom_edit_button() != ""))
			{
				YAHOO.profile.editableBlocks.push(new YAHOO.profile.EditableBlock(block, displayBlock));
			}
			else
			{
				if(!displayBlock.in_place_editable())
				{
					YAHOO.profile.Blocks.coverWithGlassPane(block);
				}
			}
		}

		// Set up column bottom markers. This ensures that if there are no draggable blocks in a column,
		// a draggable block can still be dragged into the column (only "draggable" blocks fire the needed
		// events indicating that there is a block being dragged over)
		blocks = Dom.getElementsByClassName("column_bottom_marker", "div", null);
		for (var i = 0; i < blocks.length; i++)
		{
			var block = blocks[i];
			
			// The id here doesn't exist, but it keeps the marker block itself from appearing draggable to the user. 
			YAHOO.profile.draggableBlocks[i] = new YAHOO.profile.DraggableBlock(block, "no_drag_column_bottom_handle_" + i, true);
		}
		
		YAHOO.profile.Blocks.editOn();
		
		PROFILE.init_visibility();
		
		if (YAHOO.nexopia.Select.list && YAHOO.nexopia.Select.list["new_content_menu"])
		{
			this.initAddNewContentMenu();
		}
		
		YAHOO.profile.DraggableBlockMgr.resizeColumnBottomMarkers();
    },


	initAddNewContentMenu: function()
	{
		function beforeContentMenuShow()
		{
			for (blockInfoKey in YAHOO.profile.block_info_list)
			{
				var blockInfo = YAHOO.profile.block_info_list[blockInfoKey];
				YAHOO.nexopia.Select.list["new_content_menu"].setEnabled(blockInfoKey, blockInfo.can_make_more());
			}
		}
		YAHOO.nexopia.Select.list["new_content_menu"].subscribe("beforeShow", beforeContentMenuShow);
		
		
		YAHOO.profile.Blocks.createNewContentButton = new YAHOO.widget.Button(
			"create_new_content_button", 
			{ 
				type: "button", 
				name: "create_new_content_button",
				value: "Add New Block"
			});
		function onButtonClick(event, that) 
		{  
			var selected = YAHOO.nexopia.Select.list["new_content_menu"].getSelected();
		
			if (selected) 
			{
				this.createNewBlock(selected.value);
			}
			else
			{
				alert("You must select a block to add.");
			}
		}
		YAHOO.profile.Blocks.createNewContentButton.addListener("click", onButtonClick, null, this);
	},


	editOn: function()
	{
		this.editing = true;
		
		for (var i = 0; i < YAHOO.profile.editableBlocks.length; i++)
		{
			var block = YAHOO.profile.editableBlocks[i];
			block.setVisible(true);
		}
	},
	
	
	editOff: function()
	{
		this.editing = false;
		
		for (var i = 0; i < YAHOO.profile.editableBlocks.length; i++)
		{
			var block = YAHOO.profile.editableBlocks[i];
			block.setVisible(false);
		}
	},
	
	
	toggleEdit: function()
	{
		if (this.editing)
		{
			this.editOff();
		}
		else
		{
			this.editOn();
		}
	},
	
	
	coverWithGlassPane: function(element)
	{
		var height = element.offsetHeight;
		var width = element.offsetWidth;

		Dom.setStyle(element, "position", element.style.position || "relative");

		var glassDiv = document.createElement("div");
		glassDiv.className = "glass_div";
			
		element.appendChild(glassDiv);
	
		YAHOO.util.Dom.setStyle(glassDiv, "height", height + "px");
		YAHOO.util.Dom.setStyle(glassDiv, "width", width + "px");
		YAHOO.util.Dom.setStyle(glassDiv, "z-index", "21");
		YAHOO.util.Dom.setStyle(glassDiv, "position", "absolute");
		YAHOO.util.Dom.setStyle(glassDiv, "top", "0px");
		YAHOO.util.Dom.setStyle(glassDiv, "left", "0px");		
		
		// iframe shim needed to work in IE
		if (YAHOO.env.ua.ie > 5 && YAHOO.env.ua.ie <= 7) 
		{		
			var glassIframe = document.createElement("iframe");
			element.appendChild(glassIframe);
			YAHOO.util.Dom.setStyle(glassIframe, "height", height + "px");
			YAHOO.util.Dom.setStyle(glassIframe, "width", width + "px");
			YAHOO.util.Dom.setStyle(glassIframe, "z-index", "20");
			YAHOO.util.Dom.setStyle(glassIframe, "position", "absolute");
			YAHOO.util.Dom.setStyle(glassIframe, "top", "0px");
			YAHOO.util.Dom.setStyle(glassIframe, "left", "0px");
			YAHOO.util.Dom.setStyle(glassIframe, "opacity", "0");
		}
	},
	
	
	disableAllButtons: function()
	{
		if (YAHOO.profile.Blocks.createNewContentButton)
		{
			YAHOO.profile.Blocks.createNewContentButton.set("disabled", true);
		}
		
		for (var i = 0; i < YAHOO.profile.editableBlocks.length; i++)
		{
			var editableBlock = YAHOO.profile.editableBlocks[i];
			editableBlock.disableButtons();
		}
	},
	
	
	enableAllButtons: function()
	{
		if (YAHOO.profile.Blocks.createNewContentButton)
		{
			YAHOO.profile.Blocks.createNewContentButton.set("disabled", false);
		}
		
		for (var i = 0; i < YAHOO.profile.editableBlocks.length; i++)
		{
			var editableBlock = YAHOO.profile.editableBlocks[i];
			editableBlock.enableButtons();
		}		
	},
	
	
	createNewBlock: function(blockHashID)
	{
		var blockInfo = YAHOO.profile.block_info_list[blockHashID];
		var displayBlock = blockInfo.create_display_block();
		var editPath = displayBlock.edit_path();

		var formKey1 = document.getElementById("profile_block_form_key").value;
		var formKey2 = document.getElementById("profile_form_key").value;
		
		if (!blockInfo.can_make_more())
		{
			alert("You cannot create any more than " + displayBlock.max_number() + " " + displayBlock.title() + " blocks.");
			return;
		}
		
		YAHOO.profile.Blocks.disableAllButtons();
		
		// Only use an EditDialog when it's needed. Otherwise use a blank object. This prevents problems
		//  with the EditDialog for noneditable blocks from capturing save events from other EditDialogs.
		if (displayBlock.editable())
		{
			var editPanel = new YAHOO.profile.EditDialog("edit_panel", displayBlock);
			editPanel.setBody("<div class='edit_block'><div class='edit_title'>" + 
				"<img src=\"" + Site.staticFilesURL + "/Legacy/images/spinner.gif\"/>" + "</div></div>");
			editPanel.render(document.body);
			editPanel.show();
			editPanel.disableButtons();
		}
		else
		{
			var editPanel = new Object();
		}
		
		var callback = {
			success : function(o) {
				editPanel.afterClose = function()
				{
					YAHOO.profile.Blocks.enableAllButtons();
				};
					
				editPanel.afterSave = function (blockId) {
					
					var max_position = 0;
					for(var i=0; i<YAHOO.profile.display_block_list.length; i++)
					{
						var temp = YAHOO.profile.display_block_list[i];
						if(temp.columnid == displayBlock.columnid && temp.position >= max_position)
						{
							max_position = temp.position + 1;
						}
					}
					
					displayBlock.position = max_position;
					blockId = parseInt(blockId, 10);
					displayBlock.update(blockId);
					var refreshPath = displayBlock.refresh_path();
				
					var newBlockDiv = document.createElement("div");
					newBlockDiv.id = displayBlock.html_id;
					YAHOO.util.Dom.addClass(newBlockDiv, "block_container");
					YAHOO.util.Dom.addClass(newBlockDiv, "primary_block");
					var newInternalDiv = document.createElement("div");
					newInternalDiv.id = "data_" + blockId;
					newBlockDiv.appendChild(newInternalDiv);
					
					var defaultColumn = displayBlock.columnid;
					var bottomElement = document.getElementById("column_bottom_marker_" + defaultColumn);
					bottomElement.parentNode.insertBefore(newBlockDiv, bottomElement);

					YAHOO.util.Connect.asyncRequest('POST', refreshPath , new ResponseHandler({
						success: function(o) {

							var block = document.getElementById(displayBlock.html_id);
							
							// This is a hacky way to get rid of a gallery block that shouldn't have been 
							// created in the first place.
							// The real solution is to make the edit block work so that it doesn't have
							// a save button to begin with.
							if ( o.responseText == "<div id=\"profile_error\">The requested block does not exist</div>")
							{
								newBlockDiv.parentNode.removeChild(newBlockDiv);	
							}
							else 
							{
								YAHOO.profile.draggableBlocks.push(new YAHOO.profile.DraggableBlock(block, null, null, displayBlock));
								YAHOO.profile.editableBlocks.push(new YAHOO.profile.EditableBlock(block, displayBlock));
								YAHOO.profile.display_block_list.push(displayBlock);
							
								YAHOO.nexopia.Select.list["new_content_menu"].setSelected(null);
							
								var xy = YAHOO.util.Dom.getXY(block);
								window.scrollTo(xy[0], xy[1]);
							}
							
						},
						failure: function(o) {
							editPanel.afterClose();
						},
						scope: this
					}), "ajax=true&form_key[]=" + formKey1 + "&form_key[]=" + formKey2);
				};
				
				
				if (displayBlock.editable())
				{
					editPanel.beforeOpen = displayBlock.javascript_init_function();
					editPanel.afterDone = editPanel.afterSave;
					
					editPanel.setBody(o.responseText);
					editPanel.render();
					editPanel.enableButtons();
				}
				else
				{
					YAHOO.util.Connect.asyncRequest('POST', displayBlock.save_path(), {
						success: function(o) {
							var response = o.responseText;
							editPanel.afterSave(parseInt(response, 10));
							editPanel.afterClose();
						},
						failure: function(o) {
							editPanel.afterClose();
						},
						scope: this
					}, "ajax=true&form_key[]=" + formKey1 + "&form_key[]=" + formKey2 + "&module_name=" + displayBlock.module_name() +
						"&path=" + displayBlock.path);					
				}
			},
			failure : function(o) {
				alert("Error accessing handler for: " + editPath);
				editPanel.afterClose();
			}
		};

		var conn = YAHOO.util.Connect.asyncRequest("POST", editPath, callback, "form_key[]=" + formKey1 + "&form_key[]=" + formKey2);
	}
};

Overlord.assign({
	minion: "profile_edit",
	load: function(element) {
		YAHOO.profile.Blocks.init();
	}
});
if(YAHOO.profile == undefined){
	YAHOO.namespace ("profile");
}

/*
	Setup aspects of the skin editor
*/
YAHOO.profile.UserSkin = {
	init: function() {
		PROFILE.init_user_skin_model();
		PROFILE.init_user_skin_selectors();
		PROFILE.init_user_skin_display_group_selectors();
		PROFILE.init_user_skin_areas();
		
		YAHOO.profile.UserSkin.init_skin_editor();
		YAHOO.profile.UserSkin.init_fancy_scroll();
		
		YAHOO.util.Event.addListener("load_user_skin", "click", this.change_skin);
		YAHOO.util.Event.addListener("duplicate_submit", "click", this.duplicate_skin);
		YAHOO.util.Event.addListener("remove_submit", "click", this.remove_skin);
		
		for(var i=0; i<YAHOO.profile.UserSkin.skinable_areas.length; i++)
		{
			YAHOO.util.Event.addListener("skin_select_" + YAHOO.profile.UserSkin.skinable_areas[i], "change", this.update_skin_form);
		}
					
		YAHOO.util.Event.addListener("skin_apply_to_all", "click", this.apply_to_all);
		
		//YAHOO.util.Event.addListener("apply_skin_save", "click", this.save_skin_choices);
		YAHOO.util.Event.addListener("skin_edit_done", "click", this.save_skin);
		
		var self = this;
		function handleUserEntry(e, field)
		{
			if (self.validateColorField(field))
			{
				// Make sure the color picker and the swatch match up with the new color.
				// Note that "setColor" is a function of skin_editor.js.
				// TODO: Untangle some of the coupling between this file and skin_editor.js.
				// by restructuring everything into proper objects.
				setColor();
			}
		}
		
		var colorValueFields = YAHOO.util.Dom.getElementsByClassName("color_hex", "input", null);
		for (var i=0; i < colorValueFields.length; i++)
		{
			YAHOO.util.Event.addListener(colorValueFields[i], "keyup", handleUserEntry, colorValueFields[i]);
			YAHOO.util.Event.addListener(colorValueFields[i], "keydown", handleUserEntry, colorValueFields[i]);
		}
		
		self.validate();
		
		function validateBeforeSave(e)
		{
			var msgs = self.validate();
			if (msgs.length != 0)
			{
				alert(msgs.join('\n'));
				
				YAHOO.util.Event.stopEvent(e);
			}
		}
		YAHOO.util.Event.addListener("save_skin_form", "submit", validateBeforeSave);
		YAHOO.nexopia.Select.list["skin_menu"].setSelected(document.getElementById("skin_id").value);
	},
	
	
	change_skin: function(e)
	{
		var selected_skin = YAHOO.nexopia.Select.list["skin_menu"].getSelected();
		var redirect_location = "/my/profile/edit/skin/"+selected_skin.value+"/";
		
		window.location = redirect_location;
	},
	
	duplicate_skin: function(e)
	{
		YAHOO.util.Event.preventDefault(e);
		
		var selected_skin = YAHOO.nexopia.Select.list["skin_menu"].getSelected();
		var action_location = "/my/profile/edit/skin/"+selected_skin.value+"/duplicate";
		var duplicate_form = document.getElementById("duplicate_form");
		
		duplicate_form.action = action_location;
		
		duplicate_form.submit();
	},
	
	remove_skin: function(e)
	{
		YAHOO.util.Event.preventDefault(e);
		
		var selected_skin = YAHOO.nexopia.Select.list["skin_menu"].getSelected();
		var action_location = "/my/profile/edit/skin/"+selected_skin.value+"/remove";
		var remove_form = document.getElementById("remove_form");

		remove_form.action = action_location;
		
		remove_form.submit();
	},
	
	save_skin_choices: function(e)
	{
		var skin_chooser_form = document.getElementById("skin_chooser_form");
		var save_button = document.getElementById("apply_skin_save_bar");
		YAHOO.util.Dom.setStyle(save_button, "display", "none");
		YAHOO.util.Dom.setStyle("apply_skin_spinner", "display", "block");
		
		YAHOO.util.Connect.setForm(skin_chooser_form);
		YAHOO.util.Connect.asyncRequest(skin_chooser_form.method, skin_chooser_form.action, {
			success: function(o) {
				YAHOO.util.Dom.setStyle("apply_skin_spinner", "display", "none");
				YAHOO.util.Dom.setStyle(save_button, "display", "block");
			},
			failure: function(o) {
				alert("failure");
			},
			scope: this
		}, "");
	},
	
	
	validateColorField: function(field)
	{
		var value = field.value;
		
		// Check that the value is either 3 or 6 digits (not counting the # sign), that it begins with a # sign, 
		// and that it only contains valid hex digits
		if ((value.length-1 != 6 && value.length-1 != 3) || value.substring(0,1) != "#" || value.substring(1).match(/[^0-9a-fA-F]/))
		{			
			YAHOO.util.Dom.addClass(field, "skin_data_error");

			return false;
		}
		else
		{
			YAHOO.util.Dom.removeClass(field, "skin_data_error");
			
			return true;
		}
	},
	
	
	validate: function()
	{
		var colorValueFieldError = false;
		var colorValueFields = YAHOO.util.Dom.getElementsByClassName("color_hex", "input", null);
		for (var i = 0; i < colorValueFields.length; i++)
		{
			var field = colorValueFields[i];
			colorValueFieldError = !this.validateColorField(field) || colorValueFieldError;
		}
		
		var errors = [];
		
		if (colorValueFieldError)
		{
			errors.push("One or more of the color values you entered is invalid.");
		}
		
		var nameEntry = YAHOO.util.Dom.getElementsByClassName("input_title", "input", null)[0];
		if (nameEntry.value == "")
		{
			errors.push("The skin name cannot be empty.");
		}
		
		return errors;
	},
	
	
	apply_to_all: function(e)
	{
		
		var apply_to_all = YAHOO.util.Event.getTarget(e);
		var skin_selector = document.getElementById("skin_select_profile");
		
		for(var i=0; i<YAHOO.profile.UserSkin.skinable_areas.length; i++)
		{
			if(YAHOO.profile.UserSkin.skinable_areas[i] == "profile")
			{
				continue;
			}
			
			var temp_selector = document.getElementById("skin_select_"+YAHOO.profile.UserSkin.skinable_areas[i]);
			var temp_hidden = document.getElementById(YAHOO.profile.UserSkin.skinable_areas[i]+"skin");
				
			if(apply_to_all.checked)
			{	
				temp_hidden.value = skin_selector.options[skin_selector.selectedIndex].value;
				temp_selector.selectedIndex = skin_selector.selectedIndex;
				temp_selector.disabled = true;
			}
			else
			{
				temp_selector.disabled = false;
			}
		}
		
		YAHOO.profile.UserSkin.update_skin_form(null);
	},
	
	update_skin_form: function(e)
	{
		var skin_selector;
		if(e)
		{
			skin_selector = YAHOO.util.Event.getTarget(e);
		}
		
		if(!skin_selector)
		{
			skin_selector = document.getElementById("skin_select_profile");
		}

		var name_parts = skin_selector.attributes['id'].value.split("_");
		var area_target = name_parts[2];
	
		var target_input = document.getElementById(area_target + "skin");
		target_input.value = skin_selector.options[skin_selector.selectedIndex].value;
		
		var apply_to_all = document.getElementById("skin_apply_to_all");
		if(area_target == "profile" && apply_to_all.checked)
		{
			for(var i=0; i<YAHOO.profile.UserSkin.skinable_areas.length; i++)
			{
				if(YAHOO.profile.UserSkin.skinable_areas[i] == "profile")
				{
					continue;
				}
				var temp_selector = document.getElementById("skin_select_"+YAHOO.profile.UserSkin.skinable_areas[i]);
				var temp_hidden = document.getElementById(YAHOO.profile.UserSkin.skinable_areas[i] + "skin");
				
				temp_hidden.value = skin_selector.options[skin_selector.selectedIndex].value;
				temp_selector.disabled = false;
				temp_selector.selectedIndex = skin_selector.selectedIndex;
				temp_selector.disabled = true;
			}
		}
		
		YAHOO.profile.UserSkin.save_skin_choices();
	},
	
	save_skin: function(e)
	{
		var skin_form = document.getElementById("save_skin_form");
		skin_form.submit();
	}
};
Overlord.assign({
	minion: "skin_edit_wrapper",
	init: 'load',
	load: function(element) {
		YAHOO.profile.UserSkin.init();
	}
});
// require setup_skin_edit.js

/**
 * Skin Editor JS
 * 
 * Sean Healy
**/

var imagesPath = Site.staticFilesURL + "/profile/skin_edit/images/";

var oColorPicker = null;

var current = {};
//  	current.swatch_group;
//  	current.hex_box;
//  	current.swatch;
//  	current.selector;
//		current.property;

Overlord.assign({
	minion: "skin_edit_done",
	click: function(event, element) {
		YAHOO.util.Event.preventDefault(event);
		document.getElementById('redirect_url').value = "/profile";
		document.getElementById('save_skin_form').submit();
	}
});

Overlord.assign({
	minion: "yui-picker-panel",
	init: 'load',
	load: function(element) {
		oColorPicker = new YAHOO.widget.ColorPicker("yui-picker-panel", {
			showcontrols: false, 
			animate: true,
			images: {
				PICKER_THUMB: imagesPath + "picker_thumb_invis.png",
				HUE_THUMB: imagesPath + "hue_thumb_invis.png" } 
			});
		//YAHOO.profile.UserSkin.init();
	}
});

function switchColorListener(new_swatch_group)
{
	var skin_sel;
	
	if(current != null && current.revert_to != null)
	{
		var temp = {};
		temp.swatch_group = document.getElementById(current.revert_to);
		temp.hex_box = YAHOO.util.Dom.getElementsByClassName("color_hex", "input", temp.swatch_group)[0];
		temp.swatch = YAHOO.util.Dom.getElementsByClassName("color_swatch", "div", temp.swatch_group)[0];
		
		skin_sel = YAHOO.profile.UserSkin.skin_selectors[current.revert_to];
		
		temp.selector = skin_sel.selector;
		temp.property = skin_sel.property;
		temp.apply_on_focus = skin_sel.apply_on_focus;
		temp.revert_to = skin_sel.revert_to;
		temp.exclude_selectors = skin_sel.exclude_selectors;
		temp.conditional_selectors = skin_sel.conditional_selectors;
		
		current = temp;
		
		setColor(false);
	}
	
	var new_one = {};
	new_one.swatch_group = new_swatch_group;
	new_one.hex_box = YAHOO.util.Dom.getElementsByClassName("color_hex", "input", new_one.swatch_group)[0];
	new_one.swatch = YAHOO.util.Dom.getElementsByClassName("color_swatch", "div", new_one.swatch_group)[0];
	
	skin_sel = YAHOO.profile.UserSkin.skin_selectors[new_one.swatch_group.id];
	
	new_one.selector = skin_sel.selector;
	new_one.property = skin_sel.property;
	new_one.apply_on_focus = skin_sel.apply_on_focus;
	new_one.revert_to = skin_sel.revert_to;
	new_one.exclude_selectors = skin_sel.exclude_selectors;
	new_one.conditional_selectors = skin_sel.conditional_selectors;
	
	switchSwatchVisuals(current, new_one);
	
	current = new_one;
	
	if(current.apply_on_focus)
	{
		setColor();
	}
	
	oColorPicker.on("rgbChange", function (p_oEvent) {
		current.hex_box.value = "#" + this.get("hex");
		setColor(false);
		YAHOO.profile.UserSkin.validateColorField(current.hex_box);
	});
}

function showPreviewFor(selector)
{
	var temp_obj = {};
	temp_obj.selector = selector;
	element = getElements(temp_obj);
	
	if(YAHOO.lang.isObject(element[0]))
		element = element[0];
	
	position = YAHOO.util.Dom.getXY(element);
	
	if(!YAHOO.lang.isArray(position) && position.length != 2)
		position = [0,0];
	
	position[0] = position[0] - 25;
	position[1] = position[1] - 25;
	
	scrollPreviewTo(position);
}

function jumpPreviewTo(position)
{
	YAHOO.util.Dom.get('preview').contentWindow.scrollTo(position[0], position[1]);
}
function scrollPreviewTo(position)
{
	var scrollThing = YAHOO.util.Dom.get('preview').contentWindow.document.body;
	var anim = new SmoothScroll(scrollThing, { scroll: { to: position } }, 0.25);
	anim.animate();
}
function previewScrollPosition()
{
	return [YAHOO.util.Dom.get('preview').contentWindow.YAHOO.util.Dom.getDocumentScrollLeft(),
					YAHOO.util.Dom.get('preview').contentWindow.YAHOO.util.Dom.getDocumentScrollTop()];
}

function parseColor(color)
{
	var rgb = /^rgb\((\d*)\D*(\d*)\D*(\d*)\D*$/;
	var hhh = /^#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])$/;
	var hhhhhh = /^#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})$/;
	
	if(match = color.match(rgb))
	{
		match.shift();
		
		for(j = 0; j < match.length; j++)
			match[j] = parseInt(match[j]);
	}
	else
	{
		if(match = color.match(hhh))
		{
			match.shift();
			for(i = 0; i < match.length; i++)
				match[i] = match[i].concat(match[i]);
		}
		else if(match = color.match(hhhhhh))
			match.shift();
		
		for(i = 0; i < match.length; i++)
			match[i] = parseInt(match[i],16);
	}
	
	return match;
}

function switchSwatchVisuals(old_one, new_one)
{
	var new_color = YAHOO.util.Dom.getStyle(new_one.swatch, "background-color");
	oColorPicker.setValue(parseColor(new_color),true);
	
	hex_sel = document.getElementById("hex_selected");
	hex_unsel = document.getElementById("hex_unselected");
	
	YAHOO.util.Dom.setStyle(old_one.hex_box, "background-color", YAHOO.util.Dom.getStyle(hex_unsel, "background-color"));
	YAHOO.util.Dom.setStyle(old_one.hex_box, "color", YAHOO.util.Dom.getStyle(hex_unsel, "color"));
	
	YAHOO.util.Dom.setStyle(new_one.hex_box, "background-color", YAHOO.util.Dom.getStyle(hex_sel, "background-color"));
	YAHOO.util.Dom.setStyle(new_one.hex_box, "color", YAHOO.util.Dom.getStyle(hex_sel, "color"));
}

function getElements(selector_obj)
{
	var all_elements = [];
	
	// 
	if(selector_obj.conditional_selectors && selector_obj.conditional_selectors.length > 0)
	{
		var temp;
		var cond_result;
		var linked_elements;
		for(var k = 0; k < selector_obj.conditional_selectors.length; k++)
		{
			temp = selector_obj.conditional_selectors[k];
			cond_result = eval(temp[1])();
			if(cond_result)
			{
				linked_elements = getElements(YAHOO.profile.UserSkin.skin_selectors[temp[0]]);
				all_elements = all_elements.concat(linked_elements);
			}	
		}
	}
	
	var temp_list;
	for(var i = 0; i < selector_obj.selector.length; i++)
	{
		temp_list = YAHOO.util.Dom.get('preview').contentWindow.YAHOO.util.Selector.query(selector_obj.selector[i])
		all_elements = all_elements.concat(temp_list);
	}
	var excluded_list = [];
	var filtered_list;
	var temp_sel_obj;
	var i, j;
	
	if(selector_obj.exclude_selectors != null)
	{
		
		for(i = 0; i < selector_obj.exclude_selectors.length; i++)
		{
			temp_sel_obj = YAHOO.profile.UserSkin.skin_selectors[selector_obj.exclude_selectors[i]];
			var temp = getElements(temp_sel_obj);
			for(j = 0; j < temp.length; j++)
			{
				excluded_list.push(temp[j]);
			}
		}
		
		filtered_list = [];
		var include_element = true;
		for(i = 0; i < all_elements.length; i++)
		{
			include_element = true;
			for(j = 0; j < excluded_list.length; j++)
			{
				if(all_elements[i] == excluded_list[j])
				{
					include_element = false;
					break;
				}
			}
			if(include_element)
			{
				filtered_list.push(all_elements[i]);
			}
		}
	}
	else
	{
		filtered_list = all_elements;
	}
	
	return filtered_list;
}

function setColor(updateColorPicker)
{
	// set default value
	if(updateColorPicker == null)
		updateColorPicker = true;
	
	YAHOO.util.Dom.setStyle(current.swatch, "background-color", current.hex_box.value);
	
	result = getElements(current);
	if(result == null)
		return;
	
	if(YAHOO.lang.isArray(result))
		for(i=0; i < result.length; i++)
		{
			if(YAHOO.util.Dom.hasClass(result[i], "custom_color_icon") || YAHOO.util.Dom.hasClass(result[i], "custom_color_icon_alpha")) {
				if (result[i].src) {
					// Every URL follows the pattern of /module/images/image_name.gif - this will match
					// the two topmost directories, followed by a filename of type GIF. Should be okay
					// for everything we need.
					var existingURLRegex = new RegExp(/([^\/]+\/[^\/]+\/[^\/]+\.gif)/);
					var existingURLResult = existingURLRegex.exec(result[i].src);
					if (existingURLResult == null) {
						YAHOO.log("No match", 'time', 'Overlord');
					} else {
						result[i].src = Site.coloredImgURL(current.hex_box.value) + "/" + existingURLResult[0];
					}
					YAHOO.log((result[i].src), 'time', 'Overlord');
				}
			} else {
				YAHOO.util.Dom.setStyle(result[i], current.property, current.hex_box.value);
			}
		}
	else
		YAHOO.util.Dom.get('preview').contentWindow.YAHOO.util.Dom.setStyle(result, current.property, current.hex_box.value);
	
	if(updateColorPicker)
	{
		var new_color = YAHOO.util.Dom.getStyle(current.swatch, "background-color");
		oColorPicker.setValue(parseColor(new_color),true);
	}
}

section_gutter_enabled = function()
{
	gutter_checkbox_list = YAHOO.util.Dom.getElementsByClassName("skin_edit_checkbox", "input", "section_gutter_color", null);
	if(gutter_checkbox_list.length == 0)
	{
		return false;
	}
	
	gutter_checkbox = gutter_checkbox_list[0];
	if(gutter_checkbox.checked)
	{
		return true;
	}
	return false;
}

section_gutter_disabled = function()
{
	return !this.section_gutter_enabled();
}

is_checkbox = function(el)
{
	if(el.tagName.downcase() == "input" && el.attributes["type"].downcase() == "checkbox")
	{
		return true;
	}
	return false;
}

YAHOO.profile.UserSkin.init_skin_editor = function()
{
	var attributes = {
		points: { to: [YAHOO.util.Dom.getRegion("right").left + 6, YAHOO.util.Dom.getRegion("preview_wrapper").top] }
	};
	var anim = new YAHOO.util.Motion('preview_wrapper', attributes, 0);
	anim.animate();
	
	var skin_handles = YAHOO.util.Dom.getChildrenBy(YAHOO.util.Dom.get('skin_panes'), function(el){return YAHOO.util.Dom.hasClass(el, 'accordion_handle')});
	var skin_bodies = YAHOO.util.Dom.getChildrenBy(YAHOO.util.Dom.get('skin_panes'), function(el){return YAHOO.util.Dom.hasClass(el, 'accordion_body')});
	
	for(i = 0; i < skin_handles.length; i++)
	{
		// This is confusing but seems to be necessary with YUI either that or I missed something
		YAHOO.util.Event.on(skin_handles[i], 'click', function(e, args)
		{
			args[0](args[1]);
		}, [showPreviewFor, YAHOO.profile.UserSkin.group_selectors[skin_handles[i].id]]); // A Selector rule
	}
	showPreviewFor(YAHOO.profile.UserSkin.group_selectors[skin_handles[0].id]); // A Selector rule
	
	for(i = 0; i < skin_bodies.length; i++)
	{
		var swatch_groups = YAHOO.util.Dom.getChildren(skin_bodies[i]);
		var skin_sel_obj;
		for(j = 0; j < swatch_groups.length; j++)
		{
			skin_sel_obj = YAHOO.profile.UserSkin.skin_selectors[swatch_groups[j].id];
			if(skin_sel_obj.type && skin_sel_obj.type == "checkbox")
			{
				checkbox_list = YAHOO.util.Dom.getElementsByClassName("skin_edit_checkbox", "input", swatch_groups[j].id, null);
				if(checkbox_list.length == 0)
				{
					continue;
				}

				checkbox = checkbox_list[0];
				
				YAHOO.util.Event.on(checkbox, 'click', function(e)
				{
					YAHOO.profile.UserSkin.handle_checkbox_click(e);
				})
			}
			else
			{
				// This is confusing but seems to be necessary with YUI either that or I missed something
				YAHOO.util.Event.on(swatch_groups[j], 'click', function(e, args)
				{
					args[0](args[1]);
				}, [switchColorListener, swatch_groups[j]]);
			}
		}
	}
	
	var skin_name = document.getElementById('skin_name');

	YAHOO.util.Event.on(skin_name, 'focus', function(event, element)
	{
		YAHOO.util.Dom.addClass(element, "focus");
	}, skin_name);
	
	YAHOO.util.Event.on(skin_name, 'blur', function(event, element)
	{
		YAHOO.util.Dom.removeClass(element, "focus");
	}, skin_name);
	
}

YAHOO.profile.UserSkin.handle_checkbox_click = function(e)
{
	var target = YAHOO.util.Event.getTarget(e);
	
	var skin_sel_obj = YAHOO.profile.UserSkin.skin_selectors[target.name];
	var target_swatch, target_skin_sel, target_color;
	var results;
	
	if(!target.checked)
	{
		target_skin_sel = skin_sel_obj.onchange.disabled;
	}
	else
	{
		target_skin_sel = skin_sel_obj.onchange.enabled;
	}
	
	target_swatch = YAHOO.util.Dom.getElementsByClassName("color_hex", "input", target_skin_sel, null);
	if(target_swatch.length < 1)
	{
		return;
	}

	target_color = target_swatch[0].value;
	results = getElements(skin_sel_obj);
	
	for(var i=0; i< results.length; i++)
	{
		YAHOO.util.Dom.setStyle(results[i], skin_sel_obj.property, target_color)
	}
	
};

var zoomImg = new Image();
var zoomImgSize = 0;
var show = false;
var animating = false;
function drawPreviewZoom()
{
	var canvas = YAHOO.util.Dom.get("preview_zoom_canvas");
	if (!canvas || !canvas.getContext) return;
	var ctx = canvas.getContext('2d');
	
	zoomImg.src = imagesPath + '/zoom.png';
}

function animateZoomIcon()
{
	var canvas = YAHOO.util.Dom.get("preview_zoom_canvas");
	if (!canvas.getContext) return;
	var ctx = canvas.getContext('2d');
	
	animating = true;
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  try{
	ctx.drawImage(zoomImg, (canvas.width - zoomImgSize), (canvas.height - zoomImgSize), zoomImgSize, zoomImgSize);
	} catch (e) {}
	
	if(show)
		zoomImgSize = zoomImgSize + 2;
	else
		zoomImgSize = zoomImgSize - 2;
	
	if(zoomImgSize < 40 && zoomImgSize >= 0)
		setTimeout("animateZoomIcon()", 5);
	else
		animating = false;
}

function hideZoomIcon()
{
	show = false;
	if(!animating)
		animateZoomIcon();
}

function showZoomIcon()
{
	show = true;
	if(!animating)
		animateZoomIcon();
}

function drawRoundedRectangle(ctx,x,y,width,height,radius)
{
	ctx.beginPath();
	ctx.moveTo(x,y+radius);
	ctx.lineTo(x,y+height-radius);
	ctx.quadraticCurveTo(x,y+height,x+radius,y+height);
	ctx.lineTo(x+width-radius,y+height);
	ctx.quadraticCurveTo(x+width,y+height,x+width,y+height-radius);
	ctx.lineTo(x+width,y+radius);
	ctx.quadraticCurveTo(x+width,y,x+width-radius,y);
	ctx.lineTo(x+radius,y);
	ctx.quadraticCurveTo(x,y,x,y+radius);
	ctx.closePath();
	ctx.fill();
	ctx.stroke();
}

// require setup_skin_edit.js

SmoothScroll = function(el, attributes, duration,  method) {
	if (el) { // dont break existing subclasses not using YAHOO.extend
		SmoothScroll.superclass.constructor.call(this, el, attributes, duration, method);
	}
};

YAHOO.extend(SmoothScroll, YAHOO.util.Scroll, {
	getAttribute: function(attr) {
		var val = null;
		
		if (attr == 'scroll')
		{
			val = previewScrollPosition();
		}
		else
		{
			val = superclass.getAttribute.call(this, attr);
		}
		
		return val;
	},
	
	setAttribute: function(attr, val, unit) {
		if (attr == 'scroll')
		{
			jumpPreviewTo(val);
		}
		else
		{
			superclass.setAttribute.call(this, attr, val, unit);
		}
	}
});

/* ========== */

DDScroll = function(panelElId, handleElId, sGroup, config) {
	DDScroll.superclass.constructor.call(this, panelElId, sGroup, config);
	if (handleElId) {
		this.setHandleElId(handleElId);
	}
};

YAHOO.extend(DDScroll, YAHOO.util.DragDrop, {
	onMouseDown: function(e)
	{
		this.startPos = previewScrollPosition();
		this.mouseStart = YAHOO.util.Event.getXY(e);
	},
	
	onDrag: function(e) {
		var newPos = YAHOO.util.Event.getXY(e);
		
		var offsetX = this.mouseStart[0] - newPos[0];
		var offsetY = this.mouseStart[1] - newPos[1];
		
		jumpPreviewTo([this.startPos[0] + offsetX, this.startPos[1] + offsetY]);
	}
});

YAHOO.profile.UserSkin.init_fancy_scroll = function()
{
    var dd, dd2, dd3;
    dd = new DDScroll("preview_handle", "preview_handle");
};

YAHOO.util.Event.on(window, 'load', function()
{
	YAHOO.util.Dom.setStyle("preview_handle", "opacity", "0");
	drawPreviewZoom();
});

YAHOO.util.Event.on(['preview_handle', 'preview_zoom'], 'mouseover', function()
{
	showZoomIcon();
});
YAHOO.util.Event.on(['preview_handle', 'preview_zoom'], 'mouseout', function()
{
	hideZoomIcon();
});

var previewIsZoomed = false;
var previewOriginalRegion;
var previewOriginalScoll;
YAHOO.util.Event.on('preview_zoom', 'click', function()
{
	if(previewIsZoomed)
	{
		var rightSideRegion = YAHOO.util.Dom.getRegion("right");
		
		var attributes = {
			points: { to: [rightSideRegion.left + 6, previewOriginalRegion.top] },
			height: { to: previewOriginalRegion.bottom - previewOriginalRegion.top - 4 },
			width: { to: previewOriginalRegion.right - previewOriginalRegion.left - 4 }
		};
		var anim = new YAHOO.util.Motion('preview_wrapper', attributes, 0.25);
		anim.animate();
		
		var shadowAttributes = { opacity: { to: 0 } };
		var shadowAnimation = new YAHOO.util.Motion('preview_shadow', shadowAttributes, 0.25);
		shadowAnimation.animate();
		shadowAnimation.onComplete.subscribe(function() { YAHOO.util.Dom.setStyle("preview_shadow", "display", "none"); } );
		
		previewIsZoomed = false;	
	}
	else
	{
		previewOriginalRegion = YAHOO.util.Dom.getRegion("preview_wrapper");
		jumpPreviewTo([0,0]);
		
		var viewHeight = YAHOO.util.Dom.getViewportHeight();
		var viewWidth = YAHOO.util.Dom.getViewportWidth();
		
		var goalWidth = Math.min(780, viewWidth - 50);
		var goalHeight = Math.min(600, viewHeight - 50);
		var goalLeft = Math.round((viewWidth - goalWidth) / 2) + YAHOO.util.Dom.getDocumentScrollLeft();
		var goalTop = Math.round((viewHeight - goalHeight) / 2) + YAHOO.util.Dom.getDocumentScrollTop();
		
		var attributes = {
			points: { to: [goalLeft, goalTop] },
			height: { to: goalHeight },
			width: { to: goalWidth }
		};
		var anim = new YAHOO.util.Motion('preview_wrapper', attributes, 0.25);
		anim.animate();
		
		YAHOO.util.Dom.setStyle("preview_shadow", "display", "block");
		var shadowFixAttributes = {
			points: { to: [0, 0] },
			height: { to: YAHOO.util.Dom.getDocumentHeight() },
			width: { to: YAHOO.util.Dom.getDocumentWidth() }
		};
		var shadowFixAnimation = new YAHOO.util.Motion('preview_shadow', shadowFixAttributes, 0);
		shadowFixAnimation.animate();
		
		var shadowAttributes = {
			opacity: { to: 0.7 }
		};
		var shadowAnimation = new YAHOO.util.Motion('preview_shadow', shadowAttributes, 0.25);
		shadowAnimation.animate();
		
		previewIsZoomed = true;
	}
});

FriendsModule={};

Nexopia.Friends = {	
	init: function()
	{
		this.remove_friend_elements = [];
		this.add_friend_elements = [];
		this.reverse_remove_friend_elements = [];
		this.comment_elements = [];
		this.message_elements = [];
		this.online_elements = [];
		this.offline_elements = [];
		
		//find all the elements for each tooltip
		var add_friend_tooltip;
		var remove_friend_tooltip;
		var reverse_remove_friend_tooltip;
		var readd_friend_tooltip;
		var comment_tooltip;
		var message_tooltip;
		var online_tooltip;
		var offline_tooltip;
		
		var friends_list = YAHOO.util.Dom.getElementsByClassName("friend", "div", "friends_layout", null);
		
		var i;
		var temp;
		var friend_id_regex = /^friend_\d*$/;
		
		for(i=0;i<friends_list.length;i++)
		{
			temp = friends_list[i];
			if(!temp.id.match(friend_id_regex))
			{
				continue;
			}
			
			for(j=0; j<temp.childNodes.length; j++)
			{
				temp_child = temp.childNodes[j];
				
				if(YAHOO.util.Dom.hasClass(temp_child, "actions"))
				{
					Nexopia.Friends.setup_actions(temp_child);
				}
				else if(YAHOO.util.Dom.hasClass(temp_child, "pictures_div"))
				{
					Nexopia.Friends.setup_user_status(temp_child);
				}
			}
		}
		/*
		alert("Online: " + Nexopia.Friends.online_elements.length);
		alert("Offline: " + Nexopia.Friends.offline_elements.length);
		alert("Message: " + Nexopia.Friends.message_elements.length);
		alert("Comments: " + Nexopia.Friends.comment_elements.length);
		alert("Add Friend: " + Nexopia.Friends.add_friend_elements.length);
		alert("Remove Friend: " + Nexopia.Friends.remove_friend_elements.length);
		alert("Reverse Remove Friend: " + Nexopia.Friends.reverse_remove_friend_elements.length);
		*/
		add_friend_tooltip = new YAHOO.widget.Tooltip(document.createElement("div"), {context: Nexopia.Friends.add_friend_elements, text: "Add as Friend"});
		remove_friend_tooltip = new YAHOO.widget.Tooltip(document.createElement("div"), {context: Nexopia.Friends.remove_friend_elements, text: "Remove Friend"});
		reverse_remove_friend_tooltip = new YAHOO.widget.Tooltip(document.createElement("div"), {context: Nexopia.Friends.reverse_remove_friend_elements, text: "Remove from Friends list"});
		readd_friend_tooltip = new YAHOO.widget.Tooltip(document.createElement("div"), {context: [], text: "Add as Friend"});
		comment_tooltip = new YAHOO.widget.Tooltip(document.createElement("div"), {context: Nexopia.Friends.comment_elements, text: "Comment"});
		message_tooltip = new YAHOO.widget.Tooltip(document.createElement("div"), {context: Nexopia.Friends.message_elements, text: "Send Message"});
		online_tooltip = new YAHOO.widget.Tooltip(document.createElement("div"), {context: Nexopia.Friends.online_elements, text: "Online"});
		offline_tooltip = new YAHOO.widget.Tooltip(document.createElement("div"), {context: Nexopia.Friends.offline_elements, text: "Offline"});
	},
	
	setup_actions: function(el)
	{
		var remove_friend = YAHOO.util.Dom.getElementsByClassName("remove_friend", "a", el, null);
		var reverse_remove_friend = YAHOO.util.Dom.getElementsByClassName("reverse_remove_friend", "a", el, null);
		var add_friend = YAHOO.util.Dom.getElementsByClassName("add_friend", "a", el, null);
		var message = YAHOO.util.Dom.getElementsByClassName("friend_send_message", "a", el, null);
		var comment = YAHOO.util.Dom.getElementsByClassName("friend_comments", "a", el, null);
		
		if(remove_friend.length > 0)
		{
			Nexopia.Friends.remove_friend_elements.push(remove_friend[0]);
		}
		if(reverse_remove_friend.length > 0)
		{
			Nexopia.Friends.reverse_remove_friend_elements.push(reverse_remove_friend[0]);
		}
		if(add_friend.length > 0)
		{
			Nexopia.Friends.add_friend_elements.push(add_friend[0]);
		}
		if(message.length > 0)
		{
			Nexopia.Friends.message_elements.push(message[0]);
		}
		if(comment.length > 0)
		{
			Nexopia.Friends.comment_elements.push(comment[0]);
		}
	},
	
	setup_user_status: function(el)
	{
		var i;
		var j;
		
		for(i=0; i<el.childNodes.length; i++)
		{
			var temp = el.childNodes[i];
			if(YAHOO.util.Dom.hasClass(temp, "online_offline"))
			{
				for(j=0;j<temp.childNodes.length; j++)
				{
					if(YAHOO.util.Dom.hasClass(temp.childNodes[j], "friend_offline"))
					{
						Nexopia.Friends.offline_elements.push(temp.childNodes[j]);
					}
					else if(YAHOO.util.Dom.hasClass(temp.childNodes[j], "friend_online"))
					{
						Nexopia.Friends.online_elements.push(temp.childNodes[j]);
					}
				}
			}
		}
	}
};

Friends = function()
{
	
};



Friends.prototype =
{
	
};

Friends.AddLink = function(element, replacement_element) {
	this.element = element;
	this.replacement_element = replacement_element;
	YAHOO.util.Event.on(this.element, 'click', this.submit, this, true);
};

Friends.AddLink.prototype = {
	submit: function(event) {
		if (event) {
			YAHOO.util.Event.preventDefault(event);
		}

		var spinner = new Spinner({ context: [this.element, "tr"], offset: [-3,-4] , lazyload: true });
		this.element.style.visibility = "hidden";
		spinner.on();
		var that = this;
		
		YAHOO.util.Connect.asyncRequest('POST', this.element.href, new ResponseHandler({
			success: function() {
				spinner.off();
				if (that.replacement_element)
				{
					this.parentNode.replaceChild(that.replacement_element, that.element);					
					// init_custom_color_icons([that.replacement_element]);
				}
				else
				{
					this.parentNode.removeChild(this);
				}
			},
			failure: function() {
				spinner.off();
				this.style.visibility = "visible";
			},
			scope: this.element
		}), "ajax=true&form_key[]=" + Nexopia.json(this.element));
	}
};

Overlord.assign({
	minion: "friends:add_friend",
	load: function(element) {
		var replacement_img = document.createElement('img');
		YAHOO.util.Dom.addClass(replacement_img, "color_icon");
		replacement_img.src = Site.coloredImgURL(Nexopia.Utilities.deduceImgColor(element)) +"/friends/images/icon_friend_true.gif";
		new Friends.AddLink(element, replacement_img);
	},
	order: -1
});

Overlord.assign({
	minion: "friends:remove_friend",
	load: function(element) {
		
	},
    click: function(event, element) {
        YAHOO.util.Event.preventDefault(event);
		form_key = Nexopia.json(element);
		YAHOO.util.Connect.asyncRequest('POST', element.href, new ResponseHandler({}), "ajax=true&form_key[]=" + form_key);
    }
});

Overlord.assign({
	minion: "friends:reverse_remove_friend",
	load: function(element) {
		
	},

    click: function(event, element) {
		YAHOO.util.Event.preventDefault(event);
		form_key = Nexopia.json(element);
		YAHOO.util.Connect.asyncRequest('POST', element.href, new ResponseHandler({}), "ajax=true&form_key[]=" + form_key);
    }
});

Overlord.assign({
	minion: "friends:re_add_friend",
	load: function(element) {
		
	},

  click: function(event, element) {
  	YAHOO.util.Event.preventDefault(event);
		form_key = Nexopia.json(element);
		YAHOO.util.Connect.asyncRequest('POST', element.href, new ResponseHandler({}), "ajax=true&form_key[]=" + form_key);
	}
});

Overlord.assign({
	minion: "friends:truncated",
	load: function(element) {
		new Truncator(element, {
			height:30,
			width:350,
			expandable: true,
			collapsible: true,
			suffix: "...&nbsp;<a href=''>[more]</a>",
			expandedSuffix: "&nbsp;<a href=''>[less]</a>",
			tooltip: false
		});
	}
});

Overlord.assign({
	minion: "friends:init_tooltips",
	load: function(element) {
		Nexopia.Friends.init();
	}
})
// require friends.js

Nexopia.Friends.Note = function(element) {
	this.editLink = element;
	this.root = this.editLink.parentNode.parentNode;
	this.note = YAHOO.util.Dom.getElementsByClassName('note', 'div', this.root)[0];
	this.form = this.root.getElementsByTagName('form')[0];
	this.text = YAHOO.util.Dom.getElementsByClassName("edit_notes", 'input', this.form)[0];
	YAHOO.util.Event.on(this.editLink, 'click', this.edit, this, true);
	YAHOO.util.Event.on(this.text, 'blur', this.save, this, true);
	YAHOO.util.Event.on(this.form, 'submit', this.save, this, true);
};

Nexopia.Friends.Note.prototype = {
	edit: function(event) {
		YAHOO.util.Event.preventDefault(event);
		YAHOO.util.Dom.setStyle(this.note, 'display', 'none');
		YAHOO.util.Dom.setStyle(this.editLink, 'display', 'none');
		YAHOO.util.Dom.setStyle(this.form, 'display', 'inline');
		YAHOO.util.Dom.setStyle(this.text, 'display', 'inline');
		this.text.focus();
		this.text.select();
	},
	save: function() {
		YAHOO.util.Dom.setStyle(this.text, 'display', 'none');
		YAHOO.util.Dom.setStyle(this.note, 'display', 'inline');
		YAHOO.util.Dom.setStyle(this.editLink, 'display', 'inline-block');
		this.note.innerHTML = "Updating...<img src=\"" + Site.staticFilesURL + "/Legacy/images/spinner.gif\"/>";
		YAHOO.util.Connect.setForm(this.form);
		that = this;
		YAHOO.util.Connect.asyncRequest('POST', this.form.action, {
			success: function() {
				that.note.innerHTML = that.text.value;
			},
			scope: this.element
		}, 'null=null');
	}
};

Overlord.assign({
	minion: "friends:notes:edit",
	load: function(element) {
		new Nexopia.Friends.Note(element);
	}
});

Overlord.assign({
	minion: "friends:notes:form",
    submit: function(event, element) {
        YAHOO.util.Event.preventDefault(event);
    }
});

FriendsOfFriends = {
	init: function() {
		var add = YAHOO.util.Dom.getElementsByClassName("add");
		for (var i=0;i<add.length;i++) {
			FriendsOfFriends.registerAjaxForm(add[i]);
			new ToolTip(add[i], {text:"Add as Friend"});
		}
		var hide = YAHOO.util.Dom.getElementsByClassName("hide");
		for (var i=0;i<hide.length;i++) {
			FriendsOfFriends.registerAjaxForm(hide[i]);
			new ToolTip(hide[i], {text:"Hide"});
		}
		var connected_friends = YAHOO.util.Dom.getElementsByClassName("connected_friend");
		for (var i=0;i<connected_friends.length;i++) {
			var friend = connected_friends[i];
			var name = friend.id.match(/picture_\d+_(.+)/)[1];
			new ToolTip(friend, {text:name});
		}
	},
	//Sets up functionality to do ajax form submission and then hide wrapping element
	registerAjaxForm: function(element) {
		YAHOO.util.Event.on(element, "click", function(e) {
			YAHOO.util.Event.preventDefault(e);
			element.innerHTML = "<img src='"+Site.staticFilesURL+"/Legacy/images/spinner.gif'";
			YAHOO.util.Connect.asyncRequest("post", element.href, {
				success: function() {
					var li = YAHOO.util.Dom.getAncestorByClassName(element, 'friend_list_entry');
					li.parentNode.removeChild(li);
				},
				scope: element
			}, "null=null");
		});
	}
};

GlobalRegistry.register_handler("friends_of_friends", FriendsOfFriends.init, FriendsOfFriends, true);
FriendsProfileBlock = {
	init: function(element) {
		this.toolBar = element;
		
		this.sendMessageTooltip = new YAHOO.widget.Tooltip(document.createElement("div"), {context: [], text: "Send Message"});
		this.commentTooltip = new YAHOO.widget.Tooltip(document.createElement("div"), {context: [], text: "Comment"});
		this.addFriendTooltip = new YAHOO.widget.Tooltip(document.createElement("div"), {context: [], text: "Add as Friend"});
		
		this.sendMessageLinks = [];
		this.commentLinks = [];
		this.addFriendLinks = [];
		
		var autoComplete = new YAHOO.widget.AutoComplete("friends_search", "friends_results", new YAHOO.widget.DS_JSArray(Nexopia.json(element), {
			queryMatchContains: true
		}), {
			animHoriz: false,
			animVert: false
		});
		autoComplete.itemSelectEvent.subscribe(function(event, args) {
			var username = args[2][0];
			window.location = "/users/" + encodeURIComponent(username);
		});
		
		this.thumbViewLink = YAHOO.util.Dom.getElementsByClassName('thumb_view', 'a', element, function(thumb_view) {
			YAHOO.util.Event.on(thumb_view, 'click', FriendsProfileBlock.thumbView, FriendsProfileBlock, true);
		})[0];
		if (!YAHOO.util.Dom.hasClass('thumb_view_container', 'hidden')) {
			this.loadThumbViewImages();
		}
		this.listViewLink = YAHOO.util.Dom.getElementsByClassName('list_view', 'a', element, function(list_view) {
			YAHOO.util.Event.on(list_view, 'click', FriendsProfileBlock.listView, FriendsProfileBlock, true);
		})[0];
		if (!YAHOO.util.Dom.hasClass('list_view_container', 'hidden')) {
			this.listView();
		}
		
		this.updateAddFriends();
		
		var mock_event = new Object();
		mock_event.page = 0;
		mock_event.previous_page = 0;
		FriendsProfileBlock.onPageChangeTooltipUpdate("onPageChange", [mock_event]);
	},
	loadThumbViewImages: function() {
		if (!this.loadedThumbViewImages) {
			Nexopia.DelayedImage.loadImages("thumb_view_container");
			this.loadedThumbViewImages = true;
			//once we load the images once make sure we load the images for any future pages immediately
			Overlord.assign({
				minion: "fpb:friend_pic",
				load: Nexopia.DelayedImage.loadImage,
				limitToContext: true				
			});
		}
	},
	thumbView: function(event) {
		if (event) {
			YAHOO.util.Event.preventDefault(event);
		}
		this.loadThumbViewImages();
		YAHOO.util.Dom.addClass(this.thumbViewLink, 'selected');
		YAHOO.util.Dom.removeClass('thumb_view_container', 'hidden');
		YAHOO.util.Dom.removeClass(this.listViewLink, 'selected');
		YAHOO.util.Dom.addClass('list_view_container', 'hidden');
	},
	listView: function(event) {
		if (event) {
			YAHOO.util.Event.preventDefault(event);
		}
		YAHOO.util.Dom.addClass(this.listViewLink, 'selected');
		YAHOO.util.Dom.removeClass('list_view_container', 'hidden');
		YAHOO.util.Dom.removeClass(this.thumbViewLink, 'selected');
		YAHOO.util.Dom.addClass('thumb_view_container', 'hidden');
	},
	updateTooltips: function() {
		this.sendMessageTooltip.render(this.element);
		this.commentTooltip.render(this.element);
		this.addFriendTooltip.render(this.element);
		this.sendMessageTooltip.cfg.setProperty("context", this.sendMessageLinks);
		this.commentTooltip.cfg.setProperty("context", this.commentLinks);
		this.addFriendTooltip.cfg.setProperty("context", this.addFriendLinks);
	},
	onPageChangeTooltipUpdate: function(type, args)
	{
		var page_info = args[0];

		message_links = YAHOO.util.Dom.getElementsByClassName("send_message", "a", "friends_list_page_"+page_info.page, null);
		FriendsProfileBlock.sendMessageLinks = message_links;
		comment_links = YAHOO.util.Dom.getElementsByClassName("comment", "a", "friends_list_page_"+page_info.page, null);
		FriendsProfileBlock.commentLinks = comment_links;
		add_friend_links = YAHOO.util.Dom.getElementsByClassName("add_friend", "a", "friends_list_page_"+page_info.page, null);
		FriendsProfileBlock.addFriendLinks = add_friend_links;
		FriendsProfileBlock.updateTooltips();
	},
	deduceImgColor: function()
	{
		var iconColor = '000000';

		var profileDiv = document.getElementById('profile');
		if (profileDiv)
		{
			var primaryDiv = document.createElement('div');
			primaryDiv.className = 'primary_block';
			var secondaryDiv = document.createElement('div');
			secondaryDiv.className = 'secondary_block';
			primaryDiv.appendChild(secondaryDiv);
			profileDiv.appendChild(primaryDiv);
			iconColor = Nexopia.Utilities.deduceImgColor(secondaryDiv);
			profileDiv.removeChild(primaryDiv);
		}
		return iconColor;
	},
	updateAddFriends: function() {
		YAHOO.util.Event.on(YAHOO.util.Dom.getElementsByClassName("add_friend", "a", this.element), 'click', this.addFriend, this);
	},
	addFriend: function(event, obj) {
		if (event) {
			YAHOO.util.Event.preventDefault(event);
		}

		YAHOO.util.Connect.asyncRequest('POST', this.href, new ResponseHandler({
			success: function() {
				this.innerHTML = "<img src='" + Site.coloredImgURL(obj.deduceImgColor()) + "/friends/images/icon_friend_true.gif' class='color_icon'/>";				
			},
			scope: this
		}), 'ajax=true');
	}
};

Overlord.assign({
	minion: "fpb:friends_pages",
	load: function(element) {
		var pageCount = YAHOO.util.Dom.get("friends_pages_count").value;
		var ajaxPath = YAHOO.util.Dom.get("friends_ajax_path").value;
		if (pageCount > 1) {
			var paginator = new Paginator(element, {
				orientation: "vertical", 
				height: 440, 
				pageIndicatorStyle: "none",
				ajaxLoadURL: ajaxPath,
				numPages: pageCount,
				prefetchPages: 3,
				pageGrouping: 10,
				duration: 0.5
			});
			//This will start the paginator loading the second page as soon as you hover
			//over the paginator the first time.
			YAHOO.util.Event.on(element, 'mouseover', function() {paginator.getPageAt(1);});
			paginator.onPageChange.subscribe(FriendsProfileBlock.onPageChangeTooltipUpdate);
		} else {
			YAHOO.util.Dom.setStyle("friends_arrow_btns", "display", "none");
		}
	},
	order: -1
});

Overlord.assign({
	minion: "fpb:user_container",
	load: function(element) {
		function hoverOn()
		{
			YAHOO.util.Dom.addClass(element, "block_hover");
			YAHOO.util.Dom.removeClass(element, "block_regular");			
		}
		YAHOO.util.Event.addListener(element, "mouseover", hoverOn);
		
		function hoverOff()
		{
			YAHOO.util.Dom.addClass(element, "block_regular");
			YAHOO.util.Dom.removeClass(element, "block_hover");
		}
		YAHOO.util.Event.addListener(element, "mouseout", hoverOff);
	}
});

Overlord.assign({
	minion: "fpb:friends_toolbar",
	load: FriendsProfileBlock.init,
	scope: FriendsProfileBlock
});

//require friends_profile_block.js
FriendsProfileBlock.ListView = {
	pageLength: 20,
	json: null,
	page: 0,
	init: function(element) {
		
		this.sendMessageTooltip = new YAHOO.widget.Tooltip(document.createElement("div"), {context: [], text: "Send Message"});
		this.commentTooltip = new YAHOO.widget.Tooltip(document.createElement("div"), {context: [], text: "Comment"});
		this.addFriendTooltip = new YAHOO.widget.Tooltip(document.createElement("div"), {context: [], text: "Add as Friend"});

		this.pages = [];
		
		this.element = element.firstChild;
		this.json = Nexopia.json(element)[0];
		this.viewer = Nexopia.json(element)[1];
		this.form_key = YAHOO.util.Dom.get('list_view_form_key').value;
		for (var i=0; i<this.json.length;i++) {
			var parsedData = {
				friendid: this.json[i][0],
				username: this.json[i][1],
				alreadyfriend: this.json[i][2]
			};
			this.json[i] = parsedData;
		}
		this.lastPage = Math.floor((this.json.length-1)/this.pageLength);
		this.element.innerHTML = "";
		this.appendPage(this.page);
		this.page_backward = YAHOO.util.Dom.getElementsByClassName('page_backward', 'a', element)[0];
		this.page_forward = YAHOO.util.Dom.getElementsByClassName('page_forward', 'a', element)[0];
		YAHOO.util.Event.on(this.page_backward, 'click', this.pageBackward, this, true);
		YAHOO.util.Event.on(this.page_forward, 'click', this.pageForward, this, true);
	},
	pageForward: function(event) {
		if (event) {
			YAHOO.util.Event.preventDefault(event);
		}
		if (this.page >= this.lastPage) {
			return;
		}
		this.page++;
		this.appendPage(this.page);
		this.scrollPageForward();
	},
	pageBackward: function(event) {
		if (event) {
			YAHOO.util.Event.preventDefault(event);
		}
		if (this.page <= 0) {
			return;
		}
		this.page--;
		this.prependPage(this.page);
		this.element.scrollTop = 440;
		this.scrollPageBackward();
		
	},
	appendPage: function(pageNumber) {
		// On a profile load, this function takes an enourmous amount of time (~150ms). If anybody
		// wants to reduce load time in the future, this would be the place to start.
		if (!this.pages[pageNumber]) {
			this.pages[pageNumber] = this.buildPage(pageNumber);
		}
		this.element.appendChild(this.pages[pageNumber]);
		this.updateTooltips();
		this.updateAddFriends();
	},
	prependPage: function(pageNumber) {
		if (!this.pages[pageNumber]) {
			this.pages[pageNumber] = this.buildPage(pageNumber);
		}
		this.element.insertBefore(this.pages[pageNumber], this.element.firstChild);
		this.updateTooltips();
	},
	updateTooltips: function() {
		this.sendMessageTooltip.render(this.element);
		this.commentTooltip.render(this.element);
		this.addFriendTooltip.render(this.element);
		this.sendMessageTooltip.cfg.setProperty("context", YAHOO.util.Dom.getElementsByClassName("send_message hover", "a", this.element));
		this.commentTooltip.cfg.setProperty("context", YAHOO.util.Dom.getElementsByClassName("comment hover", "a", this.element));
		this.addFriendTooltip.cfg.setProperty("context", YAHOO.util.Dom.getElementsByClassName("add_friend", "a", this.element));
	},
	scrollPageForward: function() {
		if (this.currentAnimation) {
			this.currentAnimation.stop(true);
		}
		this.currentAnimation = new YAHOO.util.Scroll(this.element, { scroll: { by: [0, 440] } }, 0.5, YAHOO.util.Easing.easeOutStrong);
		this.currentAnimation.animate();
		this.currentAnimation.onComplete.subscribe(this.cleanUpFront, this, true); 
	},
	scrollPageBackward: function() {
		if (this.currentAnimation) {
			this.currentAnimation.stop(true);
		}
		this.currentAnimation = new YAHOO.util.Scroll(this.element, { scroll: { by: [0, -440] } }, 0.5, YAHOO.util.Easing.easeOutStrong);
		this.currentAnimation.animate();
		this.currentAnimation.onComplete.subscribe(this.cleanUpEnd, this, true);
	},
	cleanUpFront: function() {
		this.element.removeChild(this.element.firstChild);
		this.element.scrollTop = 0;
		this.currentAnimation = null;
	},
	cleanUpEnd: function() {
		childpages = YAHOO.util.Dom.getElementsByClassName("page", "div", this.element);
		this.element.removeChild(childpages[childpages.length-1]);
		this.element.scrollTop = 0;
		this.currentAnimation = null;
	},
	buildPage: function(pageNumber) {
		var div = document.createElement("div");
		div.className = "page";
		var iconColor = this.deduceImgColor();
		friends_content = "";
		for (var i=this.page*this.pageLength;i<(this.page+1)*this.pageLength && i<this.json.length;i++) {
			friends_content += this.buildFriendDisplay(this.json[i], iconColor);
		}
		div.innerHTML = friends_content;
		return div;
	},
	buildFriendDisplay: function(jsonData, iconColor) {
		
		output = "";
		
		userURL = Site.userURL;
		coloredImgURL = Site.coloredImgURL(iconColor);
		escapedUsername = Nexopia.Utilities.escapeURI(jsonData.username);
		
		if (!this.viewer.anonymous) {
			
			output += "<div class='functions'>";
			output += "<a href='/messages.php?action=write&to=" + jsonData.friendid + "' class='send_message hover'>";
			output += "<img src='" + coloredImgURL + "/friends/images/icon_send_msg.gif' class='color_icon'/>";
			output += "</a>";
			output += "<a href='" + userURL + "/" + escapedUsername + "/comments' class='comment hover'>";
			output += "<img src='" + coloredImgURL + "/friends/images/icon_comment.gif' class='color_icon last'/>";
			output += "</a>";
			
			if (jsonData.alreadyfriend) {		
				output += "<img src='" + coloredImgURL + "/friends/images/icon_friend_true.gif' class='color_icon'/>";
			} else {
				output += "<a href='" + userURL + "/" + Nexopia.Utilities.escapeURI(this.viewer.username) + "/friends/add/" + jsonData.friendid + "?form_key[]=" + this.form_key + "' class='add_friend'>";
				output += "<img src='" + coloredImgURL + "/friends/images/icon_add_friend.gif' class='color_icon'/>";
				output += "</a>";
			}
			
			output += "</div>";
			
		}
		
		output += "<a href='" + Site.userURL + "/" + escapedUsername + "'>" + Nexopia.Utilities.escapeHTML(jsonData.username) + "</a>";

		return "<div class='short_friend'>"+output+"</div>";
	},
	deduceImgColor: function()
	{
		var iconColor = '000000';
		
		var profileDiv = document.getElementById('profile');
		if (profileDiv)
		{
			var primaryDiv = document.createElement('div');
			primaryDiv.className = 'primary_block';
			var secondaryDiv = document.createElement('div');
			secondaryDiv.className = 'secondary_block';
			primaryDiv.appendChild(secondaryDiv);
			profileDiv.appendChild(primaryDiv);
			iconColor = Nexopia.Utilities.deduceImgColor(secondaryDiv);
			profileDiv.removeChild(primaryDiv);
		}
		return iconColor;
	},
	updateAddFriends: function() {
		YAHOO.util.Event.on(YAHOO.util.Dom.getElementsByClassName("add_friend", "a", this.element), 'click', this.addFriend, this);
	},
	addFriend: function(event, obj) {
		if (event) {
			YAHOO.util.Event.preventDefault(event);
		}

		YAHOO.util.Connect.asyncRequest('POST', this.href, new ResponseHandler({
			success: function() {
				this.innerHTML = "<img src='" + Site.coloredImgURL(obj.deduceImgColor()) + "/friends/images/icon_friend_true.gif' class='color_icon'/>";				
			},
			scope: this
		}), 'ajax=true');
	}
};

Overlord.assign({
	minion: "fpb:list_view",
	load: FriendsProfileBlock.ListView.init,
	scope: FriendsProfileBlock.ListView,
	order: -10
});
CommentsModule={};

function deleteComment(id){
	if (!confirm("Delete comment?"))
		return;
	
	var form = YAHOO.util.Dom.get("delete_comments_form");
	YAHOO.util.Connect.setForm(form);
	YAHOO.util.Connect.asyncRequest('POST', form.ajax_delete_url.value, new ResponseHandler({
		success: function(o) {
		},
		failure: function(o) {
		}
	}), "comment_id[]=" + id);
}


CommentList =
{
	toggleIgnore: function(userID, authKey, hrefElement)
	{
		var action = "ignore";
		var dialogQuestion = "Ignore this user?";
		var newLabelText = "Unignore User";
		var newAction = "unignore";
				
		if (hrefElement.innerHTML == newLabelText)
		{
			action = "unignore";
			dialogQuestion = "Unignore this user?";
			newLabelText = "Ignore User";
			newAction = "ignore";
		}
		
		var link = "/messages.php?action="+action+"&id="+userID+"&k="+authKey;
		
		if (confirm(dialogQuestion))
		{
			YAHOO.util.Connect.asyncRequest('GET', link,
			{
				success: function(o) 
				{
					var links = YAHOO.util.Dom.getElementsBy(
						function (e) 
						{ 
							return e.href == hrefElement.href 
						}, 
						'a',
						YAHOO.util.Dom.getAncestorByClassName (hrefElement, "comments_section"));
					
					for (var i = 0; i < links.length; i++)
					{
						links[i].setAttribute("href", "/messages.php?action="+newAction+"&id="+userID+"&k="+authKey);
						links[i].innerHTML = newLabelText;
					}
					
					// hrefElement.setAttribute("href", "/messages.php?action="+newAction+"&id="+userID+"&k="+authKey);
					// hrefElement.innerHTML = newLabelText;
				},
				failure: function(o) 
				{
				
				},
				scope: this
			}, "ajax=true");
		}
	}
}


Overlord.assign({
	minion: "comments:footer", 
	load: function(element) {
		
		YAHOO.util.Event.on("select_all_comments", "click", function(event){
			var root = YAHOO.util.Dom.get("comments_page");
			var that = this;
			YAHOO.util.Dom.getElementsByClassName("comment_delete", "input", root, function(input){
				if (that.checked)
					input.checked = true;
				else
					input.checked = false;
			});
		});
		
		YAHOO.util.Event.on("comments_delete_button", "click", function(event){
			var root = YAHOO.util.Dom.get("comments_page");
			if (event) {
				YAHOO.util.Event.preventDefault(event);
			}

			if (!confirm("Delete comments?"))
				return false;
		
			var list = "";
			YAHOO.util.Dom.getElementsByClassName("comment_delete", "input", root, function(input){
				if (input.checked)
					list += "comment_id[]=" + input.id + "&";
			});
			
			var form = YAHOO.util.Dom.get("delete_comments_form");
			YAHOO.util.Connect.setForm(form);
			YAHOO.util.Connect.asyncRequest('POST', form.ajax_delete_url.value, new ResponseHandler({
				success: function(o) {
				},
				failure: function(o) {
				},
				scope: this
			}), list);
			
		});
	}
});


if(YAHOO.comments == undefined){
	YAHOO.namespace("comments");
}

YAHOO.comments.Editor =
{
	init: function() {
		YAHOO.util.Event.on("comment_post_submit", "click", YAHOO.comments.Editor.submit_post);
		YAHOO.util.Event.addListener("comment_text", "focus", YAHOO.comments.Editor.clear_input);
		
		var text_area = document.getElementById("comment_text");
		text_area.value = "Post a comment...";
		
		// Disable the submit button on load so the user can't post the initial text.
		var post_button = YAHOO.util.Dom.get("comment_post_submit");
		if (post_button)
		{
			post_button.disabled = true;
		}
	},
	
	clear_input: function(e) {
		if (e) {
			YAHOO.util.Event.preventDefault(e);
		}
		
		// clear the listener off so it doesn't go again if they click out, then back into the editor.
		YAHOO.util.Event.removeListener("comment_text", "focus", YAHOO.comments.Editor.clear_input);
		
		// clear the text in the editor
		YAHOO.util.Dom.get("comment_text").value = "";
		
		// enable the post button so they can post their comment.
		YAHOO.util.Dom.get("comment_post_submit").disabled = false;
	},
	
	submit_post: function(e) {
		if (e) {
			YAHOO.util.Event.preventDefault(e);
		}
		
		var comments_form = document.getElementById("comment_write_form");
		
		var post_button = document.getElementById("comment_post_submit");
		var spinner = document.getElementById("post_comment_spinner");
		if(post_button && spinner)
		{
			YAHOO.util.Dom.setStyle(post_button, "display", "none");
			post_button.disabled = true;
			YAHOO.util.Dom.setStyle(spinner, "display", "block");
		}
		
		YAHOO.util.Connect.setForm(comments_form);
		YAHOO.util.Connect.asyncRequest(comments_form.method, comments_form.action + "/dynamic", new ResponseHandler({
			success: function(o) {
				YAHOO.comments.Editor.update_comments_view(o);
			},
			failure: function(o) {
			},
			scope: this
		}), "");
	},
	
	update_comments_view: function(connection_obj)
	{
		var result_obj = YAHOO.lang.JSON.parse(connection_obj.responseText);
		var current_page = parseInt(Nexopia.JSONData['current_page'], 10);

		if(result_obj.success && current_page == 0)
		{
			var message_row = document.getElementById("comments_user_message_row");
			if(message_row)
			{
				message_row.parentNode.removeChild(message_row);
			}
			
			var top_comment_id = YAHOO.comments.Editor.max_comment_id();
			var bottom_comment_id = YAHOO.comments.Editor.min_comment_id();
			var remove_bottom_comment = false;
			var profile_block = document.getElementById("comments_profile_block")
			
			var comment_limit = 20;
			if(profile_block)
			{
				comment_limit = 5;
			}

			if(Nexopia.JSONData.comments_id_list.length >= comment_limit)
			{
				for(var i=0; i < Nexopia.JSONData.comments_id_list.length; i++)
				{
					if(Nexopia.JSONData.comments_id_list[i] == parseInt(bottom_comment_id, 10))
					{
						Nexopia.JSONData.comments_id_list[i] = result_obj.comment_id;
						remove_bottom_comment = true;
						break;
					}
				}
			}
			else
			{
				Nexopia.JSONData.comments_id_list.push(result_obj.comment_id);
			}
			
			var top_comment = document.getElementById("user_comment_" + top_comment_id);
			if(!top_comment)
			{
				var delete_form = document.getElementById("delete_comments_form");
				var conversation_wrapper = document.getElementById("conversation_wrapper");
			}
			var bottom_comment = document.getElementById("user_comment_" + bottom_comment_id);
			
			var new_element = document.createElement("div");
			new_element.innerHTML = result_obj.comment_content;
			
			if(top_comment)
			{
				top_comment.parentNode.insertBefore(new_element.firstChild, top_comment);
			}
			else
			{
				if(profile_block)
				{
					var placeholder = document.getElementById("comment_placeholder");
					placeholder.parentNode.insertBefore(new_element.firstChild, placeholder);
				}
				else if(delete_form)
				{
					delete_form.appendChild(new_element.firstChild);
				}
				else
				{
					conversation_wrapper.appendChild(new_element.firstChild);
				}
			}
			
			if(remove_bottom_comment)
			{
				YAHOO.util.Event.purgeElement(bottom_comment, true);
				bottom_comment.parentNode.removeChild(bottom_comment);
			}
			var new_comment = document.getElementById("user_comment_"+result_obj.comment_id);
			Overlord.summonMinions(new_comment);
		}
		
		if(!result_obj.success || current_page != 0)
		{
			
			YAHOO.comments.Editor.show_user_message(result_obj);
		}
		
		var spinner = document.getElementById("post_comment_spinner");
		var post_button = document.getElementById("comment_post_submit");
		var text_area = document.getElementById("comment_text");
		
		text_area.value = "Post a comment...";
		YAHOO.util.Event.addListener(text_area, "focus", YAHOO.comments.Editor.clear_input, this);
		YAHOO.util.Dom.setStyle(post_button, "display", "block");
		
		if(post_button && spinner)
		{
			YAHOO.util.Dom.setStyle(post_button, "display", "block");
			post_button.disabled = true;
			YAHOO.util.Dom.setStyle(spinner, "display", "none");
		}
		
		// Check to see if this is still needed. It might be unnecessary after the refactoring.
		//
		// This is a bit of a hack to fix a problem where the "color" menu of the enhanced text editor for
		// comments was cut off if there are not at least 2 comments. This is due to block_containers being
		// overflow: hidden in order to prevent content inside from throwing off the layout. In the case
		// of comments, each comment has an overflow: hidden property, so the property on the outer block,
		// while being extra careful, is not necessary. Thus, in this one case, we're resetting it with
		// the following Javascript.
		var container = YAHOO.util.Dom.getAncestorByClassName("comment_write", "block_container");
		if (container)
		{
			YAHOO.util.Dom.setStyle(container, "overflow", "visible");
		}
	},
	
	show_user_message: function(result_obj)
	{	
		var error_node = document.getElementById("comments_post_error");
		var success_node = document.getElementById("comments_post_success");
		if(error_node && !result_obj.success)
		{
			error_node.innerText = result_obj.error;
			return;
		}
		else if((error_node && result_obj.success) || (success_node && !result_obj.success))
		{
			var error_row = document.getElementById("comments_user_message_row");
			if(error_row)
			{
				error_row.parentNode.removeChild(error_row);
			}
		}
		else if(success_node && result_obj.success)
		{
			return;
		}
		
		var new_row = document.createElement("tr");
		new_row.id = "comments_user_message_row";
		
		var left_col = document.createElement("td");
		var right_col = document.createElement("td");

		var new_element = document.createElement("div");
		if(!result_obj.success)
		{
			var text = document.createTextNode(result_obj.error);
			new_element.appendChild(text);
	
			new_element.id = "comments_post_error";
		}
		else
		{
			var link = document.createElement("a");
			link.href = Nexopia.JSONData["page_url"]+"?page=0";
			var text = document.createTextNode("Comment post successful. You can view your comment ");
			var link_text = document.createTextNode("here");
			link.appendChild(link_text);
			new_element.appendChild(text);
			new_element.appendChild(link);
			new_element.appendChild(document.createTextNode("."));
			
			new_element.id = "comments_post_success";
		}
		
		new_row.appendChild(left_col);
		new_row.appendChild(right_col);
		right_col.appendChild(new_element);
	
		var comments_row = document.getElementById("comments_editor_row");
	
		comments_row.parentNode.insertBefore(new_row, comments_row);
	},
	
	max_comment_id: function()
	{
		return Math.max.apply(Math, Nexopia.JSONData.comments_id_list);
	},
	
	min_comment_id: function()
	{
		return Math.min.apply(Math, Nexopia.JSONData.comments_id_list);
	}
};

Overlord.assign({
	minion: "comments:write",
	load: function(element) {
		YAHOO.comments.Editor.init();
	}
});
if(YAHOO.comments == undefined){
	YAHOO.namespace("comments");
}

YAHOO.comments.View =
{
	init: function()
	{
		YAHOO.util.Event.addListener("select_all_comments", "click", YAHOO.comments.View.select_all_click);

		var root_element = document.getElementById("comments_profile_block");
		if(!root_element)
		{
			root_element = document.getElementById("comments_page");
		}
	},
	
	select_all_click: function(e)
	{
		var input_list = YAHOO.util.Dom.getElementsByClassName("comment_delete_input", "input", "delete_comments_form", function(obj){});
		for(var i=0; i < input_list.length; i++)
		{
			input_list[i].checked = YAHOO.util.Event.getTarget(e).checked;
		}
	},
	
	quick_delete: function(e)
	{
		YAHOO.log('quick delete');
		if (e) {
			YAHOO.util.Event.preventDefault(e);
		}
		
		if(!confirm("Delete comment?"))
		{
			return;
		}
		
		var target = YAHOO.util.Event.getTarget(e);
		if(target.tagName.toLowerCase() == "img")
		{
			target = target.parentNode;
		}
	
		var bottom_comment_id = YAHOO.comments.Editor.min_comment_id();	
		var separator = "";
		if(!(target.host.charAt(target.host.length-1) == "/") && !(target.pathname.charAt(0) == "/"))
		{
			separator = "/";
		}
		var delete_path = "http://"+target.host+separator+target.pathname+"/dynamic"+target.search+"&last_id="+bottom_comment_id;

		YAHOO.util.Connect.asyncRequest("GET", delete_path, new ResponseHandler({
			success: function(o) {

				YAHOO.comments.View.update_comments_view(o);
			},
			scope: this
		}), "");
		
	},
	
	update_comments_view: function(connection_obj)
	{
		var result_obj = YAHOO.lang.JSON.parse(connection_obj.responseText);

		if(result_obj.success)
		{
			var error_row = document.getElementById("comments_post_error_row");
			if(error_row)
			{
				error_row.parentNode.removeChild(error_row);
			}
			
			var bottom_comment_id = YAHOO.comments.Editor.min_comment_id();
			
			for(var i=0; i < Nexopia.JSONData.comments_id_list.length; i++)
			{
				if(Nexopia.JSONData.comments_id_list[i] == parseInt(result_obj.removed_comment_id, 10))
				{
					Nexopia.JSONData.comments_id_list[i] = result_obj.comment_id;
					break;
				}
			}
			if(result_obj.removed_comment_id == bottom_comment_id)
			{
				bottom_comment_id = YAHOO.comments.Editor.min_comment_id();
			}
			
			var del_comment_obj = document.getElementById("user_comment_" + result_obj.removed_comment_id);
			YAHOO.util.Event.purgeElement(del_comment_obj, true);
			del_comment_obj.parentNode.removeChild(del_comment_obj);
			
			var new_element = document.createElement("div");
			new_element.innerHTML = result_obj.comment_content;
			
			var delete_control = document.getElementById("select_all_comments");
			if(delete_control)
			{
				delete_control.parentNode.insertBefore(new_element.firstChild, delete_control);
			}
			else
			{
				var bottom_comment = document.getElementById("user_comment_" + bottom_comment_id);
				bottom_comment.parentNode.appendChild(new_element.firstChild);
			}
			
			var new_comment = document.getElementById("user_comment_"+result_obj.comment_id);
			Overlord.summonMinions(new_comment);
		}
	}
};

Overlord.assign({
	minion: "comments:view",
	load: function(element){
		YAHOO.comments.View.init();
	}
});

Overlord.assign({
	minion: "comments:quick_delete",
	load: function(element){
		YAHOO.util.Event.addListener(element, "click", YAHOO.comments.View.quick_delete);
	}
})

