/* ***************************************************************************
** MM_ FUNCTIONS ********************************************************** */
function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}
function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}
function MM_showHideLayers() { //v9.0
  var i,p,v,obj,args=MM_showHideLayers.arguments;
  for (i=0; i<(args.length-2); i+=3) 
  with (document) if (getElementById && ((obj=getElementById(args[i]))!=null)) { v=args[i+2];
    if (obj.style) { obj=obj.style; v=(v=='show')?'visible':(v=='hide')?'hidden':v; }
    obj.visibility=v; }
}

function GetShippingTotal(val){
    var dvShipCost = document.getElementById("dvShipTotal");
    if (dvShipCost) {
        var state = document.getElementById("selShipState");
        state = state.options[state.selectedIndex].value;
        var country = document.getElementById("selShipCountry");
        country = country.options[country.selectedIndex].value;
        xmlGetData("/ajx/getshippingcost.aspx?t=" + val + "&s=" + state + "&c=" + country,fcnSetShipTotal);
	}
}

function toggleCart(){
    var dvDropCart = document.getElementById("cartcontainer");
    if (dvDropCart) {
	    if(dvDropCart.style.display == "block"){
    		dvDropCart.style.display = "none";	
    	}else{
    	    dvDropCart.style.display = "none";	
            xmlGetData("/ajx/getminicart.aspx",fcnDrawMiniCart);
	    }
	}
}

function toggleDiv(divName){
    var dvTarget = document.getElementById(divName);
    if (dvTarget) {
	    if(dvTarget.style.display == "block"){
    		dvTarget.style.display = "none";	
    	}else{
            vTarget.style.display = "block";
	    }
	}
}

function ShowHideDiv(divName,status){
if (divName=="quickShop") alert("gs");
    var dvTarget = document.getElementById(divName);
    if (dvTarget) {
	    if(status=='off'){
    		dvTarget.style.visibility = "hidden";	
    	}else{
            dvTarget.style.visibility = "visible";
	    }
	}
}

function toggleDisplayDiv(divName) {
    var dvTarget = document.getElementById(divName);
    if (dvTarget) {
	    if(dvTarget.style.display == "block"){
    		dvTarget.style.display = "none";	
    	}else{
            dvTarget.style.display = "block";
	    }
	}
}

function fcnSetShipTotal(objJSONresult) {
    var dvShipCost = document.getElementById("dvShipTotal");
    var dvTotal = document.getElementById("dvTotal");
    if (!dvShipCost && !dvTotal) {
        return;
    }
    
    if (objJSONresult.TotalShipping) {
        dvShipCost.innerHTML = objJSONresult.TotalShipping;
        dvTotal.innerHTML= objJSONresult.Total;
    }
    
}

