var Storage = (function() {
  var PATH = "/util/storage.jsp";
  
  function StorageItem(value)
  {
      this.name = value.name;
      this.owner = value.owner;
      this.timestamp = value.timestamp;
      this.searchAttributes = value.searchAttributes;
      
      this.getStoredObject = function() { return value.object; };
      this.isPublic = function() { return (value['public'] ? true : false); };
      //setPublic
      //isOwner
      this.remove = function() { 
        var request = (window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("MSXML2.XMLHTTP"));
        var params = "url="+escape(window.location) +
                     "&public=" + (value['public'] ? true : false) +
                     "&action=delete" +
                     "&filter="+escape(this.name);

        request.open("POST", PATH, false);
        request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        request.setRequestHeader("Content-length", params.length);
        request.setRequestHeader("Connection", "close");
        request.send(params);
      };
  }
  
  function getUserItems(filter, searchAttributes, inclusive)
  {
      var request = (window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("MSXML2.XMLHTTP"));
      var response;
      var parameters = "?url="+escape(window.location)+"&public=false";
      var array = [];
      
      if(filter) parameters += "&filter="+escape(filter);
      if(searchAttributes) parameters += "&attributes="+escape(JSON.stringify(searchAttributes))+"&inclusive="+(inclusive ? true : false);      

      request.open("GET", PATH+parameters, false);
      request.send(null);

      response = eval("("+request.responseText+")");
      
      for(var i=0; i<response.length; i++) array[i] = new StorageItem(response[i]);
      
      return array;
  }
  
  function requestUserItems(callback, filter, searchAttributes, inclusive)
  {
      var request = (window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("MSXML2.XMLHTTP"));
      var response;
      var parameters = "?url="+escape(window.location)+"&public=false";
      var array = [];
      
      if(filter) parameters += "&filter="+escape(filter);
      if(searchAttributes) parameters += "&attributes="+escape(JSON.stringify(searchAttributes))+"&inclusive="+(inclusive ? true : false);      

      request.onreadystatechange = function() {
          if(request.readyState != 4) return;
          
          if(request.status == 200) 
          {
              response = eval("("+request.responseText+")");
              
              for(var i=0; i<response.length; i++) array[i] = new StorageItem(response[i]);
              
              callback(array);
          }
          else
          {
              callback(null);
          }
      };
      
      request.open("GET", PATH+parameters, true);
      request.send(null);
  }
  
  function getPublicItems(filter, searchAttributes, inclusive)
  {
      var request = (window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("MSXML2.XMLHTTP"));
      var response;
      var parameters = "?url="+escape(window.location)+"&public=true";
      var array = [];
      
      if(filter) parameters += "&filter="+escape(filter);
      if(searchAttributes) parameters += "&attributes="+escape(JSON.stringify(searchAttributes))+"&inclusive="+(inclusive ? true : false);      

      request.open("GET", PATH+parameters, false);
      request.send(null);

      response = eval("("+request.responseText+")");
      
      for(var i=0; i<response.length; i++) array[i] = new StorageItem(response[i]);
      
      return array;
  }
  
  
  function requestPublicItems(callback, filter, searchAttributes, inclusive)
  {
      var request = (window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("MSXML2.XMLHTTP"));
      var response;
      var parameters = "?url="+escape(window.location)+"&public=true";
      var array = [];
      
      if(filter) parameters += "&filter="+escape(filter);
      if(searchAttributes) parameters += "&attributes="+escape(JSON.stringify(searchAttributes))+"&inclusive="+(inclusive ? true : false);      

      request.onreadystatechange = function()
      {
          if(request.readyState != 4) return;
          
          if(request.status == 200) 
          {
              response = eval("("+request.responseText+")");
              
              for(var i=0; i<response.length; i++) array[i] = new StorageItem(response[i]);
              
              callback(array);
          }
          else
          {
              callback(null);
          }
      }
      
      request.open("GET", PATH+parameters, true);
      request.send(null);
  }
  
  function insert(name, object, pubflag, searchAttributes)
  {
      var wrapper = {};
      
      wrapper.name = name;
      wrapper.object = object;
      wrapper['public'] = (pubflag ? true : false);
      wrapper.searchAttributes = searchAttributes;
      
      var request = (window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("MSXML2.XMLHTTP"));
      var parameters = 
          "url="+ escape(window.location) +
          "&public=" + (pubflag ? true : false) +
          "&json=" + escape(JSON.stringify(wrapper));

      request.open("POST", PATH, false);
      request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      request.setRequestHeader("Content-length", parameters.length);
      request.setRequestHeader("Connection", "close");
      request.send(parameters);

      return eval("("+request.responseText+")");
  }
  
  return {
      getUserItems: getUserItems,
      getPublicItems: getPublicItems,
      requestUserItems: requestUserItems,
      requestPublicItems: requestPublicItems,
      insert: insert
  }
})();

var Website = (function() {
    var PATH = "/util/users.jsp";
    
    function WebsiteImpl(object)
    {
        var username;

        if(object) username = object.username;
    
        this.sLoggedIn = function()
        {
            return Boolean(username);
        }
        
        this.getUserName = function()
        {
            return username;
        }
    }
    
    function requestWebsiteInfo(callback)
    {
        var request = (window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("MSXML2.XMLHTTP"));
        var response;
        
        request.onreadystatechange = function() {
            if(request.readyState != 4) return;
            
            if(request.status == 200) 
            {
                response = eval("("+request.responseText+")");
                
                callback(new WebsiteImpl(response));
            }
            else
            {
                callback(null);
            }
        };
            
        request.open("GET", PATH, true);
        request.send(null);
    }
    
    return {
        requestWebsiteInfo: requestWebsiteInfo
    };
})();
