// set value for specified context's specified name-value pair
function SetValue(new_context, new_name, new_value)
{
  // use escape() to create non-space string from potentially spaced string
  var context = escape(new_context);
  var name = escape(new_name);
  var value = escape(new_value);
    
  var context_name = context + "/" + name;
  SetCookie(context_name, value);
}

// set values for a specified context, all values for the context is saved
// in an array (values)
function SetValues(context, values)
{  
  for(var name in values)
    SetValue(context, name, values[name]);
}

// retrieve a value for specified context's specified name
function GetValue(context_id, name_id)
{
  var retStrings = GetCookie().split("&");

  // retrieve context, name, and value for each cookie.
  // if it all matches, retrieve the value.  use unescape() to
  // get original value
  for(var i = 0; i < retStrings.length; i++)
  {
	var context_name_value = retStrings[i].split(":");
	var context_name = unescape(context_name_value[0]);
		
	if(context_name != (context_id + "/" + name_id))
	  continue;
	  
	var value = unescape(context_name_value[1]);
	return value;	
  }
  
  // if no match found, empty string is returned
  return "";
}

// retrieve all name-value pairs for a specified context
function GetValues(context_id)
{
  var retStrings = GetCookie().split("&");
  values = new Array();
  
  // for each name-value pair, if it is in specified context,
  // add to the array, then return the entire array of name-value pair
  // for the context.
  for(var i = 0; i < retStrings.length; i++)
  {
	var context_name_value = retStrings[i].split(":");
	var context_name = unescape(context_name_value[0]);

	var len = context_id.length;
	if(context_name.slice(0, len) != context_id)
	  continue;
	  
	if(context_id != "")
	  len++;	  
	var sub_context_name = context_name.slice(len);
	  
	var value = unescape(context_name_value[1]);
	values[sub_context_name] = value;
  }
  
  return values;
}

// clear a specified context's specified name's value
function ResetValue(context_id, name_id)
{
  SetValue(context_id, name_id, "");
}

// clear all name-value pair for a specified context
function ResetValues(context_id)
{
  var values = GetValues(context_id);
  for(name in values)
    SetValue(context_id, name, "");
}

function DeleteValue(context_id, name_id)
{
  var context = escape(context_id);
  var name = escape(name_id);
  
  DeleteCookie(context + "/" + name); 
}

function DeleteValues(context_id)
{
  var values = GetValues(context_id);
  for(name in values)
    DeleteValue(context_id, name);
}

function GetContexts(context_id)
{
  var retStrings = GetCookie().split("&");
  contexts = new Array();
  
  for(var i = 0; i < retStrings.length; i++)
  {
	var context_name_value = retStrings[i].split(":");
	var context_name = unescape(context_name_value[0]);
		
	var len = context_id.length;
	if(context_name.slice(0, len) != context_id)
	  continue;
	
	if(context_id != "")
	  len++;
	var sub_context_name = context_name.slice(len);
	var sub_context = sub_context_name.split("/");
	  
	var name = unescape(sub_context[0]);
	contexts[name] = name;	// for contexts, name is also value
  }
  
  return contexts;
}

// low level methods which must be called only from methods in this file

function SetCookie(name, value)
{
  var cookie = document.cookie.split("=");
  if(cookie.length < 2)
  {
    document.cookie = "TheCookie=" + name + ":" + value + "&";
	return;
  }

  var new_cookie = "TheCookie=";
  var found = false;
  
  var name_value_pairs = cookie[1].split("&");
  for(var i = 0; i < name_value_pairs.length - 1; i++)
  {
    var pairs = name_value_pairs[i].split(":");
	if(pairs.length < 2)
	{
	  alert(/*IDS_E_COOKIE_CORRUPTED*/"Cookie-Format beschdigt. Cookie kann nicht eingestellt werden. ");
	  return;
	}

    if(pairs[0] == name)
	{
	  pairs[1] = value;
	  found = true;
	}
	
	new_cookie += pairs[0] + ":" + pairs[1] + "&";
  }
    
  if(!found)
    new_cookie += name + ":" + value + "&";
	
  var NUM_OF_DAYS_TO_KEEP = 90;	// length in days to be kept data in cookie
  var date = new Date();
  date.setDate(date.getDate() + NUM_OF_DAYS_TO_KEEP);
  
  document.cookie = new_cookie + "; expires=" + date.toGMTString() + ";";
}

function GetCookie()
{
  var cookie = document.cookie.split("=");
  
  if(cookie.length < 2)
    return "";

  return cookie[1];
}

function DeleteCookie(name)
{
  var cookie = document.cookie.split("=");
  if(cookie.length < 2)
	return;

  var new_cookie = "TheCookie=";
  
  var name_value_pairs = cookie[1].split("&");
  for(var i = 0; i < name_value_pairs.length - 1; i++)
  {
    var pairs = name_value_pairs[i].split(":");	
	if(pairs.length < 2)
	{
	  alert(/*IDS_E_COOKIE_CORRUPTED*/"Cookie-Format beschdigt. Cookie kann nicht eingestellt werden. ");
	  return;
	}

    if(pairs[0] == name)
	  continue;
	
	new_cookie += pairs[0] + ":" + pairs[1] + "&";
  }
	
  var NUM_OF_DAYS_TO_KEEP = 90;	// length in days to be kept data in cookie
  var date = new Date();
  date.setDate(date.getDate() + NUM_OF_DAYS_TO_KEEP);
  
  document.cookie = new_cookie + "; expires=" + date.toGMTString() + ";";
}
