/*
	PoTka site clientside logic
	depends highly on lightbox includes (prototype, scriptaculous)
	getPageSize() has been borrowed straight from lightbox
*/
if (typeof(window['potkasite']) == 'undefined')
	window['potkasite'] =
{
	// path to ajax proxy
	ajaxPath : '/AJAXProxy.php',
	// path to reroute on logout if on restricted pages
	logoutPath : '/www/index.php',
	// set to true when on restricted pages
	inRestrictedSpace : false,
	// set to true when page was entered via HTTP POST
	wasPOST : false,
	
	// The overlay div
	overlay : null,
	// The login box div
	loginDlg : null,
	
	// initializes the object - called after the document has finished loading
	onLoadInit : function()
	{
		var objBody = $$('div.pWrapper')[0];
		this.overlay = objBody.appendChild(Builder.node('div',{id:'loginOverlay'}));
		this.loginDlg = objBody.appendChild(Builder.node('div',{id:'loginDlg'}));
		
		var loginForm = '<tr><td>Käyttäjätunnus: </td><td><input id="loginUsername" type="text" size="10" /></td></tr>';
		loginForm += '<tr><td>Salasana:</td><td><input id="loginPassword" type="password" size="10" /></td></tr>';
		loginForm += '<tr><td></td><td><button id="loginButton" style="float: right;">OK</button></td></tr>';
		loginForm = '<table class="loginInputs">'+ loginForm +'</table>';
		
		var html = '<div id="text_top"><div id="text_top_left"></div><div id="text_top_right"></div></div>';
		html += '<h1>Kirjaudu sisään</h1>'+ loginForm;
		html += '<div id="text_bottom"><div id="text_bottom_left"></div><div id="text_bottom_right"></div></div>';
		this.loginDlg.innerHTML = html;

		$('loginUsername').observe('keydown', (function(e) { this.onLoginKeydown(e,'user'); }).bind(this));
		$('loginPassword').observe('keydown', (function(e) { this.onLoginKeydown(e,'pass'); }).bind(this));
		$('loginButton').observe('click', (function(e) { this.doLogin($('loginUsername').value, $('loginPassword').value); }).bind(this));
		$(this.overlay).hide().observe('click', (function() { this.closeLogin(); }).bind(this));
		$(this.loginDlg).hide();
		
		Event.observe('topControlsPeekCodeForm', 'submit', function(event) { potkasite.peekCodeSubmit(event); });
	},
	
	
	// popus up the login dialog
	popupLogin : function()
	{
		
		var arrayPageSize = this.getPageSize();
		var arrayPageScroll = document.viewport.getScrollOffsets();
		// stretch overlay to fill page and fade in
		this.overlay.setStyle({ width: arrayPageSize[0] + 'px', height: arrayPageSize[1] + 'px' });

		// center login dialog
		var loginDlgTop = arrayPageScroll[1] + (document.viewport.getHeight() / 5);
		var loginDlgLeft = arrayPageSize[0]/2 + arrayPageScroll[0] - 100;
		this.loginDlg.setStyle({ top: loginDlgTop + 'px', left: loginDlgLeft + 'px' });

		
		// atm we use same overlay as lightbox
		new Effect.Appear(this.overlay, { duration: 0.2, from: 0.0, to: 0.8 });
		new Effect.Appear(this.loginDlg, { duration: 0.2, from: 0.0, to: 1.0});
		
		setTimeout('$(\'loginUsername\').focus();', 500);
	},
	
	// closes the login dialog
	closeLogin : function()
	{
		new Effect.Fade(this.overlay, { duration: 0.2 });
		new Effect.Fade(this.loginDlg, { duration: 0.2 });
		$('loginUsername').value = '';
		$('loginPassword').value = '';
	},
	
	// logs the user in
	doLogin : function(username, password)
	{
		new Ajax.Request(potkasite.ajaxPath,
		{
			method: 'post',
			parameters:
			{
				'service' : 'login',
				'username': username,
				'password': hex_md5(password)
			},
			onSuccess: function(xhr)
			{
				var xl = xhr.responseXML.getElementsByTagName('status');
				if (xl.length < 1)
					throw new Error('No status element in AJAX response.');
				var statElem = xl.item(0);
				if (statElem.getAttribute('success') != 'true')
				{
					alert('Virhe: '+ (statElem.textContent ? statElem.textContent : statElem.text));
					return;
				}
				
				var fnNode = xhr.responseXML.getElementsByTagName('forename').item(0);
				var forename = (fnNode.textContent ? fnNode.textContent : fnNode.text);
				$('login').innerHTML = 'Kirjaudu ulos, '+ forename;
				$('login').onclick = function() { potkasite.doLogout(); };
				potkasite.closeLogin();
				if (potkasite.wasPOST === true)
					document.location.href = potkasite.logoutPath;
				else if (potkasite.inRestrictedSpace === true)
					document.location.reload();
			}
		});
		
	},
	
	// logs the user out
	doLogout : function()
	{
		new Ajax.Request(potkasite.ajaxPath,
		{
			method: 'post',
			parameters:
			{
				'service' : 'logout'
			},
			onSuccess: function(xhr)
			{
				var xl = xhr.responseXML.getElementsByTagName('status');
				if (xl.length < 1)
					throw new Error('No status element in AJAX response.');
				var statElem = xl.item(0);
				if (statElem.getAttribute('success') != 'true')
				{
					alert('Virhe: '+ (statElem.textContent ? statElem.textContent : statElem.text));
					return;
				}
				
				$('login').innerHTML = 'Kirjaudu sisään';
				$('login').onclick = function() { potkasite.popupLogin(); };
				
				// if on restricted pages, reroute to frontpage
				if (potkasite.inRestrictedSpace == true)
					document.location.href = potkasite.logoutPath;
			}
		});
	},
	
	// kb event handler for logindlg input fields
	onLoginKeydown : function(e, inp)
	{
		e = e ? e : window.event;
		var keyCode = (e.which ? e.which : e.keyCode);

		if (keyCode == 13)
		{
			this.doLogin($('loginUsername').value, $('loginPassword').value);
			return;
		}
		
        if (keyCode == (e.DOM_VK_ESCAPE ? e.DOM_VK_ESCAPE : 27))
		{
			this.closeLogin();
			return;
		}
	},
	
	// returns page size as an array [width, height] - from lightBox (by Lokesh Dhakar - http://www.lokeshdhakar.com)
    getPageSize: function() {
	        
	     var xScroll, yScroll;
		
		if (window.innerHeight && window.scrollMaxY) {	
			xScroll = window.innerWidth + window.scrollMaxX;
			yScroll = window.innerHeight + window.scrollMaxY;
		} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
			xScroll = document.body.scrollWidth;
			yScroll = document.body.scrollHeight;
		} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
			xScroll = document.body.offsetWidth;
			yScroll = document.body.offsetHeight;
		}
		
		var windowWidth, windowHeight;
		
		if (self.innerHeight) {	// all except Explorer
			if(document.documentElement.clientWidth){
				windowWidth = document.documentElement.clientWidth; 
			} else {
				windowWidth = self.innerWidth;
			}
			windowHeight = self.innerHeight;
		} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
			windowWidth = document.documentElement.clientWidth;
			windowHeight = document.documentElement.clientHeight;
		} else if (document.body) { // other Explorers
			windowWidth = document.body.clientWidth;
			windowHeight = document.body.clientHeight;
		}	
		
		// for small pages with total height less then height of the viewport
		if(yScroll < windowHeight){
			pageHeight = windowHeight;
		} else { 
			pageHeight = yScroll;
		}
	
		// for small pages with total width less then width of the viewport
		if(xScroll < windowWidth){	
			pageWidth = xScroll;		
		} else {
			pageWidth = windowWidth;
		}

		return [pageWidth,pageHeight];
	},
	
	// checks that peekcode is numeric, returns true if peekcode is numeric, false otherwise
	peekCodeSubmit : function(event)
	{
		var peekCode = event.element().code.value;
		var numRegExp = /^\d+$/
		if (!numRegExp.test(peekCode))
		{
			alert('Syöttämäsi koodi oli virheellistä muotoa.\n\nTähän syöttökenttään kuuluu kirjoittaa\nlukkarimaatin kurkistuskoodi.\n');
			event.stop();
		}
	}
};

