﻿/* Custom transitions*/
Effect.Transitions.easeInExpo = function(pos){
	return (pos==0) ? 0 : Math.pow(2, 10 * (pos - 1));
}

Effect.Transitions.easeOutExpo = function(pos){
	return (pos==1) ? 1 : -Math.pow(2, -10 * pos) + 1;
}

Effect.Transitions.easeInOutExpo = function(pos){
	if(pos==0) return 0;
	if(pos==1) return 1;
	if((pos/=0.5) < 1) return 0.5 * Math.pow(2,10 * (pos-1));
	return 0.5 * (-Math.pow(2, -10 * --pos) + 2);	
}

Effect.Transitions.easeInCirc = function(pos){
	return -(Math.sqrt(1 - (pos*pos)) - 1);
}

Effect.Transitions.easeOutCirc = function(pos){
	return Math.sqrt(1 - Math.pow((pos-1), 2))
}

Effect.Transitions.easeInOutCirc = function(pos){
	if((pos/=0.5) < 1) return -0.5 * (Math.sqrt(1 - pos*pos) - 1);
	return 0.5 * (Math.sqrt(1 - (pos-=2)*pos) + 1);	
}

// Set up namespaces
if (typeof(FM) == 'undefined') {
    FM = {};
    FM.Pages = {};
    FM.Pages.Portfolio = {};
    FM.Controls = {};
}

// Detects when SlideShowPro is ready for listening. Attach events here.
// Full list of events here: http://wiki.slideshowpro.net/SSPfl/API-Introduction
function onSlideShowProReady() {
    var ssp = document.getElementById("ssp");
    ssp.addEventListener("galleryData","onGalleryData");
    ssp.addEventListener("galleryOpening","onGalleryOpen");
    ssp.addEventListener("albumData","onAlbumData");
}

function onGalleryData(o) {  
    var albumMenu = $('albumMenu');
    var galleryData = o.data;
        
    for (var i=0, j=galleryData.length; i<j; i++) {
        var album = galleryData[i][0];
        var callback = function(e) { 
            var link = e.element();
            var otherSelected = link.up('ul').down('a.sel');
            if (otherSelected) {
                otherSelected.removeClassName('sel');
            }
            
            link.addClassName('sel');
            
            fmCommon.loadAlbum(this.id, this.title); 
            e.stop();
        }.bind(album);
        
        var albumLink = new Element('a', { 'href': '#' + album.id, 'class' : 'pagelink', 'id' : 'link-' + album.id, 'style': 'display:none;' }).update(album.title);
        var listItem = new Element('li');
        listItem.insert(albumLink);
        albumLink.observe('click', callback);
        
        albumMenu.insert(listItem);
        
        albumLink.startOffset = albumLink.getStyle('padding-left');
        albumLink.endOffset = parseInt(albumLink.startOffset.gsub('px', '')) + 5 + 'px';
        var enterFx = function() { this.inFx = new Effect.Morph(this, { style: 'padding-left: ' + this.endOffset + '; font-weight: bold;', duration: 0.4, transition: Effect.Transitions.spring }); }.bind(albumLink);
        var leaveFx = function() { if (this.inFx) { this.inFx.cancel(); } this.morph('padding-left: ' + this.startOffset + ';', { duration: 0.1 });  }.bind(albumLink);
        albumLink.observe('mouseenter', enterFx);
        albumLink.observe('mouseleave', leaveFx);
        
        Effect.Appear(albumLink, { duration: 0.5, delay: i * 0.1 });
    }
}

function onAlbumData(o) {
    var albumMenu = $('albumMenu');
    var otherSelected = albumMenu.down('a.sel');
    if (otherSelected) { otherSelected.removeClassName('sel'); }
    
    var albumLink = $('link-' + o.data.id);
    if (albumLink) {
        albumLink.addClassName('sel');
    }
}

function onGalleryOpen() {    
}

FM.Controls.MainMenu = Class.create({
    menu: false,
    menuItems: [],
    
    page1: false,
    page2: false,
    menuDiv: false,
    
    fxTransition: Effect.Transitions.easeInExpo,
    fxDuration: 0.4,
    menuWidth: 190,
    
    initialize: function() {
        this.menu = $('menu');
        if (!this.menu) {
            return;
        }
        
        this.menuItems = [];
        var menuLinks = this.menu.select('li a.pagelink');
        var distance = 5;
        
        for (var i=0, j=menuLinks.length; i<j; i++) {
            var listItem = menuLinks[i];
            listItem.startOffset = listItem.getStyle('padding-left');
            listItem.endOffset = parseInt(listItem.startOffset.gsub('px', '')) + distance + 'px';
            
            var enterFx = function() { this.inFx = new Effect.Morph(this, { style: 'padding-left: ' + this.endOffset + '; font-weight: bold;', duration: 0.4, transition: Effect.Transitions.spring }); }.bind(listItem);
            var leaveFx = function() { if (this.inFx) { this.inFx.cancel(); } this.morph('padding-left: ' + this.startOffset + ';', { duration: 0.1 });  }.bind(listItem);
            listItem.observe('mouseenter', enterFx);
            listItem.observe('mouseleave', leaveFx);
        }
        
        var mainMenuLinks = $$('a.mainMenuLink');
        for (var i=0, j=mainMenuLinks.length; i<j; i++) {
            mainMenuLinks[i].observe('click', function(e) { this.goToPage(1); e.stop(); }.bind(this));
        }
        
        var nextPageLinks = $$('a.nextPageLink');
        for (var i=0, j=nextPageLinks.length; i<j; i++) {
            nextPageLinks[i].observe('click', function(e) { 
                this.goToPage(3); 
                e.stop(); 
            }.bind(this));
        }
        
        var portfolioLink = $('portfolioLink');
        if (portfolioLink) {
            portfolioLink.observe('click', function(e) { this.goToPage(2); e.stop(); }.bind(this));
        }
        
        var subMenuLink = $('subMenuLink');
        if (subMenuLink) {
            subMenuLink.observe('click', function(e) { this.goToPage(2); e.stop(); }.bind(this));
        }
        
        var galleryLink = $('galleryLink');
        if (galleryLink) {
            galleryLink.observe('click', function(e) { 
                fmCommon.toggleGallery(); 
                e.stop(); 
            });
        }
    },
    
    goToPage: function(pageNum) {
        var newOffset = this.menuWidth * (pageNum - 1);
        if (pageNum > 1) {
            newOffset = -1 * newOffset;
        }
        
        var newStyle = 'left:' + newOffset + 'px;';
        new Effect.Morph(this.menu, { style: newStyle, duration: this.fxDuration, transition: this.fxTransition });
    }
});