function fcnDrawMiniCart(objJSONresult) { 

    // get the div.  If we can't get it, no point in doing the work: short-circuit out.
    var dvDropCart = document.getElementById("cartcontainer");
    if (!dvDropCart) {
        return;
    }
  
    //Handle SSL
    var maJsHost = "http://" + document.location.host + "/";
    
    //Check for nulls and empty arrays.
    var blnHaveResults = false;
    var blnHaveJustAdded = false;
    if (objJSONresult) {
        if (objJSONresult.results) {
            if (objJSONresult.results.length > 0) {
                blnHaveResults = true;
            }
        }
        if (objJSONresult.justAdded) {
            if (objJSONresult.justAdded.length > 0) {
                blnHaveJustAdded = true;
            }
        }
    }
    
    //Build the cart.
    var strHTML = "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"400\">";
    
     strHTML += "<tr><td colspan=\"5\"><img src=\"/images/shoppingcart_dropshadow.png\" /></td></tr>";
     strHTML += "<tr><td colspan=\"5\" align=\"right\"><a href=\"#\" onclick=\"toggleDisplayDiv('cartcontainer');\"><img src=\"/images/btn_closewindow_sm.gif\" alt=\"close window\" border=\"0\" /></a></td></tr>";
        
    if (!objJSONresult || (!blnHaveResults && !blnHaveJustAdded)) {
        //If we have no json object, or both its items are empty, show the empty-cart message.
        strHTML += "<tr><td align=\"center\"><br>Your cart is empty<br><br></td></tr>";
    } else {
        //OK, we have something.  Build the item table
        var i;
        if (blnHaveJustAdded) {
            //walk our justAdded items (usually there's only 1), and add each to the html.
            for (i=0;i<objJSONresult.justAdded.length;i++) {
                //Use the just-added graphic
                strHTML += getMiniCartItemRow(objJSONresult.justAdded[i], "/images/u_logo_mini_added.gif")
            }
        }
        if (blnHaveResults) {
            //walk our results, and add each to the html.
            for (i=0;i<objJSONresult.results.length;i++) {
                //Use the defined graphic
                strHTML += getMiniCartItemRow(objJSONresult.results[i], '');
            }
        }
        
        //Get and format the order total.
        var strOrderTotal = objJSONresult.orderTotal;
    }
    
    //close the cart table/html
   strHTML +="<tr><td>&nbsp;</td><td colspan=\"3\">&nbsp;</td><td><div align=\"right\"><a href=\"/basket.aspx\">" + 
          "<img src=\"/images/btn_checkout.gif\" alt=\"checkout\" hspace=\"5\" vspace=\"5\" border=\"0\" /></a></div>" + 
          "</td></tr></table>";
    
    //We have the latest-n-greatest cart info, so let's update the topnav.
    var tdCartTotal = document.getElementById("dvShoppingcartitems");
    if (tdCartTotal) {
        tdCartTotal.innerHTML = objJSONresult.itemCount + " ITEM" + (objJSONresult.itemCount==1?"":"S") + " | " + objJSONresult.orderTotal;
    }

    //set it, show it. we're done.
    //dvDropCart.innerHTML = strHTML;
    var dvDropCartMain = document.getElementById("dvcartcontents");
    dvDropCartMain.innerHTML = strHTML;
   // dvDropCartMain.style.dipslay = "block";
    dvDropCart.style.display = "block";
}

//Constructs the HTML for a given item to be included in the mini-cart.
function getMiniCartItemRow(cartItem,imgScr) {

     var strRow = "<tr><td rowspan=\"3\"><div align=\"center\"><img src=\"" + cartItem.IMAGE + "\" width=\"97\" /></div></td>" +
     "<td colspan=\"3\"><span id=\"item\">" + cartItem.NAME + "</span></td>" +
     "<td rowspan=\"3\" valign=\"bottom\"><span id=\"price\">" + cartItem.PRICE + "</span></td></tr>";
    
    if (cartItem.INSTOCK_HTML != "") {
        strRow +="<tr><td nowrap>size: " + cartItem.SIZE + "</td>" +
         "<td nowrap>color: " + cartItem.COLOR + "</td>" +
         "<td>quantity: " + cartItem.QTY +  
         "<br>" + cartItem.INSTOCK_HTML + "</td></tr>";
    } else {
        strRow +="<tr><td nowrap>size: " + cartItem.SIZE + "</td>" +
         "<td nowrap>color: " + cartItem.COLOR + "</td>" +
         "<td nowrap>quantity: " + cartItem.QTY + "</td></tr>" 
    }     
     
    strRow +="<tr><td colspan=\"3\" valign=\"bottom\"><div class=\"buttonbox2\"><a href=\"/basket.aspx\">EDIT DETAILS</a></div></td></tr>" +
     "<tr><td colspan=\"5\"><hr style=\"border:0;border-bottom:1px solid #ccc;margin:8px 0 2px 0;color: #ccc; height:1px;line-height:1px;display:block;\" /></td></tr>";
    
    return strRow;
}

function getScrollXY() {
    var x = 0, y = 0;
    if( typeof( window.pageYOffset ) == 'number' ) {
        // Netscape
        x = window.pageXOffset;
        y = window.pageYOffset;
    } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
        // DOM
        x = document.body.scrollLeft;
        y = document.body.scrollTop;
    } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
        // IE6 standards compliant mode
        x = document.documentElement.scrollLeft;
        y = document.documentElement.scrollTop;
    }
    //return y;
    return [x, y];
}

