/*------------------States-Cookie-Handling---------------------------
how the cookies work:

CourseId | userfieldsforvalidation = hex(bitstates) # hex(quiz position) _ hex(quiz_score)

example: 4b697c13e3ceed341ba7fbf1602d9d45|username|Department|eMail=85f8#3_1,8_f6;user2=02ea#3_5,8_f3;
*/

/* be avoid by change settings: hex_len possibilities has to include bin_len  */ /*and learn some english, while you're at it....;) !*/
var bin_len = 8;
var hex_len = 2;
var saving_space = 4096;

/* hexchar translation */
var hexchars = new Array();
hexchars[0] = new Object();
hexchars[0][0] = 0;
hexchars[0][1] = 1;
hexchars[0][2] = 2;
hexchars[0][3] = 3;
hexchars[0][4] = 4;
hexchars[0][5] = 5;
hexchars[0][6] = 6;
hexchars[0][7] = 7;
hexchars[0][8] = 8;
hexchars[0][9] = 9;
hexchars[0]["a"] = 10;
hexchars[0]["b"] = 11;
hexchars[0]["c"] = 12;
hexchars[0]["d"] = 13;
hexchars[0]["e"] = 14;
hexchars[0]["f"] = 15;



/***cookie gimmicks***********************************
    if course starts, check wether there's cookie or not
 *********************************************************/
function initStateCookie(uid, num_elem, num_quest){
    var actual = getCookie("states");
    var prefix = ".";
    var user = true;

    /* check if cookie exists */
    if(actual == null){
        prefix = "";
        actual = "";
    }

    /* check if user exists */
    var cookie_val_users = actual.split(".");
    for(i=0; i<cookie_val_users.length; i++){
        var cookie_val_user = cookie_val_users[i].split("_");
        if(uid == cookie_val_user[0]){
            user = false;
        }
    }

    /* join data, if new user */
    if(user){
        var encoded_states = initStates(num_elem);
        var score = initScore(num_quest);
        data = actual + prefix + uid + "_" + encoded_states + "_" + score;
        setCookie("states", data);
    }
}

function checkSafeSpace(){
    var x = document.cookie;
    var space = saving_space - x.length;
    return space;
}

//-----------------------------------


    function cookieName(name){
        return COURSE_ID + "|" + name;
    }




	function dxGetCookie(cName, part){
        var ext_name = cookieName(cName);
		var cookie = getCookie(ext_name);
		if(cookie != null){
			if(part > 1){ //all
				return cookie;
			}else{
				var cParts=cookie.split('||');
				return cParts[part]; //0==UserData, 1==CourseData
			}
		}else{
			return null;
		}
	}

	function dxSetCookie(cName, part, value){
        var ext_name = cookieName(cName);
		if(part == 2){
			setCookie(ext_name, value);
		}else{
			inverse_part = (part==0) ? 1:0;
			var cParts = new Array();
			cParts[inverse_part] = dxGetCookie(cName, inverse_part);
			cParts[part] = value;
            var nnow=new Date();
            var expires=new Date(nnow.getTime() + (365 * 24 * 60 * 60 * 1000)) //a year
			setCookie(ext_name, cParts.join('||'), expires, '/');
		}
	}



//-----------------------------------



function initStates(num){
    var mod = num%bin_len;
    var decr = parseInt(num/bin_len);
    if(mod == 0){
        init = decr;
    }else{
        init = decr+1;
    }

    var ret ="";
    for(i=0; i<init; i++){
        ret += "00";
    }

    return ret;
}

function initScore(num){
    var ret = "0";
    var pre = "-";
    for(i=0; i<(num-1); i++){
        ret+= pre + "0";
    }
    return ret;
}




/* cookie lifetime */
var expDays = 12305;
var exp = new Date();
exp.setTime(exp.getTime() + (expDays*24*60*60*1000));



