(function( ){
    google.load("dojo", "1.3.2"); 

    function Menu( ) {
        var self = this;

        self.init = function( ) {
            self.nav = dojo.byId( 'nav' );
            self.level1 = dojo.query( 'ul.nav.level1', self.nav )[0];

            dojo.forEach( dojo.query( 'li > ul', self.level1 ), function( node ) {
                var link = dojo.query( 'a:first-child', node.parentNode )[0];
                dojo.connect( link, 'onmouseover', function( evt ) { self.expand( evt, node ) } );
                dojo.forEach( dojo.query( 'li > ul', node ), function( subnode ) {
                    var link = dojo.query( 'a:first-child', node.parentNode )[0];
                    dojo.connect( link, 'onmouseover', function( evt ) { self.expand( evt, node ) } );
                    dojo.forEach( dojo.query( 'li > ul', subnode ), function( lastnode ) {
                        var link = dojo.query( 'a:first-child', node.parentNode )[0];
                        dojo.connect( link, 'onmouseover', function( evt ) { self.expand( evt, node ) } );
                    } );
                } );
            } )
        };

        self.expand = function( evt, list ) {
            dojo.stopEvent( evt );

            dojo.forEach( dojo.query( 'ul', evt.target.parentNode.parentNode ), function( node ) {

                var visible = dojo.style( node, 'display' ) == 'block';

                if ( node != list && visible ) {

                    var hideanim = dojo.anim( node, { 
                        'opacity': '0'
                    }, 250 );

                    dojo.connect( hideanim, 'onEnd', function( ) {
                        dojo.style( node, 'display', 'none' );
                        dojo.style( list, { 
                            'display': 'block',
                            'left':  dojo.coords( evt.target.parentNode ).w + 20 + 'px'
                        }  );
                        var showanim = dojo.anim( list, { 
                            'opacity': '100'
                        }, 250 );
                    } );
                }
            } );

            if ( dojo.style( list, 'display' ) != 'block' ) {
                dojo.style( list, { 
                    'display': 'block',
                    'left':  dojo.coords( evt.target.parentNode ).w + 20 + 'px'
                }  );
                var showanim = dojo.anim( list, { 
                    'opacity': '100'
                }, 250 );
            }
        };

        return self.init( arguments );
    };

    Gallery = function( ) {
        var self = this;

        self.init = function( args ) {
            if ( args[0].length > 0 ) {
                    self.index = 0;
                    self.galleryWindow = dojo.byId( 'galleryWindow' );
                    self.galleryCloseLink = dojo.byId( 'galleryCloseLink' );
                    self.galleryPrevLink = dojo.byId( 'galleryPrevCol' );
                    self.galleryNextLink = dojo.byId( 'galleryNextCol' );
                    self.galleryImage = dojo.byId( 'galleryImage' );
                    self.galleryImageCol = dojo.byId( 'galleryImageCol' );
                    self.preloadingImage = new Image( );

                if ( typeof( args[0][0] ) == 'string' ) {

                    self.galleryLink = dojo.byId( 'galleryLink' );

                    dojo.connect( self.galleryLink, 'onclick', function( evt ) {
                        dojo.stopEvent( evt );
                        self.images = args[0];
                        self.preloadingImage.src = self.images[self.index];
                        dojo.style( self.galleryWindow, 'display','block' );
                        dojo.style( self.galleryImage, 'visibility', 'hidden' );
                        dojo.style( self.galleryPrevLink, 'visibility', 'hidden' );
                        if ( self.images.length > 1 ) {
                            dojo.style( self.galleryNextLink, 'visibility', 'visible' );
                        } else {
                            dojo.style( self.galleryNextLink, 'visibility', 'hidden' );
                        }
                    } );

                } else {

                    if ( args[0].length == 1 ) {
                        dojo.style( self.galleryPrevLink, 'visibility', 'hidden' );
                        dojo.style( self.galleryNextLink, 'visibility', 'hidden' )
                    }

                    dojo.forEach( dojo.query( 'a.galleryLink' ), function( node ) {
                        dojo.connect( node, 'onclick', function( evt ) {
                        dojo.stopEvent( evt );
                        self.index = 0;
                        self.images = args[0][parseInt( dojo.attr( evt.target, 'gallery' ) )];
                        dojo.style( self.galleryPrevLink, 'visibility', 'hidden' );
                        if ( self.images.length > 1 ) {
                            dojo.style( self.galleryNextLink, 'visibility', 'visible' );
                        } else {
                            dojo.style( self.galleryNextLink, 'visibility', 'hidden' );
                        }
                        self.preloadingImage.src = self.images[self.index];
                        dojo.style( self.galleryWindow, 'display','block' );
                        dojo.style( self.galleryImage, 'visibility', 'hidden' );
                    } );
                } );

                }

                dojo.connect( self.preloadingImage, 'onload', function( evt ) {
                    self.alignAndSwap( );
                } );

                dojo.connect( self.galleryNextLink, 'onclick', function( evt ) {
                    dojo.stopEvent( evt );
                    self.index++;
                    if ( self.index >= self.images.length - 1 ) {
                        dojo.style( self.galleryNextLink, 'visibility', 'hidden' );
                    }
                    dojo.style( self.galleryPrevLink, 'visibility', 'visible' );
                    dojo.style( self.galleryImage, 'visibility', 'hidden' );
                    self.preloadingImage.src = self.images[self.index];
                } );

                dojo.connect( self.galleryPrevLink, 'onclick', function( evt ) {
                    dojo.stopEvent( evt );
                    self.index--;
                    if ( self.index == 0 ) { 
                        dojo.style( self.galleryPrevLink, 'visibility', 'hidden' );
                    }
                    dojo.style( self.galleryNextLink, 'visibility', 'visible' );
                    dojo.style( self.galleryImage, 'visibility', 'hidden' );
                    self.preloadingImage.src = self.images[self.index];
                } );

                dojo.connect( self.galleryCloseLink, 'onclick', function( evt ) {
                    dojo.stopEvent( evt );
                    dojo.style( self.galleryImage, 'visibility', 'hidden' );
                    dojo.style( self.galleryWindow, 'display','none' );
                } );
            }
        };

        self.alignAndSwap = function( ) {
            var w = self.preloadingImage.width;
            if ( w == 400 ) {
                dojo.style( self.galleryImage, 'marginTop', '50px' );
                dojo.style( self.galleryImage, 'marginLeft', '-200px' );
            } else {
                dojo.style( self.galleryImage, 'marginTop', '20px' );
                dojo.style( self.galleryImage, 'marginLeft', '-110px' );
            }
            self.galleryImage.src = self.images[self.index];
            dojo.style( self.galleryImage, 'visibility', 'visible' );
        }

        return self.init( arguments );
    };

    function Forms( ) {
        var self = this;
        self.forms = dojo.query( 'form' );
        self.init = function( args ) {
            if ( self.forms.length > 0 ) {
                dojo.forEach( self.forms, function( node ) {
                    if ( dojo.attr( node, 'id' ) == 'contactform' ) {
                        self.Form = node;
                        self.email = dojo.byId( 'email' );
                        dojo.connect( self.email, 'onchange', self.verifyContactForm );
                        self.subject = dojo.byId( 'subject' );
                        dojo.connect( self.subject, 'onchange', self.verifyContactForm );
                        self.body = dojo.byId( 'body' );
                        dojo.connect( self.body, 'onchange', self.verifyContactForm );
                        self.contactForm( );
                    } else if ( dojo.attr( node, 'id' ) == 'newsletterform' ) {
                        self.Form = node;
                        self.email = dojo.byId( 'email' );
                        dojo.connect( self.email, 'onchange', self.verifyNewsletterForm );
                        self.newsletterForm( );
                    }
                } );
            }
        };

        self.verifyContactForm = function( ) {
            if ( !self.email.value.match( /^[A-Z0-9a-z.\-_]+@[a-z0-9]+\.[a-z]{2,3}/ ) ) {
                dojo.style( self.email, 'backgroundColor', '#fcc' );
                return false;
            } else {
                dojo.style( self.email, 'backgroundColor', '#fff' );
                if ( self.subject.value.length > 0 ) {
                    dojo.style( self.subject, 'backgroundColor', '#fff' );
                    if ( self.body.value.match( /[\S]+/ ) ) {
                        dojo.style( self.body, 'backgroundColor', '#fff' );
                        return true;
                    } else {
                        dojo.style( self.body, 'backgroundColor', '#fcc' );
                        return false;
                    }
                } else {
                    dojo.style( self.subject, 'backgroundColor', '#fcc' );
                    return false;
                }
            }
        };

        self.contactForm = function( ) {
            var submitButton = dojo.byId( 'sendButton' );
            dojo.connect( submitButton, 'onclick', function( evt ) {
                dojo.stopEvent( evt );
                if ( self.verifyContactForm( ) ) {
                    self.Form.submit( );
                }
            } );
        };

        self.verifyNewsletterForm = function( ) {
            if ( self.email.value.match( /^[A-Z0-9a-z.\-_]+@[a-z0-9]+\.[a-z]{2,3}/ ) ) {
                dojo.style( self.email, 'backgroundColor', '#fff' );
                return true;
            } else {
                dojo.style( self.email, 'backgroundColor', '#fcc' );
                return false;
            }
        };

        self.newsletterForm = function( ) {
            var signonButton = dojo.byId( 'signonButton' );
            var signoffButton = dojo.byId( 'signoffButton' );
            dojo.connect( signonButton, 'onclick', function( evt ) {
                dojo.stopEvent( evt );
                if ( self.verifyNewsletterForm( ) ) {
                    dojo.attr( self.Form, 'action', '/newsletter/signon/' );
                    self.Form.submit( );
                }
            } );

            dojo.connect( signoffButton, 'onclick', function( evt ) {
                dojo.stopEvent( evt );
                if ( self.verifyNewsletterForm( ) ) {
                    dojo.attr( self.Form, 'action', '/newsletter/signoff/' );
                    self.Form.submit( );
                }
            } );
        };


        return self.init( arguments );
    }

    google.setOnLoadCallback(function() {
        dojo.require("dojo._base.fx");
        dojo.addOnLoad( function( dojo ) {
            new Menu( );
            if ( typeof( images ) != 'undefined' ) {
                new Gallery( images );
            }
            new Forms( );
        } );
    } );
})();