function Resize_iFrame(strFrameName,strFrameBody) { 

    fn = strFrameName?strFrameName:"fraQuickShop";
    fb = strFrameBody?strFrameBody:"FrameBody";
    x = top.document.getElementById(fn); 
    y = x.contentWindow.document.getElementById(fb); 
    if (y) {
        //if (document.all) // IE problem; wont show clientHeight if style height hasn't been set 
        //    y.style.height = "1px"; 
        //margin = (strFrameName=='cartDrop'?2:35); 
        //x.style.height = parseInt(y.scrollHeight + margin) + "px"; 
        x.style.height = y.scrollHeight + "px"; 
        x.height = x.style.height;
    }
}

//Simple convenience function which draws the cart and closes the quickshop panel.  Generally, this is called only 
// from the quickshop panel itself.
function fcnDrawMiniCartAndCloseQuickShop() {
    closeQuickShop();
    toggleCart();
}

 function launchQuickShop(oid,brand) {
    var e=window.event;
    
    var frmQS = document.getElementById("fraQuickShop");
    if (frmQS) frmQS.src="/product_qs.aspx?id=" + oid;

    var divQS = document.getElementById("quickShop");
    var dh = getScrollXY();
    //alert(dh[1]);
    divQS.style.top=(dh[1] + 225) + 'px';
    divQS.style.display = 'block';
}
 
 function closeQuickShop() {
    var frmQS = top.document.getElementById("fraQuickShop");
    if (frmQS) frmQS.src="about:blank";
    var divQS = top.document.getElementById("quickShop");
    divQS.style.display = 'none';
}

/* ***************************************************************************
** UTILITY FUNCTIONS ****************************************************** */
//Convenience function to set a radio button value (they're annoying to work with in JS).
function setRadioButtonValue(strButtonName, strValue) {
    var buttons = document.getElementsByName(strButtonName);
    for (var i=0; i<buttons.length; i++) {
        if (buttons[i].value == strValue) {
            buttons[i].checked=true;
        }
    }
}

//Convenience function to get a radio button value (they're annoying to work with in JS).
function getRadioButtonValue(strButtonName) {
    var buttons = document.getElementsByName(strButtonName);
    var val = '';
    for (var i=0; i<buttons.length; i++) {
        if (buttons[i].checked) {
            val = buttons[i].value;
        }
    }
    return val;
}

//    function setVisibility(elementID, value) {
//    var element = document.getElementById(elementID);
//    if (element) {
//        element.style.visibility = value;
//    }
//    }

///Convenience function to modify the style of the specified element.  If element cannot be found,
// this function is a no-op.  Not all styles are supported: this is a convenience function just for
// our most commonly-accessed ones.
function setStyle(elementID, styleKey, styleValue) {
    var element = document.getElementById(elementID);
    if (element) {
        switch(styleKey) {
            case "visibility":
                element.style.visibility = styleValue;
                break;
            case "height":
                element.style.height = styleValue;
                break;
            case "display":
                element.style.display = styleValue;
                break;
        }
    }
}

//Convenience function to set the className of the specified element.  If element cannot be
// found, this function is a no-op.
function setClassName(elementID, newClass) {
    var element = document.getElementById(elementID);
    if (element) {
        element.className = newClass;
    }
}

//Returns true if the passed str contains only 0-9.  Returns false otherwise.
function isInteger(str) {
    var digits = "0123456789";
    var eachChr;
   
    //If passed a null string or empty string, return false.
    if (!str) { return false; }
    if (str.length == 0) { return false; }

    //walk each char.  If any aren't digits, return false immed.
    for (var i=0; i<str.length; i++) {
        eachChr = str.charAt(i);
        if (digits.indexOf(eachChr) < 0) {
            return false;
        }
    }
    //if we reach this point, it was nothing but digits.  return true.
    return true;
}

/* ***************************************************************************
** CUSTOM FUNCTIONS ******************************************************* */
function applyCurrencySetting(code)
{
    //Determine intl-specific settings.  Default to usd if passed code is unrecognized.
    var usdContent = "<b>USD</b>";
    var euroContent = "euro";
    if (code=="euro")
    {
        usdContent = "usd";
        euroContent = "<b>EURO</b>";
    }

    //Find the intl elements, and set them accordingly.
    var usdElement = document.getElementById("usd");
    var euroElement = document.getElementById("euro");
    if (usdElement)
    {
        usdElement.innerHTML = usdContent;
    }
    if (euroElement)
    {
        euroElement.innerHTML = euroContent;
    }
}


