var ckSearchPlaceholder = 'search';
Event.observe(window, 'load', function() {
  searchBoxOnLoad();
  //Event.observe('signinForm', 'submit', checkForm);
});


LibraryThing = LibraryThing || {};

// fwiki javascript file
/*
if (!window.LibraryThing) {
	LibraryThing
	var LibraryThing = new function() {
		//this.BASE_URL = "http://athena.librarything.com";
	};
}
*/

if (!LibraryThing.fwiki) 
{
	LibraryThing.fwiki = {};
	LibraryThing.fwiki.controls = [];
	
	// Settings for fwiki here
	LibraryThing.fwiki.useAutocompleteMenu = true;
	LibraryThing.fwiki.confirmCancels = false;
}


LibraryThing.fwiki.loadCKCloud = function(title, wiki_type, field, limit, el) {
	var element = $(el);
	var url = '/commonknowledge/loadCKCloud.php';
	var params = {
		'title': title,
		'wiki_type': wiki_type,
		'field': field, 
		'limit': limit
	};
	var callback = function(r) {
		var rt = r.responseText;
		element.replace(rt);
		new Effect.Opacity(element, { from: 0.25, to: 1.0, duration: 0.2 });
	};
	
	if (el)
	{
		new Effect.Opacity(element, { from: 1.0, to: 0.25, duration: 1.0 });
		basic_ajax(url, params, callback);
	}
};

function fwiki_showmore(elid) {

	var el = $(elid);
	var el2 = $('show-'+elid);
	el.style.display = "inline";
	el2.style.display = 'none';
}

function fwikiEditPencil (imgObject, off)
{
	if (off)
	{
		imgObject.src = '/pics/edit-pencil_sm_gray.png';
	}
	else
	{
		imgObject.src = '/pics/edit-pencil_sm.gif';
	}
	return;
}

function getValueForObject(obj)
{
	if (obj.value)
	{
		return obj.value;
	}
	else if (obj.innerText)
	{
		return obj.innerText;
	}
	else
	{
		if (obj.textContent)
		{
			return obj.textContent;
		}
		else
		{
			return '';
		}	
	}
}

function stripTags(instring)
{
	return instring.replace(/(<([^>]+)>)/ig,"");
}

function setFwikiSort(column, url)
{
	var ckey = 'fwikiBrowseSortColumn';
	var ckey2 = 'fwikiBrowseSortOrder';
	
	var col = getCookie(ckey);
	var dir = getCookie(ckey2);
	
	if (col === column)
	{
		if (dir === 'DESC')
		{
			setCookie(ckey2, 'ASC');
		}
		else
		{
			setCookie(ckey2, 'DESC');
		}
	}
	else
	{
		setCookie(ckey, column);
		setCookie(ckey2, 'DESC');
	}
	window.location.href=window.location.href;
	window.location.reload();
}


