$(document).ready(function () {
	AuthBlock.init();
	Global.init();
	
});

$.postJSON = function(url, data, callback) {
	$.post(url, data, callback, "json");
};
$.formPOST = function(oForm, callback){
	$.postJSON($(oForm).attr('action'), $(oForm).serialize(), callback);
};


var Global = {
	
	init: function(){
		this.Pseudo.init();
	}
	, Pseudo: {
		init: function(oElement){
			var pseudo = !oElement ? $('.pseudo') : $('.pseudo', oElement);
			$(pseudo).mouseover(function(){
				$(this).addClass('pseudo_hover');
			});
			$(pseudo).mouseout(function(){
				$(this).removeClass('pseudo_hover');
			});
		}
	}
	/* events */
	, E: {
		change: function(o,e){
			$(o).keyup(e).mouseup(e).blur(e).change(e);
		}
	}
	/* sets */
	, S: {
		url: function(s){
			return encodeURIComponent(s);
		}
	}
	, Check: {
		email: function(email){
			var regexp = /^[\w-](\.?[\w-])*(\+?\w*)?@[\w-](\.?[\w-])*\.[a-z]{2,}$/i;
			if(!$.trim(email).length)
				return false;
			
			if(!regexp.test(email))
				return false;
			
			return true;
		}
		, password: function(pass1){
			if(!pass1.length || pass1.length < 3)
				return false;
			
			return true;
		}
		, password_confirm: function(pass1, pass2){
			if(!this.password(pass1))
				return false;
			
			if(pass1 != pass2)
				return false;
			
			return true;
		}
	}
};


var Clock = {
	hours: 0,
	minutes: 0,
	seconds: 0,
	placeHolders: {
		h: null,
		m: null,
		s: null
	},
	separator: {
		timePH: null,
		init: function(){
			this.timePH = $('#clock_timer');
		},
		blink:function(){
			setTimeout(function(){
				Clock.separator.blink();
			},500);
			if ($(this.timePH).hasClass('hide_separator')){
				$(this.timePH).removeClass('hide_separator');
			} else {
				$(this.timePH).addClass('hide_separator');
			}
		}
	}
	, norm: function(a){
		return (a > 9) ? ('' + a) : ('0' + a);
	}
	, iterate: function(){
		this.placeHolders.h.innerHTML = this.norm(this.hours);
		this.placeHolders.m.innerHTML = this.norm(this.minutes);
		this.placeHolders.s.innerHTML = this.norm(this.seconds);
		this.seconds++;
		if(this.seconds==60){
			this.seconds = 0;
			this.minutes++;
		}
		if(this.minutes==60){
			this.minutes = 0;
			this.hours++;
		}
		if(this.hours==24){
			this.hours = 0;
		}
	}
	, init: function(date){
		var oE = $('#clock_timer');
		var oE_childs = $('span', oE);
		if(oE.length){
			var A = new Date(date);
			this.hours = A.getHours();
			this.minutes = A.getMinutes();
			this.seconds = A.getSeconds();
			this.placeHolders.h = oE_childs[0];
			this.placeHolders.m = oE_childs[1];
			this.placeHolders.s = oE_childs[2];
			this.separator.init();
			this.iterate();
			var me = this;
			setInterval(function(){
				me.iterate();
			},1000);
			/*setTimeout(function(){
				Clock.separator.blink();
			},500);*/
			/*setTimeout(function(){
				Clock.separator.blink();
			},1000);*/
		}
	}
};