function getCookie(name){
    //alert('get Cookie: '  + name);
    var arg = name + "=";
    var alen = arg.length;
    var clen = document.cookie.length;
    var i = 0;
    while (i < clen) {
        var j = i + alen;
        if (document.cookie.substring(i, j) == arg)
        return getCookieVal (j);
        i = document.cookie.indexOf(" ", i) + 1;
        if (i == 0) break;
    }
    return null;
}

function getCookieVal(offset) {
    var endstr = document.cookie.indexOf (";", offset);
    if (endstr == -1){
        endstr = document.cookie.length;
   	}
    //alert(document.cookie.substring(offset, endstr) + ' # ' +  offset + ' / ' + endstr)
    return unescape(document.cookie.substring(offset, endstr));

}

function setCookie(name, value){
    //alert('set Cookie: '  + name);

    var argv = setCookie.arguments;
    var argc = setCookie.arguments.length;
    var expires = (argc > 2) ? argv[2] : null;
    var path = (argc > 3) ? argv[3] : null;
    var domain = (argc > 4) ? argv[4] : null;
    var secure = (argc > 5) ? argv[5] : false;
    document.cookie = name + "=" + escape (value) +
                        ((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
                        ((path == null) ? "" : ("; path=" + path)) +
                        ((domain == null) ? "" : ("; domain=" + domain)) +
                        ((secure == true) ? "; secure" : "");
}










/***coding functions()***********************************
 *********************************************************/
function binToDec(bin){
    var dec = 0;
    var power = 1
    for(i=bin_len; i>0; i--){
        var charr = bin.charAt(i-1);
        dec += charr*power;
        power *= 2;
    }
    return dec;
}

function decToBin(dec){
    var bin = "";
    var mod;
    while(dec>0){
        mod = dec%2;
        dec = parseInt(dec/2);
        bin = String(mod) + bin;
    }
    while((bin_len-bin.length) > 0){
        bin = "0" + bin;
    }
    return bin;
}

function decToHex(dec){
	if(dec==0) {return '0';}
    var hex = "";
    var mod = 0;
    var arr = new Array("a","b","c","d","e","f");
    while(dec>0){

        mod = dec%16;
        if(mod > 9){
            var pos = (mod-10);
            ret = arr[pos];
        }else{
            ret = mod;
        }
        hex = String(ret) + hex;
        dec = parseInt(dec/16);
    }
    //while((hex_len-hex.length) > 0){
    //    hex = "0" + hex;
    //}
    return hex;
}

function hexToDec(hex){
    var dec = 0;
    var power = 1
    for(i=hex.length; i>0; i--){
        var charr = hex.charAt(i-1);
        //alert(charr)
        dec += hexchars[0][charr]*power;
        power *= 16;
    }
    return dec;
}


function binToHex(bin){
    var ret = decToHex(binToDec(bin));
	if(ret.length==1){
		ret='0' + ret
	}
	return ret
}



function _hexToBin(hex){
    return decToBin(hexToDec(hex));
}


function hexToBin(hex){
	var z;
	var bin_buffer='';
	//allways 2 digits
	for(z=0; z< hex.length; z+=2){
		var left=hex.substr(z,1).toUpperCase();
		var right=hex.substr(z+1,1).toUpperCase();
		//alert(left + ' # ' + right)
		if(!right){right='0';}
		bin_buffer=bin_buffer + Hex2BinChars(left) + Hex2BinChars(right);
	}
	return(bin_buffer);
}

function Hex2BinChars(val){

  this['0']=["0000"]
  this['1']=["0001"]
  this['2']=["0010"]
  this['3']=["0011"]
  this['4']=["0100"]
  this['5']=["0101"]
  this['6']=["0110"]
  this['7']=["0111"]
  this['8']=["1000"]
  this['9']=["1001"]
  this['A']=["1010"]
  this['B']=["1011"]
  this['C']=["1100"]
  this['D']=["1101"]
  this['E']=["1110"]
  this['F']=["1111"]

  return(this[val])
}