function fwikiEdit (itemID, fieldName, event)
{
	var agt = navigator.userAgent.toLowerCase();
	var is_ie = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
	
	LibraryThing.fwiki.controls[itemID] = $(itemID);
	var groupElement = $(itemID);
	groupElement.fieldName = fieldName;
	//var items = groupElement.getElementsByClassName('fwikiItem');
	var items = groupElement.select('.fwikiItem');
	LibraryThing.fwiki.controls[itemID].items = items;
	LibraryThing.fwiki.controls[itemID].pencilControl = $('pencil-'+itemID);
	var pencilControl = LibraryThing.fwiki.controls[itemID].pencilControl;
	pencilControl.hideFocus=true;
	
	var bottomControlText = '<div class="fwikiBottomControls"></div>';
	var itemType = groupElement.readAttribute('itemType');
	var itemNum = groupElement.readAttribute('itemNum');
	var fieldType = groupElement.readAttribute('fieldType');
	var uiType = groupElement.readAttribute('uitype');
	var allowmultiple = groupElement.readAttribute('allowmultiple');
	var hint = groupElement.readAttribute('hint');
	var lang = groupElement.readAttribute('ltlang');
	var hashistory = groupElement.readAttribute('hashistory');
	
	// Figure out why IE sucks so bad.
	if ((allowmultiple !== 1) && (allowmultiple !== 0))
	{
		if (groupElement.attributes.allowmultiple)
		{
			allowmultiple = groupElement.attributes.allowmultiple.nodeValue;
		}
	}
	if ((hashistory != 1) && (hashistory != 0))
	{
		if (groupElement.attributes.hashistory)
		{
			hashistory = groupElement.attributes.hashistory.nodeValue;
		}
	}
	
	
	groupElement.fieldType = fieldType;
	groupElement.itemType = itemType;
	groupElement.itemNum = itemNum;
	groupElement.lang = lang;
	groupElement.hint = hint;
	groupElement.uiType = uiType;
	groupElement.allowmultiple = allowmultiple;
	groupElement.hashistory = hashistory;
	
	
	var itemsLen = items.length;
	
	for(var i=0; i < items.length; i++) {
	//items.each(function(item) {
		var item = items[i];
		item.originalClassName = item.className;
		//var itemTextNodeList = item.select('.fwikiItemText');
		//var itemTextDiv = item.getElementsByClassName('fwikiItemText')[0];
		var itemTextDiv = item.select('.fwikiItemText')[0];
		var atomicValueDiv = itemTextDiv.select('.fwikiAtomicValue')[0];
		if (!groupElement.inEditState) // put the item in edit state
		{
			var itdata = '';
			//alert(itemTextDiv.innerHTML);
			itemTextDiv.originalHTML = itemTextDiv.innerHTML;
			itemTextDiv.originalClassName = itemTextDiv.className;
			item.originalClassName = item.className;
			itemTextDiv.originalOndblclick = itemTextDiv.ondblclick;
			itemTextDiv.ondblclick = function() {return;};
		}
			
		itemTextDiv.addClassName('fwikiEditItem');

		
		if ((uiType == 1) || (uiType == 3)) 
		{
			var input;
			if (groupElement.uiType == 3)
			{
				input = document.createElement('textarea');
			}
			else
			{
				input = document.createElement('input');
				input.type = 'text';
			}
			//var input = document.createElement('textarea');
			Element.extend(input);
			input.className = 'fwikiFormInputItem';
			if (uiType == 3)
			{
				$(input).addClassName('fwikiFormInputItemLong');
			}
			//input.value = getValueForObject(atomicValueDiv);//itemTextDiv.textContent; 
			if (uiType == 3)
			{
				input.value = atomicValueDiv.innerHTML;
			}
			else
			{
				input.value = getValueForObject(atomicValueDiv);
			}
			input.originalValue = input.value;
			if (LibraryThing.fwiki.useAutocompleteMenu)
			{
				input.itemDetails = {
						itemID: itemID,
						fieldType: fieldType,
						itemType: itemType
					};
				// DON'T autocomplete these types or UIs
				if 	(
					   (uiType != 3) 
					&& (fieldType != 8) 
					&& (fieldType != 12) 
					&& (fieldType != 5)
					&& (fieldType != 21)
					&& (fieldType != 22)
					)
				{
					$(input).observe('keyup', function(e) { autoCompleteFwikiField(e); });
				}
			}
			itemTextDiv.innerHTML = '';
			itemTextDiv.appendChild(input);
		}
		// Right now it just does gender, but we can alter this to do a variable amount of radios with
		// possible values passed in from the inc_wiki builder code as a JSON object attached to the group element.
		else if (uiType == 2) // radio buttons
		{
			groupElement.originalValue = getValueForObject(itemTextDiv);
			
			var radioForm = $(document.createElement('form'));
			var uniqueida = LT_GetRandomID(8);
			radioForm.id = uniqueida;
			radioForm.addClassName('fwikiForm');
			itemTextDiv.innerHTML = '';
			itemTextDiv.appendChild(radioForm);
			
			var labels;
			
			if (fieldType == 5) // genders
			{
				labels = ['male', 'female', 'other/contested/unknown', 'n/a'];
			}
			
			var labelCount = labels.length;
			for ( var li = 0; li < labelCount; li++ ) 
			{
				var label = labels[li];
				if (is_ie)
				{
					input = $(document.createElement('<input name="r'+groupElement.fieldType+'">'));
				}
				else
				{
					input = $(document.createElement('input'));
				}
				input.className = 'fwikiFormInputItem fwikiRadio';
				if (groupElement.originalValue == label)
				{
					input.checked = true;
				}
				input.type = 'radio';
				input.name = 'r'+groupElement.fieldType;
				
				input.value = label;
				
				var mtext = $(document.createElement('span'));
				mtext.className = 'fwikiRadioText';
				mtext.innerHTML = label;
				
				
				var containerDiv = $(document.createElement('div'));
				containerDiv.className = 'fwikiRadioContainer';
				radioForm.appendChild(containerDiv);
				containerDiv.appendChild(input);
				containerDiv.appendChild(mtext);
			}
		}
	}
	
	// Toggle pencil action
	if (groupElement.inEditState)
	{
		returnToNormal(true, false);
	}
	else // CREATE BOTTOM CONTROLS HERE
	{
		groupElement.inEditState = true;
		
		// FIX THIS. Need to turn on the edit pencil image  here.
		//pencilControl.image = 
		pencilControl.originalOnclick = pencilControl.onclick;
		pencilControl.onclick = function() 
		{
			returnToNormal(true, false);
			return false;
		};
		
		
		
		// New edit buttons on bottom
		var bottomControls = document.createElement('div');
		Element.extend(bottomControls);
		LibraryThing.fwiki.controls[itemID].bottomControls = bottomControls;
		bottomControls.addClassName('fwikiBottomControls');
		
		var hintdiv = $(document.createElement('div'));
		hintdiv.addClassName('fwikiHint');
		hintdiv.innerHTML = hint;
		
		groupElement.appendChild(hintdiv);
		var buttons = '<div title="Save changes" class="fwikiButton fwikiSubmitButton" id="fwikiSubmit-'+itemID+'">Save</div>';
		if (allowmultiple == 1)
		{
			buttons += '<div title="Add new data line" class="fwikiButton fwikiPlusButton" id="fwikiPlus-'+itemID+'">+</div>';
		}
		buttons += '<div title="Discard changes" class="fwikiButton fwikiCancelButton" id="fwikiCancel-'+itemID+'">Cancel</div>';
		if (hashistory == 1)
		{
			buttons += '<div title="View edit history for this data" class="fwikiButton fwikiHistoryButton" id="fwikiHistory-'+itemID+'">History</a></div>';
		}
		
		
		bottomControls.innerHTML = buttons;
		groupElement.appendChild(bottomControls);
		
		var submitButton = $('fwikiSubmit-'+itemID);
		var cancelButton = $('fwikiCancel-'+itemID);
		var historyButton = $('fwikiHistory-'+itemID);
		var plusButton = $('fwikiPlus-'+itemID);
		
		//Click actions for bottom controls
		if (plusButton)
		{
			plusButton.onclick = function()
			{
				// Need to add another row to the display. ugh.
				// The next line might not be right. Might need to go up one more level.
				var parentElement = groupElement.parentNode;
				
				var newField = document.createElement('div');
				Element.extend(newField);
				newField.className = 'fwikiItem';
				newField.isNewItem = true;
				
				var itemInt = document.createElement('div');
				Element.extend(itemInt);
				itemInt.className = 'fwikiItemText';
				itemInt.originalClassName = 'fwikiItemText';
				itemInt.addClassName('fwikiEditItem');
				
				itemInt.Ondblclick = function () {};
				itemInt.originalOndblclick = function() { fwikiEdit("'"+groupElement.name+"'", groupElement.fieldname, event); } ;
				
				var itemInput;
				if (groupElement.uiType == 3)
				{
					itemInput = document.createElement('textarea');
				}
				else
				{
					itemInput = document.createElement('input');
					itemInput.type = 'text';
				}
				//var input = document.createElement('textarea');
				Element.extend(itemInput);
				itemInput.className = 'fwikiFormInputItem';
				if (uiType == 3)
				{
					$(itemInput).addClassName('fwikiFormInputItemLong');
				}

				//var itemInput = document.createElement('input');
				//Element.extend(itemInput);
				//itemInput.addClassName('fwikiFormInputItem');				
				//itemInput.className = 'fwikiFormInputItem';
				//itemInput.type = 'text';
				itemInput.value = '';
				
				//itemInput.onkeyup = function(event) { autoCompleteFwikiField(event,itemID,fieldType,itemType,itemInput.value); };
				itemInt.appendChild(itemInput);
				
				if (LibraryThing.fwiki.useAutocompleteMenu)
				{
					itemInput.itemDetails = {
						itemID: itemID,
						fieldType: fieldType,
						itemType: itemType
					};
					$(itemInput).observe('keyup', function(e) { autoCompleteFwikiField(e); });
				}
				
				
				newField.appendChild(itemInt);
				groupElement.insertBefore(newField, hintdiv);
				items.push(newField);
				itemInput.focus();
			};
		}
		if (historyButton)
		{
			historyButton.onclick = function()
			{
				var uniqueid = LT_GetRandomID(32);
				var url = '/commonknowledge/changelog.php?item='+itemNum+'&type='+itemType+'&field='+fieldType;//+'&uid='+uniqueid;
				gotoaURL(url);
				
				var params = {
					itemID: itemID,
					uniqueid: uniqueid
				};
				
			};
		}
		submitButton.onclick = function() { submitChanges(); }; 
		cancelButton.onclick = function() { returnToNormal(true, false); };
		
		groupElement.LTsubmit = function() { submitChanges(); };
	}
	
	
	
	function submitChanges()
		{
			submitButton.originalOnClick = submitButton.onclick;
			submitButton.onclick = function() {};
			var fieldVals = [];
			var concatvals = '';
			var tempCRC = null;
			var inputs = $(groupElement).select('.fwikiFormInputItem');
			
			for(var i=0; i < inputs.length; i++) {
				var item = inputs[i];
				if  ( 
						(groupElement.uiType == 1)
					|| (groupElement.uiType == 3) 
					)// text
				{
					var fval = getValueForObject(item);
					
					if (fval.replace(' ','') !== '')
					{
						//fieldVals.push(item.value);
						if (groupElement.uiType != 3)
						{
							fval = stripTags(fval);
						}
						fieldVals.push(fval);
						concatvals += fval;
					}
				}
				else if (groupElement.uiType == 2) // radio buttons
				{
					if (item.checked)
					{
						if (item.value == 'on')
						{
							fieldVals.push('male');
						}
						else
						{
							fieldVals.push(item.value);
						}
					}
				}
			}
			var uid = LT_GetRandomID(5);
			var url = "/commonknowledge/ajax_updateFwikiItem.php";
			var fieldValsReady = fieldVals.toJSON();
			var crc = '';//crc32(concatvals);
			var params = {
				itemType: itemType,
				itemNum: itemNum,
				fieldName: fieldName,
				fieldType: fieldType,
				lang: lang,
				values: fieldValsReady,
				uniqueid: uid,
				checksum: crc
			};
			var responseFunction = function(t) 
			{
				var rt = t.responseText.strip();
				if (t.responseText == '0') // ERROR during save!
				{
					//returnToNormal(true, true);
					submitButton.originalOnClick = submitButton.onclick;
					submitButton.onclick = function() {};
				}
				else // SUCCESS -----
				{
					//var validatedValues = t.responseText.evalJSON(true);
					returnToNormal(false, false, t.responseText);
					
					// find other items on the page that match this class template form 'fwiki-fieldname-text'
					// and change their contents to match the new values.
					
				}
			};
			
			basic_ajax(url,params,responseFunction);
		}
	
	
	function formatFwikiLink(text)
	{
		// $link = '/commonknowledge/browse.php?field='.$fieldType.'&amp;q='.urlencode($val);
		text = text.replace(' ','');
		text = text.toLowerCase();
		text = encodeURIComponent(text);
		return text;
	}
	
	
	function returnToNormal(cancel, override, vvalues) 
	{
	//alert('z');
		var confirmVal = false;
		if (vvalues)
		{
			var validatedValues = vvalues.evalJSON(true);
		}
		var somethingChanged = false;
		LibraryThing.fwiki.controls[itemID] = $(itemID);
		var groupElement = LibraryThing.fwiki.controls[itemID];
		var items = groupElement.select('.fwikiItemText');
		var hintdiv = groupElement.select('.fwikiHint')[0];
		var bottomControls = groupElement.bottomControls;
		var pencilControl  = groupElement.pencilControl;
		items = groupElement.items;
		var lightboxCanceled = false;
		
		if (cancel)
		{
			// this just turns the lightbox off if there is one
			if (LibraryThing && LibraryThing.lightbox && LibraryThing.lightbox.active)
			{
				LibraryThing.lightbox.off(0);
				lightboxCanceled = true;
			}
			
			var inputItems = groupElement.select('.fwikiFormInputItem');
			for(var i=0; i < inputItems.length; i++) 
			{
				var ii = inputItems[i];
				if (ii.value != ii.originalValue)
				{
					somethingChanged = true;
				}
			}
		
			if (!override)
			{
				if (somethingChanged)
				{
					if (LibraryThing.fwiki.confirmCancels)
					{
						confirmVal = confirm('You have unsaved changes.\nDo you want to save them?');
					}
				}
				if (confirmVal)
				{
					submitChanges();
					return;
				}
			}
		}
		
		destroyAutocompleteMenu(itemID);
		
		if (bottomControls)
		{
			//Element.extend(bottomControls);
			//bottomControls.parentNode.removeChild(bottomControls);
			$(bottomControls).remove();
		}
		if (hintdiv)
		{
			//hintdiv.parentNode.removeChild(hintdiv);
			$(hintdiv).remove();
		}
		
		pencilControl.onclick = pencilControl.originalOnclick;
		groupElement.inEditState = false;
		var itemCounter = 0;
		
		for(var i=0; i < items.length; i++) 
		{
			var item = items[i];
			var itemTextDiv = item.firstChild;
			//var atomicValueDiv = itemTextDiv.getElementsByClassName('fwikiAtomicValue')[0];
			//var item = item;
			var children = item.childNodes;
			var inputItem = item.childNodes[0].childNodes[0];
			if (cancel) // cancel
			{
				if (item.isNewItem)
				{
					// remove the item if it was newly added
					item.parentNode.removeChild(item);
				}
				else
				{
					itemTextDiv.innerHTML = itemTextDiv.originalHTML;
				}
			}
			else // save
			{
				var tempNewVal;
				var validatedValue = '';
				if (validatedValues[itemCounter])
				{
					validatedValue = validatedValues[itemCounter];
				}
				var inputs = $(item).select('.fwikiFormInputItem');
				if (inputs.length > 0)
				{
					if ( (inputs[0].type == 'text') || (inputs[0].type == 'textarea') )
					{
						itemTextDiv.newHTML = validatedValue;
					}
					else if (inputs[0].type == 'radio')
					{
						var il = inputs.length;
						for(var i=0; i < inputs.length; i++) 
						{
							var singleInput = inputs[i];
							if (singleInput.checked)
							{
								if (singleInput.value == 'on')
									itemTextDiv.newHTML = 'male';
								else
									itemTextDiv.newHTML = singleInput.value;
								//throw $break;
							}
						}
					}
				
					//itemTextDiv.newHTML = item.getElementsByClassName('fwikiFormInputItem')[0].value;
					if ( (itemCounter > 0) && (itemTextDiv.newHTML.replace(' ','') == '') )
					{
						item.parentNode.removeChild(item);
					}
					else
					{
						// Need to make a good link here.
						// like this: $link = '/commonknowledge/browse.php?field='.$fieldType.'&amp;q='.urlencode($val);
						var catchAll = true;
						var fn = groupElement.fieldName;
						var f = groupElement.fieldType;
						var itemLink = '/commonknowledge/';
						var itemLinkLast = stripParenSuffix(itemTextDiv.newHTML);

						itemLink += 'search.php?q='+itemLinkLast+'&f='+f+'&exact=1';
						
						//itemLink += formatFwikiLink(itemTextDiv.newHTML);
						if (groupElement.uiType == 3)
						{
							itemTextDiv.innerHTML = '<div class="fwikiAtomicValue">'+itemTextDiv.newHTML+'</div>';
							catchAll = false;
						}
						else if ((groupElement.fieldType == 33) && (groupElement.itemType == 2)) 
						{
							itemTextDiv.innerHTML = '<div class="fwikiAtomicValue">'+itemTextDiv.newHTML+'</div>';
							catchAll = false;
						}
						else
						{
							if (groupElement.fieldType == 1) 
							{
								itemLink = '/publisherseditor/'+itemLinkLast;
							}
							if (groupElement.fieldType == 2) 
							{
								itemLink = '/place/'+itemLinkLast;
							}
							if (groupElement.fieldType == 3)
							{
								itemLink = '/character/'+itemLinkLast;
							}
							if ((groupElement.fieldType == 4) && (groupElement.itemType == 1)) 
							{
								itemLink = '/bookaward/'+itemLinkLast;
							}
							/*
							if ((groupElement.fieldType == 4) && (groupElement.itemType == 2)) 
							{
								itemLink = '/authoraward/'+itemLinkLast;
							}
							*/
							else if (groupElement.fieldType == 23) // series links are different...they link to a series page
							{
								itemLink = '/series/'+itemLinkLast;
							}
							itemTextDiv.innerHTML = '<div class="fwikiAtomicValue">'+'<a href="'+itemLink+'">'+itemTextDiv.newHTML+'</a>'+'</div>';
							catchAll = false;
						}
						
						if (catchAll)
						{
							itemTextDiv.innerHTML = '<div class="fwikiAtomicValue">'+'<a href="'+itemLink+'">'+itemTextDiv.newHTML+'</a>'+'</div>';
						}
					}
				}
			}
			
			if (itemTextDiv.originalClassName)
			{
				itemTextDiv.className = itemTextDiv.originalClassName;
				itemTextDiv.removeClassName = 'fwikiEditItem';
				itemTextDiv.className = 'fwikiItemText';
			}
			if (itemTextDiv.originalOndblclick)
			{
				itemTextDiv.ondblclick = itemTextDiv.originalOndblclick;
			}
			if (item.originalClassName)
			{
				item.className = item.originalClassName;
			}
			if (item.isNewItem)
			{
				item.isNewItem = false;
			}
			
			// remove autocomplete menu
			destroyAutocompleteMenu(itemID);
			itemCounter++;
		}
		if (LibraryThing && LibraryThing.lightbox && LibraryThing.lightbox.active && !lightboxCanceled)
		{
			LibraryThing.lightbox.off(1);
		}
		
	} // returnToNormal function
	
	
	
	return false;
}


