// JavaScript Document

var specialCharacterDrop = false;
var clientPC = navigator.userAgent.toLowerCase(); // Get client info
var is_gecko = ((clientPC.indexOf('gecko')!=-1) && (clientPC.indexOf('spoofer')==-1)
                && (clientPC.indexOf('khtml') == -1) && (clientPC.indexOf('netscape/7.0')==-1));
var is_safari = ((clientPC.indexOf('applewebkit')!=-1) && (clientPC.indexOf('spoofer')==-1));
var is_khtml = (navigator.vendor == 'KDE' || ( document.childNodes && !document.all && !navigator.taintEnabled ));
if (clientPC.indexOf('opera') != -1) {
	var is_opera = true;
	var is_opera_preseven = (window.opera && !document.childNodes);
	var is_opera_seven = (window.opera && document.childNodes);
}



var suggestFoils = function(form) {
	
	suggestionWindow.loadWindow();	
	
	var paramStr = Form.serialize(form);
	    paramStr += '&action=facteditor_suggest_foils';
	
  var get = new Ajax.Request(jsconfig.ajax,
														 {
															 method: 'POST',
															 parameters: paramStr,
															 onComplete: function(response_obj) {
																  var response = JSON.parse(response_obj.responseText); 
																	suggestionWindow.loadSuggestions(response.set);
															 }
														 });
	
}

var suggestionWindow = new function() {
	
	this.loadSuggestions = function(suggestions) {
		if (!$('suggestion_window'+'_inner')) return false;		
		$('suggestion_window'+'_inner').innerHTML = '';
		if (suggestions.length < 1) {
			$('suggestion_window'+'_inner').innerHTML = '<div>Sorry, no suggestions! Try entering in a few foils or a variable.</div>';
		}
		var text = Builder.node('DIV',{},[suggestions.join(', ')]);
		$('suggestion_window'+'_inner').appendChild(text); 
	}	

	this.loadWindow = function() {
		if ($('suggestion_window')) { Element.remove('suggestion_window'); }
			var win 		= new Window();
					win.id = 'suggestion_window';
					win.title = 'Foil Suggestions';
					win.loading = true;					
					win.create();		
	}

}


var commonjs = new common_dom_functions();

	// apply tagOpen/tagClose to selection in textarea,
	// use sampleText instead of selection if there is none
	// copied and adapted from phpBB
var	insertTags = function(tagOpen, tagClose, sampleText, txtarea) {	
			if (!txtarea)
			{			
				var areas = document.getElementsByTagName('textarea');
				if (areas.length < 1) return;
				var txtarea = areas[0];
			}
			else
			{
				var txtarea = $(txtarea);
			}
	
		// IE
		if (document.selection  && !is_gecko) {
			var theSelection = document.selection.createRange().text;
			if (!theSelection)
				theSelection=sampleText;
			txtarea.focus();
			if (theSelection.charAt(theSelection.length - 1) == " ") { // exclude ending space char, if any
				theSelection = theSelection.substring(0, theSelection.length - 1);
				document.selection.createRange().text = tagOpen + theSelection + tagClose + " ";
			} else {
				document.selection.createRange().text = tagOpen + theSelection + tagClose;
			}
	
		// Mozilla
		} else if(txtarea.selectionStart || txtarea.selectionStart == '0') {
			var replaced = false;
			var startPos = txtarea.selectionStart;
			var endPos = txtarea.selectionEnd;
			if (endPos-startPos)
				replaced = true;
			var scrollTop = txtarea.scrollTop;
			var myText = (txtarea.value).substring(startPos, endPos);
			if (!myText)
				myText=sampleText;
			if (myText.charAt(myText.length - 1) == " ") { // exclude ending space char, if any
				subst = tagOpen + myText.substring(0, (myText.length - 1)) + tagClose + " ";
			} else {
				subst = tagOpen + myText + tagClose;
			}
			txtarea.value = txtarea.value.substring(0, startPos) + subst +
				txtarea.value.substring(endPos, txtarea.value.length);
			txtarea.focus();
			//set new selection
			if (replaced) {
				var cPos = startPos+(tagOpen.length+myText.length+tagClose.length);
				txtarea.selectionStart = cPos;
				txtarea.selectionEnd = cPos;
			} else {
				txtarea.selectionStart = startPos+tagOpen.length;
				txtarea.selectionEnd = startPos+tagOpen.length+myText.length;
			}
			txtarea.scrollTop = scrollTop;
	
		// All other browsers get no toolbar.
		// There was previously support for a crippled "help"
		// bar, but that caused more problems than it solved.
		}
		// reposition cursor if possible
		if (txtarea.createTextRange)
			txtarea.caretPos = document.selection.createRange().duplicate();
	}	
	
