// $Id: LoginLib.js,v 1.9 2011-07-01 16:26:45 jrixon Exp $

function LoginLib(name)
{
	var __pub = {
		name      : name,
		extraData : []
	},

	_timeout = {
		ms : 5000,
		timer : null
	};

	var Req = ReqLib(name,
					 {
						 reqType       : 'login',
						 type          : null,
						 refreshNormal : null,
						 refreshIdle   : null,
						 url           : null,
						 respType      : 'arr',
						 ajaxMethod    : 'POST'
					 }),

	_inputs       = [],
	_formType     = '',
	_extraInfo    = '',
	_successCB    = null,
	_result       = '',
	_button       = null,

	_midRequest = false;



	function canReq()
	{
		if(Req.canReq(true) && !_midRequest) {
			return true;
		}
		return false;
	}



	function makeURL()
	{
		return getBaseURL('committed');
	}



	function makePOST()
	{
		var post = [_inputs.join('&'), '&action=ajax_login'];
		if(_extraInfo) {
			post[post.length] = '&extra_info=';
			post[post.length] = _extraInfo;
		}

		return post.join('');
	}



	function makeId()
	{
		return null;
	}



	function req(formType, button, extraInfo, successCB)
	{
		if(!canReq()) {
			return false;
		}

		var form;

		if(formType == 'main') {

			form = document.forms['fmLogin'];

			var username = form.uname.value;

			if(username == '') {
				sky.overlay.doAlert('&nbsp;', 'Please enter your User ID', 'warning');
				return false;
			}

			if(document.getElementById('remember_me').checked) {
				set_cookie(document.remember_me_cookie, username, oneYearFromNow(), '/', '', '');
			}
			else {
				set_cookie(document.remember_me_cookie, '', '', '/', '', '');
			}

			if(!document.ajax_login || !document.isHTTPS) {
				throw('No ajax login');
			}

		}
		else if(formType == 'popup') {

			form = document.forms['popupLoginForm'];

			var username = form.uname.value;

			if(username == '') {
				document.getElementById('popup_login_msg').innerHTML = 'Please enter your User ID';
				return false;
			}
			else {
				document.getElementById('popup_login_msg').innerHTML = '&nbsp;';
			}

			if(!document.ajax_login || !document.isHTTPS) {
				form.submit();
			}

		}
		else {
			throw('Bad formType');
		}

		_formType  = formType;
		_button    = button;
		_extraInfo = extraInfo;
		_successCB = successCB;
		_inputs    = [];

		var inputs = form.getElementsByTagName('input');
		for(i = 0; i < inputs.length; i++) {
			switch(inputs[i].type) {
			case 'text' :
			case 'password' :
			case 'hidden' :
			case 'submit' :
				if(inputs[i].name == 'action') {
					continue;
				}
				_inputs.push([inputs[i].name, '=', inputs[i].value].join(''));
				break;
			}
		}

		if(_timeout.timer != null) {
			clearTimeout(_timeout.timer);
		}

		_timeout.timer = setTimeout(_timedout, _timeout.ms);

		_midRequest = true;

		Req.req();

		// blank password box
		form.pword.value = '';

		return false;
	}



	function render()
	{
		if(_timeout.timer != null) {
			clearTimeout(_timeout.timer);
		}

		_midRequest = false;

		_result = Req.pub.items[0];

		if(_result == 'OK') {
			set_cookie_no_escape(document.secure_login_cookie, Req.pub.items[1], '', '/secure', '', 1);
			set_cookie(document.login_cookie, Req.pub.items[2], '', '/', '', '');
			if(document.community_cookie == 'AT') {
				set_cookie_no_escape(document.community_cookie,
									 Req.pub.items[3],
									 '',
									 document.community_path,
									 document.community_domain, 1);
			}
			else {
				set_cookie_no_escape(document.community_cookie,
									 Req.pub.items[3],
									 '',
									 '/',
									 document.community_domain, '');
			}

			if(_extraInfo) {
				var i;
				__pub.extraData = [];
				for(i = 4; i < Req.pub.items.length; i++) {
					__pub.extraData.push(Req.pub.items[i]);
				}
			}
		}

		State.parseLogin();

		hint('done');
	}



	function hint(which)
	{
		switch(which) {
		case 'update':
		case 'new':
			if(_formType == 'main') {
				if(_button) {
					sky.addClass(_button,'disabled');
					_button.disabled = true;
				}
			}
			else {
				var buttons = sky.overlay.getButtons();
				buttons[0].hide();
				buttons[1].hide();
			}
			break;
		case 'done':
			if(_formType == 'main') {
				if(_button) {
					sky.removeClass(_button,'disabled');
					_button.disabled = false;
				}
				if(_result == 'OK') {
					_loginOK();
				}
				else {
					dispLogin(false, _result);
				}
			}
			else {
				if(_result == 'OK') {
					document.getElementById('popup_login_msg').innerHTML = 'Login successful';
					setTimeout(_loginOK, 600);
				}
				else {
					document.getElementById('popup_login_msg').innerHTML = _result;
					var buttons = sky.overlay.getButtons();
					buttons[0].show();
					buttons[1].show();
				}
			}
			break;
		}
	}



	function _timedout()
	{
		if(_timeout.timer != null) {
			clearTimeout(_timeout.timer);
		}

		if(!_midRequest) {
			return;
		}
		_midRequest = false;

		Req.incrCount();

		_result = 'Your login request timed out. Please try again.';

		hint('done');

		// server may have seen the login attempt to incr uid
		try {
			var uid = parseInt(document.forms['fmLogin'].login_uid.value);
			document.forms['fmLogin'].login_uid.value = uid + 1;
		} catch(e) {}
	}



	function setLoginUID(uid)
	{
		try {
			document.forms['fmLogin'].login_uid.value = uid;
		} catch(e) {}
	}



	function showPopupForm(simpleForm, extraInfo, successCB, cancelCB)
	{
		if(!canReq()) {
			return false;
		}

		var vis_html = [];
		if(!simpleForm) {
			vis_html[vis_html.length] = '<div class="msg">If you do not have an account please <a href="';
			vis_html[vis_html.length] = document.sbXferURL;
			vis_html[vis_html.length] = '?action=GoAcctReg1&amp;skin=poker" onClick="return goAcctReg(this)">Join us</a>.</div>';
		}
		vis_html[vis_html.length] = '<div class="inpts">';
		vis_html[vis_html.length] = '<label for="pu_uid">User ID</label>';
		vis_html[vis_html.length] = '<input size="12" maxlength="12" name="uname" type="text" id="pu_uid" />';
		vis_html[vis_html.length] = '<label for="pu_pwd">PIN</label>';
		vis_html[vis_html.length] = '<input size="6" maxlength="6" name="pword" type="password" id="pu_pwd"  />';
		vis_html[vis_html.length] = '</div>';
		vis_html[vis_html.length] = '<span class="error" id="popup_login_msg">&nbsp;</span>';

		var form = document.getElementById('fmLogin').cloneNode(false);
		form.innerHTML = vis_html.join('');
		form.name = 'popupLoginForm';
		form.id = 'popupLoginForm';

		var inputs = document.getElementById('fmLogin').getElementsByTagName('input');
		for(var i = 0; i < inputs.length; i++) {
			if(inputs[i].type == 'hidden') {
				form.appendChild(inputs[i].cloneNode(true));
			}
		}

		var div = document.createElement('div');
		div.appendChild(form);

		var popupHTML = div.innerHTML;

		delete div;

		sky.overlay.getChoice(
			'You need to login to proceed',
			popupHTML,
			[
				sky.overlay.button(
					'Login',
					function() {
						Login.req('popup', null, extraInfo, successCB);
					},
					function() {
						return false;
					}
				),
				sky.overlay.button(
					'Cancel',
					cancelCB
				)
			],
			'pu_login'
		);

		autoUsername('popup');
		return false;
	}



	function _loginOK()
	{
		if(_formType == 'popup') {
			sky.overlay.destroy();
		}

		if(typeof _successCB === 'function') _successCB();
		else if(document.isMainPage) {
			dispLogin(false);
			if(State.login.logged_in && State.login.temp_reg) {
				var fn = function() {
					document.location = [document.scgiURL,
										 '?action=export_user&target=SKYBET_WW&import_action=action~GoAcctReg1@skin~poker&logout=Y'].join('');
				};
				sky.overlay.getChoice(
					'Complete your registration before proceeding',
					'You will be automatically taken to the registration page shortly. If this does not happen click the Register button to go there',
					[
						sky.overlay.button(
							'Register',
							fn
						)
					],
					'warning'
				);
				setTimeout(fn, 3000);
			}
			else {
				if(typeof document.push === 'object') {
					BG.pushSubscribe();
				}
				BG.poll();
			}
		}
	}

	var _this = {
		pub : __pub,
		Req : Req,
		canReq : canReq,
		makeURL : makeURL,
		makePOST : makePOST,
		makeId : makeId,
		req : req,
		render : render,
		hint : hint,
		setLoginUID : setLoginUID,
		showPopupForm : showPopupForm
	};

	Req.regPar(_this);

	return _this;
}