// wikitype will be an int which represents something like 'author', 'work', 'editiion', 'venue', etc.
// fieldType will be an int which represents 'Character name', 'Location' etc.
// value is the current value of the form field as typed by the user.
//function autoCompleteFwikiField(event, itemID,fieldType,wikiType,value)
function autoCompleteFwikiField(event)
{
	/*
	itemInput.itemDetails = {
					itemID: itemID,
					fieldType: fieldType,
					itemType: itemType
				};
	*/
	event = validateEvent(event);
	var inputElement = $(eventTrigger(event));
	var value = inputElement.value;
	var itemID = inputElement.itemDetails.itemID;
	var fieldType = inputElement.itemDetails.fieldType;
	var wikiType = inputElement.itemDetails.itemType;
	
	if (value == '')
	{
		destroyAutocompleteMenu(itemID);
		return;
	}
	
	destroyAllACMenus(itemID);
	
	var groupElement = LibraryThing.fwiki.controls[itemID] = $(itemID);
	if (!LibraryThing.fwiki.autocompleteMenus)
		LibraryThing.fwiki.autocompleteMenus = new Array;
	var acmenus = LibraryThing.fwiki.autocompleteMenus;
	var uid = LT_GetRandomID(10);
	var url = "/commonknowledge/ajax_autocompleteFwikiField.php";
	var params = {
		wt: wikiType,
		q: value,
		ft: fieldType, 
		uniqueid: uid
	};
	LibraryThing.fwiki.currentMenuID = params.uniqueid;
	inputElement.params = params;
	inputElement.changedByMenu = false;
	
	inputElement.responseFunction = function(t) 
	{
		if (t.responseText == '0')
		{
			// nothing found matching the text in the ajax call
			// remove autocomplete menu
			destroyAutocompleteMenu(itemID);
		}
		else
		{
			// an array of strings that match the currently typed substring
			var jsonData = t.responseText.evalJSON(true);
			var uid = jsonData.uid;
			var valarray = jsonData.data;
			
			// If another request has been issued since this one, don't honor this one
			// This takes care of slow responses, etc.
			if (uid != LibraryThing.fwiki.currentMenuID)
			{
				destroyAutocompleteMenu(uid);
				return;
			}
			
			
			
			// if there are returned values, put them in a drop down menu
			var keysExist = $H(valarray).keys().length;
			if (keysExist)
			{
				var acmenu = null;
				if (!acmenus[itemID])
				{
					acmenu = document.createElement('div');
					Element.extend(acmenu);
					acmenus[itemID] = acmenu;
					acmenu.className = 'fwikiAutoMenu';
					acmenu.style.zIndex = 5000;
					acmenu.style.opacity = 0.9;
					document.body.appendChild(acmenu);
				}
				else
				{
					acmenu = acmenus[itemID];
				}
				// Need to empty the menu of previous entries...
				var menuItems = $(acmenu).childNodes;
				if (menuItems.length)
				{
					var men = $(acmenu);
					var ce = acmenu.childElements();
					for(var i=0; i < ce.length; i++) 
					{
						var mi = ce[i];
						men.removeChild(mi);
					}
				}
				
				// Now fill the menu with the new values
				//alert(valarray[0]);
				//for(var i=0; i < valarray.length; i++) 
				for( var valkey in valarray)
				{
					var rank = valarray[valkey];
					var acmenuItem = document.createElement('div');
					Element.extend(acmenuItem);
					$(acmenuItem).addClassName('fwikiAutoMenuItem');
					
					
					// The ranklines should be done in PHP using the ranking display code. It will be faster and easier to maintain.
					//var rank = valitem.value;
					var cc;
					var ranklines = '';
					for (cc = 0; cc < rank; cc++)
					{
						ranklines += '<img class="fwikiRankline" alt="" src="/pics/rankline.gif">';
					}
					var rankspan = '<span title="relative popularity" class="fwikiRanks">'+ranklines+'</span>';
					acmenuItem.innerHTML = valkey +' '+ rankspan;
					acmenuItem.menuKey = valkey;
					
					//acmenuItem.innerHTML = valitem.key;
					acmenuItem.value = valkey;
					
					acmenu.appendChild(acmenuItem);					
					$(acmenuItem).observe('click', function() {
						inputElement.value = this.menuKey; 
						inputElement.changedByMenu = true; 
						destroyAutocompleteMenu(itemID); 
					}, false);
					
				}
				//onclick for document body. This should catch all clicks outside a menu to deactivate menus.
				Event.observe(document, 'click', function() { destroyAutocompleteMenu(itemID); }, true );
				acmenu.currentSelection = null;
				
				
				// Position the menu
				var inputOffset = getPosition(inputElement);
				var ie = (navigator.appName == "Microsoft Internet Explorer") ? true : false;
				
				var mpos = 'absolute';
				
				if (ie)
				{
					acmenu.style.position = mpos;
					acmenu.style.marginLeft = inputOffset.x - 9 + 'px';
					acmenu.style.marginTop = inputOffset.y + 13 + 'px';
				}
				else
				{
					
					if (LibraryThing.lightbox)
					{
						if (LibraryThing.lightbox.initialized)
						{
							mpos = 'fixed';
						}
					}
					acmenu.style.position = mpos;
					acmenu.style.top = inputOffset.y + 23 + 'px';
					acmenu.style.left = inputOffset.x + 1 + 'px';
				}
				
				acmenu.style.display = 'block';
			}
		}
		
		
	};
	

	// Loads the data into the autocomplete menu using an ajax call.
	inputElement.acFunction = {
		fx:  function() {
			if (inputElement.changedByMenu)
			{
				inputElement.changedByMenu = false;
			}
			else
			{
				inputElement.params['q'] = inputElement.value;
				basic_ajax(url,inputElement.params,inputElement.responseFunction);
			}
			
		}
	
	};
	
	// This is used to check the menu at regular intervals for changes.
	// It's easier on the server, but it has some bad side-effects, namely
	// that the menu is reopened when a user selects something from it 
	// because it changes the value in the input when it does that, which
	// triggers this function again. 
	//
	//Side effects seem to be solved (CH 10-23-07)
	function addACMenuObserver()
	{
		if (!inputElement.observer)
		{
			inputElement.observer = new Form.Element.Observer(
						inputElement,
						1,  //  seconds between menu updates.
						inputElement.acFunction.fx // if it has changed then do this function
				);
		}
	}
	addACMenuObserver();
	
	
	if	((event.keyCode == 9) /* tab: complete using the selected item */
		|| (event.keyCode == 39) /* right */
		)
	{
		var madeChange = false;
		var acmenu = acmenus[itemID];
		if (acmenu)
		{
			var menuItems = acmenu.childElements();
			var itemcounter = 0;
			if (menuItems.length)
			{
				for(var i=0; i < menuItems.length; i++) 
				{
					var mi = menuItems[i];
				//menuItems.each(function(mi)
				//{
					if (mi.classNames().find(function(s)
						{
							return (s == 'fwikiAutoMenuItemselected');
						}))
					{
						inputElement.value = mi.value;
						madeChange = true;
					}
					else
					{
						itemcounter++;
					}
				}
			}
		}
		
		// Now handle tabbing to next element if there is one...
		if 	(event.keyCode == 9)
		{
			var groupControls = LibraryThing.fwiki.controls[itemID].items;
			var max = groupControls.length;
			for(var i = 1; i < max; i++)
			{
				var testelement = groupControls[i-1].childNodes[0].childNodes[0];
				if (testelement == inputElement)
				{
					//alert('the current element is index: '+i);
					if (i == (max))
					{
						groupControls[0].childNodes[0].childNodes[0].focus();
					}
					else
					{
						groupControls[i].childNodes[0].childNodes[0].focus();
					}
					// Now need to destroy the menu...
					
				}
				
			}			
		}
	}
	else if (event.keyCode == 40) /* down */
	{
		var acmenu = acmenus[itemID];
		if (acmenu)
		{
			var max = acmenu.childNodes.length - 1;
			if (acmenu.currentSelection == null)
			{
				acmenu.currentSelection = 0;
				acmenu.childNodes[acmenu.currentSelection].addClassName('fwikiAutoMenuItemselected');
				inputElement.value = acmenu.childNodes[acmenu.currentSelection].value;
				inputElement.value = inputElement.value;
			}
			else if (acmenu.currentSelection < max)
			{
				acmenu.childNodes[acmenu.currentSelection].removeClassName('fwikiAutoMenuItemselected');
				acmenu.currentSelection++;
				acmenu.childNodes[acmenu.currentSelection].addClassName('fwikiAutoMenuItemselected');
				inputElement.value = acmenu.childNodes[acmenu.currentSelection].value;
				inputElement.value = inputElement.value;
			}
			else if (acmenu.currentSelection >= max)// user has gone down past last item
			{
				inputElement.value = inputElement.userValue;
				acmenu.childNodes[acmenu.currentSelection].removeClassName('fwikiAutoMenuItemselected');
				acmenu.currentSelection = null;
			}
			inputElement.changedByMenu = true;
		}
	}
	else if (event.keyCode == 38) /* up */
	{
		var acmenu = acmenus[itemID];
		if (acmenu)
		{
			var menuItems = acmenu.childElements();
			var max = acmenu.childNodes.length - 1;
			if (acmenu.currentSelection == null)
			{
				// do nothing if there is not a current selection
				acmenu.currentSelection = menuItems.length - 1;
				acmenu.childNodes[acmenu.currentSelection].addClassName('fwikiAutoMenuItemselected');
				inputElement.value = acmenu.childNodes[acmenu.currentSelection].value;
			}
			else if (acmenu.currentSelection > 0)
			{
				acmenu.childNodes[acmenu.currentSelection].removeClassName('fwikiAutoMenuItemselected');
				acmenu.currentSelection--;
				acmenu.childNodes[acmenu.currentSelection].addClassName('fwikiAutoMenuItemselected');
				inputElement.value = acmenu.childNodes[acmenu.currentSelection].value;
			}
			else // user has gone up to the original input item
			{
				inputElement.value = inputElement.userValue;
				acmenu.childNodes[acmenu.currentSelection].removeClassName('fwikiAutoMenuItemselected');
				acmenu.currentSelection = null;
			}
			inputElement.changedByMenu = true;
		}
	}
	
	else if (event.keyCode == 13) /* enter */
	{
		Event.stop(event);
		groupElement.LTsubmit();
	}
	// Ignore these modifier keys
	else if((event.keyCode != 16) /* shift */
		&& 	(event.keyCode != 17) /* control */
		&&	(event.keyCode != 18) /* alt */
		&&	(event.keyCode != 9) /* tab */
		//&&	(event.keyCode != 39) /* right */
		&&	(event.keyCode != 37) /* left */
		)
	{

		inputElement.userValue = inputElement.value;
		
		inputElement.params['q'] = inputElement.value;
		//basic_ajax(url,params,inputElement.responseFunction);
		//alert(event.keyCode);
	}
	
	
	// Kill the menu if there was a change made
	if (madeChange)
	{
		inputElement.changedByMenu = true;
		destroyAutocompleteMenu(itemID);
	}	
}

