/**
 *  generate uniq id based on timestamp
 */
fn.functions.uniqId = function()
{
	return new Date().valueOf();
};

/**
 * trim a string
 * @ reference	http://forums.aspfree.com/code-bank-54/javascript-trim-function-50023.html
 *
 * @param	s
 * @return	string
 */
fn.functions.trim = function (s)
{
   	// Remove leading spaces and carriage returns
   	while (
   		(s.substring(0,1) == ' ') 
   		|| (s.substring(0,1) == '\n') 
   		|| (s.substring(0,1) == '\r')
   	)
   	{ 
   		s = s.substring(1,s.length); 
   	};
     
   	// Remove trailing spaces and carriage returns
   	while (
   		(s.substring(s.length-1,s.length) == ' ') 
   		|| (s.substring(s.length-1,s.length) == '\n') 
   		|| (s.substring(s.length-1,s.length) == '\r')
   	)
   	{
   		s = s.substring(0,s.length-1); 
   	};
     
   	return s;
};

fn.functions.hash = function (url)
{
	var hash = url.split('#');
	if ( undefined === hash[1] ) 
	{
		return '';
	};
	return hash[1];
};

/**
 * make URLs links
 * @param	s
 * @return	string
 */
fn.functions.url2Link = function (s)
{
	if ( undefined === s )
	{
		return '';
	};
	
	var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
	return s.replace(exp,'<a href="$1" target="_blank">$1</a>'); 
};

fn.functions.link2Url = function(html)
{
	html = html.replace(/(<(a[^>]+)>)/ig,'');
	html = html.replace(/(<\/([a^>]+)>)/ig,'');
	return html;
};

/**
 * convert \n's to <br /> tags
 * @param	s		string
 * @param	addN		add \n's after <br>
 * @return	string
 */
fn.functions.n2Br = function (s, addN)
{
	if ( undefined === addN ) 
	{
		addN = true;
	};
	
	if ( !addN )
	{
		return s.replace(/\n/g,'<br />');
	}
	else
	{
		return s.replace(/\n/g,'<br />\n');
	};
};

/**
 * convert <br /> tags to \n's 
 * @param s
 * @return string
 */
fn.functions.br2N = function (s)
{
	return s.replace(/<br *\/*>\n*/gi, '\n');
};

/**
 * convert <br /> tags to \n's 
 * @param s
 * @return string
 */
fn.functions.stripHtml = function (s)
{
	return s.replace(/(<([^>]+)>)/ig,'');
};

/**
 * remove line breaks 
 * (used for saving data w/o \n's)
 * @param s
 * @return string
 */
fn.functions.stripN = function (s)
{
	return s.replace(/\n/g,'');
};

/**
 * find <br /> tags and add \n's 
 * (used for repopulating account data)
 * @param s
 * @return string
 */
fn.functions.addN = function (s)
{
	return s.replace(/<br *\/*>/g, '<br />\n');
};

/**
 * convert special char's to html FOR A SINGLE LINE (no line breaks, no br's)
 * @param s
 * @return string
 */
fn.functions.htmlEncode = function (source)
{
	// ampersands (&)
	source = source.replace(/\&/g,'&amp;');

	// less-thans (<)
	source = source.replace(/\</g,'&lt;');

	// greater-thans (>)
	source = source.replace(/\>/g,'&gt;');

	// ampersands (")
	source = source.replace(new RegExp('"','g'), '&quot;');

	var result = '';
	for (var i = 0; i < source.length; i++)
	{
		var c = source.charAt(i);
		if (c < ' ' || c > '~')
		{
			c = '&#' + c.charCodeAt() + ';';
		}
		result += c;
	}
	return result;
}; 

/**
 * takes a jQuery .html() chunk, splits in each <br> and properly encodes each line
 * to be written to a textarea
 * @param html string
 * @return string
 */
fn.functions.htmlEncodeMultiline = function(html, splitOn, joinOn, modifiers)
{
//	var splitOn = /<br *\/*>\n*/gi;
	var exp = new RegExp(splitOn, modifiers);
	var lines = html.split(exp);

	for (var i = 0; i < lines.length; i++)
	{
		var line = lines[i];

		// less-thans (<)
		line = line.replace(/\</g,'&lt;');

		// greater-thans (>)
		line = line.replace(/\>/g,'&gt;');
		
		// get html as text
		var text = $('<div/>').html(line).text();
		text = fn.functions.trim(text);
		
		// convert to html char's
		text = fn.functions.htmlEncode(text);
		lines[i] = text;
	}

	// re-join lines
	return lines.join(joinOn);
};

fn.functions.friendlyDate = function(date)
{
	var curr_day = date.getDay();
	var curr_date = date.getDate();
	var curr_month = date.getMonth();
	var curr_year = date.getFullYear();

	return Date.abbrDayNames[curr_day] + ', ' + Date.abbrMonthNames[curr_month] + " " + curr_date + ", " + curr_year;

};