FM.Common = Class.create({
    mainMenu: false,
    
    initialize: function() {
        this.mainMenu = new FM.Controls.MainMenu();
    },

    getPageUrl: function(withQueryString) {
        if (withQueryString) {
            return window.location.href.toLowerCase();
        }

        return document.location.pathname.toLowerCase();
    },
    
    getMovie: function(movieId) {
        return $(movieId);
    },
    
    flashPutHref: function(href) { 
        location.href = href; 
    },
    
    loadAlbum: function(album, num) {
        this.getMovie('ssp').loadAlbum(album, num); 
    },
    
    mute: function() {
        this.getMovie('ssp').muteMedia(); 
    },
    
    unmute: function() {
        this.getMovie('ssp').unMuteMedia(); 
    },
    
    toggleGallery: function() {
        this.getMovie('ssp').toggleGallery(); 
    },
    
    toggleNav: function() {
        this.getMovie('ssp').toggleNav();
    },
    
    loadAlbum: function(albumName) {
        this.getMovie('ssp').loadAlbum(albumName, 0);
    },
    
    getParameter: function(param) {
        var val = this.getMovie('ssp').getParameter(param);
        alert(val);
    },
    
    embedMovie: function(pageName) {
        // SWFObject embed
        var flashvars = {
            paramXMLPath: "/Settings/param_" + pageName + ".xml",
            initialURL: escape(document.location),
            useExternalInterface: "true"
        }
        
        var params = {
            base: ".",
            bgcolor: "#121212",
            allowfullscreen: "true"
        }
        
        var attributes = {
            id: "ssp"
        }
        
        swfobject.embedSWF("/Scripts/slideshowpro.swf", "flashcontent", "810", "540", "9.0.115.0", false, flashvars, params, attributes);
    }
});

FM.Pages.Home = Class.create({
    initialize: function() {
        fmCommon.embedMovie('home');
    }
});

FM.Pages.Portfolio.Wedding = Class.create({
    initialize: function() {
        fmCommon.embedMovie('wedding');
    }
});

FM.Pages.Portfolio.Engagement = Class.create({
    initialize: function() {
        fmCommon.embedMovie('engagement');
    }
});

FM.Pages.Portfolio.Invitations = Class.create({
    initialize: function() {
        fmCommon.embedMovie('invitations');
    }
});

FM.Pages.Portfolio.Pregnancy = Class.create({
    initialize: function() {
        fmCommon.embedMovie('pregnancy');
    }
});

FM.Pages.Portfolio.Portrait = Class.create({
    initialize: function() {
        fmCommon.embedMovie('portrait');
    }
});


FM.Pages.Portfolio.Nature = Class.create({
    initialize: function() {
        fmCommon.embedMovie('nature');
    }
});

FM.Pages.Portfolio.Commercial = Class.create({
    initialize: function() {
        fmCommon.embedMovie('commercial');
    }
});

FM.Initialize = function() {
    if (typeof(FM.Common) != 'undefined') {
        fmCommon = new FM.Common();
    }
    
    var url = fmCommon.getPageUrl().gsub('.aspx', '');
    
    if (url.endsWith('wedding')) {
        _page_wedding = new FM.Pages.Portfolio.Wedding();
    } else if (url.endsWith('engagement')) {
       _page_engagement = new FM.Pages.Portfolio.Engagement();        
    } else if (url.endsWith('invitations')) {
       _page_invitations = new FM.Pages.Portfolio.Invitations();        
    } else if (url.endsWith('pregnancy')) {
       _page_pregnancy = new FM.Pages.Portfolio.Pregnancy();               
    } else if (url.endsWith('portrait')) {
       _page_portrait = new FM.Pages.Portfolio.Portrait();               
    } else if (url.endsWith('nature')) {
       _page_nature = new FM.Pages.Portfolio.Nature();        
    } else if (url.endsWith('commercial')) {
       _page_nature = new FM.Pages.Portfolio.Commercial();        
    } else if (url.endsWith('home')) {
       _page_home = new FM.Pages.Home();
    } else {
        // Splash page ... do nothing ...
    }
};

// Start the application
document.observe("dom:loaded", function() {
    FM.Initialize();
});
