var Subwindows = {
  className: 'genewin',
  winObservers: null,
  patchOpeners: function() {
    $$('a.subwindowOpener').each(function(a) {
      a.removeClassName("subwindowOpener");
      if(a.onclick) a._onclick = a.onclick;
      a.onclick = this.openerClicked;
    }.bind(this));
  },
  openerClicked: function(ev) {
    if(this._onclick && !this._onclick(ev)) {
      return false;
    }
    // try {
      var url = this.href;
      var id = url.replace(/\W/g, '_');
      title = this.title || this.innerHTML;
      if(this.rel) title = this.rel + ' :: ' + title;
      var w = Windows.getWindow(id);
      
    
      var p = this.parentNode;
      while(p && p.tagName && p.tagName.toLowerCase() != 'form') p = p.parentNode;
      var top = 0;
      var left = 0;
      var width = document.body.offsetWidth - 24;
      var height = document.body.offsetHeight - 24;
      if(p) { 
        top = Position.cumulativeOffset(p)[1];
        var menu = new Selector('.menu').findElements(p).first();
        
        width = Math.max((menu ? Position.cumulativeOffset(menu)[0] : p.offsetWidth) - 16, 400);

      }
      if(w) {
        w.setSize(width, height);
        w.setLocation(top, left);
        if(w.isMinimized()) w.minimize();
      } else {
        if(!this.winObservers) {
          this.winObservers = {
            onMaximize: function(ev, win) {
            var s = win.getSize();
            win.setSize(s.width - 24, s.height - 24);
            }
          };
          Windows.addObserver(this.winObservers);
        }
        w = new Window(id,
          Object.extend({ 
            title: title,
            width: width,
            height: height,
            className: Subwindows.className,
            // parent: $('content') || document.body,
           // maximizable: false,
            top: top,
            left: left, 
            showEffectOptions: { duration: 0.5 },
            hideEffectOptions: { duration: 0.5 }
          }, this.windowParameters || {})
        );
        w.setDestroyOnClose();
        w.getContent().innerHTML='<div class="loading"></div>';
        var modal = this.hasClassName("openModal");
        if(!modal) w.maximize();
        w.setAjaxContent(url, { onComplete: function() { Subwindows.onload(w, url); } }, this.hasClassName("openCenter"), modal);
      }
      w.show();
      w.toFront();
    // } catch(e) { alert(e); }
    return false;
  },
  
  onload: function(w, url) {
    try {
    var content = w.getContent();
    content.subwindowURL = url; 
    content.innerHTML.evalScripts();
    params = url.split(/\?/);
    if(params.length < 2) return;
    params = params[1].toQueryParams();

    ChooserTable.init(content, params['chooser_for'], params['choice_id']);
  } catch(e) { alert(e); }
  },
  
  findURL: function(node) {
    while(node) {
      if(node.subwindowURL) return node.subwindowURL;
      node = node.parentNode;
    }
    return null;
  },
  datasetCallbacks: {},
  datasetChanged: function(dataset, context, id) {
     if(dataset && (cbArray = this.datasetCallbacks[dataset])) {
      
      cbArray = cbArray.reject(function(cb) {
        try {
          if(id && id != cb.id) return false;
          if(cb.id && !$(cb.id)) return true; // no more DOM element, auto unregister
  
          if(cb.context && context && context.toString() != cb.context.toString()) return false;
          return cb.callback(dataset, context) == false;
        } catch(e) {}
        return true;
      });
    }
  },
  registerDatasetCallback: function(dataset, callback, options) {
    // options may contain a "context" this callback is subscribed to and/or 
    // the "id" of a DOM element this callback depends on  
    
    var cbArray = this.datasetCallbacks[dataset] ||
                  (this.datasetCallbacks[dataset] = $A([]));
    cbArray.push(Object.extend({ dataset: dataset, callback: callback }, options || {} ));
    if(AjaxScaffold && !AjaxScaffold._preSubwindowStripe) {
      AjaxScaffold._preSubwindowStripe = AjaxScaffold.stripe;
      AjaxScaffold.stripe = this.stripe;
    }
  },
  
  unregisterDatasetCallback: function(dataset, callback) {
    if(!this.datasetCallbacks[dataset]) return false;
    var j = this.datasetCallbacks[dataset].indexOf(callback);
    if(j < 0) return false;
    this.datasetCallbacks[dataset].splice(j, 1);
    return true;
  },
  
  findDataset: function(node) {
    while(node) {
      if(node.hasClassName("ajax-scaffold")) return node.id;
      node = node.parentNode;
    }
    return null;
  },
  
  fireTableCallbacks: function(tableNode) {
    var dataset = Subwindows.findDataset(tableNode);
   
    if(dataset) {
      url = Subwindows.findURL(tableNode);
      Subwindows.datasetChanged(dataset, url && url.split(/\?/)[1]);
    }
  },
  
  stripe: function(tableBody) {
    tableBody = $(tableBody);
    AjaxScaffold._preSubwindowStripe(tableBody);
    Subwindows.fireTableCallbacks(tableBody);
  },
  
  showInfo: function(ajaxParameters, windowParameters) {
   
    WindowUtilities.disableScreen('darkX', 'overlay_modal');
    var overlay = $('overlay_modal');
    overlay.onmousedown = function() { Dialog.closeInfo() };
    overlay.style.cursor = "pointer";
    
    Dialog.info(ajaxParameters, { windowParameters: Object.extend({ className: Subwindows.className, closable: true }, windowParameters || {} )});
    
  },
  
  findFolderIcon: function(indicator) {
     return new Selector("img.open-folder").findElements(indicator.parentNode).first();
  },
  onLoading: function(indicator) {
    var folder = Subwindows.findFolderIcon(indicator = $(indicator));
    if(folder) folder.hide();
    indicator.show();
  },
  onComplete: function(indicator) {
    window.setTimeout(function() {
      var folder = Subwindows.findFolderIcon(indicator = $(indicator));
      if(folder) folder.show();
      indicator.hide();
    }, 10);
  }
  
  
}


