// COMMON.JS

// This file contains functions (and any variables they are dependant on)
// that are useful to multiple HTML files and projects

var g_strMouseOver = "mouseover";
var g_strSelected  = "selected";
var g_strActive    = "active";

var sLastSearch;
var lastBookmark = null;

// showAccessDenied constants
var INVALID_SESSION = 1;
var EXPIRED_SESSION = 2;
var INVALID_USER_MODULE = 3;
var EXPIRED_USER_MODULE = 4;
var EXCEEDED_NUM_CONCURRENT = 5;
var CORPORATE_NOACCESS = 6;

// Path variables
var strRootDir = "TT";
var re1 = /TT\./;
var re2 = /TT\.asp/;

// Constants Messages
var strMessageNoData = "Information for this vehicle is not available."

// Common Menu links
var strHelpLink = "<A class='clsSuperLink' id='idHelpLink' title='Help' href='' target='wndHelp' TABINDEX='0'>&nbsp;&nbsp;Help</A>";

// The https:// port to use for SSL connections.
// During deployment, this variable is changed to the port used by the actual web site.
// It's only changed if it's not the default port, 443, for SSL connections.
// Otherwise, it's set to the port, e.g. ":10443", with a colon in front of it.
// Then, when re get the SERVER_NAME below, we just append the https port string to it.
// For default https port, it's an empty string.
// Otherwise, it's the actual port used on the site.
// This lets us to change the Https port from the default.
// And, to run multiple sites on the same IIS machine, each using different SSL ports...BJD 8/2/2001
var strPort = ""; // NOTE: DO NOT RENAME. This variable is replaced during deployment. See ChangePortVariable.js in Setup!!!!!
var strSecurePort = ""; // NOTE: DO NOT RENAME. This variable is replaced during deployment. See ChangePortVariable.js in Setup!!!!!

function GetImageLink(strImageGUID, strMOD, strHost)
{
	var strQueryString = "http://" + strHost + "/TT/common/asp/secureimgcontent.asp?";
	//<img width=620 id="idImage" src=
	strQueryString += "MOD=" + strMOD + "&";
	strQueryString += "MODULE_ID=" + globals.getVar("MODULE_ID") + "&";
	strQueryString += "SESSION_ID=" + globals.getVar("SESSION_ID") + "&";
	strQueryString += "IMAGE_GUID=" + strImageGUID;

	return strQueryString;
}

function GetImageTag(strImageGUID, strMOD, strHost)
{
	var imgLink = GetImageLink(strImageGUID, strMOD, strHost);
	var ret = "<img width=620 id='idImage' src=\"" + imgLink + "\">";
	return ret;
}

function stripImageGUID(strGUID)
{
	var len = strGUID.length;
    if ((strGUID.substr(0,1) == "G") || (strGUID.substr(0,1) == "g"))
	{
       		return(strGUID.substr(1, len - 1));
	}
	else
	{
       		return(strGUID.substr(0, len));
	}
}

function FindAndReplaceImageTags(strHTML, doc)
{
	var strHost = doc.location.host;
	var obj = doc.createElement("DIV");
	obj.innerHTML = strHTML;
	var imgLinks = obj.getElementsByTagName("a");
	var parentSpan = null;

	for (i=0; i < imgLinks.length; i++)
	{
		if (imgLinks[i].className == "clsExtGraphicLink")
		{
			parentSpan = getSpanItem(imgLinks[i].parentElement);
				
			if (parentSpan != null)
			{
				var rep = "<br>" + GetImageTag(stripImageGUID(imgLinks[i].id), "TTREPTIFF", strHost)
					 + "<br><br>" + parentSpan.innerHTML;
					 
				parentSpan.innerHTML = rep;
			}
		}
	}

	return obj.innerHTML;
}

function getSpanItem(elt)
{
	if(elt.tagName.toUpperCase() == "SPAN")
		return elt;

	if(elt.parentElement == null)
		return null;
		
	return getSpanItem(elt.parentElement);
}		
		
