RssFeedResults				= new Array();
buildRssBoxDomainMaxlength	= 21;

/**
 * render rss box with content
 * 
 * @param 		int		id			id of the rss feed box
 * @param 		string	divId		div id of the rss feed box (from: <div id="XXX">
 * @param 		bool	autoReload	if true the rss box will reload automatically
 * @param 				listDiv
 * @param 				loaderDiv
 * @param 		array	resultsExtractedFromXML
 */
function renderBox( id, divId, autoReload, listDiv, loaderDiv, resultsExtractedFromXML, randomizeRefresh, maxDomainLength ) {
	
	var maxDomainLength = maxDomainLength || buildRssBoxDomainMaxlength;
	
	if( true == randomizeRefresh ) {
		resultsExtractedFromXML.shuffle();
	}
	
	RssFeedResults[id] = new Array();
	
	// build table with domains inside
	var list	= ' <table cellspacing="0"><tbody>';
		
	for( var i = 0; i < resultsExtractedFromXML.length; i++ ) {
		
		RssFeedResults[id][i] = resultsExtractedFromXML[i];
		
		if( i < getLimit() ) {					
			
			// get rotational css style
            var modulus 	= i % 2;
            var cssClass	= '';
			if( 1 == modulus ) {
				cssClass	= ' class="alt"';
			}
			
			// build link
			linkStart = '';
			linkEnd = '';
			if( resultsExtractedFromXML[i]['link'] ) {
				
				
				
				linkStart = '<a href="' + resultsExtractedFromXML[i]['link'] + '" title="' + resultsExtractedFromXML[i]['domainname'] + '">';
				linkEnd = '</a>';
			}
			
			var domainToShow = resultsExtractedFromXML[i]['domainname'];
			if ( domainToShow.length > maxDomainLength) { 	// If-else for slice and period concat elongated domain names
				var domainToShow = domainToShow.slice(0,maxDomainLength).concat("..");
			}
			
			
			list += '<tr' + cssClass + '>';
			
			// domain
			list += '<td class="name">';
			list += linkStart;
			list += domainToShow;
			list += linkEnd;
			list += '</td>';
			
			// timeleft					
			if( resultsExtractedFromXML[i]['timeleft'] ) {
				list += '<td>' + resultsExtractedFromXML[i]['timeleft'] + '</td>';
			}
			
			// price
			if( resultsExtractedFromXML[i]['price'] ) {
				list += '<td style="text-align: right; padding-right: 15px;">';
				if( '' != linkStart ) {
					list += linkStart + '<u>';
				}
				
				list +=  resultsExtractedFromXML[i]['price'];
				
				if( '' != linkStart ) {
					list += '</u>' + linkEnd;
				}
				list += '</td>';
			}
			
			list += '</tr>';
	
		}
	}
	
	list += '</tbody></table>';
	
	// fill table with list
	replaceContentList( listDiv, list );
	
	// hide loading div
	setTimeout( "setLoadingOff( '"+divId+"', '"+id+"' )", 200 );
	
	// if true then the content box will reload automatically
	if( true == autoReload ) {
		// reloads the feed box			
		window.setTimeout( "getContent('" + id + "','" + divId + "' , '' , true )", getRefreshTime() );
	}
	
}

/**
 * function to get content from rss feed
 * and render rss box with content
 * 
 * @param 		int		id			id of the rss feed box
 * @param 		string	divId		div id of the rss feed box (from: <div id="XXX">
 * @param 		string	url			url of the rss feed
 * @param 		bool	autoReload	if true the rss box will reload automatically
 */