document.observe('dom:loaded', function () { potkasite.onLoadInit(); });

/*
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */
var hexcase=0;function hex_md5(a){return rstr2hex(rstr_md5(str2rstr_utf8(a)))}function hex_hmac_md5(a,b){return rstr2hex(rstr_hmac_md5(str2rstr_utf8(a),str2rstr_utf8(b)))}function md5_vm_test(){return hex_md5("abc").toLowerCase()=="900150983cd24fb0d6963f7d28e17f72"}function rstr_md5(a){return binl2rstr(binl_md5(rstr2binl(a),a.length*8))}function rstr_hmac_md5(c,f){var e=rstr2binl(c);if(e.length>16){e=binl_md5(e,c.length*8)}var a=Array(16),d=Array(16);for(var b=0;b<16;b++){a[b]=e[b]^909522486;d[b]=e[b]^1549556828}var g=binl_md5(a.concat(rstr2binl(f)),512+f.length*8);return binl2rstr(binl_md5(d.concat(g),512+128))}function rstr2hex(c){try{hexcase}catch(g){hexcase=0}var f=hexcase?"0123456789ABCDEF":"0123456789abcdef";var b="";var a;for(var d=0;d<c.length;d++){a=c.charCodeAt(d);b+=f.charAt((a>>>4)&15)+f.charAt(a&15)}return b}function str2rstr_utf8(c){var b="";var d=-1;var a,e;while(++d<c.length){a=c.charCodeAt(d);e=d+1<c.length?c.charCodeAt(d+1):0;if(55296<=a&&a<=56319&&56320<=e&&e<=57343){a=65536+((a&1023)<<10)+(e&1023);d++}if(a<=127){b+=String.fromCharCode(a)}else{if(a<=2047){b+=String.fromCharCode(192|((a>>>6)&31),128|(a&63))}else{if(a<=65535){b+=String.fromCharCode(224|((a>>>12)&15),128|((a>>>6)&63),128|(a&63))}else{if(a<=2097151){b+=String.fromCharCode(240|((a>>>18)&7),128|((a>>>12)&63),128|((a>>>6)&63),128|(a&63))}}}}}return b}function rstr2binl(b){var a=Array(b.length>>2);for(var c=0;c<a.length;c++){a[c]=0}for(var c=0;c<b.length*8;c+=8){a[c>>5]|=(b.charCodeAt(c/8)&255)<<(c%32)}return a}function binl2rstr(b){var a="";for(var c=0;c<b.length*32;c+=8){a+=String.fromCharCode((b[c>>5]>>>(c%32))&255)}return a}function binl_md5(p,k){p[k>>5]|=128<<((k)%32);p[(((k+64)>>>9)<<4)+14]=k;var o=1732584193;var n=-271733879;var m=-1732584194;var l=271733878;for(var g=0;g<p.length;g+=16){var j=o;var h=n;var f=m;var e=l;o=md5_ff(o,n,m,l,p[g+0],7,-680876936);l=md5_ff(l,o,n,m,p[g+1],12,-389564586);m=md5_ff(m,l,o,n,p[g+2],17,606105819);n=md5_ff(n,m,l,o,p[g+3],22,-1044525330);o=md5_ff(o,n,m,l,p[g+4],7,-176418897);l=md5_ff(l,o,n,m,p[g+5],12,1200080426);m=md5_ff(m,l,o,n,p[g+6],17,-1473231341);n=md5_ff(n,m,l,o,p[g+7],22,-45705983);o=md5_ff(o,n,m,l,p[g+8],7,1770035416);l=md5_ff(l,o,n,m,p[g+9],12,-1958414417);m=md5_ff(m,l,o,n,p[g+10],17,-42063);n=md5_ff(n,m,l,o,p[g+11],22,-1990404162);o=md5_ff(o,n,m,l,p[g+12],7,1804603682);l=md5_ff(l,o,n,m,p[g+13],12,-40341101);m=md5_ff(m,l,o,n,p[g+14],17,-1502002290);n=md5_ff(n,m,l,o,p[g+15],22,1236535329);o=md5_gg(o,n,m,l,p[g+1],5,-165796510);l=md5_gg(l,o,n,m,p[g+6],9,-1069501632);m=md5_gg(m,l,o,n,p[g+11],14,643717713);n=md5_gg(n,m,l,o,p[g+0],20,-373897302);o=md5_gg(o,n,m,l,p[g+5],5,-701558691);l=md5_gg(l,o,n,m,p[g+10],9,38016083);m=md5_gg(m,l,o,n,p[g+15],14,-660478335);n=md5_gg(n,m,l,o,p[g+4],20,-405537848);o=md5_gg(o,n,m,l,p[g+9],5,568446438);l=md5_gg(l,o,n,m,p[g+14],9,-1019803690);m=md5_gg(m,l,o,n,p[g+3],14,-187363961);n=md5_gg(n,m,l,o,p[g+8],20,1163531501);o=md5_gg(o,n,m,l,p[g+13],5,-1444681467);l=md5_gg(l,o,n,m,p[g+2],9,-51403784);m=md5_gg(m,l,o,n,p[g+7],14,1735328473);n=md5_gg(n,m,l,o,p[g+12],20,-1926607734);o=md5_hh(o,n,m,l,p[g+5],4,-378558);l=md5_hh(l,o,n,m,p[g+8],11,-2022574463);m=md5_hh(m,l,o,n,p[g+11],16,1839030562);n=md5_hh(n,m,l,o,p[g+14],23,-35309556);o=md5_hh(o,n,m,l,p[g+1],4,-1530992060);l=md5_hh(l,o,n,m,p[g+4],11,1272893353);m=md5_hh(m,l,o,n,p[g+7],16,-155497632);n=md5_hh(n,m,l,o,p[g+10],23,-1094730640);o=md5_hh(o,n,m,l,p[g+13],4,681279174);l=md5_hh(l,o,n,m,p[g+0],11,-358537222);m=md5_hh(m,l,o,n,p[g+3],16,-722521979);n=md5_hh(n,m,l,o,p[g+6],23,76029189);o=md5_hh(o,n,m,l,p[g+9],4,-640364487);l=md5_hh(l,o,n,m,p[g+12],11,-421815835);m=md5_hh(m,l,o,n,p[g+15],16,530742520);n=md5_hh(n,m,l,o,p[g+2],23,-995338651);o=md5_ii(o,n,m,l,p[g+0],6,-198630844);l=md5_ii(l,o,n,m,p[g+7],10,1126891415);m=md5_ii(m,l,o,n,p[g+14],15,-1416354905);n=md5_ii(n,m,l,o,p[g+5],21,-57434055);o=md5_ii(o,n,m,l,p[g+12],6,1700485571);l=md5_ii(l,o,n,m,p[g+3],10,-1894986606);m=md5_ii(m,l,o,n,p[g+10],15,-1051523);n=md5_ii(n,m,l,o,p[g+1],21,-2054922799);o=md5_ii(o,n,m,l,p[g+8],6,1873313359);l=md5_ii(l,o,n,m,p[g+15],10,-30611744);m=md5_ii(m,l,o,n,p[g+6],15,-1560198380);n=md5_ii(n,m,l,o,p[g+13],21,1309151649);o=md5_ii(o,n,m,l,p[g+4],6,-145523070);l=md5_ii(l,o,n,m,p[g+11],10,-1120210379);m=md5_ii(m,l,o,n,p[g+2],15,718787259);n=md5_ii(n,m,l,o,p[g+9],21,-343485551);o=safe_add(o,j);n=safe_add(n,h);m=safe_add(m,f);l=safe_add(l,e)}return Array(o,n,m,l)}function md5_cmn(h,e,d,c,g,f){return safe_add(bit_rol(safe_add(safe_add(e,h),safe_add(c,f)),g),d)}function md5_ff(g,f,k,j,e,i,h){return md5_cmn((f&k)|((~f)&j),g,f,e,i,h)}function md5_gg(g,f,k,j,e,i,h){return md5_cmn((f&j)|(k&(~j)),g,f,e,i,h)}function md5_hh(g,f,k,j,e,i,h){return md5_cmn(f^k^j,g,f,e,i,h)}function md5_ii(g,f,k,j,e,i,h){return md5_cmn(k^(f|(~j)),g,f,e,i,h)}function safe_add(a,d){var c=(a&65535)+(d&65535);var b=(a>>16)+(d>>16)+(c>>16);return(b<<16)|(c&65535)}function bit_rol(a,b){return(a<<b)|(a>>>(32-b))};