function addImg(currentDoc)
{
	if (currentDoc.readyState == "complete")
	{
		var collImg = currentDoc.images;
		var len = collImg.length;
		for (var i = 0; i < len; i++)
		{
			var strTemp = collImg[i].getAttribute("deferSrc");
			if (strTemp)
			{
				collImg[i].src = strTemp;
			}
		}
	}
	else
	{
		setTimeout("addImg(currentDoc)", 1);
	}
}

function getChildElem(eSrc, sTagName)
{
	var cChildNodes = eSrc.children;
	var len = cChildNodes.length;
    for (var i=0;i<len;i++)
    {
    	if (sTagName == cChildNodes[i].tagName) return cChildNodes[i];
    }
    return false;
}

function isView(sView, loc)
{
	loc = loc.toLowerCase();
	sView = sView.toLowerCase();
	return(loc.match(sView));
}

function getFrame(strDocName, fraStart)
{
	var fraTarget = fraStart;
	for (var loopCnt = 0; (!isView(strDocName, fraTarget.location.href)) && (loopCnt < 5); loopCnt++)
	{
		fraTarget = fraTarget.parent;
	}

	if (!isView(strDocName, fraTarget.location.href))
		return(null);
	else
		return(fraTarget);
}

function getGlobalsFrame(fraStart)
{
	var fraTarget = fraStart;
	for (var loopCnt = 0; (typeof(fraTarget.gVC) != "object") && (loopCnt < 5); loopCnt++)
	{
		fraTarget = fraTarget.parent;
	}

	if (typeof(fraTarget.gVC) != "object")
		return(null);
	else
		return(fraTarget);
}

//---------------------------------------------------+
// getMultiLevelWebPath                              |
// Given a filename prefix and a number of levels,   |
// this fcn will return a multi-level, 111 style     |
// web path, beginning with "/" and ending with "/". |
// Web path means "/" instead of "\".  An empty      |
// string will be returned if the # of levels is bad |
// or if part of the filename used for the path is   |
// non-numeric.                                      |
//---------------------------------------------------+
function getMultiLevelWebPath(strFilePrefix, nLevels)
{
	var nLen = strFilePrefix.length;
	if ((nLevels > nLen) || (nLevels < 1))
	{
		return("");
	}
	else
	{
		var nLBound = nLen - nLevels;
	}

	var re = /[0-9]/;
	var strPath = "/";
	for (var i = nLen; i > nLBound; i--)
	{
		var strChar = strFilePrefix.substr(i - 1, 1);
		if (strChar.match(re) != null)
		{
			strPath += (strChar + "/");
		}
		else
			return("");
	}
	return(strPath);
}



function SwapGraphic(eTab, strNewState, strNoChangeState)
{
	if (!eTab || (typeof(eTab) != "object"))
		return;

	var strExtension = "";
	var strTemp = eTab.src;

	// Extract the image extension from the src attribute
	var re = new RegExp("^(.*[\.])(.*?)$", "i");
	if ( strTemp.match(re) != null )
	{
		strExtension = RegExp.$2;
	}

	// Don't change to the new state if the current state is strNoChangeState
	if ( (strNoChangeState != null) && (strNoChangeState != "") )
	{
		var re = new RegExp(strNoChangeState);
		if (strTemp.search(re) > 0)
			return;
	}

	var aryTemp = strTemp.split("_");
	if (aryTemp.length != 3)
		return;

	eTab.src = aryTemp[0] + "_" + aryTemp[1] + "_" + strNewState + "." + strExtension;
}

function warmImageOn(eTab)
{
	SwapGraphic(eTab, g_strMouseOver, g_strSelected);
}

function coldImageOn(eTab, newWidth, strNoChangeState)
{
	if (strNoChangeState == null)
		strNoChangeState = g_strSelected;

	SwapGraphic(eTab, g_strActive, strNoChangeState);
	if (newWidth)
		eTab.width = newWidth;
}

