$(document).ready(function() {
    //Centered Modals:
    /*
    GumGum.$modalBackground = $('<div id="modalBackground" style="display: none;"></div>');
    GumGum.$modalBackground.prependTo($('body').get(0));

    $('.centeredModal').click(function() {
        $(this).hide();
        GumGum.$modalBackground.hide();
    }).prepend('<div class="close"></div>');

    var centerCenteredModals = function() {
        $('.centeredModal').each(function() {
            var $this = $(this);
            $this.css('left', ($(window).width() - $this.outerWidth()) / 2);
            $this.css('top', Math.max(($(window).height() - $this.outerHeight()) / 2,0));
        });
    };
    centerCenteredModals();

    $(window).resize(function() {
        centerCenteredModals();
    });
    */

    // Flashing errors
    if ($('#flash_errors').length > 0) {
        setTimeout(function() {
            $('#flash_errors').click(function() { $(this).slideUp('slow'); }).slideDown();
        }, 500);
    }

    // Form fields
    $('input[defvalue]').each(function(i, n) {
        var lbl, tz = $(this), type = this.type;
        if (type == 'text') {
            tz.bind('blur',function() {
                if (this.value.replace(/\s/g, '') == '') this.value = tz.attr('defvalue');
            }).bind('focus',function() {
                if (this.value == tz.attr('defvalue')) this.value = '';
            }).blur();
        } else if (type == 'password') {
            lbl = $('<span class="defvalue-password" />').text(tz.attr('defvalue')).insertAfter(tz).hide();
            lbl.bind('click', function(){ return tz.focus(); });
            tz.data('label', lbl).bind('blur', function() {
                if (this.value.replace(/\s/g, '') == '') tz.data('label').show();
            }).bind('focus',function() {
                tz.data('label').hide();
            }).blur();
        }
    });

    // Pretty form fields
    var clearPF = function() {
        var thiz = this,
            val = ($(thiz).val().match(/[^\s]+/i) || [false])[0];
        setTimeout(function() {
            $(thiz).css({ backgroundColor: (!val ? 'transparent': '#fff') }).prev('label').css({ visibility: (!val ? 'visible': 'hidden') });
        }, 150);
    };
    $(':input.pf').change(clearPF).blur(clearPF).each(clearPF).focus(function() {
        $(this).prev('label').css({ visibility: 'hidden' });
        $(this).css({ backgroundColor: '#fff' });
    });

    if ('\v' == 'v') {
        $('label.pf').click(function() { $(this).next(':input')[0].focus(); });
    }

    // Extra tooltip
    if ($('.tooltip').length > 0) {
        var tooltipEl = document.createElement('div');
        $(tooltipEl).css({
            position: 'absolute',
            padding: '3px',
            backgroundColor: '#EDE3C5',
            border: '1px solid #E7B713',
            display: 'none'
        }).appendTo(document.body);
        $('.tooltip').bind('hover', function(e) {
            if (e.type == 'mouseover' || e.type == 'mouseenter') {
                tooltipEl.style.left = (e.pageX + 20) + 'px';
                tooltipEl.style.top = (e.pageY - 10) + 'px';
                tooltipEl.innerHTML = '<strong>' + (this.title) + '</strong>';
                tooltipEl.style.display = 'block';
            } else {
                tooltipEl.style.display = 'none';
            }
        });
    }
});

function modal(mode, img) {
    var to;
    var de = document.documentElement;
    var overflow = {
        document: de.style.overflow,
        body: document.body.style.overflow
    };
    var modal = $('<div style="margin:0;padding:0;position:absolute;right:0;z-index:110;background:transparent">' + '<iframe allowTransparency="allowTransparency" ' + 'width="100%" ' + 'height="100%" ' + 'src="http://demo.gumgum.com/campaigns/gumgum/' + mode + '.html?_' + ( + new Date) + '&au=' + escape(img.src) + '&kw=' + escape(img.alt) + '"/>' + '</div>');
    var close = $('<img style="cursor:pointer;position:absolute;top:10px;right:30px;color:#fff;text-decoration:underline;" ' + 'src="http://ads.gumgum.com/com/gumgum/close.png" ' + '/>').appendTo(modal);

    var position = function() {
        modal.css({
            top: Math.max(de.scrollTop, document.body.scrollTop, window.scrollY || 0) + 'px',
            width: Math.min(window.innerWidth || 99999, de.clientWidth || 99999) + 'px',
            height: Math.min(window.innerHeight || 99999, de.clientHeight || 99999) + 'px'
        });
        to = setTimeout(position, 1000);
    };
    close.bind('click', function(e) {
        clearTimeout(to);
        modal.remove();
        document.body.style.overflow = overflow.body;
        if (!+"\v1") {
            de.style.overflow = overflow.document;
        }
    });
    document.body.style.overflow = 'hidden';
    if (!+"\v1") {
        de.style.overflow = 'hidden';
    }
    position();
    modal.appendTo(document.body);
    return false;
}

