"use strict";

var main_transform = 0,
    video_img_template = Handlebars.compile($('#video-img-template').html()),
    front_img_template = Handlebars.compile($('#front-img-template').html()),
    front_template = Handlebars.compile($('#front-template').html()),
    detail_template = Handlebars.compile($('#detail-template').html()),
    news_template = Handlebars.compile($('#news-template').html()),
    about_image_template = Handlebars.compile(
        $('#about-image-template').html()),
    vimeo_options = {
        api: true,
        byline: false,
        title: false,
        color: 'ffffff',
        portrait: false,
        width: 640,
        height: 360
    },
    front_playing = false,
    front_loaded = false,
    small_loader = $('#small-loader'),
    converter = new Showdown.converter(),
    scroll_size = 80;


function get_video_details(video_id, callback) {
    var api_url = 'http://vimeo.com/api/v2/video/' + video_id + '.json';
    $.ajax({
        url: api_url,
        dataType: 'jsonp',
        success: function(data, textstatus, xhrobj) {
            callback(data[0]);
        }});
}

function parse_content(content, skip_subgroups) {
    var result = [];
    _.each(content.split('###'), function(section, index) {
        if (!skip_subgroups) {
            var subgroup = [];
            _.each(section.split('\n'), function(row, index) {
                row = $.trim(row);
                if (!row) {
                    return;
                }
                subgroup.push(row);
            });
            result.push(subgroup);
        } else {
            result.push(section);
        }
    });
    if (result.length == 1) {
        return result[0];
    }
    return result;
}

function transform(elem, dir) {
    var xtrans;
    if (dir == 'left') {
        main_transform += 100;
    } else {
        main_transform -= 100;
    }
    // -100% is the original left
    xtrans = (-100 + main_transform) + '%';
    var xtrans_logo = -main_transform + '%';
    var animation = 'easeInOutQuad';
    $('#main').animate({left: xtrans}, 800, animation, show_nav);
    $('#twisted-bg').animate({'background-position-x': xtrans_logo}, 800,
                             animation, show_nav);
}

function hide_nav() {
    $('.prev, .next').hide();
}

function show_nav() {
    $('.prev, .next').fadeIn('fast');
}

function opts(options) {
    return $.extend({}, vimeo_options, options);
}

function load_featured_video(data) {
    $(function() {
        front_playing = false;

        var video = $('#frontpage .black .video')
            .html(data.html);
        $('#frontpage .white .details').html(front_template(data));
        var iframe = video.find('iframe');
        iframe.attr('id', 'frontplayer');

        iframe.load(function() {
            var front_player = Froogaloop(this);
            front_player.addEvent('ready', function() {
                video.siblings('.loader').hide();
                front_loaded = true;
                front_player.addEvent('play', function() {
                    front_playing = true;
                });
                front_player.addEvent('pause', function() {
                    front_playing = false;
                });
                front_player.addEvent('finish', function() {
                    front_playing = false;
                });
            });
            $(window).trigger('video-loaded');
            video.css({visibility: 'visible'});
        });
    });
}

function load_about() {
    var container = $('#about .white ul');
    (new taiste.DataFlow())
        .ajax({url: 'about.txt'})
    .map(function() {
        // TODO: Add image handling
        var content = parse_content(this.getData(), true);
        var images = content[0];
        var html = $(converter.makeHtml(content[1]));
        $('#about .black > div').html(html);
        return content[0].split('\n');
    })
    .flatten()
    .each(function(item) {
        item = $.trim(item);
        if (!item) { return; }

        var splitted = item.split(' ');
        var data = {
            orig: splitted[0],
            thumb: splitted[1]
        };
        container.append(about_image_template(data));
    })
    .then(function() {
        $('#about .white li a').colorbox({opacity: 0.9});
    });
}

function load_news() {
    (new taiste.DataFlow())
        .ajax({url: 'news.txt'})
    .then(function() {
        var content = parse_content(this.getData(), true);
        var data = {
            time: content[0],
            text: converter.makeHtml(content[1])
        };
        $('#newsticker').html(news_template(data));
    });
}


function load_contacts() {
    (new taiste.DataFlow())
        .ajax({url: 'contacts.txt'})
        .map(function(data) {
            var content = parse_content(this.getData(), true);
            var html = converter.makeHtml(content[0]);
            $('#contacts .twisted').html(html);
            return $.makeArray($(converter.makeHtml(content[1])).filter('p'));
        })
        .flatten()
        .each(function() {
            var div = $('<div class="body">');
            var contacts = $('#contacts .wrapper');
            return function(item, index) {
                div.append(item);
                if (index % 3 === 0) {
                    contacts.append(div);
                } else if (index % 3 == 2) {
                    div = $('<div class="body">');
                }
            };
        }());
}

function overlay_with_loader(thumbnail) {
    small_loader.appendTo(thumbnail);
    small_loader.css({left: 0, top: 0});
    $(window).one('video-loaded', function(e) {
        small_loader.css({left: '-9999px'});
    });
}

function load_featured() {
    var df = new taiste.DataFlow();
    df.ajax({url: 'featured-video.txt'})
        .map(function(data) {
            return parse_content(this.getData());
        })
        .first()
        .asyncMapEach(function(line, index) {
            var item = line.split(' ', 1)[0];
            var self = this;
            var deferred = $.ajax({
                url: 'http://vimeo.com/api/oembed.json',
                data: opts({url: item, player_id: 'frontplayer'}),
                dataType: 'jsonp'});
            deferred.done(function(data) {
                self.data = data;
                self.data.description =
                    self.data.description.replace(/(\n+)/g, '<br>');
                load_featured_video(self.data);
                self.next();
            });
        });
}

