var BASE_URL = 'http://api.flickr.com/services/rest/?&method=';
var PHOTO_BASE_URL = 'http://www.flickr.com/photos/';

var API_KEY_PARAM = '&api_key=';
var COLLECTION_PARAM = '&collection_id=';
var USER_PARAM = '&user_id=';
var PHOTOSET_PARAM = '&photoset_id=';
var PHOTO_PARAM = '&photo_id=';
var PHOTOSET_EXTRA_PARAM = '&extras=';
var JSON_PARAM = '&format=json';
var CALLBACK_PARAM = '&nojsoncallback=1';
var AUTH_TOKEN_PARAM = '&auth_token=';
var API_SIG_PARAM = '&api_sig=';

var GET_COLLECTION_TREE = 'flickr.collections.getTree';
var GET_PHOTOS_IN_SET = 'flickr.photosets.getPhotos';

var PERMS_PARAM = '&perms=';
var API_SIG_PARAM = '&api_sig=';

var FLICKR_BASE_URL = 'http://www.flickr.com/photos/peterpaulrubens/';

var imgUrls = new Array();
var imageSelected = null;
var target = null;

var tabFilter = new Array();
tabFilter['approaches'] = '72157624627941584,72157624645467956,72157624688313772,72157624571879889,72157624502712735',
tabFilter['book'] = '72157624585052816';

var setsLoaded = 0;

var params = 
{
    api_key: '5d3e856c6b5cbc59dd467b941c97af57',
    image_scale: 1.0,
};

$.fn.loadCollection = function(options)
{
    params = $.extend(params, options);
    
    var tabsHTML = '<div id="tabs-container"><div id="tabs">';
    var imagesContainerHTML = '<div id="container">';
    target = $(this);
    
    $.getJSON(getCollectionURL(false),
        function(data) 
        {
            $.each(data.collections.collection[0].set, 
                function(j, set) 
                {
                    if (tabFilter[params.filter].indexOf(set.id) > -1)
                    {
                        tabsHTML += '<div id="' + set.id + '" class="tab" title="' + set.title + '">' + set.title + '</div>';
                        tabsHTML += '<div class="tab-separator">/</div>';
                        
                        imagesContainerHTML += '<div id="description-' + set.id + '" class="text hidden">' + set.description + '</div>';
                        
                        $.getJSON(getSetURL(set.id, false), 
                            function(data)
                            {
                                var setID = data.photoset.id;
                                imagesContainerHTML += '<div id="set-images-' + setID + '" class="images hidden" title="' + set.title + '">';
                                $.each(data.photoset.photo, 
                                    function(j, item) 
                                    {
                                        var style = null;
                                        if (item.width_s)
                                        {
                                            style = 'style="width: ' + item.width_s * params.image_scale + 'px; height: ' + item.height_s * params.image_scale + 'px;"';
                                        }
                                        if (item.width_sq)
                                        {
                                            style = 'style="width: ' + item.width_sq * params.image_scale + 'px; height: ' + item.height_sq * params.image_scale + 'px;"';
                                        }
                                        imagesContainerHTML += '<div id="' + item.id + '" class="image-container" title="' + item.title + '" ' + style + '>';
                                        imagesContainerHTML += '<div class="image loader"></div>';
                                        imagesContainerHTML += '<div class="meta"><div class="title">' + item.title + '</div><div class="views">' + item.views + ' views on flickr</div></div>';
                                        imagesContainerHTML += '</div>';
                                        imgUrls[item.id] = item.url_s;
                                    });
                                imagesContainerHTML += '</div>';
                                setsLoaded++;
                                
                                if (setsLoaded == tabFilter[params.filter].split(',').length)
                                {
                                    tabsHTML += '</div></div>';
                                    $(target).append(tabsHTML);
                                    imagesContainerHTML += '</div>';
                                    $(target).append(imagesContainerHTML);
                                    $('.tab').live('click', selectTab);
                                    $('.tab-separator').last().remove();
                                    
                                    $('.image').css('opacity', '0.75');
                                    $('.image').live('mouseenter',
                                        function()
                                        {
                                            $(this).fadeTo('fast', 1.0);
                                        });
                                    $('.image').live('mouseleave',
                                        function()
                                        {
                                            $(this).fadeTo('fast', 0.75);
                                        });
                                    
                                    $(target).trigger('collectionLoadDone');
                                }
                            });
                    }
                });
        });
}