GumGum = {};
GumGum.reverse = function(s) {
    return s.toString().split("").reverse().join('');
};
GumGum.comma = function(n) {
    return GumGum.reverse(GumGum.reverse(parseFloat(n)).replace(/([0-9]{3})/g, '$1,')).replace(/^,/g, '');
};
GumGum.selectText = function() {
    if ($.browser.msie) {
        var range = document.body.createTextRange();
        range.moveToElementText(this);
        range.select();
    } else {
        var selection = window.getSelection();
        var range = document.createRange();
        range.selectNodeContents(this);
        selection.removeAllRanges();
        selection.addRange(range);
    }

    return true;
};

GumGum.Homepage = function() {
    var slides = $('#slide').children('div').hide();
    var links = $('li a', '#promoSel');
    var currentLink = 0;
    $(links.get(currentLink)).addClass('selected');
    var currentSlide = $(slides.get(0)).show();
    var adAutomationTimer;
    var clickInProcess = false;
    var firstImagePosition;
    var firstImageHeight;

    //Keep the ads positioned properly in case the user resizes the browser:
    var ensureAdPosition = function() {
        var image = $('img', $('#slide').children('div').get(currentLink));
        imagePosition = image.position();
        imageHeight = image.innerHeight();

        $('#ads').children().each(function() {
            $(this).css({
                'left': imagePosition['left'],
                'top': imagePosition['top'] + imageHeight - $(this).outerHeight()
                });
        });

        setTimeout(function() {
            ensureAdPosition();
        }, 250);
    };

    //Position the ads 1 second after the page has loaded... we assume that by that time all images have been loaded already:
    setTimeout(function() {
        var image = $('img', $('#slide').children('div').get(currentLink));
        imagePosition = image.position();
        imageHeight = image.innerHeight();

        $('#ads').detach().appendTo('body');
        $('#ads').children().each(function() {
            $(this).css({
                'left': imagePosition['left'],
                'top': imagePosition['top'] + imageHeight - $(this).outerHeight()
                });
        });

        $($('#ads').children().get(currentLink)).fadeIn();

        ensureAdPosition();
    }, 1000);

    //Close the ads when the user clicks the "X":
    $('#ads').children().each(function() {
        var self = this;
        $('.close', this).css('cursor', 'pointer').click(function() {
            $(self).fadeOut();
        });
    });

    //Setup onClick events for the links
    var onClickFunction = function(index) {
        if (index == currentLink) {
            //User clicked the already selected link --> Abort !
            return;
        }

        if (clickInProcess) {
            //Click already being processed, check again in a bit...
            var self = this;
            setTimeout(function() {
                onClickFunction.call(self, index);
            }, 10);
            return;
        }

        clickInProcess = true;

        clearTimeout(adAutomationTimer);
        var oldSlide = currentSlide;
        var oldLink = currentLink;
        currentSlide = $(slides.get(index));
        currentLink = index;

        oldSlide.fadeOut(200, function() {
            $(slides.get(index)).fadeIn(400);
            $($('#ads').children().get(currentLink)).fadeIn(400);

            clearTimeout(adAutomationTimer);
            adAutomationTimer = setTimeout(function() {
                adAutomation();
            }, 8000);

            clickInProcess = false;
        });

        $(links.get(oldLink)).removeClass('selected');
        $($('#ads').children().get(oldLink)).fadeOut(200);

        $(links.get(currentLink)).addClass('selected');
    };

    links.each(function(index) {
        $(this).click(function() {
            onClickFunction.call(this, index);
        });
    });

    //Automate ad rotation
    var adAutomation = function() {
        if (currentLink == 3) {
            $(links.get(0)).click();
        } else {
            $(links.get(currentLink + 1)).click();
        }

        clearTimeout(adAutomationTimer);
        adAutomationTimer = setTimeout(function() {
            adAutomation();
        }, 8000);
    };

    adAutomationTimer = setTimeout(function() {
        adAutomation();
    }, 8000);

    //Stop ad automation when mouse is hovering over image:
    slides.hover(function() {
        clearTimeout(adAutomationTimer);
    }, 
    //over
    function() {
        adAutomationTimer = setTimeout(function() {
            adAutomation();
        }, 8000);
    }
    //out
    );

    //Setup Carousel Items:
    var carouselItems = [];
    $('#partnersData li').each(function() {
        carouselItems[carouselItems.length] = $(this).html();
    });

    //Carousel - for more info see: http://RanZafrir.com
    $('#partners').carousel({
        assumedItemsPerPage: 6,
        loopAround: true,
        alignItemsToPage: true,
        lastItemAtEndOfPage: true,
        centerItems: false,
        sortItems: false,
        items: carouselItems
    });

    //Automate carousel:
    var automateCarousel = function() {
        $('#partners').carousel('nextPage');

        setTimeout(function() {
            automateCarousel()
            }, 5000);
    };
    automateCarousel();
};

