/*jslint white: true, onevar: true, browser: true, devel: true, undef: true, nomen: true, eqeqeq: true, bitwise: true, regexp: true, newcap: true, immed: true, indent: 4, plusplus: false, maxerr: 96 */
/*globals jQuery, window, location */

var phh = phh || {};
(function ($) {
	
	$(document).ready(function () {
	// $(function () {
		if (phh.options) {
			$.extend(true, phh.prefs, phh.options); // deep, current, additional
		}
		phh.init();			
	}); // eo:ready	   
		   
	phh.init = function () {
		phh.jsCSS();
		// phh.prepLinkRels("Opens in new window");
		phh.accordion.init();
	};
	phh.prefs = {
		// v1.1
		text : { 
			page: "Page" // used by accordion
		}
	};
	phh.jsCSS = function () {
		// v 1.0
		// enable javascript dependent css
		$('body').addClass('js');
	};
	phh.prepLinkRels = function (message) {
		// v 1.0
		// looks for: rel=external
		// use instead of: target _blank 
		message = message || "(Opens in new window)";
		$("a[rel*='external']")
			.click(function () {
				window.open($(this).attr('href'));
				return false;
			})
			.each(function () {
				var title = $(this).attr("title");
				if (!title) {
					$(this).attr("title", message); // this.setAttribute("title", message);
				}
			});
	};
	
	phh.accordion = {
		// v2.4
		/*
			v2.4 .start-closed option added
			v2.3 .toggle-txt option added
		
			requires: phh.prefs.text.page
			requires: core.css		.leaf-inner.closed {display:none;}
			requires: print.css		div.leaf-inner.closed {display:block;}

			.hide & .closed used for printing a fully open accordion
		*/
		
		prefs : {
			start_closed_selector_str : "start-closed",
			toggle_selector_str : "toggle-txt",
			toggle_txt_show : "Click here for full details",
			toggle_txt_hide : "Hide details"
		},
		init : function (options) {		
			var 
				the, settings,
				page_str, 
				hide, removeStyle;

			the = this;
			settings = $.extend(the.prefs, options);
			page_str = phh.prefs.text.page + " ";

			hide = function () {// callback
				$(this)
					.addClass('closed')
					.removeAttr("style")
					;
			};
			removeStyle = function () {
				$(this).removeAttr("style");
			};
			
			$('.accordion').each(function () {
				var $accordion = $(this);
				$('.leaf', this)
					.each(function (i) {
						var 
							page_num, 
							$leaf, 
							$leaf_inner, 
							$a, 
							$span_open_close, 
							$span_hover, 
							leaf_title, 
							$first_leaf_title,
							toggle_txt_flag;	
						
						page_num = i + 1;
						toggle_txt_flag = false;
						
						$leaf = $(this)
							.wrapInner('<div class="leaf-inner"></div>'); 
							
						$leaf_inner = $leaf
							.children('.leaf-inner')
							.eq(0)
							.hide()
							.addClass('closed')
							.removeAttr("style")
							;	

						// if leaf has .toggle-txt class
						toggle_txt_flag = ($leaf.hasClass(settings.toggle_selector_str));
						
						if (toggle_txt_flag) {
							// default guesses that leaf will be closed
							leaf_title = settings.toggle_txt_show;
						} else {
							// if leaf title is not present in html then create it from prefs
							$first_leaf_title = $('.leaf-title:first', this);
							
							leaf_title = $first_leaf_title.text() || page_str + page_num;
							if ($first_leaf_title.hasClass('delete')) {
								$first_leaf_title.remove();
							}
						}
						
						$span_hover = $('<span></span>')
							.text(leaf_title);
						$span_open_close = $('<span></span>')
							.append($span_hover);

						$a = $('<a href="#"></a>');
						$a
							.addClass('leaf-toggle')
							.click(function () {

								if ($leaf_inner.is(':visible')) {
									$leaf
										.removeClass('open')
										.children('.leaf-inner')
										.slideUp('slow', hide)
										;	
										
									if (toggle_txt_flag) {
										$span_hover.text(settings.toggle_txt_show);	
									}
								} else {
									$leaf
										.addClass('open')
										.children('.leaf-inner')
										.slideDown('slow', removeStyle) // removeStyle not necessary
										.removeClass('closed')
										.end()
										.siblings()
										.removeClass('open')
										.filter(':visible')
										.children('.leaf-inner')
										.slideUp('slow', hide)
										;
										
									if (toggle_txt_flag) {
										$span_hover.text(settings.toggle_txt_hide);
										$leaf
											.siblings()
											.filter(settings.toggle_selector_str)
											.find('a.leaf-toggle span span')
											.text(settings.toggle_txt_show)
											;
									}
								}
								$a.blur();
								return false;
							})
							.hover(
								function () {
									$span_hover.addClass("hover");
								}, 
								function () {
									$span_hover.removeClass("hover");
								})
							.append($span_open_close);
						$leaf.prepend($a);
					});
					// eo: each .leaf
					
				if ($accordion.hasClass(settings.start_closed_selector_str)) {
					$accordion.removeClass(settings.start_closed_selector_str);
				} else {
					// opens first leaf of each accordion, remove [this] if only first accordion's leaf of page is required to be open
					$('.leaf:first', this)
						.addClass('open')
						.children('.leaf-inner')
						.show()
						.removeClass('closed')
						.removeAttr("style") // not necessary
						;					
				}
				
				// if a toggle-txt leaf is open then update it's text
				$('.leaf.open', this)
					.filter(settings.toggle_selector_str)
					.find('a.leaf-toggle span span')
					.text(settings.toggle_txt_hide)
					;
			});
			// eo: each .accordion
		}	// eo: init
	};		// phh.accordion
	
}(jQuery));