$.fn.loadSet = function(options)
{
    params = $.extend(params, options);
    
    var tabsHTML = '<div id="tabs-container"><div id="tabs">';
    var imagesContainerHTML = '<div id="container">';
    target = $(this);
    
    $.getJSON(getSetURL(params.set_id, false), 
        function(data)
        {
            tabsHTML += '<div id="' + data.photoset.id + '" class="tab" title="' + params.set_title + '">' + params.set_title + '</div><div class="tab-separator">/</div>';
            imagesContainerHTML += '<div id="set-images-' + data.photoset.id + '" class="images hidden" title="' + params.set_title + '">';
            $.each(data.photoset.photo, 
                function(j, item) 
                {
                    var style = null;
                    if (item.width_s)
                    {
                        style = 'style="width: ' + item.width_s * params.image_scale + 'px; height: ' + item.height_s * params.image_scale + 'px;"';
                    }
                    if (item.width_sq)
                    {
                        style = 'style="width: ' + item.width_sq * params.image_scale + 'px; height: ' + item.height_sq * params.image_scale + 'px;"';
                    }
                    imagesContainerHTML += '<a id="' + item.id + '" class="image-container" title="' + item.title + '" ' + style + ' href="' + item.url_l + '" rel="book">';
                    imagesContainerHTML += '<div class="image loader"><div class="image-info transparent-white-bg"></div></div>';
                    imagesContainerHTML += '<div class="meta"><div class="title">' + item.title + '</div><div class="views">' + item.views + ' views on flickr</div></div>';
                    imagesContainerHTML += '</a>';
                    if (item.url_s)
                    {
                        imgUrls[item.id] = item.url_s;
                    }
                    if (item.url_sq)
                    {
                        imgUrls[item.id] = item.url_sq;
                    }
                });
                
            tabsHTML += '</div></div>';
            $(target).append(tabsHTML);
            
            imagesContainerHTML += '</div>';
            imagesContainerHTML += '</div>';
            $(target).append(imagesContainerHTML);
            
            $('.image-info').live('mouseenter',
                function()
                {
                    $(this).fadeOut('fast');
                });
            $('.image').live('mouseleave',
                function()
                {
                    $($(this).children()[0]).fadeIn('fast');
                });
            
            $(target).trigger('setLoadDone');
        });
}

function getFlickrLink(photo_id, set_id)
{
    var photoUrl = FLICKR_BASE_URL + photo_id + '/in/set-' + set_id + '/';
    return '<a href="' + photoUrl + '">open this image on flickr</a>';
}

function getFlickrURL(photo_id, set_id)
{
    return FLICKR_BASE_URL + photo_id + '/in/set-' + set_id + '/';
}

function getFBlike(url)
{
    return '<iframe src="http://www.facebook.com/plugins/like.php?href=' + encodeURL(url) + '&amp;layout=button_count&amp;show_faces=false&amp;width=600&amp;action=like&amp;colorscheme=light&amp;height=70" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50%; height:70px; background-color: #fff;" allowTransparency="true"></iframe>'
}

function encodeURL(url)
{
    url = url.replace(/\:/g, '%3A');
    return url.replace(/\//g, '%2F');
};

function selectTab(event)
{
    $('.text').hide();
    $('#description-' + $(event.target).attr('id')).show();
    $.each($('#set-images-' + $(event.target).attr('id')).children(),
        function(j, imageContainer)
        {
            if ($($(imageContainer).children()[0]).hasClass('loader'))
            {
                var imageToLoad = new Image();
                $(imageToLoad).attr("src", imgUrls[imageContainer.id]).load(
                    function(){
                        $($(imageContainer).children()[0]).removeClass('loader');
                        $($(imageContainer).children()[0]).css('background','url(' + imgUrls[imageContainer.id] + ')'); 
                    }); 
            }
        });

    $('.images').hide();
    
    $.each($('.image-info'),
        function(j, imageInfo)
        {
            $(imageInfo).show();
        });
    
    $('#set-images-' + $(event.target).attr('id')).fadeIn('slow');

    $('.tab').attr('class', 'tab');
    $(event.target).addClass('selected');
    $(event.target).trigger('tabSelected');
}

function getCollectionURL(private)
{
    var url = BASE_URL;
    url += GET_COLLECTION_TREE;
    url += API_KEY_PARAM + params.api_key;
    url += COLLECTION_PARAM + params.collection_id;
    url += USER_PARAM + params.user_id;
    url += JSON_PARAM;
    url += CALLBACK_PARAM;
    
    if (private)
    {
        url += AUTH_TOKEN_PARAM + params.auth_token;
        var signature = params.shared_secret + 
                        'api_key' + params.api_key + 
                        'auth_token' + params.auth_token + 
                        'collection_id' + params.collection_id + 
                        'formatjson' +
                        'method' + GET_COLLECTION_TREE + 
                        'nojsoncallback1' + 
                        'user_id' + params.user_id;
        url += API_SIG_PARAM + $.md5(signature);
    }
    return url;
}

function getSetURL(set_id, private)
{
    var url = BASE_URL;
    url += GET_PHOTOS_IN_SET;
    url += API_KEY_PARAM + params.api_key;
    url += PHOTOSET_PARAM + set_id;
    url += PHOTOSET_EXTRA_PARAM + params.extras;
    url += JSON_PARAM;
    url += CALLBACK_PARAM;
    
    if (private)
    {
        url += AUTH_TOKEN_PARAM + params.auth_token;
        var signature = params.shared_secret + 
                        'api_key' + params.api_key + 
                        'auth_token' + params.auth_token + 
                        'extras' + params.extras + 
                        'formatjson' +
                        'method' + GET_PHOTOS_IN_SET + 
                        'nojsoncallback1' + 
                        'photoset_id' + set_id;
        url += API_SIG_PARAM + $.md5(signature);
    }
    return url;
}
