(function($){
	
	// Some jQuery utility vars for MSIE detection
	var msie = $.browser.msie;
	var msie6 = msie && (parseInt(jQuery.browser.version) == 6);
	
	// Creates console object, so logging doesn't thrown an error in browsers without console
	if (! ("console" in window) || !("firebug" in console)) {
    var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
    window.console = {};
	for (var i = 0; i < names.length; ++i) window.console[names[i]] = function () {};
	}
	
	/*
		jQuery plugin to clear default text in input fields.
		1. Takes default text from previous label (for accessibility)
		2. Binds focus and blur events and compares input value to default
		Options to pass in is class on input field to affect ("clear-default" is default)
	*/
	$.fn.clearDefault = function(options) {
		var defaults = {
			"class": "clear-default"
		};
		
		var options = $.extend(defaults, options);
		
		return this.each(function() {  
			var o = options;
			var obj = $(this);
			
			var label = obj.prev('label').text();
			
			if(label.length){
				obj
					.val(label)
					.focus(function(){
						if(obj.val() == label) obj.val('');
					})
					.blur(function(){
						if(obj.val() == '') obj.val(label);
					});
			}
			
		});
		
	};	
	
	
	/*
		Invoke homepage carousel using jCarouselLite plugin
		1. Checks for existence of carousel item
		2. Generates carousel controls if there is more than one slide
		3. Generates circular pagination if more than one slide
		4. Invokes carousel functionality
		5. Unhides controls and pagination once correctly placed
	*/
	
	
	$.fn.invokeCarousel = function(options){
		return this.each(function() {
			var obj = $(this);
			
			var caro_length = obj.find('li').length;
	
			if(caro_length > 1){
				
				// Append carousel arrow controls
				$('<ul id="caroCtrls" class="hide">\
				<li class="prev"><a href="#">Previous</a></li>\
				<li class="next"><a href="#">Next</a></li>\
				</ul>').insertAfter('#carousel');
				
				var caro_pag = $('<ol id="caroPagination"></ol>'),
				pag_array = [],
				caro_items,
				active_class,
				current_slide;
				
				for(i = 0; i < caro_length; i++){
					var pag_count = parseInt(i+1);
					active_class = (pag_count == 1) ? 'active' : '';
					$('<li class="' + active_class + ' caro-pag-'+pag_count+' pngfix' +'"><a href="#">'+pag_count+'</a></li>').appendTo(caro_pag);
					pag_array.push('.caro-pag-' + pag_count);
				}

				caro_pag.insertAfter('#caroCtrls');
				
				obj.jCarouselLite({
					visible: 1,
					btnNext: ".next",
					btnPrev: ".prev",
					speed:  2000,
					auto: 20000,
					btnGo: pag_array,
					pauseOnHover: true,
					beforeStart: function(slide){
						updateCaroPaginationBefore(caro_items.index(slide));
					},
					afterEnd: function(slide){
						updateCaroPaginationAfter(caro_items.index(slide));
					}
				});
				
				caro_items =  $('#carousel').find('li');
				
				caro_pag.find('a').bind('click',function(e){
					e.preventDefault();
				});
				
				updateCaroPaginationBefore = function(slide){
					if(!msie){
						caro_pag.find('li.active a').fadeOut(function(){
							$(this).parent().removeClass('active');
						});
					}else{
						caro_pag.find('li.active').removeClass('active');
					}
				};
				
				updateCaroPaginationAfter = function(slide){
					if(slide > caro_length) slide = 1;
					if(slide <= 0) slide = caro_length;
					var active_li = caro_pag.find('li:eq('+parseInt(slide-1)+')');
					active_li.addClass('active')
					if(!msie) active_li.find('a').hide().fadeIn();
				};
				
				$('#caroCtrls').removeClass('hide');
			}
			
		});
	};
	
	/*
		jQuery plugin to make links with rel of external open in new window
		Adheres to XHTML Strict guidelines, and provides enhanced experience for those who can use new windows
	*/
	$.fn.externalLinks = function(){
		$('a[rel="external"]').each(function(){
			var obj = $(this);
			obj
				.attr('title', function(){
					return obj.attr('title') + ' (opens in an external window)';
				})
				.attr('target','blank');
		});
	};
	
	/* jQuery plugin to invoke PNG transparency for IE6 using DD_belatedPNG plugin on set IDs and classes */
	$.fn.invokeTransparency = function(){
		DD_belatedPNG.fix('\
			#logoMain, #navMain, #content,\
			#questionPanel .top, #questionPanel .rep, #questionPanel .btm,\
			#contentBtm, #legals img, .pngfix, #navSecondarySdw,\
			.right-col .content-sub, #navMain ul .active');
	};
	
	/*
		Plugin to equalize heights of two columns
		1. Pass in class of parent container that wraps affected columns
		2. Loop through each child and find column of max height out of set
		3. Set minimum height of all columns to max height (or in case of IE6, height - which acts as min-height)
	*/
	$.fn.equalizeChildHeights = function(){
		var obj = $(this),
		children = obj.children(),
		max_height = 0,
		child_height;

		if(children.length){
			children.each(function(){
				child_height = parseInt($(this).outerHeight());
				if(child_height > max_height){
					max_height = child_height;
				}
			}).each(function(){
				if(parseInt($(this).outerHeight()) !== max_height){
					// 2/23/2011
					//(!msie6) ? $(this).css('min-height', max_height) : $(this).css('height', max_height);
				}
			});
		}
	};
	
	/* Bind JS print functionality for print button, and prevent default action */
	$.fn.invokePrintEmail = function(){
		var obj = $(this);
		if(obj.length){				
			$(this).click(function(e){
				e.preventDefault();
				window.print();
			});
		}
	};
	
	$.fn.invokePoll = function(){
		var poll_form = $('#pollForm');
		if(poll_form.length){
			var poll_response = $('#pollResponse').hide(),
			poll_height = poll_form.height(),
			poll_id = poll_form.attr('rel'),
			poll_complete = false;
			
			poll_form.parent().height(poll_height);
			poll_form.bind('submit', function(e){
				e.preventDefault();
				
				var site_domain = document.domain;
				var path_name = window.location.pathname;
				var page_name = path_name.substring(path_name.lastIndexOf('/') + 1);
				
				
				//var wtString = "dcsMultiTrack('DCS.dcssip', '" + site_domain + "', 'DCS.dcsuri', '"+ path_name +"', 'WT.ti', '" + page_name + "'";
				//wtString += ", 'questionID', '" + poll_id + "'";
				
				// Get poll responses
				var poll_selections = $('input:checked');
				
				// Validate
				if(poll_selections.length){
					$.each(poll_selections, function(i, elem){						
						var wtString = "dcsMultiTrack('WT.cg_n', 'ques', 'WT.cg_s', '" +  $(elem).val() + "');" ;
						console.log(wtString);
						eval(wtString);								
					});
					poll_complete = true;
				}else{
					// Show error message
					alert("Please select at least one answer before submitting.");
					poll_complete = false;
				}
				
				if(poll_complete){					
				
					// Show response
					poll_form.fadeOut(function(){
						poll_response.fadeIn();
					});	
					
				}
				
			});
			
			var poll_submit = $('#pollSubmit');
			poll_submit.bind('click', function(e){
				poll_form.trigger('submit');
			});
			
		}
	};
	
	/* NPLATE namespace to initialize events and keep things clean */
	var NPLATE = {
		init : function(){
			$('.clear-default').clearDefault();
			$('.home #carousel').invokeCarousel();
			$('#pollForm').invokePoll();
			$('#printEmail .print a').invokePrintEmail();
			$.fn.externalLinks();
			$('.equalize').equalizeChildHeights();
			if(msie6) $.fn.invokeTransparency();
		}
	};
	
	/* OK, let's execute the initializer... lights, camera, action */
	NPLATE.init();
	
})(jQuery);

