$(document).ready(function() {

// ----------------------------------------------------
// opens document ready function, edit below this line

    // these should update in the footer from server info
    var isFacebookConnected = false;
    var isFacebookAutoPublish = false;
    var contentBaseUrl = 'www.shockwave.com';
    var disabledPermissions = new Array();
    var facebookUserName = "";


    // user login functions
	// sets focus to input eq picked in preLogin
	function showLogin(){
		$("#loginWrap").show();
	}
	
	$("#loginInputs input").click(function(){
		showLogin();
	});
	
	preSignIn = function(notLocal){
		if (notLocal){
			$.scrollTo('#preLogin', 500, { offset:-15 })
			$(this).delay(500, function(){ 
				showLogin();
			});

		}
	}

	$(".rememberMeWrap label").live("click", function(){
		$(this).toggleClass("active");
	});
	
	function closeLogin(trigger) {
		$("#loginWrap").hide();
		$("#headerLoginForm").removeClass("errorOn");
		$("#headerLoginForm .error").hide();
		$("#loginInputs input").attr("value","");
		//$("#loginInputs .signInFormLogin").attr("value","Screen name").css("color","#999");
	}

	$("#cancelLogin").click(function(trigger){
		closeLogin(trigger);
	});
	

	showLoginError = function(trigger){
		$(trigger).parents("form").find(".error").show();
		var loginForm = $(trigger).parents("form").attr("id");
		if (loginForm == "headerLoginForm") {
			$("#loginWrap").show();
			$("#headerLoginForm").addClass("errorOn");		
		}
	}

	hideLoginError = function(trigger){
		$(trigger).parents("form").find(".error").hide();
		$("#headerLoginForm").removeClass("errorOn");
	}

	$('.loginForm input').live('keyup',function(e) {
		//alert(e.keyCode);
		if( e.keyCode == 13  && ! $(this).find(".formSubmit").hasClass("disabled") ) {
			//signIn( $(this).parents("form").find(".btnMyShockwavePlain") );
			// simulate button click so we don't lose the callback function in some cases
			$(this).parents("form").find(".formSubmit").click();
		}
	});

	showStaticSignIn = function( fromOverlay ) {
		showMessage('#loginStatic','300');
		return false;
	}


    signIn = function( trigger, callbackFunction, secondBtn ) {
		disableSubmitBtn(trigger);
		if(typeof secondBtn != 'undefined') { disableSubmitBtn(secondBtn); }
		hideLoginError(trigger);

		var rememberMe = 0;
		if ($(trigger).parents("form").find(":checkbox").is(":checked") ) {
			rememberMe = 1;
		}

		// make a post request to login controller
		$.post( "/account/memberLoginAjax.jsp",
			{
				source: "JsonRequest",
				login: $(trigger).parents("form").find(".signInFormLogin").val(),
				password: $(trigger).parents("form").find(".signInFormPassword").val(),
				rememberLogin: rememberMe
			},
			function ( data, textStatus ) {
				// Expecting a JSON response back from login controller
				var results = eval( '(' + data + ')' );
				var success = ( results.status == 'ok');
				if (!success) {
					showLoginError(trigger);
					restoreSubmitBtn(trigger);
					if(typeof secondBtn != 'undefined') { restoreSubmitBtn(secondBtn); }
				} else {

					// on success if there was a callback function passed in, call that
					if ( callbackFunction ){
						callbackFunction( results );

					// otherwise just reload the page
					} else {
						location.reload();
					}
				}
			}
		);
	}

	headerSignOut = function() {
		// use time in the query string to keep IE from caching the logout request
		var time = new Date().getTime();
		// make a post request to the logout controller
		$.get( "/memberLogout.jsp?"+time, null,
			function ( data ) {
				// Expecting a JSON response back from login controller
				var results = eval( '(' + data + ')' );
				
				// if there is a redirect URL, go there
				if ( "" != results.message ) {
					location.href = results.message;

				// otherwise just reload the page the user was on
				} else {
					location.reload();
				}
			}
		);
	}

    headerSignOutNoRedirect = function(callbackFunction) {
		// use time in the query string to keep IE from caching the logout request
		var time = new Date().getTime();
		// make a post request to the logout controller
        $.get( "/memberLogout.jsp", null,
			function ( data ) {
				// Expecting a JSON response back from login controller
				var results = eval( '(' + data + ')' );
                // on success if there was a callback function passed in, call that
                if ( callbackFunction ){
                    callbackFunction( results );
                }

            }
		);
    }
    
	removeFacebookAssociation = function(shouldLogoutFacebook) {
		// use time in the query string to keep IE from caching the logout request
		var time = new Date().getTime();
		// make a post request to the logout controller
		$.get( "/facebook/removeShockwaveFromFacebook.jsp", null,
			function ( data ) {
				// Expecting a JSON response back from login controller
				var results = eval( '(' + data + ')' );
                headerSignOutNoRedirect(function(results) {
                    if (shouldLogoutFacebook) facebookLogout();
                });
            }
		);
	}

    setupFacebookVars = function(fbConnected, fbAutoPublish, contentBase, disabledPerms, fbUserName) {
        isFacebookConnected = fbConnected;
        isFacebookAutoPublish = fbAutoPublish;
        contentBaseUrl = contentBase;
        disabledPermissions = disabledPerms;
        facebookUserName = fbUserName;
    }

    facebookConnectLink = function() {
        FB.ensureInit( function() {
            FB.Connect.requireSession(clickFacebookConnect, facebookPopupClosed, true);
            facebookPopupOpened();
        });
	}

	// Show the Facebook login buttons now that the FB login functions are available
	$("#facebookHeaderLogin, a.btnFacebook").show();

	clickFacebookConnect = function() {
		// make a post request to the logout controller
        $.get( "/facebook/authenticate.jsp", null,
			function ( data ) {
				// Expecting a JSON response back from login controller
				var results = eval( '(' + data + ')' );
					//alert("Needs Popup " + results.needsPopup);
				
                if (results.needsLogin == 'false') {
					window.location.reload();
				} else {
                    sendLinkEvent('fbc_regoverlay');  // post to omniture: connect dialog opened
                    showMessage('#facebookPopup','700','');
					$('.dimmerBtnClose').unbind('click');
					$('.dimmerBtnClose').click(function() {
                        sendLinkEvent('fbc_regoverlay_close');  // post to omniture: connect dialog closed
                        hideMessage();
						removeFacebookAssociation(false);
						return false;
					});
				}
			}
		);
	}

    getFacebookUserName = function() {
        return facebookUserName;
    }
    

    var wallPostCallback = null;
    facebookPostToWall = function(postType, comment, gameTitle, description, keyword, trophy, postCallback) {

        if (!isFacebookConnected) {
            if (postCallback) {
                postCallback( null );
            }
            return;
        }

        if (disabledPermissions && disabledPermissions.length > 0) {
            for (i = 0;i < disabledPermissions.length;i++) {
                if (postType == disabledPermissions[i]) {
                    //alert(postType + " is disabled");
                    if (postCallback) {
                        postCallback( null );
                    }
                    return;
                }
            }
        }

        var playNowGameLink = null;
        var attachment = null;
        var actionLinks = null;
        //alert("Me: " + facebookUserName);

        if (keyword)    // we have a game
        {
            var imageSrc = contentBaseUrl + '/i/picons/' + keyword + '_regular.jpg';
            if (trophy) imageSrc = contentBaseUrl + "/i/trophies/offsite/" + keyword + "/" + trophy + ".png";

            var gameLinkBaseUrl = contentBaseUrl + '/gamelanding/' + keyword + '.jsp?s=fb&p=' + postType;
            var imageGameLink = gameLinkBaseUrl + '&c=picon';
            var nameGameLink = gameLinkBaseUrl + '&c=game';
            var playNowGameLink = gameLinkBaseUrl + '&c=playnow';

            var attachment = {
                'media': [{'type':'image',
                         'src':imageSrc,
                         'href':imageGameLink}],
                'name':gameTitle,
                'description':description,
                'href': nameGameLink
            };

            actionLinks = [{ "text": "Play Now", "href": playNowGameLink}];
        }
        postingType = postType;
        wallPostCallback = postCallback;
        FB.Connect.streamPublish('', attachment, actionLinks, null, "Want to post to Facebook?", facebookWallPostCallback, isFacebookAutoPublish);

        if ( isFacebookAutoPublish ) {
            sendLinkEvent('fbc_share_' + postType); // post to omniture: faceball wall share
        }

        if ( !postCallback )
        {
            facebookPopupOpened();
        }
    }


    var postingType = "";

    facebookWallPostCallback = function(post_id, exception) {
        if (post_id) {
            //alert("Post type? " + postingType);
            sendLinkEvent('fbc_share_' + postingType + '_prompt' );  // post to omniture: faceball wall share
        }
        if ( wallPostCallback ) {
            wallPostCallback( post_id );
        } else {
            facebookPopupClosed();
        }
    }


	hideFlashObjects = function( ) {
		$(".adWrap").css("visibility","hidden");		// banner ad
		$(".ad300x250").css("visibility","hidden");		// box ad
		$("object#preplayMovie").attr("style","");
		$("object#preplayMovie").css("visibility","hidden");		// game ad
		$("#adWrap").css("visibility","hidden");		// game ad
		$("#gameCanvas").css("visibility","hidden");	// game
		$("object#movieSwf").attr("style","");      // 25K winner page
		$("object#movieSwf").css("visibility","hidden");		// 25K winner page
	}
	showFlashObjects = function () {
		$(".adWrap").css("visibility","visible");		// banner ad
		$(".ad300x250").css("visibility","visible");	// box ad
		$("object#preplayMovie").css("visibility","visible");		// game ad
		$("#adWrap").css("visibility","visible");		// game ad
		$("#gameCanvas").css("visibility","visible");	// game
		$("object#movieSwf").css("visibility","visible");		// 25K winner page
	}
	var facebookPopupIsOpen = false;
	facebookPopupVideoAdCheck = function() {
		if ( facebookPopupIsOpen ) {
			$("object#preplayMovie").attr("style","");
			$("object#preplayMovie").css("visibility","hidden");
		}
	}
	facebookPopupOpened = function() {
		facebookPopupIsOpen = true;
		hideFlashObjects();
    }
    facebookPopupClosed = function() {
		facebookPopupIsOpen = false;
		showFlashObjects();
    }


    showFacebookPerms = function(results) {
        FB.ensureInit( function() {
            FB.Connect.showPermissionDialog("publish_stream,email", updateFacebookPermissions);
            facebookPopupOpened();
        });
    }

    showFacebookPermsEmail = function(results) {
        revokeFacebookPermission("email");
        //FB.Connect.showPermissionDialog("email", updateFacebookPermissions);
		facebookPopupOpened();
    }

    showFacebookPermsPrompt = function(results) {
        revokeFacebookPermission("publish_stream");
        //FB.Connect.showPermissionDialog("publish_stream", updateFacebookPermissions);
		facebookPopupOpened();
    }

    updateFacebookPermissions = function(perms) {

        // make a post request to the logout controller
        $.get( "/facebook/updatePermissions.jsp", null,
            function ( data ) {
                // nothing needed in return
                var results = eval( '(' + data + ')' );
            }
        );

        sendLinkEvent('fbc_regoverlay_success');    // post to omniture: facebook account succesfully linked
        showMessage("#facebookConfirmPopup","600");
		//facebookPopupClosed();
	}

    revokeFacebookPermission = function(perm) {
        // make a post request to the logout controller
        $.post( "/facebook/revokePermission.jsp",
			{source: "JsonRequest", perm: perm},
            function ( data ) {
                var results = eval( '(' + data + ')' );
                if (results.error && results.error.size > 0)
                {
                    alert(results.error);
                }
                else
                {
                    FB.Connect.showPermissionDialog(perm, updateFacebookPermissions);
                }
            }
        );
	}

    showFacebookError = function(error)
    {
        alert(error);
    }


    

    facebookLinkNewScreenName = function() {
		$("#facebookRegistrationForm .screennameError").hide();
		$('#facebookRegistrationForm .screenName').val('');
		$('#facebookRegistrationForm .screenName').focus()
	}
	facebookLinkExistingScreenName = function() {
		$("#facebookRegistrationForm .screennameError").hide();
		var existingName = $('#facebookRegistrationForm .screenName').val();
		$('#facebookRegistrationForm .screenName').val('');
		$('#facebookLinkScreenName').val( existingName );
		$('#facebookLinkPassword').focus();
	}
	facebookLinkNotYou = function() {
	}

	// end of user login functions


	$("#globalSearch input").click(function(){
		$(this).css("color","#000")
	})




	// extends ut.tabs
	// will target tabs panel or, if it exists, inner div with class of tabEqualizer
	// sets min-height of all tabEqualizer divs equal to the first shown tab
	// doesn't work with IE6
	$.extend($.ui.tabs.prototype, {
		equalize: function() {
			var target = this.$panels;
			if ( target.find(".tabEqualizer").length > 0) {
				var target = this.$panels.find(".tabEqualizer");
			}
			var heights = target.map(function() {
				return $(this).height();
			})
			.get()
			.sort(function(a, b) {
				return b - a;
			});
			// set all panels to highest height
			target.css('min-height', heights[0]);
		}
	}); 

    // initialize specific UI tabs
	$("#podHotOnlineGames > ul").tabs().tabs("equalize");
	$("#podStaffPicks > ul").tabs();
	$("#podStaffPicks").show();
	$("#podGameIcons > ul").tabs().tabs("equalize");
	$("#podClubGames > ul").tabs().tabs("equalize");
	$("#podAccountSettings > ul").tabs();
	$("#podCommSettings > ul").tabs().tabs("equalize");
	$("#podHighScores > ul").tabs();
	$("#podHighScores").show();
	$("#podMyGames > .podContent > ul").tabs();
	$("#podMyGames").show();
	$("#podGameTrophies > ul").tabs();
	$("#podGameTrophies ol").tabs();
	$("#podGameTrophies").show();
	$("#pokerTabs > ul").tabs();
//	$("#pokerStakes > ul").tabs();
	$("#bingoTabs > ul").tabs({ selected: 1 });
	$(".bingoTypeTabs > ul").tabs();
	
	// Delay Plugin for jQuery
	// - http://www.evanbot.com
	// - © 2008 Evan Byrne
	jQuery.fn.delay = function(time,func){
		return this.each(function(){
			setTimeout(func,time);
		});
	};

    /**
     * Formats a number with commas ( 99999 -> 99,999 )
     * @param number
     */
    formatNumber = function( number ) {
        if ( isNaN(number) ) return number;
        if ( typeof number != "string" ) {
            number = number.toString();
        }
        for (var i = number.length-2; i>0; i-=3 ) {
            if ( i-1 > 0 ) {
                number = number.substring( 0, i-1 ) + "," + number.substring( i-1 );
            }
        }
        return number;
    };

    // function to preload images, call with $.preloadImages
	jQuery.preloadImages = function() {
	  for(var i = 0; i<arguments.length; i++)  {
		 jQuery("<img>").attr("src", arguments[i]);
	  }
	}

	// centers an element vertically/horizontally
	// requires parent be position relative or absolute
	// positioning for .centerVH is already set in common.css
	// Old method didn't work with firefox 3.6 updatd 2.22.2010
	centerVH = function() {
		$(".centerVH").each(function(){
			var imgHeight = $(this).height();
			var imgWidth = $(this).width();
			var container = $(this).parent();
			var containerHeight = container.height();
			var containerWidth = container.width();
			var top = Math.floor((containerHeight / 2) - (imgHeight / 2));
			var left = Math.floor((containerWidth / 2) - (imgWidth / 2));
			$(this).css({position : "absolute", "top" : top,"left" : left});
		});
	}

	jQuery.tab = function(tabNum) {
        $('.selector').tabs({ selected: tabNum });
    }
	

	
	// form submit validation
	// disables the button on submit
	// add disableSubmitBtn(trigger); at the beginning of a form to disable submit button
	// add restoreSubmitBtn(trigger); at the failure at any AJAX form to restore button
	disableSubmitBtn = function(trigger) {

		// clone the trigger and disable it
		var disabledButton = $(trigger).clone();
		disabledButton.addClass("disabled").attr("onclick","");

		// inject the cloned, disabled trigger into the dom
		$(trigger).before(disabledButton);

		// and hide the original trigger
		$(trigger).hide();
	}
	restoreSubmitBtn = function(trigger) {
		$(trigger).prev(".disabled").remove();
		$(trigger).show();
	}



    /**
     * global function to update the tokens in the header
     * @param newTokenBalance number of the new balance to display in the header
     */

    updateTokens = function ( newTokenBalance ) {

        // format or reject the newTokenBalance
        if ( isNaN( newTokenBalance ) ) {
            return false;
        }

        $("#tokenCount span").after("<span style='display:none;'>" + formatNumber( newTokenBalance ) + "</span>");
        $("#tokenCount span").each( function() {
           $(this).toggle("slow");
        });
        $("#tokenCount span:first").remove();
    }


	// clears the search input on focus
	$("#globalSearch input, #cooliris input").focus(function(){
		$(this).val("").css("color","#333")
	});

	// detects which search button has been clicked
	//TODO: fix site search URL
	$("#globalSearch a").click(function(){
		var trigger = $(this).attr("id");
		var queryString = $("#globalSearch :text").attr("value");
		if ( trigger == "searchWeb" ) {
			document.location.href = "http://search.live.com/results.aspx?q="+queryString+"&mkt=en-us&FORM=VCM019";
		} else {
			document.location.href = "/search.jsp?q="+queryString;
			return false;
		}
	});

	$("#globalSearch").keydown(function(e) {
		if(e.keyCode == 13) {
			$("#globalSearch a:first").click();
			return false;
		}
	});

	/**
	 * Function to AJAX load a URL into a jQuery UI-Tabs tab with additional configurable options
	 * NOTE: responseText, textStatus and XMLHttpRequest are available for use in the callback function
	 * @param tab anchor object for which the HREF attribute specifies what element to inject the results into
	 * @param url the AJAX URL to load
	 * @param runOnce removes the loading functionality (onclick attribute) so it happens only once per page view
	 * @param callback an optional function to call when the ajax load is finished, success or not.
	 */
	ajaxTabLoad = function ( tab, url, runOnce, callback ) {
		// load the data from the server
		if ( typeof tab == "object" ) {
			var targetDiv = $(tab).attr( "href");
		} else {
			var targetDiv = $(tab);
		}
		$( targetDiv ).load( url, {}, function( responseText, textStatus, XMLHttpRequest ) {

			if ( callback ) {
				callback( responseText, textStatus, XMLHttpRequest );
			}
		});

		// if runOnce, prevent it from loading again
		if ( runOnce ) {
			$( tab ).removeAttr( "onclick" );
		}
		return false;
	};

	/**
	 *
	 * @param url the AJAX URL to load
	 * @param targetElement the target element or a jquery selector string to load the results into
	 * @param callback an optional function to call when the ajax load is finished, success or not.
	 */
	ajaxLoad = function ( url, targetElement, callback ) {
		// determine if the targetElement is indeed an object or a string to load one
		if ( typeof targetElement == "string" ) {
			targetElement = $( targetElement );
		}

		// load the data from the server
		targetElement.load( url, {}, function( responseText, textStatus, XMLHttpRequest ) {
			if ( callback ) {
				callback( responseText, textStatus, XMLHttpRequest );
			}
		});
	};

	removeShowAllReviewsLink = function() {
		$('#showAllReviewsLink').remove();
	}

	timedRedirect = function (redirectUrl, delaySeconds){
		var redirectTimer = setTimeout( function() {
			document.location.href = redirectUrl;
		}, delaySeconds * 1000);
	}


// closes document ready function, edit above this line
// -----------------------------------------------------

});
