//(function($) {
var SifrInjection = function($) {
	//$.SifrInjection = self = {};
	var self = {};
	var sifrReplacementString = 'sIFR_replacement_';
	var baseUrl = NIKEOS.BASE[NIKEOS.site_mode];
	self.sifrPath = (!window.site_data && !window.NIKEOS) ? '/sparqtraining/global/swf/sifr/' : baseUrl + '/sparqtraining/global/swf/sifr/';
	self.fonts = {
		din : {
			ratios: '[7, 1.47, 12, 1.43, 14, 1.37, 18, 1.36, 24, 1.34, 25, 1.32, 31, 1.33, 32, 1.31, 35, 1.32, 37, 1.3, 47, 1.31, 69, 1.3, 71, 1.29, 72, 1.3, 75, 1.29, 76, 1.3, 1.29]',
			black: { src: self.sifrPath + 'dinpro-black.swf' },
			bold: {	src: self.sifrPath + 'dinpro-bold.swf' },
			light: { src: self.sifrPath + 'dinpro-light.swf' },
			med: { src: self.sifrPath + 'dinpro-med.swf' },
			reg: { src: self.sifrPath + 'dinpro-reg.swf' }
		}
	};
	
	var activateSifr = function() {
		for (var p in self.fonts) {
			if (typeof self.fonts[p] == 'object') {
				for (var q in self.fonts[p]) {
					NIKEOS.log('activating: ', self.fonts[p][q])
					sIFR.activate(self.fonts[p][q]);
				}
			}
		}
	};
	
	activateSifr();
	
	self.sifrEls = ['header-title-wrap', 'module', 'news-feed-header', 'view-all'];
	self.sifrSettings = {
		'header-title-wrap': {
			el: '.header-title-wrap h1',
			fontFam: 'din',
			font: 'med',
			hoverColor: '#000000',
			css: {
				'.sIFR-root': {
					'color': '#c9fe00',
					'background-color': 'transparent',
					'font-size': '11px',
					'cursor': 'pointer',
					'text-transform': 'uppercase'
				}
			},
			flash: {
				ratios: self.fonts.din.ratios,
				fitExactly: false,
				forceWidth: true,
				selectable: false,
				selector: this.el,//'.header-title-wrap h1',
				wmode: 'transparent'
			}
		},
		'module': {
			el: '.module h3',
			fontFam: 'din',
			font: 'med',
			hoverColor: '#ffffff',
			css: {
				'.sIFR-root': {
					'color': '#c9fe00',
					'background-color': 'transparent',
					'font-size': '11px',
					'cursor': 'pointer',
					'text-transform': 'uppercase'
				}
			},
			flash: {
				ratios: self.fonts.din.ratios,
				fitExactly: false,
				forceWidth: true,
				selectable: false,
				selector: this.el,//'.module h3',
				wmode: 'transparent'
			}
		},
		'news-feed-header': {
			el: '#newsFeedHeader h2',
			fontFam: 'din',
			font: 'med',
			css: {
				'.sIFR-root': {
					'color': '#ffffff',
					'background-color': 'transparent',
					'font-size': '11px',
					'text-transform': 'uppercase'
				}
			},
			flash: {
				ratios: self.fonts.din.ratios,
				fitExactly: false,
				forceWidth: true,
				selectable: false,
				selector: this.el,//'#newsFeedHeader h2',
				wmode: 'transparent'
			}
		},
		'view-all': {
			el: '#newsFeed a.viewAll',
			fontFam: 'din',
			font: 'med',
			css: {
				'.sIFR-root': {
					'color': '#666666',
					'background-color': 'transparent',
					'font-size': '11px',
					'cursor': 'pointer',
					'text-transform': 'uppercase'
				}
			},
			flash: {
				ratios: self.fonts.din.ratios,
				fitExactly: false,
				selectable: false,
				selector: this.el,//'#newsFeed a.viewAll',
				wmode: 'transparent'
			}
		}
	};
	
	var defaultFlashSettings = {
		selectable: true,
		selector: '',
		wmode: 'transparent',
		css: {} || [] || '',
		filters: {},
	    forceSingleLine: false, // og default = true
	    preventWrap: false, // og default = true 
		fitExactly: false, // og default = true
	    forceWidth: false, // og default = true
	    ratios: [],
	    pixelFont: false, // og default = true
	    tuneHeight: 0
	    /*,
	    onRelease : function(fi) {},
	    onRollOver : function(fi) {},
	    onRollOut : function(fi) {}
	    */
	};
	
	var defaultSifrRootCss = {
		'.sIFR-root': {
			'background-color': 'transparent',
			'cursor': 'arrow',
			'font-size': '12px',
			'kerning': 0,
			'leading': 0,
			'letter-spacing': 0,
			'opacity': 100,
			'text-transform': 'normal',
			// native flash settings
			'color': '#000000',
			'display': 'block',
			'font-weight': 'normal',
			'font-style': 'normal',
			'margin-left': 0,
			'margin-right': 0,
			'text-align': 'left',
			'text-decoration': 'none',
			'text-indent': 0
		}
	};

	self.returnIndex = function(obj) {
		// @obj		Object - object containing element to use and sifr replacement string to match against
		//			needs to contain these two values: el, sifr_string
		if (typeof obj != 'object') return false;
		if (!obj.el || !obj.sifr_string) return false;
		sId = obj.el.find('object').attr('id') || obj.el.find('embed').attr('id') || 0;
		sIndex = sId.split(obj.sifr_string).pop();
		delete obj;
		return sIndex;
	};
	self.addFonts = function(obj) {
		// @obj		Object - object of new font fashioned after self.fonts.din
		$.extend(true, self.fonts, obj);
		activateSifr();
	};
	self.addElements = function(arr, push) {
		// this method must PRECEDE self.addSettings
		// @arr		Array - keys in settings object
		// @push	Boolean - true:  push into existing self.sifrEls array
		//					  false: create new array (default)
		var push = !!push;
		if (arr.length < 1) {
			NIKEOS.log('Array length is less than 1!');
			return false;
		}
		if (!push) self.sifrEls = [];
		self.sifrEls.push(arr);
	};
	self.addSettings = function(obj, merge, run) {
		// this method must FOLLOW self.addElements
		// @obj		Object - settings for sifr elements to create 
		// @merge	Boolean - true:  deep merge into current self.sifrSettings
		//					  false: create new object (default)
		// @run		Boolean - true:  run self.runSifr() immediately
		//					- false: do not run self.runSifr() immediately (default)
		var run = !!run;
		if (!merge) self.sifrSettings = {};
		$.extend(true, self.sifrSettings, obj);
		if (run) self.runSifr();
	};
	self.changeSifrCss = function(el, index, color) {
		// @el		String - string matching element passed into sIFR	
		// @index	Number/null - index of element based on sIFR.replacements
		//						- if null passed in (not as string), 
		//						  then el must be entire sifr element name (ie. sIFR_replacement_##)
		// @color	Object - object of on/off states to apply to link
		//					 with these two properties: on, off
		var _c = (color.indexOf('#') == 0) ? color : '#' + color;
		if (el.indexOf('a') == (el.length-1)) {
			var css = [ '.sIFR-root { color: ' + _c + ' }' ];
		} else {
			var css = [ 'a { text-decoration: none; color: ' + _c + ' }', 'a:hover { color: ' + _c + '; }' ];
		}
		
		if (!sIFR.replacements[el]) {
			NIKEOS.log('The ' + el + ' couldn\'t be found in sIFR.replacements');
			return false;
		}
		if (index == null) {
			NIKEOS.log('The ' + el + ' with index of ' + index + ' is null');
			sIFR.replacements[el].changeCSS(css);
		} else if (!sIFR.replacements[el][index]) {
			NIKEOS.log('The ' + el + ' with index of ' + index + ' couldn\'t be found in sIFR.replacements');
			sIFR.replacements[sifrReplacementString + index].changeCSS(css);
		} else {
			NIKEOS.log('The ' + el + ' with index of ' + index + ' is in the final else');
			sIFR.replacements[el][index].changeCSS(css);
		}
	};
	self.compileSifr = function(defaults, sifrs, id) {
		/*
			@defualts	- OBJECT: json object of default settings for corresponding @sifrs
			@sifrs		- OBJECT: json object of settings for individual sifr objects
			@id			- STRING: string for creating custom id, defaults to "element"
		*/
		var _id = id || 'element';
		for (var p in sifrs) {
			if (sifrs[p].el) {
				if ($(sifrs[p].el).length > 0) {
					var $a = $(sifrs[p].el);
					var eid = !$a.attr('id') ? _id + helpers.return_random_number() : $a.attr('id');
					var obj = {};
					NIKEOS.log('floarter id: ', eid);
					obj[id] = $.extend(true, defaults, sifrs[p]);
					self.runSifr(id, obj);
				}
			}
		}
	};
	self.runSifr = function(keys, settings, debug) {
		/*
			@keys		String/Array - a string or array of keys associated with settings
						with the example below, keys = 'myKey'
						- if passing in array, array order does not matter
						- if using the obj[id] method, be sure to give your html element an id attribute
			@settings	Object - nested json object to merge into default settings object:
						settings = {
							'myKey': {
								// settings
							}
						}
			@debug		BOOLEAN, use this if you want to get the ratios printed out. only useful when seting a new font
			when structuring your html to work with rollovers, DO NOT apply the sifr directly to the <a> tag.
			If applied to the <a> tag, the css used for the over state will look like this: a > a 
			- which will not work unless if there are indeed two nested anchor tags (but of course should not).
		*/
		var d = debug || false;
		if (typeof keys == 'string') self.sifrEls.push(keys);
		else if (helpers.is_array(keys)) { 
			$.each(keys, function(i,a) {
				self.sifrEls.push(a);
			});
		}
		if (typeof settings != 'undefined') {
			$.extend(true, self.sifrSettings, settings);
		}
		$.each(self.sifrEls, function(i,a) {
			var obj = self.sifrSettings[a];
			self.createSifr(obj, d);
		});
	};
	self.createSifr = function(obj, debug) {
		if (!obj) return false;
		var _el = obj.el;
		var _fam = obj.fontFam;
		var _font = obj.font;
		// _color:  checks for # in color string
		var _color = (obj.css['.sIFR-root'].color.indexOf('#') == 0) ? obj.css['.sIFR-root'].color : '#' + obj.css['.sIFR-root'].color ;
		var hasHc = (!obj.hoverColor) ? false : true;
		var _hc = (!obj.hoverColor) ? _color : (obj.hoverColor.indexOf('#') == 0) ? obj.hoverColor : '#' + obj.hoverColor;
		var _css = $.extend(true, {}, defaultSifrRootCss, obj.css);
		var merged = _css;

		if ((_hc != _color) || (hasHc && _hc == _color)) {
			var hover = {
				'a': { 'display': 'block', 'color': _color, 'text-decoration': 'none' }, 
				'a:hover': { 'color': _hc, 'text-decoration': 'none' }
			};
			merged = $.extend(true, {}, _css, hover);
		}
		
		var merged_flash_settings = $.extend(true, {}, defaultFlashSettings, obj.flash);
		
		merged_flash_settings.css = merged;
		merged_flash_settings.wmode = 'transparent';
		merged_flash_settings.ratios = self.fonts[_fam][_font].ratios || [];
		merged_flash_settings.fitExactly = false;
		merged_flash_settings.selectable = false;
		merged_flash_settings.selector = _el;
		//NIKEOS.log('merged flash settings: ', merged_flash_settings);
		
		if (debug) {
			NIKEOS.log('sifr debug/ratio settings')
			sIFR.debug.ratios(self.fonts[_fam][_font], merged_flash_settings);
		} else {
			NIKEOS.log('normal sifr settings: ', merged_flash_settings);
			sIFR.replace(self.fonts[_fam][_font], merged_flash_settings);
		}
		
	};
	return self;
}(jQuery);

