var Flathead = function() {
    return {
        init: function() {
            var transitionTime = 600;

            var $content = $('#content');

            $('.background-image').hide();

            $('.open-link').bind('click', function() {
                return false;
            });

            $('.download-link').bind('click', function() {
                var newWindow = window.open($(this).attr('href'), '_blank');

                newWindow.focus();
                return false;
            });

            $('#loading').fadeOut(transitionTime, function () {
                var $sidenav = $('li', '#sidenav');
                var sidenav_index = 0;

                var side_text_box = function($li) {
                    var $link = $li.find('a');

                    $link.bind('link-open', function() {
                        $('.sidenav-link[href="' + $link.attr('href') + '"]').addClass('current-link');
                    });

                    if (!$link.hasClass('text-box-link')) {
                        return;
                    }

                    var $box   = $($link.attr('href'));
                    var right  = $content.width() - $li.outerWidth();
                    var bottom = $content.height() - ($li.parent().position().top + $li.position().top + $li.height() + 2);

                    $box
                        .data('open-height', ($content.height() - $box.position().top - bottom) + 'px')
                        .data('closed-right', right + 'px')
                        .css({
                            height: '0px',
                            bottom: bottom,
                            right: right,
                            opacity: 0
                        });
                }

                var sidenav_effects = function($li) {
                    $li.animate({marginLeft:'0px'}, transitionTime, 'linear', function() {
                        side_text_box($li);

                        if (++sidenav_index < $sidenav.length) {
                            sidenav_effects($sidenav.eq(sidenav_index));
                        } else {
                            $('#flash-screen').fadeOut(transitionTime, function() {
                                $('li', '#sidenav').hover(function() {
                                    var $li = $(this);
                                    $li.prev().stop().animate({fontSize: '1.2em'}, transitionTime / 3);
                                    $li.stop().animate({fontSize: '2em'}, transitionTime / 3);
                                    $li.next().stop().animate({fontSize: '1.2em'}, transitionTime / 3);
                                }, function() {
                                    $('li', '#sidenav').stop().animate({fontSize: '1em'}, transitionTime / 3);
                                });

                                $('.open-link').unbind('click').bind('click', function() {
                                    var $link    = $(this);
                                    var $active  = $('.link-active');
                                    var $current = $('.current-link');

                                    if ($link.hasClass('link-active')) {
                                        // Do nothing
                                    } else if ($active.length) {
                                        $current.removeClass('current-link');
                                        $active.removeClass('link-active').trigger('link-close', function() {
                                            $link.addClass('link-active').addClass('current-link').trigger('link-open');
                                        });
                                    } else {
                                        $link.addClass('link-active').addClass('current-link').trigger('link-open');
                                    }

                                    return false;
                                });

                                var hash = document.location.hash;

                                if (hash && $(hash).length > 0) {
                                    $('.open-link[href="' + hash + '"]').eq(0).click();
                                 } else {
                                    $('#start').click();
                                }
                            });
                        }
                    });
                }

                $('.sidenav-link').each(function(i, link) {
                    var $link = $(link);

                    $link.bind('click', function() {
                        $('a[href="' + $link.attr('href') + '"]', '#sidenav').trigger('click');

                        return false;
                    });
                });

                $('.footer-link').each(function(i, link) {
                    var $link = $(link);

                    $link.bind('click', function() {
                        $('a[href="' + $link.attr('href') + '"]', '#footer').trigger('click');

                        return false;
                    });
                });

                $('.text-box.fade').each(function(i, box) {
                    var $box   = $(box);

                    $box
                        .data('open-height', $box.css('height'))
                        .css({
                            height: '0px',
                            right: '30px',
                            opacity: 0.5
                        })
                        .hide();
                });

                $('.text-box-link').each(function(i, link) {
                    var $link = $(link);
                    var $box  = $($link.attr('href'));

                    $link
                        .bind('link-open', function(event, callback) {
                            var $vbg = $('.background-image:visible');
                            var $pbg = $('.background-image.' + $box.attr('id'));
                            var $nbg = $pbg.eq(Math.round(($pbg.length - 1) * Math.random()));

                            $('#social-icons').fadeIn(transitionTime);

                            if ($nbg) {
                                $vbg.css({zIndex: 25});
                                $nbg.css({zIndex: 50}).fadeIn(transitionTime, function() {
                                    $vbg.hide();
                                });
                            } else {
                                $vbg.fadeOut(transitionTime);
                            }

                            if ($box.hasClass('fade')) {
                                $box
                                    .fadeIn(transitionTime)
                                    .animate({height: $box.data('open-height'), opacity: '1'}, transitionTime, 'linear', function() {
                                        $box.trigger('open');

                                        if (callback) {
                                            callback();
                                        }
                                    });
                            } else if ($box.hasClass('slide')) {
                                $box
                                    .animate({right: '30px', opacity: 0.5}, transitionTime)
                                    .animate({height: $box.data('open-height'), opacity: 1}, transitionTime, 'linear', function() {
                                        $box.trigger('open');

                                        if (callback) {
                                            callback();
                                        }
                                    });
                            }
                        })
                        .bind('link-close', function(event, callback) {
                            $box.stop(true);

                            if ($box.hasClass('fade')) {
                                $box
                                    .animate({height: '0px', opacity: 0.5}, transitionTime, 'linear', function() {
                                        $box.trigger('close');

                                        if (callback) {
                                            callback();
                                        }
                                    })
                                    .fadeOut(transitionTime);
                            } else if ($box.hasClass('slide')) {
                                $box
                                    .animate({height: '0px', opacity: '0.5'}, transitionTime)
                                    .animate({right: $box.data('closed-right'), opacity: 0}, transitionTime, 'linear', function() {
                                        $box.trigger('close');

                                        if (callback) {
                                            callback();
                                        }
                                    });
                            }
                        });
                });

                $('.square-text-box-link').each(function(i, link) {
                    var $link = $(link);
                    var $box  = $($link.attr('href'));
                    var $side = $('#sidenav');

                    $box
                        .data('open-height', $box.css('height'))
                        .css({
                            height: '0px',
                            right: '30px'
                        })
                        .hide();

                    $link
                        .bind('link-open', function(event, callback) {
                            var $vbg = $('.background-image:visible');
                            var $pbg = $('.background-image.' + $box.attr('id'));
                            var $nbg = $pbg.eq(Math.round(($pbg.length - 1) * Math.random()));

                            $('#social-icons').fadeIn(transitionTime);

                            if ($nbg) {
                                $vbg.css({zIndex: 25});
                                $nbg.css({zIndex: 50}).fadeIn(transitionTime, function() {
                                    $vbg.hide();
                                });
                            } else {
                                $vbg.fadeOut(transitionTime);
                            }

                            $side
                                .fadeOut(transitionTime, function() {
                                    $box
                                        .fadeIn(transitionTime)
                                        .animate({height: $box.data('open-height')}, transitionTime, 'linear', function() {
                                            $box.trigger('open');

                                            if (callback) {
                                                callback();
                                            }
                                        });
                                });
                        })
                        .bind('link-close', function(event, callback) {
                            $box.stop(true);

                            $box
                                .animate({height: '0px'}, transitionTime, 'linear')
                                .fadeOut(transitionTime, function() {
                                    $side
                                        .fadeIn(transitionTime, function() {
                                            $box.trigger('close');

                                            if (callback) {
                                                callback();
                                            }
                                        });
                                });
                        });
                });

                $('.video-link').each(function(i, link) {
                    var $link = $(link);
                    var $box  = $($link.attr('href'));

                    $box.bind('open', function() {
                        if ($box.hasClass('loaded')) {
                            $box.find('*').css({visibility:'visible'});
                        } else {
                            var $src = $box.find('.video-src').eq(0);

                            if (!$src.data('src')) {
                                $src
                                    .data('src', $src.text())
                                    .text('')
                                    .show()
                                    .attr('id', 'video-' + (Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000));
                            }

                            swfobject.embedSWF($src.data('src'), $src.attr('id'), "795", "457", "9.0.0", false, {}, {}, {}, function(event) {
                                if (event.success) {
                                    $box.addClass('loaded');
                                } else {
                                    $src
                                        .append('<p>There was a problem loading the video.</p>')
                                        .append('<p>Please check if Flash is installed.</p>');
                                }
                            });
                        }
                    });

                    $link
                        .bind('link-open', function(event, callback) {
                            var $vbg = $('.background-image:visible');

                            var transition = function() {
                                $box.fadeIn(transitionTime, function() {
                                    $box
                                        .trigger('open');

                                    if (callback) {
                                        callback();
                                    }
                                });
                            }

                            $('#social-icons').fadeOut(transitionTime);

                            if ($vbg.length) {
                                $vbg.fadeOut(transitionTime, transition);
                            } else {
                                transition();
                            }
                        })
                        .bind('link-close', function(event, callback) {
                            $box
                                .css({backgroundPosition: '-100% 50%'})
                                .find('*').css({visibility:'hidden'}).end()
                                .stop(true)
                                .fadeOut(transitionTime, function() {
                                    $box
                                        .css({backgroundPosition: 'center'})
                                        .trigger('close');

                                    if (callback) {
                                        callback();
                                    }
                                });
                        });
                });

                $('.large-text-box-link').each(function(i, link) {
                    var $link = $(link);
                    var $box  = $($link.attr('href'));

                    $box
                        .data('open', $box.css('height'))
                        .css({height: '0px', visibility: 'visible'})
                        .hide();

                    $link
                        .bind('link-open', function(event, callback) {
                            var $vbg = $('.background-image:visible');

                            var transition = function() {
                                $box
                                    .fadeIn(transitionTime)
                                    .animate({height: $box.data('open')}, transitionTime, 'linear', function() {
                                        $box.trigger('open');

                                        if (callback) {
                                            callback();
                                        }
                                    });
                            }

                            $('#social-icons').fadeOut(transitionTime);

                            if ($vbg.length) {
                                $vbg.fadeOut(transitionTime, transition);
                            } else {
                                transition();
                            }
                        })
                        .bind('link-close', function(event, callback) {
                            $box
                                .stop(true)
                                .fadeOut(transitionTime, function() {
                                    $box.trigger('close');

                                    if (callback) {
                                        callback();
                                    }
                                });
                        });
                });

                $('.case-study-shadow-link').each(function(i, link) {
                    var $link = $(link);

                    $link.bind('click', function() {
                        $link.parent().find('.case-study-link').trigger('click');

                        return false;
                    });
                });

                $('.case-study-link').each(function(i, link) {
                    var $link = $(link);
                    var $box  = $($link.attr('href'));

                    $link
                        .bind('link-open', function(event, callback) {
                            var $vbg = $('.background-image:visible');

                            var transition = function() {
                                $box.fadeIn(transitionTime, function() {
                                    $box.trigger('open');

                                    if (callback) {
                                        callback();
                                    }
                                });
                            }

                            $('#social-icons').fadeOut(transitionTime);

                            if ($vbg.length) {
                                $vbg.fadeOut(transitionTime, transition);
                            } else {
                                transition();
                            }
                        })
                        .bind('link-close', function(event, callback) {
                            $box
                                .stop(true)
                                .fadeOut(transitionTime, function() {
                                    $box.trigger('close');

                                    if (callback) {
                                        callback();
                                    }
                                });
                        });
                });

                $('#blog').bind('open', function() {
                    var $container = $(this);
                    var $blog = $('#blog-content');

                    if ($container.hasClass('loaded')) {
                        return;
                    } else {
                        $blog.css({backgroundPosition: 'center'});
                    }

                    var feed = new google.feeds.Feed('http://weareflathead.blogspot.com/feeds/posts/default');

                    feed.setNumEntries(10);
                    feed.includeHistoricalEntries();

                    feed.load(function(result) {
                        if (!result.error) {
                            $blog.css({backgroundImage: 'none'});
                            $container.addClass('loaded');

                            for (var i = 0; i < result.feed.entries.length; i++) {
                                var entry = result.feed.entries[i];

                                $blog
                                    .append('<h2>' + entry.title + '</h2>')
                                    .append('<div>' + entry.content + '</div>');
                            }

                            $blog.jScrollPane({
                                scrollbarWidth: 15,
                                dragMinHeight: 40,
                                dragMaxHeight: 40
                            });
                        }
                    });
                });

                $('#about-us').bind('open', function() {
                    var $container = $(this);
                    var $twitter = $('#twitter-content');

                    if ($container.hasClass('loaded')) {
                        return;
                    }

                    $twitter.css({backgroundPosition: 'center'});

                    $('head').append('<script type="text/javascript" src="http://www.twitter.com/statuses/user_timeline/weareflathead.json?callback=Flathead.twitter&count=10">');
                });

                $('#contact-us-form-submit').bind('click', function() {
                    var $submit = $(this);
                    var $form = $submit.closest('form');

                    $.ajax({
                        beforeSend : function() {
                            $submit.attr('disabled', 'disabled');
                        },
                        complete : function() {
                            $submit.removeAttr('disabled');
                        },
                        data : $form.serializeArray(),
                        type : 'POST',
                        url : '/mail.php',
                        dataType : 'json',
                        success : function(response) {
                            if (response.success) {
                                $form.find(':text').val('');
                            }
                        }
                    });

                    return false;
                });

                $sidenav.each(function(i, elm) {
                    var $elm = $(elm);
                    $elm.css({marginLeft: '-' + ($elm.outerWidth() + 5) + 'px'});
                });

                sidenav_effects($sidenav.eq(sidenav_index));
            });
        },
        twitter: function(obj) {
            var $container = $('#about-us');
            var $twitter = $('#twitter-content');

            $twitter.css({backgroundImage: 'none'});

            $.each(obj, function(i, tweet) {
                $twitter
                    .append('<p class="tweet">' + tweet.text + '</p>')
                    .append('<p class="date">' + Date.parse(tweet.created_at).toString('dd/MM/yy HH:mm:ss') + '</p>');
            });

            $twitter.jScrollPane({
                scrollbarWidth: 15,
                dragMinHeight: 40,
                dragMaxHeight: 40
            });

            $container.addClass('loaded');
        }
    }
}();

$(window).bind('load', function() {
    Flathead.init();
});

