// TODO: Add initialization of the properties from the C# counterparts
/**
 * Membership
 * 
 * Membership.loginUrl;
 * Membership.directLoginUrl;
 * Membership.createAccountUrl;
 * Membership.resetPasswordUrl;
 * Membership.guestLoginUrl;
 * Membership.userInfo;
 * Membership.usernameRegex;
 * Membership.loginPasswordRegex;
 * Membership.getFinalUrl( target, thankUrl, retUrl, failUrl, additionalParameters )
 * Membership.getFinalDirectLoginUrl( target, thankUrl, retUrl, failUrl, additionalParameters, username, password, rememberMe )
 * Membership.isValidUsername( username )
 * Membership.isValidLoginPassword( password )
 */
Membership = {};


/**
 * Holds the various membership return status codes
 * 
 * Membership.AccountReturnedStatus.OK
 * Membership.AccountReturnedStatus.ACCOUNT_ERROR
 * Membership.AccountReturnedStatus.INVALID_PARAMETERS
 * Membership.AccountReturnedStatus.USER_LOGGED_OFF
 * Membership.AccountReturnedStatus.USERNAME_PASSWORD_MISMATCH
 * Membership.AccountReturnedStatus.USER_BLOCKED
 * Membership.AccountReturnedStatus.USERNAME_USED
 * Membership.AccountReturnedStatus.NICKNAME_USED
 * Membership.AccountReturnedStatus.ACCOUNT_NOT_CREATED
 * Membership.AccountReturnedStatus.CAPTCHA_MISMATCH
 * @type Object
 */
Membership.AccountReturnedStatus = {};
Membership.AccountReturnedStatus.OK = 0;
Membership.AccountReturnedStatus.ACCOUNT_ERROR = 1;
Membership.AccountReturnedStatus.INVALID_PARAMETERS = 2;
Membership.AccountReturnedStatus.USER_LOGGED_OFF = 4;
Membership.AccountReturnedStatus.USERNAME_PASSWORD_MISMATCH = 8;
Membership.AccountReturnedStatus.USER_BLOCKED = 16;
Membership.AccountReturnedStatus.USERNAME_USED = 32;
Membership.AccountReturnedStatus.NICKNAME_USED = 64;
Membership.AccountReturnedStatus.ACCOUNT_NOT_CREATED = 128;
Membership.AccountReturnedStatus.CAPTCHA_MISMATCH = 256;


/**
 * Holds the various membership parameter names
 * 
 * Membership.Params.ERROR_CODE;
 * Membership.Params.CHANNEL_CODE;
 * Membership.Params.LANGUAGE_CODE;
 * Membership.Params.USERNAME;
 * Membership.Params.EMAIL;
 * Membership.Params.PASSWORD;
 * Membership.Params.CURRENT_PASSWORD;
 * Membership.Params.REMEMBER;
 * Membership.Params.RETURN_URL;
 * Membership.Params.FAIL_URL;
 * Membership.Params.THANK_URL;
 * Membership.Params.COMMAND;
 * Membership.Params.TAB;
 * Membership.Params.VERIFY_EMAIL;
 * Membership.Params.IS_BASIC;
 * @type Object
 */
Membership.Params = {};
Membership.Params.ERROR_CODE = 'errorCode';
Membership.Params.CHANNEL_CODE = 'channel';
Membership.Params.LANGUAGE_CODE = 'lc';
Membership.Params.USERNAME = 'username';
Membership.Params.EMAIL    = 'email';
Membership.Params.PASSWORD = 'password';
Membership.Params.CURRENT_PASSWORD = 'currentPassword';
Membership.Params.REMEMBER = 'remember';
Membership.Params.RETURN_URL = 'retUrl';
Membership.Params.FAIL_URL = 'failUrl';
Membership.Params.THANK_URL = 'thankUrl';
Membership.Params.COMMAND = 'cmd';
Membership.Params.TAB = 'tab';
Membership.Params.VERIFY_EMAIL = 'verifyEmail';
Membership.Params.IS_BASIC = 'isBasic';


/**
 * The base URL for the membership login command
 * @type String
 */
Membership.loginUrl;
/**
 * The base URL for the membership direct login command
 * @type String
 */
