// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults

// path is like '/somepath?a=b&c=d...
// returns an object, with {'_path': PATH, 'a': 'b' etc}
// does not handle multiple param values, e.g. /somepath?a=b&a=c&a=d...
function parse_path(path) { 
	var to_return = {};
	var q_index = path.indexOf('?');
	var query = undefined;
	if (q_index === -1) {
		query = "";
	} else {
		query = path.substring(q_index+1);
		path = path.substring(0, q_index);
	}
	to_return['_path'] = path;
	// sometimes we want to know what the last bit of the path is
	var parts = path.split("/");
	to_return['_last_path'] = parts[parts.length-1];
	var vars = query.split("&"); 
	for (var i=0;i<vars.length;i++) { 
		var e_index = vars[i].indexOf('=');
		var pair = vars[i].split("="); 
		to_return[pair[0]] = decodeURIComponent(pair[1]);
	} 
	return to_return;
} 


// serializeHash
jQuery.fn.extend({
	'expand': function() {
		this.each(function(i, element) {
			var elem = $(element);
			if (!elem.hasClass('expanded')) {
				elem.addClass('expanded');
				elem.find('.collapsed').removeClass('collapsed');
			}
		});
	},
    'serializeHash': function(more_params) {
        var form_array = $(this[0]).serializeArray();
        var form_values = {};
		$.each(form_array, function(i, key_value) {
            var key = key_value['name'];
            var value = key_value['value'];
			form_values[key] = value;
        });
		return form_values;
    },
	'form_enable': function(form) {
		$(form).find('input[type!="hidden"][data-orig-disabled!=true], textarea[data-orig-disabled!=true]').removeAttr('disabled');
	},
	'form_disable': function(form) {
		$(form).find('input[type!="hidden"], textarea').attr('data-orig-disabled', true).attr('disabled', 'disabled');
	},
	'ajaxify': function() {
		if (!this.hasClass('ajaxified')) {
			this.bind('submit', function(event) {
				event.stopPropagation();
				event.preventDefault();
				var form = $(this);
				_gt_last_ajax_form = form; // remember, we might want to clear the form, or handle errors
				form.form_disable();
				var url = form.attr('action');
				var params = form.serializeHash();
				$.post(url, params, function() {
						form.form_enable();
					}, 'script');
			});
			this.addClass('ajaxified');
		}
	},
	'clear_last_ajaxform': function() {
		if (typeof(_gt_last_ajax_form) != "undefined") {
			var autoclear_richeditor = _gt_last_ajax_form.find('.autoclear.richeditor');
			if (autoclear_richeditor.length > 0) {
				try {
					autoclear_richeditor.ckeditorGet().destroy();
				} catch(e) {
					// ckeditor throws error if it can't find a ckeditor. lame.
					// TODO log error
				}
			}
			_gt_last_ajax_form.find('.autoclear').attr('value', '');
			_gt_last_ajax_form.find('.error_messages').empty();
			_gt_last_ajax_form.find('.error_field').removeClass('error_field');
			_gt_last_ajax_form = undefined;
		}
	},
	// clear the modal dialog AND clear old form values. TODO refactor split
	'clear_modal': function() {
		if (typeof(_tabbel_modal_header) != "undefined" && _tabbel_modal_header != null) {
			_tabbel_modal_header.removeClass('selected');
			_tabbel_modal_header = undefined;
		}
		if (typeof(_tabbel_modal_body) != "undefined" && _tabbel_modal_body != null) {
			_tabbel_modal_body.css({display: 'none'});
			_tabbel_modal_body = undefined;
		}
	},
	'tabbelate': function() {
		this.find('.tabbel_header, .tabbel_body').bind('mouseup', function(event) {
			event.stopPropagation();
		}).bind('mousedown', function(event) {
			event.stopPropagation();
		});
		this.find('.tabbel_header').find('*[data-tabbel-header-for][data-index]').each(function(i, tab_header_element) {
			var h_elem = $(tab_header_element);
			h_elem.click(function(event) {
				event.stopPropagation();
				event.preventDefault();
				var tabbel_id = h_elem.attr('data-tabbel-header-for');
				var index = h_elem.attr('data-index');
				var hide_click = h_elem.hasClass('selected');
				var header_shown = null;
				var body_shown = null;
				// show or hide the body
				$('*[data-tabbel-body-for="'+ tabbel_id +'"]').each(function(i, body_element) {
					var b_elem = $(body_element);
					// if we haven't done so already, register callback to catch events on the body,
					// so say, modal bodies dont disappear when you click on the body
					if (!b_elem.data('consumes_clicks')) {
						b_elem.click(function(event) {
							event.stopPropagation();
						});
						b_elem.data('consumes_clicks', true);
					}
					// rest of logic follows
					if (b_elem.attr('data-index') == index && !hide_click) {
						b_elem.css({display: 'block'});
						body_shown = b_elem;
					} else {
						b_elem.css({display: 'none'});
					}
				});
				// select or not the header
				$('*[data-tabbel-header-for="'+ tabbel_id + '"]').each(function(i, header_element) {
					var h_elem = $(header_element);
					if (h_elem.attr('data-index') == index && !hide_click) {
						h_elem.addClass('selected');
						header_shown = h_elem;
					} else {
						h_elem.removeClass('selected');
					}
				});
				// something special if it's modal
				if (h_elem.attr('data-is-modal')) {
					// hide a previous modal tabbel header
					$(document).clear_modal();
					_tabbel_modal_header = header_shown;
					_tabbel_modal_body = body_shown;
				}
			});
		});
	},
	'prepare': function() {
		var elem = $(this);
		elem.find('.list_item').bind('mouseup', function(event){
			if (event.which == 1) { // left mouse button
				if (!$(this).data('sorting')) {
					if ($(this).attr('data-url')) {
						window.location = $(this).attr('data-url');
					} else {
						$(this).expand();
					}
				}
			}
		});
		// SORTABILITY of List Items
		elem.find('.list_items').sortable({
			start: function(event, ui) {
				var list_item = $(ui.item[0]);
				list_item
					.data('sorting', true)
					.data('start_index', list_item.index());
			},
			stop: function(event, ui) {
				var list_item = $(ui.item[0]);
				list_item
					.data('sorting', false)
					.data('stop_index', list_item.index());
			},
			update: function(event, ui) {
				var list_item = $(ui.item[0]);
				var item_id = list_item.attr('data-item-id');
				var list_id = list_item.parents('.list:eq(0)').attr('data-list-id');
				var params = {
					new_index: list_item.index(), 
					old_index: list_item.data('start_index'),
					_method: 'PUT'
				};
				// tell controller that this item moved to a certain position in target list.
				$.post('/lists/'+list_id+'/items/'+item_id, params, function() {
					// do nothing
				}, 'script');
			}
		});
		//elem.find('.list_item').click(function(){$(this).addClass('expanded').find('.collapsed').removeClass('collapsed');}); //.hoverIntent({sensitivity: 1, interval: 1000, over: function(){$(this).addClass('unfolded').find('.collapsed').removeClass('collapsed');}, out: function(){} } );
		//elem.find('.list_item.list').click(expand_inner_list);
		elem.find('.ajaxform').ajaxify(); // must ajaxify before qtip takes away forms
		/* richeditor is disabled for now. fckeditor sucks so much
		elem.find('.richeditor')
			.click(function(event) {
				event.stopPropagation();
				event.preventDefault();
				if (this.id) { // CKEDITOR borks when it tries to create rich editors with the same id. We use this "feature" to clean up unused editors.
					var old = CKEDITOR.instances[this.id];
					if (old) old.destroy();
				}
				$(this).ckeditor(); 
			});
		*/
		elem.tabbelate();
		return elem;
	}
});

jQuery.extend({
	'prepare': function(html_value) {
		var temp = $(document.createElement('div'));
		temp.append(html_value);
		temp.prepare();
		return temp.find('>*');
	},
	'ajaxform_error': function(error) {
		if (error.fields) {
			_gt_last_ajax_form.find('.error_messages').empty();
			for (var field in error.fields) {
				_gt_last_ajax_form.find('.error_messages').append(error.fields[field]);
				_gt_last_ajax_form.find('.error_messages').append('<br />');
				_gt_last_ajax_form.find('*[for="'+field+'"]').addClass('error');
			}
		}
	}
});


// ON DOCUMENT READY
$(document).ready(function() {

	// when sending ajax requests, make sure we respond with js
	jQuery.ajaxSetup({
		'beforeSend': function(xhr) { xhr.setRequestHeader("Accept", "text/javascript"); }
	});

	$(document).prepare();

	// uncaught click events can clear modal boxes
	// TODO refactor this out, duplicate code
	$(document).click(function(event) {
		$(document).clear_modal();
	});
});
