﻿/*
 * Exclusive Hotels group site home page functions
 *
 * (c) Creative and Brand Ltd. 1997
 */

/*
 * Get the current x-axis page position
 */
function ftnGetCurrentScrollLoc(){
    // TODO: this currently looks to be returning 0 always in Safari
    return document.documentElement.scrollLeft;
}

/*
 * Scroll to a panel, with mock acceleration/deceleration physics
 */
function ftnHorizontalScroll(strAnchorName){
    // Find anchor
    var arrAnchorPos = ftnGetObjectPosition(ftnGetObject(strAnchorName));
    var intStartX = ftnGetCurrentScrollLoc();
    var intVelocity = 1;
    var intDecel = 0.84;
    var intAccel = 1.3;
    
    if (intStartX < arrAnchorPos[0]) {
        // Scroll right
        ftnScrollWindow(intStartX,(intStartX+1),arrAnchorPos[0],intVelocity,intAccel,intDecel);
    } else {
        // Scroll to left
        ftnScrollWindow(intStartX,(intStartX-1),arrAnchorPos[0],intVelocity,intAccel,intDecel);
    }
    
    return false;
}

/*
 * Snap straight to a panel, no fancy scrolling
 */
function ftnHorizontalSnap(strAnchorName){
    // Find anchor
    var arrAnchorPos = ftnGetObjectPosition(ftnGetObject(strAnchorName));
    parent.scroll(arrAnchorPos[0],document.documentElement.scrollTop); 
}

function ftnScrollWindow(intStartX,intNextX,intFinalX,intMove,intAccel,intDecel){
    parent.scroll(intNextX,document.documentElement.scrollTop); 
    if(intNextX != intFinalX){
        // Modify delay
        if (intStartX < intFinalX) {
            // Moving right
            if ((intFinalX - intNextX) < 330){
                intMove = intMove * intDecel;
            } else if ((intNextX - intStartX) < 200){
                intMove = intMove * intAccel;
            }
            intNextX = intNextX + intMove;
            if (intNextX > intFinalX) intNextX = intFinalX;
        } else {
            // Moving left
            if ((intNextX - intFinalX) < 330){
                intMove = intMove * intDecel;
            } else if ((intStartX - intNextX) < 200){
                intMove = intMove * intAccel;
            }
            intNextX = intNextX - intMove;
            if (intNextX < intFinalX) intNextX = intFinalX;
        }
        if (intMove < 1) intMove = 1;
        setTimeout('ftnScrollWindow('+intStartX+','+intNextX+','+intFinalX+','+intMove+','+intAccel+','+intDecel+')',0.001);
    }
}