function get_selection(txtarea)
{
	myText = '';
			if (!txtarea)
			{			
				var areas = document.getElementsByTagName('textarea');
				var txtarea = areas[0];
			}
			else
			{
				var txtarea = $(txtarea);
			}
	
		// IE
		if (document.selection  && !is_gecko) {
			var myText = document.selection.createRange().text;
			}
	
		// Mozilla
		 else if(txtarea.selectionStart || txtarea.selectionStart == '0') {
			var startPos = txtarea.selectionStart;
			var endPos = txtarea.selectionEnd;
			var myText = (txtarea.value).substring(startPos, endPos);
		}
		
		return myText;
	
}

function common_dom_functions()
{
	this.jslink = function(linktext,properties)
	{
		var thelink = document.createElement('A');
				thelink.href = 'javascript:void(0)';
		if (linktext) thelink.appendChild(document.createTextNode(linktext));
		if (properties) for (var i in properties)	thelink[i] = properties[i];		
		return thelink;
	}
	
	this.ajax_loading = function(params) {
		if (!params) var params = {};
		if (!params.container) params.container = 'SPAN';
		if (!params.className) params.className = '';
		if (!params.message) params.message = '';
		var image = Builder.node('IMG',{src:jsconfig.ajax_loading_image});
		var container = Builder.node(params.container,{className:params.className},[image,params.message]);
		return container;
	}
	
	this.text_seperator = function()
	{
		var seperator = document.createTextNode(' | ');
		return seperator;
	}
		
	this.ieScrollbarFix = function()
	{
		var ieScrollbarFix = Builder.node('DIV',{className:'ieScrollbarFix'});
		return ieScrollbarFix;
	}
	
	this.delete_node = function(id)
	{
		if (!xGetElementById(id)) return false;
		var element = xGetElementById(id);
		element.parentNode.removeChild(element);
	}
	
	this.word_confirm = function(message,word)
	{
		var input = prompt(message,'');
		if (!input) return false;
		if ((input.toLowerCase()) != word.toLowerCase()) return false;
		return true;
	}
	
	this.new_element = function(properties)
	{
		if (!properties.element) return false;
		var element = document.createElement(properties.element);
		for (var i in properties)	if (i != 'element') element[i] = properties[i];
		/* will prototype interfere? */
		return element;
	}
	
	this.append_children = function(parent,children)
	{
		for (var i=0;i<children.length;i++)
		{
			parent.appendChild(children[i]);
		}
	}
	
	this.spacer = function() {
		var spacer = Builder.node('DIV',{className:'spacer'});
		return spacer;
	}
	
	this.br = function()
	{
		return this.new_element({element:'BR'});
	}
	
	this.hr = function()
	{
		return Builder.node('HR',{className:'hr1'});
	}
	
	// replaces element calling function with this text
	this.click_replace_me = function(replace_el,text)
	{	
		var new_span = Builder.node('SPAN',{},[text]);
		replace_el.parentNode.insertBefore(new_span, replace_el);
		replace_el.parentNode.removeChild(replace_el);
	}
	
	this.preload_images = function(images)
	{
		images.each( function(image_src, index) {
															  	 var preload_image = new Image();
										     					 preload_image.src = image_src;
																	});		
	}
	
}