function getContent( id, divId, url, autoReload, randomizeRefresh, maxDomainLength ) {
	
	var autoReload 		= getAutoReload( autoReload );
	var maxDomainLength	= maxDomainLength || buildRssBoxDomainMaxlength;
	
	// get the RSS URL
	var url = getFeedUrl( url, id, randomizeRefresh );
	if( false == url ) {
		reportError();
		return false;
	}
	
	// div of the whole content box
	var feedBoxDiv = document.getElementById( divId + id );
	
	// div of loader	
	var loaderDiv = document.getElementById( divId + id + 'Loader' );
	
	// div of list
	var listDiv = document.getElementById( divId + id + 'List' );
	
	/* remove no script text */
	$( listDiv ).empty();
	
	// HTML code of content box
	var templateForRssBox = feedBoxDiv.innerHTML;
	
	if( null == templateForRssBox ) {
		reportError();
		return false;
	} // if
	

	// set the height for the RSS box to have the correct height 
	// when there are not domains inside the box
	// this occurs for the first load
	setHeightForBox( listDiv );
	
	// display loading div
	setLoadingOn( loaderDiv );
	
	if( false == autoReload && true == randomizeRefresh && 'undefined' != typeof RssFeedResults[id] && 0 < RssFeedResults[id].length ) {
		renderBox( id, divId, autoReload, listDiv, loaderDiv, RssFeedResults[id], randomizeRefresh , maxDomainLength );
		return;
	}
	
	$.ajax({
		   type: 		'GET',
		   url: 		url,
		   cache: 		false,		   
		   data: 		'',
		   dataType: 	'xml',
		   success: 	function(xmlResponse){
				
				// convert XML Response to string
				var xmlString = convertXMLToString( xmlResponse );
				
				var resultsExtractedFromXML = extractResults( xmlString );
				
				renderBox( id, divId, autoReload, listDiv, loaderDiv, resultsExtractedFromXML, randomizeRefresh , maxDomainLength );
	
				
	},
	   error:		function( xmlResponse ){
			reportError();
	   }
	 });
			   
}

function extractResults( xmlString ) {
	
	var data 	= new Array();
	var i 		= 0;
	$.xmlDOM( xmlString ).find( 'rss > channel > item' ).each(function() {
		
		data[i] = new Array();
		data[i]['domainname'] 	= $(this).find( 'domainname' ).text();
		data[i]['link'] 		= $(this).find( 'link' ).text();
		data[i]['timeleft'] 	= $(this).find( 'timeleft' ).text();
		data[i]['price'] 		= $(this).find( 'price' ).text();
		
		i++;
	});
	
	return data;	
}

/**
 * function to report errors 
 */
function reportError() {
	
}

/**
 * function to replace new domain name list (HTML) to rss box
 * 
 * @param 		listDiv		div pointer of rss box
 * @param 		value		whole list of domain names (HTML)
 */
function replaceContentList( listDiv, value ) {
	listDiv.innerHTML = value;
}

/**
 * returns the refresh time for the rss box
 * 
 * @return	int		refresh time in millisecs
 */
function getRefreshTime() {
	
	// get refresetLoadingOnsh time given in minutes
	if( document.getElementById( 'rssFeedRefreshTime' ) && '' != document.getElementById( 'rssFeedRefreshTime' ).innerHTML ) {
		return parseInt( document.getElementById( 'rssFeedRefreshTime' ).innerHTML ) * 60 * 1000;
	}
	
	// return default value: 120000 millisecs = 2 min
	return 120000;
}

/**
 * returns the amount of rows (domain names) to list in the rss box
 * 
 * @return	int		the amount of rows (domain names) to list in the rss box
 */
function getLimit() {
	
	if( document.getElementById( 'rssFeedLimit' ) && '' != document.getElementById( 'rssFeedLimit' ).innerHTML ) {
		return document.getElementById( 'rssFeedLimit' ).innerHTML;
	}
	
	// return default value
	return 10;
}

/**
 * returns the url from given first parameter "url" (if given)
 * or returns the url given in div id
 * 
 * and replaces some special characters
 * and adds some special parameters to url
 * 
 * @param 	string	url		the rss url (not required)
 * @param 	int		id		the id of the div where the url is deposited if the url is not given in fist parameter
 * @return	string			the rss url or false on error
 */
