if (Array.prototype.slice==null) Array.prototype.slice=function(start,end){
   if (start<0) start=this.length+start; //'this' refers to the object to which the prototype is applied
   if (end==null) end=this.length;
   else if (end<0) end=this.length+end;
   var newArray=[];
   for (var ct=0,i=start;i<end;i++) newArray[ct++]=this[i];
   return newArray;
}

if (Array.prototype.splice && typeof([0].splice(0))=="number") Array.prototype.splice = null;
if (!Array.prototype.splice) Array.prototype.splice = function(ind,cnt){
   var len = this.length;
   var arglen = arguments.length;
   if (arglen==0) return ind;
   if (typeof(ind)!= "number") ind = 0;
   else if (ind<0) ind = Math.max(0,len+ind);
   if (ind>len){
      if(arglen>2) ind=len;
      else return [];
   }
   if (arglen<2) cnt = len-ind;
   cnt = (typeof(cnt)=="number") ? Math.max(0,cnt) : 0;
   var removeArray = this.slice(ind,ind+cnt);
   var endArray = this.slice(ind+cnt);
   len = this.length = ind;
   for (var i=2;i<arglen;i++) this[len++] = arguments[i];
   for (var i=0,endlen=endArray.length;i<endlen;i++) this[len++] = endArray[i];
   return removeArray;
}


// If indexOf isn't implemented (ie in IE), implement it
if(!Array.indexOf){
  Array.prototype.indexOf = function(obj){
    for(var i=0; i<this.length; i++){
      if(this[i]==obj){
        return i;
      }
    }
    return -1;
  };
}


function htmlentities( s ){
    var div = document.createElement('div');
    var text = document.createTextNode(s);
    div.appendChild(text);
    return div.innerHTML;
}

