/**
 * Framework contains the basic functionality needed for EA mobile pages.
 * Common Javascript that appears on all pages in the EA mobile site
 * should be instantiated here. An example of common javascript is initialization of tracking code,
 * or javascript related to global navigation.
 * 
 * @author John Kakoulides (Fi)
 * @author Kevin Sweeney (Fi)
 * 
 * @constructor
 */

function Framework(){
	this.min_flash_version		= '9.0.115';
	this.expressInstall_swf		= '/Web/refresh/swf/expressInstall.swf';
	this.videoSWFs				= [];
	this.init();
}

/**
 * The init function is called in the constructor..
 */
Framework.prototype.init = function(){
	
	this.buildNewsletter();
	this.setupGamefinder();
	
	if (!this.getCookied()) {
		this.createArrowAni();
	}
	else {
		this.addCookiedContent();
	}
	
}

/**
 * Used to clean up any referenced objects.
 */
Framework.prototype.destroy = function(){

}

/**
 * Replaces phone image with a SWF that animates and shakes if user has not 
 * selected a phone model. Shake properties are editable via FlashVars (see below)
 */
Framework.prototype.createArrowAni = function() {
	
	if ($('div#phoneHolder').get(0)) {
		var phoneSWF = this.embedSWF({
			swf: '/Web/refresh/swf/phoneselector.swf', 
			container: 'phoneHolder', 
			width: '45', 
			height: '84', 
			flashvars: {
				shakeDelay: '5000', 
				shakeDuration: '600'
			}, 
			params: {
				wmode: 'transparent'
			}, 
			attributes: {},
			video: false
		});
		
		$('#userPhone').hide();
		
	}
	
}

/**
 * Adds content for cookied users (currently just a button in sidebar)
 */
Framework.prototype.addCookiedContent = function(){
	$('#sidebarButtons li a.btnMobGames').removeClass('btnMobGames').addClass('btnYourGames');
}

/**
 * First determines if browser is capable of properly displaying skinned form elements
 * If so, they are skinned
 * Finally, basic validation is added to the form.
 */
Framework.prototype.buildNewsletter = function() {
	
	if (!this.oldBrowser()) {
		this.styleSubmitButtons();
		this.styleInputFields();
		this.createDropdowns();
	}
	
	$('#newsletterOptIn').click(function(e) {
		e.preventDefault();
	})
	
	$('#newsletterForm').submit(function(e) {
		
		var formValid	= true;
		
		var email		= $('#newsletterEmail input').val();
		
		var regex		= /^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i
		var emailOk		= regex.test(email);
		
		var month		= $('#newsletterMonth div.selectLabel').text();
		var monthOk		= month != 'Month';
		
		var day			= $('#newsletterDay div.selectLabel').text();
		var dayOk		= day != 'Day';
		
		var year		= $('#newsletterYear div.selectLabel').text();
		var yearOk		= year != 'Year';
		
		if (!emailOk) {
			
			formValid = false;
			
			$('#newsletterEmail input').addClass('error');
			
			if (email == '') {
				$('#newsletterEmail input').val('Please enter a valid email!');
			}
			
			$('#newsletterEmail input').focus(function(){
				
				$('#newsletterEmail input').removeClass('error');
				
				if ($('#newsletterEmail input').val() == 'Please enter a valid email!') {
					$('#newsletterEmail input').val('');
				}
				
			});
			
		}
		
		if (!monthOk) {
			formValid = false;
			$('#newsletterMonth div.selectLabel').wrapInner('<span class="error"></span>');
		}
		
		if (!dayOk) {
			formValid = false;
			$('#newsletterDay div.selectLabel').wrapInner('<span class="error"></span>');
		}
		
		if (!yearOk) {
			formValid = false;
			$('#newsletterYear div.selectLabel').wrapInner('<span class="error"></span>');
		}
		
		if (!formValid) {
			e.preventDefault();
		}
		
	});
	
}

/**
 * Sets up events for gamefinder button
 */