function getFeedUrl( url, id, randomizeRefresh ) {
	
	// &origin= <--- GLOBAL VAR!	
	// add parameter to set special vars e.g. limit, lower cache time, randomizeRefresh
	var parameterList	= '&randomizeRefresh=' + randomizeRefresh + '&rss_origin=' + origin;
	
	// set language parameter
	parameterList		+= '&language=' + getUrlParameter( 'language' , 'e' );
	
	// set partnerid parameter
	parameterList		+= '&partnerid=' + getUrlParameter( 'partnerid' );
	
	// if url was passed throw this function
	if( 'undefined' != typeof url && '' != url ) {
		var newUrl = url.replace( /&amp;/ , "&" );
		return newUrl + parameterList;
	}
	
	// when url was NOT passed throw this function
	// we have to get the RSS URL from div innerHTML
	var rssFeedUrlFromDiv = document.getElementById( 'rssFeedUrl' + id );
	if( rssFeedUrlFromDiv ) {
		var newUrl = rssFeedUrlFromDiv.innerHTML.replace( /&amp;/ , "&" );
		return newUrl + parameterList;
	}
	
	return false;
}

/**
 * 
 * @param 		XML		xmlResponse		the whole xml response from jquery request
 * @return		string					the xml or false on error
 */
function convertXMLToString( xmlResponse ) {
	
	// convert XML Response to string
	try {
	    // Gecko-based browsers, Firefox, Safari, Opera.
		return (new XMLSerializer()).serializeToString( xmlResponse );
	}
	catch (e) {
		try {
		    // Internet Explorer.
		  	return xmlResponse.xml;
		}
	    catch (e)
	    {//Strange Browser ??
	    	return false;
	    }
	}
	
	return false;
}

/**
 * adds the loading screen while reloading the rss box
 * 
 * @param 	loaderDiv
 */
function setLoadingOn( loaderDiv ) {
	if( loaderDiv ) {
		loaderDiv.style.cssText = "display:inline;height:" + getHeightForBox( getLimit() ) + 'px;';
	}
}

/**
 * removes the loading screen when rss box is reloaded well
 * 
 * @param 	loaderDiv
 */
function setLoadingOff( divId, id ) {
	
	loaderDiv = document.getElementById( divId + id + 'Loader' );
	
	if( loaderDiv ) {
		loaderDiv.style.cssText = "display:none;";
	}
}

/**
 * calculate the height of each box
 * 
 * dependent on the amount of rows (domain names)
 * 
 * @param 	int		limit		the amount of rows (domain names)
 * @return	int
 */
function getHeightForBox( limit ) {
	return newHeight = 22 * parseInt( limit );
}

/**
 * set the height of the rss box
 * 
 * @param 	listDiv
 */
function setHeightForBox( listDiv ) {
	var newHeight = getHeightForBox( getLimit() );	
	listDiv.style.cssText = 'height:' + newHeight  + 'px;';
}

/**
 * returns the value of parameter from URL
 * 
 * @param 	string			parameter		the parameter to search for in URL string
 * @param 	string			defaultValue	add this as values if parameter is missing 
 * @return	string							the founded value or the default value
 */
function getUrlParameter( parameter, defaultValue ) {
	
	regex 	= new RegExp( parameter + '\=([^\&]*)' , 'i' );
	findTag	= window.location.search.match( regex );
	
	if( null === findTag || '' == findTag[ 1 ] ) {
		if( 'undefined' == typeof defaultValue ) {
			return '';
		}
		
		return defaultValue;
	}
	
	return findTag[ 1 ];

}

/**
 * returns if the rss box have to reload automatically or not 
 * 
 * @param 	bool	autoReload	
 * @return	bool
 */
function getAutoReload( autoReload ) {
	
	// if true then the content box will reload automatically
	if( 'undefined' == typeof autoReload || true != autoReload ) {
		autoReload = false;
	}
	
	return autoReload;
	
}

/**
 * randomize array
 * 
 * @return	int		returns random number
 */
function arrayShuffle(){
	var tmp, rand;
	for(var i =0; i < this.length; i++){
		rand = Math.floor(Math.random() * this.length);
		tmp = this[i]; 
		this[i] = this[rand]; 
		this[rand] = tmp;
	}
}

Array.prototype.shuffle = arrayShuffle;