function hotImageOn(eTab, newWidth)
{
	SwapGraphic(eTab, g_strSelected, null);
	if (newWidth)
		eTab.width = newWidth;
}

function isHotTab(hotTabToCheck)
{
	return (hotTab == hotTabToCheck);
}



function logOutSessionID(strSessionID)	//ODWEB ONLY
{
	// create XMLDOM object
	var objLogoutXMLDOM = new ActiveXObject("Microsoft.XMLDOM");
	var objElem = objLogoutXMLDOM.createElement("LOGOUT");
	objLogoutXMLDOM.appendChild(objElem);
	var objRoot = objLogoutXMLDOM.documentElement;

	// add Session ID to XMLDOM object
	objElem = objLogoutXMLDOM.createElement("SESSION_ID");
	objRoot.appendChild(objElem);
	objElem.text = strSessionID;

	// create XMLHTTP object and use it to send login info to server
	var xmlRequest = new ActiveXObject("microsoft.xmlhttp");
	xmlRequest.open("POST", "/TT/common/asp/auth.asp", false);
	xmlRequest.send(objLogoutXMLDOM);
}

function hilite(oNode)
{
	if (oNode == null)
		return;

	oNode.oldColor = oNode.currentStyle.color;
	oNode.style.color = globals.strHighlightColor;
}

function lowlite(oNode)
{
	if ((oNode == null) || (typeof(oNode.oldColor) != "string"))
		return;

	oNode.style.color = oNode.oldColor;
}

function showAccessDenied(errCode)	// ODWEB ONLY
{
	switch (errCode)
	{
		case EXCEEDED_NUM_CONCURRENT:
			globals.fraMain.location.href = "/" + strRootDir + "/common/html/concurrentexceeded.htm";
			break;
		case EXPIRED_USER_MODULE:
			globals.fraMain.location.href = "/" + strRootDir + "/common/html/moduleexpired.htm";
			break;
		case CORPORATE_NOACCESS:
			globals.fraMain.location.href = "/" + strRootDir + "/common/html/genericmoduleaccess.htm";
			break;
		case INVALID_SESSION:
		case EXPIRED_SESSION:
		case INVALID_USER_MODULE:
		default:
			globals.fraMain.location.href = "/" + strRootDir + "/common/html/moduleaccess.htm";
   	}
   	
	var nModuleID = parseInt(globals.getVar("MODULE_ID"));

	if (typeof(globals.fraTTBar) == "object")
		globals.fraTTBar.loadAccessDeniedBar();
}

function isReleaseVer()
{
	/*
	// all documents should have globals defined and assigned
	// to a reference to the global frame - check for it first
	if (typeof(globals) != "object")
	{
		// no global frame reference - get one
		var globals = window;
		while ((globals) && (globals.document.location.href.search(re1) < 0))
		{
			globals = globals.parent;
		}
		if (globals == null)
		{
			alert("Fatal error: Cannot find global frame");
			return(false);
		}
	}

	// .asp extension tells us this is release version, .htm is developer's version
	if (globals.document.location.href.search(re2) == -1)
		return(false);
	else
		return(true);
	*/
	return(true);

}

function GetOSVersion()
{
	if (typeof(globals) == "object")
		var strOSVersion = globals.gOSVersion;
	else
		var strOSVersion = "";

	if (strOSVersion == "")
	{
		var arrSettings = window.clientInformation.appVersion.split(";");
		var nLen = arrSettings.length;
		// location of OS version info might change in the future
		for (var i = 0; i < nLen; i++)
		{
			var strTemp = arrSettings[i].toLowerCase();
			if (strTemp.indexOf("windows") != -1)
				strOSVersion = arrSettings[i].replace(")", "");	//remove final ")"
		}

		if (typeof(globals) == "object")
			globals.gOSVersion = strOSVersion;
	}

	return (strOSVersion);
}

