/*
 * Copyright 2006 OST-SYSTEMS. All rights reserved.
 */

function CookieStorage(cookieKey) {
  if (!cookieKey) {
    cookieKey = "KeyStorage";
  }
  this.cookieKey = cookieKey;
  this.reload();

  this.removeComplete = function() {
    var now = new Date();
    now.setYear(now.getFullYear() - 1);
    document.cookie = this.cookieKey + "=" + ";expires=" + now.toGMTString();
    CookieStorage.prototype.removeComplete();
  }  
}

CookieStorage.prototype = new KeyStorage();

CookieStorage.prototype.saveAll = function() {
  var result = this.saveArray(this.getStorage(), 2);
  var now = new Date();
  now.setYear(now.getFullYear() + 1);
  document.cookie = this.cookieKey + "=" + escape(result).length + " " + escape(result) + ";expires=" + now.toGMTString();
}

CookieStorage.prototype.saveArray = function(array, level) {
  var result = "["
  for (var key in array) {
    result += "\"" + key + "\",";
    if (level > 0) {
      result += this.saveArray(array[key], level - 1);
    }
    else {
      if (array[key] != null) {
        result += "\"" + array[key] + "\"";
      }
      else {
        result += "null";
      }
    }
    result += ",";
  }
  result += "null]";
  return result;
}

CookieStorage.prototype.reload = function() {
  var value = document.cookie;
  var keyStart = value.indexOf(this.cookieKey + "=");
  if (keyStart < 0) {
    this.setStorage(new Array());
    return;        
  }
  var lengthStart = value.indexOf("=", keyStart);
  var start = value.indexOf(" ", lengthStart);
  if (lengthStart >= 0 && start >= 0) {
    var length = parseInt(value.substring(lengthStart + 1, start));
    value = unescape(value.substring(start + 1, start + 1 + length));
  }
  else {
    this.setStorage(new Array());
    return;    
  }
  try {
    var array = eval(value);
    this.setStorage(this.loadArray(array, 2));
  }
  catch (e) {
    //addError("Reloading from Cookie failed: " + e);
  }  
}

CookieStorage.prototype.loadArray = function(array, level) {
  var result = new Array();
  for (var i = 0; i < array.length - 1; i += 2) {
    var key = array[i];
    if (level > 0) {
      result[key] = this.loadArray(array[i + 1], level - 1);
    }
    else {
      result[key] = array[i + 1];
    }  
  }
  return result;  
}