function ftnSetSizes(){
    var arrWinSize = ftnGetBrowserRenderArea();
    var objFlashPanel = ftnGetObject('flash-panel');
    var objPromoPanel = ftnGetObject('promo-panel');
    var objTextPanel = ftnGetObject('text-panel');
    var objTopNav = ftnGetObject('top-nav');
    var objLowerNav = ftnGetObject('lower-nav');
    var intPanelCount = 3;
    
    if (BrowserDetect.browser != 'Explorer'){
        arrWinSize[0] = arrWinSize[0] - ftnGetScrollbarWidth();
        arrWinSize[1] = arrWinSize[1] - ftnGetScrollbarWidth();
    }
    
    // Enforce minimum dimensions
    // Not sure this is a good idea - stops the layout breaking in small windows, but means some of the
    // navigation is fixed off screen
    if (arrWinSize[0] < 1000) arrWinSize[0] = 1000;
    
    // Set the width of the body so that the panels float 
    // alongside each other with no additional white space
    document.body.style.width = (intPanelCount*arrWinSize[0]) + 'px';
    
    // Set size of top area to centre main area vertically
    var objTopBar = ftnGetObject('top-bar');
    var intTopBarHeight = ((arrWinSize[1]/2)-(ftnGetObjectHeight(objFlashPanel)/2)-ftnGetObjectHeight(ftnGetObject('global-nav')));
    if (intTopBarHeight < 0) intTopBarHeight = 0;
    intTopBarHeight = intTopBarHeight + 'px';
    objTopBar.style.height = intTopBarHeight;
    objTopBar.style.width = arrWinSize[0] + 'px';
    var intTopNavHeight = ftnGetObjectHeight(objTopNav);
    
    
    // Set the panels to fill the browser window, so that only one is visible at a time
    var arrPanels = document.getElementsByTagName('div');
	for (var i=0;i<arrPanels.length;i++)
	{
		if (arrPanels[i].className == 'panel' || arrPanels[i].className == 'navbar')
			arrPanels[i].style.width = arrWinSize[0] + 'px';
		if (arrPanels[i].className == 'panel')
			arrPanels[i].style.top = intTopNavHeight + 'px';
	}
	
	// Position bottom nav vertically below panels
	var arrFlashPanelLoc = ftnGetObjectPosition(objFlashPanel);
	objLowerNav.style.top = (arrFlashPanelLoc[1] + ftnGetObjectHeight(objFlashPanel)) + 'px';
    
    // Position the content areas (by resizing the spacer divs)
    /*var intSpacerWidth = arrWinSize[0]/((1/(arrWinSize[0]-1000))*5000);
    if (intSpacerWidth == 1) intSpacerWidth == 0; // Get rid of rounding up of tiny values
    
    var arrContents = document.getElementsByTagName('div');
    for (var i=0;i<arrContents.length;i++)
    {
        if (arrContents[i].className == 'contentarea')
            arrContents[i].style.marginLeft = intSpacerWidth + 'px';
    }*/
    
    // If the user has a cookie with their last slider state,
    // move the slider to that location
    var strSavedState = ftnReadCookie('eh-slider-state');
    if (strSavedState != null && strSavedState.length > 0){
        ftnHorizontalSnap(strSavedState);
    } else { // Default to the flash panel
        ftnHorizontalSnap('flasharea_l');
    } // If no flash or no javascript the browser will default to the flash content panel
    
    // TODO: Ideally, we should now check whether the browser is exactly centred on
    // one of the panels and if not centre it on the closest one.
}

/*
 * Modifies all links other than slider ones to record the current slider state
 * to a cookie before leaving the page, so that users can be returned to the same
 * view.
 */
function ftnAddLinkStateHandlers() {
    var arrLinks = document.getElementsByTagName('a');
    for (var i=0;i<arrLinks.length;i++)
    {
		// Note: currently leaves any link that already has an onclick event alone.
		// Okay for now as this only applies to those that trigger dropdowns, but 
		// may need to be made more sophisticated in future.
        if (arrLinks[i].className != 'slider-control' 
			&& arrLinks[i].className != 'slider-anchor'
			&& (arrLinks[i].onclick == null || arrLinks[i].onclick == '')) {
            arrLinks[i].onclick = ftnStoreSliderState;
        }
    }
}

function ftnStoreSliderState() {
    // Get current location of slider
    var intCurrentLoc = ftnGetCurrentScrollLoc();
    var arrBestFit = new Array();
    var arrLinks = document.getElementsByTagName('a');
    
    for (var i=0;i<arrLinks.length;i++) {
        if (arrLinks[i].className == 'slider-anchor') {
            var arrAnchorPos = ftnGetObjectPosition(arrLinks[i]);
            var intOffset = intCurrentLoc - arrAnchorPos[0];
            if ((arrBestFit.length == 0 || arrBestFit[0] > intOffset) && intOffset >= 0) {
                arrBestFit[0] = intOffset; // offset
                arrBestFit[1] = arrLinks[i].id; // id
            }
        }
    }
    
    if (arrBestFit.length > 0) {
        strAnchor = arrBestFit[1]; // id
    } else {
        strAnchor = '';
    }
    
    // Store current slider state in a cookie for half a day
    ftnStoreCookie('eh-slider-state',strAnchor,0.5);
}

/*
 * Fire resizing javascript after stylesheet change to make sure everything is still
 * positioned nicely.
 */
function ftnHomeSetActiveStyleSheet(strSize){
	setActiveStyleSheet(strSize);
	ftnSetSizes();
	return false;
}

// Register event handlers
window.onload = function(){
    // Note - IE fires onload if returning to a page using the browser back
    // button. Firefox doesn't.
    ftnSetSizes();
    ftnAddLinkStateHandlers();
}
window.onresize = function(){
    ftnSetSizes();
}
