 
var track = (function(){
	
	var get_element_value = function(context)
	{
		return context.val();
	};
	
	var get_checkbox_value = function(context)
	{
		if (context.attr('checked') == true)
		{ 
			return context.val();	 
		}
	};
	
	var get_checkbox_state = function(context)
	{
		if (context.attr('checked') == true)
		{ 
			return 1;	 
		}
		return 0;
	};
	
	var get_link_href_and_img = function(context)
	{
		var $img = context.find('img');
				
		if ($img.length)
		{
			var img_src = $img.attr('src');
			img_src = img_src.replace(/^.*(\\|\/|\:)/, '');
			return img_src + ' - ' + context.attr('href');	
		}
		// might be a link wrapping text like video links
		return context.text() + ' - ' + context.attr('href');
	};
	
	var get_slider_value = function(context)
	{
		return jQuery('input#rating_driving').val();
	};
	
	var get_search_keywords = function(context)
	{
		return jQuery('input[name="keywords"]').val();
	};
	
	var get_nav_dealer_search = function(context)
	{
		return jQuery('#nav input[name="location"]').val();
	};
	
	var track_event = function(category, action, label, value)
	{
		if (typeof _gaq == 'undefined')
		{
			return false;
		}
		window.console && console.log('sending GA event...');
		value = value ? parseInt(value) : null;
		_gaq.push(['_trackEvent', category, action, label, value]);
		return true;
	};
	
	var bind_event_tracking = function()
	{	
		jQuery.each(elements, function(element_name, item) {
			var $el = jQuery(item.selector);
			if ($el.length)
			{
				window.console && console.log('binding ', item.selector);
				
				var bind = item.bind ? item.bind : 'click';
				
				$el.data('category', item.category);
				$el.data('action', item.action);
				$el.data('label', item.label);
				$el.data('value', item.value);
				
				// we have the element, bind the click
				$el.live(bind, function(e){
					
					var category = $el.data('category');
					var action = $el.data('action');
					var label = $el.data('label');
					var value = $el.data('value');
					
					if (typeof label == 'function')
					{
						label = label.call( jQuery(this), jQuery(this));
						window.console && console.log('function called for label. result: ', label);
					}
					if (typeof value == 'function')
					{
						value = value.call( jQuery(this), jQuery(this));
						window.console && console.log('function called for value. result: ', value);
					}
					window.console && console.log('event registered! ', item.selector, category, action, label + '', value + '');
					track_event(category, action, label, value);
				});
			}
		});
	};
	
	var elements = {
		// begin home elements
		yokohama_logo: {
			selector:	'body.home #branding h1 a',
			category:	'header',
			action: 	'click',
			label:		'logo'
		},
		commercial_link: {
			selector: 'body.home #sub_nav li:eq(0)',
			category: 'header',
			action: 'click',
			label: 'commercial link'
		},
		otr_link: {
			selector: 'body.home #sub_nav li:eq(1)',
			category: 'header',
			action: 'click',
			label: 'otr link'
		},
		dealer_login: {
			selector: 'body.home #sub_nav li:eq(2)',
			category: 'header',
			action: 'click',
			label: 'dealer login'
		},
		search: {
			selector: '#branding input#submit',
			category: 'header',
			action: 'search',
			label: get_search_keywords
		},
		top_nav_dealer_locator: {
			selector: 'body.home #nav input#submit_dealer',
			category: 'header',
			action: 'dealer search',
			label: get_nav_dealer_search
		},
		find_my_tire: {
			selector: 'body.home #robotTopWrap a',
			category: 'homepage',
			action: 'click',
			label: 'find my tire'
		},
		homepage_hero_image: {
			selector: 'body.home #carouselContainer a',
			category: 'homepage',
			action: 'hero',
			label: get_link_href_and_img
		},
		facebook_link: {
			selector: '#social a#facebook',
			category: 'footer',
			action: 'social media',
			label: 'facebook link'
		},
		twitter_link: {
			selector: '#social a#twitter',
			category: 'footer',
			action: 'social media',
			label: 'twitter link'
		},
		youtube_link: {
			selector: '#social a#youtube',
			category: 'footer',
			action: 'social media',
			label: 'youtube link'
		},
		itunes_link: {
			selector: '#social a#itunes',
			category: 'footer',
			action: 'social media',
			label: 'itunes link'
		},
		// begin tire search
		choose_driving_style: {
			bind: 'mouseup',
			selector: 'body.easy_search #fmt_slider_bg',
			category: 'easy search',
			action: 'slider',
			label: get_slider_value
		},
		next_step: {
			selector: 'body.easy_search #fmt_nxt_stp_btn a', 
			category: 'easy search', 
			action: 'next step',
			label: 'step 2',
			value: get_slider_value
		},
		next_step_3: {
			selector: 'body.easy_search #fmt_nxt_stp_3_btn a',
			category: 'easy search',
			action: 'next step',
			label: 'step 3'
		},
		next_step_year: {
			bind: 'change',
			selector: 'body.easy_search #fmt_tire_search_s2 select[name="year"]',
			category: 'easy search',
			action: 'year',
			label: get_element_value
		},
		next_step_make: {
			bind: 'change',
			selector: 'body.easy_search #fmt_tire_search_s2 select[name="make"]',
			category: 'easy search',
			action: 'make',
			label: get_element_value
		},
		next_step_model: {
			bind: 'change',
			selector: 'body.easy_search #fmt_tire_search_s2 select[name="model"]',
			category: 'easy search',
			action: 'model',
			label: get_element_value
		},
		next_step_option: {
			bind: 'change',
			selector: 'body.easy_search #fmt_tire_search_s2 select[name="option"]',
			category: 'easy search',
			action: 'option',
			label: get_element_value
		},
		feature_ranking_dry: {
			bind: 'change',
			selector: '#dry_traction input',
			category: 'easy search',
			action: 'sort',
			label: 'dry',
			value: get_checkbox_value
		},
		feature_ranking_wet: {
			bind: 'change',
			selector: '#wet_traction input',
			category: 'easy search',
			action: 'sort',
			label: 'wet',
			value: get_checkbox_value
		},
		feature_ranking_winter: {
			bind: 'change',
			selector: '#winter_traction input',
			category: 'easy search',
			action: 'sort',
			label: 'winter',
			value: get_checkbox_value
		},
		feature_ranking_noise_comfort: {
			bind: 'change',
			selector: '#noise input',
			category: 'easy search',
			action: 'sort',
			label: 'Comfort',
			value: get_checkbox_value
		},
		feature_ranking_lengevity: {
			bind: 'change',
			selector: '#longev input',
			category: 'easy search',
			action: 'sort',
			label: 'Longevity',
			value: get_checkbox_value	
		},
		advanced_search_year: {
			bind: 'change',
			selector: 'form#advanced select[name="year"]',
			category: 'advanced search',
			action: 'year',
			label: get_element_value
		},
		advanced_search_make: {
			bind: 'change',
			selector: 'form#advanced select[name="make"]',
			category: 'advanced search',
			action: 'make',
			label: get_element_value
		},
		advanced_search_model: {
			bind: 'change',
			selector: 'form#advanced select[name="model"]',
			category: 'advanced search',
			action: 'model',
			label: get_element_value
		},
		advanced_search_option: {
			bind: 'change',
			selector: 'form#advanced select[name="option"]',
			category: 'advanced search',
			action: 'option',
			label: get_element_value
		},
		advanced_search_width: {
			bind: 'change',
			selector: 'form#advanced select[name="width"]',
			category: 'advanced search',
			action: 'width',
			label: get_element_value
		},
		advanced_search_profile: {
			bind: 'change',
			selector: 'form#advanced select[name="aspect_ratio"]',
			category: 'advanced search',
			action: 'aspect_ratio',
			label: get_element_value
		},
		advanced_search_diameter: {
			bind: 'change',
			selector: 'form#advanced select[name="rim_size"]',
			category: 'advanced search',
			action: 'rim size',
			label: get_element_value
		},
		show_results: {
			selector: '#advanced_search_submit',
			category: 'advanced search',
			action: 'show results'
		},
		characteristics_style: {
			selector: '#search_criteria input[name="style[]"]',
			category: 'tire results',
			action: 'style',
			label: get_checkbox_value,
			value: get_checkbox_state
		},
		characteristics_type: {
			selector: '#search_criteria input[name="vehicle_type[]"]',
			category: 'tire results',
			action: 'vehicle type',
			label: get_checkbox_value,
			value: get_checkbox_state
		},
		tire_box_like: {
			selector: '#search_results .like', 
			category: 'tire results', 
			action: 'social', 
			label: 'like'
		},
		tire_box_share: {
			selector: '#search_results .share', 
			category: 'tire results', 
			action: 'social', 
			label: 'share'
		},
		tire_box_find_my_dealer: {
			selector: '#search_results a.link', 
			category: 'tire results', 
			action: 'tire box', 
			label: 'find my dealer'
		},
		tire_box_learn_more: {
			selector: '#search_results a.learn_more', 
			category: 'tire results', 
			action: 'tire box', 
			label: 'learn more'
		},
		tire_box_compare: {
			selector: '#search_results .compare a', 
			category: 'tire results', 
			action: 'tire box', 
			label: 'compare'
		},
		tire_detail_page_gallery: {
			selector: 'body.tire_detail a.gallery_modal', 
			category: 'tire detail', 
			action: 'gallery', 
			label: 'feature'
		},
		tire_detail_page_ugc_gallery: {
			selector: 'body.tire_detail a.ugc_gallery_modal', 
			category: 'tire detail', 
			action: 'gallery', 
			label: 'ugc'
		},
		tire_detail_page_overview: {
			selector: 'body.tire_detail #tabs_01 a', 
			category: 'tire detail', 
			action: 'tab', 
			label: 'overview'
		},
		tire_detail_page_sizes: {
			selector: 'body.tire_detail #tabs_02 a', 
			category: 'tire detail', 
			action: 'tab', 
			label: 'sizes'
		},
		tire_detail_page_warranty: {
			selector: 'body.tire_detail #tabs_03 a', 
			category: 'tire detail', 
			action: 'tab', 
			label: 'warranty'
		},
		tire_detail_page_hot_spots: {
			selector: 'body.tire_detail #hero_bullets span.tooltip', 
			bind: 'mouseover',
			category: 'tire detail', 
			action: 'tooltip'
		},
		tire_detail_page_dealer_search: {
			selector: 'body.tire_detail #find_local_dlr input[type="submit"]',
			category: 'tire detail',
			action: 'dealer search'
		},
		comm_truck: {
			bind: 'change',
			selector: '#commercial_search select[name="vehicle_type"]',
			category: 'commercial find',
			action: 'truck type',
			label : get_element_value
		},
		comm_position: {
			bind: 'change',
			selector: '#commercial_search select[name="position"]',
			category: 'commercial find',
			action: 'position',
			label : get_element_value
		},
		comm_application: {
			bind: 'change',
			selector: '#commercial_search select[name="application"]',
			category: 'commercial find',
			action: 'application',
			label : get_element_value
		},
		comm_size: {
			bind: 'change',
			selector: '#commercial_search select[name="size"]',
			category: 'commercial find',
			action: 'tire size',
			label : get_element_value
		},
		comm_name: {
			bind: 'change',
			selector: '#commercial_search select[name="marketing_tread_name"]',
			category: 'commercial find',
			action: 'tire name',
			label : get_element_value
		},
		comm_show_results: {
			selector: '#commercial_search #show_results',
			category: 'commercial find',
			action: 'click',
			label: 'show results'
		},
		comm_find_dealer: {
			selector: 'body.commercial #submit_find_dealer',
			category: 'commercial find',
			action: 'click',
			label: 'find dealer go'
		},
		otr_application: {
			bind: 'change',
			selector: '#otr_search select[name="style"]',
			category: 'otr_find',
			action: 'application',
			label: get_element_value
		},
		otr_type: {
			bind: 'change',
			selector: '#otr_search select[name="vehicle_type"]',
			category: 'otr_find',
			action: 'truck type',
			label: get_element_value
		},
		otr_name: {
			bind: 'change',
			selector: '#otr_search select[name="name"]',
			category: 'otr_find',
			action: 'tire name',
			label: get_element_value
		},
		otr_show_results: {
			selector: '#otr_search #show_results',
			category: 'otr_find',
			action: 'click',
			label: 'show results'
		},
		otr_find_dealer: {
			selector: 'body.otr #submit_find_dealer',
			category: 'otr_find',
			action: 'click',
			label: 'find dealer go'
		},
		// begin dealer search
		dealer_locator_go: {
			selector: '#location_input input[type="submit"]',
			category: 'dealer locator',
			action: 'dealer search'
		},
		dealer_details_directions: {
			selector: '#map_canvas a',
			category: 'dealer locator',
			action: 'directions'
		},
		dealer_search_commercial: {
			selector: '#search_toggle a.commercial_lookup',
			category: 'dealer locator',
			action: 'search commercial'
		}
	};
	
	jQuery(document).ready(function($){
		bind_event_tracking();
	});
	
	return {
		// @params: Category, Action, Label, Value
		//   Category (required) The name you supply for the group of objects you want to track.
		//   Action (required) A string that is uniquely paired with each category, and commonly used to define the type of user interaction for the web object.
		//   Label (optional) An optional string to provide additional dimensions to the event data.
		//Value (optional) An integer that you can use to provide numerical data about the user event.
		   
		event: function(category, action, label, value){
			return track_event(category, action, label, value);
		}
	};
}(_gaq));
