/*
 * Master
 * http://rayboyd.com/
 *
 * Copyright (c) 2009 Ray Boyd
 * Dual licensed under the MIT and GPL licenses.
 *
 */

//----------------------------------------------------------------------

var settings = {};

    /** FLICKR **/
    settings.username  = 'eyetwist';
    settings.perpage   = '40';
    settings.restpoint = 'http://api.flickr.com/services/rest/';
    settings.api_key   = '3bc63ddcae4d7f60b90417ae70ad8377';

    /** VISUAL **/
    settings.border = 30;
    settings.fadespeed = 250;

    /** HTML **/
    settings.html_target = '.left_column';

    settings.html_lightbox        = '.lightbox';
    settings.html_lbimage         = '.lightbox .picture';
    settings.html_lightbox_markup = '<div class="lightbox"><p class="picture"></p></div>';

    settings.html_preloader        = '.preloader';
    settings.html_preloader_markup = '<div class="preloader"><p>Loading, please wait...</p></div>';

    settings.html_blackout        = '.blackout';
    settings.html_blackout_markup = '<div class="blackout"></div>';

//----------------------------------------------------------------------

// Dom ready?
google.setOnLoadCallback(onLoadComplete);

// DOM onLoad callback
function onLoadComplete() { jsengine.init() } ;

/*
 * Application
 */
var jsengine = function()
{
    var _jsengine = false;
    var _thumbs = [];

    var CONST_RESTPOINT = settings.restpoint + '?format=json&api_key=' + settings.api_key + '&';
    var CONST_FINDUSERNAME = 'method=flickr.people.findByUsername&jsoncallback=jsengine.getNSID&username=';
    var CONST_FINDPUBLICPHOTOS = 'method=flickr.people.getPublicPhotos&extras=owner_name&jsoncallback=jsengine.parseJSON&user_id=';

    return {
        init:function()
        {
            if(!_jsengine)
            {
                var url = CONST_RESTPOINT + CONST_FINDUSERNAME + settings.username;
                $.getScript(url);
            };
            var _jsengine = true;
        },
        getNSID:function(data)
        {
            switch(data.stat)
            {
                case 'ok':
                    var url = CONST_RESTPOINT + CONST_FINDPUBLICPHOTOS + data.user['nsid'] + '&per_page=' + settings.perpage;
                    $.getScript(url);
                break;
                case 'fail':
                    $('<h2>' + data.message + '</h2>').appendTo(settings.html_target);
                break;
            };
        },
        parseJSON:function(data)
        {
            switch(data.stat)
            {
                case 'ok':
                    var i = 0;
                    while(i<data.photos['photo'].length)
                    {
                        _thumbs.push(data.photos['photo'][i]);
                        ++i;
                    };
                    buildUI();
                break;
                case 'fail':
                    $('<h2>' + data.message + '</h2>').appendTo(settings.html_target);
                break;
            };
        }
    };

    /*
     * Private Methods
     */

    function buildUI()
    {
        // Build the lightbox
        $(settings.html_lightbox_markup).appendTo('body');
        $(settings.html_preloader_markup).appendTo('body');
        $(settings.html_blackout_markup).appendTo('body');

        // 1
        $('<h2>' + settings.username + '\'s photowall</h2><br>').appendTo(settings.html_target);
        $('<ul></ul>').appendTo(settings.html_target);

        // 2
        var i = 0;
        while(i<_thumbs.length)
        {
            var photo = _thumbs[i];
            createThumbnail({
                title   : photo.title,
                owner   : photo.ownername,
                baseurl : 'http://farm' + photo.farm + '.static.flickr.com/' + photo.server + '/' + photo.id + '_' + photo.secret
            });
            ++i;
        };
    };

    /*
     * UI
     * createThumbnail : flickr photo object
     *
     * o.title
     * o.owner
     * o.baseurl
     *
     * var url = o.baseurl + '_' + size[s|t|m|b] + '.jpg';
     *
     */
    function createThumbnail(o)
    {
        $('<li></li>')
            .html('<img src="' + o.baseurl + '_s.jpg">')
            .appendTo(settings.html_target + ' ul')
            /** Mouse events; click, over and out **/
            .click(function()
            {
                $(settings.html_lbimage).empty();
                $(settings.html_preloader).fadeIn(settings.fadespeed);
                $(settings.html_blackout).fadeIn(settings.fadespeed, function()
                {
                    var img = new Image();
                    $(img).load(function() {
                        /** Center the image **/
                        $(settings.html_lbimage).css({
                            'width' : this.width + 'px',
                            'height': this.height + 'px',
                            'left'  : '-' + (this.width/2)-settings.border + 'px',
                            'top'   : '-' + (this.height/2)-settings.border + 'px'
                        });
                        $(settings.html_lbimage).append(this);
                        /** Preloader out, image in **/
                        $(settings.html_preloader).fadeOut(settings.fadespeed, function()
                        {
                            $(settings.html_lightbox).fadeIn();
                        });
                    }).error(function()
                    {
                       alert("Image load error, press OK and refresh the page");
                    })
                    .attr('src', o.baseurl + '.jpg');
                });
            })
            .mouseover(function()
            {
                $(this).css('cursor','pointer').fadeTo(settings.fadespeed, 0.5);
            })
            .mouseout(function()
            {
                $(this).fadeTo(150, 1);
            });

        $(settings.html_lightbox).live('click', function()
        {
            $(this).hide();
            $(settings.html_blackout).hide();
        });

        $(settings.html_lightbox).live('mouseover', function()
        {
            $(this).css('cursor','pointer');
        });
    };

}(); // jsengine 07/02/09 v1.0 // flickr display
