function highlight(q,text) {
    q = q.replace(/^\s+|\s+$/g,'')
    .replace(/\"/g,'')
    .replace(/[\/\.\*\+\?\|\(\)\[\]\{\}\\]/g,'\$&')
    .replace(/\s+/gi,'|');                          
    var re = new RegExp('\\b('+ q + ')\\b', 'gi');
    
    return text.replace(re,'<span class="highlight">$&</span>');
}

function get_timestamp(timestamp) {
  var now = new Date();
  var then = new Date();
  then = setISO8601(timestamp);

  var d = now.getTime() - then.getTime();
  var dY = Math.floor(d / (365 * 30 * 24 * 60 * 60 * 1000));
  var dM = Math.floor(d / (30 * 24 * 60 * 60 * 1000));
  var dD = Math.floor(d / (24 * 60 * 60 * 1000));
  var dH = Math.floor(d / (60 * 60 * 1000));
  var dN = Math.floor(d / (60 * 1000));

  if (dY > 0)   { return dY === 1? "1 year ago"   : dY + " years ago"; }
  if (dM > 0)   { return dM === 1? "1 month ago"  : dM + " months ago"; }
  if (dD > 0)   { return dD === 1? "1 day ago"    : dD + " days ago"; }
  if (dH > 0)   { return dH === 1? "1 hour ago"   : dH + " hours ago"; }
  if (dN > 0)   { return dN === 1? "1 minute ago" : dN + " minutes ago"; }
  return "less than a minute ago";
};

// from http://delete.me.uk/2005/03/iso8601.html
function setISO8601(string) {
var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
    "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
    "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
var d = string.match(new RegExp(regexp));

var offset = 0;
var date = new Date(d[1], 0, 1);

if (d[3]) { date.setMonth(d[3] - 1); }
if (d[5]) { date.setDate(d[5]); }
if (d[7]) { date.setHours(d[7]); }
if (d[8]) { date.setMinutes(d[8]); }
if (d[10]) { date.setSeconds(d[10]); }
if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
if (d[14]) {
    offset = (Number(d[16]) * 60) + Number(d[17]);
    offset *= ((d[15] == '-') ? 1 : -1);
}

offset -= date.getTimezoneOffset();
time = (Number(date) + (offset * 60 * 1000));
ret_val = new Date();
ret_val.setTime(Number(time));
return ret_val;
}

function expand(){
    $(this).toggleClass("expanded");
	$(this).removeClass("expand");
}

function json_search_all(q, offset) {
    var q_text = decodeURIComponent(q.replace(/\+/g, "%20"));
    var url = "http://graph.facebook.com/search?q="+q+"&type=post"+(offset?offset:'')+'&callback=?';
    $.getJSON(url, function(posts) {
        document.getElementById("loading").style.display = "none";
        if (posts.data.length == 0) {
            var noResults = document.createElement("h2");
            noResults.id = 'noResults';
            noResults.innerHTML = 'No results found for <strong><em>'
                + q_text
                + '</em></strong>. Please try another search.<br>';
            
            document.getElementById("content").appendChild(noResults);
            document.getElementById("topics").style.display = "block";
        }
        else {
            document.getElementById("content").innerHTML = '';
            for (var i = 0; i < posts.data.length; i++) {
                var entry = posts.data[i];
                var result = document.createElement('ul');
                result.className = "result";
                
                var image = document.createElement('li');
                image.className = "image";
                image.innerHTML='<a href="http://www.facebook.com/profile.php?id='
                    + entry.from.id + '&v=wall" target="_blank" title="' + entry.from.name + ' on Facebook"><img src="http://graph.facebook.com/'
                    + entry.from.id + '/picture?type=large" /></a>';
                result.appendChild(image);
                
                var user = document.createElement('li');
                user.className = "user";
                user.innerHTML='<strong><a href="http://www.facebook.com/profile.php?id='
                    + entry.from.id + '&v=wall" target="_blank" title="Go to Facebook">'
                    + entry.from.name + '</a></strong>';
                result.appendChild(user);
                
                var message = document.createElement('li');
                message.className = "message";
                message.innerHTML = '';
                if (entry.name) {
                    message.innerHTML += '<a href="'+ entry.link + '">' + highlight(q_text, entry.name) + '</a> &ndash; ';
                }
                if (entry.description) {
                    entry.description = html_sanitize(entry.description);
                    message.innerHTML += highlight(q_text, entry.description);
                }
                if (entry.message) {
                    entry.message = html_sanitize(entry.message);
                    message.innerHTML += highlight(q_text, entry.message);
                }
                message.innerHTML += '<br/><span class="time">';
                if (entry.icon) {
                    message.innerHTML += '<img src="'+entry.icon+'"/> ';
                }
                message.innerHTML += get_timestamp(entry.updated_time);
                if (entry.attribution) {
                    message.innerHTML += ' via ' + entry.attribution;
                }
                message.innerHTML += '</span>';
                
                if ($(message).text().length > 150) {
                    $(message).addClass('long');
					$(message).addClass('expand');
					message.innerHTML += '<span class="expandme"></span>';
					$('.expandme').html('[+] Click to Expand');
                    $(message).click(expand);
                }

                result.appendChild(message);
                
                document.getElementById("content").appendChild(result);
            }
        }
    });
}


