/*
**                   
**             File: registerguard.js
**            Title: The Register-Guard Javascript, v.2.0
**         Site URL: http://www.registerguard.com/
**      Description: Base javascript for website: http://www.registerguard.com/
**          Created: 04/27/08
**         Modified: 09/18/09
**           Author: Micky Hulse <micky.hulse@registerguard.com>
**                   
*/

/*
** =========================================================
** Variables:
** =========================================================
*/

// Paths:
var asset_location = 'http://rg-assets.s3.amazonaws.com'; // Use this variable to specify absolute path to any assets used in any/all RG JS files.
var image_path = '/v3.5/images/template';
var standing_image_path = '/images/standing/';
var empty_png = '/empty.png';
var loader_gif = '/loader-01.gif';
var cookie_path = '/';
var cookie_domain = 'registerguard.com';

// Misc. options:
var fade_speed_01 = 'slow';
var fade_speed_02 = 'fast';

// Strings:
var search_cookie = 'search'; /* Search options cookie name. */
var poll_cookie = 'poll'; /* Poll cookie name. */
var class_toggle = 'toggle';
var disabled_attr = 'disabled';
var show_text = 'More';
var hide_text = 'Less';

// Integers:
var cookie_expires_01 = 5; // Days until cookie expires.
var cookie_expires_02 = 365; // One year.

// Other:
var loader_img = '<img src="XXX" alt="Loading...">'; // Loader image.

/*
** =========================================================
** Functions:
** =========================================================
*/

/*
** Very simple input validation.
** <http://malsup.com/jquery/form/>
*/
function validate(formData, jqForm) {
	var valid = true; // Initialize.
	var error_class = 'error';
	var $form = jqForm[0]; // Reference the form.
	var required = $form.Required.value.split(","); // Get required field names.
	$('#' + $form.id + ' input, #' + $form.id + ' textarea').removeClass(error_class); // Only checking textarea's and input's.
	for(var i=0; i<required.length; i++) {
		if(!$form[required[i]].value) {
			valid = false; // One of the fields did not pass validation.
			$('#' + $form.id + ' input[name=' + required[i] + '], #' + $form.id + ' textarea[name=' + required[i] + ']').addClass(error_class); // Highlight field. Only checking textarea's and input's.
		}
	}
	return valid; // Return bool of true of false.
} // validate()

function showRecaptcha(element, themeName) {
	Recaptcha.create("6LedNQQAAAAAAC17ZZcK-gbXyLVtSDkobgl9_QTF", element, {
		theme: themeName,
		tabindex: 0
	});
}

/*
** =========================================================
** Start closure:
** =========================================================
*/

