// Helper functions
function encodeURL( str )
{
	return escape( str.replace( ' ', '+' ) );
}

function createCookie(name,value,days)
{
	if (days)
	{
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else
		var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

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 eraseCookie(name) {
	createCookie(name,"",-1);
}

// Global variables
var SEO_XML = new Object()
var SEO_APPLET = null;
var SEO_JOBID = null;
var SEO_PROFILEID = null;
var SEO_SESSIONID = readCookie( 'PHPSESSID' );
var SEO_JOBFINISHED = false;
var SEO_APPLETPROCESSING = false;
var SEO_APPLETCANCELLED = false;
var SEO_AJAXPROCESSING = false;
var SEO_TIMER = null;

// AJAX Prep
function createAjaxObj()
{
	var httprequest = false; if( window.XMLHttpRequest ) { httprequest = new XMLHttpRequest(); if( httprequest.overrideMimeType ) httprequest.overrideMimeType( 'text/xml' ); } else if( window.ActiveXObject ) { try { httprequest = new ActiveXObject( "Msxml2.XMLHTTP" ); } catch( e ) { try { httprequest = new ActiveXObject( "Microsoft.XMLHTTP" ); } catch( e ) {	} } }
	return httprequest;
}

SEO_XML.basedomain = "http://" + window.location.hostname;
SEO_XML.ajaxobj = createAjaxObj();
SEO_XML.addrandomnumber = 0; //Set to 1 or 0. See documentation.

SEO_XML.getAjaxRequest = function( parameters, callbackfunc )
{
	var url = "services/webservice.php";
	SEO_XML.ajaxobj = createAjaxObj() //recreate ajax object to defeat cache problem in IE
	if( SEO_XML.addrandomnumber == 1 ) //Further defeat caching problem in IE?
		var parameters = parameters + "&ajaxcachebust=" + new Date().getTime();
	SEO_PROFILEID = document.getElementById( 'MPInterfaceProfile' ).value;
	if( this.ajaxobj )
	{
		this.ajaxobj.onreadystatechange = callbackfunc;
		this.ajaxobj.open( 'GET', url+"?sid="+SEO_SESSIONID+"&profileid="+SEO_PROFILEID+"&"+parameters, true );
		this.ajaxobj.send( null );
	}
}

SEO_XML.postAjaxRequest = function( parameters, callbackfunc )
{
	var url = "services/webservice.php";
	SEO_XML.ajaxobj = createAjaxObj() //recreate ajax object to defeat cache problem in IE
	if( this.ajaxobj )
	{
		this.ajaxobj.onreadystatechange = callbackfunc;
		this.ajaxobj.open( 'POST', url, true );
		this.ajaxobj.setRequestHeader( "Content-type", "application/x-www-form-urlencoded" );
		this.ajaxobj.setRequestHeader( "Content-length", parameters.length );
		this.ajaxobj.setRequestHeader( "Connection", "close" );
		this.ajaxobj.send( parameters );
	}
}

// Server Connectivity Tools
function mpSerializationPollQueryCB()
{
	if( SEO_XML.ajaxobj.readyState == 4 )
	{
		if( SEO_XML.ajaxobj.status == 200 )
		{
			// Parse response
			var xmlDoc = SEO_XML.ajaxobj.responseXML.documentElement;
			var xmlResponse = xmlDoc.firstChild;
			var xmlError = false;
			var xmlErrorCode;
			var xmlErrorMessage;
			
			// Handle errors
			var xmlErrors = xmlDoc.getElementsByTagName( 'error' );
			for( i = 0; i < xmlErrors.length; i++ )
			{
				xmlErrorCode = (xmlErrors[i].getElementsByTagName( 'code' ))[0].firstChild.nodeValue;
				xmlErrorMessage = (xmlErrors[i].getElementsByTagName( 'message' ))[0].firstChild.nodeValue;
				xmlError = true;
			}
			
			// Process search request
			if( xmlError == false )
			{
				var xmlQueries = xmlDoc.getElementsByTagName( 'queryRequest' );

				SEO_APPLETPROCESSING = true;
				SEO_APPLET.searchClear();

				for( i = 0; i < xmlQueries.length; i++ )
				{
					var xmlQueryId = (xmlQueries[i].getElementsByTagName( 'id' ))[0].firstChild.nodeValue;
					var xmlQueryEngine = (xmlQueries[i].getElementsByTagName( 'engine' ))[0].firstChild.nodeValue;
					var xmlQueryQuery = (xmlQueries[i].getElementsByTagName( 'query' ))[0].firstChild.nodeValue;
					var xmlQueryType = (xmlQueries[i].getElementsByTagName( 'querytype' ))[0].firstChild.nodeValue;
					var xmlQueryNum = (xmlQueries[i].getElementsByTagName( 'num' ))[0].firstChild.nodeValue;
					var xmlQueryStart = (xmlQueries[i].getElementsByTagName( 'start' ))[0].firstChild.nodeValue;
					var xmlQueryDatacenter = '';
					if( (xmlQueries[i].getElementsByTagName( 'datacenter' ))[0].firstChild )
						xmlQueryDatacenter = (xmlQueries[i].getElementsByTagName( 'datacenter' ))[0].firstChild.nodeValue;

					SEO_APPLET.searchQueue( xmlQueryId, xmlQueryEngine, xmlQueryQuery, xmlQueryNum, xmlQueryStart, xmlQueryDatacenter, xmlQueryType );
					/*
					var ele = document.getElementById('mpSerializationInput');
					ele.value = ele.value + '\nrequested query ' + xmlQueryId;
					*/
				}
				SEO_PROFILEID = document.getElementById( 'MPInterfaceProfile' ).value;
				SEO_APPLET.searchProcess( SEO_PROFILEID, SEO_SESSIONID );
			}

			SEO_AJAXPROCESSING = false;
		}
	}
}

function mpSerializationCancel( e )
{
	SEO_APPLET.searchCancel();
	e.style.display = 'none';
	SEO_APPLETCANCELLED = true;
	return false;
}

function mpSerializationPollQuery()
{
	if( SEO_JOBFINISHED == true || SEO_AJAXPROCESSING == true || SEO_APPLETPROCESSING == true )
	{
		if( SEO_JOBFINISHED == true )
		{
			// Job finished, get report and stop polling
			clearInterval( SEO_TIMER );
			SEO_TIMER = null;
			SEO_AJAXPROCESSING = false;
			if( SEO_APPLETCANCELLED == false )
				mpSerializationGetReport( SEO_JOBID );
		}
		return;
	}
	SEO_AJAXPROCESSING = true;
	SEO_XML.getAjaxRequest( "action=getopenqueryrequests&jobid="+SEO_JOBID, mpSerializationPollQueryCB )
}

function mpSerializationStartJob()
{
	SEO_JOBFINISHED = false;
	SEO_APPLETCANCELLED = false;
	
	// Start polling for query requests from the server
	if( SEO_TIMER != null )
		clearInterval( SEO_TIMER );
	SEO_TIMER = window.setInterval( 'mpSerializationPollQuery()', 100 );
}

function mpSerializationPostJobCB()
{
	if( SEO_XML.ajaxobj.readyState == 4 )
	{
		if( SEO_XML.ajaxobj.status == 200 )
		{
			// Parse response
			var xmlDoc = SEO_XML.ajaxobj.responseXML.documentElement;
			var xmlResponse = xmlDoc.firstChild;
			var xmlError = false;
			var xmlErrorCode;
			var xmlErrorMessage;
			
			// Handle errors
			var xmlErrors = xmlDoc.getElementsByTagName( 'error' );
			for( i = 0; i < xmlErrors.length; i++ )
			{
				xmlErrorCode = (xmlErrors[i].getElementsByTagName( 'code' ))[0].firstChild.nodeValue;
				xmlErrorMessage = (xmlErrors[i].getElementsByTagName( 'message' ))[0].firstChild.nodeValue;
				xmlError = true;
			}
			
			// Process job request
			if( xmlError == false )
			{
				var xmlJobs = xmlDoc.getElementsByTagName( 'job' );

				for( i = 0; i < xmlJobs.length; i++ )
					SEO_JOBID = (xmlJobs[i].getElementsByTagName( 'id' ))[0].firstChild.nodeValue;
				mpSerializationStartJob();
			}
			else
			{
				alert( 'Error - ' + xmlErrorMessage );
				mpSerializationSetProgressLabel( '' );
			}
			SEO_AJAXPROCESSING = false;
		}
	}
}

function mpSerializationSetProgressLabel( lbl )
{
	document.getElementById('mpSerializationStatus').innerHTML = lbl;
	if( lbl == '' )
	{
		document.getElementById('mpSerializationContainer').className = 'mpSerializationContainerHidden';
	}
	else
	{
		document.getElementById('mpSerializationContainer').className = 'mpSerializationContainer';
	}
}

function mpSerializationPostJob( jobName, jobForm )
{
	if( SEO_AJAXPROCESSING == true || SEO_APPLETPROCESSING == true )
		return false;
	SEO_APPLET = document.applets[0];
	if( !SEO_APPLET )
	{
		alert( 'You must log in and create a search profile before using this tool.' );
		return false;
	}
	SEO_AJAXPROCESSING = true;
	mpSerializationSetProgressLabel( 'Please wait...<br>Communicating with servers...' );
	// Serialize form data
	var queryString = "action=postjob&job="+jobName;
	for( i = 0; i < jobForm.elements.length; i++ )
	{
		if( jobForm.elements[i].name != '' &&
		    jobForm.elements[i].name != 'mpSerializationInput' &&
		    ( ( jobForm.elements[i].type == 'checkbox' && jobForm.elements[i].checked ) || jobForm.elements[i].type != 'checkbox' ) )
		{
			if( jobForm.elements[i].type == 'select-multiple' )
			{
				for( j = 0 ; j < jobForm.elements[i].options.length; j++ )
				{
					if( jobForm.elements[i].options[j].selected )
						queryString += '&' + jobForm.elements[i].name + '=' + encodeURL( jobForm.elements[i].options[j].value );
				}
			}
			else
			{
				queryString += '&' + jobForm.elements[i].name + '=' + encodeURL( jobForm.elements[i].value );
			}
		}
	}
	// Make GET request	
	SEO_XML.getAjaxRequest( queryString, mpSerializationPostJobCB )
	return false;
}

function mpSerializationGetReportCB()
{
	var eleReport = document.getElementById('mpSerializationReport');
	if( SEO_XML.ajaxobj.readyState == 4 )
	{
		if( SEO_XML.ajaxobj.status == 200 )
		{
			var txtDoc = SEO_XML.ajaxobj.responseText;
			eleReport.innerHTML = txtDoc;
			SEO_AJAXPROCESSING = false;
		}
	}
}

function mpSerializationGetReport( jobId )
{
	if( jobId == null )
		return;
	SEO_AJAXPROCESSING = true;
	SEO_XML.getAjaxRequest( "action=getreport&jobid="+jobId, mpSerializationGetReportCB )
}

