
var PhoneCanvass = function() {

	var PC = self;

	var m = {};

	m.update_date_range = function() {
		
	};

	m.init = function() {
		$('dl#call-log dd:not(:first)').each(function() {
			$(this).css('display', 'none');
		});

		var dt_el_list = $('dl#call-log dt');
		dt_el_list.each(function() {
			$(this).css('cursor', 'pointer');
		});
		dt_el_list.click(function() {
			$(this).next('dd').slideToggle('fast');
		});
	};

	$(document).ready(function() {
		m.init();
	});

	return m;

}();

$(document).ready(function() {

	$('.calendar').datepicker({
		dateFormat : 'yy-mm-dd'
	});

});

jQuery(document).ready(init_collapsible);

function init_collapsible() {

	var html = '<span> (<a class="show" href="#">Show</a><a class="hide" href="#">Hide</a>)</span>';

	jQuery('div.inline-group').each(function() {
		var inline_group = $(this);
		$('h2', inline_group).append($(html));
		$('h2 a.show', inline_group).click(function() {
			show_collapse_inline(inline_group);
			return false;
		});
		$('h2 a.hide', inline_group).click(function() {
			hide_collapse_inline(inline_group);
			return false;
		});
		hide_collapse_inline(inline_group);
	});

}

function show_collapse_inline(inline_group) {
	$('a.show', inline_group).hide();
	$('a.hide', inline_group).hide();
	$('fieldset', inline_group).removeClass('collapsed');
	$('fieldset', inline_group).addClass('expanded');
}

function hide_collapse_inline(inline_group) {
	$('a.hide', inline_group).hide();
	$('a.show', inline_group).show();
	$('fieldset', inline_group).addClass('collapsed');
	$('fieldset', inline_group).removeClass('expanded');
}


$(document).ready(function() {

//	var title      = $('.comment-form h4');
//	var title_text = title.text();
//	title.empty().append('<a href="#">'+title_text+'</a>');

	$("div.comment-form").accordion({'header' : 'h4'});

});

$(document).ready(function() {
	$(".comment-form").accordion({'header' : 'h4'});
});

var DateRange = function(date_range_el) {

	var dr = this;

	dr.date_range_el = date_range_el;
	dr.range_type_el = $('.range-type', date_range_el);
	dr.start_date_el = $('.start-date', date_range_el);
	dr.end_date_el   = $('.end-date',   date_range_el);

	dr.range_type_el.change(function() {
		dr.on_type_change();
	});

	dr.on_type_change();

};

DateRange.prototype.on_type_change = function() {

	var start_date_reqd = ['after', 'on', 'between'];
	var end_date_reqd   = ['before', 'between'];
	var curr_type       = this.range_type_el.val();

	if ($.inArray(curr_type, start_date_reqd) != -1) {
		this.start_date_el.removeAttr('disabled');
	} else {
		this.start_date_el.attr('disabled', 'disabled');
	}

	if ($.inArray(curr_type, end_date_reqd) != -1) {
		this.end_date_el.removeAttr('disabled');
	} else {
		this.end_date_el.attr('disabled', 'disabled');
	}

};

var DateRangeManager = function() {

	var m = {};

	m.date_ranges = [];

	m.init = function() {

		$('div.date-range').each(function() {
			var new_date_range = new DateRange($(this));
			m.date_ranges.push(new_date_range);
		});

	};

	$(document).ready(function() {
		m.init();
	});

	return m;

}();



$(document).ready(function() {
	init_new_event_form();
});

function init_new_event_form() {
	$('#id_previous_event').change(function() {
		previous_event_changed();
	});
	$('#id_previous_venue').change(function() {
		previous_venue_changed();
	});

	previous_event_changed();
	previous_venue_changed();
};

function previous_event_changed() {
	var elem = $('#id_previous_event');
	if (elem.val() == null || elem.val() == '') {
		$('#id_previous_event').closest('dl').nextAll('dl').eq(0).slideDown('fast');
	} else {
		$('#id_previous_event').closest('dl').nextAll('dl').eq(0).slideUp('fast');
	};
};

