function RecentSearches(theSearchURL){

	var default_cookieName = "_slirecent";
	var default_daystolive=180;
	var default_cookiePath = "path=/";
	var default_cookieDomain = "";
	var default_maxSearchTermLength = 200;


	var invalid_search_terms = new Array("*");
	var valid_search_term;

	var maxSearchTermLength = default_maxSearchTermLength;
	var __SLI_cookieName = default_cookieName;
	var cookiePath = default_cookiePath;
	var cookieDomain = default_cookieDomain;
	var expirydate;
	var existingSearches = new Array();



	this.getListRecentSearches = function(){
/**
 * Display Recent Searches in a list format.
**/
		getCurrentCookieData();

		var searchURL = theSearchURL+"?p=Q&rs=1&rstotal="+existingSearches.length+"&w=";
		var locationInList;
		if(existingSearches!=null){
			//var recentDiv="<div id='sli_recentsearchlist' class='sli_recentsearches'>Recent Searches\n";
			var recentDiv="<div id='sli_recentsearchlist' class='sli_recentsearches'>\n";
			recentDiv+="<ul class='sli_recentsearchterms'>\n";

			for(var i=existingSearches.length-1; i >=0; i--){
				locationInList=(i-existingSearches.length)*-1;

				var value = decodeURIComponent(existingSearches[i]);
				var reg=new RegExp(/[^\^]+/i);
				var keyword = reg.exec(value);

				var areg=new RegExp(/\^([0-9|-]+)/i);
				var date = value.match(areg);
				var searchdate = date[1];

				var link='<a href="'+searchURL+keyword+'&rsdate='+searchdate+'&rsloc='+locationInList+'">';
				recentDiv+="<li class='recentkeyword'>\n"+link+keyword+"</a>\n</li>\n"
			}

			recentDiv+="</ul>\n<span> <a href='javascript:rs.deleteExistingSearches()'>Clear List</a></span></div>";
			document.write(recentDiv);
		}

	}


	this.deleteExistingSearches = function(){

		if (deleteCookie()==1){
		//hide the list on deletion of cookie
			document.getElementById('sli_recentsearchlist').style.display="none";
		}

	}

	this.addSearchTerm = function(theKeyword){

		if(isValidSearchTerm(theKeyword) == false){
			return '';
		}
		else{
			addSearchTermToExisitngSearches();
			calcualteExpiryDate();
			writeToCookie();
		}

	}



	this.setDomain = function(theDomain){
		if(theDomain && (trim(theDomain) != '')){
			cookieDomain=theDomain;
		}
		else{
			cookieDomain=default_cookieDomain;
		}
	}


	this.getDomain = function(){
		return cookieDomain;
	}

	this.runTests = function(){
		testUnit();
	}


	/** Private Functions **/

	function isValidSearchTerm(theSearchTerm){

		theSearchTerm = checkSearchLength(trim(theSearchTerm));

		var encodedSearchTerm = encodeURIComponent(theSearchTerm);

		if(encodedSearchTerm==""){
			return false;
		}

		for(var i=0;i<invalid_search_terms.length;i++){
			if(encodedSearchTerm == invalid_search_terms[i]){
				return false;
			}
		}
		valid_search_term = encodedSearchTerm;
		return true;
	}

	function checkSearchLength(searchTerm){
	//truncate the search term length if it's over a specific length
		if(searchTerm.length > maxSearchTermLength){
			searchTerm = searchTerm.substr(0,maxSearchTermLength);
		}

		return searchTerm;
	}

	function isTermAlreadyInList(){

		var returnValue=0;

		if(valid_search_term != ''){
			for(var i=0;i<existingSearches.length;i++){
				var testValue = existingSearches[i];
				//strip the date off (term^date)
				testValue=testValue.replace(/\^.*/g,'');

				if( (testValue.toLowerCase()) == (valid_search_term.toLowerCase())){
					existingSearches.splice(i,1);
					return true;
				}
			}
		}

		return false;

	}

	function todaysDate(){


		var today = new Date();
		var day = today.getDate();
		var month = today.getMonth()+1;
		var year = today.getFullYear();

		if(day<10){
			day="0"+day;
		}
		if(month<10){
			month="0"+month;
		}

		var date = year+"-"+month+"-"+day;
		return date;
	}



	function addSearchTermToExisitngSearches(){

		var updatedlist;
		var theDate = todaysDate();

		getCurrentCookieData();

		if(existingSearches==null || existingSearches.length==0){
			existingSearches=valid_search_term+"^"+theDate;
		}
		else{
			isTermAlreadyInList();

			if(existingSearches.length == 10){
				existingSearches.shift();
			}
			existingSearches.push(valid_search_term+"^"+theDate);
		}

	}

	function trim(stringToTrim) {
			return stringToTrim.replace(/^\s+|\s+$/g,"");
	}

	function calcualteExpiryDate(daystolive){

		var myDate=new Date();
		var valid_daystolive;

		if(daystolive == undefined){
			valid_daystolive=default_daystolive;
		}
		else{
			try{
				if(isInt(daystolive)==false){
					throw("date1");
				}
				else{
					valid_daystolive=daystolive;
				}

			}
			catch(err){
				if(err=="date1"){
					valid_daystolive=default_daystolive;
				}
				else{
				//unhandled day to live value error
				}
			}
		}


		try{
			myDate.setDate(myDate.getDate()+valid_daystolive);
		}
		catch(err){
			myDate.getDate();
		}

		myDate = myDate.toGMTString();

		expirydate = myDate;

	}

	function isInt (value) {

		if(trim(value) != ''){
			return (value % 1) == 0;
		}
		else{
			return false;
		}

	}

	function getCurrentCookieData(){

		var cookieSearchTerms = readCookie(__SLI_cookieName);

		try{
			if(cookieSearchTerms==null || cookieSearchTerms=='' ) {
				throw("errRead1");
			}
			else{
				var cookieSearchTermArray = cookieSearchTerms.split(",");
				existingSearches = cookieSearchTermArray;
				return cookieSearchTermArray;
			}
		}

		catch(err){
			if(err=="errRead1"){
				return null;
			}
			else{
				return null;
			}
		}


	}

	function readCookie(name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0){
				return c.substring(nameEQ.length,c.length);
			}
		}
		return null;
	}

	function deleteCookie(){
	// set the cookie with an expiry date of one day ago.
		var cookieString=__SLI_cookieName+"=;-1;domain="+cookieDomain;
		return updateCookie(cookieString);
	}

	function writeToCookie(){
		var cookieString = __SLI_cookieName+"="+existingSearches+"; expires="+expirydate+"; "+cookiePath+"; domain="+cookieDomain;
		updateCookie(cookieString);
	}

	function updateCookie(cookieString){

		try{
			document.cookie = cookieString;
			return 1;
		}
		catch(err){
			return 0;
		}
	}


	function testUnit(){

	var icount=0;

	testValidKeyword();
	testKeywordLength();
	testIsInt();



	function testValidKeyword(){
	/**
	 ** Test Valid Search Term Function
	 ** only two terms should cause errors as this point in time a '*' | ''
	**/
		if(isValidSearchTerm("*")==0){
			document.write(icount+": Test Passed: * is not a valid search term<br>");
		}
		icount++;

		if(isValidSearchTerm("")==0){
			document.write(icount+": Test Passed: '' is not a valid search term <br>");
		}
		else{
			document.write(icount+": Test Failed: '' is not a valid search term<br>");
		}
		icount++;
		if(isValidSearchTerm("       ")==0){
			document.write(icount+": Test Passed: '       ' is not a valid search term <br>");
		}
		else{
			document.write(icount+": Test Failed: '       ' is not a valid search term<br>");
		}
		icount++;
		if(isValidSearchTerm("testword")==1){
			document.write(icount+": Test Passed: 'testword' is a valid search term <br>");
		}
		else{
			document.write(icount+": Test Failed: '       ' is not a valid search term<br>");
		}
		icount++;
	}

	function testKeywordLength(){

		/**
		** Test:Check Search Length Function
		** there should be a max length on the size of the search term
		**/
		maxSearchTermLength = 10;

		if(checkSearchLength("abcdef")=="abcdef"){
			document.write(icount+": Test Passed: 'abcdef' is a valid legnth<br>")
		}
		else{
			document.write(icount+": Test Failed: 'abcdef' is a valid legnth<br>");
		}
		icount++;

		if(checkSearchLength("abcdefghij")=="abcdefghij"){
			document.write(icount+": Test Passed: 'abcdefghij' is a valid legnth<br>");
		}
		else{
			document.write(icount+": Test Failed: 'abcdefghij' is a valid legnth<br>");
		}
		icount++;

		if(checkSearchLength("abcdefghiji")=="abcdefghij"){
			document.write(icount+": Test Passed: 'abcdefghiji' is an invalid legnth and has been truncated <br>");
		}
		else{
			document.write(icount+": Test Passed: 'abcdefghiji' is an invalid legnth and has not been truncated <br>");
		}
		icount++;
	}

	function testIsInt(){


		if(isInt(" ")==false){
			document.write(icount+": Test Pased ' ' is not a valid integer<br>");
		}
		else{
			document.write(icount+": Test Failed ' ' is not a valid integer<br>");
		}
		icount++;

		if(isInt("abc")==false){
			document.write(icount+": Test Pased 'abc' is not a valid integer<br>");
		}
		else{
			document.write(icount+": Test Failed 'abc' is not a valid integer<br>");
		}
		icount++;

		if(isInt("123")==true){
			document.write(icount+": Test Pased '123' is a valid integer<br>");
		}
		else{
			document.write(icount+": Test Failed '123' is a valid integer<br>");
		}
		icount++;


		if(isInt("-123")==true){
			document.write(icount+": Test Pased '-123' is a valid integer<br>");
		}
		else{
			document.write(icount+": Test Failed '-123' is a valid integer<br>");
		}
		icount++;
	}




	}

}