function setCountryCode(strZipCode, bInitializing)
{
	try
	{
		//-------------------------------------------------------------------------------------+
		// bInitializing determines whether inferred country code is saved to globals variable |
		// or to usersettingsframe.js::strTmpPVCountryCode variable.  CMR 06.17.2002           |
		//-------------------------------------------------------------------------------------+
		if (bInitializing == true)
		{
			if (typeof(strPVCountryCode) != "string")
				return;
		}
		else
		{
			if ((typeof(top) != "object") || (typeof(top.strTmpPVCountryCode) != "string"))
				return;
		}

		// Remove space that may occur in a Canadian zip
		var aryZip = strZipCode.split(" ");
		var len = aryZip.length;
		var strTempZip = "";
		for (var i = 0; i < len; i++)
			strTempZip += aryZip[i];

		//--------------------------------------------------------------------------------------+
		// Look for the Canadian zip format of <letter><number><letter><number><letter><number> |
		// NOTE: regular expression used here is case-insensitive.  CMR 06.17.2002              |
		//--------------------------------------------------------------------------------------+
		var reCanada = /[a-zA-Z][0-9][a-zA-Z][0-9][a-zA-Z][0-9]/;
		if (strTempZip.match(reCanada))
			var strCountryCode = "CA";
		else
			var strCountryCode = "US";

		// Set appropriate variable with inferred country code
		if (bInitializing == true)
			strPVCountryCode = strCountryCode;
		else
			top.strTmpPVCountryCode = strCountryCode;
	}
	catch(e)
	{
		return;
	}
}

function GetCityStateForZip(zip, location)
{
	//--------------------------------------------------------------------------------------+
	// Expect Canadian zips to follow format of "LNL NLN" or "LNLNLN" (L=Letter, N=Number), |
	// so either 6 or 7 characters in length. Expect US zips to be either 5, 9 or 10        |
	// characters in length, (55555, 555554444 or 55555-4444).  CMR 06.17.2002              |
	//--------------------------------------------------------------------------------------+
	if ((zip.length != 6) && (zip.length != 7))
		zip = zip.substr(0,5);

	// If zip is 5 digit American, attempt to auto-fill City and State
	var re = /^\d{5}$/;
	var isUSZip = zip.match(re); //check if 5 digits
	if (isUSZip != null)
	{
		//get url
		var m = zip.substr(0,1);
		var n = zip.substr(1,1);
		var url = "/TT/common/asp/secureodrefdata.asp?nDataType=2&nmOdrefdata=zipcode" + m + n + ".xml";

		//load url
		oZipXML = LoadXMLFile(url);

		//get city and state
		if (oZipXML != null)
		{
			var filterTemplate = "//ZIP[@ID = '&value']";
			var filter = filterTemplate.replace('&value', zip);
			var oZipNode = oZipXML.selectSingleNode(filter);
			if (oZipNode != null) //found the zipcode
			{
				//get state and city values
				location.state = oZipNode.getAttribute("STATE");
				location.city = oZipNode.getAttribute("CITY");
			}
			else
			{
				location.state = "";
				location.city = "";
			}
		}
	}
	else
	{
		location.state = "";
		location.city = "";
	}
}

function setSearchFocus(oDoc)
{
	var objSrch = oDoc.getElementById("inpSearch");
	if (objSrch != null)
	{
		objSrch.focus();
	}
}

function helpModeClick()
{
	var strHeight = window.screen.availHeight - 100;
	var strWidth = window.screen.availWidth - 100;
	var strTop = (window.screen.availHeight - strHeight)/2;
	var strLeft = (window.screen.availWidth - strWidth)/2;


	//open window for quote view print preview
	url = strUrlSearch;
	var strFeatures = "top=" + strTop + ",left=" + strLeft + ",height=" + strHeight + ",width="+ strWidth + ",resizable=yes,status=yes,scrollbars=yes,titlebar=no,toolbar=no,menubar=no,location=no";
	var oWindow = window.open(url,"winTitlesHelp", strFeatures);
	oWindow.focus();
}

 