function encodeHtml( str )
{
  return str.replace(/&/g, "&amp;").replace(/\"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
}

function javascriptPause(seconds){
  setTimeout("function(){ var i = 1; }", seconds*1000);
  return true;
}

function matcher(s, valid_chars) {
  var allValid = true;
  var ch = '';
  for (i = 0;  i < s.length;  i++) {
    ch = s.charAt(i);
    for (j = 0;  j < valid_chars.length;  j++)
      if (ch == valid_chars.charAt(j))
	break;
    if (j == valid_chars.length) {
      allValid = false;
      break;
    }
  }
  if (s.match("--")){
    allValid = false;
  }
  return allValid;
}

function isValidEmail(s){
  var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
  if (filter.test(s)) {
    return true;
  }
  else {
    return false;
  }
}

function isAlphaNumeric(s) {
  var valid_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-+";
  return matcher(s, valid_chars);
}

function isNumeric(s) {
  var valid_chars = "0123456789";
  return matcher(s, valid_chars);
}

function isAlphanumericWithSpaces(s) {
  var valid_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-+ ";
  return matcher(s, valid_chars);
}


function go(url){
  window.location=url;
}

function fadeGlobalMessages() {
  var elementId;
  elementId = 'GlobalMessages';
  $("div#"+elementId).show();
  //$("div#"+elementId).fadeTo(10, 0.9);
  /*
  tmp = $('div#GlobalMessagesText').html();
  if ( tmp != null && tmp != '' ) {
    replaceFade('tophrText', 'GlobalMessages', 1000, 4000, 1000, function() {$('div#GlobalMessagesText').empty()});
  }
  */
}

function fadeMessages(divId) {
  if ( $('div#' + divId).html() != '' ) {
    fullFade( divId, 800, 3600, 800, eval("function() {$('div#" + divId + "').empty()}") );
  }
}

function confirmLink(msg, url){
  if(confirm(msg))
    location.href = url;
}

/**
 * Convert "newline" (nl) (e.g. '\n') into a <br /> tag.
 * @param myString  a string containing newlines
 * @return  the same string containing <br />s instead.
 */
function nl2br(myString)
{
  var regXString = "\\n"
  var regX = new RegExp(regXString, "g");
  var replaceString = "<br \/>";
  return myString.replace(regX, replaceString);
}

/**
 * Escape a single '
 * @param myString  a string containing newlines
 * @return  the same string with ' escaped
 */
function escapeSingleQuote (myString)
{
  var regXString = "\'";
  var regX = new RegExp(regXString, "gi");
  var replaceString = "\\'";
  return myString.replace(regX, replaceString);
}

/**
 * Escape a \r
 * @param myString  a string containing newlines
 * @return  the same string with ' escaped
 */
function escapeSlashR (myString)
{
  var regXString = "\r";
  var regX = new RegExp(regXString, "gi");
  var replaceString = "";
  return myString.replace(regX, replaceString);
}

function isArray(obj) {
   if (obj.constructor.toString().indexOf("Array") == -1)
      return false;
   else
      return true;
}

function getFormInnerXML( xmlWriter, formIds ) {

  if ( !isArray(formIds) ) {
    formElement = document.getElementById(formIds);
  	if ( !getSingleFormXML(xmlWriter, formElement) ) return false;
  }
  else {
    for ( index=0; index<formIds.length; index++ ) {
      xmlWriter.BeginNode( formIds[index] );

  		formElement = document.getElementById(formIds[index]);

  		if ( !getSingleFormXML( xmlWriter, formElement ) ) {
  		  return false;
  		}

  		xmlWriter.EndNode();
    }
  }

  return true;
}

/**
 * Convert several form's fields into XML format.
 * Each element becomes an XML node with the name as the tag name
 * and the value as the contents of the tag.
 * If there are multiple forms to convert to XML, then each form's elements
 * are wrapped in a tag with the form's id as its name.
 * Everything is wrapped in a tag named "formElements"
 * @param formIds (array||string) the id(s) of form element(s) in the HTML
 * @return  A string containing the XML. False if an error is encountered.
 */
function getFormXml( formIds ) {
  xmlWriter = new XMLWriter();
  xmlWriter.BeginNode('formElements');

  getFormInnerXML( xmlWriter, formIds );

  xmlWriter.EndNode();
  return xmlWriter.ToString();
}

/**
 * Convert a form's field into XML.
 * @param xmlWriter (XMLWriter) the XML writer to write to
 * @param divId (string) the desired form's parent-div's id
 * @param formName (string) the name of the form to XML-ify
 * @param true if successful
 */
function getFormXMLByDiv( xmlWriter, divId, formName ) {
  var formElement = document.getElementById(divId);

  // check that the element exists
  if (formElement) {

    var forms = formElement.getElementsByTagName('form');
    for ( var i = 0; i < forms.length; ++i ) {

      if ( $(forms[i]).attr("name") == formName ) {
   	return getSingleFormXML( xmlWriter, forms[i] );
      }
    }
  }
}

/***
 * Strip HTML (for forums so far)
 */
function stripHTML(oldString) {

   var newString = "";
   var inTag = false;
   for(var i = 0; i < oldString.length; i++) {

        if(oldString.charAt(i) == '<') inTag = true;
        if(oldString.charAt(i) == '>') {
              inTag = false;
              i++;
        }

        if(!inTag) newString += oldString.charAt(i);

   }

   return newString;
}

/**
 * Convert a form's fields into XML format.
 * Each element becomes an XML node with the name as the tag name
 * and the value as the contents of the tag.
 * @param xml (XMLWriter) used to write the xml to. It's okay if there's nothing written
 * 	to it already. Its main use is to allow the caller wrap this functions output in tags.
 * @param formElement the form element in the HTML you wnat XML-ified
 * @return False if the specified form doesn't exist, otherwise true.
 */
function getSingleFormXML( xml, formElement ) {

	if( !formElement ) {
	  return false;
  }

	for( var elementNum = 0; elementNum < formElement.elements.length; elementNum++ ) {
    var thisElement = formElement.elements[elementNum];
//alert(thisElement.name + " aa " + thisElement.value);
    if( !thisElement.name || !thisElement.type ) continue;
    if( thisElement.type == 'hidden' || thisElement.type == 'text' || thisElement.type == 'password'
        || thisElement.type == 'textarea' || (thisElement.type == 'radio' && thisElement.checked == true) ) {
      xml.BeginNode(thisElement.name);

      xml.WriteString(thisElement.value);
      xml.EndNode();
    }
    if( thisElement.type == 'checkbox' ) {
      xml.BeginNode(thisElement.name);
      if (thisElement.checked == true) { xml.WriteString('true'); }
      else { xml.WriteString('false'); }
      xml.EndNode();
    }
    if( thisElement.type == 'select-one' ) {
      xml.BeginNode(thisElement.name);

      if ( thisElement.selectedIndex != -1 ) {
        xml.WriteString(thisElement.options[thisElement.selectedIndex].value);
      }
      xml.EndNode();
    }

    if ( thisElement.type == 'select-multiple' ){
      xml.BeginNode(thisElement.name);

      if ( thisElement.selectedIndex != -1 ) {
        var numAdded = 0;
        for ( var i = 0; i < thisElement.options.length; ++i ){

          if ( thisElement.options[i].selected == true ) {
            if ( numAdded > 0 ) {
              xml.WriteString( "," );
            }

            xml.WriteString( thisElement.options[i].value );

            numAdded++;
          }

        }// end for
      }

      xml.EndNode();
    }

  }
  return true;
}


function setOrToggleVisibility(element, visible)
{
  var domElement = document.getElementById(element);
  if (!(domElement)) return;
  if (visible == true) {
    domElement.style.display = '';
  } else if (visible == false) {
    domElement.style.display = 'none';
  } else {
    if (domElement.style.display == 'none') {
      domElement.style.display = '';
    } else {
      domElement.style.display = 'none';
    }
  }
}

function setOrToggleVisible(element, visible)
{
  var domElement = document.getElementById(element);
  if (domElement.style.display == 'none' && (visible == true || visible == undefined)) {
    domElement.style.display = '';
    return true;
  } else if(domElement.style.display == ''  && (visible == false || visible == undefined)) {
    domElement.style.display = 'none';
  }
  return false;
}


function setOrToggleSlide(element, visible)
{
  var domElement = document.getElementById(element);
  if (visible == true) {
		$( 'div#'+element ).hide( 700 );
  } else if (visible == false) {
		$( 'div#'+element ).show( 700 );
  } else {
    if (domElement.style.display == 'none') {
	 		$( 'div#'+element ).show( 700 );
    } else {
			$( 'div#'+element ).hide( 700 );
    }
  }
}

function getSelectedText()
{
  var txt = '';
  if (window.getSelection) {
    txt = window.getSelection();
  } else if (document.getSelection) {
    txt = document.getSelection();
    } else if (document.selection) {
      txt = document.selection.createRange().text;
    } else return;
  return txt;
}

var elementsInAnimation = new Array(0);
// uniqueId is a variable for recursion -- don't set it to anything (it won't matter if you do anyway)
function fullFade(elementId, inTime, waitTime, outTime, functionToRun, uniqueId ) {
  pass = false;

  if ( elementsInAnimation.indexOf(elementId) != -1 ) {
    elementsInAnimation[elementId] = '*';
    pass = true;
  }
  else {
    if ( inTime != 0 ) {
      elementsInAnimation[elementId] += '*';
      pass = true;
    }
    else if ( elementsInAnimation[elementId] == uniqueId ) {
      pass = true;
    }
  }

  if ( pass ) {
    if ( inTime != 0 ) {
      $("div#"+elementId).css("overflow", "hidden");
      $("div#"+elementId).show(inTime);
      setTimeout("fullFade('" + elementId + "', 0, 0, " + outTime + ", " + functionToRun + ", '" + elementsInAnimation[elementId] + "')", waitTime);
    }
    else if ( outTime != 0 ) {
      $("div#"+elementId).fadeTo(outTime/2, 0.1);
      $("div#"+elementId).slideUp(outTime/2, functionToRun);
      elementsInAnimation.splice(elementsInAnimation.indexOf(elementId));
    }
  }
}

function replaceFade(origElementId, newElementId, inTime, waitTime, outTime, functionToRun ){

  if ( elementsInAnimation.indexOf(newElementId) == -1 ) {
    elementsInAnimation[newElementId] = '*';
  }
  else {
    elementsInAnimation[newElementId] += '*';
  }

  uniqueId = elementsInAnimation[newElementId];

  if ( inTime != 0 ) {
    if ( $("div#"+origElementId).css("opacity") != 0 && $("div#"+origElementId).css("display") != 'none' ) {
      $("div#"+origElementId).fadeOut(inTime/2);
    }
    if ( $("div#"+newElementId).css("opacity") != 0 && $("div#"+newElementId).css("display") != 'none' ) {
      $("div#"+newElementId).fadeOut(inTime/2);
    }

    eval( "setTimeout( function() { if ( elementsInAnimation['"+newElementId+"'] == '"+uniqueId+"' ) { $(\"div#"+newElementId+"\").fadeIn(" + (inTime/2) + "); } }, " + (inTime/2)  + ")" );
    eval( "setTimeout( function() { if ( elementsInAnimation['"+newElementId+"'] == '"+uniqueId+"' ) { replaceFade('" + origElementId + "', '" + newElementId + "', 0, 0, " + outTime + ", " + functionToRun + ", '" + elementsInAnimation[newElementId] + "'); } }, " + (inTime + waitTime) + ")" );
  }
  else if ( outTime != 0 ) {
    $("div#"+newElementId).fadeOut(outTime/2);
    eval( "setTimeout( function() { if ( elementsInAnimation['"+newElementId+"'] == '"+uniqueId+"' ) { $(\"div#"+origElementId+"\").fadeIn(" + (outTime/2) + ", " + functionToRun + "); elementsInAnimation['"+newElementId+"'] = ''; } }, " + (outTime/2) + ")" );
  }
}


var hex = 255;
function fadeText(elementId)
{

  if (hex > 0) {
    hex -= 11;
    element = document.getElementById(elementId)
    if ( element != null ) {
      element.style.color = "rgb("+hex+","+hex+","+hex+")";
      setTimeout("fadeText('" + elementId + "')", 20);
    }
  } else {
    hex = 255;
  }
}

function unfadeText(elementId)
{

  if (hex < 255) {
    hex += 11;
    element = document.getElementById(elementId)
    if ( element != null ) {
      element.style.color = "rgb("+hex+","+hex+","+hex+")";
      setTimeout("fadeText('" + elementId + "')", 21);
    }
  } else {
    hex = 0;
  }
}

function countLines(countField)
{
  var area = countField;
  var text = area.value.replace(/\s+$/g,"") ;
  var numLines;
  var split = text.split("\n");

  numLines = split.length;

  for(var i=0;i<split.length;i++) {
    text = split[i];
    numLines += Math.floor(text.length / 80);
  }

  return numLines;
}

function limitText(limitField, limitNum) {

	limitField.rows = countLines(limitField) + 2;

	if (limitField.value.length > limitNum) {
		alert("You can type a maximum of " + limitNum + " characters in this box.");
    limitField.value = limitField.value.substring(0, limitNum);
	}
}

//
// Functions for module-specific javascript
//
// To use this system, take your action name (e.g. login).
// The onclick handler should just be the name.
// The form should be nameForm.
// The messages div should be nameMessages
// The action on the php side should just be the name.
//
// With those naming conventions everthing will work automatically
// and you only need to write 3 lines of code
// (see the javascript for login() )
//



// this is the new send function, for the time being.
// the problem with the old one is that it uses global variables psModule and psFolder, which get
// overwritten if we include multiple javascript files on a single page. (i.e. events.js and newsPane.js needed on the same page)
function sendJasonIsAwesome(myAction, actionIndex, extraForms, module, folder, divsToRefresh, async) {

  if (self.psModule) { var moduleBackup = psModule; } else { var moduleBackup = '';}
  if (self.psFolder) { var folderBackup = psFolder; } else { var folderBackup = '';}
  //var folderBackup = psFolder;

  psModule = module;
  psFolder = folder;

  // do the send, now that we have setup our global variables correctly
  send(myAction, actionIndex, extraForms, divsToRefresh, async);

  // set back to original values
  psModule = moduleBackup;
  psFolder = folderBackup;

}

/**
 * Send an action message to the PHP side.
 * This would be the last thing you call.
 * Then PHP will call back the handler.
 * @param myAction  The name of your action, which should be the same in js and PHP
 * @param actionIndex  Optional - use only when you have multiple forms for the same action
                       (on different items).
 * @param extraForms (array) Optional - An array of form ids that you wish to XML-ify and send
 * @param divsToRefresh (array) Optional -
 * 	with the XHR object to the server.
 */
function send( myAction, actionIndex, extraForms, divsToRefresh, async ) {
	var formIds;
  var blockUI = false;
  
  cursorBusy(true);

  xmlWriter = new XMLWriter();

	xmlWriter.BeginNode( "XML" );

  if ( actionIndex === undefined ) { actionIndex = ''; }
  if ( extraForms === undefined ) {
  	formIds = myAction + 'Form' + actionIndex;
    var thisForm = $( 'form#' + formIds ).get(0);
    if (thisForm) {
      try{
        if (thisForm.blockUIOnAjax) {
          blockUI = true;
        }
      } catch (e){}
    }
  } else {
    formIds = (new Array(myAction + 'Form' + actionIndex)).concat(extraForms);
    var mainForm = $( myAction + 'Form' + actionIndex ).get(0);
    if (mainForm) {
      try{
        if (mainForm.blockUIOnAjax)
          blockUI = true;
        } catch (e){}
    }
  }

  // Build XML for specified form elements
  xmlWriter.BeginNode( "formElements" );
  if ( !getFormInnerXML(xmlWriter, formIds) ) {
		//since clonefish adds the actionIndex before the "Form" string I am adding a check for that-bouba
		//alert("here: "+ formIds);
	if ( extraForms === undefined ) {

  	  formIds = myAction  + actionIndex + 'Form';
    } else {
      formIds = (new Array(myAction  + actionIndex + 'Form')).concat(extraForms);
    }

		if ( !getFormInnerXML( xmlWriter, formIds ) ) return false;
	}
  xmlWriter.EndNode();

  // Build XML for div refreshes
  xmlWriter.BeginNode( "REFRESH" );
  divRefresher = new DivRefresher();
  if ( !divRefresher.buildXMLForDivRefresh( xmlWriter, divsToRefresh ) ) return false;
  xmlWriter.EndNode();


  if (typeof window['delayHandling'] !== 'undefined' && delayHandling) {
    handle = this.delayHandler;
  }
  else
    handle = this.handler;
  var xhr = new XHRObject( requestURL(myAction), handle);

	xmlWriter.EndNode();

  if( blockUI ) $.blockUI();
  xhr.request( xmlWriter.ToString(), 'POST', async );
}

/**
 * Constuct the right URL to get to the PHP side.
 * The js and PHP action names have to be the same
 * (and the form name and message div id too).
 */
function requestURL( myAction ) {
  var completeModule = psModule + '/';
  if( psModule == '' ) { completeModule = ''; }
  if ( psFolder != '' )
    return '/' + psFolder + '/' + completeModule + '?action=ajax&ajaxAction=' + myAction;
  else
    return '/?action=ajax&ajaxAction='+myAction;
}

function setMessage( myAction, msg, urgent ) {
  // if (document.getElementById( myAction + 'Messages')) {
   // document.getElementById( myAction + 'Messages').innerHTML = msg;
    if ($("#"+myAction+"Messages")) {
      $("#"+myAction+"Messages").html(msg);


    if ( urgent ) {
      $("#" + myAction + "Messages").css('color', 'red');
    } else {
      $("#" + myAction + "Messages").css('color', 'black');
    }
  }
}

this.persistAjaxHandler = function(text, status, xml) {
  this.handler(text, status, xml);

  persistAjax();
}

function cursorBusy(busy){
  if(busy){
    $('#uber').addClass("progress");
  } else {
    $('#uber').removeClass("progress");
  }

}

ajResCatch = null;
this.delayHandler = function(text, status, xml) {
//  alert('in delay ahndler')
  ajResCatch = new Handler(text, status, xml);
};

function Handler(text, status, xml) {
  var _text = text;
  var _status = status;
  var _xml = xml;

  this.run = function()
  {
    defaultHandler(_text, _status, _xml);
  };
}


/**
 * Callback function called by PHP code.
 * The important parameter is xml, which contains XML
 * that must include the tags:
 * <success>(true/false)</success> - did it work, and
 * <action>string</action> - the name of the action that you called
 *
 * Additional possible XML tags are:
 *   - <message>string</message> - display the message
 *   - <delete>id</delete> - causes this to delete an element by ID from the DOM
 *   - <reload>true</reload> - reload the current page (omit if you don't want to reload)
 *   - <redirect>URL</redirect> - redirect to the given URL
 *   - <notify>string</notify> - display a notification in a highlighted way
 *   - <evaluate>string</evaluate> - run the javascript inside
 *
 * You must have appropriately named forms, divs, etc. for this to work (see above)
 */
this.defaultHandler = function(text, status, xml) {
  cursorBusy(false);
  var action = xml.getElementsByTagName('action')[0].firstChild.nodeValue;
  var success = xml.getElementsByTagName('success')[0].firstChild.nodeValue;
  // the rest of the tags are optional
  if( xml.getElementsByTagName('reload')[0]
      && xml.getElementsByTagName('reload')[0].firstChild.nodeValue == 'true' ) {
    handleReload(xml);
    return;
  }
   
  if( xml.getElementsByTagName('swaps')[0] ) { handleSwaps(xml); }
  if( xml.getElementsByTagName('redirect')[0] ) {
   handleRedirect(xml);
   if ( xml.getElementsByTagName('evaluate')[0] ) { handleEvaluate(xml); } return;
  }
  if (xml.getElementsByTagName('loadHandId')[0]) { handleLoadHand(xml); }
  if( xml.getElementsByTagName('delete')[0] ) { handleDelete(xml); }
  if( xml.getElementsByTagName('notify')[0] ) { handleNotify(xml); }
  
  if( xml.getElementsByTagName('replaces')[0] ) { handleReplaces(xml); }
  if( xml.getElementsByTagName('deletes')[0] ) { handleDeletes(xml); }
  if( xml.getElementsByTagName('appends')[0] ) { handleAppends(xml); }
  if( xml.getElementsByTagName('message')[0] ) {
	  handleMessage(xml);
  } else {
    if (document.getElementById(action + 'Messages')) {
      document.getElementById(action + 'Messages').innerHTML = '';
    }
  }

  if ( xml.getElementsByTagName('evaluate')[0] ) { handleEvaluate(xml); }
  if ( xml.getElementsByTagName('postRedirect')[0] ) {
    handlePostRedirect(xml);
  }

  handleSubmitButton(xml.getElementsByTagName('action')[0].firstChild.nodeValue);
  fadeGlobalMessages();

	

 // if(!isIE()){
   //$.unblockUI();
 // }
}

this.handler = this.defaultHandler;

function handleSubmitButton(myform) {
	if (myform.indexOf('_')>=0) {
		myform = myform.substr(myform.indexOf('_')+1);
	}
	myform = myform+'Form';

  if (document.getElementById(myform) && (document.getElementById(myform).submit.length)>0) {

     for (var i=0; i < document.getElementById(myform).submit.length; i++) {

			try {
				document.getElementById(myform).submit[i].disabled=false;
  		  document.getElementById(myform).submit[i].style.backgroundColor='#a00';
			} catch (e) {}

     }
   }  else {
  	try {
  		document.getElementById(myform).submit.disabled=false;
  		document.getElementById(myform).submit.style.backgroundColor='#a00';
  	} catch (e) {}
  }
}

function handleLoadHand( xml )
{
  var pex = xml.getElementsByTagName('loadHandData')[0].firstChild.nodeValue;
  var id = xml.getElementsByTagName('loadHandId')[0].firstChild.nodeValue;

  var hpc = getHandPostingController(flashId);
  hpc.loadReplayByPex(pex, id);
}

function handleDelete( xml ) {
  var myDeleteId = xml.getElementsByTagName('delete')[0].firstChild.nodeValue;
  var myDelete = document.getElementById( myDeleteId );
  myDelete.parentNode.removeChild(myDelete);
}
function handleReload( xml ) {
  var fixurl = location.href.replace( /(.*)#.*/, "$1");

  location.href = fixurl;
  return;
  // unfortunately when you reload ALL state is lost on the javascript side
  // so put in a bit of delay if there's a message or a notification;
  if( xml.getElementsByTagName('message')[0] || xml.getElementsByTagName('notify')[0] ) {
    setTimeout( "window.history.go(0);", 300 );
  } else {
    window.history.go(0);
  }
}
function handleRedirect( xml ) {
  window.location.href = xml.getElementsByTagName('redirect')[0].firstChild.nodeValue;
}
function handlePostRedirect(xml) {
  window.location.href = xml.getElementsByTagName('postRedirect')[0].firstChild.nodeValue;
}
function handleMessage( xml ) {

	try {
		var action = xml.getElementsByTagName('action')[0].firstChild.nodeValue;
  	var message = xml.getElementsByTagName('message')[0].firstChild.nodeValue;
	} catch (e) {
		return;
	}
	if (!(message==null || message == undefined || message == '')) {

    if( xml.getElementsByTagName('swaps')[0] ) {
			var messagesDiv = $('div#GlobalMessagesText');
			fadeGlobalMessages();
			messagesDiv.html(message);
		}


		var messagesDiv = document.getElementById( action + 'Messages' );

    if ( message != 'NO_MESSAGE' && messagesDiv != null ) {
  	messagesDiv.innerHTML = '';
  	//$( 'div#' + messagesDiv.id ).slideDown( 800 ); //messagesDiv.style.display = '';
    messagesDiv.innerHTML = message;
		//fadeGlobalMessages();
    fadeText(messagesDiv.id);
    }
  }
}
function handleNotify( xml ) {
  var notification = xml.getElementsByTagName('notify')[0].firstChild.nodeValue;
  var notifyDiv = document.getElementById( 'notificationBox' );
  notifyDiv.innerHTML = notification;
  notifyDiv.style.display = '';
}
function handleSwaps( xml ) {
  loopLength = xml.getElementsByTagName('swapId').length;

	for ( counter = 0; counter < loopLength; counter++ ) {
		swapDiv = document.getElementById( xml.getElementsByTagName('swapId')[counter].firstChild.nodeValue );
 
    if( !swapDiv ) continue;
    swapContents = concatChildren(xml.getElementsByTagName('swapContents')[counter]);
    
    
		swapContentsId = xml.getElementsByTagName('swapContentsId')[counter].firstChild.nodeValue;
    if ( swapContents != 'NULL' ) {
 		  swapDiv.innerHTML = swapContents;

    }

		swapDiv.id = swapContentsId;
		if ( swapDiv.id == 'activateAccountErrors' || swapDiv.id == 'invitepeopleErrors' || swapDiv.id == 'brandRequest' || swapDiv.id == 'importCSVReportOutput' ) {
	      $( 'div#' + swapDiv.id ).slideDown( 800 );

		} else if ( swapDiv.id == 'createEventErrors' || swapDiv.id == 'saveAccountsErrors' || swapDiv.id == 'editAccountDiv' ) {
		    window.scrollTo( 100, 100 );
				$( 'div#' + swapDiv.id ).slideDown( 800 );

		} else if ( swapDiv.id == 'pointHistory' ) {
		   $( 'div#' + swapDiv.id ).fadeIn( 500 );
		}

	}
}
function handleDeletes( xml ) {
	loopLength = xml.getElementsByTagName('deleteId').length;

	for ( counter = 0; counter < loopLength; counter++ ) {
		deleteDiv = document.getElementById( xml.getElementsByTagName('deleteId')[0].firstChild.nodeValue );
		deleteDiv.parentNode.removeChild( deleteDiv );
	}
}
function handleAppends( xml ) {
	loopLength = xml.getElementsByTagName('appendToDivId').length;

	for ( counter = 0; counter < loopLength; counter++ ) {
		appendToDiv = document.getElementById( xml.getElementsByTagName('appendToDivId')[counter].firstChild.nodeValue );
		appendDiv = concatChildren(xml.getElementsByTagName('appendDiv')[counter]);

    if( appendToDiv.nodeName == 'TABLE' )
    {
      appendToDiv = $( appendToDiv ).children( 'tbody' ).get(0);
    }

		$(appendToDiv).append(appendDiv);
	}
}
function handleReplaces( xml ) {
  loopLength = xml.getElementsByTagName('replaceId').length;

  for ( counter = 0; counter < loopLength; counter++ ) {
    var replaceId = xml.getElementsByTagName('replaceId')[counter].firstChild.nodeValue;
    var replaceContents = xml.getElementsByTagName('replaceContents')[counter].firstChild.nodeValue;

    $('#'+replaceId).replaceWith(replaceContents);
  }
}

function handleEvaluate ( xml ) {
  var loopLength = xml.getElementsByTagName('evaluate').length;

  for ( i=0; i<loopLength; ++i )
  {

    if (xml.getElementsByTagName('evaluate')[i].firstChild) {
      var script = xml.getElementsByTagName('evaluate')[i].firstChild.nodeValue;
      //alert( script );
      try{
//        alert(script);
        eval( script);
      }
      catch(e)
      {
        //alert( e.description );
      }
    }
  }
}

function submitForm( id ) {
	document.getElementById(id).submit();
}


function concatChildren(xml) {
	var node = xml.firstChild;
	var result = node.nodeValue;
	while (node = node.nextSibling) {
		result += node.nodeValue;
	}
	return result;
}

function isIE(){
   var browserName=navigator.appName;
   if (browserName=="Microsoft Internet Explorer"){
      return true;
   }
   return false;
}

/**
 * Singleton.
 */
function DivRefresher() {

  this.mapping = new Array(0);

  if( !DivRefresher.instance ) {
    DivRefresher.instance = this;
  }

  /**
   * Builds the XML necessary for telling the server to refresh multiple divs
   * @param array (array) a list of divs (by id) to refresh
   */
  this.buildXMLForDivRefresh = function( xmlWriter, divsToRefresh ) {
		if (divsToRefresh) {

      for ( i = 0; i < divsToRefresh.length; i++ ) {

        mappedTo = this.mapping[divsToRefresh[i]];
        if ( !mappedTo )  {
          mappedTo = divsToRefresh[i];
        }
        buildXMLForSingleDivRefresh( xmlWriter, mappedTo );
      }
		}
    return true;
  }

  /**
   * Builds the XML necessary for telling the server to refresh a single div
   * @param divId (string) the id of the div to refresh
   */
  function buildXMLForSingleDivRefresh( xmlWriter, divId ) {
    xmlWriter.BeginNode( divId );

    getFormXMLByDiv( xmlWriter, divId, "RefreshParameters" );

    xmlWriter.EndNode();
  }

  return DivRefresher.instance;
}
DivRefresher.instance = null;

function selectElement (element) {
  if (document.selection) {
    var range = document.body.createTextRange();
    range.moveToElementText(element);
    range.select();
  }
  else if (window.getSelection) {
    var range = document.createRange();
    range.selectNodeContents(element);
    var selection = window.getSelection();
    selection.removeAllRanges();
    selection.addRange(range);
 }
}


var SelectUsers = new function()
{
  this.showCheck = function( alias )
  {
     $( 'div#check_' + alias ).css( 'visibility', 'visible' );
     $( 'div#check_' + alias ).fadeIn( 500 );
  }

  this.hideCheck = function( alias )
  {
     $( 'div#check_' + alias ).css( 'visibility', 'hidden' );
  }
}

function trackThisLink(){
  var myAction = "outboundLink";
  sendJasonIsAwesome ( myAction, undefined, undefined, '', 'account' );
}


function copyToClipBoard( value, dontAlertAfter )
{

   var flashcopier = 'flashcopier';
   if(!document.getElementById(flashcopier)) {
     var divholder = document.createElement('div');
     divholder.id = flashcopier;
     document.body.appendChild(divholder);
   }
   document.getElementById(flashcopier).innerHTML = '';
   var divinfo = '<embed src="/flash/_clipboard.swf" FlashVars="clipboard='+escape(value)+'" width="0" height="0" type="application/x-shockwave-flash"></embed>';
   document.getElementById(flashcopier).innerHTML = divinfo;

   if( !dontAlertAfter ) alert( 'Copied successfully! Press "Ctrl + V" to paste' );
}
function copyMe(id){

   var holdertext = 'holdertext';
   if(!document.getElementById(holdertext)) {
     var divholder = document.createElement('textarea');
     divholder.id = holdertext;
     document.body.appendChild(divholder);
   } else {
      var divholder = document.getElementById(holdertext);
   }
   divholder.innerText = document.getElementById(id).value;
   copied = divholder.createTextRange();
   copied.execCommand('Copy');
   alert( 'Copied successfully! Press "Ctrl + V" to paste' );
}
function copyMe2(id){

   var holdertext = 'holdertext';
   if(!document.getElementById(holdertext)) {
     var divholder = document.createElement('textarea');
     divholder.id = holdertext;
     document.body.appendChild(divholder);
   } else {
      var divholder = document.getElementById(holdertext);
   }
   divholder.innerText = document.getElementById(id).innerHTML;
   copied = divholder.createTextRange();
   copied.execCommand('Copy');
   alert( 'Copied successfully! Press "Ctrl + V" to paste' );
}

var psDialogConfig =
{
   modal: true,
   autoOpen: false,
   title: "Please Confirm",
   width: 400,
   draggable: false,
   resizable: false,
   overlay: { background: "black", opacity: "0.5" }
};

var psConfirmCallback = null;

function showPSAlert( text, callback )
{
  if( $( 'div#ps-alert-box' ) )
  {
    $( 'div#ps-alert-box' ).dialog( "destroy" );
    $( 'div#ps-alert-box' ).remove();
  }

   var conf = psDialogConfig;
   conf.buttons = { OK: callback };
   $( 'body' ).append( '<div id="ps-alert-box" class="popup-dialog" style="text-align: center">' + text + '<br/></div>' );
   conf.height = $( 'div#ps-alert-box' ).height() + 95;
   $( 'div#ps-alert-box' ).dialog( conf );
   $( 'div.ui-dialog-buttonpane button' ).addClass( 'clonefish-style' );
   $( 'div#ps-alert-box' ).dialog( "open" );
}

function showPSConfirm( text, callback )
{
  if( $( 'div#ps-confirm-box' ) )
  {
    $( 'div#ps-confirm-box' ).dialog( "destroy" );
    $( 'div#ps-confirm-box' ).remove();
  }

   var conf = psDialogConfig;
   conf.buttons = { Yes: psConfirmYes, No: psConfirmNo };
   psConfirmCallback = callback;
   $( 'body' ).append( '<div id="ps-confirm-box" class="popup-dialog" style="text-align: center">' + text + '<br/></div>' );
   conf.height = $( 'div#ps-confirm-box' ).height() + 95;
   $( 'div#ps-confirm-box' ).dialog( conf );
   $( 'div.ui-dialog-buttonpane  button' ).addClass( 'clonefish-style' );
   $( 'div#ps-confirm-box' ).dialog( "open" );
}

function psConfirmYes()
{
  $( 'div#ps-confirm-box' ).dialog( "close" );
  if( !psConfirmCallback ) return;
  psConfirmCallback.call( undefined, true);
}

function psConfirmNo()
{
  $( 'div#ps-confirm-box' ).dialog( "close" );
  if( !psConfirmCallback ) return;
  psConfirmCallback.call( undefined, false );
}

function greyOutNotification(){
  if(!$('#optoutNotifications').attr('checked')){
    $('#emailNotificationForm input').attr("disabled", "disabled");
  }else{
    $('#emailNotificationForm input').removeAttr("disabled");
  }
}

function greyOutNotification2(){
  if(!$('#optoutNotifications').attr('checked')){
    $('#emailNotificationCodeForm input').attr("disabled", "disabled");
  }else{
    $('#emailNotificationCodeForm input').removeAttr("disabled");
  }
}
function recordBannerClick(bannerId){
  sendJasonIsAwesome('recordBannerClicks', bannerId, undefined, '', 'admin');
}

function refreshTalkboard(tId){
  setMessage('refreshTalkboard'+tId, 'Refreshing...');
  sendJasonIsAwesome('refreshTalkboard', '', undefined, '', 'account');
}

function submitReputation(type, objectId, objectType){
  $('#submitReputationFormType').val(type);
  $('#submitReputationFormObjectId').val(objectId);
  $('#submitReputationFormObjectType').val(objectType);
  sendJasonIsAwesome('submitReputation', '', undefined, '', 'account');
}

function getMonthName(id) {
   var month=new Array(12);
month[0]="January";
month[1]="February";
month[2]="March";
month[3]="April";
month[4]="May";
month[5]="June";
month[6]="July";
month[7]="August";
month[8]="September";
month[9]="October";
month[10]="November";
month[11]="December";
return month[id];
}