function manageMenuLock(lock)
{
	if (!lock)
		lock = true;
	
}

function destroyAutocompleteMenu(itemID)
{
	if (LibraryThing.fwiki.autocompleteMenus)
	{
		if (LibraryThing.fwiki.autocompleteMenus[itemID])
		{
			LibraryThing.fwiki.autocompleteMenus[itemID].parentNode.removeChild(LibraryThing.fwiki.autocompleteMenus[itemID]);
			LibraryThing.fwiki.autocompleteMenus[itemID] = null;
		}
	}
}


function getPosition(gp_obj) 
{
	//var ie = (navigator.appName == "Microsoft Internet Explorer") ? true : false;
	//return Element.cumulativeScrollOffset(gp_obj);
	
	var gp_left = 0;
	var gp_top = 0;
	var blech;
	
	while (gp_obj.offsetParent){
		gp_left += gp_obj.offsetLeft;
		gp_top  += gp_obj.offsetTop;
		//gp_left -= gp_obj.scrollLeft;
		//gp_top  -= gp_obj.scrollTop;
		gp_obj   = gp_obj.offsetParent;
		blech = 'blech';
	}
	gp_left += gp_obj.offsetLeft;
	gp_top  += gp_obj.offsetTop;
	
	blech = 'blech1';
	return { x:gp_left, y:gp_top};
}

