var ScreenState = {
  loadScreenStateParam: function() {
    return encodeURIComponent("load_screen_state") + "=" + encodeURIComponent('true');  
  },
  hasLoadScreenStateParam: function(location) {
    var location = location || document.location;
    return location.search.indexOf(this.loadScreenStateParam()) != -1;  
  },
  reloadOpener: function(prepareQuery) {
    var location = window.opener.location; 
    var search = location.search;
    if (typeof(prepareQuery) != 'undefined' ) search = prepareQuery(search);    
    if (!this.hasLoadScreenStateParam(location)) search = appendQuery(search, this.loadScreenStateParam());
    location.search = search;
  },  
  requestPath: function(name, value) {
    var path = encodeURI("/sessions/screen_state");
    var query = encodeURIComponent(name) + '=' + encodeURIComponent(value);
    return path + '?' + query;
  },
  onFailure: function(transport) {
    if (transport.responseText) alert(transport.responseText);
  },
  add: function(element) {
    new Ajax.Request(this.requestPath('add', element), { onFailure: this.onFailure });
  },
  remove: function(element) {
    new Ajax.Request(ScreenState.requestPath('remove', element), { onFailure: this.onFailure });
  },
  yieldState: function(transport, handleState, handleMissing) {
    var missingElements = new Array();
    var elements = transport.responseText.split(/,/);
    for (var i = 0; i < elements.length; i++) {
      var element = elements[i];
      if (element.length == 0) continue;
      document.getElementById(element) ? handleState(element) : missingElements.push(element);
    }
    if (missingElements.length > 0) setTimeout(handleMissing, 0, missingElements.join(","));
  },
  load: function(initStates, handleState, force_get) {
    var options = {
      onSuccess: function(transport) { ScreenState.yieldState(transport, handleState, ScreenState.remove); }, 
      onFailure: this.onFailure
    };
    if (this.hasLoadScreenStateParam() || force_get) {
      new Ajax.Request(this.requestPath('get', ''), options);
    } else {
      new Ajax.Request(this.requestPath('init', initStates), options);
    }
  },
  each: function(handleState) {
    var options = { 
      onSuccess: function(transport) {ScreenState.yieldState(transport, handleState, function(element){});}, 
      onFailure: this.onFailure
    };    
    new Ajax.Request(this.requestPath('get', ''), options);    
  },
  // what follows are specific functions for showing/hiding thumbnails  
  showThumb: function(tag, name, linkElement, hideText) {
    var elements = getElementsByNameX(tag, name);
    for( var i=0; i<elements.length; i++ ) $(elements[i].id).show();
    linkElement.innerHTML = hideText;
  },
  hideThumb: function(tag, name, linkElement, showText) {
    var elements = getElementsByNameX(tag, name);    
    for( var i=0; i<elements.length; i++ ) $(elements[i].id).hide();
    linkElement.innerHTML = showText;
  },
  toggleThumb: function(tag, name, linkElement, showText, hideText) {
    if (linkElement.innerHTML == showText) {
      this.showThumb(tag, name, linkElement, hideText);
      this.add(linkElement.id);      
    } else if (linkElement.innerHTML == hideText) {
      this.hideThumb(tag, name, linkElement, showText);
      this.remove(linkElement.id);      
    } else { 
      alert("innerHTML:" + linkElement.innerHTML + " unexpected!");
    }
  }
  
}

