// function console() {
// 	this.log = function (text) {}
// 	this.log = function (text) {};
// 	this.warn = function (text) {};
// 	this.info = function (text) {};
// 	this.debug = function (text) {};
// 	this.errror = function (text) {};
// 	this.time = function (text) {};
// 	this.timeEnd = function (text) {};
// }
// console = new console();

/** Prevede objekt ze strucneho JSON formatu na normalni asociovane pole
 *  @param input {Array} vstupni pole ve formatu: input['columns'][0] = 'ID'   input['columns'][1] = 'NAZEV'   input['content'][0]['ID'] = 54   input['content'][0] = Array (54, Dolar)
 *  @return {Array} normalizovane pole ve formatu input.content[0] = Array('ID'=>54, 'NAZEV'=>'Dolar')
 */
function normalize(input) {
	//console.log('normalize()');
	//console.log(input);
	if( input == null ) return false;
	
	var output = Object();
	output.header = input.header;
	output.footer = input.footer;
	output.columns = input.columns;  //hodi se to..
	
	if(input.columns != null && input.columns.length > 0 && input.content.length > 0) {
		//alert('resim standart');
		var normalized_rows = Array();
		for(r=0; r<input.content.length; r++) { //prochazim jednotlive radky
			var new_line = Array();
			for(i=0; i<input.columns.length; i++) { //prochazim jednotlive sloupce
				new_line[input.columns[i]] = input.content[r][i];
			}
			normalized_rows[r] = new_line;
		}
		output.content = normalized_rows;
	}
	
	//---- pro normalizovani odpovedi pro jednotlivy selectbox ----
	//predpokladana struktura inputu: input.header, input.uni.selectbox_zeme, input.uni.selectbox_firmy
	else if( typeof input.uni == 'object' ) {
		//alert('resim uni');
		for(var r in input.uni) {
			//je to selectbox?
			//console.log('request = '+r);
			if( r.indexOf('selectbox_',0) === 0 ) {
				//je to selectbox
				//console.log(' - je to selectbox');
				if( input.uni[r].columns != null && input.uni[r].content != null && input.uni[r].columns.length > 0 ) {
					var normalized_rows = Array();
					var count_content = input.uni[r].content.length;
					var count_columns = input.uni[r].columns.length;
					//console.log(count_columns+' sloupcu, '+count_content+' radku');
					for(row=0; row<count_content; row++) { //prochazim jednotlive radky
						var new_line = Array();
						for(i=0; i<count_columns; i++) { //prochazim jednotlive sloupce
							new_line[input.uni[r].columns[i]] = input.uni[r].content[row][i];
							//console.log(input.uni[r].columns[i]+' = '+input.uni[r].content[row][i]);
						}
						normalized_rows[row] = new_line;
					}
					output[r] = normalized_rows;
				}
				//else alert('v selectboxu nejsou data');
			}
			else {
				//neni to selectbox
				//console.log(' - neni to selectbox');
			}
		}
	}
	//else alert('wtf');
	//console.log(output);
	return output;
}




// konverze  2003-05-30 11:27:00  ->  30.5.2003 11:27:00
function db2dateTime(string) {
	if( string.length != 19 ) return '';
	den   = ( string.substring(8,10) * 1 ) ;
	mesic = ( string.substring(5,7)  * 1 ) - 1;
	rok = string.substring(0,4);
	hodin = ( string.substring(11,13) * 1 );
	minut = string.substring(14,16);
	vterin = string.substring(17,19);
	return den+'.'+mesic+'.'+rok+' '+hodin+':'+minut+':'+vterin;
};

// konverze  2003-05-30 11:27:00  ->  30.5.2003
function db2date(string) {
	if( string.length != 19 ) return '';
	den   = ( string.substring(8,10) * 1 );
	mesic = ( string.substring(5,7) * 1 ) ;
	rok   =   string.substring(0,4);
	return den+'.'+mesic+'.'+rok;
};