var AuthBlock = {
	
	init: function(){
		this.oContent = $('#block-user');
		if(!this.oContent.length)
			return false;
		
		var me = this;
		this.oMenu = $('.a-top .emenu .pseudo', this.oContent);
		
		var lastSelect = false;
		$(this.oMenu).click(function(){
			$(me.oContent).removeClass('block-user-login').removeClass('block-user-registration');
			
			var parentNode = this.parentNode;
			if($(parentNode).hasClass('emenu-login') || $(parentNode).hasClass('emenu-registration')){
				if($(parentNode).hasClass('emenu-login'))
					$(me.oContent).addClass('block-user-login');
				else
					$(me.oContent).addClass('block-user-registration');
				$(lastSelect).removeClass('pseudo_default');
				$(this).addClass('pseudo_default');
				lastSelect = this;
			}
		});
		this.FormAuth.init();
	}
	
	, FormAuth: {
		init: function(){
			this.parent = AuthBlock;
			this.oContent = this.parent.oContent;
			if(!this.oContent.length)
				return false;
			
			var me = this;
			
			this.bSubmitLogin = false;
			this.bSubmitRegistration = false;
			this.bSubmitLogout = false;
			this.bSubmitRemember = false;
			this.bSubmitChangePass = false;
			
			this.oLogin = $('.alogin', this.parent.oContent);
			if(this.oLogin.length) {
				var submit = function(){
					me.login();
					return false;
				};
				this.oLoginForm = $('form',this.oLogin);
				this.oLoginSubmit = $('.submit .pseudo', this.oLogin);
				$(this.oLoginSubmit).submit(submit).click(submit);
				$(this.oLoginForm).submit(submit);
			}
			
			this.oRegistration = $('.aregistration', this.parent.oContent);
			if(this.oRegistration.length) {
				var submit = function(){
					me.registration();
					return false;
				};
				this.oRegistrationForm = $('form',this.oRegistration);
				this.oRegistrationSubmit = $('.submit .pseudo', this.oRegistration);
				$(this.oRegistrationSubmit).submit(submit).click(submit);
				$(this.oRegistrationForm).submit(submit);
			}
			this.oLogout = $('#auth-logout');
			$(this.oLogout).click(function(){
				me.logout();
			});
			
			this.oRemember = $('.e-remember .form');
			if(this.oRemember.length) {
				var submit = function(){
					me.remember();
					return false;
				};
				this.oRememberForm = $('form',this.oRemember);
				this.oRememberSubmit = $('input[type=submit]', this.oRemember);
				$(this.oRememberSubmit).submit(submit).click(submit);
				$(this.oRememberForm).submit(submit);
			}
			
			this.oChangePass = $('.e-changepassword .form');
			if(this.oChangePass.length) {
				var submit = function(){
					me.changepass();
					return false;
				};
				this.oChangePassForm = $('form',this.oChangePass);
				this.oChangePassSubmit = $('input[type=submit]', this.oChangePass);
				$(this.oChangePassSubmit).submit(submit).click(submit);
				$(this.oChangePassForm).submit(submit);
			}
		}
		, login: function(){
			if(this.bSubmitLogin)
				return false;
			this.bSubmitLogin = true;
			
			var me = this;
			var ae = $(this.oLoginForm).serializeArray();
			var e =  '';
			var salt = '';
			$.each(ae, function(i, field){
				if(field.name == 'salt'){
					salt = field.value;
					return;
				}
			});
			$.each(ae, function(i, field){
				if(field.name == 'salt'){
					return;
				}
				if(field.name == 'password'){
					field.value = md5(salt + field.value);
				}
				e += (i ? '&' : '') + (field.name + '=' + field.value);
			});
			$.postJSON($(this.oLoginForm).attr('action'), e, function(response){
				try {
					me.bSubmitLogin = false;
					if(response.response.error){
						me.error_show(me.oLogin, server_messages.text.login_error);
						return false;
					}
					if(response.response.result == 'true'){
						document.location = 'http://'+global.root_domain;
					}
				} catch (e) {
					me.bSubmitLogin = false;
					// catch
				}
			});
			return false;
		}
		, registration: function(){
			if(this.bSubmitRegistration)
				return false;
			this.bSubmitRegistration = true;
			
			var me = this;
			$.formPOST(this.oRegistrationForm,function(response){
				try {
					me.bSubmitRegistration = false;
					if(response.response.error){
						if(response.response.error == 'passport_email_present'){
							me.error_show(me.oRegistration, server_messages.text.passport_email_present);
						} else {
							me.error_show(me.oRegistration, server_messages.text.email_error);
						}
						return false;
					}
					if(response.response.result == 'true'){
						document.location = 'http://'+global.root_domain;
					}
				} catch (e) {
					me.bSubmitRegistration = false;
					// catch
				}
			});
			return false;
		}
		, logout: function(){
			if(this.bSubmitLogout)
				return false;
			var me = this; 
			this.bSubmitLogout = true;
			$.postJSON('/login/', 'faction=logout', function(response){
				try {
					me.bSubmitLogout = false;
					document.location = '/';
				} catch (e) {
					me.bSubmitLogout = false;
					// catch
				}
			});
			return false;
		}
		, remember: function(){
			if(this.bSubmitRemember)
				return false;
			this.bSubmitRemember = true;
			
			var me = this;
			$.formPOST(this.oRememberForm,function(response){
				try {
					me.bSubmitRemember = false;
					if(response.response.error){
						me.error_show(me.oRemember, server_messages.text[response.response.error]);
						return false;
					}
					if(response.response.result == 'true'){
						$(me.oRememberForm).css('display','none');
						$('.send', me.oRemember).fadeIn(250);
					}
				} catch (e) {
					me.bSubmitRemember = false;
					// catch
				}
			});
			return false;
		}
		, changepass: function(){
			if(this.bSubmitChangePass)
				return false;
			this.bSubmitChangePass = true;
			
			var me = this;
			$.formPOST(this.oChangePassForm,function(response){
				try {
					me.bSubmitChangePass = false;
					if(response.response.error){
						me.error_show(me.oChangePass, server_messages.text[response.response.error]);
						return false;
					}
					if(response.response.result == 'true'){
						$(me.oChangePassForm).css('display','none');
						$('.send', me.oChangePass).fadeIn(250);
					}
				} catch (e) {
					me.bSubmitChangePass = false;
					// catch
				}
			});
			return false;
		}
		, error_show: function(oContent, message){
			if(!message.length)
				return false;
			var oError = $('.error', oContent);
			if(!oError.length)
				return;
			$(oError).html(message).css('display','block');
			
		}
		, error_hidden: function(oContent){
			$(oContent).css('display','none');
		}
	}
};