GumGum.Reporting = function() {
    var colors = {}, widgets = {},
        loading = $('#loading').hide(),
        urls = {
            chart: '/reports/chart',
            table: '/reports/table'
        },
        init,chartZoom,renderQM;
    renderQM = (function(e) {
        $('.google-visualization-table-th').each(function(i, n) {
            var qm = $('<a />').addClass('QuestionMark').attr('target', 'gs');
            switch ($(n).text().replace(/\W/g, '')) {
                case 'PageViews':
                    qm.attr('href', '/frequently-asked-questions#why-doesnt-gumgums-page-view-count-match-what-i-am-seeing-in-my-google-analytics-or-other-analytics-reporting').attr('title', 'What\'s this?').appendTo(n);
                break;
            }
        });
        var totals = widgets.table.table().totals;
        var totalsRow = '<tr class="google-visualization-table-tr-odd table-totals">' + '<td class="google-visualization-table-td">Totals</td>' + '<td class="google-visualization-table-td google-visualization-table-td-number">' + GumGum.comma(totals.views) + '</td>' + '<td class="google-visualization-table-td google-visualization-table-td-number">$' + totals.cpm.toFixed(2) + '</td>' + '<td class="google-visualization-table-td google-visualization-table-td-number">$' + totals.earnings.toFixed(2) + '</td>' + '</tr>';
        $(totalsRow).insertAfter('.google-visualization-table-tr-head');
    });
    chartZoom = (function(chart) {
        var dr = chart.getVisibleChartRange(),
            pr = $.extend({
                start: $('#startDate').val(),
                end: $('#endDate').val(),
                tracking: $('#tracking').val(),
                viewmode: $('#viewmode').val()
            }, this.getAutoFilters()),
            url = urls.table + GGUI.urlParams(pr);
        loading.show();
        $.getJSON(url, function(json) {
            widgets.table.setCols(json.cols).render(json.rows, false, json.opts);
            loading.hide();
        });
    });
    renderTable = (function() {
        var url = urls.table + GGUI.urlParams({
                start: $('#startDate').val(),
                end: $('#endDate').val(),
                tracking: $('#tracking').val(),
                viewmode: $('#viewmode').val()
            });
        loading.show();
    });
    init = (function() {
        var ii;
        var col = [];
        var datepickers;
        var url;
        var me = this;
        try {
            loading.show();
            url = urls.table + GGUI.urlParams(GGUI.inputsJSON($('input,select', '.GraphToolbar')));
            widgets.chart = new GGUI.sChart('report', urls.chart).update();
            widgets.table = GGUI.gTable('report_table').load(url);
            google.visualization.events.addListener(widgets.table.table(), 'ready', renderQM);
            google.visualization.events.addListener(widgets.table.table(), 'sort', renderQM);
            google.visualization.events.addListener(widgets.table.table(), 'page', renderQM);
            $('.GraphToolbarButton').bind('click', function() {
                var url = urls.table + GGUI.urlParams(GGUI.inputsJSON($('input,select', '.GraphToolbar')));
                switch (true) {
                    case /GraphExport/.test(this.className) :
                        window.location.href = '/reports/more' + GGUI.urlParams(GGUI.inputsJSON($('input,select', '.MoreReports')));
                    break;
                    case /GraphToolbarExport/.test(this.className) :
                        window.location.href = url + '/format/get.xls';
                    break;
                    default:
                        widgets.table.load(url);
                        widgets.chart.update();
                    break;
                }
                return false;
            });
            datepickers = $(':input.datepicker').datepicker({
                dateFormat: 'yy-mm-dd',
                showOn: 'both',
                showAnim: 'slideDown',
                buttonImage: '/images/icon_calendar.gif'
            });
        } catch(e) {
            console.log(e);
        }
    });
    google.load('visualization', '1', {'packages': ['annotatedtimeline', 'table']});
    google.setOnLoadCallback(init);
};

