(function($) {
	
	$.fn.extend({
		
		/* ------------------------------------------------
		 * @plugin		m3Placeholder
		 * @created		May 19, 2010
		 * ------------------------------------------------
		 * displays placeholder value when field is empty,
		 * clears the field when it is focused on or when a
		 * value is entered (other than the placeholder's value)
		 */
		
		m3Placeholder: function(options) {
			var defaults = {
				attr_placeholder: "placeholder", // attribute name
				class_placeholder: "placeholder" // class name
			};
			
			var options = $.extend(defaults, options);
			var self = this;
		
			return this.each(function() {
				
				var element = $(this);
				var placeholder_value = element.attr(options.attr_placeholder);
				
				function clear() {
					element.removeClass(options.attr_placeholder);
					
					if (element.val() == placeholder_value) {
						element.val("");
					}
				}
				
				function display() {
					if ((element.val() == "") || (element.val() == placeholder_value)) {
						element.val(placeholder_value).addClass(options.attr_placeholder).removeClass("error");
					}
				}
				
				display();
				
				element
					.change(clear)
					.focus(clear)
					.blur(display)
					.parents('form').submit(clear)
				;

			});
		},
		// end m3Placeholder
		
		/* ------------------------------------------------
		 * @plugin		m3Toggle
		 * @created		May 19, 2010
		 * -----------------------------------------------*/
		/*
			toggles the panel element corresponding with the trigger element. by default,
			the panel element is the next element after the trigger, but it can also be
			the previous element or an element to be determined by a set selector.
		 */
		
		m3Toggle: function(options) {
			
			var defaults = {
				panelSelector: null,
				opened: false,
				ajax: null,
				openedSelector: "opened",
				closedSelector: "closed",
				direction: 'next',
				labelOpen: null,
				onOpen: function(){},
				onClose: function(){},
				onAfterOpen: function() {},
				onAfterClose: function() {}
			};

			var options = $.extend(defaults, options);
			var self = this;
			
			return this.each(function() {
				
				var element = $(this);
				
				if (options.panelSelector !== null) {
					var panel = element.siblings(options.panelSelector);
				}
				else {
					if (options.direction === 'next') {
						var panel = element.next(options.panelSelector);
					}
					else if (options.direction === 'prev') {
						var panel = element.prev(options.panelSelector);
					}
				}
				
				// store some original values that we might need later
				var panelLabel = element.text(),
					panelOpacity = panel.css('opacity'),
					panelWidth = panel.width(),
					panelHeight = panel.height()
				;
				
				function markOpened() {
					element.removeClass(options.closedSelector).addClass(options.openedSelector);
					
					if (null !== typeof options.labelOpen) {
						element.text(options.labelOpen);
					}
				}
				
				function markClosed(){
					element.addClass(options.closedSelector).removeClass(options.openedSelector);
					
					if (null !== typeof options.labelOpen) {
						element.text(panelLabel);
					}
				}
				
				if (null !== options.ajax) {
					$.ajax({
						type: 'GET',
						url: options.ajax,
						success: function(content) {
							panel.html(content);
							
							// panel content has been altered, store the new width and height value
							panelWidth = panel.width(),
							panelHeight = panel.height()
						}
					});
				}
				
				if (false === options.opened) {
					panel.hide();
					markClosed();
				}
				else {
					markOpened();
				}
				
				element.click(function(e) {
					if (panel.is(":hidden")) {
						panel.show();
						options.onOpen.call(panel);
						
						// inspect the visibility, width, height and opacity of the panel. if they all equal the original values,
						// the panel is in its original state and declared 'opened'
						var trackerOpen = setInterval(function() {
							if (panel.is(':visible') && panel.css('opacity') === panelOpacity && panel.width() == panelWidth && panel.height() && panelHeight) {
								clearInterval(trackerOpen);
								markOpened();
								options.onAfterOpen.call(panel);
							}
						}, 100);
					}
					else {
						panel.hide();
						options.onClose.call(panel);
						
						// inspect the invisibility of the panel
						var trackerClose = setInterval(function() {
							if (panel.is(':hidden')) {
								clearInterval(trackerClose);
								markClosed();
								options.onAfterClose.call(panel);
							}
						}, 100);
					}
					return false;
				});
			});
		},
		// end m3Toggle
		
		/* ------------------------------------------------
		 * @plugin		m3LiveResults
		 * @created		June 18, 2010
		 * -----------------------------------------------*/
		/*
			...
		 */
		
		/* ------------------------------------------------
		 * @plugin		m3LiveResults
		 * @created		June 18, 2010
		 * -----------------------------------------------*/
		/*
			...
		 */

		m3LiveResults: function(options) {
			
			var defaults = {
				resultsSelector: '.container_results',
				paginationSelector: '.pagination',
				pageSelector: "a[rel='page_nav']",
				resultsNode: null,
				paginationNode: null,
				onFilter: function(){},
				onPage: function(){},
				onSort: function(){},
				onReponse: function(){},
				onGroup: function(){},
				onResponseAfterFilter: function(){}, // response
				onResponseAfterPage: function(){},
				onResponseAfterSort: function(){},
				onNextDate: function(){}
			};

			var options = $.extend(defaults, options);
			var self = this;
			
			return this.each(function() {
				
				var results = $(this);
				var form = results.find("form");
				var filters = form.find(":input"); // selects all input, textarea, select and button elements. 
				var pages = results.find(options.pageSelector);
				var containerResults = results.find(options.resultsSelector);
				var containerPagination = results.find(options.paginationSelector);
				
				var group = false;
				
				if (containerResults.length === 0) {
					//return;
				}
				
				var isLoading = false;
				
				/*
				var loadingScreen = "<div id='loading' style='position: absolute'>";
					loadingScreen += "<div id='loading_progress'></div>";
					loadingScreen += "<div id='loading_screen' style='position: absolute'></div>";
					loadingScreen += "</div>";
				
				loadingScreen = $(loadingScreen);
				
				function setupLoading() {
					
					loadingScreen.prependTo(results);
					
					loadingScreen.css({
						width: '610px',
						height: $("#container_agenda_results").outerHeight(),
						left: containerResults.position().left,
						top: containerResults.position().top
					});
					
					loadingScreen.find("#loading_screen").css({
						width: '610px',
						height: $("#container_agenda_results").outerHeight()
					});
					
					loadingScreen.hide();
									
				}
			
				
				function showLoadingScreen() {
					loadingScreen.css({
						left: containerResults.position().left,
						top: containerResults.position().top
					});
					
					loadingScreen.show();
				}
				*/
				
				var agendaResults = $("#col_results");
	
				var loadingScreen = $('<div></div>')
					.css({
						position           : 'absolute',
						zIndex             : 999,
						width              : $("#main").outerWidth(true),
						height             : $("#main").height(),
						left               : $("#main").offset().left,
						top                : $("#main").offset().top,
						opacity            : 0.8,
						backgroundImage    : 'url(/tiqets/templates/default/images/backgrounds/loading-events.gif)',
						backgroundRepeat   : 'no-repeat',
						backgroundPosition : 'center 300px',
						backgroundColor    : 'white'
					})
					.prependTo($("body"))
				;
				
				loadingScreen.hide();
				
				function getResults (event) {
					
					if ($(event.target).is(options.pageSelector)) {
						
						$("#filter_bar form").find(":input[name='pg']").val( $(event.target).text() );
						
						options.onPage.call( $(event.target) );
					}
					
					else if (group) {
						
						var targetEl = $(event.target);
						var groupUrl, groupParts, groupParam, groupDate, i;
						
						groupUrl = targetEl.closest('.heading').find('a').attr('href');
						
						if (targetEl.is('p.view_all > a')) {
							groupUrl = targetEl.attr('href');
						} else {
							targetEl.closest('.heading').find('a').attr('href');
						}
						
						groupParts = groupUrl.split('&');
						
						for (i=0; i<groupParts.length; i++) {
							
							groupParam = groupParts[i];
							
							if (groupParam.indexOf('date_day') > -1 && groupParam != "date_day=") {
								groupDate = groupParam.split('=')[1];
							}
						}
						
						
						$("#filter_bar form").find(":input[name='type']").val('details');
						
						if ($("select#filter_date_day").length) {
							$("select#filter_date_day").find('option[value="' + groupDate + '"]').attr('selected', 'selected');
							
						}else {
							$("#filter_bar form").find(":input[name='date_day']").val(groupDate);
						}
						
						group = false;
					}
					
					else {
						$("#filter_bar form").find(":input[name='pg']").val(1);
						$("#filter_bar form").find(":input[name='type']").val('');
						//$("#filter_bar form").find(":input[name='date_range']").val('');
					}
					
					if (!isLoading) {
						
						loadingScreen.show();
						
						$.ajax({
							url: form.attr('action'),
							//data: form.serialize(),
							data: $("#filter_bar form").serialize(),
							dataType: "xml",
							success: function(response) {
								
								var responseResults = (null === options.resultsNode)
									? response
									: $(response).find(options.resultsNode)
								;
								
								// paginatie
								if (null !== options.paginationNode) {
									$("#container_pagination").html(  $(response).find(options.paginationNode).text() )
								}
								
								// page title
								document.title = $(response).find("page_title").text();
								
								// heading (h1)
								$("#heading_main h1").text($(response).find('title').text());
								
								// agenda summary
								$("#agenda_summary").html($(response).find('agenda').text());
								
								// summary
								$("#heading_sub h3").html( $(response).find("summary").text() );
								
								// filters
								$("#filter_bar").html(  $(response).find("filters").text() );
								
								// tickets
								containerResults.html( $(responseResults).text() );
								
								options.onResponse.call( $(response) );
								
								loadingScreen.hide();
							}
						});
					}
					
					return false;
				}
				
				//setupLoading();
				filters.live("change", function(e) {
					getResults(e);
					options.onFilter.call( $(e.target) );
				});
				
				pages.live("click", function(e) {
					
					e.preventDefault();
					getResults(e);
					options.onPage.call( $(e.target) );
				});
				
				$(".next_results a").live("click",function(e) {
					e.preventDefault();
					options.onNextDate.call( $(e.target) );
				});
				
				$(".result").find(".heading, .container_products .view_all > a").live("click", function(e) {
					
					group = true;
					e.preventDefault();
					getResults(e);
						
					options.onGroup.call( $(e.target) );
				});
			});
		},
		// end m3LiveResults
		/* ------------------------------------------------
		* @plugin			m3MasterCheckbox
		* @created			 June 4, 2010
		* ------------------------------------------------
		*
		*/

		m3MasterCheckbox: function(options) {
			
			var defaults = {
				isDisabled: true
			};
			
			var options = $.extend(defaults, options);
			var self = this;
			
			return this.each(function() {
				
				var master = $(this);
				var slaves = $(":checkbox[name='" +  master.attr("name") + "']").not(master);
				
				function isActive() {
					
					return !slaves.is(":checked");
				}
					
				function setMaster() {
					
					master.attr("checked", !slaves.is(":checked"));
					
					if (options.isDisabled) {
						master.attr("disabled", !slaves.is(":checked"));
					}
				}
				
				setMaster();
				
				slaves.click(setMaster);
				
				master.click(function() {
					
					if (this.checked) {
						slaves.attr("checked", false);
					}
					
					if (!this.checked) {
						$(this).attr("checked", true);
					}
					
					if (options.isDisabled) {
						$(this).attr("disabled", true);
					}
				})
			});
		},
		/* ------------------------------------------------
		* @plugin			  m3ColumnizeList
		* @created			 June 10, 2010
		* ------------------------------------------------
		*
		*/

		m3ColumnizeList: function(numColumns, options) {
		   
			var defaults = {
				itemSelector: 'li',
				itemWrapperTag: '<ul />',
				columnClass: 'col',
				wrapperClass: 'col_wrapper'
			};
		   
			var options = $.extend(defaults, options);
			var numColumns = numColumns;
		   
			return this.each(function() {
			   
				var list = $(this);
				var columnWrapper = $("<div class='" + options.wrapperClass + "'style='overflow: hidden' />");
				//var items = $(this).find(options.itemSelector).clone();
				var items = $(this).find(options.itemSelector);
				var numItemsPerSet = Math.ceil(items.length / numColumns);
				
				list.before(columnWrapper);
			   
				for (var iCol = 0; iCol < numColumns; iCol++) {
					
					var column = [];
					var columnIndex = iCol+1;
					var columnClass = options.columnClass + columnIndex;
					var columnEl = $("<div class='" + options.columnClass + " " + columnClass + "'/>");
				   
					columnEl.appendTo(columnWrapper).addClass(options.columnClass + " " + columnClass);
				   
					for (var iItem = (iCol * numItemsPerSet); iItem < columnIndex * numItemsPerSet; iItem++) {
						if ('undefined' !== typeof  items[iItem]) {
							column.push(items[iItem]);
						}
					}
					
					$(column).appendTo(columnEl);
									   
					if (false !== options.itemWrapperTag) {
						$(column).wrapAll(options.itemWrapperTag);
					}
				}
				
				list.remove();
			});
		}
		// end m3ColumnizeList
	});
})(jQuery);

$(function() {
	
	/* ------------------------------------------------
	 * selectors
	 * ------------------------------------------------
	 * hasPlaceholder: returns all elements with placeholder attribute
	 */
	
	$.expr[':'].hasPlaceholder = function(el) {
		return (typeof $(el).attr('placeholder') !== 'undefined');
	};
	
	// for styling purposes
	$("body").addClass("js_enabled");
	
	// add target attribute to all anchors which href value starts with 'http://' (and therefore most likely an external link)
	$('a[href^="http://"][target!="_self"]').attr("target", "_blank");
	
});

// log() shortcut for console log function 
window.log = (typeof console == "object") ? console.log : function() {};