// konverze  2003-05-30 11:27:00  ->  30.5.2003
// function db2time(string) {
// 	if( string.length != 19 ) return '';
// 	hodin = string.substring(11,13);
// 	minut = string.substring(14,16);
// 	vterin = string.substring(17,19);		
// 	return hodin+':'+minut+':'+vterin;			
// };

// konverze  11:27:00  ->  11:27
function db2timeOnly(string) {
	if( string.length != 8 ) return '';
	return string.substring(0,5);;			
};


// konverze  2003-05-30 11:27:00  ->  Object Date
function db2ObjectDate(string) {
	//console.log( 'db2ObjectDate('+string+')' );
	if( string == '' ) return false;
	den = string.substring(8,10);
	mesic = ( string.substring(5,7) * 1 ) - 1;
	rok = string.substring(0,4);
	hodin = string.substring(11,13);
	minut = string.substring(14,16);
	vterin = string.substring(17,19);		
	var myDate = new Date();
	myDate.setFullYear(rok);
	myDate.setMonth(mesic);
	myDate.setDate(den);			
	myDate.setHours(hodin);
	myDate.setMinutes(minut);
	myDate.setSeconds(vterin);
	//console.log( myDate );
	return myDate;	
};

// konverze  30.5.2003  ->  Object Date
function db2ObjectDate2(string) {
	//console.log( 'db2ObjectDate('+string+')' );
	if( string == '' ) return false;
	den   = string.substring(0,2);
	mesic = (string.substring(3,5)*1)-1;
	rok   = string.substring(6,10);
	
	var myDate = new Date();
	myDate.setFullYear(rok);
	myDate.setMonth(mesic);
	myDate.setDate(den);			
	//console.log( myDate );
	return myDate;	
};


function in_array(needle, haystack, strict) {
    // Checks if a value exists in an array
    // 
    // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_in_array/
    // +       version: 804.1712
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: in_array('van', ['Kevin', 'van', 'Zonneveld']);
    // *     returns 1: true

    var found = false, key, strict = !!strict;

    for (key in haystack) {
        if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
            found = true;
            break;
        }
    }

    return found;
}// }}}

function array_search( needle, haystack, strict ) {
	// http://kevin.vanzonneveld.net
	// +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	// *     example 1: array_search('zonneveld', {firstname: 'kevin', middle: 'van', surname: 'zonneveld'});
	// *     returns 1: 'surname'
	
	var strict = !!strict;
	
	for(var key in haystack){
		if( (strict && haystack[key] === needle) || (!strict && haystack[key] == needle) ){
			return key;
		}
	}
	return false;
}



function is_numeric( mixed_var ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: David
    // *     example 1: is_numeric(186.31);
    // *     returns 1: true
    // *     example 2: is_numeric('Kevin van Zonneveld');
    // *     returns 2: false
    // *     example 3: is_numeric('+186.31e2');
    // *     returns 3: true
 
    return !isNaN( mixed_var );
}

function max(pole) {
	//by Honza K.
	//zjisti nejvyssi hodnotu z ciselneho pole
	var max = 0;
	for(i=0; i<pole.length; i++) if( is_numeric(pole[i]) && pole[i]>max ) max = pole[i]; 
	return max;
}

function min(pole) {
	//by Honza K.
	//zjisti nejnizsi hodnotu z ciselneho pole
	var min = 99999999999999999999999999;
	for(i=0; i<pole.length; i++) {
		if( is_numeric(pole[i]) && pole[i]<min ) min = pole[i]; 
	}
	return min;
}

/** Spocita pocet prvku pole nebo objektu
 *  @param what {Object|Array} co se ma pocitat
 *  @return {Integer} pocet prvku
 */
function count(what) {
	if( typeof what == 'array' ) return what.length;
	if( typeof what == 'object' ) {
		var i=0;
		for(var p in what) i++;
		return i;
	}
	return 0;
}

//timto aliasem obchazim chybu obfuskatoru
function count2(what) {
	return count(what);
}