function fwikiRollBack(wiki_id, wikiversion_id, rollbackUIItem)
{
	var uid = LT_GetRandomID(32);
	var url = "/commonknowledge/ajax_rollBackFwikiItem.php";
	
	var params = {
		wiki_id: wiki_id,
		wikiversion_id: wikiversion_id,
		uniqueid: uid
	};
	
	var rbitem = $(rollbackUIItem);
	rbitem.oInnerHTML = rbitem.innerHTML;
	rbitem.oStyle = rbitem.style;
	rbitem.innerHTML = 'working';
	
	var responseFunction = function(t) 
	{
		if (t.responseText == '\n1')
		{
			// It worked...do, well, whatever. Reload page?
			//gotoaURL();
			rbitem.innerHTML = 'saved';
			//rbitem.style = rbitem.oStyle;
		}
		else
		{
			rbitem.innerHTML = rbitem.oInnerHTML;
			//rbitem.style = rbitem.oStyle;
			//submitButton.originalOnClick = submitButton.onclick;
			//submitButton.onclick = function() {};
		}
	};
	
	basic_ajax(url,params,responseFunction);
	return;
}


function destroyAllACMenus(itemID)
{
	/*
	var menus = LibraryThing.fwiki.autocompleteMenus;
	var i = 0;
	if (menus)
	{
		var mhash = $H(menus);
		
		for(var i=0; i < mhash.length; i++) 
		{
			var acmi = mhash[i];
			var m = acmi;
		}
	}
	*/
}

