var hasSeed = false;
var seed = null;
var seed_id = null;
var loggedIn = null;
var temp_vote_id;
var temp_vote_dir;
var temp_vote_ele;


var NORMAL_STATE = 4;
var VALIDATION_PAGE = 'authenticate.html';

function getSeed(){
	if( !hasSeed ){
		var request = new Request({
			url: VALIDATION_PAGE,
			method: 'get',
			data:{
					task: 'getseed'
			},
			onComplete: function(response){
				var responseParts = response.split('|');
				seed_id = responseParts[0];
				seed = responseParts[1];
				hasSeed = true;
				validateLogin();
			}
		}).send();
	}
}

function validateLogin(){
	if( loggedIn )
		return false;

	if( !hasSeed ){
		getSeed();
		return false;
	}

	var email = document.getElementById('mv_username');
	var password = document.getElementById('mv_password');
	var submitButton = document.getElementById('btnSubmit');
	if( email.value != '' && password.value != '' ){
		submitButton.disabled = 'disabled';
		var pw_hash = SHA1( SHA1(password.value) + seed);
		var request = new Request({
			url: VALIDATION_PAGE,
			method: 'get',
			data:{
					task: 'checklogin',
					email: email.value,
					password: pw_hash,
					seed_id: seed_id
			},
			onComplete: function(response){
				var responseParts = response.split('|');
				if( responseParts[0] == 'true' ){
					email.disabled = 'disabled';
					password.disabled = 'disabled';
					loggedIn = true;
					closeLogin();
					registerVote(temp_vote_id,temp_vote_dir,temp_vote_ele);
					reloadPage();
				}else{
					document.getElementById('loginError').innerHTML = responseParts[1];
				}
				submitButton.disabled = '';
			}
		}).send();
	}
	return false;
}

function displayLogin(){
	var loginDiv = $('loginDiv');
	var fadeDiv = $('fadeDiv');
	var bodySize = window.getScrollSize();

	try{
		fadeDiv.setStyle('display','block');
		fadeDiv.setStyle('width', bodySize.x + 'px');
		fadeDiv.setStyle('height', bodySize.y + 'px');
		fadeDiv.fade(0.8);
		loginDiv.setStyle('display','block');
		document.getElementById('mv_username').focus();
	}catch(ex){}
}

function closeLogin(){
	var loginDiv = $('loginDiv');
	var fadeDiv = $('fadeDiv');
	try{
		loginDiv.setStyle('display','none');
		fadeDiv.setStyle('display','none');
	}catch(ex){ }
}


function registerVote(id,dir,ele){
	if( !loggedIn ){
		temp_vote_id = id;
		temp_vote_dir = dir;
		temp_vote_ele = ele;
		displayLogin();
		return;
	}

	var request = new Request({
			url: 'vote.html',
			method: 'get',
			data:{
				vote: dir,
				vote_id: id
			},
			onComplete: function(response){
				ele.innerHTML = response;
			}
		}).send();
	return false;
}

/**
*
*  Secure Hash Algorithm (SHA1)
*  http://www.webtoolkit.info/
*
**/

function SHA1 (msg) {
	function rotate_left(n,s) {
		var t4 = ( n<<s ) | (n>>>(32-s));
		return t4;
	};

	function lsb_hex(val) {
		var str="";
		var i;
		var vh;
		var vl;

		for( i=0; i<=6; i+=2 ) {
			vh = (val>>>(i*4+4))&0x0f;
			vl = (val>>>(i*4))&0x0f;
			str += vh.toString(16) + vl.toString(16);
		}
		return str;
	};

	function cvt_hex(val) {
		var str="";
		var i;
		var v;

		for( i=7; i>=0; i-- ) {
			v = (val>>>(i*4))&0x0f;
			str += v.toString(16);
		}
		return str;
	};


	function Utf8Encode(string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";

		for (var n = 0; n < string.length; n++) {

			var c = string.charCodeAt(n);

			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}

		}

		return utftext;
	};

	var blockstart;
	var i, j;
	var W = new Array(80);
	var H0 = 0x67452301;
	var H1 = 0xEFCDAB89;
	var H2 = 0x98BADCFE;
	var H3 = 0x10325476;
	var H4 = 0xC3D2E1F0;
	var A, B, C, D, E;
	var temp;

	msg = Utf8Encode(msg);

	var msg_len = msg.length;

	var word_array = new Array();
	for( i=0; i<msg_len-3; i+=4 ) {
		j = msg.charCodeAt(i)<<24 | msg.charCodeAt(i+1)<<16 |
		msg.charCodeAt(i+2)<<8 | msg.charCodeAt(i+3);
		word_array.push( j );
	}

	switch( msg_len % 4 ) {
		case 0:
			i = 0x080000000;
		break;
		case 1:
			i = msg.charCodeAt(msg_len-1)<<24 | 0x0800000;
		break;

		case 2:
			i = msg.charCodeAt(msg_len-2)<<24 | msg.charCodeAt(msg_len-1)<<16 | 0x08000;
		break;

		case 3:
			i = msg.charCodeAt(msg_len-3)<<24 | msg.charCodeAt(msg_len-2)<<16 | msg.charCodeAt(msg_len-1)<<8	| 0x80;
		break;
	}

	word_array.push( i );

	while( (word_array.length % 16) != 14 ) word_array.push( 0 );

	word_array.push( msg_len>>>29 );
	word_array.push( (msg_len<<3)&0x0ffffffff );


	for ( blockstart=0; blockstart<word_array.length; blockstart+=16 ) {

		for( i=0; i<16; i++ ) W[i] = word_array[blockstart+i];
		for( i=16; i<=79; i++ ) W[i] = rotate_left(W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16], 1);

		A = H0;
		B = H1;
		C = H2;
		D = H3;
		E = H4;

		for( i= 0; i<=19; i++ ) {
			temp = (rotate_left(A,5) + ((B&C) | (~B&D)) + E + W[i] + 0x5A827999) & 0x0ffffffff;
			E = D;
			D = C;
			C = rotate_left(B,30);
			B = A;
			A = temp;
		}

		for( i=20; i<=39; i++ ) {
			temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff;
			E = D;
			D = C;
			C = rotate_left(B,30);
			B = A;
			A = temp;
		}

		for( i=40; i<=59; i++ ) {
			temp = (rotate_left(A,5) + ((B&C) | (B&D) | (C&D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff;
			E = D;
			D = C;
			C = rotate_left(B,30);
			B = A;
			A = temp;
		}

		for( i=60; i<=79; i++ ) {
			temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff;
			E = D;
			D = C;
			C = rotate_left(B,30);
			B = A;
			A = temp;
		}

		H0 = (H0 + A) & 0x0ffffffff;
		H1 = (H1 + B) & 0x0ffffffff;
		H2 = (H2 + C) & 0x0ffffffff;
		H3 = (H3 + D) & 0x0ffffffff;
		H4 = (H4 + E) & 0x0ffffffff;
	}

	var temp = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_hex(H4);

	return temp.toLowerCase();
}