function prasarna(obj) {
	return obj;
}

function isArray(obj) {
    return obj.constructor == Array;
}

function urldecode( str ) {
    // Decodes URL-encoded string
    // 
    // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_urldecode/
    // +       version: 804.1715
    // +   original by: Philip Peterson
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: urldecode('Kevin+van+Zonneveld%21');
    // *     returns 1: 'Kevin van Zonneveld!'
    
    var ret = str;
       
    ret = ret.replace(/\+/g, '%20');
    ret = decodeURIComponent(ret);
    ret = ret.toString();

    return ret;
}// }}}

// {{{ urlencode
function urlencode( str ) {
    // URL-encodes string
    // 
    // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_urlencode/
    // +       version: 804.1715
    // +   original by: Philip Peterson
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: urlencode('Kevin van Zonneveld!');
    // *     returns 1: 'Kevin+van+Zonneveld%21'
                                     
    var ret = str;
    
    ret = ret.toString();
    ret = encodeURIComponent(ret);
    ret = ret.replace(/%20/g, '+');

    return ret;
}// }}}


//funkce umisti jedno pole mezi 2 prvky jineho pole
//za = za kolikaty prvek pole se maji nove prvky zaradit
function pridejSloupce( puvodniSloupce, noveSloupce, za ) {
	//console.log('puvodni='+puvodniSloupce.length+', nove='+noveSloupce.length);
	//console.log('pridejSloupce()');
	//console.log(noveSloupce);
	zacatek = puvodniSloupce.slice(0, za);
	konec = puvodniSloupce.slice(za, puvodniSloupce.length);

	//pripojit nove pole
	for(i=0, u=noveSloupce.length; i<u; i++) zacatek.push( noveSloupce[i] );

	//pripojit zbytek stareho pole
	for(j=0, w=konec.length; j<w; j++) zacatek.push( konec[j] );
	if( zacatek.length > 0 ) return zacatek;
	else return false;
}


/** Odebere ze sloupcu urcite sloupce, podle vlastnsoti 'col']
 *  @param puvodniSloupce {Array} puvodni sloupce, kazdy prvek pole je objekt s uplnou definici sloupce, npr.: {'col':'O_R_HER', 'name':'Her'}
 *  @param sloupceKOdebrani {Array} sloupce ke smazani, kazdy prvek pole je String odpovidajici vlastnosti 'col' sloupce, ktery se ma z puvodnich sloupcu odebrat
 */ 
function odeberSloupce( puvodniSloupce, sloupceKOdebrani ) {
	//console.log('puvodni='+puvodniSloupce.length+', nove='+noveSloupce.length);
	//console.log('pridejSloupce()');
	//console.log(noveSloupce);
// 	zacatek = puvodniSloupce.slice(0, za);
// 	konec = puvodniSloupce.slice(za, puvodniSloupce.length);
	var noveSloupce = new Array();
	var nove = 0;
	
	for(i=0, u=puvodniSloupce.length; i<u; i++) {
		if( in_array( puvodniSloupce[i].col, sloupceKOdebrani ) == false ) {
			noveSloupce[nove] = puvodniSloupce[i];
			nove++;
		}
	}
	return noveSloupce;
	
// 	zacatek.push( noveSloupce[i] );
// 
// 	//pripojit zbytek stareho pole
// 	for(j=0, w=konec.length; j<w; j++) zacatek.push( konec[j] );
// 	if( zacatek.length > 0 ) return zacatek;
// 	else return false;
}


//konverze decimal  -> hex
function dechex(d) {return d.toString(16);}

//konverze hex  -> decimal
function hexdec(h) {return parseInt(h,16);}