function previous_venue_changed() {
	var elem = $('#id_previous_venue');
	if (elem.val() == null || elem.val() == '') {
		$('#id_previous_venue').closest('dl').nextAll('dl').eq(0).slideDown('fast');
	} else {
		$('#id_previous_venue').closest('dl').nextAll('dl').eq(0).slideUp('fast');
	};
};


// Used to allow certain sections of the website to be
// expandable

$(document).ready(function() {
/*
	$('head').append(
		'<link rel="Stylesheet" type="text/css" href="'+STATIC_URL+'css/expandable.css"/>'
	);
*/
	$('.expandable:not(.expanded)').addClass('collapsed');
	
	$('.expandable > .title').live('click', function() {
		$(this).closest('.expandable').toggleClass(
			'expanded collapsed'
		);
	});

});



function open_dialog() {
	$('#login-form').toggle('fast');
	$('#login-form #topbar_username').focus();
	return false;
}

function login_init() {
	$('#login-link').click(open_dialog);
};

$(document).ready(function() {
	login_init();
});


// Extension of jQuery to support selected text manipulating in inputs and
// textareas
(function($) {

	$.fn.getSelectionRange = function() {

		var field = this[0];

		return [field.selectionStart, field.selectionEnd];

	};

	$.fn.setSelectionRange = function(range_start, range_end) {

		var field = this[0];

		field.selectionStart = range_start;
		field.selectionEnd   = range_end;

		return this;

	};

	$.fn.getSelection = function() {

		var $this = this.eq(0);
		var field = $this[0];

		var sel_range = $this.getSelectionRange();

		if (sel_range[0] == sel_range[1])
			return null;
		else
			return field.value.substring(sel_range[0], sel_range[1]);

	};

	$.fn.replaceSelection = function(new_text) {

		var $this = this.eq(0);
		var field = $this[0];

		var sel_range = $this.getSelectionRange();

		field.value = 
			field.value.substring(0, sel_range[0]) +
			new_text +
			field.value.substring(sel_range[1]);

		$this.setSelectionRange(sel_range[0], sel_range[0]+new_text.length);

		return this;

	};

	$.fn.insertBeforeSelection = function(text) {

		var $this = this.eq(0);
		var field = $this[0];

		var sel_range = $this.getSelectionRange();

		field.value =
			field.value.substring(0, sel_range[0]) +
			text +
			field.value.substring(sel_range[0]);

		$this.setSelectionRange(sel_range[0]+text.length, sel_range[1]+text.length);

		return this;

	};

	$.fn.removeBeforeSelection = function(num_chars) {

		var $this = this.eq(0);
		var field = $this[0];

		var sel_range = $this.getSelectionRange();

		if (num_chars == null) {
			// Remove everything before the start of the selection
			num_chars   = sel_range[0];
			field.value = field.value.substring(sel_range[0]);
		} else
			// Remove the specified number of characters before the selection
			field.value =
				field.value.substring(0, sel_range[0]-num_chars) +
				field.value.substring(sel_range[0]);

		var sel_range = $this.getSelectionRange();
		$this.setSelectionRange(sel_range[0]-num_chars, sel_range[1]-num_chars);

	};

	$.fn.insertAfterSelection = function(text) {

		var $this = this.eq(0);
		var field = $this[0];

		var sel_range = $this.getSelectionRange();

		field.value =
			field.value.substring(0, sel_range[1]) +
			text +
			field.value.substring(sel_range[1]);

		// For some reason the above screws up the current selection range so we
		// reset it here. Because we've only inserted after the selection range
		// we can just use the same values
		$this.setSelectionRange(sel_range[0], sel_range[1]);

		return this;

	};

	$.fn.removeAfterSelection = function(num_chars) {

		var $this = this.eq(0);
		var field = $this[0];

		var sel_range = $this.getSelectionRange();

		if (num_chars == null)
			// Remove everything after the end of the selection
			field.value = field.value.substring(0, sel_range[1]);
		else
			// Remove the specified number of characters after the selection
			field.value =
				field.value.substring(0, sel_range[1]) +
				field.value.substring(sel_range[1]+num_chars);

		// For some reason the above screws up the current selection range so we
		// reset it here. Because we've only inserted after the selection range
		// we can just use the same values
		$this.setSelectionRange(sel_range[0], sel_range[1]);

	};

	$.fn.beforeSelection = function(num_chars) {

		var $this = this.eq(0);
		var field = $this[0];

		var sel_start = $this.getSelectionRange()[0];

		if (num_chars == null)
			return field.value.substring(0, sel_start);
		else
			return field.value.substring(sel_start-num_chars, sel_start);

	};

	$.fn.afterSelection = function(num_chars) {

		var $this = this.eq(0);
		var field = $this[0];

		var sel_end = $this.getSelectionRange()[1];

		if (num_chars == null)
			return field.value.substring(sel_end);
		else
			return field.value.substring(sel_end, sel_end+num_chars);

	};

})(jQuery);