var Chooser = {
  linkClicked: function(l) {
    l.href = l.href.replace(/(\?|&)(choice_id=)\d+/, '$1$2' + l.parentNode.getElementsByTagName('input')[0].value);
    return true
  },
  displayClicked: function(d) {
    if(Element.hasClassName(d, "blankable") && !Element.hasClassName(d, "blank")) {
      var f = d.parentNode.getElementsByTagName('input')[0];
      if(f.value && confirm("Annullare la selezione?")) {
        f.value = '';
        f.onchange();
      }
    }
  },
  valueChanged: function(input, dataset) {
    var l = new Selector('.chooser-display').findElements(input.parentNode).first();
    l.className = input.value ? 
      l.className.replace(/\bblankable_\b/g, 'blankable').replace(/\bblank\b/g, '') :
      l.className.replace(/\bblankable\b/g, 'blankable_ blank');
      
    Subwindows.datasetChanged(dataset, null, l.id);
  }
}

var ChooserTable = {
  
  init: function(container, fieldId, selectedId) {
    var field = fieldId && $(fieldId);
    if(!field) return;
    var table = new Selector(".ajax-scaffold").findElements(container).first();
 
    if(table) table = table.getElementsByTagName("table")[0];
    if(!table) return;
    
    table.chooserMetaData = {
      fieldId: fieldId,
      selectedId: selectedId
    };
    Element.addClassName(table, "chooser");
    if(AjaxScaffold && !AjaxScaffold._preChooserTableStripe) {
      AjaxScaffold._preChooserTableStripe = AjaxScaffold.stripe;
      AjaxScaffold.stripe = ChooserTable.stripe;
    }
    ChooserTable.patchRows(table);
  },
  
  
  findMeta: function(tr) {
    for(var t = tr; t ; t = t.parentNode) {
      if(t.chooserMetaData) {
        return t.chooserMetaData;
      }
      if(t.tagName.toLowerCase() == "table") break;
    }
    return {};
  },
  
  stripe: function(tableBody) {
    tableBody = $(tableBody);
    AjaxScaffold._preChooserTableStripe(tableBody);
    ChooserTable.patchRows(tableBody);
  },
  patchRows: function(tableBody) {
    if(!tableBody) {
      $$("table.chooser").map(ChooserTable.patchRows);
      return;
    }
    var meta = ChooserTable.findMeta(tableBody);
    var selectedId = meta.selectedId || -1;
    $A(tableBody.getElementsByTagName("tr")).each(function(tr) {
      var m = tr.id.match(/-view-(\d+)-row/);
      if(m) {
        if(m[1] == selectedId) {
          tr.addClassName("chooser-selected");
        }
        tr.onmouseover = ChooserTable.onmouseover;
        tr.onmouseout = ChooserTable.onmouseout;
        tr.onclick = ChooserTable.onclick;
      }
    });
  },
  onmouseover: function() {
    Element.addClassName(this, "chooser-over");
  },
  onmouseout: function() {
     Element.removeClassName(this, "chooser-over");
  },
  
  onclick: function(ev) {
    try {
      if(Event.findElement(ev, 'td').hasClassName("actions")) return true;
    } catch(e) {}
    var m = this.id.match(/-view-(\d+)-row/);
    if(!m) return;
    
    var meta = ChooserTable.findMeta(this.parentNode);
    var field = meta.fieldId && $(meta.fieldId);
   
    if(field) {
      field.value = m[1];
      if(field.onchange) try {
        field.onchange(ev);
      } catch(e) {
        
      }
    }
    
    //Subwindows.fireTableCallbacks(this); // superseded by the onchange above
    var w = Windows.getFocusedWindow();
    if(w && Element.childOf(this, w.getContent())) w.hide();
    
  }

}

