function LoginManager()
{
	if( getCookie( "Chum_IsLoggedIn" ) != null )
	{
		this.IsLoggedIn = true;
		
		this.User = new Object();
		this.User.NickName = getCookie( "Chum_NickName" );
	}
	else
	{
		this.IsLoggedIn = false;
		
		this.User = new Object();		
	}
}
LoginManager.GetInstance = function()
{
	if( ! LoginManager.__instance )
	{
		LoginManager.__instance = new LoginManager();
	}
	return LoginManager.__instance;
}

LoginManager.Login = function( sendStatus )
{
	var instance = LoginManager.GetInstance();

	var usernameField = document.getElementById("username");
	var passwordField = document.getElementById("password");
	
	if( !usernameField || !passwordField )
	{
		throw new Error( "Could not find username, password fields." );
		return;
	}
	
	usernameField.disabled = true;
	passwordField.disabled = true;
	
	var req = new XMLHttpRequest();
	req.open("POST", "/universalInclude/code/modules/login/DoLogin.asp", true);
	req.onreadystatechange = function() { 
		LoginManager.Login_Handler( req, sendStatus ); 
	};
	req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	req.send( 
		"username=" + escape( usernameField.value ) 
		+ "&password=" + escape( passwordField.value ) 
	);
}
LoginManager.Login_Handler = function( req, sendStatus )
{
	if( req.readyState == 4 )
	{
		var serverResponse = req.responseText;
		var lm = LoginManager.GetInstance();
		
		var usernameField = document.getElementById("username");
		var passwordField = document.getElementById("password");
		
		usernameField.disabled = false;
		passwordField.disabled = false;
		
		// We were successfully logged in by the server.
		if(  /<status>1<\/status>/i.test( serverResponse ) )
		{
			lm.IsLoggedIn = true;
			
			var nickname = serverResponse.match( /<nickname>([^<]*)<\/nickname>/i )[1];
			
			lm.User.NickName = nickname;
			
			setCookie( "Chum_IsLoggedIn", true, undefined, "/" );
			setCookie( "Chum_NickName", lm.User.NickName, undefined, "/" );
		}
		else
		{
			lm.IsLoggedIn = false;
			
			deleteCookie( "Chum_IsLoggedIn" );
			deleteCookie( "Chum_NickName" );
		}
		
		if( sendStatus )
		{
			sendStatus( lm.IsLoggedIn );
		}
	}
}
LoginManager.Logout = function( sendStatus )
{
	var req = new XMLHttpRequest();
	req.open("GET", "/universalInclude/code/modules/login/DoLogout.asp", true);
	req.onreadystatechange = function() { 
		LoginManager.Logout_Handler( req, sendStatus ); 
	};
	req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	req.send( null );
}
LoginManager.Logout_Handler = function( req, sendStatus )
{
	if( req.readyState == 4 )
	{
		var lm = LoginManager.GetInstance();
		
		lm.IsLoggedIn = false;		
		deleteCookie( "Chum_IsLoggedIn", "/" );
		deleteCookie( "Chum_NickName", "/" );
						
		if( sendStatus )
		{
			sendStatus( lm.IsLoggedIn );
		}
	}
}
LoginManager.GetUser = function()
{
	return LoginManager.GetInstance().User;
}
LoginManager.GetLoginStatus = function()
{
	return LoginManager.GetInstance().IsLoggedIn;
}


/**
 * Sets a Cookie with the given name and value.
 *
 * name       Name of the cookie
 * value      Value of the cookie
 * [expires]  Expiration date of the cookie (default: end of current session)
 * [path]     Path where the cookie is valid (default: path of calling document)
 * [domain]   Domain where the cookie is valid
 *              (default: domain of calling document)
 * [secure]   Boolean value indicating if the cookie transmission requires a
 *              secure transmission
 */
function setCookie(name, value, expires, path, domain, secure)
{
    document.cookie= name + "=" + escape(value) +
        ((expires) ? "; expires=" + expires.toGMTString() : "") +
        ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain=" + domain : "") +
        ((secure) ? "; secure" : "");
}

/**
 * Gets the value of the specified cookie.
 *
 * name  Name of the desired cookie.
 *
 * Returns a string containing value of specified cookie,
 *   or null if cookie does not exist.
 */
function getCookie(name)
{
    var dc = document.cookie;
    var prefix = name + "=";
    var begin = dc.indexOf("; " + prefix);
    if (begin == -1)
    {
        begin = dc.indexOf(prefix);
        if (begin != 0) return null;
    }
    else
    {
        begin += 2;
    }
    var end = document.cookie.indexOf(";", begin);
    if (end == -1)
    {
        end = dc.length;
    }
    return unescape(dc.substring(begin + prefix.length, end));
}

/**
 * Deletes the specified cookie.
 *
 * name      name of the cookie
 * [path]    path of the cookie (must be same as path used to create cookie)
 * [domain]  domain of the cookie (must be same as domain used to create cookie)
 */
function deleteCookie(name, path, domain)
{
    if (getCookie(name))
    {
        document.cookie = name + "=" + 
            ((path) ? "; path=" + path : "") +
            ((domain) ? "; domain=" + domain : "") +
            "; expires=Thu, 01-Jan-70 00:00:01 GMT";
    }
}

if (typeof XMLHttpRequest == 'undefined') {
 XMLHttpRequest = function () {
   var msxmls = ['MSXML3', 'MSXML2', 'Microsoft'];
   for (var i=0; i < msxmls.length; i++) {
	 try {
	   return new ActiveXObject(msxmls[i]+'.XMLHTTP');
	 } catch (e) { }
   }
   throw new Error("No XML component installed");
 }
}