/*
    Filename:   common.js
    Author:     Steve Smith stephen.smith@akqa.com
    Description:    Common functions for Ferrari f149 site
                    Has dependancies on MooTools library
                    Please ensure any updates maintain document's validity
                    Test validity at http://jslint.com/lint.html
*/

//Using mootools string.extend to
//provide method of extracting querystring
//key value by key name
//NB: Uses mootools for string.extend
String.extend({
    parseQuery: function() {
        var query = this.split(/[&;]/);
        var keyValue = {};
        if (query.length) {
            query.each(function(val) {
                var keys = val.split('=');
                if (keys.length && keys.length == 2) {
                    keyValue[encodeURIComponent(keys[0])] = encodeURIComponent(keys[1]);
                }
            });
        }
        return keyValue;
    }
});

//Generic popup function - resizable
function launchPopUpResize(url, width, height, title) {
    var params = "scrollbars=1,location=0,toolbar=0,menubar=0,titlebar=0,resizable=1,status=0,height=" + height + ",width=" + width;
    var newWindow = window.open(url, "",params);
    if(newWindow) {
        newWindow.focus();
        newWindow = null;
    }        
}

//Fullscreen popup function
// -->
  function launchFullScreenPopup(url) {
    var width=0;
    var height=0;
    if (document.all) {
		width=screen.width;
		height=screen.height;
        }
    else {
		width=screen.availWidth;
		height=screen.availHeight;
        }          
	mine = window.open(url,"popupCalifornia","width="+width+",height="+height+",toolbar=no,scrollbars=no,status=no,resizable=yes");
     }





//Gets collection of anchors by class 
//and attaches pop up event resize
//NB: Uses mootools $$ for getElementsByClass
function configurePopUpResizeAnchors() {
    var popUpAnchors = $$("a.popUpResize");
    var dimensions = [];

    for(var i = 0; popUpAnchors.length > i; i++) {
        popUpAnchors[i].onclick = function(evt) {
            var stopEvent = new Event(evt).stop();
            dimensions = this.rel.split(",");
            launchPopUpResize(this.href, dimensions[0], dimensions[1], dimensions[2]);
        };
    }
}


//Generic popup function
//called from event listener attached
//in configurePopUpAnchors()
function launchPopUp(url, width, height, title) {
    var params = "scrollbars=1,location=0,toolbar=0,menubar=0,titlebar=0,resizable=0,status=0,height=" + height + ",width=" + width;
    var newWindow = window.open(url, "",params);
    if(newWindow) {
        newWindow.focus();
        newWindow = null;
    }        
}

//Gets collection of anchors by class
//and attaches pop up event
//NB: Uses mootools $$ for getElementsByClass
function configurePopUpAnchors() {
    var popUpAnchors = $$("a.popUp");
    var dimensions = [];

    for(var i = 0; popUpAnchors.length > i; i++) {
        popUpAnchors[i].onclick = function(evt) {
            var stopEvent = new Event(evt).stop();
            dimensions = this.rel.split(",");
            launchPopUp(this.href, dimensions[0], dimensions[1], dimensions[2]);
        };
    }
}

//Gets collection of anchors by class
//and attaches new window
//NB: Uses mootools $$ for getElementsByClass
function configureNewWindowAnchors() {
    var popUpAnchors = $$("a.newWindow");
    var dimensions = [];
    for(var i = 0; popUpAnchors.length > i; i++) {
        popUpAnchors[i].addEvent("click", function(evt){ 
            var stopEvent = new Event(evt).stop();
            window.open(this.href);
        });
    }
}

//Returns locale cookie value
//NB: depends on MooTools for Cookie class
function getLocaleFromCookie() {
    var cookieName = "org.springframework.web.servlet.i18n.CookieLocaleResolver.LOCALE";
    return Cookie.get(cookieName);
}

//Return locale key value from querystring
//returns defaultLocale if no valid 
//locale key in querystring
//NB: depends on parseQuery()
function getLocale() {
    var defaultLocale = "en_GB";
    //strip leading '?' off of querystring
    var query = location.search.substr(1);
    var locale = query.parseQuery().locale;
    if(typeof locale === "undefined") {
        //check cookie
        if(getLocaleFromCookie() !== null) {
            locale = getLocaleFromCookie();
        }
        else {
            locale = defaultLocale;
        }
    }
    return locale;
}


//Return phase name value from querystring
//returns "see" if no valid 
//value in querystring
//NB: depends on parseQuery()
function getPhase() {
    var defaultPhase = "see";
    //strip leading '?' off of querystring
    var query = location.search.substr(1);
    var phase = query.parseQuery().phase;
    if(typeof phase === "undefined") {
        phase = defaultPhase;
    }
    return phase;
}

