﻿var $selectors = {},
    $browser = {},
    DD = {

        _debug: function DD_debug() {
            return window.console && console.log.call(console, arguments);
        },

        _init: {
            article: function DD_init_article() {

                // Fade images on hover if no css3 transitions
                if (!$browser.transitions) {
                    DD.polyfill.thumbhovering();
                }

                // Twitter sharing callback
                if (typeof (twttr) !== 'undefined') {
                    twttr.events.bind('tweet', function(e) {
                        if (e) {
                            var targetUrl;
                            if (e.target && e.target.nodeName == 'IFRAME') {
                                targetUrl = extractParamFromUri(e.target.src, 'url');
                            }
                            _gaq.push(['_trackSocial', 'twitter', 'tweet', targetUrl]);
                        }
                    });
                }

                // Facebook sharing callback
                FB.Event.subscribe('edge.create', function(targetUrl) {
                    _gaq.push(['_trackSocial', 'facebook', 'like', targetUrl]);
                });

				// Next/prev tracking
				
				$('#articlenav').find('a').click(function(e){
					var pageDir = this.dataset.navdirection;
					_gaq.push(['_trackEvent', 'Next and Previous Article', pageDir]);
				});

				// Widget More From
				if (!!$('.widget.more-from').length) {
					
					var moreFromDir = $('.widget.more-from').find('.arrow');

					$('.widget.more-from').find('.slides').cycle({
						fx: 'scrollHorz',
						timeout: 6000,
						speed: 850,
						easing: 'easeInOutQuad'
					});

					moreFromDir.click(function(e) {
						e.preventDefault();
						var cycleDir = this.dataset.cycledirection,
							cycleDirection = (cycleDir==='prev') ? 'Previous' : 'Next';

						_gaq.push(['_trackEvent', 'More From Widget', cycleDirection]);
						$('.widget.more-from').find('.slides').cycle(cycleDir);
					});

					$('.widget.more-from').find('.slides').find('a').click(function(e) {
						e.preventDefault();
						var widgetMethod = $(this).parents('.widget').attr('data-widgettitle');
						_gaq.push(['_trackEvent', 'Widget Click', widgetMethod]);
					});

				}

                // start video
                DD.video.setup();

            },

            /* Blog stuff
            -------------------------------------------------------------- */

            blog: function DD_init_blog() {

                DD.blog.twitter('#twittercontainer', 'mentions', 20, true);
                DD.blog.twitter('#twittercontainer2', 'timeline', 20, null);

                /* Twitter content tabs
                ---------------------------------------------------------- */

                $("#twittertabs").tabs({
                    cookie: {
                        expires: 30
                    }
                });

            },

            gallery: function DD_init_gallery() {

                // user article for FB / Twitter social tracking
                DD._init.article();

                // Tumblr sharing callback
                $('#editorial').find('.tumblr-share').click(function() {
                    _gaq.push(['_trackSocial', 'tumblr', 'share', window.location.pathname]);
                });

                // add page-specific selectors
                $.extend($selectors, {
                    thumbnails: $('#thumbnails'),
                    galleryImage: $('#gallery-image'),
                    thumbnailToggle: $('#thumbnail-toggle'),
                    galleryPager: $('#controls').find('.pager')
                });

                $selectors.galleryNext = $selectors.galleryPager.find('.next');
                $selectors.galleryPrev = $selectors.galleryPager.find('.prev');

                $.extend(DD.keyFn, {
                    //left
                    37: function DD_keyFn_left() {
                        if (!!$selectors.galleryPrev.length) {
                            window.location.href = $selectors.galleryPrev.attr('href');
                        }
                    },

                    // right
                    39: function DD_keyFn_right() {
                        if (!!$selectors.galleryNext.length) {
                            window.location.href = $selectors.galleryNext.attr('href');
                        }
                    }
                });

                // fancybox for main image
                $selectors.galleryImage.find('a').fancybox({
                    'autoScale': true,
                    'overlayOpacity': 0.6,
                    'speedIn': 500,
                    'speedOut': 250,
                    'titleShow': false,
                    'cyclic': true
                });


            },
            home: function DD_init_home() {

                /* Get advert dimensions
                -------------------------------------------------------------- */

                var adverts = $selectors.articleGrid.find('.advert-inner'),
                    infscrPageview = 1;

                for (var i = 1; i <= adverts.length; i++) {

                    var $ad = $(this),
                        $adServed = $ad.find('script + script + div');

                    if (!$adServed) {
                        $ad.css('display', 'none');
                        return false;
                    }

                    $ad.css({
                        width: $adServed.width() + 'px',
                        height: $adServed.height() + 'px'
                    });

                }

                /* Initiate masonry + infinite scrolls
                -------------------------------------------------------------- */

                if (!$('#searchterms').length) {

                    // Add
                    // $.Mason.prototype.resize=function(){this._getColumns();this._reLayout();};$.Mason.prototype._reLayout=function(callback){var freeCols=this.cols;if(this.options.cornerStampSelector){var $cornerStamp=this.element.find(this.options.cornerStampSelector),cornerStampX=$cornerStamp.offset().left-(this.element.offset().left+this.offset.x+parseInt($cornerStamp.css("marginLeft")));freeCols=Math.floor(cornerStampX/this.columnWidth);}var i=this.cols;this.colYs=[];while(i--){this.colYs.push(this.offset.y);}for(i=freeCols;i<this.cols;i++){this.colYs[i]=this.offset.y+$cornerStamp.outerHeight(true);}this.layout(this.$bricks,callback);};
                    
                    $selectors.articleGrid.masonry({
                        columnWidth: 53,
                        itemSelector: '.article'
                        // cornerStampSelector: '#homepage-ad-right'
                    }).infinitescroll({
                        navSelector: '#page-nav',
                        nextSelector: '#page-nav a',
                        itemSelector: '.article',
                        loadingText: 'Loading the next page',
                        loadingMsgRevealSpeed: 0,
                        bufferPx: 80,
                        extraScrollPx: 0,
                        donetext: 'No more pages to load',
                        debug: false,
                        animate: false,
                        loadingImg: '/css/images/ajax-loader.gif'
                    }, function(newElements) {
                        infscrPageview++;
                        _gaq.push(['_trackPageview', '/page/' + infscrPageview]);
                        $selectors.articleGrid.masonry('appended', $(newElements));
                    });

                } else {

                    $selectors.articleGrid.masonry({
                        itemSelector: 'div.article',
                        columnWidth: 53
                    });

                }


                /* Widget tracking
                -------------------------------------------------------------- */

                var $widgets = $selectors.articleGrid.find('.widget').find('a').live('click', function(e) {

                    var widgetMethod = $(this).parents('.widget').attr('data-widgettitle');
                    _gaq.push(['_trackEvent', 'Widget Click', widgetMethod]);

                });

            },
            projects: function() { },
            video: function() {

                $selectors.slides = $('#slides');
                $selectors.slide = $selectors.slides.find('div');
                $selectors.pager = $('#pager');
                $selectors.pagerPrev = $('#prev');
                $selectors.pagerNext = $('#next');
                $selectors.pagerA = $selectors.pagerPrev.add($selectors.pagerNext);

                /* Extend keyboard
                -------------------------------------------------------------- */

                $.extend(DD.keyFn, {
                    // left
                    37: function() {
                        $selectors.pagerPrev.click();
                    },

                    // right
                    39: function() {
                        $selectors.pagerNext.click();
                    }
                });

                /* Begin video player
                -------------------------------------------------------------- */

                DD.video.setup();


                /* Thumbnail fix
                -------------------------------------------------------------- */

                // REFACTOR: Use this in css
                $("#video ul.videos li:nth-child(7n)").css('margin-right', "0");


                /* Cycle the video thumbnail panels
                -------------------------------------------------------------- */

                //FIND PAGE NUMBER
                var lastslide = $('#total-slides').text(),
                    currentslide = $('#current-slide').text(),
                    previousslideload = parseInt(currentslide) - 1,
                    nextslideload = parseInt(currentslide) + 1;

                //LOAD CURRENT SLIDE
                $selectors.slide.addClass('page' + currentslide);

                //CREATE DIV FOR EACH PAGE
                var pagesBefore = document.createDocumentFragment(),
                    pagesAfter = document.createDocumentFragment();

                for (i = 0; i < lastslide; i++) {
                    var slideexists = $('#slides .slide.page' + (i + 1)).length;

                    if (!slideexists) {
                        var thisChild = document.createElement('div'),
                            thisFragment = (currentslide <= i) ? pagesAfter : pagesBefore;
                        thisChild.className = 'slide page' + (i + 1);

                        thisFragment.appendChild(thisChild);

                    }
                }

                $selectors.slides
                    .append(pagesAfter)
                    .prepend(pagesBefore);

                $selectors.slide = $selectors.slides.find('div');

                switch ($selectors.slides.length) {

                    case '1':
                        $selectors.pager.hide();
                        break;

                    case '2':
                        var otherSlide = (currentslide == '2') ? '2' : '1';
                        DD.video.slideLoad(1, 2);
                        break;

                    default:

                        var currentSlideNum = parseInt(currentslide),
                            prevSlideLoad = DD.video.slideCleanup(0, currentSlideNum - 1),
                            nextSlideLoad = DD.video.slideCleanup(1, currentSlideNum - 1);

                        DD.video.slideLoad(prevSlideLoad.thisSlide, prevSlideLoad.toLoad);
                        DD.video.slideLoad(nextSlideLoad.thisSlide, nextSlideLoad.toLoad);

                        break;

                }


                $selectors.slides.cycle({
                    fx: 'scrollHorz',
                    timeout: 0,
                    speed: 1250,
                    easing: 'easeInOutQuad',
                    startingSlide: (currentslide - 1),
                    onPrevNextEvent: DD.video.slideChange
                });


                $selectors.pagerA.click(function(e) {

                    e.preventDefault();

                    var $self = $(this),
                        direction = this.id;

                    $selectors.slides.cycle(direction);

                });

            }
        },

        blog: {

            twitter: function(element, method, count, avatar) {

                var twitter_api_url = 'http://search.twitter.com/search.json?callback=?&q=';
                twitter_api_url += (method == "timeline") ? 'from%3A' : '%40';
                twitter_api_url += 'dazedmagazine' + '&rpp=' + (count || 20);

                $.ajax({
                    url: twitter_api_url,
                    dataType: 'json',
                    cache: false,
                    success: function(data) {
                        $.each(data.results, function(e, tweet) {

                            if (tweet.text !== undefined) {

                                var tweet_html = '<article class="tweet">';
                                if (avatar) tweet_html += '<p><a href="http://www.twitter.com/' + tweet.from_user + '" target="_blank" rel="nofollow"><img src="' + tweet.profile_image_url + '" alt="' + tweet.from_user + '" /></a></p>';
                                tweet_html += '<p>';
                                if (avatar) tweet_html += '<strong><a href="http://www.twitter.com/' + tweet.from_user + '" target="_blank" rel="nofollow">' + tweet.from_user + '</a><\/strong> ';
                                tweet_html += DD.blog.tweet_cleanup(tweet.text) + '<\/p>';
                                tweet_html += '<p class="pub_date"><span><\/span>' + DD.blog.relative_time(tweet.created_at) + '<\/p>';
                                tweet_html += '</article>';

                                $(element).append(tweet_html);
                            }
                        });
                    }
                });

            },

            relative_time: function(time_value) {
                var values = time_value.split(' '),
                    parsed_date = Date.parse(time_value),
                    relative_to = (arguments.length > 1) ? arguments[1] : new Date(),
                    delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
                delta = delta + (relative_to.getTimezoneOffset() * 60);

                if (delta < 60) {
                    return 'less than a minute ago';
                } else if (delta < 120) {
                    return 'about a minute ago';
                } else if (delta < (60 * 60)) {
                    return (parseInt(delta / 60)).toString() + ' minutes ago';
                } else if (delta < (120 * 60)) {
                    return 'about an hour ago';
                } else if (delta < (24 * 60 * 60)) {
                    return 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago';
                } else if (delta < (48 * 60 * 60)) {
                    return '1 day ago';
                } else {
                    return (parseInt(delta / 86400)).toString() + ' days ago';
                }
            },

            tweet_cleanup: function(twitters) {
                var tweets = String(twitters).replace(/((https?|s?ftp|ssh)\:\/\/[^"\s\<\>]*[^.,;'">\:\s\<\>\)\]\!])/g, function(url) {
                    return '<a href="' + url + '"  target="_blank" rel="nofollow">' + url + '</a>';
                }).replace(/\B@([_a-z0-9]+)/ig, function(reply) {
                    return '<a href="http://twitter.com/' + reply.substring(1) + '" target="_blank" rel="nofollow">@' + reply.substring(1) + '</a>';
                }).replace(/\B#([_a-z0-9]+)/ig, function(reply) {
                    return '<a href="http://search.twitter.com/search?q=%23' + reply.substring(1) + '" target="_blank" rel="nofollow">#' + reply.substring(1) + '</a>';
                });
                return tweets;
            }

        },

        keyDown: function(e) {

            var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;

            if (DD.keyFn[key]) {
                DD.keyFn[key]();
            }

        },

        keyFn: {},

        newsletter: {

            init: function() {

                if (document.referrer.toLowerCase().indexOf("madmimi") != -1) {
                    var d = new Date();
                    d.setDate(d.getDate() + 365);
                    document.cookie = 'ddsubscribe=true;expires='
                                + d.toGMTString() + ';path=/;host=';
                    //$.cookie('ddsubscribe', 'true', { expiresAt: 365, path: '/', domain: 'dazeddigital.com' });
                } else {

                    if ($.cookie('ddsubscribe') === null) {
                        if ($.cookie('ddsession') === null) {
                            var startDate = new Date(),
                                cookieValue = startDate + "|1";

                            document.cookie = 'ddsession=' + cookieValue + ';path=/;';
                            //$.cookie('ddsession', cookieValue, { path: '/', domain: 'dazeddigital.com' });
                            setTimeout(DD.newsletter.setPopup, 180000);
                        }
                        else {
                            var cookieParts = $.cookie('ddsession').split('|'),
                                pageCount = (parseInt(cookieParts[1]) + 1),
                                cookieValue = cookieParts[0] + "|" + pageCount;

                            document.cookie = 'ddsession=' + cookieValue + ';path=/;';
                            //$.cookie('ddsession', cookieValue, { path: '/', domain: 'dazeddigital.com' });

                            var startDate = new Date(decodeURIComponent(cookieParts[0]));
                            var presentDate = new Date;

                            var sessionTimeSpan = (presentDate.getTime() - startDate.getTime()) / 1000;

                            if (pageCount > 3 || sessionTimeSpan > 180) {
                                DD.newsletter.setPopup();
                            }
                            else if (sessionTimeSpan < 180) {
                                setTimeout(DD.newsletter.setPopup, 180000 - (sessionTimeSpan * 1000));
                            }
                        }
                    }
                }

            },

            popup: function(popupAction) {

                popupAction = popupAction || 'popup';
                switch (popupAction) {

                    case 'popup':

                        ($browser.transitions) ? $('#newsletter-slideup').addClass('open') : $('#newsletter-slideup').animate({ bottom: '0px' }, 700, 'swing', function() { $(this).addClass('open'); });

                        $('#newsletter-slideup-close').click(function(e) {

                            e.preventDefault();
                            DD.newsletter.popup('hide');

                        });

                        setTimeout("DD.newsletter.popup('hide')", 30000); // timeout to auto-hide if they don't use this in 30 seconds. should also have some other conditional things

                        break;

                    case 'hide':

                        ($browser.transitions) ? $('#newsletter-slideup').removeClass('open') : $('#newsletter-slideup').animate({ bottom: '-216px' }, 700, 'swing', function() { $(this).removeClass('open'); });

                        break;

                }

            },

            setPopup: function() {

                var d = new Date();
                d.setDate(d.getDate() + 21);
                document.cookie = 'ddsubscribe=false;expires=' + d.toGMTString() + ';path=/;';
                DD.newsletter.popup('popup');

            }

        },

        polyfill: {

            thumbhovering: function() {

                $('#thumbnails').find('a').hover(function() {
                    $(this).animate({ opacity: 0.5 }, 100);
                }, function() {
                    $(this).animate({ opacity: 1 }, 100);
                });

            },

            placeholder: function(self) {

                var $self = $(self);
                if ($self.val() === '' && $self.attr('placeholder') !== '') {
                    $self.val($self.attr('placeholder'));
                    $self.focus(function() {
                        if ($self.val() === $self.attr('placeholder')) {
                            $self.val('');
                        }
                    });
                    $self.blur(function() {
                        if ($self.val() === '') {
                            $self.val($self.attr('placeholder'));
                        }
                    });
                }

            },

            scroll: function() {

                var scrollDistance = $(window).scrollTop(),
                    header = $selectors.header,
                    headerHeight = $selectors.headerHeight,
                    expandBar = $selectors.expandBar,
                    searchTerms = $('#searchterms'),
                    isExpanded = $selectors.header.hasClass('navfixed');

                if (headerHeight < scrollDistance) {
                    expandBar.fadeIn(400);
                }

                if (headerHeight > scrollDistance) {
                    expandBar.fadeOut(400);
                }

                if (isExpanded) {
                    header
                        .removeClass('navfixed')
                        .fadeOut(300, function() {
                            $(this).show();
                        });
                }

                if (!!searchTerms.length) {
                    var searchTop = searchTerms.offset().top - parseFloat(searchTerms.css('marginTop').replace(/auto/, 0));
                    (scrollDistance >= searchtop) ? searchTerms.addClass('fixed') : searchTerms.removeClass('fixed');
                }

            }
        },

        scroll: function() {

            var scrollDistance = $(window).scrollTop(),
                isExpanded = $selectors.body.hasClass('navfixed')
            isScrolling = $selectors.body.hasClass('scrolling'),
                headerHeight = $selectors.headerHeight,
                header = $selectors.header,
                expandBar = $selectors.expandBar;

            if (headerHeight < scrollDistance) {
                $selectors.body.addClass('scrolling');
            }

            if (headerHeight > scrollDistance) {
                $selectors.body.removeClass('scrolling');
            }

            if (isExpanded) {
                $selectors.body.removeClass('navfixed');
            }

        },

        state: {

            bodyID: document.body.id

        },

        video: {

            setup: function() {
                if (typeof (_gat) == 'undefined') {
                    window.setTimeout(DD.video.setup, 100);
                } else {
                    _vidgaq = _gat._getTracker('UA-753100-14');
                    DD.video.start();
                }
            },

            start: function() {
                if (typeof (videoStart) !== 'undefined') {
                    for (var i = 0; i < videoStart.length; i++) {
                        videoStart[i]();
                    }
                }
            },

            slideChange: function(isNext, i, slideElement) {

                var theSlide = DD.video.slideCleanup(isNext, i),
                    thisSlide = theSlide.thisSlide,
                    toLoad = theSlide.toLoad;

                if (!$selectors.slide[thisSlide].innerHTML) {
                    DD.video.slideLoad(thisSlide, toLoad);
                };

                _gaq.push(['_trackPageview', newHref]);

                $('#current-slide').html(i + 1);

                if ($browser.history) {
                    var thisPath = window.location.pathname,
                        pathSplit = thisPath.split('/'),
                        isSlash = (thisPath.substr(thisPath.length - 1, thisPath.length) == '/'),
                        thisLength = (isSlash) ? pathSplit.length - 2 : pathSplit.length - 1,
                        thisIteration = (isSlash) ? pathSplit.length - 3 : pathSplit.length - 2,
                        newHref = '';

                    for (var a = 0; a <= thisIteration; a++) {
                        if (!!pathSplit[a]) {
                            newHref += '/' + pathSplit[a];
                        }
                    }

                    if (!thisIteration) {
                        newHref = '/video';
                    }

                    newHref += '/' + (i + 1) + '/';

                    history.replaceState(null, '', newHref);
                }

            },

            slideCleanup: function(isNext, i) {

                var theSlide = {};
                if (!!isNext) {
                    theSlide = {
                        thisSlide: (i >= $selectors.slide.length - 1) ? 0 : i + 1,
                        toLoad: (i < $selectors.slide.length - 1) ? i + 2 : i + 2 - $selectors.slide.length
                    }
                } else {
                    theSlide = {
                        thisSlide: (i > 0) ? i - 1 : i - 1 + $selectors.slide.length,
                        toLoad: (!!i) ? i : i + $selectors.slide.length
                    }
                }
                return theSlide;

            },

            slideLoad: function(thisSlide, toLoad) {

                $selectors.slide.eq(thisSlide).load('/video/' + toLoad + ' #slides .slide ul.videos');

            }

        }

    };