var CufonInjection = function() {
	var self = {};
	self.createCufon = function(el, options) {
		/*
			@el			String - string of element to cufonify
			@options	Object - json object of options to use - http://wiki.github.com/sorccu/cufon/api
		*/
		if (!el) return false;
		Cufon.replace(el, options || {});
	};
	return self;	
}(jQuery);

var ModuleHover = function($) {
	var self = {};
	self.options = {
		myOptions: {
			el: '.module',
			modBar: '.module-bar',
			link: 'a',
			changeCss: '.module h3', // for sifr
			hoverClass: 'hover',
			hoverColor: '#ffffff',
			hoverColorOff: '#c9fe00',
			sifr: {
				replacementString: 'sIFR_replacement_'
			},
			cufon: false
		}
	};
	function mergeOptions(options) {
		$.extend(true, self.options, options);
	}
	self.changeBar = function(key, options) {
		/*
			@key			String - group to refer to.  using example below key = 'myOptions'
			@options		Object - should be an object in an object:
							options = {
								myOptions: {
									// desired options
								}
							};
							
							this will allow for better grouping and less chances of overriding
		*/
		var key = key || 'myOptions';
		mergeOptions(options);
		if (!self.options[key]) return false;
		var $mod_bar, $a, $this;
		var $el = $(self.options[key].el);
		var mod_bar = self.options[key].modBar;
		var link = self.options[key].link;
		var change_css = self.options[key].changeCss;
		var hover_class = self.options[key].hoverClass;
		var sifr_replacement_string = (self.options[key].sifr) ? self.options[key].sifr.replacementString : '';
		var isCufon = self.options[key].cufon;
		var onColor = self.options[key].hoverColor;
		var offColor = self.options[key].hoverColorOff;
		if ($el.length > 0) {
			$el.hover(
				function() {
					$this = JQ(this);
					$mod_bar = $this.find(mod_bar);
					$a = $this.find(link);
					$a.addClass(hover_class);
					if ($a.hasClass(hover_class)) {}
					else {}
					$mod_bar.addClass(hover_class);
					if ($this.find('object').length > 0 || $this.find('embed').length > 0) {
						sIndex = sparq.ui.sifr.returnIndex({ el: $this, sifr_string: sifr_replacement_string });
						sColor = onColor;
						sparq.ui.sifr.changeSifrCss(change_css, sIndex, sColor);
					}
				},
				function() {
					if (typeof $this != 'undefined') {
						if ($this.find('object').length > 0 || $this.find('embed').length > 0) {
							sIndex = sparq.ui.sifr.returnIndex({ el: $this, sifr_string: sifr_replacement_string });
							sColor = offColor;
							sparq.ui.sifr.changeSifrCss(change_css, sIndex, sColor);
						}
						if ($a.hasClass(hover_class)) $a.removeClass(hover_class);
						if ($mod_bar.hasClass(hover_class)) $mod_bar.removeClass(hover_class);
					}
				}
			);
		}
	};
	return self;	
}(jQuery);

