/**
 * Cookies custom object
 * @author Gytis Galvanauskas <gytis@gaumina.lt>
 * @version 0.1
 * @package undefined
 * @subpackage undefined
 */

/**
 * Global client info object
 */

if( ! oClientInfo ) { var oClientInfo = new ClientInfo() };

/**
 * Cookies custom object
 * @access public
 * @static
 */

Cookies = {};

/**
 * Set cookie
 * @access public
 * @param string name
 * @param string value
 * @param string expires 
 * @param string path  
 * @param string domain  
 * @param boolean secure   
 * @return boolean sucsessful?
 */

Cookies.set = function( name, value, expires, path, domain, secure ) {
	var ret_val = false;
	
	if( document.cookie ) {
		
		document.cookie =			escape( name ) + '=' + escape( value ) +			( expires ? ( '; expires=' + expires.toGMTString() ) : '' ) +			( path ? 	( '; path=' + path ) : '' ) +			( domain ? 	( '; domain=' + domain ) : '') + 			( secure ? 	( '; secure'  ) : '' );
			
		ret_val = true;
				}
	
	return( ret_val );

};
/**
 * Get cookie
 * @access public
 * @param string name
 * @return string cookie value
 */

Cookies.get = function( name ) {
	var ret_val = '';	
	if( document.cookie ) {
	
		var name_pos = document.cookie.indexOf( escape( name ) + '=' );	
		if( name_pos != -1 ) {	
			var value_pos = name_pos + ( escape( name ) + '=' ).length;			var end_pos = document.cookie.indexOf( ';', value_pos );	
			if( end_pos != -1 ) {
				ret_val = unescape( document.cookie.substring( value_pos, end_pos ) );
			} else {				ret_val = unescape( document.cookie.substring( value_pos ) );
			}		}
		
	}
	
	return( ret_val );
};

/**
 * Set cookie as complex variable
 * @access public 
 * @param string name
 * @param mixed value
 * @param string expires 
 * @param string path  
 * @param string domain  
 * @param boolean secure   
 * @return boolean sucsessful?
 */

Cookies.setVar = function( name, value, expires, path, domain, secure ) {

	var ret_val = false;
	
	ret_val = Cookies.set( name, Cookies.varToCookie( value ), expires, path, domain, secure );
	
	return( ret_val );

};

/**
 * Get cookie as complex variable
 * @access public 
 * @param string name
 * @return mixed cookie value
 */

Cookies.getVar = function( name ) {

	var ret_val = '';
	var temp_val = '';
	
	temp_val = Cookies.get( name );
	
	if( temp_val.length > 0 ) {
		ret_val = Cookies.cookieToVar( temp_val );
	}
	
	return( ret_val );

};

/**
 * Recursive complex variable converting to string
 * @access private
 * @param mixed variable
 * @param string prefix
 * @return string
 */

Cookies._varToCookie = function( variable, prefix ) {
	
	var ret_val = '';
	var type = typeof( variable );
	
	switch( type ) {
		
		case 'number': case 'string': case 'boolean':
			
			ret_val += prefix + '!' + type.substring( 0, 1 ) + '=' + escape( variable ) + '&';
			
		break;
		
		case 'object': case 'array':
			
			ret_val += prefix + '!' + type.substring( 0, 1 ) + '=1&';
			
			for( var idx in variable ) {
				ret_val += Cookies._varToCookie( variable[idx], idx );
			}
			
			ret_val += prefix + '!' + type.substring( 0, 1 ) + '=0&';

		break;

	}
	
	return( ret_val );
	
	
	
};

/**
 * Convert complex variable to string for storing as cookie
 * @access public
 * @param mixed variable
 * @return string
 */

Cookies.varToCookie = function( variable ) {

	var ret_val = '';
	
	ret_val = Cookies._varToCookie( variable, 'r' );
	
	if( ret_val.length > 0 ) {
		ret_val = ret_val.substr( 0, ret_val.length - 1 );
	}
	
	return( ret_val );

};

/**
 * Convert string to complex variable 
 * @access public
 * @param string cookie_value
 * @return mixed
 */

Cookies.cookieToVar = function( cookie_value ) {

	var h_stack = new Array();
	var ret_val = null;
	var temp_val = {};
	var parts = cookie_value.split( '&' );
	
	for( var idx in parts ) {
		
		var name = parts[idx].split( '=' );
		var value = name[1];
		name = name[0].split( '!' );
		var type = name[1];
		name = name[0];
		
		switch( type ) {
		
			case 'o': case 'a':
				
				if( value == 1 ) {
					h_stack[h_stack.length] = name;
					eval( "temp_val['" + h_stack.join( "']['" ) + "']=" + 'new ' + ( ( type == 'a' ) ? 'Array' : 'Object' ) + '();' );
				} else {
					h_stack.length = h_stack.length - 1;
				}
			
			break;
			
			case 'b': case 's': case 'n':
				
				eval( "temp_val['" + ( ( h_stack.length > 0 ) ? ( h_stack.join( "']['" ) + "']['" ) : '' ) + name + "']=" + 'unescape( value );' );
				
			break;
		
		}
	
	
	}
	
	if( temp_val['r'] ) {
		ret_val = temp_val['r'];
	}
	
	return( ret_val );

};