// 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 = "mric";
var re1 = /mric\./;
var re2 = /mric\.asp/;

// Constants Messages
var strMessageNoData = "Information for this vehicle is not available."

// 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!!!!!

// window pointers
var pConfiguration;
var pProfileCreation;
var pAdminHome;
var pAnnotationEULA;
var suggestionBlacklistWindow;

String.prototype.trim = function() {
    a = this.replace(/^\s+/, '');
    return a.replace(/\s+$/, '');
};


function getTitle(frame)
{
    var sTitle;
    var elements = frame.document.body.getElementsByTagName("h1");
    
    if (elements)
        sTitle =  elements[0].innerText;
    else
        sTitle = "";
    
    return sTitle;
}

function GetImageLink(strImageGUID, strMOD, strHost)
{
	var strQueryString = "http://" + strHost + "/mric/common/asp/Graphic.aspx?";
	//<img width=620 id="idImage" src=
	strQueryString += "MOD=" + strMOD + "&";
	strQueryString += "MODULE_ID=" + globals.getVar("MODULE_ID") + "&";
	strQueryString += "SESSION_ID=" + encodeURI(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;
	var nImgLinks = imgLinks.length
	for (i=0; i < nImgLinks; i++)
	{
	
		if (imgLinks[i].className == "clsExtGraphicLink" || imgLinks[i].className == 'ExtGxLnk') //article.css change
		{
			parentSpan = getSpanItem(imgLinks[i].parentElement);
				
			if (parentSpan != null)
			{
				var rep = "<br>" + GetImageTag(stripImageGUID(imgLinks[i].id), "REPTIFF", 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(element, tagName)
{
	var childNodes = element.children;
	var len = childNodes.length;
    for (var childIndex=0;childIndex<len;childIndex++)
    {
    	if (tagName == childNodes[childIndex].tagName) 
    	{
    	    return childNodes[childIndex];
    	}
    }
    return false;
}

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);
}

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)
		eTab.width = newWidth;
}

function hotImageOn(eTab, newWidth)
{
	SwapGraphic(eTab, g_strSelected, null);
	if (newWidth && eTab)
		eTab.width = newWidth;
}

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", "/mric/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/asp/moduleaccess.aspx";
   	}
   	
	var nModuleID = parseInt(globals.getVar("MODULE_ID"));

	if (typeof(globals.fraMRICBar) == "object")
		globals.fraMRICBar.loadAccessDeniedBar();
}

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 = "/mric/common/asp/secureodrefdata.aspx?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();
}

function saveExternalSearchTerm(objForm)
{
    try
    {
        window.external.AutoCompleteSaveForm(objForm);
    }
    catch (e)
    {
        // eat the exception
    }
}

function SetValue(ControlName,Value,ControlType)
{
	if (Value == null)
			Value = "";        
	var oCtl = document.getElementById(ControlName);
	if (oCtl)
	{
		if (ControlType == "INPUT")
		{
			var inputType = oCtl.getAttribute("TYPE").toUpperCase();
			if (inputType == "CHECKBOX" || inputType == "RADIO")
			{
				oCtl.checked = Value;
			}else{
//			if (inputType == "HIDDEN" || inputType == "SELECT-ONE")
				oCtl.value = Value;
			}
		}
		if (ControlType == "HTML")
		{
			oCtl.innerHTML = Value;
		}
	}
}

function fillDB(collection)
{
    var m_Return = new Array();
	for(var i in collection)
	{
		m_Return[collection[i].Key] = collection[i].Value;
	}
	
	return m_Return;
}

function ImageRollover(imgId, imgFileName) 
{
    var imgControl = document.getElementById(imgId);
    if (imgControl != null)
    {
        imgControl.src = imgFileName;
    }
}

var ProfileManagerQueryStringTemplate = "/mric/common/asp/ProfileManager.aspx?ShopName={0}&ShopNumber={1}&ShopUserId={2}&UserSessionId={3}&UniqueParam={4}"

function GetAdminHomeUrl()
{
    return "/mric/common/asp/AdminHome.aspx?SESSION_ID=" + encodeURI(globals.getVar("SESSION_ID"));
}

function GetProfileManagerUrl()
{    
    var m_UserControlNode = globals.gUserSettings.selectSingleNode("//USER_SHOP");    
    var m_UserSessionId = globals.getVar("SESSION_ID");
    var m_ShopNumber = "";
    var m_ShopName = "";
    var m_ShopUserId = "";
    var m_Return;
    
    if(m_UserControlNode)
    {
        m_ShopName = m_UserControlNode.getAttribute("SHOP_NAME");
        m_ShopNumber = m_UserControlNode.getAttribute("SHOP_NUMBER");        
        m_ShopUserId = m_UserControlNode.getAttribute("USER_CUST_ID");
    }
    
    m_Return = ProfileManagerQueryStringTemplate;
    m_Return = m_Return.replace("{0}", m_ShopName);
    m_Return = m_Return.replace("{1}", m_ShopNumber);
    m_Return = m_Return.replace("{2}", m_ShopUserId);
    m_Return = m_Return.replace("{3}", encodeURI(m_UserSessionId));
    m_Return = m_Return.replace("{4}", Math.random());
    
    return m_Return;    
}

var ConfigurationUrlTemplate = "/mric/common/asp/Configuration.aspx?SESSION_ID={0}&AUTH_SOURCE={1}&USER_TYPE={2}";
function GetConfigurationUrl()
{   
    var m_UserSessionId = globals.getVar("SESSION_ID");
    var m_AuthSource = globals.getVar("AUTH_SOURCE"); 
    var m_UserType = globals.getVar("USER_TYPE");
        
    var m_Return = ConfigurationUrlTemplate.replace("{0}", encodeURI(m_UserSessionId));
    m_Return = m_Return.replace("{1}", m_AuthSource);
    m_Return = m_Return.replace("{2}", m_UserType);

    return m_Return;
}

