/*
 * $Id: social.js 4082 2012-01-30 16:46:17Z j.thomae $
 * (c) 2010 Tallence GmbH
 */

var spd = spd || {} ;

/**
 * Renders a box identified by <code>id</code> of social messages. The messages must use the following format:
 *
 * <pre>
 * {
 *   account : 'the message's user account',
 *   author : 'the message's author',
 *   avatar : 'a link to the authors avatar icon',
 *   date : 'the message's creation date' 
 *   id : 'the message's unique id',
 *   profile : 'a link to the author's profile',
 *   text : 'a link to the the message',
 *   type : 'the message's type, currently "facebook" or "twitter"'
 * }
 * </pre>
 *
 * @param id the HTML ul element's id where to add the messages to
 * @param messages array of message objects as defined above
 */
function renderSocialMessages(id, messages) {
    var ul = jQuery('#' + id);
    ul.children().remove();

    $.each(messages, function(index, message) {
        var item = jQuery('<li></li>').hide();

        if ((index + 1) % 2 == 0) {
            item.addClass('even');
        } else {
            item.addClass('odd');
        }

        var avatar = jQuery('<div class="avatar"><a target="_blank" href="' + message.profile + '"><img src="' + message.avatar + '" alt="' + message.author + '" width="36" /></a></div>');
        item.append(avatar);

        var messageDiv = jQuery('<div class="message"></div>');
        var copy = jQuery('<p class="copy"><span class="author"><a target="_blank" href="' + message.profile + '">' + message.author + '<span class="hideme">:</span></a></span> ' + cutText(message.text, 320) + '</p>');
        var meta = jQuery('<p class="meta-1"></p>');

        switch (message.type) {
            case 'facebook':
                var iLikeLink = '';//'<a href="#" class="btn-i-like-text">Gef\u00E4llt mir</a>';
                meta.append('<span class="date">' + formatDate(message.date, true) + ' &bull; ' + formatTime(message.date) + '</span> ' + iLikeLink);
                break;
            case 'twitter':
                var messageLink = '<a target="_blank" href="http://twitter.com/' + message.account + '/status/' + message.id + '" class="date">' + formatDate(message.date, true) + ' &bull; ' + formatTime(message.date) + '</a>';
                var followLink = '<a target="_blank" href="http://www.twitter.com/' + message.account + '">Folgen</a>';
                var retweetLink = '<a target="_blank" href="http://twitter.com/home?status=' + encodeURI('RT @' + message.account + ' ' + message.text) + '">Retweet</a></span>';
                meta.append(messageLink + ' <span class="twitter-links">' + followLink + ' ' + retweetLink + '</span>');
                break;
             default:
                alert('Unsupported message type: ' + message.type);
        }

        messageDiv.append(copy);
        messageDiv.append(meta);
        item.append(messageDiv);

        item.appendTo(ul);
        item.fadeIn('slow');
    });
}

/**
 * Collects Twitter status messages and converts them to our internal social messages. The messages
 * are collected asynchronously, thus you have to supply a callback function in order to be
 * informed of new status messages.
 *
 * @param accounts a twitter accounts aka screen name
 * @param count number of messages to receive, use zero or less to ignore
 * @param since a unique status message id from twitter, use zero or less to ignore
 * @param callback function to be called with our internal social messages together with the most recent status id
 */
