jQuery(function($) {
  initSidebars();
  initFancybox();
  initMoreContent();
  initScrolling();  
  initMonthlyArchives();
  if (! $.browser.msie ) $(window).load(initTwitter);
});

function initSidebars () {  
  var sidecontent = $('#sidecontent');
  var sideHideStrings = '.shorthidden, .democracy, .wp-tag-cloud, #recentcomments';
  
  // hide open lis in the sidebar
  sidecontent.children('li.open').each(function() {
    if (! readCookie($(this).children('h2').text()) ) {
      $(this).removeClass('open').children(sideHideStrings).hide();
    }
  });
    
    // add links inside the h2s
    sidecontent.find('li:not(.alwaysOpen) h2').each(function() {
        $(this).wrapInner('<a href="#" rel="nofollow"></a>').append('<span class="arrow"></span>');
    });
    
    $('body').addClass('js');
  
  // onhover fade in/out arrow
  sidecontent.children('li').find('h2')
  .hover(
    function() { $(this).find('span.arrow').fadeTo(300, 1.0); },
    function() { $(this).find('span.arrow').fadeTo(300, 0.1); }
  )
  .children('a')
  .focus(function() {
    $(this).next('span.arrow').fadeTo(300, 1.0);
  })
  .blur(function() {
    $(this).next('span.arrow').fadeTo(300, 0.1);
  });;
  
  // onclick open/close the lis
  sidecontent.children('li').find('span.arrow').click(function() {
    $(this).prev().trigger('click');
  }).prev('a').click(function() {
    if ( $(this).parents('li').hasClass('open') ) {
      $(this).parent('h2').siblings(sideHideStrings).slideUp(300, function(){
        $(this).parents('li').toggleClass('open');
      });
      eraseCookie($(this).parent('h2').text());
    } else {
       $(this).parent('h2').siblings(sideHideStrings).slideDown(300);
       $(this).parents('li').toggleClass('open');
       createCookie($(this).parent('h2').text(),1,360);
    }
        return false;
  });
}
  
function initFancybox () {
  $('#content .postcontent img').each(function(i, el) {
    var parent = $(el).parent();
    if ( parent.is('a') && parent.attr('href').match(/(?:jpg|jpeg|gif|png)$/) ) {
      parent
      .attr('rel', 'images')
      .fancybox({
        easingIn : 'easeOutQuint',
        easingOut : 'easeOutQuint',
        speedIn: 600,
        speedOut: 500,
        overlayShow: false,
        hideOnContentClick: true,
        titleShow: false,
        transitionIn: 'elastic',
        transitionOut: 'elastic'
      });
    }
  });
}

function initMoreContent () {
  var curPage = 1;
 
  $('#dataGetter')
  .click(function() {
    $('#content p.arch').after('<div class="newContent"></div>');
    $('#content .newContent:last').load(ajaxBaseUrl()+'?paged='+ (++curPage) +' #content .post');
    return false;
  })
  .ajaxStart(function() {
    $(this).addClass('loading');
  })
  .ajaxComplete(function() {
    $(this).parent().clone(true).appendTo('#content').children().removeClass('loading');
    $(this).parent().remove();
  }); 
}

function initScrolling () {
  $.localScroll.defaults.easing = 'easeOutExpo';
  $.localScroll.defaults.duration = '900';  
  
  $.localScroll.hash({
    margin: true
  });
  
  $.localScroll({
    hash: true,
    margin: true
  });
}

// Monthly Archives Usability
function initMonthlyArchives () {
  if (! $('.archive').length ) return;

  var allMonths = $('.monthList > li');
  var archive = $('.archive');  
  var year = new Date().getFullYear();
  
  $('.monthList').remove();
  
  for (var i = year;;i--) {
    var yearMonths = allMonths.find('a:contains("'+i+'")').parent();
    
    if (! yearMonths.length ) break;
    
    archive.append(yearMonths);
    yearMonths.wrapAll('<ul class="yearList"></ul>').parent().before('<h4><a href="#">'+i+'</a></h4>');
  }
  
  archive.find('ul.yearList:not(:first)').addClass('closed').hide();
  
  archive.find('h4 a').click(function() {
    var ul = $(this).parent().next('ul');
    
    if ( ul.hasClass('closed') ) {
      ul.removeClass('closed').fadeIn('normal');
    } else {
      ul.addClass('closed').fadeOut('normal');
    }
    
    return false;
  });
}

function initTwitter () {  
  var query = encodeURIComponent('SELECT * FROM twitter.users WHERE id in  (\'hellamsel\', \'pietropizzi\')'),
      env = encodeURIComponent('store://datatables.org/alltableswithkeys');
  $.ajax({
    url: 'http://query.yahooapis.com/v1/public/yql?q='+query+'&diagnostics=false&format=json&env='+env,
    global: false,
    dataType: 'jsonp',
    jsonp: 'callback',
    jsonpCallback: 'twitterResults'
  });
}

function twitterResults (o) {
  var data = o.query.results;
  if (! data ) return;
  $('#twitter').empty().append(buildTwitter(data)).parent().fadeIn(500);
}

function buildTwitter (data) {
  var user = data.user;
  var result = '<dl><h6 class="hidden">Twitter</h6>';
  var users = ['Funkmaster', 'Pietropizzi'];
  var twitterUsers = ['hellamsel', 'pietropizzi'];
  var messages, ids = [];
  
  messages = [user[0].status.text, user[1].status.text];

  for ( var i=0, j=twitterUsers.length; i<j; i++ ) {
    if ( messages[i] ) { 
      result += '<dt><a href="http://twitter.com/'+twitterUsers[i]+'">'+users[i]+'</a></dt><dd id="'+users[i]+'">'+messages[i].parseTwitter()+'</dd>';
    }
  }
  result += '<dl>';
  return result;
}

/***** Helpers ******/

String.prototype.parseTwitter = function() {
  return this
    .replace(/([A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+)/, '<a href="$1">$1</a>')          // Links
    .replace(/(^|\s)@(\w+)/g, '$1<a class="username" href="http://twitter.com/$2">@$2</a>')             // Usernames
    .replace(/(^|\s)#(\w+)/g, '$1<a class="hashtag" href="http://twitter.com/#search?q=$2">#$2</a>');   // Hashtags
};

// are we on the development or on the real server
function isLocal () {
  return ( window.location.host.indexOf('localhost') >= 0 );
}


/**
* Clears predefined contents of an input field
*/
function clearContent(O,content) {
  if (O.value == content) {
    O.value = "";
  }
}

function ajaxBaseUrl() {
  return isLocal() ? '/wordpress/' : '/';
}

/**
* Restore predefined contents of an input field
*/
function restoreContent(O,content) {
  if (O.value == "") {
    O.value=content;
  }
}

/**
* Cookie Stuff
*/
function createCookie(name,value,days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

function eraseCookie(name) {
    createCookie(name,"",-1);
}
