var colors = new Array();

/*colors.push("black");*/
colors.push("red");
colors.push("green");
colors.push("yellow");
colors.push("blue");
colors.push("cyan");
colors.push("magenta");
colors.push("white");

var nickColors = new Array();
function setNickColors(nickname, nicknamecolors)
{
  nickColors = new Array();
  
  if(nickname.length != parseInt(nicknamecolors.length) / 3)
  {
    nicknamecolors = "";
    
    for(var i = 0; i < nickname.length; i++)
      nicknamecolors += "^9" + nickname.charAt(i);
  }
  
  nickColors = new Array(nickname.length);
  
  var j = 0;
  for(var i = 0; i < nicknamecolors.length; i++)
  {
    if(nicknamecolors.charAt(i) != "^")
      continue;
      
    nickColors[j] = parseInt(nicknamecolors.charAt(i + 1)) - 1;
    
    var charElement = document.getElementById("char-" + j);
    charElement.className = colors[parseInt(nicknamecolors.charAt(i + 1)) - 1];
    
    j++;
  }
}

function changeColor(charIndex, styleClass, colorIndex)
{
  var charElement = document.getElementById("char-" + charIndex);
  
  nickColors[charIndex] = colorIndex;
  
  charElement.className = styleClass;
}

var Models = new Array();
Models.push("policista");
Models.push("terorista");

var model = "";
function setModel(playermodel)
{ 
  for(var i = 0; i < Models.length; i++)
  {
    var charElement = document.getElementById("model-" + Models[i]);
    
    if(Models[i] == playermodel)
    {
      charElement.className = "selected";
      model = playermodel;
    }
    else
      charElement.className = "unselected";
  }
}

function saveSettings()
{
  var finalColors = "";
  for(var i = 0; i < nickColors.length; i++)
    finalColors += parseInt(nickColors[i]);

  var parameters = "&colors=" + finalColors + "&model=" + model;

  var request = GetXmlHttpObject(); 
  request.onreadystatechange=function() { saveSettingsStateChange(request); }; 
  request.open("POST","/settings.php",true);
  
  request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  request.setRequestHeader('Content-Length', parameters.length);
	request.send(parameters);
	
	var loading = document.getElementById("saving");
	loading.innerHTML = "<img src=\"/props/images/loading.gif\" />";
}

function saveSettingsStateChange(request)
{
  if(request.readyState==4 || request.readyState=="complete")
  {
    var loading = document.getElementById("saving");
    loading.innerHTML = "Uloženo.";
  }
}