/* ***************************************************************************
** CUSTOM NAVIGATION FUNCTIONS ******************************************** */

//set this var to false to suppress closing of the subNav section.
var blnNavTimer = false;

//Individual pages should override this variable with the actual navNodes JSON.
var navNodes = [];
//Individual pages should override these variables with the actual default OIDs.
var defaultNavId = "";
var defaultSubNavId = "";
var defaultSubSubNavId = "";

//To be called when the top nav (Headwear, etc.) is moused-over.
function onMouseOverNav(navId) {
    //suppress the hiding of the nav section
    blnNavTimer = false;
    //Hide all nav sections, except the requested one.  Swap ON/OFF images (except the default one).
    for (var i=0; i<navNodes.length; i++) {
        setStyle("subNav_"+navNodes[i].OID, "visibility", (navNodes[i].OID==navId)?"visible":"hidden");
    }
}

//To be called when any of the nav is moused-out: top nav, or the subNav section/div.
function onMouseOutNav() {
    blnNavTimer = true;
    setTimeout('revertNavToDefault()',1000);
}

//To be called when the subNav (Knit, Mens, etc.) is moused-over.
function onMouseOverSubNav(navId, subNavId) {
    //Find the current top-level nav, and walk its subnavs
    for (var i=0; i<navNodes.length;i++) {
        //hide all subNav sections, except the requested one.
        if (navNodes[i].OID == navId) {
            for (var j=0; j<navNodes[i].SubNavs.length; j++) {
                setStyle("subSubNav_"+navNodes[i].SubNavs[j].OID, "height", (navNodes[i].SubNavs[j].OID==subNavId)?"25px":"0px");
            }
        }
    }
}

//Sets the page to its default state, depending on the specified default OIDs.
function revertNavToDefault() {
    if(blnNavTimer) {
        //Hide all top nav sections, except the default one.
        for (var i=0; i<navNodes.length; i++) {
            setStyle("subNav_"+navNodes[i].OID, "visibility", (navNodes[i].OID==defaultNavId)?"visible":"hidden");
            //Hide all subnav sections, except the default one.
            for (var j=0; j<navNodes[i].SubNavs.length; j++) {
                setStyle("subSubNav_"+navNodes[i].SubNavs[j].OID, "height", (navNodes[i].SubNavs[j].OID==defaultSubNavId)?"25px":"0px");
            }
        }
    }
}

//Global function for the search box in the top nav
function checkKeyword(keyword, defaultText) {
    var minKeywordLength = 0;
    var maxKeywordLength = 0;
    minKeywordLength += 3;
    maxKeywordLength += 30;
    var errMsg = '';
    //alert("minKeywordLength " + minKeywordLength);
    var searchTerms = '';
    searchTerms = keyword.value;
    //alert("searchTerms.length " + searchTerms.length);

	var invalidSearchTermMessage = 'Search term needed to be re-entered.'; // probably want to change this message! 
	var invalidChars = /[!?~`%^&*()+={}\[\]|\\:;\"<>/]/; // add all illegal characters here. 
	var matches_array = searchTerms.match(invalidChars);

    var noSearchTerm = 'Please enter a keyword or item number';
    var shortSearchTerm = 'Your keyword or item number must be at least 3 characters long';

    if (searchTerms == defaultText) {
        window.location = "http://hats.com/gift_finder.aspx";
        //alert(noSearchTerm);
        return false;
    }
    if (searchTerms == '') {
        window.location = "http://hats.com/gift_finder.aspx";
        //alert(noSearchTerm);
        return false;
    } else if ( searchTerms.length < minKeywordLength ) {
        alert(shortSearchTerm);
        return false;
    } else if (matches_array != null) { 
		// show the user a dialog if illegal characters are found in the keyword. 
		alert(invalidSearchTermMessage); 
		return false; 
    } else {
      return true;
    }
}