/* !!NOTOKENS!!
   $Id: pork.iframe.js,v 1.3 2009/03/20 17:58:37 mleite Exp $
   $Source: /home/np/shared/filmcom/static/js/pluck/pork.iframe.js,v $

   COPIED FROM: http://sitelife.film.com/ver1.0/Direct/DirectProxy
*/
document.iframeLoaders = {};

iframe = function() { this.initialize.apply(this, arguments); };
iframe.prototype = {
  initialize: function(form, options,count){
    if (!options) options = {};
    this.form = form;
    this.uniqueId = count;
    document.iframeLoaders[this.uniqueId] = this;
    this.transport = this.getTransport();
    this.onComplete = options.onComplete || null;
    this.update = this.$(options.update) || null;
    this.updateMultiple = options.multiple || false;
    if (((navigator.vendor && (navigator.vendor.indexOf('Apple')) > -1) || window.opera) // safari and opera only
     && (/\/Direct\/Process(\?|$)/.test(form.action)) && form.elements && (form.elements.length == 1)) { // only change calls that contain 1 element and whose actions end with /Direct/Process
      var url = form.action + '?jsonRequest=' + escape(form.elements[0].value), // change form submit to string; similar to changing form method to get
          doc = this.transport.contentWindow || this.transport.contentDocument; // retrieve the document of the iframe
      if (url.length < 80000) { // allow fallback to normal submission (80k is the max length for urls in safari)
        if (doc.document) // make sure we have the document and not the window
          doc = doc.document;

        try { // if this fails, fallback to normal submission
          doc.location.replace(url); // use location.replace to overwrite elements in history
          return;
        } catch (e) { };
      }
    }
    form.target= 'frame_'+this.uniqueId;
    form.setAttribute("target", 'frame_'+this.uniqueId); // in case the other one fails.
    form.submit();
  },

  onStateChange: function() {
    this.transport = this.$('frame_'+this.uniqueId);
    try {	 var doc = this.transport.contentDocument.body.innerHTML; this.transport.contentDocument.close(); }	// For NS6
    catch (e){
      try{ var doc = this.transport.contentWindow.document.body.innerHTML; this.transport.contentWindow.document.close(); } // For IE5.5 and IE6
       catch (e){
         try { var doc = this.transport.document.body.innerHTML; this.transport.document.body.close(); } // for IE5
          catch (e) {
            try	{ var doc = window.frames['frame_'+this.uniqueId].document.body.innerText; } // for really nasty browsers
            catch (e) { //alert(e);
            } // forget it.
         }
      }
    }
    this.transport.responseText = doc;
    if (this.onComplete) setTimeout(this.bind(function(){this.onComplete(this.transport);}, this), 10);
    if (this.update) setTimeout(this.bind(function(){this.update.innerHTML = this.transport.responseText;}, this), 10);
    if (this.updateMultiple){ setTimeout(this.bind(function(){ // JSON support!
        try	{ var hasscript = false; eval("var inputObject = "+this.transport.responseText);	// we're expecting a JSON object, eval it to inputObject
          for (var i in inputObject) { if (i == 'script') { hasscript = true; } // check if we passed some javascript along too
            else {if ( elm = this.$(i)) { elm.innerHTML = inputObject[i]; } else {
            //alert("element "+i+" not found!");
            } } // if it's not script, update the corresponding div
          } if (hasscript) eval(inputObject['script']); // some on-the-fly-javascript exchanging support too
        } catch (e) { //alert('There was an error processing: '+this.transport.responseText);
        } // in case of an error
      }, this), 10);
    }
  },

  getTransport: function() {
    var divElm = document.createElement('DIV'), frame;
    divElm.setAttribute('style', 'width: 0; height: 0; margin: 0; padding: 0; visibility: hidden; overflow: hidden');
    if (navigator.userAgent.indexOf('MSIE') > 0 && navigator.userAgent.indexOf('Opera') == -1) {// switch to the crappy solution for IE
      divElm.style.width = 0;
      divElm.style.height = 0;
      divElm.style.margin = 0;
      divElm.style.padding = 0;
      divElm.style.visibility = 'hidden';
      divElm.style.overflow = 'hidden';
      divElm.innerHTML = '<iframe name=\"frame_'+this.uniqueId+'\" id=\"frame_'+this.uniqueId+'\" src=\"about:blank\" onload=\"setTimeout(function(){document.iframeLoaders['+this.uniqueId+'].onStateChange()},20);"></iframe>';
    } else {
      frame = document.createElement("iframe");
      frame.setAttribute("name", "frame_"+this.uniqueId);
      frame.setAttribute("id", "frame_"+this.uniqueId);
      frame.addEventListener("load", this.bind(function(){ this.onStateChange(); }, this), false);
      divElm.appendChild(frame);
    }
    (RequestBatch.container || document.body).appendChild(divElm);
    return frame;
  },

  bind: function(functionObject, referenceObject) {
    return function() {
      return functionObject.apply(referenceObject, arguments);
    }
  },

  '$': function(id) {
    return document.getElementById(id);
  }
};