GumGum.Management = function() {
    $('.management').addClass('hovered');
    $('.tid_box code').bind('click', GumGum.selectText);
};

GumGum.GetCode = function() {
    $('.tid_box code').bind('click', GumGum.selectText);
};

GumGum.FAQ = function() {
    var gotoFaq = (function() {
        var t = $(this).val(),
            q = $('a[name="' + t.replace('#', '') + '"]');
        $('.faq-question a').css({ color: '#000' });
        if (q) {
            q.css({ color: '#7A2B36' });
            $(document.body).animate({ scrollTop: Math.max(q.offset().top - 100, 0) }, 'slow');
        }
    });
    if (top.location.hash) {
        $('a[name="' + top.location.hash.replace('#', '') + '"]').css({
            color: '#7A2B36'
        });
    }

    $('#faq-dropdown').bind('change', gotoFaq);
};

GumGum.AdvertiserReporting = function() {
    var widgets = {},
        loading = $('#loading').hide(),
        criteria = {startDate:null, endDate: null, campaignId: null},
        chartZoom = (function(chart) {
            var url = $('#campaigns_plot').val() + '/campaignId/' + $('#campaigns_campaignId').val();
            widgets.chart = new GGUI.sChart('campaigns', '/advertisers/chart/' + url).update();
            loading.show();
            // Only update table if start, end or campaign changed
            if($('#startDate').val() != criteria.startDate || $('#endDate').val() != criteria.endDate ||  $('#campaigns_campaignId').val() != criteria.campaignId) {
                url = url + '/start/' + $('#startDate').val() + '/end/' +  $('#endDate').val();
                widgets.table = GGUI.gTable('campaigns_table', 'campaigns_table_loading').load('/advertisers/table/campaigns/' + url);
            }        
            criteria.startDate  = $('#startDate').val();
            criteria.endDate    = $('#endDate').val();
            criteria.campaignId = $('#campaigns_campaignId').val();
        }),
        init = (function() {
            var ii;
            var col = [];
            var datepickers;
            var url;
            var me = this;
            try {
                loading.show();
                chartZoom();
                datepickers = $(':input.datepicker').datepicker({
                    dateFormat: 'yy-mm-dd',
                    showOn: 'both',
                    showAnim: 'slideDown',
                    buttonImage: '/images/calendar.png'
                });
                $('#campaigns_button').click(function() { chartZoom(); return false; });
            } catch(e) {
                console.log(e);
            }
        });
    google.load('visualization', '1', {'packages': ['annotatedtimeline', 'table']});
    google.setOnLoadCallback(init);
};

GumGum.Advertisers = function() {
    $('.advertisers').addClass('hovered');
    $('.AdvertiserAdDemo .closeBtn').bind('click',function(){ $(this).parents('.demoAd').hide(); });
    var clickedDemo, visibleDemo, demosLinks = $('.adsel'), demoTimer, demoTO = 1000*8, // 8 seconds
        rotateAds = function() {
            var currentIx = demosLinks.index(clickedDemo),
                currentIx = currentIx >= demosLinks.length-1 ? -1 : currentIx,
                next = $(demosLinks.get(currentIx+1));
            if (visibleDemo && !visibleDemo.is(':hover')) {
                next.click();
            }
            demoTimer = setTimeout(rotateAds, demoTO);
        },
        demoClick = function() {
            $('.AdvertiserAdDemo').hide();
            if (clickedDemo) clickedDemo.removeClass('selected-ad-unit');
            clickedDemo = $(this).addClass('selected-ad-unit');
            visibleDemo = $($(this).data('target'));
            var ad = visibleDemo.find('.demoAd'),
                adHeight = ad.data('adheight'),
                adBottom = parseInt(ad.css('bottom'),10);
            if (adHeight) ad.css({ bottom:-adHeight }).animate({ bottom: adBottom });
            ad.show();
            visibleDemo.show();
            clearTimeout(demoTimer);
            demoTimer = setTimeout(rotateAds, demoTO)
            return false;
        };
    demosLinks.bind('click', demoClick);
    if (!gumgum.Container) gumgum.Container = $(document.body);
    $('a.openModal').bind('click',function(){ return gumgum.openModal(this.href); });
    $('.adsel:last').click();
};

