/*
    RAECore - v1.0
    Class that controls the site's core level functions, such
    as the loader spinner, the lightbox functionality, and
    resize code.
    Dependencies: MooTools 1.2 Final
                  HistoryManager MT1.2 Port
*/
var RAECore = new Class({
    Implements: Options,
    
    options: {
        lightboxFade: 300,
        lightboxContentFade: 300,
        lightboxVisibleOpacity: 0.4,
        lightboxHiddenOpacity: 0,
        loaderFade: 200,
        cookieExpireOffset: 365,
        popupWidth: 800,
        popupHeight: 600
    },
    initialize:function(contentContainer, bannerContainer, content, lightbox, lightboxContent, loader, flashVersion, options) {
        this.setOptions(options);
        //Suppress Firebug debug if browser is IE
        if(Browser.Engine.trident) {
            console = {
                log: function() {},
                debug: function() {},
                info: function() {},
                warn: function() {},
                error: function() {},
                assert: function() {},
                dir: function() {},
                dirxml: function() {},
                trace: function() {},
                group: function() {},
                groupEnd: function() {},
                time: function() {},
                timeEnd: function() {},
                profile: function() {},
                profileEnd: function() {},
                count: function() {}
            }
        }
        this.contentContainer = contentContainer;
        this.bannerContainer = bannerContainer;
        this.contentContainerCoords = $empty;
        this.bannerContainerCoords = $empty;
        this.content = content;
        this.contentCoords = $empty;
        this.lightbox = lightbox;
        this.lightboxContent = lightboxContent;
        this.loader = loader;
        this.flashVersion = flashVersion;
        this.currentPathName = window.location.pathname;
        this.fxScrollDocument = new Fx.Scroll(document, {
            wheelStops: false    
        });
        this.scrollTopValue = 0;
        this.historyManager = new HistoryManager();
        this.lightbox.set('tween', {
            duration: this.options.lightboxFade,
            link: 'chain'
        });
        this.lightbox.setStyle('opacity', 0);
        this.lightboxContent.set('tween', {
            duration: this.options.lightboxContentFade,
            link: 'chain'
        });
        this.lightboxContent.setStyle('opacity', 0);
        this.loader.set('tween', {
            duration: this.options.loaderFade,
            link: 'chain',
            onStart: function() {
                if(this.loader.getStyle('opacity') == 0)
                    this.loader.setStyle('display', 'block');
            }.bind(this),
            onComplete: function() {
                if(this.loader.getStyle('opacity') == 0)
                    this.loader.setStyle('display', 'none');
            }.bind(this)
        });
        window.addEvent('resize', function() {
            this.resizeLightbox();
        }.bind(this));
    },
    
    getSupportedFlashVersion:function() {
        return this.flashVersion;
    },
    resizeLightbox:function() {
        this.contentContainerCoords = this.contentContainer.getCoordinates();
        this.bannerContainerCoords = this.bannerContainer.getCoordinates();
        this.contentCoords = this.content.getCoordinates();
        this.lightbox.setStyles({
            'left': this.bannerContainerCoords.left,
            'top': this.bannerContainerCoords.top,
            'width': this.contentContainerCoords.width,
            'height': this.contentContainerCoords.height+this.bannerContainerCoords.height
        });
        this.lightboxContent.setStyles({
            'left': this.contentCoords.left,
            'top': this.bannerContainerCoords.top
        });
    },
    showLightbox:function(content) {
        this.resizeLightbox();
        this.scrollTopValue = document.getScrollTop();
        
        if(Browser.Engine.trident4) { //Hide select elements for trident4 browsers due to implementation
            var selectElements = $$('select');
            selectElements.each(function(selectEl) {
                selectEl.setStyle('display', 'none');
            });
        }
        this.lightboxContent.adopt(content);
        this.lightbox.get('tween').start('opacity', this.options.lightboxVisibleOpacity).chain(
            function() {
                this.fxScrollDocument.toTop().chain(function() {
                    this.lightboxContent.tween('opacity', 1);
                }.bind(this));
            }.bind(this)
        );
        
    },
    updateLightbox:function(content) {
        this.lightboxContent.getFirst().dispose();
        this.lightboxContent.adopt(content);
    },
    hideLightbox:function() {
        if(Browser.Engine.trident4) {
            var selectElements = $$('select');
            selectElements.each(function(selectEl) {
                selectEl.setStyle('display', '');
            });
        }
        this.lightboxContent.get('tween').start('opacity', this.options.lightboxHiddenOpacity).chain(
            function() {
                this.lightboxContent.setStyle('visibility', 'hidden');
                this.lightbox.get('tween').start('opacity', this.options.lightboxHiddenOpacity).chain(
                    function() {
                        this.fxScrollDocument.start(0, this.scrollTopValue);
                        return this.lightboxContent.getFirst().dispose();
                    }.bind(this)    
                );
            }.bind(this)
        );
    },
    showLoader:function(relativeEl) {
        var loaderSize = this.loader.getSize();
        if(relativeEl != null) {
            var relativeElCoords = relativeEl.getCoordinates();
            this.loader.setStyles({
                'left': relativeElCoords.left + (relativeElCoords.width/2) - (loaderSize.x/2),
                'top': relativeElCoords.top + (relativeElCoords.height/2) - (loaderSize.y/2)
            });
        } else {
            this.contentContainerCoords = this.contentContainer.getCoordinates();
            this.loader.setStyles({
                'left': this.contentContainerCoords.left + (this.contentContainerCoords.width/2) - (loaderSize.x/2),
                'top': this.contentContainerCoords.top + (this.contentContainerCoords.height/2) - (loaderSize.y/2)
            });
        }
        this.loader.tween('opacity', 1);
    },
    hideLoader:function() {
        this.loader.tween('opacity', 0);
    },
    
    getCookie:function(key) {
        return Cookie.read(key);
    },
    setCookie:function(key, value) {
        Cookie.write(key, value, {
            duration: 365
        });
    },
    removeCookie:function(key) {
        Cookie.dispose(key);
    },
    startHistoryManager:function() {
        this.historyManager.start();
    },
    internalClick:function(link) {
        window.location = link;
    },
    customClick:function(link, linkName, trackVars, trackEvents) {
        var tempAnchor = ($type(link) == 'string') ? this.generateAnchorElement(link): link;
        
        //Omniture
        s.linkTrackVars= trackVars || 'None';
        s.linkTrackEvents= trackEvents || 'None';
        s.tl(tempAnchor,'o', linkName);
        this.clearTrackVarsEvents();
    },
    openDownloadLink:function(link, trackVars, trackEvents) {
        var tempAnchor = ($type(link) == 'string') ? this.generateAnchorElement(link): link;

        //Omniture
        s.linkTrackVars= trackVars || 'None';
        s.linkTrackEvents= trackEvents || 'None';
        s.tl(tempAnchor,'d');
        this.clearTrackVarsEvents();

        this.openWindow(tempAnchor.href, 'raedownload');
    },
    openExternalLink:function(link, trackVars, trackEvents) {
        var tempAnchor = ($type(link) == 'string') ? this.generateAnchorElement(link): link;
        
        //Omniture
        s.prop12 = tempAnchor.href;
        if(trackVars) {
            if(trackVars.contains('None'))
                s.linkTrackVars= 'prop12';
            else
                s.linkTrackVars= trackVars+',prop12';
        } else 
            s.linkTrackVars= 'prop12';

        s.linkTrackEvents= trackEvents || 'None';
        s.tl(tempAnchor,'e');
        this.clearTrackVarsEvents();
        
        this.openWindow(tempAnchor.href);
    },
    clearTrackVarsEvents:function() {
        s.linkTrackVars = 'None';
        s.linkTrackEvents = 'None';
    },
    addOmnitureEvent:function(omnitureEvent) {
        s.events += s.events.contains(omnitureEvent) ? '' : ','+omnitureEvent;
    },
    addOmnitureEvar:function(omnitureEvar, omnitureEvarValue) {
        eval('s.eVar'+omnitureEvar+'="'+omnitureEvarValue+'";');
    },
    generateAnchorElement:function(link, label) {
        return new Element('a', {
            'href': link,
            'html': label || ''
        });
    },
    openWindow:function(link, target) {
        window.open(link, target || '', 'toolbar=1,location=1,menubar=1,resizable=1,scrollbars=1,height=' + this.options.popupHeight + ',width=' + this.options.popupWidth);
    }
});