function load_videos() {
    var df = new taiste.DataFlow();
    df.ajax({url: 'all-videos.txt'})
        .map(function(data) {
            return parse_content(this.getData());
        })
        .asyncMapEach(function(line, index) {
            var url = line.split(' ', 1)[0];
            var self = this;
            $.ajax({url: 'http://vimeo.com/api/oembed.json',
                    data: opts({url: url, player_id: 'all-player-' + index}),
                    dataType: 'jsonp'
                   })
                .done(function(data) {
                    get_video_details(data.video_id, function(details) {
                        self.data = $.extend({
                            player_id: 'all-player-'+index
                        }, data, details);
                        self.next();
                    });
                });
        })
        .flatten()
        .each(function() {
            var div = $('<div>'),
            container = $('#all-films .black > .videos');

            return function(item, index, array) {
                $(video_img_template(item)).click(function() {
                    overlay_with_loader($(this));
                    var player = $('#player'),
                        overlay = $('#video-overlay');
                    player.html(item.html);
                    player.find('iframe')
                        .attr('id', item.player_id)
                        .load(function() {
                            var overlay_player = Froogaloop(item.player_id);
                            player.append(detail_template(item));
                            player.find('#player-prev-video')
                                .click(function() {
                                    container.find('a').eq(index - 1).click();
                                });
                            player.find('#player-next-video').click(function() {
                                var next = array.length == index + 1? 0: index + 1;
                                container.find('a').eq(next).click();
                            });
                            player.css({visibility: 'visible', left: '-9999px'});
                            var ready = function() {
                                player.css({left: '50%'});
                                overlay.fadeIn('fast', function() {
                                    _.delay(function() {
                                        player.css({visibility: 'visible'});
                                        $(window).trigger('video-loaded');
                                    }, 300);
                                });
                            };
                            overlay_player.addEvent('ready', ready);
                        });
                    })
                    .appendTo(div);

                if (index % 5 === 0) {
                    container.append(div);
                } else if (index % 5 == 4) {
                    div = $('<div>');
                }
            };
        }())
            .then(function() { $('#all-films .videos').scroll(); });
}

$('#contact-link').click(function() {
    var contacts = $('#contacts').show();
    if (Modernizr.csstransitions) {
        contacts.css({height: 400});
    } else {
        contacts.animate({height: 400});
    }
    $('#overlay').fadeIn();
    return false;
});

$('#contacts > a.close').click(function() {
    var contacts = $('#contacts');
    if (Modernizr.csstransitions) {
        contacts.css({height: 0});
    } else {
        contacts.animate({height: 0}, function() { $(this).hide();});
    }
    $('#overlay').fadeOut();
    return false;
});

$('.prev').click(function() {
    if ($(this).parents('#frontpage').length == 1) {
        $('#newsticker').fadeOut('fast');
    } else {
        $('#newsticker').fadeIn('fast');
    }
    _gaq.push(['_trackEvent', 'Navigation', $(this).find('a').attr('href').slice(1)]);
    hide_nav();
    transform($('#main'), 'left');
});
$('.next').click(function() {
    if ($(this).parents('#frontpage').length == 1) {
        $('#newsticker').fadeOut('fast');
    } else {
        $('#newsticker').fadeIn('fast');
    }
    _gaq.push(['_trackEvent', 'Navigation', $(this).find('a').attr('href').slice(1)]);
    hide_nav();
    transform($('#main'), 'right');
});


$(function() {
    var div = $('#frontpage .black > .video');

    $('#main')
        .bind('webkitTransitionEnd', show_nav)
        .bind('transitionend', show_nav);
    $('#close').live('click', function() {
        $('#player').empty().css({visibility: 'hidden'});
        $('#video-overlay').fadeOut('fast');
        return false;
    });

    var hide = false;
    $('#frontpage .black .overlay')
        .mouseover(function() {
            hide = false;
            if (front_loaded) {
                $('#frontpage .wrap').stop(true, true).fadeOut();
            }
        })
        .mouseout(function() {
            hide = true;
            _.defer(function() {
                if(hide) {
                    $('#frontpage .wrap').stop(true, true).fadeIn();
                }
            });
        });
    $('#frontpage .black .video')
        .mouseover(function() {
            hide = false;
        })
        .mouseout(function() {
            if (!front_playing) {
                $('#frontpage .wrap').stop(true, true).fadeIn();
            }
        });

    $(document).keyup(function(e) {
        if (e.which == 27) {
            $('#video-overlay').click();
            $('#contacts > a.close').click();
        }
    });
    var videos_container = $('#all-films .videos');
    videos_container.scroll();

    $('.arrowdown').click(function() {
        videos_container.scrollTop(videos_container.scrollTop() + scroll_size);
    });
    $('.arrowup').click(function() {
        videos_container.scrollTop(videos_container.scrollTop() - scroll_size);
    });

});

$('#all-films .videos').scroll(function() {
    var scrollbar = $('#all-films .scrollbar'),
        bar = $('#all-films .bar'),
        content_height = _.reduce($(this).find('div'), function(memo, item) {
            return memo + $(item).height(); }, 0),
        scrollbar_height = $('.scrollbar').height(),
        scroll_top = $(this).scrollTop(),
        scroll_coeff = scrollbar_height / content_height,
        height = scrollbar_height * scroll_coeff,
        top = scroll_top * scroll_coeff;


    scrollbar.toggle(scroll_coeff < 1);
    bar.css({top: top, height: height});
});

load_contacts();
load_featured();
load_videos();
load_news();
load_about();

