/* 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 = {};
}


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');
        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));
        }
        

    },
    
    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();
    }
    
    
});



FM.Initialize = function() {
    if (typeof(FM.Common) != 'undefined') {
        fmCommon = new FM.Common();
    }   
};

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


