
var FlashXMLHttpRequest = Class.create(
{
   method: null, 
   url: null,
   contentType: 'application/x-www-form-urlencoded',
   responseText: null,
   readyState: 0,
   status: null,
   onreadystatechange: null,

   initialize: function()
   {
   },

   open: function(method, url) 
   { 
      this.method = method;
      this.url = url;
   },

   send: function(body) 
   {
      FlashXMLHttpRequest.request(this.method, this.url, body, this.contentType, function(response) 
      {
         this.responseText = response;
         this.readyState = 4;
         this.status = 200;
 
         if (this.onreadystatechange) 
         {
            this.onreadystatechange();
         }
      }.bind(this));
   },

   setRequestHeader: function(name, value) 
   {
      if (name.toLowerCase() == 'Content-Type'.toLowerCase())
      {
         this.contentType = value;
      }
   }

});

Object.extend(FlashXMLHttpRequest, 
{
   callbacks: [],
   queue: [],
   ctrl: null,

   request: function(method, url, body, contentType, callback)
   {
      var call = function() 
      { 
         var policy = url.replace(/^(https?:\/*[^\/]*).*$/, '$1/crossdomainpolicy.xml');
         FlashXMLHttpRequest.ctrl.request(method, url, body, contentType, FlashXMLHttpRequest.refCallback(callback), policy); 
      };
      if (FlashXMLHttpRequest.ctrl)
      {
         call();
      }
      else
      {
         if (FlashXMLHttpRequest.queue.push(call) == 1)
         {
            FlashXMLHttpRequest.embed();
         }
      }
   },

   embed: function()
   {
      var fv = 'js_onload=FlashXMLHttpRequest.embedded';
      var html = '';
      html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="1" height="1" id="fxhr_flash" align="middle">';
      html += '<param name="allowScriptAccess" value="always">';
      html += '<param name="FlashVars" value="'+fv+'">';
      html += '<param name="movie" value="/_g/tvn/_d/fxhr/fxhr.swf">';
      html += '<embed src="/_g/tvn/_d/fxhr/fxhr.swf" FlashVars="'+fv+'" quality="high" width="1" height="1" name="fxhr_flash" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed>';
      html += '</object>';

      var el = document.createElement('div');
      el.style.position = 'absolute';
      el.style.top = '-1000px';
      el.style.left = '-1000px';
      el.style.width = '1px';
      el.style.height = '1px';
      document.body.appendChild(el);
      el.innerHTML = html;
   },

   embedded: function()
   {
      FlashXMLHttpRequest.ctrl = document['fxhr_flash'];
      FlashXMLHttpRequest.queue.each(function(func) { func.defer(); });
   },

   refCallback: function(cb)
   {
      var id = FlashXMLHttpRequest.callbacks.length;
      FlashXMLHttpRequest.callbacks.push(function()
      {
         delete FlashXMLHttpRequest.callbacks[id];
         cb.apply(null, arguments);
      });
      return 'FlashXMLHttpRequest.callbacks[' + id + ']';
   }
   
});


Ajax.Request.addMethods(
{
   initialize: function($super, url, options, dontrun) 
   {
      $super(options);
      this.transport = Ajax.getTransport();
      if (!dontrun) this.request(url);
   }
});

Ajax.FlashRequest = Class.create(Ajax.Request, 
{
  initialize: function($super, url, options) 
  {
    $super(url, options, true);
    this.transport = new FlashXMLHttpRequest();
    this.request(url);
  }
});
