jQuery.fn.makeTidyable = function(options) {
	var opts = jQuery.extend({},jQuery.fn.makeTidyable.defaults, options);
	return this.each(function(){
		element = jQuery(this);
		tidy_div = jQuery('<div class="tidy-link">');
		tidy_link = jQuery('<a href="#" id="tidy-link-"'+element.attr('id')+'>&uarr; HTML::Tidy</a>');
		tidy_link.click(function() {
			if(opts.codeMirrorMode==true) 
				text_to_tidy = editor.getCode();
			else
				text_to_tidy = element.val();

			jQuery.post('/tools/json_tidy',
				{text: text_to_tidy},
				function(data, status) {
					if(opts.codeMirrorMode==true) 
						editor.setCode(data.text);
					else
						element.val(data.text);

					// deal with messages 
					if(opts.showMessages==true) {
						msg_string="<div>\n<h3>Errors</h3>\n";
						
						if(data.messages.error.length>0) {
						 	msg_string += "<ul class=\"error\" style=\"padding-left:2em;text-align:left\">\n";
							jQuery.each(data.messages.error,function(i,msg){msg_string += "<li>" +msg.line + ", " + msg.col + ": " + htmlEscape(msg.msg) + "</li>\n";});
							msg_string += "</ul>\n";
						}
						msg_string += "<h3>Warnings</h3>\n";
						if(data.messages.warning.length>0) {
							msg_string += "<ul class=\"msg\" style=\"padding-left:2em;text-align:left\">\n";
							jQuery.each(data.messages.warning,function(i,msg){msg_string += "<li>" + msg.line + ", " + msg.col + ": " + htmlEscape(msg.msg) + "</li>\n";});
							msg_string += "</ul>\n";
						}
						msg_string += "<h3>Info</h3>\n";
						if(data.messages.info.length>0) {
							msg_string += "<ul class=\"msg\" style=\"padding-left:2em;text-align:left\">\n";
							jQuery.each(data.messages.info,function(i,msg){msg_string += "<li>" +msg.line + ", " + msg.col + ": " + htmlEscape(msg.msg) + "</li>\n";});
							msg_string += "</ul>\n";
						}
						msg_string += "\n";
						jQuery('#tidy-messages').remove();
						msg_div=jQuery('<div id="tidy-messages" style="text-align:left;">');
						msg_div.append(msg_string);
						tidy_div.append(msg_div);
					}
					msg_div.dialog({title: "HTML::Tidy Messages", width:600, height:500});
				},
				'json'
			);
		});
		tidy_div.append(tidy_link);
		jQuery(this).after(tidy_div);
	});
}

// When using codeMirrorMode, you need to call your CodeMirror object "editor"
// or it won't work.
jQuery.fn.makeTidyable.defaults = {
	showMessages:true,
	codeMirrorMode:false
};

// there must be a nicer way to do this
function htmlEscape(string) {
	tmpDiv = $('<div>');
	tmpDiv.text(string);
	string = tmpDiv.html();
	return string;
};

jQuery.fn.hint = function (blurClass) {
	if (!blurClass) { 
		blurClass = 'blur';
	}
	var $input = jQuery(this),
	title = $input.attr('title'),
	$form = jQuery(this.form),
	$win = jQuery(window);
	function remove() {
		if ($input.val() === title && $input.hasClass(blurClass)) {
			$input.val('').removeClass(blurClass);
			$input.css('color','#000');
		}
	}
	if (title) {  
		$input.blur(function () {
			if (this.value === '') {
				$input.val(title).addClass(blurClass);
				$input.css('color','#aaa');
			}
		}).focus(remove).blur();
		$form.submit(remove);
		$win.unload(remove); // handles Firefox's autocomplete
	}
};

jQuery.fn.tagDelPopup = function() {
	return this.each(function(){
		var element = jQuery(this);
		element.attr('id','tag-delete-ul');
		element.dialog({
			autoOpen: false,
			width: 600,
			modal: true,
			title: 'Remove tags' 
		});
	});
};

jQuery.fn.tagDelAction = function() {
	return this.each(function() {
		var element = jQuery(this);
		element.click(function(){
			$('#tag-delete-ul').empty();
			tag_arr=$('#tag_str').val().split(",");
			ul=$('<ul>');
			$.each(tag_arr, function(i,tag) {
				tag=$.trim(tag);
				tag_linky=tag.replace(/\s+/,'-');
				li=$('<li id="tag-del-'+tag_linky+'">'+tag+'</li>');
				a=$('<a href="#">[X]</a>');
				a.click(function(){
					tag_linky=$.trim(tag_arr[i]).replace(/\s+/g,'-');
					tag_arr.splice(i,1);
					$('#tag-del-'+tag_linky).hide();
					$('#tag_str').val(tag_arr.join(', '));
				});
				li.append(a);
				ul.append(li);
			});
			$('#tag-delete-ul').append(ul);
			$('#tag-delete-ul').dialog('open');
			return false;
		});
	});
};

jQuery.fn.tagAddPopup = function() {
	return this.each(function(){
		var element = jQuery(this);
		element.attr('id','tag-add-ul');
		element.dialog({
			autoOpen: false,
			width: 600,
			modal: false,
			title: 'Add Tags',
			position: 'top'
		});
	});
};

