/****************************************************************************************
Filename:           bag.js
Author:             Jon Dunfee (jdunfee@icconline.com)
Create Date:        21-SEP-2005

Description:        Sliding shopping bag logic, place linked js file immediately after
                    after the bag in the page.

                    There must be a div for the bag and an iframe to load the contents within
                    the bag.

                    User Called Functions:

                    bagOpen("URL") = Opens the bag and opens the URL passed, when no URL
                                     is passed the bag will open with bagStartPage.
                    
                    bagClose("URL") = Follows same process as bagOpen() only it closes the
                                      bag.
                    
                    bagLocation("URL") = Simply opens the URL passed with no bag activity.

Change Log:
=========================================================================================
Date            Author                    Description of Change
-----------     ------------              -----------------------------------------------
21-SEP-2005     J. Dunfee                 Initial Release
12-OCT-2005     J. Dunfee                 Added bag debugging logic
24-OCT-2005     J. Dunfee                 DOCTYPE compatibility fixes
03-NOV-2005     J. Dunfee                 Slide disable option & retire legacy functions
****************************************************************************************/

/***** Shopping Bag Variables ******/
var bagID                  = "shoppingBag";	// Shopping bag container
var bagSlideSpeed          = 25;			// Speed in milliseconds of position calculating
var bagSlideStepLeft       = .25;			// Allows for soft positioning left movement
var bagSlideStepTop        = .25;			// Allows for soft positioning top movement
var bagAnchorID            = "topnav_cart";	// Bag anchor on page
var bagFollowAnchor        = true;			// Set relative to anchor on page (good for centered sites)
var bagScrollLeftOffset    = true;			// Allows bag to always be in horizontal view
var bagScrollTopOffset     = true;			// Allows bag to always be in vertical view
var bagDisableSlideLeft    = true;			// Start left position becomes end position, no slide effect
var bagDisableSlideTop     = false;			// Start top position becomes end position, no slide effect
var bagDefaultAnchorLeft   = 0;				// Left point of reference for bag
var bagDefaultAnchorTop    = 0;				// Top point of reference for bag
var bagOffsetStartLeft     = -88;			// Starting left position for bag from anchor
var bagOffsetStartTop      = -400;			// Starting top position for bag from anchor
var bagOffsetEndLeft       = -88;			// Ending left position for bag from anchor
var bagOffsetEndTop        = 17;			// Ending top position for bag from anchor
var bagStartPage           = "bag.asp";		// What page loads and returns to when closing
var bagDebug               = false;			// Display debugging status window
/***********************************/

/* Left sliding - concept tryout
var bagOffsetStartLeft     = -2000;			// Starting left position for bag from anchor
var bagOffsetStartTop      = 17;			// Starting top position for bag from anchor
var bagOffsetEndLeft       = -90;			// Ending left position for bag from anchor
var bagOffsetEndTop        = 17;			// Ending top position for bag from anchor
*/

// Shopping bag system variables
var currentBagLoc = bagStartPage;

// Initialize shopping bag
function initBag()
{
    d = document;
    bag = d.getElementById(bagID);
    if(!bag) return;
    bag.anchorLeft = function()
                  {
                    return ((bagFollowAnchor && d.getElementById(bagAnchorID))?getBagLeft(0,d.getElementById(bagAnchorID)):bagDefaultAnchorLeft) + ((bagScrollLeftOffset)?getPageXOffset():0);
                  }
    bag.anchorTop = function()
                  {
                    return ((bagFollowAnchor && d.getElementById(bagAnchorID))?getBagTop(0,d.getElementById(bagAnchorID)):bagDefaultAnchorTop) + ((bagScrollTopOffset)?getPageYOffset():0);
                  }
    bag.moveMe = function(x,y)
                  {
                    if(x) { this.x = x; this.style.left = x + "px"; }
                    if(y) { this.y = y; this.style.top = y + "px"; }
                  }
    bag.showHide = function(hide)
                  {
                    this.style.visibility = (hide)?"hidden":"inherit";
                    if(this.style.display) this.style.display = (hide)?"none":"inherit";
                  }
    bag.showHide(1);
    bag.moveMe(Math.ceil(bag.anchorLeft() + bagOffsetStartLeft),Math.ceil(bag.anchorTop() + bagOffsetStartTop));
    bag.showHide(0);
    bag.closing = false;
    bag.opening = false;
}

