function ConvertNSPSToSpace(inText)
{
	return inText.replace(/&nbsp;/g,' ');
}

// parses the string and removes any list index from the beginning
// list indexes: * -
function StripListIndex(inText)
{
	inText = Trim(inText);
	inText = inText.replace(/^[*|-]/, '');
	inText = Trim(inText);					// after removing bullets, trim again
	
	return inText;
}

function Trim(inText)
{
	return inText.replace(/^\s+|\s+$/, '');
}

function GetIndentationOfText(inText)
{
	inText = inText.replace(/\s\s\s\s/g, '\t');
	reg_exp ="/[^\t]/";		// get first non-tab character
	reg_exp=eval(reg_exp);
	
	depth = inText.search(reg_exp);
	if (depth > 0)
		return depth;
	else return 0;
}

function getCheckedValue(radioObj)
{
	if(!radioObj)
		return "";
	var radioLength = radioObj.length;
	if(radioLength == undefined)
		if(radioObj.checked)
			return radioObj.value;
		else return "";
		
	for (var i = 0; i < radioLength; i++)
	{
		if(radioObj[i].checked)
			return radioObj[i].value;
	}
	return "";
}

function ValidateDate(day, month, year)
{
var dteDate;

	dteDate=new Date(year,month,day);				// javascript months start at 0 (0-11 instead of 1-12)
	
	return ((day==dteDate.getDate()) && (month==dteDate.getMonth()) && (year==dteDate.getFullYear()));
}

// date_str is in format: 21/09/2008
// format uses the same syntax as the PHP date function
function GetFormattedDate(format, date_str)
{
	var date_obj = parseDate(date_str, "d/M/y");
	var date_format = "";

	if (!date_obj)
		return "";
	
	switch (format)
	{
	case "M d":		date_format = "NNN d";				// Aug 20
					break;
			
	case "M d, Y":	date_format = "NNN d, y";			// Aug 20, 2004
					break;
			
	case "D d":		date_format = "E d";				// Fri 20
					break;
	}
	return formatDate(date_obj, date_format);
}

function GetFriendlyDate(in_date)
{
	var format = "";
	var date_obj = parseDate(in_date, "d/M/y");
	var today = new Date();
	
	var difference = Math.round((date_obj - today)/(1000*60*60*24));
	
	if (difference == 0)		// today
		return "Today";
	else if (difference == 1)
		return "Tomorrow";
	else if (difference == -1)
		return "Yesterday";
	else if (Math.abs(difference) < 7)
		format = "D d";
	else format = "M d";
	
	formatted_date = GetFormattedDate(format, in_date);
	
	return formatted_date;
}

function IsDatePassed(in_date)
{
	if (in_date == "")
		return false;
		
	var date_obj = parseDate(in_date, "d/M/y");
	var today = new Date();
	
	var difference = Math.round((date_obj - today)/(1000*60*60*24));
	
	if (difference < 0)
		return true;
	else return false;
}

