/**
 * @constructor
 * @private
 */
function XLinkPubRecImp()
{
	throw new Error("XLinkPubRecImp is a static class. Do not instantiate.");
}

// CONSTANTS
XLinkPubRecImp.DEFAULT_DOMAIN          = "www.lexis.com";
//XLinkPubRecImp.DEFAULT_DOMAIN          = "cert-2610.lexis.com";
// XLinkPubRecImp.DEFAULT_DOMAIN          = "wmitzjx.lexis.com";
XLinkPubRecImp.DEFAULT_VERSION         = "1.0";

// Create API Matrix
// The matrix is used to cast object elements into those used by the API.
XLinkPubRecImp.matrix          = new Object();

// Filter out MQ fields that we don't want in the query string
XLinkPubRecImp.matrix.pwd           = -1;
XLinkPubRecImp.matrix.uid           = -1;
XLinkPubRecImp.matrix.domain        = -1;
XLinkPubRecImp.matrix.protocol      = -1;

XLinkPubRecImp.matrix.lastName      = -1;
XLinkPubRecImp.matrix.lName      = -1;
XLinkPubRecImp.matrix.firstName     = -1;
XLinkPubRecImp.matrix.fName      = -1;
XLinkPubRecImp.matrix.companyName   = -1;
XLinkPubRecImp.matrix.ssn           = -1;
XLinkPubRecImp.matrix.streetAddress = -1;
XLinkPubRecImp.matrix.state         = -1;
XLinkPubRecImp.matrix.zip           = -1;
XLinkPubRecImp.matrix.telephone     = -1;
XLinkPubRecImp.matrix.birthDate     = -1;
XLinkPubRecImp.matrix.searchRadius  = -1;
XLinkPubRecImp.matrix.TOCTarget     = -1;
XLinkPubRecImp.matrix.authToken       = "uisToken";

// Describe which field names you need to cast into other values
// specific to the API.
XLinkPubRecImp.matrix.originationCode = "ORIGINATION_CODE";
	
/**
 * This matric 
 */
XLinkPubRecImp.submit = function(chunnel)
{
    if ((Truth.isTrue(chunnel.uid)) || (Truth.isTrue(chunnel.pwd)))
        chunnel = SearchImplementor.tokenize(chunnel);

	// Preprocessor needs to convert generic after field 
	// to XLink's relativedate field
	XLinkPubRecImp._preprocessor(chunnel);

	if (!Truth.isTrue(chunnel.version))
	{
		chunnel.version = XLinkPubRecImp.DEFAULT_VERSION;
	}
	// If no target, set the target for the same window.	
	if (!Truth.isTrue(chunnel.target))
	{
		chunnel.target = "_self";
	}
	
	// Get the XML
	var xml;
    xml = XLinkPubRecImp.getXML(chunnel);
	
	chunnel.setSearch("");
	chunnel.setMenu("");
	// chunnel.setSource("");
	
	// chunnel.set("mj", "");
	// chunnel.setMenu("MIDDLEWARE_CODE", "");
	
	var linker = XLinkPubRecImp.getLink(chunnel);
	

	var f = "<form method='post' action='";
	f += linker;
	f += "' id='masterQueryDynaForm' name='masterQueryDynaForm' target='"
	f += chunnel.target
	f += "'>";
	
	f += FormUtil.getHiddenFieldVal('USER_ID', chunnel.getUID());
	f += FormUtil.getHiddenFieldVal('PASSWORD', chunnel.getPWD());
	f += FormUtil.getHiddenFieldVal('LNAUTHSCHEME', 'CP');
	f += FormUtil.getHiddenFieldVal('search', xml);

	f += "</form>";

	var diver = document.getElementById("masterQueryDynaFormDiv");
	
	// Only create a new div if the existing div doesn't exist
	if (diver == null)
	{
		diver = document.createElement("div");
		diver.id = "masterQueryDynaFormDiv"
	}
	
	diver.innerHTML = f;
	document.body.appendChild(diver);
	
	var dForm = document.getElementById("masterQueryDynaForm");

	// prompt("", linker)

	dForm.submit();

	
	chunnel = null;
};

/**
 * Take any actions that need to be made on the MQ object before it gets
 * submitted to its specific API.
 */