Membership.directLoginUrl;
/**
 * The base URL for the membership create account command
 * @type String
 */
Membership.createAccountUrl;
/**
 * The base URL for the membership reset password command
 * @type String
 */
Membership.resetPasswordUrl;
/**
 * The base URL for the membership guest login command
 * @type String
 */
Membership.guestLoginUrl;
/**
 * Holds the various membership user info command URLs
 * 
 * Membership.userInfo.profileSummaryUrl
 * Membership.userInfo.personalInfoUrl
 * Membership.userInfo.fasUrl
 * Membership.userInfo.tokensUrl
 * Membership.userInfo.recentGamesUrl
 * Membership.userInfo.highscoresUrl
 * Membership.userInfo.userPassUrl
 * @type Object
 */
Membership.userInfo = {};
/**
 * The base URL for the membership profile summary command
 * @type String
 */
Membership.userInfo.profileSummaryUrl;
/**
 * The base URL for the membership personal info command
 * @type String
 */
Membership.userInfo.personalInfoUrl;
/**
 * The base URL for the membership fas command
 * @type String
 */
Membership.userInfo.fasUrl;
/**
 * The base URL for the membership tokens command
 * @type String
 */
Membership.userInfo.tokensUrl;
/**
 * The base URL for the membership recent games command
 * @type String
 */
Membership.userInfo.recentGamesUrl;
/**
 * The base URL for the membership high scores command
 * @type String
 */
Membership.userInfo.highscoresUrl;
/**
 * The base URL for the membership user pass command
 * @type String
 */
Membership.userInfo.userPassUrl;

/**
 * The regex used to validate email fields
 * @type RegEx
 */
Membership.emailRegex;

/**
 * The regex used to validate login password fields
 * @type RegEx
 */
Membership.loginPasswordRegex;

/**
 * The channel code in context.
 * @type Number
 */
Membership.channelCode;

/**
 * The language code in context.
 * @type String
 */
Membership.languageCode;

/**
 * Returns the final membership url to use by performing the proper replacements in the target URL
 *
 * @param {String} target
 * The target url to use
 * 
 * @param {String} thankUrl
 * The thank you URL to pass to the target
 * This parameter is optional and if not passed nothing will be added
 * 
 * @param {String} retUrl
 * The return URL to pass to the target
 * This parameter is optional and if not passed nothing will be added
 *
 * @param {String} failUrl
 * The failure URL to pass to the target
 * This parameter is optional and if not passed nothing will be added
 *
 * @param {Object} additionalParameters
 * An object which can contain any additional parameters to pass to the target
 * This parameter is optional and if not passed nothing will be added
 */
Membership.getFinalUrl = function( target, thankUrl, retUrl, failUrl, additionalParameters )
{
    // Default params to an empty hash or what is passed in additionalParameters
    var params;
    if ( additionalParameters )
        params = additionalParameters;
    else
        params = {};

    // Populate URLs if passed
    if ( thankUrl )
        params[Membership.Params.THANK_URL] = thankUrl;
    if ( retUrl )
        params[Membership.Params.RETURN_URL] = retUrl;
	if ( failUrl )
	    params[Membership.Params.FAIL_URL] = failUrl;
	
	// Populate channel and lang codes
	params[Membership.Params.CHANNEL_CODE] = Membership.channelCode;
	params[Membership.Params.LANGUAGE_CODE] = Membership.languageCode;
	
	var oTarget = Url.parse(target);
	oTarget.withClearanceParams =true;
	Object.extend(oTarget.params,params);
	var finalTarget = Url.relativeUrl(oTarget);   
    
    // Be sure to logout the user on the membership domain if he logged out on the partner domain
    
    var user = new UA.User();
    if ( !user.IsLoggedOn() )
		finalTarget += '&ui=none';
	
	// Return final result
	return finalTarget;
}


