/**
 * Dezide GUI tag library JavaScript support
 * Version: 1.0
 * By Anders Hansen ( http://dezide.com )
 */
function retrieveParameters( str )
{
	var result = new Array(0);
	var paramStartIndex = str.indexOf( "?" );

	if( paramStartIndex > -1 )
	{
		var base = str.substring( paramStartIndex + 1 );

		var paramStart = 0;
		var paramEnd = base.indexOf( "&" );
		var nameValueSplit = base.indexOf( "=" );

		while ( paramEnd >= paramStart )
		{
			var name = base.substring( paramStart, nameValueSplit );
			var value = base.substring( nameValueSplit + 1, paramEnd );

			result.push( name );
			result.push( value );

			paramStart = paramEnd + 1;
			paramEnd = base.indexOf( "&", paramStart );
			nameValueSplit = base.indexOf( "=", paramStart);

			if( paramEnd == -1 )
				paramEnd = base.length;
		}
	}

	return result;
}


var portalTableStateTable = {};

function getPortalTableState( name )
{
	var tableState = portalTableStateTable[name];

	if( tableState == null )
	{
		tableState = {};
		portalTableStateTable[name] = tableState;
	}

	return tableState;
}


function updatePortalTableLoader( name )
{
	var tableState = getPortalTableState( name );

	var jQPortalTable = $("#portalTable-" + name);
	var loader = jQPortalTable.find("div.loader");
	if( loader.length > 0 )
	{
		if( tableState.loading )
		{
			loader.css("display", "block");
		}
		else
		{
			loader.css("display", "none");
		}
	}
}


function showPortalTableLoader( name )
{
	var tableState = getPortalTableState( name );
	tableState.loading = true;
	setTimeout( function() { updatePortalTableLoader( name ) }, 200 );
}


function hidePortalTableLoader( name )
{
	var tableState = getPortalTableState( name );
	tableState.loading = false;
	updatePortalTableLoader( name );
}


function sendPortalTableRequest( ajaxBaseUrl, name, changeHref )
{
	if( ajaxBaseUrl == undefined )
		return true;
	if( changeHref == undefined )
		return true;

	showPortalTableLoader( name );

	var tableState = { ajaxlist: "y" };

	var params = retrieveParameters( changeHref );

	for( var i = 0; i < params.length; i += 2 )
	{
		if( params[ i ] != "cmd" )
			tableState[params[ i ]] = params[ i + 1 ];
	}

	// Add a dummy variable to IE to prevent cache problems
	if( $.browser.msie )
	{
		tableState.noIECache = new Date().getTime();
	}

	$.get( ajaxBaseUrl, tableState,
			function( data ) {
				processPortalTableUpdate( data, name );
			},
			"html"
			);
}


function updatePortalTable( ajaxBaseUrl, name, changeHref, delaySend )
{
	var tableState = getPortalTableState( name );

	if( tableState.sendRequestTimer )
		clearTimeout( tableState.sendRequestTimer );

	if( delaySend )
		tableState.sendRequestTimer = setTimeout( function() { sendPortalTableRequest( ajaxBaseUrl, name, changeHref ) }, 200 );
	else
		sendPortalTableRequest( ajaxBaseUrl, name, changeHref );

	return false;
}


function processPortalTableUpdate( data, name )
{
	startTiming('process');

	var jQPortalTable = $("#portalTable-" + name);
	var jQData = $(data);

	// Remove the old data rows
	startTiming('remove');
	jQPortalTable.find("tr.dataRow").remove();
	endTiming('remove');

	// Update the status field
	startTiming('status');
	jQPortalTable.find("div.information span.status").replaceWith( jQData.find("div.information span.status") );
	endTiming('status');

	// Update the column sort links
	startTiming('sort');
	updateFields( jQData.find("tr.headerRow").find("a"), jQPortalTable.find("tr.headerRow").find("a") );
	endTiming('sort');

	// Update the filter change java script events
	startTiming('filter');
	updateFieldsOnKey( jQData.find("tr.filterRow input"), jQPortalTable.find("tr.filterRow input") );
	endTiming('filter');

	// Update the navigation buttons
	startTiming('navigation');
	updateFieldHref( jQData.find("a.first"), jQPortalTable.find("a.first") );
	updateFieldHref( jQData.find("a.previous"), jQPortalTable.find("a.previous") );
	updateFieldHref( jQData.find("a.next"), jQPortalTable.find("a.next") );
	updateFieldHref( jQData.find("a.last"), jQPortalTable.find("a.last") );
	endTiming('navigation');

	// Insert the new data rows
	startTiming('insert');
	jQPortalTable.find("table.main").append( jQData.find("tr.dataRow") );
	endTiming('insert');

	endTiming('process');

	hidePortalTableLoader( name );
}


function updateFieldHref( sourceField, destinationFields )
{
	destinationFields.attr( "href", sourceField.attr( "href" ) );
}


function updateFields( sourceFields, destinationFields )
{
	for( var i = 0; i < destinationFields.length; i++ )
	{
		if( sourceFields.length > i )
		{
			var destinationField = destinationFields.get( i );
			var sourceField = sourceFields.get( i );

			destinationField.href = sourceField.href;
			destinationField.innerHTML = sourceField.innerHTML;
		}
	}
}


function updateFieldsOnKey( sourceFields, destinationFields )
{
	for( var i = 0; i < destinationFields.length; i++ )
	{
		if( sourceFields.length > i )
		{
			destinationFields.get( i ).onkeyup = sourceFields.get( i ).onkeyup;
		}
	}
}

var enableTiming = false;

function startTiming( name )
{
	if( enableTiming && console )
		console.time(name);
}

function endTiming( name )
{
	if( enableTiming && console )
		console.timeEnd( name );
}

