(function($) {
	
	if ($.browser.mozilla && navigator.userAgent.indexOf('rv:') != -1) {
		var gecko = /rv: *([0-9.]+)/i.exec(navigator.userAgent)[1];
		if (parseFloat(gecko) < 1.9) {
			$(function() {
				$('#all-journals, fieldset.journals legend, #journal-selection-help').css({display: 'block'});
				$('#sort-button').css({display: 'inline'});
			});
			return;
		}
	}

	$(function() {
		$('body:not(".js-enabled")').addClass('js-enabled');
		
		if ($('body#results').get(0)) {
			(function() {
				$('#sort-button').css({display: 'none'});
			
				var keyPressed = 0;
			
				var handleChange = function(el) {
					var value = el.val();
					el.bind('focus', function() {
						value = $(this).val();
					}).bind('blur', function() {
						if (value != $(this).val()) {
							submitForm();
						}
					});
				};
				var recordKeyPress = function(e) {
					keyPressed = e.keyCode;
				};
				var submitForm = function() {
					if (!arguments.callee.submitted) {
						arguments.callee.submitted = true;
						$('#sortform').get(0).submit();
					}
				};
				
				$('#sortform select').each(function() {
					handleChange($(this));
				});
				$('#sortform select').bind('focus', function() {
					$(document).bind('keydown', recordKeyPress);
				}).bind('blur', function() {
					$(document).unbind('keydown', recordKeyPress);
				}).bind('change', function() {
					if (keyPressed != 40 && keyPressed != 38) {
						submitForm();
					} 
					keyPressed = 0;
				});
			})();
		}
		
		if ($('body#search-advanced').get(0)) {
			(function() {
				var getToggleLinkText = function() {
					return (!expanded) ? 'Select journals from a list' : 'Hide journal list'	
				};
			
				var getToggleLinkHtml = function() {
					var link = '<div id="journal-selection-links">';
					link += '<a href="#" id="toggle-journal-list">';
					link += getToggleLinkText();
					link += '</a>';
					link += '</div>';
					return link;
				};
			
				var getSelectedJournalsWrapperHtml = function(id) {
					var wrap = '<div id="' + id + '" class="journal-info">';
					wrap += '<div class="selected-journals">';
					wrap += getSelectedJournalsHtml();
					wrap += '</div>';
					wrap += '</div>';
					return wrap;
				};
			
				var getSelectedJournalsHtml = function() {
					var getText = function(txt) {
						return '<p>You are currently searching in <span class="journal-hilite">' + txt + '</span></p>';
					};
								
					if (!selectedJournals.length) {
						return getText('all of nature.com').replace(/in </, '<');
					}
					var selected = selectedJournals.slice();
					if (selected.length == 1) {
						return getText(selected[0]);
					}
					var last = selected.pop();
					return getText(selected.join(', ') + ' and ' + last);
				};
			
				var selectedJournals = (function() {
					var j = [];
					$('#all-journals input[type="checkbox"]:checked').each(function() {
						j.push($(this).next().text());
					});
					return j;
				})();
				var expanded = selectedJournals.length != 0;
			
				$('#all-journals').css({display: (expanded) ? 'block' : 'none'});
				$('#toggle-journal-list').click(function() {
					if (expanded) {
						$('#all-journals').slideUp();
					} else {
						$('#all-journals').slideDown();
					}
					expanded = !expanded;
					$(this).toggleClass('drop-down').toggleClass('drop-up').text(getToggleLinkText());
					
					return false;
				}).addClass(!expanded ? 'drop-down' : 'drop-up');
				
			
				$('fieldset.journals').before(getSelectedJournalsWrapperHtml('journal-info'));
			
				$('#all-journals input[type="checkbox"]').click(function() {
					var text = $(this).next().text();
					if (!this.checked) {
						var n = selectedJournals.length;
						while (n--) {
							if (selectedJournals[n] == text) {
								selectedJournals.splice(n, 1);
								break;
							}
						}
						if (n == 0) {
							$('#selection-options').css({display: 'none'});
						}
					} else {
						selectedJournals.push(text);
						$('#selection-options').css({display: 'inline'});
					}
					$('.selected-journals').html(getSelectedJournalsHtml());
				});
			
				$('#toggle-journal-list').after('<span id="selection-options"> | <a id="deselect-journals" href="javascript:;">Deselect All</a> (Search all of nature.com)</span>');
				$('#selection-options').css({display: (expanded) ? 'inline' : 'none'});
				$('#deselect-journals').click(function() {
					$('#all-journals input[type="checkbox"]:checked').each(function() {
						this.checked = false;
					});
					$(this).parent().css({display: 'none'});
					selectedJournals = [];
					$('.selected-journals').html(getSelectedJournalsHtml());
				});
			
			})();

			(function() {
				var getClassName = function(selector) {
					return selector.substring(selector.indexOf('.') + 1, selector.indexOf(' '));
				};
				var toggleInactiveSelectBoxes = function(selector, disabled) {
					var others = $.grep(selectors, function(item) {
						return item != selector;
					});
					$(others.join(', ')).each(function() {
						this.disabled = disabled;
					});
				};
			
				var selectors = ['fieldset.exact-date select', 'fieldset.between-dates select', 'fieldset.date-range select'];
				var n = selectors.length;
				while (n--) {
					(function(selector) {
						$(selector).change(function() {
							var isset = false;
							$(selector).each(function() {
								if ($(this).val() != '') {
									isset = true;
								}
							});
							toggleInactiveSelectBoxes(selector, isset);
							$('#pub-' + getClassName(selector))[0].checked = isset;
						});
					})(selectors[n]);
				}
			
				$('fieldset.publication-date input[type="radio"]').click(function() {
					var selector = 'fieldset.' + this.id.replace(/^pub-/, '') + ' select';
					$(selector).each(function() {
						this.disabled = false;
					});
					toggleInactiveSelectBoxes(selector, true);
				});
			
				$('fieldset.publication-date input[type="radio"]:checked').trigger('click');

				$('fieldset.exact-date select:last').after('<p id="exact-date-notes" class="notes"></p>');
				$('fieldset.between-dates select:last').after('<p id="between-dates-notes" class="notes"></p>');
				$('fieldset.date-range select:last').after('<p id="date-range-notes" class="notes"></p>');
			
				$('fieldset.exact-date select').change(function() {
					var day = parseInt($('#sp-q-10').val() || 1, 10);
					var month = parseInt($('#sp-q-11').val() || 1, 10) - 1;
					var year = parseInt($('#sp-q-12').val() || new Date().getFullYear(), 10);
					var d = new Date(year, month, day);
					var isValid = d.getDate() == day && d.getMonth() == month && d.getFullYear() == year;
					$('#exact-date-notes').text(!isValid ? 'Please select a valid date' : '');
				});
			
				$('fieldset.between-dates select').change(function() {
					var startMonth = parseInt($('#sp-start-month').val() || 1, 10);
					var startYear = parseInt($('#sp-start-year').val() || 1869, 10);
					var endMonth = parseInt($('#sp-end-month').val() || 12, 10);
					var endYear = parseInt($('#sp-end-year').val() || new Date().getFullYear(), 10);
					var isError = (endYear < startYear || (endYear == startYear && endMonth < startMonth));
					$('#between-dates-notes').text(isError ? 'The end date must be after the start date' : '');
				});
			})();
		}
	});

})(jQuery);