//----------------------------------------------------------------------------------
// general
//----------------------------------------------------------------------------------


	function dynamic_table()
	{
		var tbody = Builder.node('TBODY');
		var table = Builder.node('TABLE',{},[tbody]);
		var column_styles = [];		
		
				table.column_className = function(col,className) {
					column_styles[col] = className;
				}		
				
				table.add_row = function(cols) {
						var row = Builder.node('TR');
						for (var i in cols)
						{							
							var columnClass = column_styles[i] ? column_styles[i] : '';
							var contents = cols[i].length ? cols[i] : [cols[i]];
							row.appendChild(Builder.node('TD',{className:columnClass},contents));				
							
						}
						tbody.appendChild(row);
				}	

				table.remove_row = function(row) {
					if (tbody.childNodes[row]) tbody.removeChild(tbody.childNodes[row]);
				}	
				
		return table;
	}

	function urlencode(string)
	{
		return encodeURIComponent(string);
	}

	function ucfirst(string)
	{
		// returns string with first character converted to uppercase
		if (string.length > 0) {
   	  string = string.substr(0, 1).toUpperCase() + string.substr(1);
		}
		return string;
	}

	function number_format(nStr)
	{
		nStr += '';
		var x = nStr.split('.');
		var x1 = x[0];
		var x2 = x.length > 1 ? '.' + x[1] : '';
		var rgx = /(\d+)(\d{3})/;
		while (rgx.test(x1)) {
			x1 = x1.replace(rgx, '$1' + ',' + '$2');
		}
		return x1 + x2;
	}

	function remove_children(element)
	{	
		element.innerHTML = ''; // faster?
		return;
		while (element.childNodes.length > 0) // eek! i hate using while
		{
			element.removeChild(element.firstChild);
		}
	}

	// shuffle the index's of an array
	function shuffleArray(array)
	{
		var temp = new Array();
		var output = new Array();
		var pick = 0;
		var temp1 = 1;
		for (i=0;i<array.length;i++)
		{
			temp1 = 1;
			pick = Math.floor(Math.random()*array.length);
			for (j=0;j<temp.length;j++)
			{
				if (temp[j] == pick) temp1 = 0;
			}
			if (temp1 == 0) i--;
			else temp[i] = pick;
		}
		for (i=0;i<array.length;i++)
		{
			output[i] = array[ (temp[i]) ];
		}
		return output;
	}
		
	// in_arrray - Look For Value In Array	
	function in_array(needle,haystack)
	{
		for(var i=0;i<haystack.length;i++)
		{
			if (haystack[i] == needle) return true;
		}
		return false;
	}
	
	function trim_xs_whitespace(str) 
	{  
		while(str.indexOf('  ') >= 0)
		{
			str = str.replace('  ',' ');
		}
		return str;
	}
	
	// insert element at given key and return array
	// all elements after given key will be shifted
	function insert_into_array(array,key,value)
	{
		new_array = new Array();
		var length = key >= array.length ? (key+1) : array.length;
		for (var i=0;i<length;i++)
		{
			if (i == key)	new_array.push(value);
			if (i < array.length) new_array.push(array[i]);
		}
		return new_array;
	}
	
	// update total points on top of screen
	function update_total_points(new_points)
	{
		if (!$('total_points_display')) return false;
		var points_display = $('total_points_display');
		points_display.innerHTML = number_format(new_points) + ' points';
		new Effect.Highlight(points_display);
	}
	
	function click_replace(element,text)
	{
		var text = Builder.node('SPAN',{},[text]);
				text.onclick = function() {
					this.parentNode.replaceChild(element,this);
				}
		element.parentNode.replaceChild(text,element);
	}
	
	function isMe(user_id)
	{
		var equivalent = (user_id.toLowerCase() == jsconfig.me.toLowerCase()) ? true : false;
		return equivalent;
	}
	
	function link_confirm(url,message) {
		message = message ? message : 'Are you sure?';
		if (!confirm(message)) return false;
		window.location.replace(url);
	}
	
	function get_age(month,day,year)
	{
		// get age from supplied birthday
		var today = new Date();
		var this_month = today.getMonth()+1; // add one because jan = 0
		var age = today.getFullYear() - year;	
		if (month > this_month) age--;
		else if (month == this_month)
		{
			if (day > today.getDate()) age--;
		}
		age = age > 0 ? age : 0;
		return age;
	}
	
	//----------------------------------------------------------------------------------
	// trim
	//----------------------------------------------------------------------------------
	function LTrim(str) { 
	 for (var k=0; k<str.length && str.charAt(k)<=" " ; k++) ;
	 return str.substring(k,str.length);
	}
	function RTrim(str) {
	 for (var j=str.length-1; j>=0 && str.charAt(j)<=" " ; j--) ;
	 return str.substring(0,j+1);
	}
	function Trim(str) {
	 return LTrim(RTrim(str));
	}