GumGum.Implementation = function() {
    $('.implementation').addClass('hovered');
    var open = false;
    var toggleImage = function(e) {
        var t = $(this);
        var x = $(this).text(); (x == 'show me' ? t.text('hide').siblings('.Screenshot').show() : t.text('show me').siblings('.Screenshot').hide());

        return false;
    };
    var toggleDrawer = function(e) {
        var toOpen = $(this).next('.DrawerContent');
        if (open) {
            open.slideUp();
        }
        if (open[0] !== toOpen[0]) {
            open = toOpen.slideDown();
        } else {
            open = false;
        }
    };
    $('.image-toggle').bind('click', toggleImage);
    $('.DrawerTitle').bind('click', toggleDrawer);
}

GumGum.ImplementationEnd = function() {
    $('.implementation').addClass('hovered');
};

GumGum.Publishers = function() {
    $('.publishers').addClass('hovered')
        var curr;
    var arrows = $('.Arrow');
    var closeAd = function() {
        //$('.toolbar').css({bottom:0});
        $(this).parents('.ad').parent().hide();

        return false;
    };
    var openAd = function() {
        if (curr)
            curr.fadeOut();
        switch ($.inArray(this, arrows)) {
        case 0:
            {
                curr = $('#targeted').fadeIn();
                break;
            }
        case 1:
            { (curr = $('#brands').fadeIn()).find('.ad').css({
                    bottom: 0
                });
                break;
            }
        }

        return false;
    };
    $('.closeAd').bind('click', closeAd);
    arrows.bind('click', openAd);
    $('#bmw-trigger').click();

    // Preview
    var preview;
    if ((preview = $('#previewImage')).length > 0) {
        var current;
        rotating = false;
        figs = preview.nextAll('figure');
        var dialogOps = {
            modal: true,
            width: 800,
            resizable: false,
            close: function() {
                if (!rotating) {
                    $(document.body).unbind('keyup');
                }
            },
            dialogClass: 'previewUI'
        };
        var rotate = function(e) {
            rotating = true;
            current.dialog('close');
            rotating = false;
            switch (true) {
                case(/previewUIPrev/.test(e.target.className)): current = current.data('prev'); break;
                case (/previewUINext/.test(e.target.className)): current = current.data('next'); break;
            }
            current.dialog(dialogOps);
            return false;
        };
        var open = function(e) {
            $(document.body).bind('keyup', function(e) {
                if (e.keyCode === 37) {
                    return current.find('a.previewUIPrev').click();
                }
                if (e.keyCode === 39) {
                    return current.find('a.previewUINext').click();
                }
            });
            current = figs.first().dialog(dialogOps);
        };
        figs.each(function(i, n) {
            $('a', n).click(rotate);
            $(n).data('prev', i == 0 ? $(figs[figs.length - 1]) : $(figs[i - 1]));
            $(n).data('next', i == figs.length - 1 ? $(figs[0]) : $(figs[i + 1]));
        });

        preview.bind('click', open);
    }
}

GumGum.BoardOfDirectors = function() {
    $('.button1','.ggPerson').bind('click', function(e){ e.preventDefault(); return true; });
    $('.centeredModal').bind('click', function(){ $(this).hide(); });
    $('.ggPerson').bind('click', function(){ $($(this).data('popid')).show(); });
}

GumGum.LeadershipTeam = function(){
    $('.button1','.ggPerson').bind('click', function(e){ e.preventDefault(); return true; });
    $('.centeredModal').bind('click', function(){ $(this).hide(); });
    $('.ggPerson').bind('click', function(){ $($(this).data('popid')).show(); });
}

GumGum.careers = function($) {
    $('.job h1').bind('click', function(){ $('section',this.parentNode).toggle('fade'); });
};

