/**
 * =~=~=~=~=~=~=~=~=~=~=~=~=~=~=
 * MapQuest Global JavaScript
 * =~=~=~=~=~=~=~=~=~=~=~=~=~=~=
 * common js for site
 * =~=~=~=~=~=~=~=~=~=~=~=~=~=~=
 * TOC
 * - default variables
 * - get element by id
 * - swap image
 * - add event
 * - remove event
 * - get event data
 * - set cookie
 * - read cookie
 * - delete cookie
 * - get browser info
 * - get browser size
 * - get browser version
 * - http xml request
 * - load js
 * - set focus
 * - param exists
 * - autofill
 * - clear settings
 * - new window pop-up
 * - open abbrev
 * - default text
 * - maxlength
 * - saved recent init
 * - show saved recent
 * - populate saved recent
 * - close saved window
 * - close popup
 * - is info changed
 * - add hid fields
 * - png supported
 * - get xy
 * - initialization
 *
 */

/**
 * =DEFAULT VARIABLES
 */
document.cookie = "JSEnabled=1"; //needed to make sure browser has JS on
var artUrl      = "http://cdn.mapquest.com/mqsite/"; //default for non-map art assets

/**
 * =GET ELEMENT BY ID
 */
function getElementById(fId)
{
    if(document.getElementById(fId))
    {
        return document.getElementById(fId);
    }
    return null;
} //getElementById(fId)

/**
 * =SWAP IMAGE
 * @replace image
 */
function swapImage(fUrl, fId)
{
    var element = getElementById(fId);
    if(element)
    {
        element.src = fUrl;
    }
}//swapImage()

/**
 * =ADD EVENT
 * @attach event listener
 */
function addEvent(fObj, fEvent, fn)
{
    if(window.opera && getBrowserInfo().version < 8)
    {   // opera has bad dynamic event handling
        //eval("fObj.on" + fEvent + " = fn");
        var r = fObj.attachEvent("on"+fEvent, fn);
        return r;
    }
    else if (fObj.addEventListener)
    {   // moz, w3c
        ((window.opera) && (getBrowserInfo().version >= 8))?fObj.addEventListener(fEvent, fn, false):fObj.addEventListener(fEvent, fn, true);
        return true;
    }
    else if (fObj.attachEvent)
    {   // IE
        var r = fObj.attachEvent("on"+fEvent, fn);
        return r;
    }
    else
    {   //other
        fObj["on" + fEvent] = fn;
    }
}//addEvent()

/**
 * =REMOVE EVENT
 * @detach event listener
 */
function removeEvent(fObj, fEvent, fn)
{
    if(window.opera)
    {   // opera has bad dynamic event handling
        eval("fObj.on" + fEvent + " = null");
    }
    if(fObj.removeEventListener)
    {   //w3c
        ((window.opera) && (getBrowserInfo().version >= 8))?fObj.removeEventListener(fEvent, fn, false):fObj.removeEventListener(fEvent, fn, true);
    }
    else if(fObj.detachEvent)
    {   //ie
        fObj.detachEvent("on" + fEvent, fn);
    }
    else
    {   //opera and other
        fObj["on" + fEvent] = null;
    }
} //removeEvent()

/**
 * =GET EVENT DATA
 * @return the id that event is attached to
 */
function getEventData(evt)
{
    fEventData = new Object();
    if(document.addEventListener)
    {
        //safari 1.3.1 returns the text object inside the anchor tag as evt target, hence take that parent node as the event target.
        if(evt.target.nodeType == 3)
        {
            fEventData.id       = evt.target.parentNode.id;
            fEventData.element  = evt.target.parentNode;
        }
        else
        {
            fEventData.id       = evt.target.id;
            fEventData.element  = evt.target;
        }
        fEventData.type         = evt.type;

    }
    else if(window.event)
    {
        fEventData.id           = window.event.srcElement.id;
        fEventData.type         = window.event.type;
        fEventData.element      = window.event.srcElement;
    }
    else
    {
        return null;
    }
    return fEventData;
} //getEventData()

/**
 * =SET COOKIE
 * @set fValue of cookie
 */
function setCookie(fName, fValue, fTime)
{
    var fExp        = "";
    var fDomain     = (mqDomain) ? mqDomain : "";
    if (fTime)
    {
        var fDate   = new Date();
        fDate.setTime((fTime * 60 * 60 * 24 * 1000) + fDate.getTime());// # of days
        fExp        = fDate.toGMTString();

    }
    document.cookie = fName + "=" + fValue + ";domain="  + fDomain + ";path=/;expires=" + fExp;
}

/**
 * =READ COOKIE
 * @read value of cookie
 */
