$.fn.movableparts = function(options) {
  var opts = $.extend({}, $.fn.movableparts.defaults, options);
	var boxCode;

	if(!opts.feed_url)
		return false;
		
  return this.each(function() {
    opts.box_code = $.fn.movableparts.build(opts);

		$(this).append(opts.box_code);

		if(opts.feed_type=='rss') {
			$.fn.movableparts.rss(opts);
		} else if(opts.feed_type=='json') {
			$.fn.movableparts.json(opts);
		}
  });
};

$.fn.movableparts.build = function(options) {
	var opened_state = getCookie('state_'+options.id);
	var boxHeaderText = '<div id="'+options.id+'" class="movable'+(opened_state!=null && opened_state=='closed'?' box_collapsed':'')+'">';
	boxHeaderText += '<h2><a href="'+options.link+'">'+options.title+'</a></h2>';
	boxHeaderText += '<div class="utils">';
	boxHeaderText += '<div class="edit-options"><a href="?edit">Edit<span class="hide"> settings</span></a></div>';
	boxHeaderText += '<div class="collapse"><a href="#" title="'+options.id+'"><span class="hide">Close this box</span></a></div>';
	boxHeaderText += '</div>';
	boxHeaderText += '<div class="box_state" style="display:'+(opened_state!=null && opened_state=='closed'?'none':'block')+'">';
	boxHeaderText += '<div class="box_data"></div></div></div>';
	return boxHeaderText;
};

$.fn.movableparts.defaults = {
	id: '',
  title: '',
  link: '',
	feed_url: '',
	feed_type: 'rss',
	item_count: 10,
	desc_length: 100,
	show_date: true,
	box_code: ''
};

$.fn.movableparts.rss = function(options) {
	var targeturl = '../get_rss.php?url='+options.feed_url;
	$(this).each(function(){
		$.get(targeturl,function(xml){
			var posts=[];
			var i=0;
			$("item", xml).each(function(){
				if(i>options.item_count-1)	return;
				var post={};
				$(this).find("link").each(function(){
					post.link=$.fn.movableparts.getNodeText(this);
				});
				$(this).find("title").each(function(){
					post.title=$.fn.movableparts.getNodeText(this);
				});
				if(options.show_date == true) {
					$(this).find("pubDate").each(function(){
						var d=$.fn.movableparts.getNodeText(this);
						post.date=$.fn.movableparts.formatDate(d);
					});
				}
				$(this).find("description").each(function(){
					var t=$.fn.movableparts.getNodeText(this);
					post.desc=$.fn.movableparts.trimtext(t,options.desc_length);
				});
				posts[i++]=post;
			});
      $.fn.movableparts.writeposts(options.id,posts);
		})
	});
};

$.fn.movableparts.json = function(options) {
	$(this).each(function(){
		$.getJSON(options.feed_url,function(json){
			var posts=[];
			var i=0;

		  $.each(json.entries, function(index, item){
				if(i>options.item_count-1)	return;
				var post={};
				post.link=item.link;
				post.title=item.title;
				if(options.show_date == true) {
					post.date=$.fn.movableparts.formatDate(item.pubDate);
				}
				post.desc=$.fn.movableparts.trimtext(item.description,options.desc_length);
				posts[i++]=post;
			});
			$.fn.movableparts.writeposts(options.id,posts);
		})
	});
};

$.fn.movableparts.writeposts = function(parent_id,posts) {
	var html = '<dl>';
	for(var k in posts){
	  html+=$.fn.movableparts.formatPost(posts[k]);
	}
	html += '</dl>';
	$('#'+parent_id+' div.box_data').append(html);
};

$.fn.movableparts.formatPost = function(post) {
	var html='<dt><a href="'+post.link+'" class="post-title">'+post.title+'</a>';
	if(post.date!=undefined){
		html+='<br /><span class="date">'+post.date+'</span></dt>';
	}
	html+='<dd class="post-desc">'+post.desc+'<div class="more"><a href="'+post.link+'"><span>More</span>&nbsp;&#187;</a></div></dd>'
	return html;
};

$.fn.movableparts.formatDate = function(date) {
	var d = date.split(' ');
	d = d.slice(0,4);
	return d[0]+' '+d[2]+' '+d[1]+' '+d[3];
};

$.fn.movableparts.trimtext = function(text,length) {
	if(length<=0){
		return '';
	};

	var t = text.replace(/\s/g,' ');
	var words = t.split(' ');

	if(words.length<=length){
		return text;
	}

	var ret = words.slice(0,(length+1));
	return ret.join(' ')+'. . . . ';
};

$.fn.movableparts.getNodeText = function(node) {
	var text = "";
	if(node.text){
		text = node.text;
	}
	if(node.firstChild){
		text = node.firstChild.nodeValue;
	}
	return text;
};