function FormatNumberWithCommas(nStr)
{
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	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 GetScreenHeight()
{
	var screenH = 480;
	if (parseInt(navigator.appVersion) > 3)
		return screen.height;
	else if (navigator.appName == "Netscape" && parseInt(navigator.appVersion) == 3 && navigator.javaEnabled()) 
	{
		var jToolkit = java.awt.Toolkit.getDefaultToolkit();
		var jScreenSize = jToolkit.getScreenSize();
		return jScreenSize.height;
	}
}

function GetScreenWidth()
{
	var screenW = 600;
	if (parseInt(navigator.appVersion) > 3)
		return screen.width;
	else if (navigator.appName == "Netscape" && parseInt(navigator.appVersion) == 3 && navigator.javaEnabled()) 
	{
		var jToolkit = java.awt.Toolkit.getDefaultToolkit();
		var jScreenSize = jToolkit.getScreenSize();
		return jScreenSize.width;
	}
}

function ShowTour()
{
	var h = GetScreenHeight();
	var w = GetScreenWidth();
	var left = (w - 1000) / 2;
	
	window.open('/tour.html', 'popup', 'left='+left+',height='+h+',width=1000,scrollbars');
	
	return false;
}

function isLeapYear(year) 
{
	if (year % 4 != 0) 
		return false;
	else
	{ 
		if (year % 100 != 0) 
			return true;
		else
		{
			if (year % 400 != 0) 
				return false;
			else return true;
		}
	}
}

function addslashes(str) {
	str=str.replace(/\\/g,'\\\\');
	str=str.replace(/\'/g,'\\\'');
	str=str.replace(/\"/g,'\\"');
	str=str.replace(/\0/g,'\\0');
	return str;
}

function stripslashes(str) {
	str=str.replace(/\\'/g,'\'');
	str=str.replace(/\\"/g,'"');
	str=str.replace(/\\0/g,'\0');
	str=str.replace(/\\\\/g,'\\');
	return str;
}

function findPosX(obj)
{
var curleft = 0;
	if(obj.offsetParent)
	{
		while(1) 
		{
			curleft += obj.offsetLeft;
			if(!obj.offsetParent)
				break;
			obj = obj.offsetParent;
		}
	}
	else if(obj.x)
		curleft += obj.x;
	return curleft;
}

function findPosY(obj)
{
var curtop = 0;
	if(obj.offsetParent)
	{
		while(1)
		{
			curtop += obj.offsetTop;
			if(!obj.offsetParent)
				break;
			obj = obj.offsetParent;
		}
	}
	else if(obj.y)
    	curtop += obj.y;
	return curtop;
}

function StripHTMLTags(str, allowed_tags)
{
//alert(str);
	var key = '', allowed = false;
	var matches = [];
	var allowed_array = [];
	var allowed_tag = '';
	var i = 0;
	var k = '';
	var html = '';

	var replacer = function(search, replace, str) {
			return str.split(search).join(replace);
		};

	// Build allowed tags associative array
	if (allowed_tags)
		allowed_array = allowed_tags.match(/([a-zA-Z]+)/gi);
	
	str += '';

	matches = str.match(/(<\/?[\S][^>]*>)/gi);			// Match tags

	for (key in matches)								// Go through all HTML tags
	{
		if (isNaN(key))									// IE7 Hack
			continue;

		html = matches[key].toString();					// Save HTML tag

		allowed = false;								// Is tag not in allowed list? Remove from str!

		for (k in allowed_array)						// Go through all allowed tags
		{
			allowed_tag = allowed_array[k];				// Init
			i = -1;

			if (i != 0) { i = html.toLowerCase().indexOf('<'+allowed_tag+'>');}
			if (i != 0) { i = html.toLowerCase().indexOf('<'+allowed_tag+' ');}
			if (i != 0) { i = html.toLowerCase().indexOf('</'+allowed_tag)   ;}

			if (i == 0)									// Determine
			{
				allowed = true;
				break;
			}
		}

		if (!allowed)
			str = replacer(html, "", str); 				// Custom replace. No regexing
	}
	
//alert(str);
	return str;
}

// REQUIRES browserdetect.js to be included
// property can take the following values: 'browser', 'version', 'OS'.
// if the param isn't passed, we default it to 'browser'
function DetectBrowser(property)
{
	if (property == null)				// in case property parameter isn't passed, we default it to 'browser'
	   property = 'browser';
	
	BrowserDetect.init();
	ret_value = '';
	switch (property)
	{
	case 'browser': ret_value = BrowserDetect.browser;
					break;
	
	case 'version': ret_value = BrowserDetect.version;
					break;
	
	case 'OS': 		ret_value = BrowserDetect.OS;
					break;
					
	default:		ret_value = '';
					break;
	}
	
	return ret_value;
}

/*
 * NormalizeMarkup()
 * Normalizes the content based on the browser
 *
 * @params
 * content:		content that needs to be normalized
 * browser:		which browser are we getting the content from?
 * lf_tag:		line-feed tag to use in case content conains multiple lines (usually it will be '\n' or <br />)
 *
 * @return
 * Normalized content. In case we don't support the browser, we return the content as is.
 */
function NormalizeMarkup(content, browser, lf_tag)
{
	var std_content = content;
	var allowed_tags = "<br><br />";
	
	if (typeof lf_tag === "undefined")
		lf_tag = "<br />";
	
	switch (browser)
	{
	case 'Chrome':
	case 'Safari':	var first_line;
					var firstline = new RegExp("(.*?)<div>.*?<\/div>");
					var nextline = new RegExp("<div>(.*?)<\/div>","g");

					first_line = firstline.exec(content);
					
					if (first_line != null)											// content contains multiple lines
						std_content = StripHTMLTags(first_line[1], allowed_tags);
					else std_content = StripHTMLTags(content, allowed_tags);		// content is in single line
					
					while(result = nextline.exec(content))
						std_content += "<br />" + StripHTMLTags(result[1], allowed_tags);
					
					break;
					
	case 'Firefox':	std_content = content;
					std_content = std_content.replace(/<br>/gi, "<br />");
					std_content = std_content.replace(/<br \/>/gi, "<br />");
					std_content = std_content.replace(/\n/gi, "");					// for FF on Windows
					std_content = StripHTMLTags(std_content, allowed_tags);
					
					break;
					
	case 'Opera':	
	case 'Explorer':var nextline = new RegExp("<P>(.*?)<\/P>","ig");

					// in IE 7, its not getting into his loop
					while(result = nextline.exec(content)) {
						if(std_content == "")
							std_content = StripHTMLTags(result[1], allowed_tags);
						else std_content += "\n"+StripHTMLTags(result[1], allowed_tags);
					}
					
					break;
					
	default:		// handle all other browsers here (we will see this later)
					alert("Sorry, we don't support your browser ("+browser+").");
					break;
	}
	
	std_content = std_content.replace(/<br>/gi, lf_tag);
	std_content = std_content.replace(/<br \/>/gi, lf_tag);
	
	if (std_content == lf_tag)			// if the content contains only a line break, we empty it.
		std_content = '';
	
	return std_content;
}

function getScrollTop()
{
	if(typeof pageYOffset!= 'undefined')
		return pageYOffset;				// most browsers
	else
	{
	var B= document.body; 				// IE 'quirks'
	var D= document.documentElement;	// IE with doctype
		D= (D.clientHeight)? D: B;
		return D.scrollTop;
	}
}

// --------------------------------
// inline editing related functions
// --------------------------------
function GetCursorPosition()
{
	var cursorPos;
	if (window.getSelection)
	{
		var selObj = window.getSelection();
		var selRange = selObj.getRangeAt(0);
		cursorPos =  findNode(selObj.anchorNode.parentNode.childNodes, selObj.anchorNode) + selObj.anchorOffset;
		/* FIXME the following works wrong in Opera when the document is longer than 32767 chars */
	}
	else if (document.selection)
	{
		var range = document.selection.createRange();
		var bookmark = range.getBookmark();
		/* FIXME the following works wrong when the document is longer than 65535 chars */
		cursorPos = bookmark.charCodeAt(2) - 11; /* Undocumented function [3] */
	}
	return cursorPos;
}

function findNode(list, node)
{
	for (var i = 0; i < list.length; i++)
	{
		if (list[i] == node)
			return i;
	}
	return -1;
}

function SetCursorPosition(browser, obj_id, position)
{
	obj = document.getElementById(obj_id);

//	if (obj.innerHTML == '')
//	{
//		alert('innerHTML empty, position:'+position);
//		position = 0;
//	}

	if (browser == 'Firefox')
		obj.focus();

	if (obj.setSelectionRange)
	{
		obj.focus();  
		obj.setSelectionRange(position, position);
	}
	else if (obj.createTextRange)
	{
		var range = obj.createTextRange();
		range.move("character", position);  
		range.select(); 
	}
	else if (window.getSelection)					// Firefox and Safari
	{
		s = window.getSelection();
		var r1 = document.createRange();

		var walker=document.createTreeWalker(obj, NodeFilter.SHOW_ELEMENT, null, false);
		var p = position;
		var n = obj;
		
		while(walker.nextNode())
		{
			n = walker.currentNode;
			if(p > n.value.length)
				p -= n.value.length;
			else break;
		}

		n = n.firstChild;

		if (obj.innerHTML == '')
			obj.focus();
		else
		{
			r1.setStart(n, p);
			r1.setEnd(n, p);
	
			s.removeAllRanges();
			s.addRange(r1);
		}
	}
	else if (document.selection)					// Internet Explorer
	{
		var r1 = document.body.createTextRange();
		r1.moveToElementText(obj);
		r1.setEndPoint("EndToEnd", r1);
		r1.moveStart('character', position);
		r1.moveEnd('character', position-obj.innerText.length);
		r1.select();
	}
	
	return false;
}
// --------------------------------
// end of inline editing functions
// --------------------------------