/*global SYNTEC*/
/*jslint browser: true, white: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: false, regexp: true, strict: false, newcap: true, immed: true */
if (!this.SYNTEC) {
	this.SYNTEC = {};
}
(function () {
	//md5
	if (typeof SYNTEC.md5 !== 'function') {
		SYNTEC.md5 = function (string) {
		
			//RotateLeft
			function rotateLeft(lValue, iShiftBits) {
				return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
			}
		
			//AddUnsigned
			function addUnsigned(lX, lY) {
				var lX4, lY4, lX8, lY8, lResult;
				lX8 = (lX & 0x80000000);
				lY8 = (lY & 0x80000000);
				lX4 = (lX & 0x40000000);
				lY4 = (lY & 0x40000000);
				lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
				if (lX4 & lY4) {
					return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
				}
				if (lX4 | lY4) {
					if (lResult & 0x40000000) {
						return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
					} else {
						return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
					}
				} else {
					return (lResult ^ lX8 ^ lY8);
				}
			}
		
			//F
			function f(x, y, z) { 
				return (x & y) | ((~x) & z); 
			}
			
			//G
			function g(x, y, z) { 
				return (x & z) | (y & (~z)); 
			}
			
			//H
			function h(x, y, z) { 
				return (x ^ y ^ z); 
			}
			
			//I
			function i(x, y, z) { 
				return (y ^ (x | (~z))); 
			}
		
			//FF
			function fncFF(a, b, c, d, x, s, ac) {
				a = addUnsigned(a, addUnsigned(addUnsigned(f(b, c, d), x), ac));
				return addUnsigned(rotateLeft(a, s), b);
			}
		
			//GG
			function fncGG(a, b, c, d, x, s, ac) {
				a = addUnsigned(a, addUnsigned(addUnsigned(g(b, c, d), x), ac));
				return addUnsigned(rotateLeft(a, s), b);
			}
		
			//HH
			function fncHH(a, b, c, d, x, s, ac) {
				a = addUnsigned(a, addUnsigned(addUnsigned(h(b, c, d), x), ac));
				return addUnsigned(rotateLeft(a, s), b);
			}
		
			//II
			function fncII(a, b, c, d, x, s, ac) {
				a = addUnsigned(a, addUnsigned(addUnsigned(i(b, c, d), x), ac));
				return addUnsigned(rotateLeft(a, s), b);
			}
			
			//ConvertToWordArray
			function convertToWordArray(string) {
				var lWordCount,
					lMessageLength = string.length,
					lNumberOfWords_temp1 = lMessageLength + 8,
					lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64,
					lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16,
					lWordArray = [],
					lBytePosition = 0,
					lByteCount = 0;
				while (lByteCount < lMessageLength) {
					lWordCount = (lByteCount - (lByteCount % 4)) / 4;
					lBytePosition = (lByteCount % 4) * 8;
					lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition));
					lByteCount += 1;
				}
				lWordCount = (lByteCount - (lByteCount % 4)) / 4;
				lBytePosition = (lByteCount % 4) * 8;
				lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition);
				lWordArray[lNumberOfWords - 2] = lMessageLength << 3;
				lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;
				return lWordArray;
			}
		
			//WordToHex
			function wordToHex(lValue) {
				var WordToHexValue = "", WordToHexValue_temp = "", lByte, lCount;
				for (lCount = 0; lCount <= 3; lCount += 1) {
					lByte = (lValue >>> (lCount * 8)) & 255;
					WordToHexValue_temp = "0" + lByte.toString(16);
					WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length - 2, 2);
				}
				return WordToHexValue;
			}
		
			//Utf8Encode
			function utf8Encode(string) {
				string = string.replace(/\r\n/g, "\n");
				var utftext = "", n, c;
		
				for (n = 0; n < string.length; n += 1) {
		
					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
			var x = [], temp,
				k, AA, BB, CC, DD, a, b, c, d,
				S11 = 7, S12 = 12, S13 = 17, S14 = 22,
				S21 = 5, S22 = 9, S23 = 14, S24 = 20,
				S31 = 4, S32 = 11, S33 = 16, S34 = 23,
				S41 = 6, S42 = 10, S43 = 15, S44 = 21;
			
			//Utf8 encode
			string = utf8Encode(string);
		
			//Convert
			x = convertToWordArray(string);
		
			//Set
			a = 0x67452301; 
			b = 0xEFCDAB89; 
			c = 0x98BADCFE; 
			d = 0x10325476;
		
			//Loop
			for (k = 0; k < x.length; k += 16) {
				AA = a; 
				BB = b; 
				CC = c; 
				DD = d;
				a = fncFF(a, b, c, d, x[k + 0], S11, 0xD76AA478);
				d = fncFF(d, a, b, c, x[k + 1], S12, 0xE8C7B756);
				c = fncFF(c, d, a, b, x[k + 2], S13, 0x242070DB);
				b = fncFF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);
				a = fncFF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF);
				d = fncFF(d, a, b, c, x[k + 5], S12, 0x4787C62A);
				c = fncFF(c, d, a, b, x[k + 6], S13, 0xA8304613);
				b = fncFF(b, c, d, a, x[k + 7], S14, 0xFD469501);
				a = fncFF(a, b, c, d, x[k + 8], S11, 0x698098D8);
				d = fncFF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF);
				c = fncFF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);
				b = fncFF(b, c, d, a, x[k + 11], S14, 0x895CD7BE);
				a = fncFF(a, b, c, d, x[k + 12], S11, 0x6B901122);
				d = fncFF(d, a, b, c, x[k + 13], S12, 0xFD987193);
				c = fncFF(c, d, a, b, x[k + 14], S13, 0xA679438E);
				b = fncFF(b, c, d, a, x[k + 15], S14, 0x49B40821);
				a = fncGG(a, b, c, d, x[k + 1], S21, 0xF61E2562);
				d = fncGG(d, a, b, c, x[k + 6], S22, 0xC040B340);
				c = fncGG(c, d, a, b, x[k + 11], S23, 0x265E5A51);
				b = fncGG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA);
				a = fncGG(a, b, c, d, x[k + 5], S21, 0xD62F105D);
				d = fncGG(d, a, b, c, x[k + 10], S22, 0x2441453);
				c = fncGG(c, d, a, b, x[k + 15], S23, 0xD8A1E681);
				b = fncGG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);
				a = fncGG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6);
				d = fncGG(d, a, b, c, x[k + 14], S22, 0xC33707D6);
				c = fncGG(c, d, a, b, x[k + 3], S23, 0xF4D50D87);
				b = fncGG(b, c, d, a, x[k + 8], S24, 0x455A14ED);
				a = fncGG(a, b, c, d, x[k + 13], S21, 0xA9E3E905);
				d = fncGG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);
				c = fncGG(c, d, a, b, x[k + 7], S23, 0x676F02D9);
				b = fncGG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);
				a = fncHH(a, b, c, d, x[k + 5], S31, 0xFFFA3942);
				d = fncHH(d, a, b, c, x[k + 8], S32, 0x8771F681);
				c = fncHH(c, d, a, b, x[k + 11], S33, 0x6D9D6122);
				b = fncHH(b, c, d, a, x[k + 14], S34, 0xFDE5380C);
				a = fncHH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44);
				d = fncHH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9);
				c = fncHH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60);
				b = fncHH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70);
				a = fncHH(a, b, c, d, x[k + 13], S31, 0x289B7EC6);
				d = fncHH(d, a, b, c, x[k + 0], S32, 0xEAA127FA);
				c = fncHH(c, d, a, b, x[k + 3], S33, 0xD4EF3085);
				b = fncHH(b, c, d, a, x[k + 6], S34, 0x4881D05);
				a = fncHH(a, b, c, d, x[k + 9], S31, 0xD9D4D039);
				d = fncHH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5);
				c = fncHH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8);
				b = fncHH(b, c, d, a, x[k + 2], S34, 0xC4AC5665);
				a = fncII(a, b, c, d, x[k + 0], S41, 0xF4292244);
				d = fncII(d, a, b, c, x[k + 7], S42, 0x432AFF97);
				c = fncII(c, d, a, b, x[k + 14], S43, 0xAB9423A7);
				b = fncII(b, c, d, a, x[k + 5], S44, 0xFC93A039);
				a = fncII(a, b, c, d, x[k + 12], S41, 0x655B59C3);
				d = fncII(d, a, b, c, x[k + 3], S42, 0x8F0CCC92);
				c = fncII(c, d, a, b, x[k + 10], S43, 0xFFEFF47D);
				b = fncII(b, c, d, a, x[k + 1], S44, 0x85845DD1);
				a = fncII(a, b, c, d, x[k + 8], S41, 0x6FA87E4F);
				d = fncII(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0);
				c = fncII(c, d, a, b, x[k + 6], S43, 0xA3014314);
				b = fncII(b, c, d, a, x[k + 13], S44, 0x4E0811A1);
				a = fncII(a, b, c, d, x[k + 4], S41, 0xF7537E82);
				d = fncII(d, a, b, c, x[k + 11], S42, 0xBD3AF235);
				c = fncII(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB);
				b = fncII(b, c, d, a, x[k + 9], S44, 0xEB86D391);
				a = addUnsigned(a, AA);
				b = addUnsigned(b, BB);
				c = addUnsigned(c, CC);
				d = addUnsigned(d, DD);
			}
		
			//Set temp
			temp = wordToHex(a) + wordToHex(b) + wordToHex(c) + wordToHex(d);
		
			//Result
			return temp.toLowerCase();
		};
	}
	
	//digestLogin
	if (typeof SYNTEC.digestLogin !== 'function') {
		SYNTEC.digestLogin = function () {
			//alert('digestLogin');
			var opaque = document.getElementById('opaque'),
				nonce = document.getElementById('nonce'),
				username = document.getElementById('username'),
				password = document.getElementById('password'),
				auth = document.getElementById('auth');
			//Set auth type to digest
			if (auth) {
				auth.value = 'digest';
			}
			//Re-create password value
			if (password) {
				password.value = SYNTEC.md5(nonce.value + password.value + opaque.value);
			}
			//Nulls
			opaque = null;
			nonce = null;
			username = null;
			password = null;
			auth = null;
			
			//Return
			return true;
		};
	}
	

	//SYNTEC.invalidateLogin
	if (typeof SYNTEC.invalidateLogin !== 'function') {
		SYNTEC.invalidateLogin = function (secondsLeft) {
			//Var
			var miliSeconds = (secondsLeft * 1000);
			
			//Test miliseconds
			if (!miliSeconds || miliSeconds < 2000) {
				return;
			}
			
			//invalidateForm
			function invalidateForm() {
				var el = document.getElementById('login-form-div'),
					html = '';
				if (el) {
					
					//<input type="submit" value="Inloggen" class="pb-button">
					html += '<p><strong>De login sessie is verlopen.</strong></p>';
					html += '<p>Klik op "Nieuwe sessie aanvragen" om een nieuwe login sessie te starten.</p>';
					html += '<input type="button" value="Nieuwe sessie aanvragen" class="pb-button-large" onclick="window.location.href = \'/html/medbis/login/\';">';
					
					//Add
					el.innerHTML = html;
				}
				
			}
			
			//Exec
			setTimeout((function () {
				return invalidateForm;
			}()), miliSeconds);
		};
	}	
	
}());