var FormDecorator = {
  timeout: null,
  patch: function() {
    // replicate buttons
    $$('p.form-footer').each(function(ff) {
        
        if(ff.previousSibling.className == "form-footer") return;
       
        this.patchButtons(ff);
        var fh = ff.cloneNode(true);
        fh.style.position = "absolute";
        fh.style.top = "-2px";
        fh.style.right = "0px";
        ff.parentNode.style.position = "relative";
        ff.parentNode.insertBefore(fh, ff);
        
    }.bind(this));
    if(this.timeout === null) this.cronjob();
  },
  
  patchButtons: function(box) {
    var nb;
    var button = box.down(".submit");
    if(button.tagName.toLowerCase() != "button") {
      var nb = document.createElement("button");
      nb.type = "submit";
      nb.className = "submit";
      nb.innerHTML='<span>' + button.value + '</span>';
      button.parentNode.insertBefore(nb, button);
      button.remove();
      button = nb;
    }
    
    if(box.down("a.print") || box.up("form").hasClassName("no-print")) return;
    var nb = document.createElement("a");
    nb.className = "print";
    nb.href = "#";
    nb.setAttribute("onclick", "FormDecorator.print(this); return false");
    nb.innerHTML = "<span>Stampa</span>";
    button.parentNode.insertBefore(nb, button.nextSibling);

  },
  
  cronjob: function() {
    var curtime = new Date().print("%Y-%m-%d %H:%M.%S");
    $$('span.curtime').each(function(s) {
        s.innerHTML = curtime;
    });
    FormDecorator.timeout = window.setTimeout(FormDecorator.cronjob, 1000);
  },
  
  print: function(handle) {
    var handle = $(handle);
    var pf = $('printframe');
    if(!pf) {
      var pf = $(document.body.appendChild(document.createElement("iframe")));
      pf.id = "printframe";
      pf.setStyle({visibility: "hidden", width: "1px", height: "1px", position: "absolute", right: "0px", bottom: "0px"});
    }
    window.setTimeout(function() {
      var doc = pf.contentDocument;
      var head = doc.getElementsByTagName("head")[0];
      $$('link').each(function(l) {
          if(!l.type == "text/css") throw $continue;
          var nl = doc.createElement("link");
          nl.rel = "stylesheet";
          nl.type = "text/css";
          nl.media = l.media;
          nl.href = l.href;
          head.appendChild(nl);
      });
      /*
      head.innerHTML = '<style>' +
       '.menu, .form-footer {display: none }'
       + '</style>';
      */
      // head.innerHTML = $(document.documentElement).down("head").innerHTML;
      doc.body.innerHTML = '<div id="content"><div class="ajax-scaffold"><form>' + 
         $(handle).up("form").innerHTML + '</form></div></div>';
      window.setTimeout(function() { pf.contentWindow.print(); }, 10);
    }, 10);
  }
}