Framework.prototype.setupGamefinder = function(){
	$('a[rel*=facebox]').facebox({opacity: 0.7});
	
}

Framework.prototype.oldBrowser = function() {
	
	var flag = false;
	var vers = $.browser.version;
	
	if ($.browser.msie && vers < 7) {
		flag = true;
	}
	else if ($.browser.opera && vers < 9) {
		flag = true;
	}
	
	return flag;
	
}

/**
 * Attaches events to the search box
 */
Framework.prototype.setupSearch = function() {
	
	$('#search').focus(function(eFocus){
		if(this.value == "Product Search") {
			this.value = "";
			$('#searchWrapper').removeClass('searchWrapper');
			$('#searchWrapper').addClass('searchWrapperActive');
		}
	});
	
	$('#search').blur(function(eFocus){
		if(this.value == "") {
			this.value = "Product Search";
			$('#searchWrapper').removeClass('searchWrapperActive');
			$('#searchWrapper').addClass('searchWrapper');
		}
	});
	
}

/**
 * Creates accordion menus out of all specified list elements
 */
Framework.prototype.buildAccordions = function() {

	var activeGenre = 0;
	if (config.genreNum != undefined){
		activeGenre = config.genreNum;
	}
	
	$('#acc0').accordion({
		event:'mousemove',
		active:activeGenre,
		selectedClass: 'active',
		header:'dt',
		autoheight: false,
		animated: 'slide'
	});
	
	$('#acc1').accordion({
		event:'mousemove',
		active:0,
		selectedClass: 'active',
		header:'dt',
		autoheight: false,
		animated: 'slide'
	});
	
}

/**
 * Skins all supplied input buttons
 */
Framework.prototype.styleSubmitButtons = function() {
	$('#newsletterSubmit').addClass('submitNews');
	$('#newsletterSubmit').val('');
}

/**
 * Skins all supplied input fields
 */
Framework.prototype.styleInputFields = function(){
	$('#newsletterEmail').addClass('inputWrapDark');
}

/**
 * Limits text input fields only to numerical characters
 * @param {Object} evt
 */

Framework.prototype.checkForInt = function(evt) {
	evt = ( evt ) ? evt : window.event;
	var charCode = ( evt.which ) ? evt.which : evt.keyCode;
	return (charCode==13 || charCode==8 || (charCode >= 48 && charCode <= 57));
}

/**
 * Returns the value of a name/value pair in the query string
 * @param {Object} variable
 */
Framework.prototype.getQueryVariable = function(variable){
	
	var query = window.location.search.substring(1);
	var vars = query.split("&");
	
	for (var i = 0; i < vars.length; i++) {
		var pair = vars[i].split('=');
		if (pair[0] == variable) {
			return pair[1];
		}
	}
	
}

/**
 * Skins all supplied <pre>&lt;select&gt;</pre> elements
 * Assigns change events to all dropdowns, which then updates the 
 * '.selectLabel' div, which is positioned on top of the hidden select box.
 */
Framework.prototype.createDropdowns = function() {
	
	var dropdownClasses	= ['month', 'day', 'year', 'carrier'];
	var dropdowns		= ['newsletterMonth', 'newsletterDay', 'newsletterYear', 'newsletterCarrier'];
	var labels			= ['Mes', 'Dia', 'Ano', 'Pais'];
	
	var i = 0;
	var size = dropdowns.length;
	for (i = 0; i < size; i++) {
		$('#' + dropdowns[i]).addClass('skinnedDropdown ' + dropdownClasses[i]);
		$('#' + dropdowns[i] + ' .selectLabel').text(labels[i]);
		$('#' + dropdowns[i] + ' select').change(function(){
			
			var nextText = $(this).children('option').get(this.selectedIndex).text;
			
			if ($(this.parentNode).attr('id') == 'newsletterMonth') {
				nextText = nextText.substr(0, 3);
			}
			
			$(this.parentNode).children('.selectLabel').text(nextText);
			
		});
	}
	
}