function MarkupTextarea(textarea) {

	var mta = this;

	mta.$textarea = $(textarea);

	mta.$markup_options = $(
		'<div class="markup-options">' +
		'  <span class="bold"   title="Bold"><img src="/static/images/admin/bold.png"     alt="Bold"  /></span>' +
		'  <span class="italic" title="Italic"><img src="/static/images/admin/italic.png" alt="Italic"/></span>' +
		'  <span class="bullet" title="List"><img src="/static/images/admin/bullets.png"  alt="List"  /></span>' +
		'  <span class="euro"   title="Euro"><img src="/static/images/admin/euro.png"     alt="Euro"  /></span>' +
		'</div>'
	);

	$('.bold', mta.$markup_options).click(function() {
		mta.toggle_markup('B');
		mta.$textarea.focus();
	});
	$('.italic', mta.$markup_options).click(function() {
		mta.toggle_markup('I');
		mta.$textarea.focus();
	});
	$('.bullet', mta.$markup_options).click(function() {
		mta.toggle_markup('#');
		mta.$textarea.focus();
	});
	$('.euro', mta.$markup_options).click(function() {
		mta.toggle_markup('E');
		mta.$textarea.focus();
	});
	mta.$textarea.before(mta.$markup_options);

}

MarkupTextarea.prototype.toggle_markup = function(type) {

	var $textarea = this.$textarea;

	var selection = $textarea.getSelection();
	var sel_range = $textarea.getSelectionRange();

	if (selection != null) {
		if (selection.substring(0, 1) == '\n') {
			$textarea.setSelectionRange(sel_range[0]+1, sel_range[1]);
			selection = $textarea.getSelection();
			sel_range = $textarea.getSelectionRange();
		};
		if (selection.substring(selection.length-1) == '\n') {
			$textarea.setSelectionRange(sel_range[0], sel_range[1]-1);
			selection = $textarea.getSelection();
			sel_range = $textarea.getSelectionRange();
		};
	};

	if (type == 'E') {

		// Simple euro symbol insertion

		// TODO: UTF-8?
		$textarea.insertBeforeSelection('€');

	} else if (type == '#') {

		// Bullets - works dfferently to other markup: on a
		// per-line basis

		if (selection == null)
			var no_sel = true;
		else
			var no_sel = false;

		// Find the start of the first selected line
		if (sel_range[0] == 0) {
			// Nothing to do - we're already at the start of the
			// input data
		} else if ($textarea.beforeSelection(1) == '\n') {
			// Nothing to do - the character immediately before
			// the start of the selection is a return character
		} else {
			var last_cr_pos = $textarea.beforeSelection().lastIndexOf('\n');
			if (last_cr_pos == -1)
				// No return before the selection - select to the
				// start of the input
				$textarea.setSelectionRange(0, sel_range[1]);
			else
				$textarea.setSelectionRange(
					last_cr_pos+1,
					sel_range[1]
				);
			selection = $textarea.getSelection();
			sel_range = $textarea.getSelectionRange();
		};

		if (selection == null)
			selection = '';

		if (selection.substring(0, 1) == '#') {
			//
			// Bullets already specified - remove
			//

			// Remove the first bullet
			if (selection.substring(0, 2) == '# ') {
				selection     = selection.substring(2);
				sel_range[1] -= 2;
			} else {
				selection     = selection.substring(1);
				sel_range[1] -= 1;
			};

			// Remove other bullets
			while (selection.indexOf('\n# ') != -1) {
				selection = selection.replace('\n# ', '\n');
				sel_range[1] -= 2;
			};
			while (selection.indexOf('\n#') != -1) {
				selection = selection.replace('\n#', '\n');
				sel_range[1] -= 1;
			};

			$textarea.replaceSelection(selection);

		} else {

			selection     = '# ' + selection;
			sel_range[1] += 2;

			while(selection.search(/\n[^#]/) != -1) {
				var pos   = selection.search(/\n[^#]/);
				selection = 
					selection.substring(0, pos+1) +
					'# ' +
					selection.substring(pos+1);
				sel_range[1] += 2;
			};

			$textarea.replaceSelection(selection);

		};

		if (no_sel)
			$textarea.setSelectionRange(sel_range[1], sel_range[1]);
		else
			$textarea.setSelectionRange(sel_range[0], sel_range[1]);

	} else {

		if (type == 'B') {
			var markup_start = '[*';
			var markup_end   = '*]';
		} else if (type == 'I') {
			var markup_start = '[/';
			var markup_end   = '/]';
		};

		var cr_start = false;
		var cr_end   = false;

		if (
			$textarea.beforeSelection(markup_start.length) == markup_start &&
			$textarea.afterSelection(markup_end.length)    == markup_end
		) {

			// Markup already appears - remove
			$textarea.removeBeforeSelection(markup_start.length);
			$textarea.removeAfterSelection(markup_end.length);

			if ($textarea.getSelection() != null)
				$textarea.replaceSelection($textarea.getSelection().replace(markup_end+'\n'+markup_start, '\n'));

		} else {

			// Markup does not appear - insert
			$textarea.insertBeforeSelection(markup_start);
			$textarea.insertAfterSelection(markup_end);

			if ($textarea.getSelection() != null)
				$textarea.replaceSelection($textarea.getSelection().replace('\n', markup_end+'\n'+markup_start));

		};

	};

	$textarea.focus();
	var sel_range = $textarea.getSelectionRange();
	$textarea.setSelectionRange(sel_range[0], sel_range[1]);

};

$(document).ready(function() {
	$('.markup-text').each(function() {
		new MarkupTextarea(this);
	});
});


var PhoneCanvass = function() {

	var PC = self;

	var m = {};

	m.outcome_el = null;
/*
	m.call_outcome_changed = function() {
		if (PC.outcome_el.val() != '') {
			$('#id_text').slideDown('fast');
		} else {
			$('#id_text').slideUp('fast');
		}
	};
*/
	m.init = function() {
//		PC.outcome_el = $('#id_call_outcome');
//		PC.outcome_el.bind('change', m.call_outcome_changed);
		$('dl#call-log dd:not(:first)').each(function() {
			$(this).css('display', 'none');
		});

		var dt_el_list = $('dl#call-log dt');
		dt_el_list.each(function() {
			$(this).css('cursor', 'pointer');
		});
		dt_el_list.click(function() {
			$(this).next('dd').slideToggle('fast');
		});
	};

	$(document).ready(function() {
		m.init();
	});

	return m;

}();


jQuery(function($) {
	$('.module table tbody').sortable({
		handle: 'td.display_order',
		update: function() {
			$(this).find('tr').each(function(i) {
				if ($(this).find('input[class$=vTextField]').val()) {
					$(this).find('input[id$=display_order]').val(i+1);
				}
			});
		}
	});
	$('.module tbody td.display_order').css('cursor', 'move');
});