function stripParenSuffix(text)
{
	if (text)
	{
		var ppos = text.indexOf('(');
		if (ppos > 0)
		{
			text = text.substring(0,ppos);
		}
		text = text.strip();
	}
	return text;
}








function searchBoxOnLoad()
{
	var sb = $('ltcksearchbox');
	if (sb)
	{
		if (sb.value == ckSearchPlaceholder) 
			sb.style.color = '#999';
		sb.onfocus = function() {
			if (sb.value == ckSearchPlaceholder) sb.value = '';
			sb.style.color = '#222';
		}
		sb.onblur = function() {
			if (sb.value != '') return;
			sb.style.color = '#999';
			sb.value = ckSearchPlaceholder;
		}
	}
}


function handleCKSearchMenu(e)
{
	var searchMenu = $('ltckSearchModeMenu');
	//var loc = document.location;
	var searchmode = searchMenu.value;
	LibraryThing.setCookie("fwiki:searchmode", searchmode);
}


function submitCKSearch() 
{
	var searchForm = $('ltckSearchForm');
	var searchMenu = $('ltckSearchModeMenu');
	var searchbox  = $('ltcksearchbox');
	var loc = document.location;
	var searchmode = searchMenu.value;
	var newloc;
	var sbval = searchbox.value;
	var uid = LT_GetRandomID(5);
	
	//disable_button($('ltckSearchButton'),\'Searching...\');
	
	// Only do the search if there was something to search for.
	if ((sbval != '') && (sbval != ckSearchPlaceholder) )
	{
		newloc = "/commonknowledge/search.php?";
		
		newloc += 'q='+encodeURIComponent(sbval);
		if ((searchmode != 'All') && (searchmode != 'All2') && (searchmode != 'All3'))
		{
			newloc += "&f="+searchmode;
		}
		// Add uniqueid so that the search won't cache
		newloc += '&uid='+uid;

		var theDoc = document;
		var myWin = window;
		window.top.document.location = newloc;
	}
}

function showHiddenfieldcontent(id)
{
var linkid = 'link_'+id;
toggleShowHide(id, 'block');
toggleShowHide(linkid, 'block');
}