/**
 * Styles dropdown menus contained in the search bar
 */
Framework.prototype.createSearchDropdowns = function(){
	
	var dropdownClasses	= ['search_modes', 'search_genres', 'search_modes', 'search_genres'];
	var dropdowns		= ['searchModes', 'searchGenres', 'searchModes_bottom', 'searchGenres_bottom'];
	var labels			= ['Most Popular', 'All Genres', 'Most Popular', 'All Genres'];
	
	var i = 0;
	var size = dropdowns.length;
	for (i = 0; i < size; i++) {
		$('#' + dropdowns[i]).addClass('skinnedDropdown ' + dropdownClasses[i]);
		$('#' + dropdowns[i] + ' .selectLabel').text(labels[i]);
		$('#' + dropdowns[i] + ' select').change(function(){
			var nextText = $(this).children('option').get(this.selectedIndex).text;
			$(this.parentNode).children('.selectLabel').text(nextText);
		});
	}
	
}


/**
 * Styles dropdown menus contained in the search bar
 */
Framework.prototype.createRSSDropdowns = function(){
	
	var dropdownClasses	= ['subscribeSelect', 'subscribeSelect'];
	var dropdowns		= ['RSSNewsSubscribe', 'RSSGameSubscribe'];
	var labels			= ['Select Feed', 'Select Feed'];
	
	var i = 0;
	var size = dropdowns.length;
	for (i = 0; i < size; i++) {
		$('#' + dropdowns[i]).addClass('skinnedDropdown ' + dropdownClasses[i]);
		$('#' + dropdowns[i] + ' .selectLabel').text(labels[i]);
		$('#' + dropdowns[i] + ' select').change(function(){
			var nextText = $(this).children('option').get(this.selectedIndex).text;
			$(this.parentNode).children('.selectLabel').text(nextText);
		});
	}
	
}


/**
 * Truncates a string at the specified number of characters and appends an ellipse or any ending characters
 * @param {Object} string
 * @param {Object} numOfChars
 * @param {Object} ellipseWith
 */
Framework.prototype.ellipse = function(string, numOfChars, ellipseWith){
	var length = string.length;
	var returnString = string;
	
	if(length > numOfChars){
		returnString = string.slice(0, numOfChars);
		returnString = returnString + ellipseWith;
	}else{
		newString = string;
	}
	
	return returnString;
}

Framework.prototype.getCookied = function(){
	return config.cookied;
}

Framework.prototype.embedSWF = function(props) {
	swfobject.embedSWF(props.swf, props.container, props.width, props.height, this.min_flash_version, this.expressInstall_swf, props.flashvars, props.params, props.attributes);
	if (props.video === true) {
		if (this.videoSWFs.length === 0) {
			this.enableVideoEventDispatching();
		}
		this.videoSWFs.push(props.container);
	}
	return props;
}

Framework.prototype.enableVideoEventDispatching = function() {
	
	var scope = this;
	var videoPlayer;
	
	$(document).bind('beforeReveal.facebox', function(){
		for (var i = 0; i < scope.videoSWFs.length; i++) {
			videoPlayer = scope.getSWF(scope.videoSWFs[i]);
			if (videoPlayer.pause !== null && (typeof videoPlayer.pause == 'function')) {
				if(!videoPlayer.resume) {} else {
				videoPlayer.pause();}
			}
		}
	}).bind('close.facebox', function() {
		for (var i = 0; i < scope.videoSWFs.length; i++) {
			videoPlayer = scope.getSWF(scope.videoSWFs[i]);
			if (videoPlayer.resume !== null && (typeof videoPlayer.resume == 'function')) {
				if(!videoPlayer.resume) {} else {
				videoPlayer.resume();}
			}
		}
	});
	
}

Framework.prototype.getSWF = function(movieName) {
	if ($.browser.msie || $.browser.opera) {
		return window[movieName];
	}
	else {
		return document[movieName];
	}
}
