function status(status) {
	document.getElementById('ajaxStatus').innerHTML=status;
}

function fatal(error) {
	status('Fatal error: '+error);
	document.getElementById('login').parentNode.removeChild(document.getElementById('login'));
	document.getElementById('join').parentNode.removeChild(document.getElementById('join'));
	document.getElementById('as').innerHTML='as a sexy stranger';
}

function include(source) {
	var script=document.createElement('script');
	script.src=source;
	script.type='text/javascript';
	document.getElementsByTagName('head')[0].appendChild(script);
}

function resetLogin() {
	document.getElementById('login').style.display='none';
	document.getElementById('join').style.display='none';
	document.getElementById('logStart').style.display='block';
}

function subWho() {
	document.getElementById('subWho').focus();
	document.getElementById('login').style.display='none';
	document.getElementById('join').style.display='none';
	var cleaned=document.getElementById('who').value.replace(/[^a-zA-Z0-9]/g, '');
	if ( cleaned.length<3 ) {
		status('Error: Invalid username, dorkass.');
	} else {
		document.getElementById('logStart').style.display='none';
		status('Checking status of "'+cleaned+'"&hellip;');
		loginAjax( 'who='+escape(document.getElementById('who').value) );
	}
}

function subProof() {
	if ( typeof SHA256 !== 'function' || SHA256('고윤하 / 高潤荷 / Go Yoon-ha') !== '4e06bdb3737db3fb726c133180434845c52e15ab2935b791bcf7db83c0071854' ) {
		fatal('The SHA-256 function isn\'t working properly. Shiiiiit.');
		return false;
	}
	status('Securing your password&hellip;');
	var hash='';
	for ( i=0 ; i<81 ; ++i ) {
		hash=SHA256( document.getElementById('proof').value + who + hash );
	}
	if ( legacy === true ) {
		if ( typeof MD5 !== 'function' || MD5('this is a test!') !== '89742a09d9b41329b850b76a76b05e00' ) {
			fatal('The MD5 function isn\'t working properly. Shiiiiit.');
			return false;
		}
		var old=MD5( document.getElementById('proof').value );
		for ( i=0 ; i<9 ; ++i ) {
			old=SHA256( old + rado );
		}
	} else {
		for ( i=0 ; i<9 ; ++i ) {
			hash=SHA256( hash + rado );
		}
	}
	loginAjax( ( legacy == true ? 'old='+old+'&' : '' )+'hash='+hash+'&cookie='+document.getElementById('cookie').checked+'&hiney='+document.getElementById('hiney').checked );
	status('Authenticating login&hellip;');
}

function loginAjax(query) {
	var request=false;
	if ( window.XMLHttpRequest ) {
		request=new XMLHttpRequest();
	} else if ( window.ActiveXObject ) {
		try {
			request=new ActiveXObject('Msxml2.XMLHTTP');
		} catch (e) {
			try {
				request=new ActiveXObject('Microsoft.XMLHTTP');
			} catch (e) {}
		}
	}
	if ( !request ) {
		fatal('Your browser doesn\'t support Ajax. Welcome to 2003?');
		return false;
	}
	request.open('POST', 'login!', true);
	request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
	request.onreadystatechange=function () {
		try {
			if ( request.readyState==4 ) {
				status('');
				if ( request.status==200 ) {
					status('Login validated; reloading page&hellip;');
					location.reload(true);
				} else if ( request.status==401 ) {
					document.getElementById('who').value='';
					if ( request.responseText == 'who?' ) {
						document.getElementById('join').style.display='block';
					} else if ( request.responseText.match(/^[a-zA-Z0-9]{3,16}:[0-9a-f]{64}(:legacy)?$/) ) {
						var response=request.responseText.split(":"); 
						document.getElementById('incredulous').innerHTML=who=response[0];
						rado=response[1];
						legacy=( request.responseText.match(/legacy$/) ? true : false );
						document.getElementById('login').style.display='block';
						document.getElementById('proof').focus();
						include('SHA-256.js');
						if ( legacy == true ) {
							include('MD5.js');
						}
					} else {
						status(request.responseText);
					}
				} else if ( request.status==403 ) {
					document.body.innerHTML=request.responseText;
				} else if ( request.status==500 ) {
					fatal(request.responseText);
				} else {
					status('Error: '+request.responseText);
					resetLogin();
				}
			}
		} catch(e) {
			status('Error: '+e.description+'. :[');
			resetLogin();
		}
	}
	request.send(query);
}