var CFFC = new Class({
    options: {
        'replace_headers': true,
        'key_navigation': true,
        'preload': true,
        'tool_tips': true,
        'funky_menu': true
    },

    initialize: function(options) {
        this.setOptions(options);
        this.cookie = new Hash.Cookie('cffc', {duration: 3600});

        this.initiateExif();

        if (this.options.funky_menu) {
            this.initiateMenu();
        }

        if (this.options.replace_headers) {
            //this.replaceHeaders($$('h1'));
            this.replaceHeaders($$('h2'));
        }

        if (this.options.tool_tips) {
            var tips = new Tips($$('.tool'));
        }

        if (this.options.key_navigation) {
            this.setupKeys();
        }

        if (this.options.preload) {
            window.addEvent('load', this.preload);
        }
    },

    initiateExif: function() {
        var exif = $E('#photo-info dl.extra');

        if (!exif) {
            return;
        }

        exif.set('slide', {duration: 'normal', transition: Fx.Transitions.Cubic.easeOut});

        $('photo-info').addEvent('click', function(e) {
            this.toggleExif();
        }.bindWithEvent(this));

        if (this.cookie.get('exif-info')) {
            exif.slide('show');
        } else {
            exif.slide('hide');
        }
    },

    toggleExif: function() {
        if ($('photo-info')) {
            var exif = $E('#photo-info dl.extra');
            this.cookie.set('exif-info', !this.cookie.get('exif-info'));
            //this.extraInfoSlide = new Fx.Slide($E('#photo-info dl.extra'), {
            //    duration: 1000,
            //    transition: Fx.Transitions.Pow.easeOut
            //});

            if (this.cookie.get('exif-info')) {
                exif.slide('in');
            } else {
                exif.slide('out');
            }
        }
    },

    preload: function() {
        var nextImage = $E('#navigation-photos a img');
        if (nextImage) {
            nextImage = nextImage.getProperty('src');
            nextImage = nextImage.replace('navigation', 'big');
            new Asset.image(nextImage);
        }
    },

    setupKeys: function() {
        window.addEvent('keydown', function(e) {
            if (e.key == 'space' || e.key == 'n' || e.key == 'j' || e.key == 'right') {
                e.stop();
                var nextHref = $E('#navigation-photos a');
                if (nextHref) {
                    nextHref = nextHref.getProperty('href')
                    window.location = nextHref;
                }
            } else if (e.key == 'left' || e.key == 'p' || e.key == 'k') {
                e.stop();
                history.back();
            } else if (e.key == 'e') {
                e.stop();
                this.toggleExif();
            }
        }.bindWithEvent(this));
    },

    replaceWithImage: function(element, imgSrc) {
        img = new Element('img', {
            src: imgSrc,
            alt: element.get('text')
        });

        // Blank out the contents of the element.
        element.set('text', '');

        // Place the image element in there instead.
        element.adopt(img);
    },

    initiateMenu: function() {
        $$('#header ul.menu li a').each(function(element) {
            var img = "/gfx/menu/" + element.getProperty('title');

            if (element.getProperty('class').indexOf("current") != -1) {
                img = img + "-current.png";
            } else {
                img = img + ".png";
            }

            this.replaceWithImage(element, img);
        }, this);

        $$('#header ul.menu li a').each(function(item, i) {
            item.addEvent('mouseenter', function(e) {
                var img = this.getFirst();
                var file = img.getProperty('src');

                if (this.getProperty('class').indexOf('current') == -1) {
                    file = file.replace('.png', '-over.png');
                }
                img.setProperty('src', file);
            });

            item.addEvent('mouseleave', function(e) {
                var img = this.getFirst();
                var file = img.getProperty('src');
                if (this.getProperty('class').indexOf("current") == -1) {
                    file = file.replace('-over.png', '.png');
                }
                img.setProperty('src', file);
            });
        });


        $$('#footer ul.menu li a').each(function(element) {
            var img = "/gfx/menu/" + element.getProperty('title');

            if (element.getProperty('class').indexOf("current") != -1) {
                img = img + "-current.png";
            } else {
                img = img + ".png";
            }

            this.replaceWithImage(element, img);
        }, this);

        $$('#footer ul.menu li a').each(function(item, i) {
            item.addEvent('mouseenter', function(e) {
                var img = this.getFirst();
                var file = img.getProperty('src');

                if (this.getProperty('class').indexOf('current') == -1) {
                    file = file.replace('.png', '-over.png');
                }
                img.setProperty('src', file);
            });

            item.addEvent('mouseleave', function(e) {
                var img = this.getFirst();
                var file = img.getProperty('src');
                if (this.getProperty('class').indexOf("current") == -1) {
                    file = file.replace('-over.png', '.png');
                }
                img.setProperty('src', file);
            });
        });
    },

    /*
     * Replace headers with pretty images.
     *
     * Arguments: headings -- an collection of headers.
     *
     * Each header must have the 'id' property, which must correspond to a image
     * named the same.
     */
    replaceHeaders: function(headings) {
        headings.each(function(el, i) {
            if(el.get('title') != null && el.get('title').length > 0) {
                var text = el.get('title');
            } else {
                var text = el.get('text');
            }
			text = text.replace(/\s+/g, '_');
			var url = '/headers/' + escape(text) + '/';

			if (el.hasClass('black')) {
				url = url + 'black/';
			}

			url = url + 'header.png';
			this.replaceWithImage(el, url);
        }, this);
    }
});

CFFC.implement(new Options);

window.addEvent('domready', function() {
    var cffc = new CFFC();
});