jQuery.fn.tagAddAction = function() {
	return this.each(function(){
		var element = jQuery(this);
		element.click(function(){
				$.getJSON("/tags/json_list_all", 
				function(data)	{
					output='#tag-add-ul';
					link=element;
					$(output).empty();
					$(output).append('<ul class="ul-horizontal-undecorated" id="tag-letter">');
					letter_ul=$('#tag-letter');
					$.each(data.letters, function(i,letter){
						// add the tag list for this letter INNER LOOP!
						ul = $('<ul class="tag-list" style="display:none;" id="tag-list-for-'
							+letter+'"><h3>'+letter+'</h3></ul>');
						$(output).append(ul);
						// Should only be a problem if I manage to make a blank tag
						if(letter)
							letter_tags=eval('data.tags.'+letter);
						else
							return 1;
						$.each(letter_tags, function(i,tag) {
							a = $('<a href="#" id="tag-field-append-' 
								 + tag
								 + '">'
								 + tag
								 + '</a>');
							a.click(function(){
								$('#tag_str').val($('#tag_str').val() + ", " + tag);
							});
							li=$('<li>');
							li.append(a);
							ul.append(li);
						});

						a = $('<a href="#" id="tag-letter-' 
							 + letter
							 + '">'
							 + letter
							 + '</a>');
						a.click(function(){
							$('.tag-list').hide();
							$('#tag-list-for-'+letter).show();
						});
						li=$('<li>');
						li.append(a);
						$(letter_ul).append(li);
					});
				}
			);
			$('#tag-add-ul').dialog('open');
			return false;
		});
	});
};



function show_child_page_breadcrumbs(id,action) {
	$.getJSON("/pages/json_list/"+id, 
			function(data)	{
				output='#breadcrumb-ul';
				link='#breadcrumb-a';
				$(output).empty();
				if(data.pages.length<1) {
					$(link).replaceWith('(No child pages)');
					$(output).replaceWith('(No child pages)');
				}	
				$.each(data.pages, function(i,page){
					var li = '<li><a href="/pages/'+action+'/'+ page.id +'">'+page.title+'</a></li>';
					$(output).append(li);
			    	});
			}
	);
}

// id == pageId to show children of
function reparent_tree(id) {
	$.getJSON("/pages/json_list/"+id, 
			function(data)	{
				output='#reparent-ul';
				link='#reparent-a';
				$(output).empty();
				uplink='<li><h3>'; //;
				if(data.root_page.parent_id>-1) {
					uplink+='<a href=\"#\" onclick="reparent_tree(' 
						+ data.root_page.parent_id 
						+ ');">&uarr;</a>';
				}
				if(data.root_page){
					uplink += data.root_page.title 
						 + ' <a href="#" onclick="reparent(' 
						 + data.root_page.id 
						 + ');">[Set as parent]</a></h3></li>';
				}
				else {
					uplink += 'Root <a href="#" onclick="reparent(0);">[Set as parent]</a></h3></li>';
				}
				$(output).append(uplink);
				$(output).append('<ul id="reparent-kids" />');
				output=('#reparent-kids');
				$.each(data.pages, function(i,page){
					li = '<li>' 
						 + page.title 
						 + ' <a href="#" onclick="reparent_tree('
						 + page.id 
						 + ');">[+]</a> <a href="#" onclick="reparent(' 
						 + page.id 
						 + ');">[Set as parent]</a></li>';
					$(output).append(li);
			    	});
			}
	);

}

//parent id new parent id
function reparent(parent_id) {
	$('#reparent-ul').dialog('close');
	$('#parent_id').val(parent_id);
	$('#msg').html('<p class="msg">Set parent id to ' + parent_id + '. You\'ll need to hit submit if you really want to change it.</p>');
}

// id == pageId to show children of
function show_children(id) {
	$.getJSON("/pages/json_list/"+id, 
			function(data)	{
				list='#child-pages-of-'+id;
				if(data.pages.length<1) {
					link = '#children-shown-'+id; 
					$(link).replaceWith(" (No child pages)");
					$(list).remove();
			    	}	
				$.each(data.pages, function(i,page){
					var li = '<li><a class="child-tree" id="children-shown-' + page.id + '" href="#" onclick="show_children(' + page.id + ');">[+]</a> ' + page.title + ' [<a href="/pages/edit/' + page.id + '">Edit</a> | <a href="http://charlieharvey.org.uk/dbpage.pl?id=' + page.id + '">Live &raquo;</a>]<ul class="ul-undecorated" id="child-pages-of-' + page.id + '" style="display:none;"></ul></li>';
					$(list).append(li);

					if(i==(data.pages.length-1)) {
						$(list).fadeIn(300);	
						link = '#children-shown-'+id; 
						$(link).attr('onclick','');
						$(link).unbind();
						$(link).click(function(event) { hide_children(id)});
						$(link).html('[&ndash;]');
					}
			    });
			}
	);	
}

// id == pageId to show children of
function hide_children(id) {
	list = "#child-pages-of-"+id;
	$(list).fadeOut();
	link = '#children-shown-'+id; 
	$(link).unbind();
	$(link).click(function(event) { show_children(id)});
	$(link).html('[+]');
	$(list).empty();			
}