function readCookie(fName)
{
    var cookieName      = fName + "=";
    var cookieArray     = document.cookie.split(';');
    for(var i = 0, n = cookieArray.length; i < n; i++)
    {
        var cookie = cookieArray[i];
        while (cookie.charAt(0) == ' ')
        {
            cookie = cookie.substring(1, cookie.length);
        }
        if (cookie.indexOf(cookieName) == 0)
        {
            return cookie.substring(cookieName.length, cookie.length);
        }
    }
    return null;
} //readCookie()

/**
 * =DELETE COOKIE
 * @remove value of cookie
 */
function deleteCookie(fName)
{
    setCookie(fName, "", -1)
} //deleteCookie()

/**
 * =GET BROWSER INFO
 */
function getBrowserInfo()
{
    browser                 = new Object();
    browser.name            = browser.version = browser.os = "unknown";
    var userAgent           = navigator.userAgent.toLowerCase();
    var browserListArray    = new Array("firefox", "msie", "netscape", "opera", "safari");
    var osListArray         = new Array("linux", "mac", "windows", "x11");
    for(var i = 0, n = browserListArray.length; i < n; i++)
    {   // get browser name and version
        var strPosition = userAgent.indexOf(browserListArray[i]) + 1;
        if(strPosition > 0)
        {
            browser.name = browserListArray[i]; // browser name

            var versionPosition = strPosition + browser.name.length;
            var incr = ((browser.name == "safari") || (userAgent.charAt(versionPosition + 4) > 0 && userAgent.charAt(versionPosition + 4) < 9)) ? 5 : 3;

            browser.version     = userAgent.substring(versionPosition, versionPosition + incr); // browser version
        }
    }
    for(var i = 0, n = osListArray.length; i < n; i++)
    {
        var strPosition = userAgent.indexOf(osListArray[i]) + 1;
        if(strPosition > 0)
        {
            browser.os  = osListArray[i];
        }
    }

    return browser;

} //getBrowserInfo()

/**
 * =GET BROWSER SIZE
 * @get height and width of browser canvas
 */
function getBrowserSize()
{
    size = new Object();
    if (document.body.scrollHeight > document.body.offsetHeight)
    {
        size.width  = document.body.scrollWidth;
        size.height = document.body.scrollHeight;
    }
    else
    {
        size.width  = document.body.offsetWidth;
        size.height = document.body.offsetHeight;
    }
    if (document.body.clientWidth)
    {
        size.width  = document.body.clientWidth;
        size.height = document.body.clientHeight;
    }
    else
    {
        size.width  = document.body.offsetWidth;
        size.height = document.body.offsetHeight;
    }
    if (document.documentElement.clientWidth)
    {   // IE6, safari, opera
        size.width  = document.documentElement.clientWidth;
        size.height = document.documentElement.clientHeight;
    }
    if(self.innerWidth)
    {
        size.width  = self.innerWidth;
        size.height = self.innerHeight;
    }
    return size;
} //getBrowserSize()

/**
 * =GET BROWSER VERSION
 * @old browser version detection used throughout the site
 */
function getBrowserVersion()
{
    var browserVer;
    var offset, offset2;

    var retData = new Array();

    retData.mozillaVersion = parseInt(navigator.appVersion);
    retData.browserName = navigator.appName;
    retData.ua = navigator.userAgent;
    if(retData.browserName == "Microsoft Internet Explorer")
    {
        offset = retData.ua.indexOf("MSIE ");
        retData.browserName2 = retData.ua.substring(offset, retData.ua.indexOf(" ", offset));
        retData.browserVer = parseFloat(retData.ua.substring(offset + 5, retData.ua.indexOf(";", offset)));
        browserVer = parseFloat(retData.ua.substring(offset + 5, retData.ua.indexOf(";", offset)));
    }
    else if(retData.browserName == "Netscape")
    {
        browserVer = parseInt(navigator.appVersion);
        offset = retData.ua.indexOf("Netscape");
        if(offset < 0)
            offset = retData.ua.indexOf("Firefox");
        if(offset < 0)
            offset = retData.ua.indexOf("Safari");
        retData.browserName2 = retData.ua.substring(offset, retData.ua.indexOf("/", offset));
        offset = retData.ua.indexOf("/",offset);
        offset2 = retData.ua.indexOf(" ", offset);
        if(offset2 >= 0)
            retData.browserVer = parseFloat(retData.ua.substring(offset + 1, retData.ua.indexOf(" ", offset)));
        else
            retData.browserVer = parseFloat(retData.ua.substring(offset + 1));
    }
    else
    {
        retData.browserName2 = "unknown";
        retData.browserVer = 0;
        browserVer = parseInt(navigator.appVersion);
    }
    if(retData.ua.indexOf("Windows") >= 0)
        retData.platform = "Windows";
    else if(retData.ua.indexOf("Macintosh") >= 0)
        retData.platform = "Macintosh";
    else if(retData.ua.indexOf("Linux") >= 0)
        retData.platform = "Linux";
    else
        retData.platform = "Unknown";
    return retData;
} //getBrowserVersion()