// Open shopping bag [loc = page to serve up when bag is in position]
function bagOpen(loc)
{
    if(!bag.closing)
    {
        if(!bag.opening)
        {
            currentBagLoc = (loc)?loc:bagStartPage;
        }
        bag.opening = true;
        // Slide bag horizontally
        var leftWorking = true;
        var endLeftPos = bag.anchorLeft() + bagOffsetEndLeft;
		if(bagDisableSlideLeft) bag.x = endLeftPos;
        if(bag.x < endLeftPos)
        {
            bag.x += Math.ceil((endLeftPos - bag.x) * bagSlideStepLeft);
        }
        else if(bag.x > endLeftPos)
        {
            bag.x -= Math.ceil((bag.x - endLeftPos) * bagSlideStepLeft);
        }
        else
        {
            leftWorking = false;
        }
        // Slide bag vertically
        var topWorking = true;
        var endTopPos = bag.anchorTop() + bagOffsetEndTop;
		if(bagDisableSlideTop) bag.y = endTopPos;
        if(bag.y < endTopPos)
        {
            bag.y += Math.ceil((endTopPos - bag.y) * bagSlideStepTop);
        }
        else if(bag.y > endTopPos)
        {
            bag.y -= Math.ceil((bag.y - endTopPos) * bagSlideStepTop);
        }
        else
        {
            topWorking = false;
        }

        bag.showHide(1);
        bag.moveMe(bag.x,bag.y);
        bag.showHide(0);
        if(leftWorking || topWorking)
        {
            setTimeout("bagOpen(currentBagLoc)",bagSlideSpeed);
        }
        else
        {
            bag.opening = false;
            bagLocation(currentBagLoc);
        }
    }
}

// Close shopping bag [loc = page to serve up when bag is in position]
function bagClose(loc)
{
    if(!bag.opening)
    {
        if(!bag.closing)
        {
            currentBagLoc = (loc)?loc:bagStartPage;
        }
        bag.closing = true;
        // Slide bag horizontally
        var leftWorking = true;
        var startLeftPos = bag.anchorLeft() + bagOffsetStartLeft - ((bagScrollLeftOffset)?getPageXOffset():0);;
		if(bagDisableSlideLeft) bag.x = startLeftPos;
        if(bag.x < startLeftPos)
        {
            bag.x += Math.ceil((startLeftPos - bag.x) * bagSlideStepLeft);
        }
        else if(bag.x > startLeftPos)
        {
            bag.x -= Math.ceil((bag.x - startLeftPos) * bagSlideStepLeft);
        }
        else
        {
            leftWorking = false;
        }
        // Slide bag vertically
        var topWorking = true;
        var startTopPos = bag.anchorTop() + bagOffsetStartTop - ((bagScrollTopOffset)?getPageYOffset():0);
		if(bagDisableSlideTop) bag.y = startTopPos;
        if(bag.y < startTopPos)
        {
            bag.y += Math.ceil((startTopPos - bag.y) * bagSlideStepTop);
        }
        else if(bag.y > startTopPos)
        {
            bag.y -= Math.ceil((bag.y - startTopPos) * bagSlideStepTop);
        }
        else
        {
            topWorking = false;
        }

        bag.showHide(1);
        bag.moveMe(bag.x,bag.y);
        bag.showHide(0);
        if(leftWorking || topWorking)
        {
            setTimeout("bagClose(currentBagLoc)",bagSlideSpeed);
        }
        else
        {
            bag.closing = false;
            bagLocation(currentBagLoc);
        }
    }
}

