function scrub(s) {
  if (s == null) return s;
  s = s + "";
  return(
     s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/\"/g, "&quot;").replace(/'/g, "&apos;")
  );
}

// javascript function calls from the applet are queued
// as an array of objects.  The first element of each
// queued array is the name of the javascript function
// to call.  Any other array elements are arguments for
// that function.  When there are no function calls
// queued in the applet, the applet returns null and this
// function will wait 500ms before polling again for a
// function call.  This is a hackish workaround to a
// problem with LiveConnect, mozilla, and J2SE 5.0 that
// seems to prevent direct function calls from Java.
function functionLoop() {
  while ((task = applet().nextFunctionCall()) != null) {
    try {
	    if (task.getName() == "eval") {
	      eval(task.argv(0));
	    } else if (task.getName() == "alert") {
	      alert(task.argv(0));
	    } else if (task.getName() == "newShareAvailable") {
	      newShareAvailable(task.argv(0));
	    } else if (task.getName() == "shareUpdated") {
	      shareUpdated(task.argv(0));
	    } else if (task.getName() == "shareRemoved") {
	      shareRemoved(task.argv(0));
	    } else if (task.getName() == "downloadStarted") {
	      downloadStarted(task.argv(0));
	    } else if (task.getName() == "downloadProgress") {
	      downloadProgress(task.argv(0));
	    } else if (task.getName() == "downloadFinished") {
	      downloadFinished(task.argv(0));
	    } else if (task.getName() == "fatal") {
	      fatal(task.argv(0));
	    } else {
	      alert("Unknown function: " + task.getName());
	    }
    } catch (e) {
    	errAlert(e);
    }
  }
  
  setTimeout(functionLoop, 500);
}

function errAlert(e) {
  alert(e);
}

function fatal(msg) {
  var newdiv = document.createElement('div');
  newdiv.className = "share error tall";
  newdiv.innerHTML = msg;
  
  var sharelist = getElement('sharelist');
  sharelist.insertBefore(newdiv, getElement('formdiv').nextSibling);

  hideElement('firewalldiv');
}

// queries the share applet every 500ms to see if it's
// ready before beginning the real work
function startWhenReady() {
  var appletReady = false;

  try {
    appletReady = applet().isReady()
  } catch (errobj) {}
  if (!appletReady) {
     setTimeout(startWhenReady, 500);
     return;
  }
  
  hideElement('messagediv');
  showElement('shareapp');
  functionLoop();  
}

// used for debugging.  prepends a message
// to messagediv
function prependMessage(msg) {
  var div = document.getElementById('messagediv');
  div.innerHTML = msg + "<br/>" + div.innerHTML;
}

function getShareID(shareInfo) {
  return ("share_" + scrub(shareInfo.getString("id")));
}

function getShareURL(shareInfo) {
  return "http://" 
         + escape(shareInfo.getString("sender"))
         + ":7564/"
         + escape(shareInfo.getString("id"))
         + "/"
         + escape(shareInfo.getString("filename"));
}

function addGrayBox() {
  var newdiv = document.createElement('div');
  newdiv.className = "share placeholder";
  getElement('sharelist').appendChild(newdiv);
}

function newShareAvailable(shareInfo) {
  var username = scrub(shareInfo.getString("user"));
  var footer = "from " + ((username != null) ? username : scrub(shareInfo.getString("sender")));

  if (shareInfo.isMine()) {

    footer = "<a href='javascript:void(0)' onclick=\"cancelShare('"
                     + scrub(shareInfo.getString("id"))
                     + "')\">Stop Sharing</a>"
  }

  var sharelist = getElement('sharelist');
  
  var newdiv = document.createElement('div');

  newdiv.setAttribute('id', getShareID(shareInfo));
  newdiv.innerHTML = "<img id='icon_" + getShareID(shareInfo) + "' src='/nsicons/" + escape(shareInfo.getExtension()) + ".png'/>"
                     + "<div class='filenameinfo'>"
                     + "<a href='" + getShareURL(shareInfo) + "'>" 
                       + scrub(shareInfo.getString("filename"))
                       + "</a><br/>"
                       + shareInfo.formatHR(shareInfo.getLong("size"))
                     + "</div>"
                     + "<div class='remaining half small' id='remaining_" + getShareID(shareInfo) + "'></div>"
        			 + "<div class='footer half small'>"
                     + footer
                     + "</div>"
  if (shareInfo.isMine()) {
    newdiv.className="share mine";
  } else {
    newdiv.className="share";
  }

  var fwdiv = getElement('firewalldiv');
  if (fwdiv) {
    sharelist.removeChild(getElement('firewalldiv'));
  }

  sharelist.insertBefore(newdiv, getElement('formdiv').nextSibling);
  fnFixPng(getElement('icon_' + getShareID(shareInfo)));

  shareUpdated(shareInfo);

}

