function serialize (toSerialize, flag) {
	var serialized = '';
	var argType = typeof(toSerialize);

	if (toSerialize == null) {
		serialized = 'N;';
	} else if (argType == 'number') {
		if (toSerialize != NaN) {
			if (toSerialize == parseInt(toSerialize)) {
				serialized = 'i:' + toSerialize + ';';
			} else {
				serialized = 'd:' + parseFloat(toSerialize) + ';';
			}
		}
	} else if (argType == 'boolean') {
		serialized = 'b:' + (toSerialize == true ? '1' : '0') + ';';
	} else if (argType == 'string') {
		serialized = 's:' + toSerialize.length + ':"' + toSerialize + '";';
	} else if (argType == 'object')	{
		var noItems = 0
		for (var i in toSerialize) {
			var key = i
			if (parseInt(key).toString() == key) {
				key = parseInt(i);
			}
			var itemKey = serialize(key, true);
			var itemValue = serialize(toSerialize[i], true);

			serialized += itemKey + itemValue;
			noItems = noItems + 1;
		}
		serialized = 'a:' + noItems + ':{' + serialized + '}';
	}	
	return serialized;
}

function unserialize (serialized, flag) {
	var type = serialized.charAt(0);
	var result = new Array();

	if (type == 'a') {
		var start = serialized.indexOf('{');
		var noItems = serialized.substring(2, start - 1);
		var items = 0;
		var ret = new Array();
			ret['rest'] = serialized.substring(start + 1);
		while (items != noItems) {
			ret = unserialize(ret['rest'], true);
			var key = ret['value'];
			ret = unserialize(ret['rest'], true);
			var value = ret['value'];
			if (result && !result['value']) {
				result['value'] = new Array();
			}
			result['value'][key] = value;
			items++;
		}
		if (items == 0 && noItems == 0) {
			result['value'] = new Array();
		}
		if (ret['rest'] && ret['rest'] != '') {
			result['rest'] = ret['rest'].substring(1);
		}
	} else if (type == 'O') {
		var start = serialized.indexOf('{');
		var parts = serialized.substring(2, start - 1).split(':');
		var className = parts[1].substr(1, parseInt(parts[0]));			
		var noItems = parseInt(parts[2]);
		var items = 0;
		var ret = new Array();
			ret['rest'] = serialized.substring(start + 1);
		while (items != noItems) {
			ret = unserialize(ret['rest'], true);
			var key = ret['value'];
			ret = unserialize(ret['rest'], true);
			var value = ret['value'];
			if (result && !result['value']) {
				result['value'] = new Object();
				result['value'].phpClassName = className;
			}
			result['value'][key] = value;
			items++;
		}
		if (items == 0 && noItems == 0) {
			result['value'] = new Object();
			result['value'].phpClassName = className;
		}
	} else if (type == 's') {
		var start = serialized.indexOf('"');
		var length = parseInt(serialized.substring(2, start - 1), 10);
		result['value'] = serialized.substr(start + 1, length);
		result['rest'] = serialized.substring(start + length + 3);  
	} else if (type == 'i') {
		var end = serialized.indexOf(';');
		result['value'] = parseInt(serialized.substring(2, end), 10);
		result['rest'] = serialized.substring(end + 1); 
	} else if (type == 'b') {
		result['value'] = (serialized.substr(2, 1) == '1') ? true : false;
		result['rest'] = serialized.substring(4);
	} else if (type == 'd') {
		var end = serialized.indexOf(';');
		result['value'] = parseFloat(serialized.substring(2, end), 10);
		result['rest'] = serialized.substring(end + 1);
	} else if (type == 'N') {
		var end = serialized.indexOf(';');
		result['value'] = null;
		result['rest'] = serialized.substring(end + 1);
	}
	
	if (!flag) {
		result = result['value'];
	}
	return result;
}

	/**
	*	array_copy - makes a copy of an array without any reference
	*
	*	@param		array		array to copy
	*	@param		mixed		key to ignore when copying (or array of keys)
	*	@access		public
	*	@return		array		copy of an array
	*/
	function arrayCopy (src, except) {

		var avoided = new Array();
		if (except || except == 0) {
			switch ( typeof except ) {
				case 'number':
				case 'string':
				case 'boolean':	avoided[except] = 1;
								break;
				case 'object':	if (except != null && except.length != null)
									for (var i = 0; i < except.length; i++) {
										avoided[except[i]] = 1;
									}
								break;
			}
		}

		var dest = new Array();
		for (var index in src) {
			switch ( typeof src[index] ) {
				case 'number':
				case 'string':
				case 'boolean':	if (!avoided[index]) {
									dest[index] = src[index];
								}
								break;
				case 'object':	if (!avoided[index]) {
									dest[index] = arrayCopy(src[index]);
								}
								break;
			}
		}
		return dest;
	}

    function arrayCount (src)
    {
        var ret = 0;
        for (var i in src)
        {
            ret++;
        }
        return ret;
    }


	function windowOpen (href, wndWidth, wndHeight)
	{
		if (0) {
		// nove sa teraz nepouziva
		    var pos		= href.indexOf('?');

			urlParams 	= href.substring(pos + 1);
		    href 		= href.substring(0,pos);
			//alert(href);
			//alert(urlParams);
			wndParams   = 67;
			wndName     = false;

			var wnd		= WND_openPopup(href, urlParams, wndWidth, wndHeight, wndParams, wndName);

		} else {
		// stare
			w  = screen.width;
			h  = screen.height;
			w = ( w / 2 ) - ( wndWidth / 2);
			h = ( h / 2 ) - ( wndHeight / 2);
			h = h - h * 0.5;
			position = "left=" + w + ", top=" + h;
			var time = new Date ();

			var wnd = window.open (href, "popup_" + time.getTime(), "width=" + wndWidth + ",height=" + wndHeight + "," + position + ",toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=yes,resizable=yes,copyhistory=no");
		}
	}

	function browserCheck (href)
	{
	    var agt=navigator.userAgent.toLowerCase();
        var is_major = parseInt(navigator.appVersion);

        var is_ie      = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
        var is_ie3     = (is_ie && (is_major < 4));
        var is_ie4     = (is_ie && (is_major == 4) && (agt.indexOf("msie 4")!=-1) );
        var is_ie4up   = (is_ie && (is_major >= 4));
        var is_ie5     = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.0")!=-1) );
        var is_ie5_5   = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.5") !=-1));
        var is_ie5up   = (is_ie && !is_ie3 && !is_ie4);
        var is_ie5_5up =(is_ie && !is_ie3 && !is_ie4 && !is_ie5);
        var is_ie6     = (is_ie && (is_major == 4) && (agt.indexOf("msie 6.")!=-1) );
        var is_ie6up   = (is_ie && !is_ie3 && !is_ie4 && !is_ie5 && !is_ie5_5);

        if( is_ie5 )
        {
            var clientVersion = 'ie5_0';
        }
        else if( is_ie5_5 )
        {
            var clientVersion = 'ie5_5';
        }
        else if( is_ie6 )
        {
            var clientVersion = 'ie6_0';
        }

        if (!is_ie)
        {
            window.location = href;
            return;
        }
        
        document.all['client_version'].value = clientVersion;
	}