//Returns the value of a style on an element
//wraps the mootools 'getStyle' method up in
//a try-catch to fix Safari 2.0.4 bug
function getElementStyle(elementId, style) {
	var element;
	var styleValue = "";
	if($(elementId)) {
		element = $(elementId);
		try {
			styleValue = element.getStyle(style);
		}
		catch (e) {
			styleValue = element.style.display;
		}			
	}
	return styleValue;
}

//Toggles the display value of an element with
//a transition effect
//NB: depends on MooTools for setStyles and FX.Style
function displayElementWithTransition(elementToToggle, styleType, defaultState, transitionDuration) {
    
    var elementDisplayType = getElementStyle(elementToToggle, 'display'); //$(elementToToggle).getStyle('display');
    var elementVisibilityValue = getElementStyle(elementToToggle, 'visibility');
    var element;
    var showAttribute;
    var hideAttribute;
    var transition;
    
    if(styleType == "visibility") {
        if(elementVisibilityValue == 'hidden' || (elementVisibilityValue === '' && defaultState == 'none')) {
            element = $(elementToToggle).setStyles({
                visibility:'visible',
                opacity: 0
            });
            transition = new Fx.Style(element, 'opacity', {duration: transitionDuration} ).start(1);
        }
        else {
            element = $(elementToToggle).setStyle('visibility', 'hidden');
        }
    }
    else {
       if(elementDisplayType == 'none' || (elementDisplayType === '' && defaultState == 'none')) {
             element = $(elementToToggle).setStyles({
                display:'block',
                opacity: 0
            });
        }
        else {
            element = $(elementToToggle).setStyles({
                display:'none',
                opacity: 100
            });
        }
        transition = new Fx.Style(element, 'opacity', {duration: transitionDuration} ).start(1);
    }
    return true;    
    
}

//Toggles the display value of collection of elements with
//a transition effect
//NB: depends on displayElementWithTransition()
function displayElementsWithTransition(elementsToToggle, styleType, defaultState, transitionDuration) {
    for(var i = 0; i < elementsToToggle.length; i++) {
        displayElementWithTransition(elementsToToggle[i], styleType, defaultState, transitionDuration);
    }
}

//tracking functions
//event-specific wrappers for dcsMultiTrack() tracking method
///track language selection on default.htm
function trackLanguageSelection(languageSelected) {
    if(typeof(dcsMultiTrack) != "function") {
        return false;    
    }
    dcsMultiTrack('DCS.dcsuri','/language_selected.htm','WT.ti','Language selected','WT.cg_n','Landing','WT.cg_s','Language selected', 'DCSext.Language', languageSelected);
}
///track invite another friend on send-to-friend.htm 
///confirmation page
function trackInviteAnotherFriendLink() {
    if(typeof(dcsMultiTrack) != "function") {
        return false;    
    }
    dcsMultiTrack('DCS.dcsuri','/send_to_a_friend/invite_another.link','WT.ti','Invite another friend','WT.cg_n','Send to a friend','WT.cg_s','Invite another', 'DCSext.Language_content', getLocale());
}
///track language selection in footer
///confirmation page
function trackLanguageSelectionInFooter(language) {
    if(typeof(dcsMultiTrack) != "function") {
        return false;    
    }
    dcsMultiTrack('DCS.dcsuri','/furniture/language_select.htm','WT.ti','Furniture - Language selected','WT.cg_n','Furniture','WT.cg_s','Language selector', 'DCSext.Language', language, 'DCSext.Language_content', getLocale());
}
///track external link to Ferrari World
function trackFerrariWorldExternalLink() {
    if(typeof(dcsMultiTrack) != "function") {
		return false;
    }
    dcsMultiTrack('DCS.dcsuri','/furniture/ferrari_world.link','WT.ti','Ferrari World link','WT.cg_n','Furniture','WT.cg_s','Ferrari World', 'DCSext.Language_content', getLocale());
}
///track link to wallpaper download
function trackWallpaperLink(downloadTitle) {
    if(typeof(dcsMultiTrack) != "function") {
		return false;
    }
    dcsMultiTrack('DCS.dcsuri','/download/wallpaper.htm','WT.ti','Wallpaper download','WT.cg_n','Download','WT.cg_s','Wallpaper', 'DCSext.Download', downloadTitle,'DCSext.Language_content', getLocale());
}
///track link to wallpaper download
function trackScreensaverLink(screensaverTitle) {
    if(typeof(dcsMultiTrack) != "function") {
		return false;
    }
    dcsMultiTrack('DCS.dcsuri','/download/screensaver.htm','WT.ti','Screensaver download','WT.cg_n','Download','WT.cg_s','Screensaver', 'DCSext.Download', screensaverTitle,'DCSext.Language_content', getLocale());
}
///track link to wallpaper download
function trackSpecificationsLink(specificationsTitle) {
    if(typeof(dcsMultiTrack) != "function") {
		return false;
    }
    dcsMultiTrack('DCS.dcsuri','/download/technical_specifications.htm','WT.ti','Technical Specifications download','WT.cg_n','Download','WT.cg_s','Technical Specifications', 'DCSext.Download', specificationsTitle,'DCSext.Language_content', getLocale());
}

