(function() {
try {
if (!cllc.exists) { throw "cllcObjUndefined"; }

// cllc.disclaimers is set up as a closure itself to allow for hidden state storage.

cllc.disclaimers = (function() {
	// Location for the Disclaimer service
	var DISCLAIMER_SERVICE_ENDPOINT = cllc.get_protocol()+"//"+cllc.get_environment(true)+".chrysler.com/hostb/disclaimer/get/";

	// Location for the local file of all disclaimers in case of server outage
	var DISCLAIMER_FALLBACK = "/crossbrand/en/disclaimers/dynamic_disclaimer_data.js";

	// Storage for all numbered disclaimers on the page
	var numbered_disclaimers = {};

	// Storage for all numberless disclaimers on the page
	var numberless_disclaimers = {};

	// Count of all the old-style disclaimers which were baked into the page on file generation
	var num_baked_in_disclaimers = 0;

	// Monitor all ajax errors and if it was a disclaimer call, then load the fallback data instead
	jQuery().ajaxError(function(event, request, options, exception) {
		// Check to see if the request was for the disclaimer service output, if so load fallback data
		if (options && options.url.indexOf('/hostb/disclaimer/get/') != -1) {
			jQuery.getScript(DISCLAIMER_FALLBACK);
		}
	});

	// function findAndNumberDisclaimers()
	// Finds all disclaimer tags on the page, stores them into the datastores, and converts their page text into [#] format.
	// PARAMS
	//     none
	function findAndNumberDisclaimers() {
		var num_disclaimers = num_baked_in_disclaimers;
		// Iterate over all disclaimers on the page, add them to the array
		jQuery(".dyna_disc, .dyna_disc_false").each(function() {
			var disclaimer = jQuery(this);
			var disclaimer_key = disclaimer.text();
		
			// Hidden disclaimers do not show the [#] format on page and have no symbols in the footer.
			// Check to see which kind of disclaimer this is for handling purposes.
			var disc_is_hidden = disclaimer.hasClass("dyna_disc_false");
			var disclaimer_array = disc_is_hidden ? numberless_disclaimers : numbered_disclaimers;
		
			// Load a disclaimer into the datastore only once
			if (disclaimer_array[disclaimer_key] == undefined) {
				// Check to see if this disclaimer was baked into this page in the old style.
				// If so, treat this disclaimer as a duplicate and give it the original's ID.
				if (jQuery('dt.disclaimer_text_'+disclaimer_key).length) {
					disclaimer_array[disclaimer_key] = {
						key:			disclaimer_key,
						id:				jQuery('dt.disclaimer_text_'+disclaimer_key).text(),
						was_baked_in:	true
					};
				}
				// This disclaimer is known to be new so give it a unique ID.
				else {
					disclaimer_array[disclaimer_key] = {
						key:		disclaimer_key,
						id:			disc_is_hidden ? null : num_disclaimers += 1 // Hidden disclaimers do not get an ID number
					};
				}
			}
		
			// Rewrite disclaimers with their new ID, and then hide hidden disclaimers and show numerical ones.
			disclaimer.toggle(!disc_is_hidden)
						.attr("title", disclaimer_key)
						.text("["+disclaimer_array[disclaimer_key]['id']+"]");
		});
	};

	// function loadDisclaimerData()
	// Requests disclaimer text from the service for all disclaimers found on the page.
	// PARAMS
	//     none
	function loadDisclaimerData() {
		var disclaimer_keys = [];
	
		// Combine all the found disclaimers into a temporary array for the request to the service
		for (var disclaimer in numbered_disclaimers) {
			disclaimer_keys.push(numbered_disclaimers[disclaimer]['key']);
		}
		for (var disclaimer in numberless_disclaimers) {
			disclaimer_keys.push(numberless_disclaimers[disclaimer]['key']);
		}
		
		// Request the disclaimer data
		jQuery.getScript(DISCLAIMER_SERVICE_ENDPOINT+"?id="+disclaimer_keys.join(",")+"&callback=cllc.disclaimers.drawDisclaimers");
		// NOTE: If we should go straight to the fallback and skip the dynamic service, comment the previous line and uncomment the following one.
		// jQuery.getScript(DISCLAIMER_FALLBACK);
	};

	// The enclosed functions here are the publicly accessible interface for the disclaimers module.
	return {
		// function init()
		// Transforms all disclaimers in the page into their complete, numbered form with text from the web service.
		// PARAMS
		//     none
		init: function() {
			// Calculate how many numbered old-style disclaimers were found on this page.
			var doesContainAlphanumericsTester = new RegExp(/\w/);
			jQuery("#disclaimers dl dt").each(function(index) {
				// Ensure this disclaimer is numbered by checking to see if it has any text or numbers
				if (doesContainAlphanumericsTester.test(jQuery(this).text())) {
					num_baked_in_disclaimers++;
				}
			});
		
			// Find all the disclaimers, get their data, and display them.
			findAndNumberDisclaimers();
			loadDisclaimerData();
		},
	
	
		// function drawDisclaimers()
		// Takes an object of disclaimer keys -> disclaimer text values and uses them to add in all needed disclaimers into the footer.
		// PARAMS
		//     disclaimers_from_service: [required] Object of disclaimer keys -> disclaimer text values
		drawDisclaimers: function(disclaimers_from_service) {
			var disclaimers = []; // Local storage for disclaimer HTML tokens needed for insertion
			
			// Then write out all numbered disclaimers first
			for (var disclaimer in numbered_disclaimers) {
				var disclaimer_id = numbered_disclaimers[disclaimer]['id'];
				var disclaimer_key = numbered_disclaimers[disclaimer]['key'];
				var disclaimer_text = disclaimers_from_service[disclaimer_key];
				
				// If a blank disclaimer is returned then this is a drastic problem and it needs to be alerted and we must abort.
				if (disclaimer_text === false) {
					return alert('An unidentifiable disclaimer was requested ('+disclaimer_key+')');
				}
			
				// Insert the text from the disclaimer service into the disclaimer object for retrieval later.
				numbered_disclaimers[disclaimer]['text'] = disclaimer_text;
			
				// If this disclaimer was baked into the page don't bother rewriting it.
				if (numbered_disclaimers[disclaimer]['was_baked_in']) {
					continue;
				}
				else {
					disclaimers.push("<dt class='disclaimer_text disclaimer_text_"+disclaimer_key+"'>"+disclaimer_id+"</dt>");
					disclaimers.push("<dd class='disclaimer_text disclaimer_text_"+disclaimer_key+"'>"+disclaimer_text+"</dd>");
				}
			}
			
			
			// Write out all numberless disclaimers second
			for (var disclaimer in numberless_disclaimers) {
				var disclaimer_key = numberless_disclaimers[disclaimer]['key'];
				var disclaimer_text = disclaimers_from_service[disclaimer_key];
				
				// If a blank disclaimer is returned then this is a drastic problem and it needs to be alerted and we must abort.
				if (disclaimer_text === false) {
					return alert('An unidentifiable disclaimer was requested ('+disclaimer_key+')');
				}

				// Insert the text from the disclaimer service into the disclaimer object for retrieval later.
				numberless_disclaimers[disclaimer]['text'] = disclaimer_text;
			
				// If this disclaimer was baked into the page don't bother rewriting it.
				if (numberless_disclaimers[disclaimer]['was_baked_in']) {
					continue;
				}
				else {
					disclaimers.push("<dt class='disclaimer_text disclaimer_text_"+disclaimer_key+"'>&nbsp;</dt>");
					disclaimers.push("<dd class='disclaimer_text disclaimer_text_"+disclaimer_key+"'>"+disclaimer_text+"</dd>");
				}
			}


		
			// Merge the disclaimers HTML snippets and unveil them.
			jQuery("#disclaimers dl").prepend(disclaimers.join(""));
		}
	}
})();
} catch(e) { cllc.standard_error_handler(e); }
})();

cllc.dom_ready(function() {
	cllc.disclaimers.init();
})
