/*
     A simple class for displaying file information and progress
     Note: This is a demonstration only and not part of SWFUpload.
     Note: Some have had problems adapting this class in IE7. It may not be suitable for your application.
*/

// Constructor
// file is a SWFUpload file object
// targetID is the HTML element id attribute that the FileProgress HTML structure will be added to.
// Instantiating a new FileProgress object with an existing file will reuse/update the existing DOM elements
function FileProgress(file, targetID) {
     this.fileProgressID = file.id;

     this.opacity = 100;
     this.height = 0;


     this.fileProgressWrapper = document.getElementById(this.fileProgressID);
     if (!this.fileProgressWrapper) {
          this.fileProgressWrapper = document.createElement("div");
          this.fileProgressWrapper.className = "progressWrapper";
          this.fileProgressWrapper.id = this.fileProgressID;

          this.fileProgressElement = document.createElement("div");
          this.fileProgressElement.className = "progressContainer";

          var progressCancel = document.createElement("a");
          progressCancel.className = "progressCancel";
          progressCancel.href = "#";
          progressCancel.style.visibility = "hidden";
          progressCancel.appendChild(document.createTextNode(" "));

          var progressText = document.createElement("div");
          progressText.className = "progressName";
          progressText.appendChild(document.createTextNode(file.name));

          var progressBar = document.createElement("div");
          progressBar.className = "progressBarInProgress";

          var progressStatus = document.createElement("div");
          progressStatus.className = "progressBarStatus";
          progressStatus.innerHTML = "&nbsp;";

          this.fileProgressElement.appendChild(progressCancel);
          this.fileProgressElement.appendChild(progressText);
          this.fileProgressElement.appendChild(progressStatus);
          this.fileProgressElement.appendChild(progressBar);

          this.fileProgressWrapper.appendChild(this.fileProgressElement);

          document.getElementById(targetID).appendChild(this.fileProgressWrapper);
     } else {
          this.fileProgressElement = this.fileProgressWrapper.firstChild;
          this.reset();
     }

     this.height = this.fileProgressWrapper.offsetHeight;
     this.setTimer(null);


}

FileProgress.prototype.setTimer = function (timer) {
     this.fileProgressElement["FP_TIMER"] = timer;
};
FileProgress.prototype.getTimer = function (timer) {
     return this.fileProgressElement["FP_TIMER"] || null;
};

FileProgress.prototype.reset = function () {
     this.fileProgressElement.className = "progressContainer";

     this.fileProgressElement.childNodes[2].innerHTML = "&nbsp;";
     this.fileProgressElement.childNodes[2].className = "progressBarStatus";

     this.fileProgressElement.childNodes[3].className = "progressBarInProgress";
     this.fileProgressElement.childNodes[3].style.width = "0%";

     this.appear();
};

FileProgress.prototype.setProgress = function (percentage) {
     this.fileProgressElement.className = "progressContainer green";
     this.fileProgressElement.childNodes[3].className = "progressBarInProgress";
     this.fileProgressElement.childNodes[3].style.width = percentage + "%";

     this.appear();
};
FileProgress.prototype.setComplete = function () {
     this.fileProgressElement.className = "progressContainer blue";
     this.fileProgressElement.childNodes[3].className = "progressBarComplete";
     this.fileProgressElement.childNodes[3].style.width = "";

     var oSelf = this;
     this.setTimer(setTimeout(function () {
          oSelf.disappear();
     }, 10000));
};
FileProgress.prototype.setError = function () {
     this.fileProgressElement.className = "progressContainer red";
     this.fileProgressElement.childNodes[3].className = "progressBarError";
     this.fileProgressElement.childNodes[3].style.width = "";

     var oSelf = this;
     this.setTimer(setTimeout(function () {
          oSelf.disappear();
     }, 5000));
};
FileProgress.prototype.setCancelled = function () {
     this.fileProgressElement.className = "progressContainer";
     this.fileProgressElement.childNodes[3].className = "progressBarError";
     this.fileProgressElement.childNodes[3].style.width = "";

     var oSelf = this;
     this.setTimer(setTimeout(function () {
          oSelf.disappear();
     }, 2000));
};
FileProgress.prototype.setStatus = function (status) {
     this.fileProgressElement.childNodes[2].innerHTML = status;
};

// Show/Hide the cancel button
FileProgress.prototype.toggleCancel = function (show, swfUploadInstance) {
     this.fileProgressElement.childNodes[0].style.visibility = show ? "visible" : "hidden";
     if (swfUploadInstance) {
          var fileID = this.fileProgressID;
          this.fileProgressElement.childNodes[0].onclick = function () {
               swfUploadInstance.cancelUpload(fileID);
               return false;
          };
     }
};

FileProgress.prototype.appear = function () {
     if (this.getTimer() !== null) {
          clearTimeout(this.getTimer());
          this.setTimer(null);
     }

     if (this.fileProgressWrapper.filters) {
          try {
               this.fileProgressWrapper.filters.item("DXImageTransform.Microsoft.Alpha").opacity = 100;
          } catch (e) {
               // If it is not set initially, the browser will throw an error.  This will set it if it is not set yet.
               this.fileProgressWrapper.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=100)";
          }
     } else {
          this.fileProgressWrapper.style.opacity = 1;
     }

     this.fileProgressWrapper.style.height = "";

     this.height = this.fileProgressWrapper.offsetHeight;
     this.opacity = 100;
     this.fileProgressWrapper.style.display = "";

};

// Fades out and clips away the FileProgress box.
FileProgress.prototype.disappear = function () {

     var reduceOpacityBy = 15;
     var reduceHeightBy = 4;
     var rate = 30; // 15 fps

     if (this.opacity > 0) {
          this.opacity -= reduceOpacityBy;
          if (this.opacity < 0) {
               this.opacity = 0;
          }

          if (this.fileProgressWrapper.filters) {
               try {
                    this.fileProgressWrapper.filters.item("DXImageTransform.Microsoft.Alpha").opacity = this.opacity;
               } catch (e) {
                    // If it is not set initially, the browser will throw an error.  This will set it if it is not set yet.
                    this.fileProgressWrapper.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=" + this.opacity + ")";
               }
          } else {
               this.fileProgressWrapper.style.opacity = this.opacity / 100;
          }
     }

     if (this.height > 0) {
          this.height -= reduceHeightBy;
          if (this.height < 0) {
               this.height = 0;
          }

          this.fileProgressWrapper.style.height = this.height + "px";
     }

     if (this.height > 0 || this.opacity > 0) {
          var oSelf = this;
          this.setTimer(setTimeout(function () {
               oSelf.disappear();
          }, rate));
     } else {
          this.fileProgressWrapper.style.display = "none";
          this.setTimer(null);
     }
};