$(document).ready(function() {

    $.ajaxSetup({ cache: true });


    /* Store selectors into global object
    -------------------------------------------------------------- */

    $selectors = {
        body: $('body'),
        header: $('#header'),
        expand: $('#expand'),
        mainNav: $('#main-nav'),
        featuredContent: $("#featured-content"),
        mainGallery: $('#main-gallery'),
        articleGrid: $('#article-grid')
    };
    
    $selectors.mainNavA = $selectors.mainNav.find('a');


    /* Determine browser's CSS3 Transitions capability
    -------------------------------------------------------------- */

    $browser = {
        transitions: Modernizr.csstransitions,
        placeholder: Modernizr.input.placeholder,
        history: Modernizr.history
    };
    
    
    /* Popup conditional
    -------------------------------------------------------------- */
    
    DD.newsletter.init();
    

    /* Initialize behavior for body ID
    -------------------------------------------------------------- */
    
    if (DD._init[DD.state.bodyID]!==undefined) {
        DD._init[DD.state.bodyID]();
    }
    
    
    /* Dazed to your inbox
    -------------------------------------------------------------- */

    $('#newsletter-direct-header').click(function(e) {
        e.preventDefault();
        DD.newsletter.popup('popup');
    });


    /* Apply active class to nav
    -------------------------------------------------------------- */

    var browserURL = window.location.pathname,
        pathArray = String(browserURL).split('/'),
        cat = pathArray[1],
        siteArr = [];
    
    for (var i = 0;i<$selectors.mainNavA.length;i++) {
        var navPath = $selectors.mainNavA[i].pathname.replace('/','');
        siteArr.push(navPath);        
    };
    
    switch (cat) {
        case 'search':
            $('#search').find('label').addClass('activesearch');
        break;
        
        case '#':
        case 'default.aspx':
        case 'page':
            $selectors.mainNavA.eq(0).parents('li').addClass('current');
        break;
        
        case 'fashionweek':
        case 'fashionweeks':
            $selectors.mainNavA.eq(4).parents('li').addClass('current');
        break;
        case 'competitions':
            $selectors.mainNavA.eq(5).parents('li').addClass('current');
        break;
        default:
            var navPosition = $.inArray(cat,siteArr);
            $selectors.mainNavA.eq(navPosition).parents('li').addClass('current');
        break;
        
    }
    

    /* Newsletter form
    -------------------------------------------------------------- */

    // create function
    // REFACTOR: Set up a better selector for this
    $('input[type=image],#newsletter-slideup-submit').live('click', function() {

        var popUpObj = $(this).attr('id'),
            email = $(this).siblings('[name$=email]').val(),
            popUpMethod = (popUpObj == 'newsletter-slideup-submit') ? 'Popup' : (popUpObj == '') ? 'Footer' : 'Grid';

        $.ajax({
            type: "POST",
            data: "{'email':'" + email + "','addMethod':'"+popUpMethod+"'}",
            url: "/webservices/subscribe.asmx/Subscribe",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(response) {
                $('[name$=email]').val(response.d);
                setTimeout("DD.newsletter.popup('hide')", 700);
                var d = new Date();
                d.setDate(d.getDate() + 365);
                document.cookie = 'ddsubscribe=true;expires=' + d.toGMTString() + ';path=/;';

                // Event tracking for Subscibing
                _gaq.push(['_trackEvent', 'Subscribe', popUpMethod]);

            },
            failure: function(msg) {
                $('[name$=email]').val(msg.d);
            }
        });
    });
    
    /* Featured content tabs
    -------------------------------------------------------------- */

    $selectors.featuredContent.tabs({
        cookie: {
            expires: 30
        },
        selected: 0,
        select: function(event, ui) {
            var thisTab = $(ui.tab).attr('href').replace('#tab-', '');
            _gaq.push(['_trackEvent', 'Header Tabs', 'Select', thisTab]);
        }
    });


    /* Event tracking for social links in header
    -------------------------------------------------------------- */
    
    $('#header-social-twitter').add('#header-social-facebook').click(function() {
        var thisSocial = $(this).attr('id').replace('header-social-', '');
        _gaq.push(['_trackEvent', 'Header Social Links', 'Select', thisSocial]);
    });


    /* Handle input placeholder if not HTML5 compatible
    -------------------------------------------------------------- */

    if (!$browser.placeholder) {

        var inputs = $('input');
        for (var i = 0;i < inputs.length;i++) {
            DD.polyfill.placeholder(inputs[i]);
        }
    }
    
    
    /* Keyboard navigation
    -------------------------------------------------------------- */
    
    $(document).bind('keydown', DD.keyDown);
    

    /* Scroll the page up if clicked
    -------------------------------------------------------------- */

    $('#footer-top').click(function() {
        $.scrollTo('0px', 700);
    });


    /* Collapse the navigation as the page scrolls
    -------------------------------------------------------------- */

    $.extend($selectors,{
        headerHeight: $selectors.header.height(),
        expandBar: $('#expand'),
        showNavigation: $('#show-navigation')
    });
    
    var scrollMethod = ($browser.transitions) ? DD.scroll : DD.polyfill.scroll;
    
    // bind window to scroll behavior    
    $(window).bind('scroll', $.throttle(150,scrollMethod));

    // hover on expand bar
    $selectors.expandBar.hover(function(e) {
        e.preventDefault();
        
        ($browser.transitions) ?
            $selectors.body.addClass('navfixed') :
            $selectors.header.fadeIn(400,
                function() {
                    $selectors.expandBar.fadeOut(400);
                    $selectors.header.addClass('navfixed');
                });
    });

    $selectors.showNavigation.click(function(e) {
        e.preventDefault();
    });


    /* Toggle the mailing list form in the footer
    -------------------------------------------------------------- */

    $.extend($selectors,{
        footerSocialLinks: $('#social-links'),
        newsletterToggleLink: $('#footer-newsletter')
    });
    
    $selectors.newsletterToggleLink.click(function(e) {
        e.preventDefault();
        DD.newsletter.popup('popup');
    });


    /* Search text
    -------------------------------------------------------------- */

    // REFACTOR: keydown
    $('#searchnav').add('#searcherror').keypress(function(e) {
        if (e.which == 13) {
            var searchtext = $(this).val(),
                searchtextslug = searchtext.toLowerCase().replace(/ /g, '-').replace(/[^\w-]+/g, '');
            window.location = '/search/' + searchtextslug;
        }
    });

});


/*
 * jQuery throttle / debounce - v1.1 - 3/7/2010
 * http://benalman.com/projects/jquery-throttle-debounce-plugin/
 * 
 * Copyright (c) 2010 "Cowboy" Ben Alman
 * Dual licensed under the MIT and GPL licenses.
 * http://benalman.com/about/license/
 */
(function(b,c){var $=b.jQuery||b.Cowboy||(b.Cowboy={}),a;$.throttle=a=function(e,f,j,i){var h,d=0;if(typeof f!=="boolean"){i=j;j=f;f=c}function g(){var o=this,m=+new Date()-d,n=arguments;function l(){d=+new Date();j.apply(o,n)}function k(){h=c}if(i&&!h){l()}h&&clearTimeout(h);if(i===c&&m>e){l()}else{if(f!==true){h=setTimeout(i?k:l,i===c?e-m:e)}}}if($.guid){g.guid=j.guid=j.guid||$.guid++}return g};$.debounce=function(d,e,f){return f===c?a(d,e,false):a(d,f,e!==false)}})(this);