//sport=baseball&gender=m&test=overview
var UserRedirects = function($) {
	var self = {};
	self.grab_params = function(params) {
		/*
			@params		Array - array of values to create query string with
		*/
		if (params) {
			var p = window.location.href.split('?')[1] || window.location.href;
			var params = p.split('&') || p;
			var check = sparq.arrays.protocols;
			var qs = '';
			self.check_params = [];
			
			$.each(check,function(i,a) {
			    var p = a.split('=');
				$.each(params,function(j,b) {
					var q = b.split('=');
					NIKEOS.log(params, ' : ', q);
				    NIKEOS.log(p[0]);
				    NIKEOS.log('$.inArray(p[0], check): ', $.inArray(p[0], params));
				    if ($.inArray(p[0], params) > -1) {
						qs += a + '&';
				    } 
				    /*else {
				    	if ($.cookie('sparq.' + check[i])) {
				    		qs += check[i] + '=' + $.cookie('sparq.' + check[i]) + '&';
			    		}
				    }
				    */
				});		
			});
			self.params = qs.substring(0,(qs.length-1));
		}
	};
	self.create_redirect = function(type,key,page,append,cparams,secure) {
		/*
			@type		String - user type: athlete, trainer, or coach
			@key		String - redirect name
			@page		String - page to redirect to
			@append		String - @cparams must be false, then additional query string values (minus ?)
			@cparams	Bool - use the current url params, defaults to false
			@secure		Bool - https?, defaults to false
		*/
		if (!type || !key || !page){
			NIKEOS.log('Missing type, key, or page params');
			return false;	
		}
		var append = append || '';
		var secure = !!secure;
		var cp = !!cparams;
		var domain = (secure) ? NIKEOS.BASE[NIKEOS.site_mode].replace('http:', 'https:') : NIKEOS.BASE[NIKEOS.site_mode];
		var base = domain + '/nikeos/p/sparqtraining/' + site_data.lang_locale + '/' + page;
		var url = (cp) ? base + '?' + self.params : (!cp && append != '') ? base + '?' + append : base;
		var obj = {};
		obj[type] = {};
		obj[type][key] = url;
		$.extend(true, sparq.user_urls, obj);
	};
	return self;
}(jQuery);