/**
 * =HTTP XML REQUEST
 * @makes a XMLHttpRequest standardized for supported browsers
 */
function mqXMLHttpRequest()
{
    var request = null;
    if(window.XMLHttpRequest)
    {   //moz, safari1.2+, opera8
        try
        {
            request = new XMLHttpRequest();
            //request.overrideMimeType('text/xml');
        }
        catch(e)
        {
            request = null;
        }
    }
    else if(window.ActiveXObject)
    {   //ie5.5+
        try
        {
            request = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch(e)
        {
            try
            {
                request = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch(e)
            {
                request = null;
            }
        }
    }
    return request;
} //mqXMLHttpRequest()
var xmlHttp = mqXMLHttpRequest();


/**
 * =LOAD JS
 * @loads or reloads a .js file
 * @usage: loadJS(file name, id name, parent element)
 */
function loadJS(fFile, fId, fParent)
{
    var parent      = document.getElementsByTagName(fParent).item(0);
    var scriptTag   = document.getElementById(fId);
    if(scriptTag)
    {
        parent.removeChild(scriptTag);
    }
    script          = document.createElement("script");
    script.src      = fFile;
    script.type     = "text/javascript";
    script.id       = fId;
    parent.appendChild(script);
}//loadJS()

/**
 * =SET FOCUS
 * @set focus to element with accesskey="x"
 */
function setFocus()
{
    if (!document.getElementsByTagName) return;
    var e = document.getElementsByTagName("*");
    for (var i=0; i<e.length; i++)
    {
        var clsName = e[i];
        if(clsName.getAttribute("accesskey") == "x")
        {
            clsName.focus();
            break;
        }
    }
}//setFocus()

/**
 * =PARAM EXISTS
 * @validate variables
 */
function paramExists(varname)
{
    if (typeof varname != 'undefined')
    {
        return true;
    }
    return false;
}// paramExists()

/**
 * =AUTOFILL
 * @auto fill-in form field
 */
function autoFill(fId, fNextId)
{
    if (document.getElementById("r" + fId))
    {
        var idArray     = new Array("a", "csz", "c", "s", "z");
        var rId         = document.getElementById("r" + fId)
        var addr        = rId.value.split("|");
        var a           = 0;
        for (var i = 0; i < idArray.length; i++)
        {
            if((i == 0) && (addr[i].substring(0,5) == "clear") && (addr.length < 2))
            {   //value of "clearXXX" means to clear some kind of cookie data
                clearSettings(addr[i]);
                return;
            }
            if(document.getElementById(idArray[i] + fId))
            {
                document.getElementById(idArray[i] + fId).value = (paramExists(addr[a])) ? addr[a] : "";
                a++;
            }
        }
        if(document.getElementById(fNextId) && (addr.length > 1))
        {
            rId.options.selectedIndex = 0;
            document.getElementById(fNextId).focus();
        }
    }
    else if ((fId == 0) && document.getElementById(fNextId))
    {
        document.getElementById(fNextId).focus();
    }
}//autoFill()

/**
 * =CLEAR SETTINGS
 * @remove cookies
 */
function clearSettings(fInput, fLoc)
{
    var cookieArray         = new Array();
    var fText;
    switch (fInput)
    {
        case "clearAll":
            cookieArray[0]  = "locationhistory";
            cookieArray[1]  = "locationhistoryHome";
            cookieArray[2]  = "locationhistoryWork";
            fText           = "Home, Work, and Recent Search Locations";
        break;
        case "clearRecent":
            cookieArray[0]  = "locationhistory";
            fText           = "Recent Searches";
        break;
        case "clearHome":
            cookieArray[0]  = "locationhistoryHome";
            fText           = "Home Location";
        break;
        case "clearWork":
            cookieArray[0]  = "locationhistoryWork";
            fText           = "Work Location";
        break;
        default:
            return;
    }
    if(confirm("Are you sure you want to clear your " + fText + "?"))
    {
        for (var i = 0; i < cookieArray.length; i++)
        {
            document.cookie = cookieArray[i] + "=;domain=" + mqDomain + ";path=/;expires=Thu,01-Jan-70 00:00:01 GMT";
        }
        if(paramExists(fLoc))
        {
            window.location = fLoc;
        }
        else
        {
            window.location.reload();
        }
    }
}//clearSettings()


/**
 * =NEW WINDOW POP-UP
 * @usage: URL is only required param
 * @url, window name, width, height, scrollbars (yes,no), center (true,false)
 * @<a href="http://mapquest.com" onclick="newWin(this.href,'name','400','400','no', true);return false;">link</a>
 * @<a href="javascript: newWin('http://mapquest.com','name','400','400','no', true);">link</a>
 */
function newWin(fPage, fName, fWidth, fHeight, fScroll, fCenter)
{
    if(paramExists(fPage) == false)
    {   // no url to open
        return;
    }
    if(paramExists(fName) == false)
    {   // if no name, create one
        var fName = "newWin"+ Math.random();
    }
    if(paramExists(fScroll) == false)
    {   // scrollbar defaults to 'yes'
        var fScroll = "yes";
    }
    if((paramExists(fCenter) == false) || (fCenter == false))
    {   // auto-center defaults to "false"
        var winl = wint = 10;
    }
    else if (fCenter == true)
    {
        var winl = (screen.width - fWidth) / 2;
        var wint = (screen.height - fHeight) / 2;
    }
    if(paramExists(fWidth) == false)
    {   // default width
        var fWidth = 250;
    }
    if(paramExists(fHeight) == false)
    {   // default height
        var fHeight = 600;
    }
    var winprops = 'height='+fHeight+',width='+fWidth+',top='+wint+',left='+winl+',scrollbars='+fScroll+',directories=no,resizable=yes';
    win = window.open(fPage, fName, winprops);
    if (parseInt(navigator.appVersion) >= 4)
    {
        win.window.focus();
    }
}// newWin()

/**
 * =OPEN ABBREV
 * @generates pop-up for state abbreviation selector
 */
function openAbbrev (idField, skipFlag) {
    var stdOptions = "resizable=no,directories=no,left=10,top=10,toolbar=no";
    if(skipFlag != null)
    {
        var url  = "/maps/abbrev.adp?idfield=" + idField + "&skip=" + skipFlag
    }
    else
    {
        var url  = "/maps/abbrev.adp?idfield=" + idField
    }
    newWin(url, "abbrevs");
}

/**
 * =DEFAULT TEXT
 * @removes default input value on selection
 */
function defaultText(fId)
{
    var fValue = document.getElementById(fId)
    if (fValue.value == fValue.defaultValue)
    (fValue.value="")
}//defaultText()

/**
 * =MAXLENGTH
 * @character count and limit
 */
function maxLength(fId, fCount)
{
    var element = document.getElementById(fId);
    if (element.value.length  >= fCount-1)
    {
        element.value = element.value.substring(0, fCount-1);
    }
}//maxLength()

/**
 * =SAVED RECENT INIT
 * @saved and recent popup window related methods
 */
function savedRecentInit()
{
    var savedRecent = document.images;
    for(i=0;i<savedRecent.length;i++)
    {

        if(savedRecent[i].id.substring(0,1) == "r")
        {
            obj = getElementById(savedRecent[i].id);
            addEvent(obj, "click", showSavedRecent);
        }
    }
}//savedRecentInit()

/**
 * =SHOW SAVED RECENT
 * @saved and recent popup window related methods
 */
var localSavedObj;
function showSavedRecent(evt)
{
    var xyData      = getXY(evt);
    var imageObj    = getElementById(xyData.elementId);
    var imageX      = xyData.pageX - xyData.elementX;
    var imageY      = xyData.pageY - xyData.elementY;

    if(imageObj.src == (artUrl + "frmp-icon-savedover-v1"))
    {
        imageObj.src = artUrl + "frmp-icon-savedbtn-v1";
        getElementById("savedrecentpopup").style.display = "none";
        return;
    }
    imageObj.src    = artUrl + "frmp-icon-savedover-v1";
    localSavedObj   =  imageObj;
    //Get other saved recent buttons back to normal (from rolled over image)
    var savedRecent = document.images;
    for(var i = 0, l = savedRecent.length;i < l;i++)
    {
        if(savedRecent[i].id.substring(0,1) == "r")
        {
           obj = getElementById(savedRecent[i].id);
           if(obj.id  && obj.id != localSavedObj.id)
                obj.src = artUrl + "frmp-icon-savedbtn-v1";
        }
    }
     /* Based on the Address Panel (Directions Start, Directions End, Maps, etc) set the hidden field
       value to fill in the correct address fields
     */
    if(xyData.elementId == "r1")
        getElementById("addPanelRef").value = 1;
    else if(xyData.elementId == "r2")
        getElementById("addPanelRef").value = 2;
    else if(xyData.elementId == "r3")
        getElementById("addPanelRef").value = 3;

    var imageObjWidth               = imageObj.style.width;
    var imageObjHeight              = imageObj.style.height;
    imageObjWidth                   = 60;
    imageObjHeight                  = 22;

    var rightPosX                   = imageX+ imageObjWidth;
    var rightPosY                   = imageY+ imageObjHeight;
    var popUpElement                = getElementById("savedrecentpopup");
    popUpElement.style.top          = String(rightPosY)+"px";
    popUpElement.style.paddingLeft  = "0px";

    //To push the popup to the right incase the left margin falls below zero
    var leftOffset;
    if(rightPosX-330 <0) {
        leftOffset= -(rightPosX-332);
        popUpElement.style.left = String(rightPosX+leftOffset-330)+"px";
    }else {
        popUpElement.style.left = String(rightPosX-330 + 10)+"px";
    }//leftOffset

    //To push the popup to the left incase the right margin exceeds the browser width
    var browserSize = getBrowserSize();
    var rightOffset;
    if(rightPosX > browserSize.width) {
        rightOffset = rightPosX - browserSize.width;
        popUpElement.style.left = String(rightPosX-332-rightOffset)+"px";
    }//rightOffset

    var browser = getBrowserInfo();
    if (browser.name == 'msie')
    {
        getElementById("savedcenter").style.height = "10px";
        if(browser.version >= 5.5)
        {
            getElementById("savedtop").style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://cdn.mapquest.com/mqsite/frmp-bg-savedtop-v1.png', sizingMethod='scale')";
            getElementById("savedbottom").style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://cdn.mapquest.com/mqsite/frmp-bg-savedbtm.png', sizingMethod='scale')";
            getElementById("savedcenter").style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://cdn.mapquest.com/mqsite/frmp-bg-savedcntr.png', sizingMethod='scale')";
        }
        else
        {
            getElementById("savedbottom").style.height = "13px";
            getElementById("savedtop").style.background = "transparent url(http://cdn.mapquest.com/mqsite/frmp-bg-savedtop) no-repeat left";
            getElementById("savedbottom").style.background = "transparent url(http://cdn.mapquest.com/mqsite/frmp-bg-savedbtm) no-repeat left";
            getElementById("savedcenter").style.background = "transparent url(http://cdn.mapquest.com/mqsite/frmp-bg-savedcntr) 0 100% repeat-y";
        }
    }
    else
    {
        if(window.opera && getBrowserInfo().version < 8)
        {
           // Preload images
           getElementById("savedcenter").style.background = "transparent url(http://cdn.mapquest.com/mqsite/frmp-bg-savedcntr.png) 0 0% repeat-y";
           getElementById("savedtop").style.background = "transparent url(http://cdn.mapquest.com/mqsite/frmp-bg-savedtop.png) no-repeat left";
           getElementById("savedbottom").style.background = "transparent url(http://cdn.mapquest.com/mqsite/frmp-bg-savedbtm.png) 0 0% repeat-y";
        }
        getElementById("savedtop").style.background = "transparent url(http://cdn.mapquest.com/mqsite/frmp-bg-savedtop-v1.png) no-repeat left";
        getElementById("savedbottom").style.background = "transparent url(http://cdn.mapquest.com/mqsite/frmp-bg-savedbtm.png) no-repeat left";
        getElementById("savedcenter").style.background = "transparent url(http://cdn.mapquest.com/mqsite/frmp-bg-savedcntr.png) 0 100% repeat-y";
    }
    getElementById("savedrecentpopup").style.display = "block";
}//showSavedRecent()

/**
 * =POPULATE SAVED RECENT
 * @ populates the form fields with the selected saved/recent address information
 */
function populateSavedRecent(fId, fNextId, value)
{
    closeSavedWindow();
    fId             = getElementById("addPanelRef").value;
    var idArray     = new Array("pn", "a", "c", "s", "z");

    //Homepage Map Form
    if(fId == 3)
        idArray     = new Array("cat", "address","city", "state", "zipcode");

    var addr        = value.split("|");
    var a           = 0;
    //by any chance, if the 'x' hidden fields are not there, create them first. This can happen when the user clicks back button of browser
    if((getElementById(idArray[0]) && !getElementById(idArray[0] + "x")) || (getElementById(idArray[0] + fId) && !getElementById(idArray[0] + fId + "x")))
    {
        addHidFields();
    }
    if ( (addr[0].substring(0,5) == "clear") && (addr.length < 2) ) {
      //value of "clearXXX" means to clear some kind of cookie data
      clearSettings(addr[0]);
      return;
    }

    for (var i = 0; i < idArray.length; i++) {
        if(fId == 3 && getElementById(idArray[i])) {
            if(paramExists(addr[a])) {
                if (!(addr[a] == "" && a == 0)) {
                    getElementById(idArray[i]).value = addr[a];
                }
                getElementById(idArray[i] + "x").value = addr[a];//getElementById(idArray[i]).value;
            }
        }
        else if(getElementById(idArray[i] + fId)) {
            if(paramExists(addr[a])) {
                if (!(addr[a] == "" && a == 0)) {
                    getElementById(idArray[i] + fId).value = addr[a];
                }
           	    getElementById(idArray[i] + fId + "x").value = addr[a];//getElementById(idArray[i] + fId).value;
            }
        }
        a++;
    }
    if (fId == 3) {
      getElementById("latlongtype").value = "internal";
      getElementById("latitude").value = addr[5];
      getElementById("longitude").value = addr[6];
      getElementById("popflag").value = "1";
      getElementById("name").value = addr[0];
      getElementById("phone").value = addr[8];
      getElementById("level").value = addr[9];
    } else {
        //call from Map
        if (document.body.id == "maps" && getElementById("formtypet")) { //its a call from map page
          getElementById("latlongtype").value = "internal";
          getElementById("latitude").value = addr[5];
          getElementById("longitude").value = addr[6];
          getElementById("popflag").value = "1";
          getElementById("name").value = addr[0];
          getElementById("phone").value = addr[8];
          getElementById("level").value = addr[9];

        } else { //call from ddform
          getElementById("ffi" + fId).value = "1";
          getElementById("l" + fId).value = addr[5];
          getElementById("g" + fId).value = addr[6];
          getElementById("n" + fId).value = addr[7];
          getElementById("pl" + fId).value = addr[8];
          getElementById("v" + fId).value = addr[9];
        }
    }
    if(getElementById("country")) {
        getElementById("country").value = addr[addr.length-1];
    }
    if(getElementById("level")) {
        getElementById("level").value = addr[addr.length-2];
    }
    //Setting the focus on next Field
    if(fId == 1)
    	fNextId = "pn2";
    else if(fId == 2)
    	fNextId = "submit1";
    else if(fId == 3)
    	fNextId = "mapsubmit";

    if(getElementById(fNextId) && (addr.length > 1))
    	getElementById(fNextId).focus();
}//populateSavedRecent()

/**
 * =CLOSE SAVED WINDOW
 * @ close saved and recent drop-down
 */
function closeSavedWindow(evt) {

    if(getElementById("savedrecentpopup"))
        getElementById("savedrecentpopup").style.display = "none";

    if(localSavedObj)
        localSavedObj.src = artUrl + "frmp-icon-savedbtn-v1";
}//closeSavedWindow()

/**
 * =CLOSE POPUP
 * @method for closing the saved and recent popup window while clicking on outside of the popup window
 */
addEvent(window.document, "click", closePopup);
function closePopup(evt)
{
	if(getElementById("savedrecentpopup") == null) return;
	if(getElementById("savedrecentpopup").style.display == "none")
	{
        return;
	}

    var evtobj;
    if(document.addEventListener && typeof evt.pageX == "number")
    {// Moz and Opera
	    evtobj = evt.target;
    }
    else if(window.event && typeof window.event.offsetX == "number")
    {//ie
	    evtobj = window.event.srcElement;
    }
	if (evtobj && (evtobj.id == "r1" || evtobj.id == "r2" || evtobj.id == "r3" || evtobj.id == "savedclose"))
    {
        return;
    }
	if((evtobj.offsetParent && evtobj.offsetParent.id !="savedrecentpopup" && evtobj.offsetParent.id  !="subcontainer") || (evtobj.offsetParent == null))
    {
        closeSavedWindow();
    }else
    {
        return;
    }
}//closePopup()

/**
 * =IS INFO CHANGED
 * @ compare form data with stored data
 */
function isInfoChanged(type)
{
    if(getElementById("country") && getElementById("country").value != 'US' && getElementById("country").value != 'CA') return; //do these checks only if country is US
	//if its a call from the 'see whats in your neighborhood' page, remove the unwanted fields and return. No info chk required
    if(getElementById("formtypet") && getElementById("formtypet").value == "neighborhood") {
        getElementById("addressForm").removeChild(getElementById("latitude"));
        getElementById("addressForm").removeChild(getElementById("longitude"));
        getElementById("addressForm").removeChild(getElementById("name"));
        getElementById("addressForm").removeChild(getElementById("phone"));
        getElementById("addressForm").removeChild(getElementById("popflag"));
        getElementById("addressForm").removeChild(getElementById("latlongtype"));
        return;
    }
    var hidFldExists = true;
    if(type == "maphome") {
        var idArr = new Array("cat", "address","city", "state", "zipcode");
        if(!getElementById(idArr[0] + "x")) hidFldExists = false;
        for(var i=0; i<idArr.length;i++) {
            if(!hidFldExists || !getElementById(idArr[i]) ||
            getElementById(idArr[i] + "x").value != getElementById(idArr[i]).value) {
                getElementById("popflag").value = "0";
                break;
            }
        }
    }
	else {
        var idArr1 = new Array("pn1", "a1", "c1", "s1", "z1");
        if(!getElementById(idArr1[0] + "x")) hidFldExists = false;
        if(getElementById(idArr1[0]) == null && type == "map") {   //no place name or cat field, clear the flags and go for regeocoding
            getElementById("popflag").value = "0";
        }
        else {
            for(var i=0; i<idArr1.length;i++) {
                if(!hidFldExists || !getElementById(idArr1[i]) ||
                getElementById(idArr1[i] + "x").value != getElementById(idArr1[i]).value) {
                    if(type != "map") {	//if it is from directions page
                        getElementById("ffi1").value = "";
                        getElementById("l1").value = "";
                        getElementById("g1").value = "";
                        getElementById("n1").value = "";
                    } else {
                        getElementById("popflag").value = "0";
                    }
                    break;
                }
            }
        }
    }
    if(type.indexOf("dir") >=0) {   //this is direction panel, do the comparison for 'To' address as well
        var idArr2 = new Array("pn2", "a2", "c2", "s2", "z2");
        if(!getElementById(idArr2[0] + "x")) hidFldExists = false;
        for(var i=0; i<idArr2.length;i++) {
            if(!hidFldExists || !getElementById(idArr2[i]) ||
            getElementById(idArr2[i] + "x").value != getElementById(idArr2[i]).value) {
                getElementById("ffi2").value = "";
                getElementById("l2").value = "";
                getElementById("g2").value = "";
                getElementById("n2").value = "";
                break;
            }
        }
    }
    if(type == "map" && getElementById("popflag").value == "0") {    //if no value is populated, remove the latlongtype field
        getElementById("addressForm").removeChild(getElementById("latlongtype"));
        getElementById("latitude").value = "";
        getElementById("longitude").value = "";
    }
    else if(type == "maphome" && getElementById("popflag").value == "0") {
        getElementById("mapform").removeChild(getElementById("latlongtype"));
        getElementById("latitude").value = "";
        getElementById("longitude").value = "";
    }
    if(!hidFldExists) return;
    //now, remove all unnecessary hidden fields, ending with 'x'
    if(type =="maphome")
        for(var i=0; i<idArr.length; i++)
            if(getElementById(idArr[i] + "x"))
                getElementById(idArr[i] + "x").parentNode.removeChild(getElementById(idArr[i] + "x"));
    else
        for(var i=0; i<idArr1.length; i++)
            if(getElementById(idArr1[i] + "x"))
                getElementById(idArr1[i] + "x").parentNode.removeChild(getElementById(idArr1[i] + "x"));
    if(type.indexOf("dir") >=0)
        for(var i=0; i<idArr2.length; i++)
            if(getElementById(idArr2[i] + "x"))
                getElementById(idArr2[i] + "x").parentNode.removeChild(getElementById(idArr2[i] + "x"));
    return;
}//isInfoChanged()

/**
 * =ADD HID FIELDS
 * @ add hidden data values for forms for comparison on submit
 */
function addHidFields()
{
  var frmObj = document.getElementsByTagName("FORM");

  if(document.body.id == "maps") {	//its from the maps page
    var idArr = new Array("pn1x", "a1x", "c1x", "s1x", "z1x");
    for(var i=0; i<idArr.length; i++) {
      var ele = document.createElement("input");
      ele.type="hidden";
      ele.id = idArr[i];
      ele.value = "";
      if (frmObj['addressForm'] != null) {
        frmObj['addressForm'].appendChild(ele);
      } else if (frmObj['ddFromMap'] != null) {
        frmObj['ddFromMap'].appendChild(ele);
      }
    }
  }
  else if(document.body.id == "home") {	//its from the home page
    var idArr = new Array("catx", "addressx","cityx", "statex", "zipcodex");
    //add the info check fields to map form
    for(var i=0; i<idArr.length; i++) {
      var ele = document.createElement("input");
      ele.type="hidden";
      ele.id = idArr[i];
      ele.value = "";
      frmObj['mapform'].appendChild(ele);
    }
  }
  if(document.body.id == "home" || document.body.id == "dirs") {  //add the info check fields to dd form - From address
    idArr = new Array("pn1x", "a1x", "c1x", "s1x", "z1x");
    for(var i=0; i<idArr.length; i++) {
      if(getElementById(idArr[i])) continue;
      var ele = document.createElement("input");
      ele.type="hidden";
      ele.id = idArr[i];
      ele.value = "";
      frmObj['ddform'].appendChild(ele);
    }
    //add the info check fields to dd form - To address
    idArr = new Array("pn2x", "a2x", "c2x", "s2x", "z2x");
    for(var i=0; i<idArr.length; i++) {
      if(getElementById(idArr[i])) continue;
      var ele = document.createElement("input");
      ele.type="hidden";
      ele.id = idArr[i];
      ele.value = "";
      frmObj['ddform'].appendChild(ele);
    }
  }
}//addHidFields()

/**
 * =PNG SUPPORTED
 * @ check if browser supports png transparency
 */
function pngSupported()
{
    if(document.all && !window.opera)   //this is IE, not supported
        return false;

    return true;
}//pngSupported()

/**
 * =GET XY
 * @get the XY coordinates
 * @returns an array containing the event target id, and xy data for page and target
 */
function getXY(evt)
{
    xyData = new Object();
    if(!document.createElement || !document.getElementsByTagName) return;
    if(!document.createElementNS)
    {   // to work in html and xml namespaces
        document.createElementNS = function(ns,elt)
        {
            return document.createElement(elt);
        }
    }
    if(document.addEventListener && typeof evt.pageX == "number")
    {   // Moz and Opera
        var Element                     = evt.target;
        var CalculatedTotalOffsetLeft   = CalculatedTotalOffsetTop = 0;
        while(Element.offsetParent)
        {
            CalculatedTotalOffsetLeft   += Element.offsetLeft;
            CalculatedTotalOffsetTop    += Element.offsetTop;
            Element                      = Element.offsetParent;
        }
        var OffsetXForNS6   = evt.pageX - CalculatedTotalOffsetLeft;
        var OffsetYForNS6   = evt.pageY - CalculatedTotalOffsetTop;
        xyData.elementId    = evt.target.id;
        xyData.elementX     = OffsetXForNS6;
        xyData.elementY     = OffsetYForNS6;
        xyData.pageX        = evt.pageX;
        xyData.pageY        = evt.pageY;
    }
    else if(window.event && typeof window.event.offsetX == "number")
    {   //ie
        xyData.elementId    = window.event.srcElement.id;
        xyData.elementX     = event.offsetX;
        xyData.elementY     = event.offsetY;
        xyData.pageX        = 0;
        xyData.pageY        = 0;
        var element         = getElementById(xyData.elementId);
        while(element)
        {
            xyData.pageX += element.offsetLeft;
            xyData.pageY += element.offsetTop;
            element = element.offsetParent;
        }
        xyData.pageX += xyData.elementX;
        xyData.pageY += xyData.elementY;
    }
    return xyData;
}//getXY()

/**
 * =SHOW/HIDE TOGGLE
 */
function showHideToggle(fId)
{
    var fDl = document.getElementById("mqshowhide-" + fId);
    if(fDl)
    {
        var fDt         = fDl.getElementsByTagName("dt")[0];
        var fImg        = fDt.getElementsByTagName("img")[0];
        var fImgUrl     = artUrl + "navs-icon-";
        var fDdArray    = fDl.getElementsByTagName("dd");
        if(fDt.className == "close")
        {
            fDt.className   = "open";
            fImg.src        = fImgUrl + "plus";
        }
        else
        {
            fDt.className   = "close";
            fImg.src        = fImgUrl + "minus";
        }
        for(var i = 0, l = fDdArray.length; i < l; i++)
        {
            fDdArray[i].className   = (fDdArray[i].className == "hide") ? "show" : "hide";
            //alert(fDdArray[i].className);
        }
    }
}//showHideToggle

/**
 * =REFRESH SEARCH PAGE WITH ADDITIONAL PARAMETERS
 */
function refineRefresh(refineBaseUrl)
{
   var refineUrl = refineBaseUrl + "&gfilter=" + getElementById("mqrefine-city").value + "&sic=" + getElementById("mqrefine-cat").value;
   if (getElementById("mqrefine-radius") != null)
   {
    refineUrl += "&dist=" + getElementById("mqrefine-radius").value
   }
   document.location.href = refineUrl;
}

/**
 * =INITIALIZATION
 * @load and fire events
 */
function mqInit()
{
    setFocus();
    savedRecentInit();
}//mqInit()
addEvent(window, "load", mqInit);
