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

    function Menu( ) {
        var self = this;

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

            var l1Height = dojo.style( self.level1, 'height' );


            dojo.style( self.level1, 'marginTop', 143 - l1Height +'px' );

            var cnt = 0;
            var l1cnt = dojo.query( '> li', self.level1 ).length;
            var uHeight = l1Height/l1cnt;
            dojo.forEach( dojo.query( 'ul.nav.level2', self.nav ), function( level2 ) {
                dojo.style( level2, 'opacity',0 );
                dojo.style( level2, 'display','block' );
                var l2Height = dojo.style( level2, 'height' );
                var l2Height = dojo.style( level2, 'height' );
                if ( l2Height >= l1Height || l2Height > ( uHeight * ( l1cnt-cnt ) ) ) {
                    dojo.style( level2, 'marginTop', l1Height - l2Height+ 'px' );
                } else {
                    dojo.style( level2, 'marginTop', cnt * uHeight + 'px' );
                }
                dojo.style( level2, 'display','none' );
                dojo.style( level2, 'opacity',1 );
                cnt++;
            } );

            dojo.forEach( dojo.query( '> li', self.level1 ), function( node ) {
                dojo.connect( dojo.query( '> a', node )[0], 'onclick', function( evt ) {
                    dojo.stopEvent( evt );
                } );
            } )


            dojo.style( self.level1, 'visibility', 'visible' );

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

        self.toggle = function( link, list ) {
            var self = this;

            if ( link ) {
                dojo.forEach( dojo.query( '> li > a.active', link.parentNode.parentNode ), function( node ) {
                    dojo.toggleClass( node, 'active', false );
                } );

                dojo.toggleClass( link, 'active', true );

                dojo.forEach( dojo.query( 'ul', link.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( link.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( link.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 );
    }

    var Slideshow = function( ) {
        var self = this;
        self.index = 0;
        self.textnode = dojo.byId( "indextext" );
        self.linknode = dojo.byId( "indexlink" );
        self.imagenode = dojo.byId( "indeximage" );

        self.next = function( ) {
            dojo.fadeOut( {node:self.textnode} ).play();
            dojo.fadeOut( {node:self.linknode} ).play();
            dojo.fadeOut( {node:self.imagenode,
                    onEnd: function( ) {
                        self.index++;
                        self.index = (self.index >= self.indexitems.length) ? 0 : self.index;
                        self.textnode.innerHTML = self.indexitems[self.index].text;
                        self.linknode.innerHTML = '<a href="'+self.indexitems[self.index].url+'">'+self.indexitems[self.index].link+'</a>';
                        self.imagenode.src = "/static/images/uploaded/root/"+self.indexitems[self.index].src;
                        dojo.style( self.textnode, {
                            "left": self.indexitems[self.index].textleft,
                            "top": self.indexitems[self.index].texttop,
                            } );
                        dojo.style( self.linknode, {
                            "left": self.indexitems[self.index].linkleft,
                            "top": self.indexitems[self.index].linktop,
                            } );
                        dojo.fadeIn( {node:self.textnode} ).play();
                        dojo.fadeIn( {node:self.linknode} ).play();
                        dojo.fadeIn( {node:self.imagenode,
                            onEnd: function( ) {

                            }} ).play();
                    }} ).play();
        }

        self.init = function( ) {
            self.indexitems = window.indeximages;
            for ( i in self.indexitems ) {
                var preload = dojo.create( 'img', {'src': '/static/images/uploaded/root/'+self.indexitems[i].src } );
            }
            if ( self.indexitems.length > 0  ) {
                self.textnode.innerHTML = self.indexitems[self.index].text;
                self.linknode.innerHTML = '<a href="'+self.indexitems[self.index].url+'">'+self.indexitems[self.index].link+'</a>';
                self.imagenode.src = "/static/images/uploaded/root/"+self.indexitems[self.index].src;
                dojo.style( self.textnode, {
                    "left": self.indexitems[self.index].textleft,
                    "top": self.indexitems[self.index].texttop,
                    } );
                dojo.style( self.linknode, {
                    "left": self.indexitems[self.index].linkleft,
                    "top": self.indexitems[self.index].linktop,
                    } );
            }
            if ( self.indexitems.length > 1 ) {
                setInterval( function( ) {
                        self.next();
                        }, 4000 );
            }
        }

        return self.init( );
    };

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