/* Zmeni format pole:

Array{
 0 => Array(ID=>5, NAME=>alfa, TYP=>nejaky)
}	

na: 

Array{
 5 => Array(NAME=>alfa, TYP=>nejaky)
}	

@param array {Object} assoc. pole (takze objekt) ke zpracovani, ve vstupnim formatu
@param key {String} podel ktereho prvku pod-pole se maji vytvorit klice vystupniho pole, napr: 'ID'
@return {Object} vystupni pole
*/
function remapArray(array, key) {
	//alert( 'remapArray('+typeof array+', '+typeof key+')' );
	//console.log('-----------------------------');
	//console.log( 'count: '+count(array) )
	if( typeof array != 'object' ) {
		alert('remapArray(): array neni object');
		return false;
	}
	if( typeof key != 'string' ) {
		alert('remapArray(): key neni string');
		return false;
	}
	var out = {};
	for(var p in array) {
		//console.log( typeof array[p][key]+' , '+array[p][key] );
		if( typeof array[p][key] != 'undefined' ) {
			klic = array[p][key];				
			out[klic] = array[p];
		}
	}
	//console.log( out );
	return out;
}

function number_format( number, decimals, dec_point, thousands_sep ) {
    // Format a number with grouped thousands
    // 
    // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_number_format/
    // +       version: 806.816
    // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +     bugfix by: Michael White (http://crestidg.com)
    // +     bugfix by: Benjamin Lupton
    // +     bugfix by: Allan Jensen (http://www.winternet.no)
    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +     bugfix by: Howard Yeend
    // *     example 1: number_format(1234.5678, 2, '.', '');
    // *     returns 1: 1234.57     

    var n = number, c = isNaN(decimals = Math.abs(decimals)) ? 2 : decimals;
    var d = dec_point == undefined ? "." : dec_point;
    var t = thousands_sep == undefined ? "," : thousands_sep, s = n < 0 ? "-" : "";
    var i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", j = (j = i.length) > 3 ? j % 3 : 0;
    
    return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
}


function md5 ( str ) {
    // Calculate the md5 hash of a string
    // 
    // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_md5/
    // +       version: 804.1712
    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // + namespaced by: Michael White (http://crestidg.com)
    // -    depends on: utf8_encode
    // *     example 1: md5('Kevin van Zonneveld');
    // *     returns 1: '6e658d4bfcb59cc13f96c14450ac40b9'

    var RotateLeft = function(lValue, iShiftBits) {
            return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
        };

    var AddUnsigned = function(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);
            }
        };

    var F = function(x,y,z) { return (x & y) | ((~x) & z); };
    var G = function(x,y,z) { return (x & z) | (y & (~z)); };
    var H = function(x,y,z) { return (x ^ y ^ z); };
    var I = function(x,y,z) { return (y ^ (x | (~z))); };

    var FF = function(a,b,c,d,x,s,ac) {
            a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
            return AddUnsigned(RotateLeft(a, s), b);
        };

    var GG = function(a,b,c,d,x,s,ac) {
            a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
            return AddUnsigned(RotateLeft(a, s), b);
        };

    var HH = function(a,b,c,d,x,s,ac) {
            a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
            return AddUnsigned(RotateLeft(a, s), b);
        };

    var II = function(a,b,c,d,x,s,ac) {
            a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
            return AddUnsigned(RotateLeft(a, s), b);
        };

    var ConvertToWordArray = function(str) {
            var lWordCount;
            var lMessageLength = str.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] | (str.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;
        };

    var WordToHex = function(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;
        };

    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;

    str = utf8_encode(str);
    x = ConvertToWordArray(str);
    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();
}


function utf8_encode ( str_data ) {
    // Encodes an ISO-8859-1 string to UTF-8
    // 
    // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_utf8_encode/
    // +       version: 805.821
    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)        
    // *     example 1: utf8_encode('Kevin van Zonneveld');
    // *     returns 1: 'Kevin van Zonneveld'

    str_data = str_data.replace(/\r\n/g,"\n");
    var tmp_arr = [], ac = 0;

    for (var n = 0; n < str_data.length; n++) {
        var c = str_data.charCodeAt(n);
        if (c < 128) {
            tmp_arr[ac++] = String.fromCharCode(c);
        } else if((c > 127) && (c < 2048)) {
            tmp_arr[ac++] = String.fromCharCode((c >> 6) | 192);
            tmp_arr[ac++] = String.fromCharCode((c & 63) | 128);
        } else {
            tmp_arr[ac++] = String.fromCharCode((c >> 12) | 224);
            tmp_arr[ac++] = String.fromCharCode(((c >> 6) & 63) | 128);
            tmp_arr[ac++] = String.fromCharCode((c & 63) | 128);
        }
    }
    
    return tmp_arr.join('');
}

