Slurpr = function Slurpr(){

    var templateProjLnk = _.template(
        '<li class="proj_lnk"><a href="#"><%= tags %></a></li>'
    );

    var templateProject = _.template([
        '<div class="project">',
        '<h1><%= tags %>',
        '<% if(hasOwnProperty("link")){ %>',
            '[<a href="<%= link %>">.go.</a>]',
        '<% } %>',
        '</h1>',
        '<p><%= text %></p>',
        '<% if(hasOwnProperty("videos")){ %>',
            '<ol class="videos"></ol>',
        '<% } %>',
        '<ol class="photos"></ol>',
        '</div>'
    ].join('\n'));
    
    var templatePhoto = _.template([
        '<li id="p<%= id %>" class="photo">',
        '<img src="http://farm<%= farm %>.static.flickr.com/<%= server %>/<%= id %>_<%= secret %>.jpg" />',
        '<a class="title" style="display: none" href="http://www.flickr.com/photos/<%= owner %>/<%= id %>"><%= title %></a>',
        '</li>'
    ].join('\n'));
    
    var templateVideo = _.template([
        '<li id="v<%= id %>" class="video"><a href="#">',
        '<img src="<%= thumbnail_large %>" />',
        '<div class="play"></div>',
        '</a></li>'
    ].join('\n'));


    // PROJECT DATA HANDLING / BEHAVIOR
    function Project(data){
        this.data = data;
        this.ready = false;

        _pullFlickr(this);
        
        if('vids' in data){
            this.video_ids = this.data.vids.split(/\s*,+\s*/g);
            _pullVimeo(this);
        }
    }
    Project.prototype.addPhotos = function addPhotos(data){
        this.data.photos = data.photos.photo;
        this.checkIsFull();
    };
    Project.prototype.addVideo = function addVideo(data){
        if(!('videos' in this.data))
            this.data.videos = [];
        this.data.videos.push(data[0]);
        this.checkIsFull();
    };
    Project.prototype.checkIsFull = function checkIsFull(){
        this.ready = ('photos' in this.data) &&
                     (!('vids' in this.data) || ('videos' in this.data && this.data.videos.length == this.video_ids.length));
        if(this.ready){
            var self = this;
            $(templateProjLnk(this.data))
                .click(function(){
                    self.open.call(self);
                    return false;
                })
                .appendTo('#nv_projects');
        }
    };
    Project.prototype.open = function open(){
        if(this.ready){
            // create skeleton html
            var project = $(templateProject(this.data));
            
            // fill in video links
            if('videos' in this.data){
                var videos = project.children('.videos').first();
                $.each(this.data.videos, function(i, video){
                    $(templateVideo(video))
                        .appendTo(videos)
                        .children('a').first().click(function(){
                            _embedVimeo(video.id);
                            return false;
                        });
                });
            }
            
            // fill in photos
            var photos = project.children('.photos').first();
            $.each(this.data.photos, function(i, photo){
                var photo = $(templatePhoto(photo));
                photo
                    .mouseover(function(){
                        photo.children('a.title').show();
                    })
                    .mouseout(function(){
                        photo.children('a.title').hide();
                    })
                    .appendTo(photos);
            });
        
            // add to dom and show
            $('#projects').html(project);
            _show('projects');
        }
    };


    // FLICKR
    function _pullFlickr(project)
    {
        $.ajax({
            url:      'http://api.flickr.com/services/rest/',
            dataType: 'jsonp',
            jsonp:    'jsoncallback',
            data: {
                method:   'flickr.photos.search',
                api_key:  '7d1e440e53c600ae67c715e63dcf4cb8',
                format:   'json',
                user_id:  '69089921@N00',
                media:    'photos',
                sort:     'date-posted-desc',
                tag_mode: 'all',
                tags:     'slrp:p=' + project.data.tags.replace(/\s*,\s*/g, ',slrp:p=')
            },
            success: function(data){
                project.addPhotos(data);
            }
        });
    }

    // VIMEO
    function _pullVimeo(project)  // get info for specified videos
    {
        for(var i = 0, n = project.video_ids.length; i < n; i++){
            $.ajax({
                url:      'http://vimeo.com/api/v2/video/' + project.video_ids[i] + '.json',
                dataType: 'jsonp',
                success: function(data){
                    project.addVideo(data);
                }
            });
        }
    }
    
    // EMBED
    function _embedVimeo(id)
    {
        $.ajax({
            url:      'http://vimeo.com/api/oembed.json',
            dataType: 'jsonp',

            data: {
                url:       'http://vimeo.com/' + id,
                maxwidth:  '500',
                maxheight: '500',
                autoplay:  'true',
                title:     'true',
                color:     'ffd800'
            },
            success: function(data){
                $('#v' + id).html(unescape(data.html));
            }
        });
    }


    function _slurp(project_data)
    {
        for(var i = 0; i < project_data.length; i++)
            var project = new Project(project_data[i]);
    }

    function _show(id)
    {
        $('#content > .page').hide();
        $('#content > #' + id).show();
    }


    return {
        slurp: _slurp,
        show:  _show
    };

}();