// FileHost.nu Upload Progress Script - Version 1.95
// Copyright (c)2006 RWJD.Com.  All Rights Reserved.
// Last Modified: Saturday, June 17, 2006 10:53 PM

   function LoadVars()
   {
      function addRequestHeader()
      {
         var rqh = Array();

         if(arguments.length == 1 && typeof(arguments[0]) != 'string')
         {
            for(var a = 0; a < arguments[0].length; a++)
               rqh.push(arguments[0][a]);
         }
         else if(arguments.length == 2 && typeof(arguments[0]) == 'string' && typeof(arguments[1]) == 'string')
         {
            rqh.push(arguments[0]);
            rqh.push(arguments[1]);
         }
         if(rqh.length > 0 && (rqh.length % 2) == 0)
            __headers = rqh;
      }

      function decode(str)
      {
         var response = str.split('&');

         if(response.length > 0)
         {
            for(var a in response)
            {
               if(response[a] != '')
               {
                  var pos = response[a].indexOf('=');
                  var key = response[a].substr(0, pos);
                  var value = response[a].substr((pos + 1), (response[a].length - pos));
                  __self[key] = value;
               }
            }
         }
      }
	
      function getBytesLoaded()
      {
         return __getBytes('responseText.length');
      }
	
      function getBytesTotal()
      {
         return __getBytes('getResponseHeader("Content-Length")');
      }
	
      function load(url)
      {
         __self.loaded = false;
         var result = false;

         if(__bridge != null)
         {
            try
            {
               __bridge.open('GET', url, true);
               __bridge.send(null);
               __onprogress();
               result = true;
            }
            catch(evt)
            {
               __self.lastError = evt.toString();
               result = false;
            }
         }
         return result;
      }
	
      function send(url, target, method)
      {
         __self.sendAndLoad(url, null, method);
      }
	
      function sendAndLoad(url, targetObject, method)
      {
         __self.loaded = false;
         var result = false;

         if(__bridge != null)
         {
            if(__self != targetObject)
               __delegate = targetObject;
            method = __metodChosed(method);
            var toserver = __toServer(result);
            var topage = '';
            for(var a in toserver)
               topage += a + '=' + escape(toserver[a]) + '&';
            topage = topage.substr(0, (topage.length - 1));
            result = false;
            try
            {
               if(method == 'GET')
               {
                  if(topage.length > 0)
                     url += '?' + topage;
                  __bridge.open(method, url, true);
                  __addHeaders();
                  __bridge.send(null);
               }
               else
               {
                  __bridge.open(method, url, true);
                  __addHeaders();
                  __bridge.setRequestHeader('Content-type', __self.contentType);
                  __bridge.setRequestHeader('Content-length', topage.length);
                  __bridge.setRequestHeader('Connection', 'close');
                  __bridge.send(topage);
               }
               if(targetObject != null)
                  __onprogress();
               result = true;
            }
            catch(evt)
            {
               __self.lastError = evt.toString();
               result = false;
            }
         }
         return result;
      }
	
      function toString()
      {
         return __toString(false);
      }
	
      function getProgress()
      {
         return __progress;
      }
	
      function __unescapeString(str)
      {
         return unescape(str.split('+').join(' '));
      }

      function __resultRowManager(str)
      {
         var pos = str.indexOf('=');
         var key = str.substr(0, pos);
         var value = str.substr((pos + 1), (str.length - pos));

         if(__delegate == null)
            __self[key] = __unescapeString(value);
         else
            __delegate[key] = __unescapeString(value);
      }

      function __addHeaders()
      {
         var result = false;

         if(__headers.length > 0)
         {
            result = true;
            for(var a = 0; a < __headers.length; a+=2)
            {
               if(__headers[a].toLowerCase() == 'content-type')
                  __self.contentType = __headers[(a+1)];
               else
                  __bridge.setRequestHeader(__headers[a], __headers[(a+1)]);
            }
         }
         return result;
      }

      function __callOnLoad(s)
      {
         if(__delegate == null && typeof(__self.onLoad) != 'undefined')
            __self.onLoad(s);
         else if(__delegate != null && typeof(__delegate.onLoad) != 'undefined')
            __delegate.onLoad(s);
         __delegate = null;
      }

      function __onLoad()
      {
         var response = __bridge.responseText.split('&');

         if(response.length > 0)
         {
            for(var a in response)
            {
               if(response[a] != '')
                  __resultRowManager(response[a]);
            }
         }
         __callOnLoad(true);
      }

      function __onData(s)
      {
         if(__delegate == null && typeof(__self.onData) != 'undefined')
            __self.onData(s);
         else if(__delegate != null && typeof(__delegate.onData) != 'undefined')
            __delegate.onData(s);
         __delegate = null;
      }

      function __onError()
      {
         __callOnLoad(false);
      }

      function __getBridge()
      {
         var result = null;

         if(typeof(XMLHttpRequest) != 'undefined')
           result = new XMLHttpRequest();
         else if(window.ActiveXObject)
         {
            var t = (navigator.userAgent.toLowerCase().indexOf('msie 5') != -1) ? 'Microsoft' : 'Msxml2';
            result = new ActiveXObject(t + '.XMLHTTP');
         }

         if(result == null)
            __self.lastError = 'This browser does not support XML request.';
         return result;
      }

      function __metodChosed(method)
      {
         if(method == null)
            method = 'POST';
         else
         {
            method = method.toUpperCase();
            if(method != 'POST' && method != 'GET')
               method = 'POST';
         }
         return method;
      }

      function __parseValue(v)
      {
         var tmpstr;

         switch(typeof(v))
         {
            case 'function':
               tmpstr = '[type Function]';
               break;
            case 'object':
               switch(v.constructor)
               {
                  case String:
                  case Number:
                     tmpstr = v;
                     break;
                  case Boolean:
                     tmpstr = v == false ? 'false' : 'true';
                     break;
                  default:
                     tmpstr = '[type Object]';
                     break;
               }
               break;
            default:
               tmpstr = v;
               break;
         }
         return tmpstr;
      }

      function __toString(result)
      {
         var toserver = '';

         for(var a in __self)
         {
            if(a == 'getBytesTotal')
               result = true;
            else if(result == true)
               toserver += a + '=' + __parseValue(__self[a]) + '&';
         }
         return toserver.substr(0, (toserver.length-1));
      }

      function __toServer(result)
      {
         var toserver = Object();

         for(var a in __self)
         {
            if(a == 'getBytesTotal')
               result = true;
            else if(result == true)
               toserver[a] = __parseValue(__self[a]);
         }
         return toserver;
      }

      function __getBytes(what)
      {
         var result;

         if(typeof(window.XMLHttpRequest) == 'undefined' || typeof(__bridge.responseText) === 'unknown')
         {
            if(what == 'responseText.length')
               result = __bridge.readyState;
            else
               result = 4;
         }
         else
         {
            try
            {
               result = eval('__bridge.' + what);
            }
            catch(evt)
            {
               result = 0;
            }
         }
         return result;
      }

      function __onprogress()
      {
         __progress = 0;
         function __checkProgress()
         {
            if((window.XMLHttpRequest && __bridge.readyState >= 2 && typeof(__bridge.status) === 'number' && __bridge.status != 200) || (__bridge.readyState == 4 && typeof(__bridge.statusText) === 'string' && __bridge.statusText.toUpperCase() !== 'OK'))
            {
               __self.lastError = __bridge.statusText;
               if(typeof(__bridge.statusText) === 'string' && __bridge.statusText != '')
                  __onData(__bridge.responseText);
               else
                  __onData('Error #' + __bridge.status);
                  __onError();
            }
            else if(__bridge.readyState == 4)
            {
               __progress = 100;
               __self.loaded = true;
               __onLoad();
            }
            else
            {
               var p = Math.floor((getBytesLoaded() / getBytesTotal()) * 100);
               p = isNaN(p) ? 0 : p;
               __progress = p > 99 ? 99 : p;
               setTimeout(__checkProgress, 5);
            }
         }
         __checkProgress();
      }
	
      this.loaded = false;
      this.lastError = '';
      this.contentType = 'application/x-www-form-urlencoded';

      this.load = load;
      this.send = send;
      this.sendAndLoad = sendAndLoad;
      this.decode = decode;
      this.toString = toString;
      this.addRequestHeader = addRequestHeader;
      this.getBytesLoaded = getBytesLoaded;
      this.getBytesTotal = getBytesTotal;
      this.getProgress = getProgress;

      var __progress = 0;
      var __self = this;
      var __delegate = null;
      var __headers = Array();
      var __bridge = __getBridge();
   }

   function BytesUploaded(phpFile, latency)
   {
      function start(htmlid)
      {
         __filemonitor.htmlid = htmlid;
         __fileloaderInterval = setTimeout(__readFileSize, 10);
         return true;
      }

      function __fSize(size, dec)
      {
         if(!dec || dec < 0)
            dec = 2;
         var times = 0;
         var nsize = Number(size);
         var toEval = '';
         var type = Array( 'bytes', 'Kb', 'Mb', 'Gb', 'Tb', 'Zb' );
         while( nsize > 1024 )
         {
            nsize = nsize / 1024;
            toEval += ' / 1024';
            times++;
         }
         if( times > 0 )
            eval( 'size = ( size' + toEval + ' );' );

         if(dec > 0)
         {
            var moltdiv = '(';
            while(dec > 0)
            {
               moltdiv += '10*';
               dec--;
            }
            moltdiv = moltdiv.substr(0, (moltdiv.length - 1)) + ')';
            eval( 'size = Math.round(size * ' + moltdiv + ') / ' + moltdiv + ';' );
         }
         return size + ' ' + type[times];
      }

      function __readFileSize()
      {
         __filemonitor.load(phpFile);
      }

      this.start = start;

      var __counter = 0;
      var __fileloaderInterval = 0;
      var __maybesomethingwrong = 0;
      var __filemonitor = new LoadVars();

      __filemonitor.onLoad = function(s) {
         if(s && this.filesize && this.filesize != 'undefined')
         {
            document.getElementById('progress_block_no').style.visibility="hidden";
	    
            document.getElementById('progress_block').style.visibility="visible";
	     document.getElementById('progress_block').style.display="block";
            document.getElementById('progress_recieved').innerHTML=__fSize(this.filesize);
            document.getElementById('progress_total').innerHTML=__fSize(this.totalsize);
            document.getElementById('progress_percent').innerHTML=this.percent;
            document.getElementById('progress_kbpersec').innerHTML=__fSize(this.speed);
            document.getElementById('progress_minutes').innerHTML=this.eta;

            //document.frm_upload.filehost.value="فضلا انتظر...";
            //document.frm_upload.filehost.disabled=true;

            var __percent=(this.percent/100*400);

            __moveIt(__counter,__percent,500);
            __counter = __percent;
         }
         else if(this.filesize && this.filesize == 'undefined')
         {
            document.getElementById('progress_block_no').style.visibility="visible";
            document.getElementById('progress_block').style.visibility="hidden";
	    document.getElementById('progress_block').style.display="none";

            //document.frm_upload.filehost.value="تحميل الملف";
            //document.frm_upload.filehost.disabled=false;

            __percent = 0;
            __counter = 0;

            if(__maybesomethingwrong++ > 10)
               __fileloaderInterval = 0;
         }
         else
            __fileloaderInterval = 0;

         delete this.filesize;

         if(__fileloaderInterval != 0)
            __fileloaderInterval = setTimeout(__readFileSize, latency);
      }

      if(!latency || latency < 50)
         latency = 1000;
   }

   function __moveIt(j,l,h)
   {
      var c=15;

      if(h<=c)
         document.getElementById('progress_img').width=l;
      else
      {
         k=l-j;
         move=Math.round(k/h*c);
         if(move<1&&k>0)
            move==3;
         e=j+move;
         document.getElementById('progress_img').width=e;
         setTimeout("__moveIt("+e+", "+l+", "+(h-c)+")",c);
      }
   }