/* {Integer} pozice zacatku vybraneho textu v textovem poli, neni-li text vybrany, jde o pozici kurzoru */
var startPos = null;

var text_zpravy_value = '';

// function inputBlur(prvek) {
// 	//console.log('inputBlur()');
// 	text_zpravy_value = prvek.value;
// 	//IE support
// 	if (document.selection) {
// 		prvek.focus();
// 		sel = document.selection.createRange();
// 		alert(sel);
// 		//sel.text = myValue;
// 	}
// 	//MOZILLA/NETSCAPE support
// 	else if (prvek.selectionStart || prvek.selectionStart == '0') {
// 		startPos = prvek.selectionStart;
// 		//endPos = prvek.selectionEnd;
// 		//console.log( prvek.value.length );
// 	}
// 	else {
// 		startPos = prvek.value.length;
// 	}
// }

/** Slouci 2 objekty dohromady (pouze vlastnosti). V pripade shody nazvu vlastnosti se vlastnost z prvniho objektu prepise vlastnosti z druheho objektu.
 *  @param obj1 {Object} prvni objekt ke slouceni
 *  @param obj2 {Object} druhy objekt ke slouceni
 *  @return {Object} slouceny objekt
 */
function mergeObject(obj1, obj2) {
 	console.log('mergeObject()');
 	console.log( obj1 );
 	console.log( obj2 );
	if( obj1 == null ) return obj2;
	if( obj2 == null ) return obj1;
	if( typeof obj1 != 'object' || typeof obj2 != 'object' ) return false;
	var out = {};
	
	//projdu slozky v obj2
	for(var slozka in obj2) {
		//console.log('- prochazim slozku '+s);
		//projdu klice
		for(var klic in obj2[slozka]) {
			//console.log('-- prochazim klic '+k);
			//projdu zaznamy
			for(var zaznam in obj2[slozka][klic]) {
				//console.log('--- prochazim zaznam '+z);
				//neexistuje-li v obj1 tato slozka -> vytvorit ji
				if( obj1[slozka] == null ) obj1[slozka] = {};
				if( obj1[slozka][klic] == null ) obj1[slozka][klic] = {};
				obj1[slozka][klic][zaznam] = obj2[slozka][klic][zaznam];
			}
		}
	}
	return obj1;
}

/*
* Recursively merge properties of two objects 
*/
function MergeRecursive(obj1, obj2) {

  for (var p in obj2) {
    try {
      // Property in destination object set; update its value.
      if ( obj2[p].constructor==Object ) {
        obj1[p] = MergeRecursive(obj1[p], obj2[p]);

      } else {
        obj1[p] = obj2[p];

      }

    } catch(e) {
      // Property in destination object not set; create it and set its value.
      obj1[p] = obj2[p];

    }
  }

  return obj1;
}


function adresy() {
	this.adr = {};
	this.pocet = 0;
	
	this.add = function( obj ) {
		if(typeof obj != 'object') return false;
		//console.log(' - pridavam polozku do ADR (pocet='+this.pocet+')');
		this.adr[ this.pocet ] = obj;
		this.pocet++;
	}
	
	this.get = function() {
		if( typeof this.adr[ this.pocet-1 ] == 'object' ) {
			var out = this.adr[ this.pocet-1 ];
			//console.log(' - davam polozku z ADR (pocet='+this.pocet+')' );
			this.pocet--;
			return out;
		}
		else return false
	}
	
}