XLinkPubRecImp._preprocessor =  function(chunnel)
{
    var stateList = new Array();
    //State Abbreviations
    stateList[0] = "AL";
	stateList[1] = "AK";
	stateList[2] = "AZ";
	stateList[3] = "AR";
	stateList[4] = "CA";
	stateList[5] = "CO";
	stateList[6] = "CT";
	stateList[7] = "DE";
	stateList[8] = "DC";
	stateList[9] = "FL";
	stateList[10] = "GA";
	stateList[11] = "GU";
	stateList[12] = "HI";
	stateList[13] = "ID";
	stateList[14] = "IL";
	stateList[15] = "IN";
	stateList[16] = "IA";
	stateList[17] = "KS";
	stateList[18] = "KY";
	stateList[19] = "LA";
	stateList[20] = "ME";
	stateList[21] = "MD";
	stateList[22] = "MA";
	stateList[23] = "MI";
	stateList[24] = "MN";
	stateList[25] = "MS";
	stateList[26] = "MO";
	stateList[27] = "MT";
	stateList[28] = "NE";
	stateList[29] = "NV";
	stateList[30] = "NH";
	stateList[31] = "NJ";
	stateList[32] = "NM";
	stateList[33] = "NY";
	stateList[34] = "NC";
	stateList[35] = "ND";
	stateList[36] = "OH";
	stateList[37] = "OK";
	stateList[38] = "OR";
	stateList[39] = "PA";
	stateList[40] = "PR";
	stateList[41] = "RI";
	stateList[42] = "SC";
	stateList[43] = "SD";
	stateList[44] = "TN";
	stateList[45] = "TX";
	stateList[46] = "UT";
	stateList[47] = "VT";
	stateList[48] = "VA";
	stateList[49] = "VI";
	stateList[50] = "WA";
	stateList[51] = "WV";
	stateList[52] = "WI";
	stateList[53] = "WY";

    var stateSourceList = new Array(new Array(54), new Array(54));
    //Old Person Sources
    stateSourceList[0][0] = "314663";
    stateSourceList[0][1] = "314658";
    stateSourceList[0][2] = "314669";
    stateSourceList[0][3] = "314666";
    stateSourceList[0][4] = "314673";
    stateSourceList[0][5] = "314675";
    stateSourceList[0][6] = "314678";
    stateSourceList[0][7] = "314684";
    stateSourceList[0][8] = "314681";
    stateSourceList[0][9] = "314687";
    stateSourceList[0][10] = "314690";
    stateSourceList[0][11] = "314692";
    stateSourceList[0][12] = "314695";
    stateSourceList[0][13] = "314711";
    stateSourceList[0][14] = "314713";
    stateSourceList[0][15] = "314715";
    stateSourceList[0][16] = "314709";
    stateSourceList[0][17] = "314717";
    stateSourceList[0][18] = "314719";
    stateSourceList[0][19] = "314721";
    stateSourceList[0][20] = "314727";
    stateSourceList[0][21] = "314725";
    stateSourceList[0][22] = "314723";
    stateSourceList[0][23] = "314729";
    stateSourceList[0][24] = "314731";
    stateSourceList[0][25] = "314736";
    stateSourceList[0][26] = "314734";
    stateSourceList[0][27] = "314821";
    stateSourceList[0][28] = "314748";
    stateSourceList[0][29] = "314758";
    stateSourceList[0][30] = "314751";
    stateSourceList[0][31] = "314753";
    stateSourceList[0][32] = "314756";
    stateSourceList[0][33] = "314761";
    stateSourceList[0][34] = "314742";
    stateSourceList[0][35] = "314745";
    stateSourceList[0][36] = "314763";
    stateSourceList[0][37] = "314765";
    stateSourceList[0][38] = "314767";
    stateSourceList[0][39] = "314769";
    stateSourceList[0][40] = "314772";
    stateSourceList[0][41] = "314829";
    stateSourceList[0][42] = "314777";
    stateSourceList[0][43] = "314782";
    stateSourceList[0][44] = "314786";
    stateSourceList[0][45] = "314788";
    stateSourceList[0][46] = "314790";
    stateSourceList[0][47] = "314796";
    stateSourceList[0][48] = "314792";
    stateSourceList[0][49] = "314794";
    stateSourceList[0][50] = "314798";
    stateSourceList[0][51] = "314802";
    stateSourceList[0][52] = "314800";
    stateSourceList[0][53] = "314804";

    //Old Business sources
    stateSourceList[1][0] = "314661";
    stateSourceList[1][1] = "314652";
    stateSourceList[1][2] = "314668";
    stateSourceList[1][3] = "314665";
    stateSourceList[1][4] = "314671";
    stateSourceList[1][5] = "314674";
    stateSourceList[1][6] = "314677";
    stateSourceList[1][7] = "314683";
    stateSourceList[1][8] = "314680";
    stateSourceList[1][9] = "314685";
    stateSourceList[1][10] = "314688";
    stateSourceList[1][11] = "314691";
    stateSourceList[1][12] = "314694";
    stateSourceList[1][13] = "314710";
    stateSourceList[1][14] = "314712";
    stateSourceList[1][15] = "314714";
    stateSourceList[1][16] = "314708";
    stateSourceList[1][17] = "314716";
    stateSourceList[1][18] = "314718";
    stateSourceList[1][19] = "314720";
    stateSourceList[1][20] = "314726";
    stateSourceList[1][21] = "314724";
    stateSourceList[1][22] = "314722";
    stateSourceList[1][23] = "314728";
    stateSourceList[1][24] = "314730";
    stateSourceList[1][25] = "314735";
    stateSourceList[1][26] = "314733";
    stateSourceList[1][27] = "314738";
    stateSourceList[1][28] = "314747";
    stateSourceList[1][29] = "314757";
    stateSourceList[1][30] = "314750";
    stateSourceList[1][31] = "314752";
    stateSourceList[1][32] = "314754";
    stateSourceList[1][33] = "314760";
    stateSourceList[1][34] = "314739";
    stateSourceList[1][35] = "314743";
    stateSourceList[1][36] = "314762";
    stateSourceList[1][37] = "314764";
    stateSourceList[1][38] = "314766";
    stateSourceList[1][39] = "314768";
    stateSourceList[1][40] = "314770";
    stateSourceList[1][41] = "314773";
    stateSourceList[1][42] = "314775";
    stateSourceList[1][43] = "314780";
    stateSourceList[1][44] = "314783";
    stateSourceList[1][45] = "314787";
    stateSourceList[1][46] = "314789";
    stateSourceList[1][47] = "314795";
    stateSourceList[1][48] = "314791";
    stateSourceList[1][49] = "314793";
    stateSourceList[1][50] = "314797";
    stateSourceList[1][51] = "314801";
    stateSourceList[1][52] = "314799";
    stateSourceList[1][53] = "314803";

    for (var i=0; i<54;i++)
    {
        if ((chunnel.getSource() == stateSourceList[0][i]) || (chunnel.getSource() == stateSourceList[1][i]))
            chunnel.set("State", stateList[i]);
    }

	var relativedate = LNParser.convertAfterToRelative(chunnel.getAfter());
	chunnel.c_relativedate = relativedate;
	chunnel.after = "";
	chunnel.setSearchtype("prma");

	if (!Truth.isTrue(chunnel.get("glba")))
	{
		chunnel.set("glba", "7");
	}
	if (!Truth.isTrue(chunnel.get("dppa")))
	{
		chunnel.set("dppa", "7");
	}
	if (Truth.isTrue(chunnel.pwd) || Truth.isTrue(chunnel.authToken))
	{
		chunnel.protocol = "https:";
	}
	return chunnel;
}