//end tracking functions


//Sets up the langauge selector in the footer
//NB: depends on MooTools for injectAfter, $E and $$ functions
function configureLanguageSelector(language) {
    if($(language)) {
        var currentLanguageItem = $(language);
        var currentLanguageAnchor = $E('a', language);
        var collectionOfItems = $$('#LanguageSelectorList li');
        var collectionOfItemsToToggle = [];
        var stopEvent;
        for(var i = 0; i < collectionOfItems.length; i++) {
            if(collectionOfItems[i].id != language) {
                collectionOfItems[i].removeClass("currentLocale");
                collectionOfItemsToToggle.push(collectionOfItems[i].id);
                collectionOfItems[i].setProperty("class", "semiTransparentBG");
                //add tracking event
                collectionOfItems[i].getFirst().addEvent("click", function(){ 
                    trackLanguageSelectionInFooter(this.parentNode.id);
                });
            }
            else {
                collectionOfItems[i].addClass("currentLocale");
            }
        }
        currentLanguageItem.injectAfter(collectionOfItems[collectionOfItems.length-1].id);
        currentLanguageAnchor.setProperty("href", "#");
        currentLanguageAnchor.setProperty("class", "current");
        currentLanguageAnchor.addEvent("click", function(evt){ 
            stopEvent = new Event(evt).stop();
			if($("LanguageSelectorList").hasClass("languageSelectorListCollapsed")) {
				$("LanguageSelectorList").addClass("languageSelectorListExpanded");
				$("LanguageSelectorList").removeClass("languageSelectorListCollapsed");
			}
			else if($("LanguageSelectorList").hasClass("languageSelectorListExpanded")) {
				$("LanguageSelectorList").addClass("languageSelectorListCollapsed");
				$("LanguageSelectorList").removeClass("languageSelectorListExpanded");
			}
			
            displayElementsWithTransition(collectionOfItemsToToggle, 'display', 'block', 250);
        });
    }
}

function showRemoveElementAnchorItem(currentItem) {
    $E("a.hideElement", $(currentItem)).setStyle("display", "block");
}

function showAddElementAnchorInPreviousItem(currentItem) {
    $E("a.showElement", $(currentItem).getPrevious()).setStyle("display", "block");
}

//Sets up the events corresponding to the 
//add/remove anchors (e.g. on the registration page)
function configureShowHideElementAnchors() {
    var showElementAnchors = $$("a.showElement");
    var showElementAnchor;
    var hideElementAnchors = $$("a.hideElement");
	var hideElementRelatedElementId;
    for(var i = 0; i < showElementAnchors.length; i++) {
        //show corresponding element from the rel attribute
        //and hide the 'add' anchor
        if(showElementAnchors[i].rel !== "" && typeof($(showElementAnchors[i].rel) !== "undefined")) {
            showElementAnchors[i].addEvent("click", function(evt){ 
                stopEvent = new Event(evt).stop();
                this.setStyle("display", "none");
                displayElementWithTransition(this.rel, 'display', 'none', 250);
                showRemoveElementAnchorItem(this.rel);
            });
        }        
    }
    for(var n = 0; n < hideElementAnchors.length; n++) {
        //hide corresponding element from the rel attribute
        //and show the 'add' anchor
		hideElementRelatedElementId = hideElementAnchors[n].rel.split("|")[0].trim();
        if(hideElementRelatedElementId !== "" && typeof($(hideElementRelatedElementId) !== "undefined")) {
            hideElementAnchors[n].addEvent("click", function(evt){ 
                stopEvent = new Event(evt).stop();
                this.setStyle("display", "none");
                displayElementWithTransition(this.rel.split("|")[0].trim(), 'display', 'block', 250);
                showAddElementAnchorInPreviousItem(this.rel.split("|")[0].trim());
            });
        }        
    }
}

//Attaches functions onpageload
//NB: Used in place of DomReady due to SwfObject
//causing DOM irregularity
window.addEvent('load', function() {
    configurePopUpAnchors();
	configurePopUpResizeAnchors();
    configureNewWindowAnchors();
    configureShowHideElementAnchors();
    configureLanguageSelector(currentLanguage);
});