// Get left position of bag
function getBagLeft (x, item)
{
    if (!document.layers)
    {
        var onWindows = (navigator.platform)?(navigator.platform == "Win32"):false;
        var macIE45 = (document.all && !onWindows && getBrowserVersion() == 4.5);
        var par = item;
        var lastOffset = 0;
        while(par)
        {
            if(par.leftMargin && ! onWindows) x += parseInt(par.leftMargin);
            if((par.offsetLeft != lastOffset) && par.offsetLeft) x += parseInt(par.offsetLeft);
            if(par.offsetLeft != 0) lastOffset = par.offsetLeft;
            par = (macIE45)?par.parentElement:par.offsetParent;
        }
    } else if (item.x) x += item.x;
    return x;
}

// Get top position of bag
function getBagTop (y,item)
{
    if(!document.layers)
    {
        var onWindows = (navigator.platform)?(navigator.platform == "Win32"):false;
        var macIE45 = (document.all && !onWindows && getBrowserVersion() == 4.5);
        var par = item;
        var lastOffset = 0;
        while(par)
        {
            if(par.topMargin && !onWindows) y += parseInt(par.topMargin);
            if((par.offsetTop != lastOffset) && par.offsetTop) y += parseInt(par.offsetTop);
            if(par.offsetTop != 0) lastOffset = par.offsetTop;
            par = (macIE45)?par.parentElement:par.offsetParent;
        }
    } else if (item.y >= 0) y += item.y;
    return y;
}

// Retrieve page offset for vertical scrolling
function getPageYOffset()
{
	if(window.pageYOffset) return parseInt(window.pageYOffset);
	if(document.body.scrollTop) return parseInt(document.body.scrollTop);
	if(document.documentElement.scrollTop) return parseInt(document.documentElement.scrollTop);
	return 0;
}

// Retrieve page offset for horizontal scrolling
function getPageXOffset()
{
	if(window.pageXOffset) return parseInt(window.pageXOffset);
	if(document.body.scrollLeft) return parseInt(document.body.scrollLeft);
	if(document.documentElement.scrollLeft) return parseInt(document.documentElement.scrollLeft);
	return 0;
}

// Load page in bag
function bagLocation(where)
{
    var frame = document.getElementById("bagContents");
    if(frame)
    {
        frame.src = where;
        currentBagLoc = where;
    }
}

initBag();

// Shopping bag debugging
function bagStatus()
{
	var d = document;
    var s = d.getElementById("bagDebugStats");
    s.value  =   "left            = " + bag.style.left;
    s.value += "\ntop             = " + bag.style.top;
    s.value += "\nbag.x           = " + bag.x;
    s.value += "\nbag.y           = " + bag.y;
    s.value += "\nanchorLeft      = " + bag.anchorLeft();
    s.value += "\nanchorTop       = " + bag.anchorTop();
    s.value += "\nvisibility      = " + bag.style.visibility;
    s.value += "\nscroll top      = " + getPageYOffset();
	s.value += "\nscroll left     = " + getPageXOffset();
    s.value += "\nend top pos     = " + (bag.anchorTop() + bagOffsetEndTop);
    s.value += "\nbag location    = " + d.getElementById("bagContents").src;
    s.value += "\ncurrentBagLoc   = " + currentBagLoc;
	document.getElementById("bagDebugger").style.top = getPageYOffset() + "px";
	document.getElementById("bagDebugger").style.left = (d.body.clientWidth - 205) + "px";
}
if(bagDebug)
{
	document.writeln('<div id="bagDebugger" style="position:absolute;top:0;left:0;z-index:50000;width:200px;margin:10px 0 0 0px;text-align:right;padding:0 10px 0 0;"><textarea id="bagDebugStats" name="bagDebugStats" style="font-family:monospace;height:180px;width:200px;font-size:10px;"></textarea></div>');
    setInterval("bagStatus()",100);
}

/***** Shopping Bag Custom Functions ******/
function addToCart(frm)
{
	if (Trim(frm.qty.value) == "") {
		alert("Please enter a valid quantity.");
		frm.qty.focus();
		return false;
	} else if (!validatePosInteger(frm.qty.value)) {
		alert("Please enter a valid quantity.");
		frm.qty.focus();
		return false;
	} else {
		var qty = frm.qty.value;
		var code = frm.proddtl.options[frm.proddtl.selectedIndex].value;
		bagOpen("bag.asp?action=ADD&ProductCode=" + code + "&qty=" + qty);
		return false;
	}
}