function shareUpdated(shareInfo) {
  
  if (shareInfo.isOld()) {
    getElement(getShareID(shareInfo)).className = "share expiring";
  }
  var remainingDiv = getElement("remaining_" + getShareID(shareInfo));
  
  if (remainingDiv) {
    var offered = shareInfo.getLong("offered", -1);
    if (offered >= 0) {
      var downloaded = shareInfo.getLong("downloaded", 0);
      var inprogress = shareInfo.getLong("inprogress", 0);
//      alert((offered - (downloaded + inprogress)) + "/" + offered + " remaining");
      remainingDiv.innerHTML = (offered - (downloaded + inprogress)) + "/" + offered + " remaining";
    }
//  } else {
//    alert("no remainingdiv");
  }
}

function removeShareSpan(shareSpanID) {
  var shareSpan = getElement(shareSpanID);
  getElement('sharelist').removeChild(shareSpan);
}

function shareRemoved(shareInfo) {
  shareUpdated(shareInfo);
  var shareSpanID = getShareID(shareInfo);
  getElement(shareSpanID).className = "share gone";
  setTimeout("removeShareSpan('" + shareSpanID + "')", 7000);
}

function downloadStarted(progressInfo) {
//  prependMessage("Download of " + progressInfo.getProperty("shareid") + " by " + progressInfo.getProperty("client") + " started.");
}

function downloadProgress(progressInfo) {
//  prependMessage(progressInfo.getProperty("client") + " has received " + progressInfo.getProperty("sent") + " of " + progressInfo.getProperty("length") + " bytes.");
}

function downloadFinished(progressInfo) {
//  prependMessage("Download of " + progressInfo.getProperty("shareid") + " by " + progressInfo.getProperty("client") + " finished.");
}

function cancelShare(shareID) {
  try {
    applet().cancelShare(shareID);
  } catch (errobj) {
    errAlert(errobj);
  }
  return false;
}

function share() {
  try {
    var sf = getElement('shareform');
    var username = sf.username.value;
    var cnt = sf.maxshares.options[sf.maxshares.selectedIndex].value * 1;
    applet().share(sf.file.value, username, cnt);
    sf.reset();
    sf.username.value = username;
    createCookie("name", username, 365);
    filechanged();
  } catch (errobj) {
    errAlert(errobj);
  }
}

function getElement(elementID) {
  if (document.getElementById)  {
    return document.getElementById(elementID);
  } else if (document.all) {
    return document.all[elementID];
  } else if (document.layers) {
    return document.layers[elementID];
  }
  return null;
}

function hideElement(elementID) {
  getElement(elementID).style.display = "none";
}

function showElement(elementID) {
  getElement(elementID).style.display = "block";
}

function applet() {
  return (getElement('shareapplet'));
}

var isMSIE = (navigator.appName.search(/microsoft/i) == 0);

function fnFixPng(img) {
  if (isMSIE) {
	var src = img.src;
	img.style.width = img.width + "px";
	img.style.height = img.height + "px";
	img.src="nsicons/blank.gif";
	img.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "', sizingMethod='scale')"
  }
}


var helpVisible = ("Y" == readCookie("hidehelp"));

function toggleHelp() {
  helpVisible = !helpVisible;
  if (helpVisible) {
    showElement("help");
    getElement("helptoggle").innerHTML = "Hide Intro";
    createCookie("hidehelp", "", -1);
  } else {
    hideElement("help");
////    getElement("toplegend").style.visibility = "visible";
//    getElement("toplegend").style.display = "inline";
////    showElement("toplegend");
//    hideElement("bottomlegend");
    getElement("helptoggle").innerHTML = "Show Intro";
    createCookie("hidehelp", "Y", 365);
  }
}

function filechanged() {
  var sf = getElement('shareform');
  sf.sharebutton.disabled = /^\s*$/.test(sf.file.value);
}

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++)
	{
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function start() {
  if (!window.navigator.javaEnabled()) {
    showElement('nojava');
  }
  toggleHelp();
  setTimeout('startWhenReady()', 0);

  var name = readCookie("name");
  if (name != null) getElement('shareform').username.value = name;
  
  for (i = 0; i < 17; ++i) addGrayBox();
  
  filechanged();
}