var UI = function($) {
	var $ = $;
	var self = {};
	self.containers = {};
	self.createFlash = function(obj, newEl) {
		var elObj = newEl || {};
		if (!obj.target_id || obj.target_id.length < 0) return false;
		if (obj.target_id.indexOf('#' || '.') == 0) $(obj.target_id).empty();
		else $('#' + obj.target_id).empty();

		if (elObj.target_id) { 
			// this is used if the obj.target_id is not the element to be used to house the falseh
			var $ne = $('<div id="' + newEl.target_id + '" />');
			$('#' + obj.target_id).prepend($ne);
			obj.target_id = newEl.target_id;
		}

		var pos = $('#' + obj.target_id).offset();
		var _settings = obj;
		_settings.element_id = obj.target_id;
		NIKEOS.insertSWF(_settings);

		if (typeof $.scrollTo == 'function') $(window).scrollTo(pos.top);
	};
	self.createFlashObj = function(id, guid, params, vars) {
		/*
			@id			String
			@guid		String
			@params		Object
			@vars		Object
		*/
		var siteConfig = site_data.base_url + '/' + site_data.site_folder + '/global/xml/videoSiteConfig.xml';
		var regionConfig = site_data.base_url + '/nikeos/global/modules/video/v1/xml/reg/reg_config_' + site_data.video_region + '.xml';
		var featured_obj = {
			element_id: id,
			type: 'video_player',
			version: 'latest',
			width: 908,
			height: 510,
			params: $.extend(true, params, {
				allowFullScreen : 'true'
			}),
			vars : $.extend(true, vars, {
				blog_base_url: site_data.blog_base_url,
				currentUrl : NIKEOS.currentURL,
				locale: site_data.lang_locale,
				guid: guid,
				regionConfig: regionConfig,
				site_folder: site_data.site_folder,
				site_data: NIKEOS.stringify(site_data)
			})
		};
		return featured_obj;
	};
	self.createContainer = function(key, id) {
		/*
			@key		String - key name to store information in
			@id 		String - id of container
		*/
		var randId = 'container-' + Math.round(Math.random()*100);
		if (!self.containers[key]) self.containers[key] = {};
		self.containers[key].container = $('<div id="' + (id || randId) + '" class="injected-content" />');
	};
	self.deleteContainer = function(key) {
		/*
			@key		String - key name to store information in
		*/
		if (self.containers[key]) {
			if (self.containers[key].ogTarget.height() != self.containers[key].ogSize) {
				self.containers[key].ogTarget.css({
					height: 'auto!important',
					height: self.containers[key].ogSize,
					'min-height': self.containers[key].ogSize
				});
			}
			self.containers[key].container.remove();
		}
	};
	self.makeNewVideoPlayer = function(key, guid, id, params, vars, mc, resize) {
		/*
			@key		String - value used to store newly created flash object
			@guid		String - video guid to play
			@id			String - target element for flash object to be relative to
								- accepts one of four ways to insert 
								  flash according to jQuery (separated by a colon) :
								  http://docs.jquery.com/Manipulation
									- before
									- after
									- prependTo
									- appendTo
			@params		Object - object of flash params to pass to player
			@vars		Object - object of flash vars to pass to player
			@mc			Bool - determines if this will live in the media container swf, defaults to false
			@resize		Bool - resize the target @id, defaults to false
		*/
		var mc = !!mc;
		var resize = !!resize;
		var targEl = id.search(/\:/) > -1 ? id.split(':') : null;
		var meth = targEl[0];
		var traverseId = '#' + targEl[1];
		var targ_id = key + '-container';

		self.createContainer(key, targ_id);
		
		if (mc) {
			self.containers[key].ogSize = $(traverseId).height();
			self.containers[key].ogTarget = $(traverseId);
		}
		switch(meth) {
			case 'before':
				self.containers[key].container.insertBefore(traverseId);
				if (resize) $(traverseId).css({ 'height': 500, 'min-height': 500 });
				break;
			case 'after':
				self.containers[key].container.insertAfter(traverseId);
				break;
			case 'prependTo': 
				self.containers[key].container.prependTo(traverseId);
				if (resize) $(traverseId).css({ 'height': 500, 'min-height': 500 });
				break;
			case 'appendTo': 
				self.containers[key].container.appendTo(traverseId);
				break;
			default:
				self.containers[key].container.insertBefore(traverseId);
				$(traverseId).css({ 'height': 500, 'min-height': 500 });
		}

        var player = $('<object class="BrightcoveExperience"><param name="bgcolor" value="#000000" /><param name="videoSmoothing" value="true" /><param name="width" value="888" /><param name="height" value="500" /><param name="playerID" value="390534381001" /><param name="publisherID" value="72451143001"/><param name="isVid" value="true" /><param name="isUI" value="true" /><param name="dynamicStreaming" value="true" /><param name="labels" value="http://admin.nikevideo.nike.com/static/video_player/xml/translate/2.0/en_US_Labels.xml" /><param name="@videoPlayer" value="' + guid + '" /><param name="wmode" value="transparent" /></object>');

        $('#'+targ_id).append(player);

        brightcove.createExperiences();

	};


	return self;
}(jQuery);