$(function() {
	
	/*
	** =========================================================
	** Object references:
	** =========================================================
	*/
	
	// Master object referneces:
	var $search = $('#search'); // Search container.
		var $finder = $('#fm_finder'); // Replacement for $search.
	var $font_sizer = $('#fontSizer'); // Font re-sizer.
	var $tabs = $('.tabs'); // Tabs.
	var $rel_external = $('a[rel$="external"]'); // New window links.
	var $widget = $('#widget'); // Search/weather elements.
	var $loader = $('.loader'); // Ajax "loading" graphic.
	var $fm_email = $('form#fm_email'); // E-mail (CSP) form.
	var $fm_comment = $('form#fm_comment'); // Comment (CSP) form.
	var $fm_poll = $('form#fm_poll'); // Poll (CSP) form.
	var $pop = $('.pop'); // Pop-open windows.
	var $map = $('#story-map-tab');
	var $fade = $('.fade'); // Innerfade.
	var $expand = $('.expandable'); // Expandable.
	var $alt_nav_ul = $('#mm #altNav ul.folio'); // Multimedia page alt nav.
	var $drawer = $('.drawer'); // Show/hide list items.
	var $multimedia = $('#multimedia'); // Multimedia tease box.
	var $date_picker = $('input.datePicker'); // UI Datepicker for form inputs.
	var $time_picker = $('input.timePicker'); // "Timepickr" for form inputs.
	var $tabular = $('table.tabular'); // Table sorting.
	var $shuffle = $('.shuffle'); // Shuffle object's children?
	var $prettify = $('form.prettify');
	// Modal windows:
		var $modal01 = $('#modal01');
		var $modal02 = $('#modal02');
		var $modal03 = $('#modal03');
	
	// Key/value objects:
	var $anim_options_01 = { opacity: 'toggle' };
	var $anim_options_02 = { opacity: 'toggle', height: 'toggle', speed: 'slow' };
	var $attr_options_01 = { disabled: 'disabled' };
	var $attr_options_02 = { method: 'get' };
	var $attr_options_03 = { method: 'post' };
	
	/*
	** =========================================================
	** Settings:
	** =========================================================
	*/
	
	/* Override the default easing method.
	** http://gsgd.co.uk/sandbox/jquery/easing/ */
	//jQuery.easing.def = 'easeInQuad';
	
	/*
	** =========================================================
	** Business:
	** =========================================================
	*/
	
	// Font sizer:
	if($font_sizer.length > 0) {
		var $font_sizer_decrease = $("#decrease a");
		var $font_sizer_increase = $("#increase a");
		var $font_sizer_reset = $("#reset a");
		var $font_sizer_options = { min: -1, max: 5, targ: '#story, #comments .comment' }; // Options for fontsizer.js
		$.FontSizer.Init($font_sizer_options); // Initialize the font sizer for the site.
		// Setup onclick handlers for font resize:
		$font_sizer_decrease.click(function() { $.FontSizer.DecreaseSize(); return false; });
		$font_sizer_reset.click(function() { $.FontSizer.Reset(); return false; });
		$font_sizer_increase.click(function() { $.FontSizer.IncreaseSize(); return false; });
	} // $font_sizer
	
	// jQuery UI tabs:
	if($tabs.length > 0) {
		
		$('.rack').parent().css({ 'background-color' : 'transparent' }); // Temp fix until we can stop using the legacy/deprecated approach to rounded corner boxes.
		
		/* http://jqueryui.com/demos/tabs/ */
		var tabs_options = { cookie: {} }
		$tabs.tabs(); // Initialize.
		
		/* Show the tabs after they have been initialized: */
		$('.tabs > ul').show();
		
	} // $tabs
	
	// "Widget":
	if($widget.length > 0) {
		
		/* !!! CLEAN ME UP !!! */
		
		var $widget_switch = $('ul.meta.alt01 li');
		var $widget_weather = $('#weather');
		var $widget_search = $('#search');
		var widget_weather_class = 'weather';
		var widget_search_class = 'search';
		var search_html = '<a href="#">Search</a>';
		var forecast_html = '<a href="#">Five-day forecast</a>';
		
		$widget_switch.click(function() {
			$widget_weather.animate($anim_options_01);
			$widget_search.animate($anim_options_01);
			$(this).toggleClass(widget_weather_class).toggleClass(widget_search_class);
			if($(this).hasClass(widget_search_class)) {
				$(this).html(search_html);
			} else {
				$(this).html(forecast_html);
			}
			return false;
		});
		
	} // $widget
	
	// Handle "_blank" links:
	if($rel_external.length > 0) {
		/* target="_foo" is invalid due to our DTD.
		** If you want the link to open in a new window, add attribute "rel="external"". */
		$rel_external.click(function() { this.target = "_blank"; });
	} // $rel_external
	
	if($loader.length > 0) {
		$loader.append(loader_img.replace(/XXX/, (asset_location + image_path + loader_gif))); // Append the loader image to the dom.
		$loader.ajaxStart(function() {
			$loader.fadeIn(fade_speed_01); // Fade-in.
		}).ajaxStop(function() {
			$loader.fadeOut(fade_speed_01); // Fade-out.
		});
	} // $loader
	
	if ($prettify.length > 0) {
		var $prettify_radio = $('form.prettify input[name="options"]');
		var $prettify_radio_options = { empty: (asset_location + image_path + empty_png) };
		$prettify_radio.checkbox($prettify_radio_options); // Initialize radio options plugin. <http://code.google.com/p/jquery-checkbox/>
	} // $prettify
	
	if ($finder.length > 0) {
		
		var google_class = 'google';
		var google_class_01 = 'google-01';
		var google_class_02 = 'google-02';
		
		var $finder_search = $('#fm_finder-search');
		var $finder_options = $('#fm_finder-options');
		var $finder_radios = $('#fm_finder-options input[name="options"]');
		var $finder_go = $('#fm_finder-go');
		
		var $finder_option_01 = $('#fm_finder-option01'); // Site/Google Custom Search.
		var $finder_option_02 = $('#fm_finder-option02'); // Google News Archive.
		var $finder_option_03 = $('#fm_finder-option03'); // Proquest.
		
		// Add initial classes:
		$finder_search.addClass(google_class + ' ' + google_class_01);
		
		 // Remove any disabled attributes:
		$finder_radios.removeAttr(disabled_attr);
		$finder_go.removeAttr(disabled_attr);
		
		// Clicks:
		$finder_option_01.click(function() {
			$finder_search
				.addClass(google_class_01)
				.removeClass(google_class_02);
		});
		$finder_option_02.click(function() {
			$finder_search.addClass(google_class_01 + ' ' + google_class_02);
		});
		$finder_option_03.click(function() {
			$finder_search.removeClass(google_class_01 + ' ' + google_class_02);
		});
		
		// Focus & blurs:
		$finder_search.focus(function() {
			$finder_search
				.removeClass(google_class_01 + ' ' + google_class_02);
		}).blur(function() {
			if ($finder_option_01.is(':checked')) {
				$finder_search.addClass(google_class_01);
			} else if ($finder_option_02.is(':checked')) {
				$finder_search.addClass(google_class_02);
			}
			
		});
		
		// Submissions:
		$finder.submit(function() {
			// Get the selected radio option:
			var $finder_options_checked = $('#fm_finder-options input[name="options"]:checked');
			// Based on radio button selection, change form action:
			$finder.attr('action', $finder_options_checked.val());
			// Check options, manipulate form:
			if ($finder_option_01.is(':checked')) {
				// Site/Google Custom Search:
			} else {
				// Disable Google-specific hidden fields:
				$('#fm_finder input[name="cx"]').attr($attr_options_01);
				$('#fm_finder input[name="cof"]').attr($attr_options_01);
				$('#fm_finder input[name="ie"]').attr($attr_options_01);
			}
			if ($finder_option_02.is(':checked')) {
				// Google News Archive:
				
			}
			if ($finder_option_03.is(':checked')) {
				// Proquest:
				$finder_search.attr('name', 'QryTxt');
			}
			// Disable unwanted inputs upon submission:
			$finder_radios.attr($attr_options_01);
			$finder_go.attr($attr_options_01);
			
		});
		
	} // $finder
	
	// Email story to friend form:		
	if ($fm_email.length > 0) {
		
		var $email_success = $('#emailWrap .success');
		var $email_target = $('#emailWrap .success div');
		var $email_toggler = $('#emailWrap .toggler');
		var $email_toggle = $('#emailWrap .toggle');
		var $email_submit = $('#emailWrap input[name="Submit"]');
		
		$email_toggler.click(function() {
			$email_success.animate($anim_options_02, function() {
				$email_toggle.animate($anim_options_02);
			});
			return false;
		});
		
		// http://www.malsup.com/jquery/form/
		$fm_email.ajaxForm({
			target: $email_target,
			beforeSubmit: function(a, f, o) { // formData, jqForm, options
				if(validate(a, f, o)) {
					$email_submit.attr($attr_options_01); // Disable the submit button.
					$email_toggle.animate($anim_options_02, function() {
						return true;
					});
				} else { return false; }
			},
			success: function() {
				$email_submit.removeAttr(disabled_attr); // Enable the submit button.
				$email_success.animate($anim_options_02);
			},
			resetForm: true
		});
		
	} // $fm_email
	
	// Comment form:
	if ($fm_comment.length > 0) {
		
		var $comment_target_parent = $('#commentWrap #comments .listed02');
		var $comment_submit = $('#commentWrap input[name="Submit"]');
		
		// http://www.malsup.com/jquery/form/
		$fm_comment.ajaxForm({
			beforeSubmit: function(a, f, o) { // formData, jqForm, options
				showRecaptcha("recaptcha_comment", "white");
				if(validate(a, f, o)) {
					$comment_submit.attr($attr_options_01); // Disable the submit button.
					return true;
				} else {
					return false;
				}
			},
			success: function(data) {
				$('#commentWrap #comments .listed02 li').removeClass();
				var $comment_target = $('#commentWrap #comments .listed02 li:last-child');
				$comment_submit.removeAttr(disabled_attr); // Enable the submit button.
				$('#commentWrap div.warning').parent().fadeOut().remove();
				$comment_target
					.addClass("latest")
					.append(data)
					.hide()
					.fadeIn(fade_speed_01)
					.after('<li style="display:none;"></li>');
			},
			clearForm: true
		});
		
		showRecaptcha("recaptcha_comment", "white");
		
	} // $fm_comment
	
	// Poll form:
	if ($fm_poll.length > 0) {
		
		/*
		** 
		** NOTE: Currently, there can only be one form per page due to the use of #ids.
		** 
		*/
		
		var $poll = $('#poll');
		var $poll_results = $('.pollResults');
		var $poll_results_target = $('.pollResults div.target')
		var $poll_submit = $('#fm_poll_submit');
		var $poll_submit_wrap = $('form#fm_poll .submit');
		var $poll_options = $('form#fm_poll input[name="options"]');
		var poll_id = $('#fm_poll_parent').val();
		var poll_cookie_id = poll_cookie + poll_id;
		var poll_switch = 0;
		
		// Disable the submit button:
		$poll_submit.attr($attr_options_01); // Disable the submit button.
		
		/*
		** Cookie management for polls: */
		if($.cookie(poll_cookie_id)) {
			
			$poll_results.show();
			
		} else {
			
			// Hide the poll results:
			$poll_results.hide();
			
			// Show the poll:
			$poll.show();
			
			$poll_options.click(function() {
				var $current = $(this);
				if (($current.length > 0) && (poll_switch == 0)) {
					$poll_submit_wrap.animate($anim_options_02);
					$poll_submit.removeAttr(disabled_attr); // Allow them to submit the form.
					poll_switch = 1;
				}
			});
			
			$fm_poll.ajaxForm({
				target: $poll_results_target,
				beforeSubmit: function(a, f, o) {
					$poll_submit.attr($attr_options_01); // Disable the submit button.
					$poll_results.hide();
				},
				success: function(data) {
					$.cookie(poll_cookie_id, poll_cookie_id, { path: cookie_path, domain: cookie_domain, expires: cookie_expires_01 }); // Set cookie.
					$poll.hide();
					$poll_results.fadeIn(fade_speed_01);
				}
			});
			
		}
		
	} // $fm_poll
	
	// Ajax "loading" image:
	if (($fm_email.length > 0) || ($fm_comment.length > 0)) {
		// Note to self: Put in JS controlled CSS file.
		var $warning = $('.warning');
		$warning.remove(); // Remove the "javascript needed" warning message. Will show if JS is turned off.
	} // $fm_email.length, $fm_comment.length
	
	// Pop-open windows:
	if ($pop.length > 0) {
		var $profiles = {
			profile01: { width:700, height:550, center:1, createnew:0 }
			/* Add more here... */
		};
		$pop.popupwindow($profiles);
	} // $pop
	
	// Google map story tab:
	if ($map.length > 0) {
		initmap();
		GUnload();
	} // $map
	
	// Innerfade:
	if ($fade.length > 0) {
		
		/* Easiest approach is to wrap the fade div in div with a style="height:XXXXpx". */
		
		$fade.innerfade({
			animationtype: 'fade',
			speed: 'slow',
			timeout: '5000',
			type: 'random'
		});
		
		$fade.show();
		
	} // $fade
	
	// Expander:
	if ($expand.length > 0) {
		$expand.expander({
			slicePoint: 100, // Default: 100
			expandText: 'more', // Default: 'read more...'
			collapseTimer: 30000, // Default: 0 (no re-collapsing)
			userCollapseText: 'less' // Default: '[collapse expanded text]'
		});
	} // $expand
	
	// Multimedia pages:
	if ($alt_nav_ul.length > 0) {
		// Some vars:
		var folio_hash = '#folio';
		var $folio = $(folio_hash);
		// Get the hash:
		var hash = window.location.hash;
		// Append folio link:
		$alt_nav_ul.append('<li><a href="#folio" class="folioLink">Portfolio</a></li>');
		// Setup handler:
		$('a.folioLink').click(function() {
			this.blur();
			$folio.toggle();
			return false;
		});
		// Check for the hash:
		if (hash === folio_hash) {
			$folio.show(); // Show the portfolio if window hash === '#hash'.
		}
	} // $alt_nav_ul
	
	// Shuffling:
	if ($shuffle.length > 0) {
		// Note: If using this with "drawer" technique below, this call must come first.
		$shuffle.shuffle(); // Add class "shuffle" to object, and this will shuffle its children.
	} // $shuffle
	
	// Blogs on homepage:
	if ($drawer.length > 0) {
		// Note to self: Make more generic (i.e. not restricted to list items).
		var count_init = 5; // How many list items to show initially.
		var count_current = $(".drawer ul li").size();
		if (count_current > count_init) {
			var $drawer_li_gt = $(".drawer ul li:gt(" + (count_init - 1) + ")"); // Object reference.
			$drawer.append('<div class="toggleLink"><a href="#">' + show_text + '</a></div>'); // Toggle text.
			$drawer_li_gt.hide(); // Hidden by default.
			$('.drawer div.toggleLink a').click(function() {
				var $this = $(this);
				$this.blur();
				$this.parent().toggleClass('open');
				$this.html($this.html() == hide_text ? show_text : hide_text); // Text: "Show"/"Hide"?
				$drawer_li_gt.toggle(); // Toggle the list items after count.
				return false;
			});
		}
	} // $drawer
	
	// Multimedia tease:
	if ($multimedia.length > 0) {
		$multimedia.accessNews({ slideBy: 3, headline : "Multimedia", speed : "slow" });
	} // $multimedia
	
	// UI Datepicker:
	if ($date_picker.length > 0) {
		$date_picker.datepicker({ showOn: 'button', buttonImage: asset_location + standing_image_path + 'calendar.gif', buttonImageOnly: true, dateFormat: 'yy-mm-dd' });
	} // $date_picker
	
	// UI Datepicker:
	if ($time_picker.length > 0) {
		$time_picker.clock({ displayFormat: '12' });
	} // $time_picker
	
	// Table sorting:
	if ($tabular.length > 0) {
		
		if ($tabular.hasClass('sort')) {
			
			var $tabular_tr = $('table.tabular tr');
			var $tablular_th = $('table.tabular th');
			var sortWhat = ($tabular.hasClass('default')) ? [[0,0]] : "";
			var $tablesorter_options = {
				widgets: ['zebra'],
				sortList: sortWhat
			};
			$tabular.tablesorter($tablesorter_options);
			// Adds sort_header class to <th>s:
			$tablular_th.addClass('sortHeader');
			// Adds "over" class to rows on mouseover:
			$tabular_tr.mouseover(function() { $(this).addClass('sortOver'); });
			// Removes "over" class from rows on mouseout:
			$tabular_tr.mouseout(function() { $(this).removeClass('sortOver'); });
			
		} else if ($tabular.hasClass('zebra')) {
			// Not sorting? Want zebra stripes? Apply class "zebra" to your table:
			$("table.tabular tr:even").addClass('odd');
		}
		
	} // $tabular
	
	// Modal windows, currently only used on the Ticket Files Blog:
	if ($modal01.length > 0) { $modal01.jqm({ toTop: true, trigger: 'a.modal01', target: '#modal01' }); }
	if ($modal02.length > 0) { $modal02.jqm({ toTop: true, trigger: 'a.modal02', target: '#modal02' }); }
	if ($modal03.length > 0) { $modal03.jqm({ toTop: true, trigger: 'a.modal03', target: '#modal03' }); }
	
});
// End closure.

// Start closure:
$(window).load(function () {
	
	// Put code here for once all content has loaded.
	
	
	/*
	** 
	** Because flash peel & billboard is talking to jQuery
	** we need to wait for the jquery library to fully load
	** before Flash/AS3 can use the jQuery functions.
	** My tests show that hiding the Flash embed until the page fully loads
	** Allows Flash to make the jQuery connection.
	** 
	*/
	
	var $peel = $('#peel');
	if ($peel.length > 0) {
		$peel.show(); // Show the peel.
	} // $peel
	
	var $billboard = $('#billboard');
	if ($billboard.length > 0) {
		$billboard.show();
	} // $billboard
	
});
// End closure.

// This event fires any time the browser window is resized:
//$(window).bind("resize", function() {}).trigger("resize");