
// helpers
function each(obj, func, ctx) {
    var i, len;
    for (i = 0, len = obj.length; i < len; ++i) {
        func.call(ctx, obj[i]);
    }
}

var $id = function (id) { return document.getElementById(id); };
var $tag = function (tag) { return document.getElementsByTagName(tag); };
var $dce = function (el) { return document.createElement(el); };


    function FlickrList (options) {
        this.options = options;
        this.sets = {};
        this.apiCall('flickr.photosets.getList', 'fl.processSetList');
    }

    FlickrList.prototype = {
        apiCall: function(method, callback, args) {
            var urlArgs;
            urlArgs = [];

            if (typeof(args) === 'undefined') {
                args = {};
            }

            if (typeof(callback) === 'function') {
                callback = callback.name;
            }

            args.method = method;
            args.user_id = this.options.user_id;
            args.api_key = this.options.api_key;
            args.jsoncallback = callback;
            args.format = 'json';

            var baseUrl = 'http://api.flickr.com/services/rest/?'

            for (i in args) {
                urlArgs.push(i + '=' + args[i]);
            }

            baseUrl = baseUrl + urlArgs.join('&');

            //method=' + method + '&user_id=' + this.options.user_id + '&api_key=' + this.options.api_key + '&format=json&jsoncallback=' + callback;
            this.insertScript(baseUrl);
        },

        insertScript: function(url) {
            var head, script;

            script = $dce('script');
            script.src = url;

            head = $tag('head')[0];
            head.appendChild(script);
        },

        processSetList: function(json) {
            var i, item;

            if (!this.apiCheckStatus(json)) {
                return;
            }

            if (this.options.set_decorator) {
                this.options.set_decorator(json.photosets.photoset, this.options);
            }
			
			this.loadedPhotoSets = json.photosets.photoset;
			
            for (i = 0; i < json.photosets.photoset.length; ++i) {
                item = json.photosets.photoset[i];
                this.cacheSet(item.id);
            }
        },
        processPhotoList: function(json) {
            if (!this.apiCheckStatus(json)) {
                return;
            }

            var set_id = json.photoset.id;

            this.sets[ set_id ] = json.photoset.photo;
			
			if (this.options.set_loaded) {
                this.options.set_loaded(this.loadedPhotoSets, this.options);
            }
        },
        cacheSet: function(set_id) {

            if (!this.sets[ set_id ]) {
                this.apiCall('flickr.photosets.getPhotos', 'fl.processPhotoList', {photoset_id: set_id});
            }

        },
        showPhotos: function(set_id,set_name) {
            var photos, photo, div, img, cnt;
			
	        photos = this.sets[ set_id ];

            div = $id(this.options.image_list);
            div.innerHTML = '';
			
			div.innerHTML = '<h1>Album: ' + set_name + '</h1>';
			cnt = 0;
            for (var i = 0; i < photos.length; ++i) {

                photo = photos[i];
				
				var className = (cnt == 0) ? 'galleryThumbFirst' : 'galleryThumb';
				
				var wd = $dce('div')
				wd.setAttribute('class',className);
							
				var l = $dce('a');
				l.setAttribute('class','lbox');
				l.setAttribute('href', this.buildImgUrl(photo,''));
				l.setAttribute('title',photo.title);
				
                var img = $dce('img');
                img.setAttribute('src', this.buildImgUrl(photo));
				
				wd.appendChild(l);
				l.appendChild(img);
				div.appendChild(wd);
				
				cnt++;
				if (cnt == 6) {
					cnt = 0;
					//var clbr = $dce('br');
					//div.appendChild(clbr);
				}

            }
			
			// Reload Lightbox
			$('#flickrPhotoList a').lightBox({
				imageLoading: sg_siteDir + 'images/lightbox/loading.gif',
				imageBtnClose: sg_siteDir + 'images/lightbox/close.gif',
				imageBtnPrev: sg_siteDir + 'images/lightbox/prev.gif',
				imageBtnNext: sg_siteDir + 'images/lightbox/next.gif',
				imageBlank: sg_siteDir + 'images/lightbox/blank.gif'
			});

        },
        buildImgUrl: function (item,modifier) {
			mod = (typeof modifier == 'undefined') ? '_s' : modifier;
			
            return 'http://farm' + item.farm + '.static.flickr.com/' + item.server + '/' + item.id + '_' + item.secret + mod + '.jpg';
        },
        apiCheckStatus: function (json) {
            if (!json || json.stat === 'fail') {
                alert('Flickr error: ' + json.message);
                return false;
            }

            return true;
        }
    };


var opts = {
    set_list: 'csSubNav',
	set_select: 'flickrPhotoSelect',
    image_list: 'flickrPhotoList',
    api_key: '9c986cb8f3bcbd4d4b40ba693eab4541',
    user_id: '26131149@N04',
    set_decorator: setDecorate,
	set_loaded: loadFirstAlbum
};

var fl = null;

$(document).ready(function() {
	fl = new FlickrList(opts);								
});

function loadFirstAlbum(sets, options) {
	
	if (!sets[0]) return;
	fl.showPhotos(sets[0].id,sets[0].title._content);
}

function setDecorate(sets, options) {
    var div, ul, i, sel, s, item;
	
    div = $id(options.set_list);

    for (i = 0; i < sets.length; ++i) {
        var a = $dce('a');

        item = sets[i];
	
        a.innerHTML = item.title._content;
        a.setAttribute('href', '#');
        a.setAttribute('set_id', item.id);
		a.setAttribute('set_title', item.title._content);
        a.onclick = function() {

            var set_id = this.getAttribute('set_id');
			var set_title = this.getAttribute('set_title');
            fl.showPhotos(set_id,set_title);

            return false;
        };

        div.appendChild(a);


    }

}