/**
 * Returns the final membership direct login url to use by performing the proper replacements in the target URL
 *
 * @param {String} target
 * The target url to use
 * 
 * @param {String} thankUrl
 * The thank you URL to pass to the target
 * This parameter is optional and if not passed nothing will be added
 * 
 * @param {String} retUrl
 * The return URL to pass to the target
 * This parameter is optional and if nothing is passed the current URL will be passed
 *
 * @param {String} failUrl
 * The failure URL to pass to the target
 * This parameter is optional and if nothing is passed an empty string will be passed
 *
 * @param {Object} additionalParameters
 * An object which can contain any additional parameters to pass to the target
 * This parameter is optional and if not passed nothing will be added
 *
 * @param {String} username
 * The username to use in the login operation
 * This parameter is optional and if nothing is passed the replacement will not be made
 *
 * @param {String} password
 * The password to use in the login operation
 * This parameter is optional and if nothing is passed the replacement will not be made
 * 
 * @param {Boolean} rememberMe
 * Whether the user has opted for the system to persist the login across browser sessions or not
 * This parameter is optional and if nothing is passed the replacement will not be made
 */
Membership.getFinalDirectLoginUrl = function( target, thankUrl, retUrl, failUrl, username, password, remember, additionalParameters )
{
    // Add login params to any additionalParameters passed
    var params;
    if ( additionalParameters )
        params = additionalParameters;
    else
        params = {};
    
    params[Membership.Params.USERNAME] = username;
    params[Membership.Params.PASSWORD] = password;
	params[Membership.Params.REMEMBER] = remember;
	
	// Create final URL
	var finalTarget = Membership.getFinalUrl( target, thankUrl, retUrl, failUrl, params );
	return finalTarget;
}


/**
 * Returns whether the username parameter is valid
 *
 * @param {String} username
 * The username to test
 */
Membership.isValidUsername = function( username )
{
    var isValid = Membership.usernameRegex.test( username );
    return isValid;
}


/**
 * Returns whether the password parameter is valid
 *
 * @param {String} password
 * The password to test
 */
Membership.isValidLoginPassword = function( password )
{
    var isValid = Membership.loginPasswordRegex.test( password );
    return isValid;
}

/**
 * Logs in the user.
 * Redirects the user to:
 * 1. retUrl  - in case of success.
 * 2. failUrl - in case of failure.
 *
 * @param {String} retUrl
 * The return URL to pass to the target
 *
 * @param {String} failUrl
 * The failure URL to pass to the target
 * There will be an added errorCode parameter in the query string.
 * Available errors are:
 *  Membership.AccountReturnedStatus.ACCOUNT_ERROR,
 *  Membership.AccountReturnedStatus.INVALID_PARAMETERS,
 *  Membership.AccountReturnedStatus.USERNAME_PASSWORD_MISMATCH,
 *  Membership.AccountReturnedStatus.USER_BLOCKED
 * The errors are flags and you can have multiple errors. (though no multiple errors are sent yet)
 *
 * @param {String} username
 * The username to use in the login operation
 *
 * @param {String} password
 * The password to use in the login operation
 * 
 * @param {Boolean} rememberMe
 * Whether the user has opted for the system to persist the login across browser sessions or not
 *
 */
Membership.DirectLogin = function(retUrl, failUrl, username, password, rememberMe, isBasic)
{
    var params = {};
    
    params[Membership.Params.IS_BASIC] = isBasic;

    var directLoginUrl = Membership.getFinalDirectLoginUrl(Membership.directLoginUrl, null, retUrl, failUrl, username, password, rememberMe, params);
    location.href = directLoginUrl;
}

/**
 * Creates a basic profile for the user.
 * Logs in the user.
 * Success:
 *  In case useInternalThankPage is true, moves the user to an internal thank you page and then
 *  to the retUrl.
 *  In case a useInternalThankPage is false, moves the user to the retUrl.
 * Failure:
 *  Moves the user to failUrl.
 *
 * @param {String} retUrl
 * The return URL.
 *
 * @param {String} failUrl
 * The failure URL.
 * There will be an added errorCode parameter in the query string.
 * Available errors are:
 *  Membership.AccountReturnedStatus.ACCOUNT_ERROR,
 *  Membership.AccountReturnedStatus.INVALID_PARAMETERS,
 *  Membership.AccountReturnedStatus.USERNAME_USED
 * The errors are flags and you can have multiple errors. (though no multiple errors are sent yet)
 *
 * @param {Boolean} useInternalThankPage
 * An indication whether to use an internal thank you page
 * before going to the return URL.
 *
 * @param {String} username
 * The username to use in the login operation
 *
 * @param {String} password
 * The password to use in the login operation
 * 
 * @param {Boolean} rememberMe
 * Whether the user has opted for the system to persist the login across browser sessions or not
 *
 * @param {String} email
 * The email for this user.
 *
 */