XLinkPubRecImp.getLinkWithXML = function(chunnel)
{
    var xml;
	xml = XLinkPubRecImp.getXML(chunnel);
	
	return XLinkPubRecImp.getLink(chunnel) + "&search=" + escape(xml);
};

XLinkPubRecImp.getLink = function(chunnel)
{
	var domain = XLinkPubRecImp.DEFAULT_DOMAIN;
	
	if (chunnel.domain && chunnel.domain !== "") 
	{
		domain = chunnel.domain;
	}
	
	var action
	
	if (Truth.isTrue(chunnel.override))
	{
		action = chunnel.override
	}
	else
	{
		action = chunnel.protocol + "//" + domain + "/research/xlink";
	}

	return action + "?" + SearchImplementor.getQueryString(chunnel, XLinkPubRecImp.matrix);

};

XLinkPubRecImp.getXML = function(chunnel)
{
	var xml = '<fieldList>';
	
	xml += XLinkPubRecImp.checkPRMAField("firstName", "Fname", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("Fname", "Fname", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("lastName", "Lname", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("Lname", "Lname", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("middleName", "Mname", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("Mname", "Mname", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("streetAddress", "Street", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("Street", "Street", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("City", "City", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("Zip", "Zip", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("searchRadius", "Radius", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("Radius", "Radius", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("telephone", "Phone", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("Phone", "Phone", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("Plate", "Plate", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("License", "License", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("FilingNumber", "FilingNumber", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("CaseNumber", "CaseNumber", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("SSN", "SSN", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("birthDate", "DOB", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("DOB", "DOB", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("AgeLow", "AgeLow", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("AgeHigh", "AgeHigh", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("Terms", "Terms", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("aliasFName", "aliasFName", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("aliasLName", "aliasLName", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("RelFName1", "RelFName1", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("RelFName2", "RelFName2", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("PrevCity", "PrevCity", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("PrevState1", "PrevState1", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("PrevState2", "PrevState2", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("companyName", "Cname", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("Cname", "Cname", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("FEIN", "FEIN", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("LoanAmount", "LoanAmount", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("LoanAmountOperator", "LoanAmountOperator", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("LoanAmountHighValue", "LoanAmountHighValue", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("SalePrice", "SalePrice", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("SalePriceOperator", "SalePriceOperator", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("SalePriceHighValue", "SalePriceHighValue", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("LandValue", "LandValue", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("LandValueOperator", "LandValueOperator", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("LandValueHighValue", "LandValueHighValue", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("TaxAmount", "TaxAmount", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("TaxAmountOperator", "TaxAmountOperator", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("TaxAmountHighValue", "TaxAmountHighValue", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("PRMASource", "Source", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("BooleanMode", "BooleanMode", chunnel);
	xml += XLinkPubRecImp.checkPRMAField("UseNicknames", "UseNicknames", chunnel);
	

    if (xml == '<fieldList>')
    {
        chunnel.set("autosubmit", "false");
    }
	xml += XLinkPubRecImp.checkPRMAField("State", "State", chunnel);


    //alert(xml + '</fieldList>');

    return xml + '</fieldList>';
};

XLinkPubRecImp.checkPRMAField = function(name, finalName, chunnel)
{
    var booleanSourceList = new Array(24);
    //Sources which accept the Terms field
    booleanSourceList[0] = "314679";
    booleanSourceList[1] = "314682";
    booleanSourceList[2] = "314689";
    booleanSourceList[3] = "314023";
    booleanSourceList[4] = "314696";
    booleanSourceList[5] = "314697";
    booleanSourceList[6] = "314699";
    booleanSourceList[7] = "314700";
    booleanSourceList[8] = "314737";
    booleanSourceList[9] = "314827";
    booleanSourceList[10] = "314749";
    booleanSourceList[11] = "314825";
    booleanSourceList[12] = "314784";
    booleanSourceList[13] = "314785";
    booleanSourceList[14] = "314813";
    booleanSourceList[15] = "314814";
    booleanSourceList[16] = "314816";
    booleanSourceList[17] = "314817";
    booleanSourceList[18] = "314844";
    booleanSourceList[19] = "314819";
    booleanSourceList[20] = "314820";
    booleanSourceList[21] = "314822";
    booleanSourceList[22] = "314823";
    booleanSourceList[23] = "314473";

    var isBoolSource = false;
    for (var i=0; i<24;i++)
    {
        if ((chunnel.getSource() == booleanSourceList[i]))
            isBoolSource = true;
    }
    if (!isBoolSource && (name == "Terms"))
    {
   	    eval("XLinkPubRecImp.matrix." + name + "     = -1;")
        return "";
    }
       
    var val;
    val = "";
    if (Truth.isTrue(chunnel.get(name))) 
    {
	    val = XLinkPubRecImp.getPRMAField(chunnel.get(name), finalName);
	    eval("XLinkPubRecImp.matrix." + name + "     = -1;")
    }
    if (Truth.isTrue(chunnel.get(name.toLowerCase()))) 
    {
	    val = XLinkPubRecImp.getPRMAField(chunnel.get(name.toLowerCase()), finalName);
	    eval("XLinkPubRecImp.matrix." + name.toLowerCase() + "     = -1;")
    }
    if (Truth.isTrue(chunnel.get(name.toUpperCase()))) 
    {
	    val = XLinkPubRecImp.getPRMAField(chunnel.get(name.toUpperCase()), finalName);
	    eval("XLinkPubRecImp.matrix." + name.toUpperCase() + "     = -1;")
    }
    if ((name.toUpperCase() == "TERMS") && (val != ""))
    {   val = val + UrlApiPubRecImp.getPRMAField("True", "BooleanMode");
	    UrlApiPubRecImp.matrix.BooleanMode     = -1;
    }

    return val
}

/**
	quote (") 	&quot;
	apostrophe (') 	&apos;
	ampersand (&) 	&amp;
	less than (<) 	&lt;
	greater than (>) 	&gt;
 */
XLinkPubRecImp.getField = function(value, type, formId)
{
	if (formId === null) 
	{
		formId = type;
	}

	value = value.replace(/[^a-zA-Z0-9*!_:/()\-]/g, " ");
	
	return '<field type="' + type + '" formId="' + formId + '">' + value + '</field>';

};

XLinkPubRecImp.getPRMAField = function(value, name)
{
    if (name != "DOB" && name != "LoanAmountOperator" && name != "TaxAmountOperator" && name != "LandValueOperator" && name != "SalePriceOperator")
	    value = value.replace(/[^a-zA-Z0-9*!_:/()\-]/g, " ");
	
	return '<field name="' + name + '">' + value + '</field>';

};

XLinkPubRecImp.useGet = function(chunnel)
{
	if (Truth.isTrue(chunnel.pwd) && Truth.isTrue(chunnel.uid)) 
	{
		return false;
	}
	if (Truth.isTrue(chunnel.getSearch()))
	{
		return false;
	}
	return true;
}