function md5(string){
	function RotateLeft(lValue, iShiftBits) { return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits)); }
	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);
	}
	function F(x,y,z) { return (x & y) | ((~x) & z); }
	function G(x,y,z) { return (x & z) | (y & (~z)); }
	function H(x,y,z) { return (x ^ y ^ z); }
	function I(x,y,z) { return (y ^ (x | (~z))); }
	function FF(a,b,c,d,x,s,ac){
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};
	function GG(a,b,c,d,x,s,ac)
	{
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};
	function HH(a,b,c,d,x,s,ac)
	{
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};
	function II(a,b,c,d,x,s,ac)
	{
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};
	function ConvertToWordArray(string)
	{
		var lWordCount;
		var lMessageLength = string.length;
		var lNumberOfWords_temp1=lMessageLength + 8;
		var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
		var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
		var lWordArray=Array(lNumberOfWords-1);
		var lBytePosition = 0;
		var lByteCount = 0;
		while ( lByteCount < lMessageLength )
		{
			lWordCount = (lByteCount-(lByteCount % 4))/4;
			lBytePosition = (lByteCount % 4)*8;
			lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount)<<lBytePosition));
			lByteCount++;
		}
		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;
	};
	function WordToHex(lValue)
	{
		var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
		for (lCount = 0;lCount<=3;lCount++)
		{
			lByte = (lValue>>>(lCount*8)) & 255;
			WordToHexValue_temp = "0" + lByte.toString(16);
			WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
		}
		return WordToHexValue;
	};
	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 x=Array();
	var k,AA,BB,CC,DD,a,b,c,d;
	var S11=7, S12=12, S13=17, S14=22;
	var S21=5, S22=9 , S23=14, S24=20;
	var S31=4, S32=11, S33=16, S34=23;
	var S41=6, S42=10, S43=15, S44=21;
	string = Utf8Encode(string);
	x = ConvertToWordArray(string);
	a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;
	for (k=0;k<x.length;k+=16){
		AA=a; BB=b; CC=c; DD=d;
		a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
		d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
		c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
		b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
		a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
		d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
		c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
		b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
		a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
		d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
		c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
		b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
		a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
		d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
		c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
		b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
		a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
		d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
		c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
		b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
		a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
		d=GG(d,a,b,c,x[k+10],S22,0x2441453);
		c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
		b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
		a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
		d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
		c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
		b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
		a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
		d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
		c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
		b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
		a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
		d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
		c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
		b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
		a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
		d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
		c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
		b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
		a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
		d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
		c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
		b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
		a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
		d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
		c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
		b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
		a=II(a,b,c,d,x[k+0], S41,0xF4292244);
		d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
		c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
		b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
		a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
		d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
		c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
		b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
		a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
		d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
		c=II(c,d,a,b,x[k+6], S43,0xA3014314);
		b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
		a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
		d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
		c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
		b=II(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);
	}
	var temp = WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);
	return temp.toLowerCase();
}