Membership.DirectBasicRegistration = function(retUrl, failUrl, useInternalThankPage, username, password, rememberMe, email)
{
    var params = {};
    
    params[Membership.Params.USERNAME] = username;
    params[Membership.Params.PASSWORD] = password;
    params[Membership.Params.EMAIL] = email;
    params[Membership.Params.REMEMBER] = rememberMe;
    params[Membership.Params.IS_BASIC] = true;
    
    var thankUrl = useInternalThankPage ? null : retUrl;
    var directCreateAccountUrl = Membership.getFinalUrl(Membership.directCreateAccountUrl, thankUrl, retUrl, failUrl, params);
    
    location.href = directCreateAccountUrl;
}

/**
 * Changes the password of the user.
 * Redirects the user to:
 * 1. retUrl  - in case of success.
 * 2. failUrl - in case of failure.
 *
 * @param {String} retUrl
 * The return URL to pass to the target
 *
 * @param {String} failUrl
 * The failure URL to pass to the target
 * There will be an added errorCode parameter in the query string.
 * Available errors are:
 *  Membership.AccountReturnedStatus.ACCOUNT_ERROR,
 *  Membership.AccountReturnedStatus.INVALID_PARAMETERS,
 *  Membership.AccountReturnedStatus.USER_LOGGED_OFF,
 *  Membership.AccountReturnedStatus.USERNAME_PASSWORD_MISMATCH,
 *  Membership.AccountReturnedStatus.USER_BLOCKED
 * The errors are flags and you can have multiple errors. (though no multiple errors are sent yet)
 *
 * @param {String} username
 * The username.
 *
 * @param {String} oldPass
 * The old password of the user
 * 
 * @param {String} newPass
 * The new password of the user.
 *
 */
Membership.DirectChangePassword = function(retUrl, failUrl, oldPass, newPass)
{
    var params = {};
    
    params[Membership.Params.CURRENT_PASSWORD] = oldPass;
    params[Membership.Params.PASSWORD] = newPass;
    
    var directUpdateUrl = Membership.getFinalUrl(Membership.directUpdateUrl, null, retUrl, failUrl, params);
    location.href = directUpdateUrl;
}

/**
 * Initiates the forgot password for the user.
 * In case of success, the user will be moved to an internal thank you page and then to the retUrl.
 * In case of failure the user will be moved to the failUrl
 *
 * @param {String} retUrl
 * The return URL to pass to the target
 *
 * @param {String} failUrl
 * The failure URL to pass to the target
 * There will be an added errorCode parameter in the query string.
 * Available errors are:
 *  Membership.AccountReturnedStatus.ACCOUNT_ERROR,
 *  Membership.AccountReturnedStatus.INVALID_PARAMETERS,
 *  Membership.AccountReturnedStatus.USER_BLOCKED,
 *  Membership.AccountReturnedStatus.ACCOUNT_NOT_CREATED
 * The errors are flags and you can have multiple errors. (though no multiple errors are sent yet)
 *
 * @param {Boolean} useInternalThankPage
 * An indication whether to use an internal thank you page
 * before going to the return URL.
 *  
 * @param {String} username
 * The username.
 *
 * @param {Boolean} verifyEmail
 * If true - a link to the email will be sent and the link will reset the password.
 * If false - the password will be reset and then an email containing it will be sent.
 *
 */
Membership.DirectForgotPassword = function(retUrl, failUrl, useInternalThankPage, username, verifyEmail)
{
    var params = {};
    
    params[Membership.Params.USERNAME] = username;
    params[Membership.Params.VERIFY_EMAIL] = verifyEmail;
    
    var thankUrl = useInternalThankPage ? null : retUrl;
    var directForgotPasswordUrl = Membership.getFinalUrl(Membership.directForgotPasswordUrl, thankUrl, retUrl, failUrl, params);
    
    location.href = directForgotPasswordUrl;
}