function GetAnnotationEULAUrl()
{
    return "/mric/common/asp/AnnotationEULA.aspx?SESSION_ID=" + encodeURI(globals.getVar("SESSION_ID"));
}

function GetShopNumber()
{
    var sRtn = "";
    var elemShopNumber = globals.gUserSettings.selectSingleNode("/USER_INFO/USER_SHOP/@SHOP_NUMBER");
    if( !elemShopNumber )
    {
        elemShopNumber = globals.gUserSettings.selectSingleNode("/USER_CONTROL/@SHOP_NUMBER"); 
    }
    
    if( elemShopNumber )
    {
        sRtn = elemShopNumber.value;
    }
    return sRtn;
}

function ValidateRequiredField(controlId, invalidMessage)
{
    return ValidateRegExField(controlId, /.+/, invalidMessage);
}

function ValidateRegExField(controlId, regEx, invalidMessage)
{
    var m_Control = document.getElementById(controlId);
    if (m_Control)
    {
        if (!regEx.test(m_Control.value))
        {
            alert(invalidMessage);
            m_Control.focus();
            return false;
        }
        else
        {
            return m_Control.value;
        }
    }
}

function ShowConfigurationDialog()
{
    pConfiguration = ShowWindow(GetConfigurationUrl(), pConfiguration, 'wndConfiguration', 660, 600);
}

function ShowAnnotationEULADialog()
{
    pAnnotationEULA = ShowWindow(GetAnnotationEULAUrl(), pAnnotationEULA, 'wndAnnotationEULA', 660, 600);    
}

var WindowSettingsTemplate = 'top=50,left=200,width={0},height={1},resizable=yes,scrollbars=yes';


function ShowCreateProfileDialog()
{          
    pProfileCreation = ShowWindow(GetProfileManagerUrl(), pProfileCreation, 'wndAnnotationProfileCreation', 660, 600);
}

function AdminHomeDialog()
{
    pAdminHome = ShowWindow(GetAdminHomeUrl(), pAdminHome, 'wndAdminHome', 875, 550);
}

function SearchPhraseFrequencyReportDownload()
{ 
    var src = window.parent.frames('fraSearchPhrase').document.location;
    src.href = '/mric/common/asp/SearchPhraseFrequencyReport.aspx';
}

function SuggestionBlacklistDialog()
{
    suggestionBlacklistWindow = ShowWindow('/mric/suggestions/blacklist.aspx',
                                            suggestionBlacklistWindow,
                                            'suggestionBlacklistWindow',
                                            640, 480);
}

function ShowWindow(m_Url, m_WindowPointer, m_WindowName, m_Width, m_Height)
{
    if(!IsWindowOpen(m_WindowPointer))
    {           
        var m_WindowSettings = WindowSettingsTemplate.replace("{0}", m_Width);
        m_WindowSettings = m_WindowSettings.replace("{1}", m_Height);
        m_WindowPointer = window.open(m_Url, m_WindowName, m_WindowSettings);
    }
    else
    {
        m_WindowPointer.focus();
    } 
    return m_WindowPointer; 
}

function IsWindowOpen(pWindow)
{
    try 
    {
        return pWindow && !pWindow.closed
    }
    catch(ex)
    {
        return false;
    }
}


//TODO: replace calls to changeSelection when moving asp to .net
function SetupMenu_OnChange(m_ddlSetupMenu)
{
    var m_optSelected;
    var m_UserSessionId = globals.getVar("SESSION_ID");
    if (m_ddlSetupMenu)
    {
        m_optSelected = m_ddlSetupMenu.options.item(m_ddlSetupMenu.selectedIndex);
        if (m_optSelected)
        {
            var m_SelectedValue = m_optSelected.value;
            
            switch(m_SelectedValue)
            {
                case "QUOTE":
                    document.location.href = "/mric/useraccess/useraccessframe.asp?sid=" + encodeURI(m_UserSessionId) + "&m=qd";
                    break;
                case "SHOP":
                    document.location.href = "/mric/useraccess/useraccessframe.asp?sid=" + encodeURI(m_UserSessionId) + "&m=si";
                    break;
                case "ACCESS":
                    document.location.href = "/mric/useraccess/useraccessframe.asp?sid=" + encodeURI(m_UserSessionId) + "&m=ua";
                    break;
                case "SESSION":
                    document.location.href = "/mric/useraccess/useraccessframe.asp?sid=" + encodeURI(m_UserSessionId) + "&m=us";
                    break;
                case "ABOUT":
                    document.location.href = "/mric/useraccess/useraccessframe.asp?sid=" + encodeURI(m_UserSessionId) + "&m=ab";
                    break;
                case "CONFIGURATION":
                    document.location.href = "/mric/useraccess/useraccessframe.asp?sid=" + encodeURI(m_UserSessionId) + "&m=cf";
                    break;
                case "CHANGE_PASSWORD":
                    document.location.href = "/mric/useraccess/useraccessframe.asp?sid=" + encodeURI(m_UserSessionId) + "&m=ch";
                    break;        
            }
        }
    }
}


function getQuerystringValue(querystring, name)
{
    tokens = querystring.split("&");
	nLength = tokens.length;
	for( nX=0 ; nX < nLength; nX++)
	{
		nIndex = tokens[nX].indexOf("=");
		key = tokens[nX].substring(0,nIndex);
		if (key==name)
		{
		    value = tokens[nX].substring(nIndex + 1);
	        return value;
		}
    }	
	return "";	
} 