function GetXmlHttpObject()
{
  var xmlHttp=null;
  try
  {
    // Firefox, Opera 8.0+, Safari
    xmlHttp=new XMLHttpRequest();
  }
  catch (e)
  {
    // Internet Explorer
    try
    {
      xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e)
    {
      xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
  return xmlHttp;
}

function login(form)
{
  form.password.value = sha1Hash(form.password1.value);
  return true;
}

function erase(element)
{
  element.value=''; 
}

function comment(element)
{
	element.value='';
	document.getElementById('hodna').value = "123456";
}

function nicknameCheck(nickname)
{
  var regex=/^[0-9A-Za-z]+$/; //^[a-zA-z]+$/
  if(regex.test(nickname))
    return true;
  else
  {
    alert("Přezdívka obsahuje nepovolené znaky. Povolena jsou pouze malá a velká písmena anebo číslice.");
    return false;
  }
}

function checkReg(form)
{
  if(nicknameCheck(form.nickname.value) == false)
    return false;
  
	if(form.password1.value != form.password2.value)
	{
		alert("Vámi zadaná hesla nesouhlasí, prosím zadejte je znovu!");
		return false;
	}
	
	if(document.getElementById("men").checked)
	  form.sex.value = "m";
  else
    form.sex.value = "z";
	
	if(checkEmail(form.email.value) == false)
		return false;
	
	form.password1.value = '';
	form.password2.value = '';
	
	if(!document.getElementById("agreement").checked)
	{
	 alert("Bez souhlasu se zpracováním osobních údajů v souladu se zákonem č. 101/2000 Sb. nelze provést registraci.");
	 return false;
	}
	
	return true;
}

function checkEmail(email) {
  var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
  if (!filter.test(email))
  {
  	alert("Prosím zadejte správnou e-mailovou adresu!");
	  return false;
  }
  else
    return true;
}

function hashPassword()
{
	document.getElementById("password").value = sha1Hash(document.getElementById("password1").value);
}

function sha1Hash(msg)
{
    // constants [§4.2.1]
    var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];


    // PREPROCESSING 
 
    msg += String.fromCharCode(0x80); // add trailing '1' bit to string [§5.1.1]

    // convert string msg into 512-bit/16-integer blocks arrays of ints [§5.2.1]
    var l = Math.ceil(msg.length/4) + 2;  // long enough to contain msg plus 2-word length
    var N = Math.ceil(l/16);              // in N 16-int blocks
    var M = new Array(N);
    for (var i=0; i<N; i++) {
        M[i] = new Array(16);
        for (var j=0; j<16; j++) {  // encode 4 chars per integer, big-endian encoding
            M[i][j] = (msg.charCodeAt(i*64+j*4)<<24) | (msg.charCodeAt(i*64+j*4+1)<<16) | 
                      (msg.charCodeAt(i*64+j*4+2)<<8) | (msg.charCodeAt(i*64+j*4+3));
        }
    }
    // add length (in bits) into final pair of 32-bit integers (big-endian) [5.1.1]
    // note: most significant word would be ((len-1)*8 >>> 32, but since JS converts
    // bitwise-op args to 32 bits, we need to simulate this by arithmetic operators
    M[N-1][14] = ((msg.length-1)*8) / Math.pow(2, 32); M[N-1][14] = Math.floor(M[N-1][14])
    M[N-1][15] = ((msg.length-1)*8) & 0xffffffff;

    // set initial hash value [§5.3.1]
    var H0 = 0x67452301;
    var H1 = 0xefcdab89;
    var H2 = 0x98badcfe;
    var H3 = 0x10325476;
    var H4 = 0xc3d2e1f0;

    // HASH COMPUTATION [§6.1.2]

    var W = new Array(80); var a, b, c, d, e;
    for (var i=0; i<N; i++) {

        // 1 - prepare message schedule 'W'
        for (var t=0;  t<16; t++) W[t] = M[i][t];
        for (var t=16; t<80; t++) W[t] = ROTL(W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16], 1);

        // 2 - initialise five working variables a, b, c, d, e with previous hash value
        a = H0; b = H1; c = H2; d = H3; e = H4;

        // 3 - main loop
        for (var t=0; t<80; t++) {
            var s = Math.floor(t/20); // seq for blocks of 'f' functions and 'K' constants
            var T = (ROTL(a,5) + f(s,b,c,d) + e + K[s] + W[t]) & 0xffffffff;
            e = d;
            d = c;
            c = ROTL(b, 30);
            b = a;
            a = T;
        }

        // 4 - compute the new intermediate hash value
        H0 = (H0+a) & 0xffffffff;  // note 'addition modulo 2^32'
        H1 = (H1+b) & 0xffffffff; 
        H2 = (H2+c) & 0xffffffff; 
        H3 = (H3+d) & 0xffffffff; 
        H4 = (H4+e) & 0xffffffff;
    }

    return H0.toHexStr() + H1.toHexStr() + H2.toHexStr() + H3.toHexStr() + H4.toHexStr();
}

//
// function 'f' [§4.1.1]
//
function f(s, x, y, z) 
{
    switch (s) {
    case 0: return (x & y) ^ (~x & z);           // Ch()
    case 1: return x ^ y ^ z;                    // Parity()
    case 2: return (x & y) ^ (x & z) ^ (y & z);  // Maj()
    case 3: return x ^ y ^ z;                    // Parity()
    }
}

//
// rotate left (circular left shift) value x by n positions [§3.2.5]
//
function ROTL(x, n)
{
    return (x<<n) | (x>>>(32-n));
}

//
// extend Number class with a tailored hex-string method 
//   (note toString(16) is implementation-dependant, and 
//   in IE returns signed numbers when used on full words)
//
Number.prototype.toHexStr = function()
{
    var s="", v;
    for (var i=7; i>=0; i--) { v = (this>>>(i*4)) & 0xf; s += v.toString(16); }
    return s;
}