Sources.flickr = function() {
    var id = "flickr";
    var baseURL = "api://www.flickr.com/?";
    Sources.register(id);
    
    var lookupSets = function(user_id) {
        var reqUrl = makeFlickrUrl({
            "method": "flickr.photosets.getList",
            "user_id": user_id
        });

        $.getJSON(reqUrl, function(response){
            if (response.stat != "ok") {
                flickrError(response);
                return;
            }

            $(".set-thumb").remove();
            $.each(response.photosets.photoset, function(i,set){
                var newElement = $("#set-thumb-dummy")
                    .clone()
                    .attr('id', set.id)
                    .addClass("set-thumb");

                newElement.find("img").attr("src",  makeSetThumbUrl(set));
                var truncName = set.title._content.substr(0, 8) + "...";
                newElement.find(".thumb-title").text(truncName);

                $("#flickr-sets").append(newElement);
                if (newElement.attr('id') == $("#flickr-user-album").val()) {
                    newElement.addClass("set-thumb-selected");
                }
                newElement.show();

            });
            $("#flickr-user-opts-album").show();
        });
    };
    
    var lookupUser = function(embedFunc) {
        var value = $("#flickr-user-name").val().trim();
        if (value.indexOf("http://") != 0) {
            value = "http://www.flickr.com/photos/" + value;
            $("#flickr-user-name").val(value);
        }

        var reqUrl = makeFlickrUrl({
            "method": "flickr.urls.lookupUser",
            "url": value
        });

        $.getJSON(reqUrl, function(response){
            if (response.stat != "ok") {
                sourceError = true;
                alert("That user cannot be found");
                $("#flickr-user-name").focus();
                return;
            }
            $("#flickr-user").val(response.user.id);
            $("#flickr-opts-user:hidden").show();
            embedFunc();
        });
    };

    var lookupGroup = function(embedFunc) {
        var value = $("#flickr-group-name").val();
        if (value.indexOf("http://") != 0) {
            value = "http://www.flickr.com/groups/" + value;
            $("#flickr-group-name").val(value);
        }

        var reqUrl = makeFlickrUrl({
            "method": "flickr.urls.lookupGroup",
            "url": value
        });

        $.getJSON(reqUrl, function(response){
            if (response.stat != "ok") {
                sourceError = true;
                alert("That group cannot be found");
                $("#flickr-group-name").focus();
                return;
            }
            $("#flickr-group").val(response.group.id);
            $("#flickr-opts-group:hidden").show();
            embedFunc();
        });
    };
    
    return {
        id: id,
        displayName: 'Flickr',
        type: 'photo',
        
        init: function() {
            // Flickr init tip special-casing.  Argh.

            $("#flickr-user-name").keydown(function(){
                $("#flickr-user").val("");
                $("#flickr-album").val("");
                $("#flickr-album").val("");
                $("#flickr-user-opts-album:visible").hide();
                $("#init-tip:visible").hide();
            });
            $("#flickr-opts").change(function(event){
                if ($(this).val() == 'user') {
                    $("#init-tip:hidden").show();
                }
                else {
                    $("#init-tip:visible").hide();
                }
            });
            $("#flickr-user-name").change(function(event){
                if ($(this).val() == '') {
                    $("#init-tip:hidden").show();
                }
            });

            $("#flickr-group-name").keydown(function(){
                $("#flickr-group").val("");
            });
            
            // Set behavior
            $("#flickr-user-opts").change(function(event) {
                if ($(this).val() == 'album') {
                    var userID = $("#flickr-user").val();
                    if (userID) {
                        lookupSets(userID);
                    }
                }
            });
            
            $("#flickr-group-opts").change(function(){
                if ($(this).val() == "all") {
                    Wall.preview();
                }
            });
            
            $(".set-thumb").live("click", function(event){
                $("#flickr-user-album").val($(this).attr('id'));
                $(this).siblings(".set-thumb-selected").removeClass("set-thumb-selected");
                $(this).addClass("set-thumb-selected");
                Wall.doEmbed();
            });
        },
       
        preEmbed: function(embedFunc) {
            if ($("#flickr-user-name:visible").val()) {
                if (!$("#flickr-user").val()) {
                    lookupUser(embedFunc);
                    return true;
                }
                else {
                    // Needed for initial-state setup
                    $("#flickr-opts-user:hidden").show();
                }
            }
            else if ($("#flickr-group-name:visible").val()) {
                if (!$("#flickr-grouo").val()) {
                    lookupGroup(embedFunc);
                    return true;
                }
                else {
                    $("#flickr-opts-group:hidden").show();
                }
            }
        },
        
        setState: function(feed) {
            $("#item-tab-what-flickr").click();
            
            var params = explodeQueryString(decodeURIComponent(feed.replace(baseURL, "")));
            if (!params) {
                $("#flickr-opts").val("user");
                $("#init-tip").show();
            }
            else if (params["user"]) {
                $("#flickr-opts").val("user");
                var flickrURL = "http://www.flickr.com/photos/" + params["user"];
                $("#flickr-user").val(params["user"]);
                $("#flickr-user-name").val(flickrURL);
                if (params["search"]) {
                    $("#flickr-user-opts").val("search");
                    $("#flickr-user-opts").change();
                    $("#flickr-user-search").val(params["search"]);
                }
                else if (params["tags"]) {
                    $("#flickr-user-opts").val("tags");
                    $("#flickr-user-opts").change();
                    $("#flickr-user-tags").val(params["tags"]);
                }
                else if (params['album']) {
                    $("#flickr-user-opts").val("album");
                    $("#flickr-user-album").val(params["album"]);
                    $("#flickr-user-opts").change();
                }
            }
            else if (params["group"]) {
                $("#flickr-opts").val("group");
                var flickrURL = "http://www.flickr.com/groups/" + params["group"];
                $("#flickr-group").val(params["group"]);
                $("#flickr-group-name").val(flickrURL);
                if (params["search"]) {
                    $("#flickr-group-opts").val("search");
                    $("#flickr-group-opts").change();
                    $("#flickr-group-search").val(params["search"]);
                }
                else if (params["tags"]) {
                    $("#flickr-group-opts").val("tags");
                    $("#flickr-group-opts").change();
                    $("#flickr-group-tags").val(params["tags"]);
                }
            }
            else if (params["search"]) {
                $("#flickr-opts").val("search");
                $("#flickr-search").val(params["search"]);
            }
            else if (params["tags"]) {
                $("#flickr-opts").val("tags");
                $("#flickr-tags").val(params["tags"]);
            }
            $("#flickr-opts").change();
            $("#init-tip").hide();
        },
        
        getFeedURL: function() {
            var feedURL = baseURL;
            var feedType = $("#flickr-opts").val();
            var feedOpts = [];

            var typeID = "#flickr-" + feedType;
            var typeField = $(typeID);
            if (typeField.val()) {
                feedOpts.push(feedType + "=" + typeField.val());                
            }

            if (feedType == 'user' || feedType == 'group') {

                var filterOptsID = typeID + "-opts";
                var filterType = $(filterOptsID).val();
                if (filterType && filterType != 'all') {
                    var filterID = typeID + "-" + filterType;
                    if ($(filterID).val()) {
                        feedOpts.push(filterType + "=" + $(filterID).val());                
                    }
                }
            }

            feedURL += feedOpts.join("&");
            
            return feedURL;
        },
        
        isFeedURL: function(feedURL) {
            return (feedURL.indexOf(baseURL) == 0);
        }
    };
}();