function collectTwitterSocialMessages(accounts, count, since, callback) {
    var query = '?callback=?'; // need this to make it work for cross domain scripting

    if (accounts.length > 0) {
        query += '&q=';
        for (var i = 0; i < accounts.length; i++) {
            query += 'FROM%3A' + encodeURI(accounts[i]);
            if (i + 1 < accounts.length) {
                query += '+OR+';
            }
        }
    }
    if (count > 0) {
        query += '&rpp=' + count;
    }
    if (since > 0) {
        query += '&since_id=' + since;
    }
    
    $.getJSON('http://search.twitter.com/search.json' + query, function(data) {
        var messages = new Array();

        // converts twitter search result to our internal social messages
        // @see http://apiwiki.twitter.com/Twitter-Search-API-Method%3A-search

        for(var i = 0; i < data.results.length; i++) {
            var item = data.results[i];

            messages.push({
                account : item.from_user,
                author : item.from_user,
                avatar : item.profile_image_url,
                date : new Date(item.created_at),
                id : item.id,
                profile : 'http://twitter.com/' + item.from_user,
                text : item.text,
                type : 'twitter'
            });
        }

        callback(messages, data.results.max_id);
    });

    /*
    $.getJSON('http://api.twitter.com/1/statuses/user_timeline.json?id=' + accounts + '&count=' + count + '&callback=?', function(data) {
        var messages = new Array();

        for(var i = 0; i < data.length; i++) {
            var status = data[i];

            messages.push({
                account : status.user.screen_name,
                author : status.user.name,
                avatar : status.user.profile_image_url,
                date : new Date(status.created_at),
                id : status.id,
                profile : 'http://twitter.com/' + accounts,
                text : status.text,
                type : 'twitter'
            });
        }

        callback(messages);
    });
    */
}

function collectFacebookSocialMessages(accounts, count, since, callback) {
    // EXAMPLE !!!
    var inAccounts = '';

    for (var i = 0; i < accounts.length; i++) {
        inAccounts += accounts[i];
        if (i + 1 < accounts.length) {
            inAccounts += ',';
        }
    }

    // TODO: cache users and pages???
    var users = FB.Data.query('SELECT uid, name, pic_square FROM user WHERE uid IN (' + inAccounts + ')');
    var pages = FB.Data.query('SELECT page_id, name, pic_square FROM page WHERE page_id IN (' + inAccounts + ')');
    var stream = FB.Data.query('SELECT post_id, actor_id, created_time, message FROM stream WHERE source_id IN (' + inAccounts + ') AND updated_time > ' + since + ' LIMIT ' + count);

    FB.Data.waitOn([stream, users, pages], function() {
        var actors = {};
        FB.Array.forEach(users.value, function(row) {
            actors[row.uid] = {
                name : row.name,
                avatar : row.pic_square
            };
        });
        FB.Array.forEach(pages.value, function(row) {
            actors[row.page_id] = {
                name : row.name,
                avatar : row.pic_square
            };
        });

        var recent = null;
        var messages = new Array();
        FB.Array.forEach(stream.value, function(row) {
            if (recent == null) recent = row.created_time;

            messages.push({
                account : row.actor_id,
                author : actors[row.actor_id].name,
                avatar : actors[row.actor_id].avatar,
                date : new Date(parseInt(row.created_time) * 1000),
                id : row.post_id,
                profile : 'http://www.facebook.com/profile.php?id=' + row.actor_id,
                text : row.message,
                type : 'facebook'
            });
        });

        callback(messages, recent);
    });

}

init_event_catchers = function() {
      debug('subscribe');

//      FB.Event.subscribe('edge.create', function(response) {
//        debug('liked');
//        debug(response);
//      });
};


//spd = spd || {};
/* used for comments of a comment */
function replyTo(id) {
  var $origComment = jQuery("#comment_" + id);
  var $replyToDiv = jQuery('#comment-reply-to');

  $replyToDiv.empty().html($origComment.html());
  $replyToDiv.show();
  $('#commentEditor').get(0).focus();
  jQuery('#replyToCommentId').val(id);
}


spd.blog = {
  confirmDelete: function(link) {
    var callback = function(result) {
      if (result == true) {        
        document.location.href=link;
      }
    }
    spd.dialog.lightboxConfirm.open(callback, spd.i18n.blog.deleteConfirm);
    return false;
  },
  confirmDeleteComment: function(link) {
    var callback = function(result) {
      if (result == true) {
        document.location.href=link;
      }
    }
    spd.dialog.lightboxConfirm.open(callback, spd.i18n.blog.deleteCommentConfirm);
    return false;
  }

};


