function getQueryStringParameter( sUrl, sParameter )
{
  var sValue = null;
  if( sUrl.indexOf( '#' ) != -1 )
    sUrl = sUrl.substring( 0, sUrl.indexOf( '#' ) );

  var nIndex = findQueryStringParameter( sUrl, sParameter );

  if( nIndex != -1 )
  {
    var nNextIndex = sUrl.indexOf( '&', nIndex + 1 );
    if( nNextIndex == -1 )
      sValue = sUrl.substring( nIndex + sParameter.length + 2 );
    else
      sValue = sUrl.substring( nIndex + sParameter.length + 2, nNextIndex );
  }

  return( sValue );
}

function setQueryStringParameter( sUrl, sParameter, sValue )
{
  var sNextUrl = '';

  if( sUrl.indexOf( '?' ) == -1 )
    sNextUrl = sUrl + '?' + sParameter + '=' + sValue;

  else
  {
    var nIndex = findQueryStringParameter( sUrl, sParameter );

    if( nIndex == -1 )
      sNextUrl = sUrl + '&' + sParameter + '=' + sValue;

    else
    {
      sNextUrl = sUrl.substring( 0, nIndex + 1 );
      sNextUrl += sParameter + '=';
      sNextUrl += sValue;

      var nNextIndex = sUrl.indexOf( '&', nIndex + 1 );
      if( nNextIndex != -1 )
        sNextUrl += sUrl.substring( nNextIndex );
    }
  }

  return( sNextUrl );
}

function removeQueryStringParameter( sUrl, sParameter )
{
  if( sUrl.indexOf( '?' ) == -1 )
    return( sUrl );


  var nIndex = findQueryStringParameter( sUrl, sParameter );

  if( nIndex == -1 )
    return( sUrl );

  var sNextUrl = sUrl.substring( 0, nIndex + 1 );

  var nNextIndex = sUrl.indexOf( '&', nIndex + 1 );
  if( nNextIndex != -1 )
    sNextUrl += sUrl.substring( nNextIndex + 1 );

  if( sNextUrl.charAt( sNextUrl.length - 1 ) == '?' )
    sNextUrl = sNextUrl.substring( 0, sNextUrl.length - 1 );

  return( sNextUrl );
}

function findQueryStringParameter( sUrl, sParameter )
{
  var nIndex = sUrl.indexOf( '&' + sParameter + '=' );

  if( nIndex == -1 )
    nIndex = sUrl.indexOf( '?' + sParameter + '=' );

  return( nIndex );
}

function openWidget(inputModeUrl, height, width)
{
  widgWin = window.open(inputModeUrl,'myWin','toolbars=no,scrollbars=yes,height=' +  height  + ',width=' +  width);
  widgWin.focus();
}

var wpbInitFunctionArray = new Array();

function wpbInit()
{
  window.onunload=wpbOnUnload;
  window.onresize=wpbOnResize;
  document.onmouseup=wpbOnMouseUp;
  document.onmousemove=wpbOnMouseMove;

  for( var n = 0; n < wpbInitFunctionArray.length; n++ )
    wpbInitFunctionArray[ n ]();
}

function wpbAddToInitFunctionArray( func )
{
  wpbInitFunctionArray[ wpbInitFunctionArray.length ] = func;
}

var wpbOnUnloadFunctionArray = new Array();

function wpbOnUnload()
{
  for( var n = 0; n < wpbOnUnloadFunctionArray.length; n++ )
    wpbOnUnloadFunctionArray[ n ]();
}

function wpbAddToOnUnloadFunctionArray( func )
{
  wpbOnUnloadFunctionArray[ wpbOnUnloadFunctionArray.length ] = func;
}

var wpbOnResizeFunctionArray = new Array();

function wpbOnResize()
{
  for( var n = 0; n < wpbOnResizeFunctionArray.length; n++ )
    wpbOnResizeFunctionArray[ n ]();
}

function wpbAddToOnResizeFunctionArray( func )
{
  wpbOnResizeFunctionArray[ wpbOnResizeFunctionArray.length ] = func;
}

var wpbOnMouseUpArray = new Array();

function wpbOnMouseUp()
{
  for( var n = 0; n < wpbOnMouseUpArray.length; n++ )
    wpbOnMouseUpArray[ n ]();
}

function wpbAddToOnMouseUpArray( func )
{
  wpbOnMouseUpArray[ wpbOnMouseUpArray.length ] = func;
}

var wpbOnMouseMoveArray = new Array();

function wpbOnMouseMove()
{
  for( var n = 0; n < wpbOnMouseMoveArray.length; n++ )
    wpbOnMouseMoveArray[ n ]();
}

function wpbAddToOnMouseMoveArray( func )
{
  wpbOnMouseMoveArray[ wpbOnMouseMoveArray.length ] = func;
}

var winPopups = new Array();

function openPopupWindow( sURL, sName, sParameters )
{
	closePopupWindow( sName );

	var winPopup = window.open( sURL, sName, sParameters + ',left=10,top=10,screenX=10,screenY=10' );
	winPopups[ winPopups.length ] = winPopup;

	winPopup.focus();

	return( winPopup );
}

function closePopupWindows()
{
	for( var n = 0; n < winPopups.length; n++ )
		if( !winPopups[ n ].closed )
			winPopups[ n ].close();
}

function closePopupWindow( sName )
{
	for( var n = 0; n < winPopups.length; n++ )
		if( !winPopups[ n ].closed )
			if( winPopups[ n ].name == sName )
				winPopups[ n ].close();
}

wpbAddToOnUnloadFunctionArray( closePopupWindows );

var topNavBarCount = 0;

function getElementOffset( elm )
{
  var elmTmp = elm;

  var nPosX = elmTmp.offsetLeft;
  var nPosY = elmTmp.offsetTop;

  elmTmp = elmTmp.offsetParent;
  while( elmTmp )
  {
    nPosX += elmTmp.offsetLeft;
    nPosY += elmTmp.offsetTop;

    elmTmp = elmTmp.offsetParent;
  }

  return( { nPosX:nPosX, nPosY:nPosY } );
}

function trim(str)
{
   return str.replace(/^\s*|\s*$/g,"");
}

function formatListValue( listValue )
{
   var lValue = listValue;
   document.write(lValue.substring(lValue.indexOf("|")+1,lValue.length));
}

function getClassification( sUrl )
{
  var tempURL = ''+sUrl;
  var tempString = tempURL.split( '?' );

  if( tempString.length > 1 )
  {
    var paramsArray = tempString[0].split( '/' );
    return paramsArray[paramsArray.length - 1];
  }
  return null;
}

function clearArea( name )
{
  var elem = document.getElementById( ''+name );
  elem.value='';
}

// form prefilling stuff
// used by remoteform & edit user blocks to prefill forms

function form_paramNode( sParam, sValue )
{
  this.sParam = sParam;
  this.sValue = form_unescape( sValue );
}

function form_fillElements( vNodes )
{
  for( var n = 0; n < vNodes.length; n++ )
    form_fillElement( vNodes[ n ] );
}

function form_fillElement( paramNode )
{
  for( var n = 0; n < document.forms.length; n++ )
  {
    var element = document.forms[ n ].elements[ paramNode.sParam ];

    if( element != null )
    {
      if( element.type )
      {
        eval( 'form_fill_' + element.type.replace( '-', '_' ) + '( element, paramNode );' );
      }

      else if( element.length )
      {
        for( var m = 0; m < element.length; m++ )
        {
          eval( 'form_fill_' + element[ m ].type.replace( '-', '_' ) + '( element[ m ], paramNode );' );
        }
      }
    }
  }
}

function form_fill_hidden( element, paramNode )
{
  element.value = paramNode.sValue;
}

function form_fill_file( element, paramNode )
{
}

function form_fill_text( element, paramNode )
{
  element.value = paramNode.sValue;
}

function form_fill_textarea( element, paramNode )
{
  element.value = paramNode.sValue;
}

function form_fill_radio( element, paramNode )
{
  if( element.value == paramNode.sValue )
  {
    element.checked = true;
  }
}

function form_fill_select_one( element, paramNode )
{
  for( var n = 0; n < element.length; n++ )
  {
    var sValues = paramNode.sValue.split( ',' );
    
    for( var m = 0; m < sValues.length; m++ )
    {   
      if( element[ n ].value == sValues[ m ] || element[ n ].text == sValues[ m ] )
      {
        element.selectedIndex = n;
        break;
      }
    }
  }
}

function form_fill_select_multiple( element, paramNode )
{
}

function form_fill_checkbox( element, paramNode )
{
  if( element.value == paramNode.sValue || element.value == 'on' )
  {
    element.checked = true;
  }
}

function form_unescape( sValue )
{
  var s = sValue;
  var s2 = sValue.replace( '+', ' ' );
  while( s2 != s )
  {
    s = s2;
    s2 = s.replace( '+', ' ' );
  }

  return( unescape( s2 ) );
}

// /form prefilling stuff


// RemoteForm js. Lots of it, so shoved in here to keep page size down

// getElementById isn't the fastest thing around, it may be necessary to cache elements, forms etc once found.
function rf_getForm( sFormFieldPrefix )
{
	return( document.getElementById( 'rf_' + sFormFieldPrefix + 'form' ) );
}

function rf_getElement( sFormFieldPrefix, sElement )
{
	return( document.getElementById( 'rf_' + sFormFieldPrefix + sElement ) );
}

function rf_submit( sFormFieldPrefix, bSilent )
{
	var frm = rf_getForm( sFormFieldPrefix );
	var eDoSubmit = rf_getElement( sFormFieldPrefix, 'doSubmit' );
	
	if( bSilent && bSilent == true )
		frm.target="rf_" + sFormFieldPrefix + "hiddeniframe";
	else
		frm.target="_self";

	eDoSubmit.value="true";

	frm.submit();
}

function rf_newSiblingCategory( sFormFieldPrefix, sName, sAccessKey, sDescription )
{
	rf_getElement( sFormFieldPrefix, 'sCategoryName' ).value = sName;
	rf_getElement( sFormFieldPrefix, 'sCategoryAccessKey' ).value = sAccessKey;
	rf_getElement( sFormFieldPrefix, 'sCategoryDescription' ).value = sDescription;
	rf_getElement( sFormFieldPrefix, 'sCategoryAction' ).value = "new-sibling";

	rf_submit( sFormFieldPrefix );
}

function rf_newChildCategory( sFormFieldPrefix, sName, sAccessKey, sDescription )
{
	rf_getElement( sFormFieldPrefix, 'sCategoryName' ).value = sName;
	rf_getElement( sFormFieldPrefix, 'sCategoryAccessKey' ).value = sAccessKey;
	rf_getElement( sFormFieldPrefix, 'sCategoryDescription' ).value = sDescription;
	rf_getElement( sFormFieldPrefix, 'sCategoryAction' ).value = "new-child";

	rf_submit( sFormFieldPrefix );
}

function rf_editCategory( sFormFieldPrefix, sName, sAccessKey, sDescription )
{
	rf_getElement( sFormFieldPrefix, 'sCategoryName' ).value = sName;
	rf_getElement( sFormFieldPrefix, 'sCategoryAccessKey' ).value = sAccessKey;
	rf_getElement( sFormFieldPrefix, 'sCategoryDescription' ).value = sDescription;
	rf_getElement( sFormFieldPrefix, 'sCategoryAction' ).value = "edit";

	rf_submit( sFormFieldPrefix );
}

function rf_moveCategory( sFormFieldPrefix, bUp )
{
	if( bUp == true )
		rf_getElement( sFormFieldPrefix, 'sCategoryAction' ).value = "moveUp";
	else
		rf_getElement( sFormFieldPrefix, 'sCategoryAction' ).value = "moveDown";

	rf_submit( sFormFieldPrefix );
}


function rf_deleteCategory( sFormFieldPrefix )
{
	rf_getElement( sFormFieldPrefix, 'doSubmit' ).value = "true";
	rf_getElement( sFormFieldPrefix, 'sCategoryAction' ).value = "delete";

	rf_submit( sFormFieldPrefix );
}

function rf_deleteDocument( sFormFieldPrefix, nID )
{
	rf_getElement( sFormFieldPrefix, 'doSubmit' ).value = "true";
	rf_getElement( sFormFieldPrefix, 'nDeleteDocID' ).value = nID;

	rf_submit( sFormFieldPrefix );
}

var rf_selectUserGroupWin = null;
var rf_selectUserGroupFormFieldPrefix = null;
function rf_selectUserGroups( sFormFieldPrefix, sServlet )
{
	if( rf_selectUserGroupWin )
		if( rf_selectUserGroupWin.closed )
			rf_selectUserGroupWin.close();

	rf_selectUserGroupFormFieldPrefix = sFormFieldPrefix;
	rf_selectUserGroupWin = window.open( sServlet + "?tool=WPBTool&handler=ChooseUserGroupH&callback=rf_selectUserGroups_callback&referrer="+document.location.pathname, "selectUserGroupWin", "scrollbars=no,menubar=no,status=no,width=800,height=290" );
	rf_selectUserGroupWin.focus();
}


function rf_selectUserGroups_callback( sAction, sData )
{
	if( sAction == 'get_vAssignedUsers' )
		return( rf_getElement( rf_selectUserGroupFormFieldPrefix, 'vAssignedUsers' ).value );

	else if( sAction == 'get_vAssignedRoles' )
		return( rf_getElement( rf_selectUserGroupFormFieldPrefix, 'vAssignedGroups' ).value )

	else if( sAction == 'get_vAssignedPublicationAudienceGroups' )
		return( rf_getElement( rf_selectUserGroupFormFieldPrefix, 'vAssignedPublicationAudienceGroups' ).value )

	else if( sAction == 'set_vAssignedUsers' )
		rf_getElement( rf_selectUserGroupFormFieldPrefix, 'vAssignedUsers' ).value = sData;

	else if( sAction == 'set_vAssignedRoles' )
		rf_getElement( rf_selectUserGroupFormFieldPrefix, 'vAssignedGroups' ).value = sData;

	else if( sAction == 'set_vAssignedPublicationAudienceGroups' )
		rf_getElement( rf_selectUserGroupFormFieldPrefix, 'vAssignedPublicationAudienceGroups' ).value = sData;
}


// /RemoteForm js


// gearoidc: 21-Sept-2005, these functions should be in a file of their own.

function openULPopup( locUrl, windowname, winsettings  )
{
  if (!window.focus)return true;
  window.open(locUrl, windowname, winsettings);
  return false;
}

function exeFunctionAddModule( moduleID, title, parentDocID )
{
  if (! ( window.focus && window.opener ) )
  {
    return true;
  }
  window.opener.addModule( moduleID, title, parentDocID );

  return;
}

function findObj(n, d)
{
  var p,i,x;
  if( !d )
  {
    d = document;
  }
  if( ( p = n.indexOf("?") ) > 0 && parent.frames.length )
  {
    d = parent.frames[n.substring(p+1)].document;
    n = n.substring(0,p);
  }
  if( !( x = d[n] ) && d.all )
  {
    x = d.all[n];
    for( i = 0; !x && i < d.forms.length; i++ )
    {
      x = d.forms[i][n];
    }
    for( i=0; !x && d.layers && i < d.layers.length; i++ )
    {
      x = findObj( n, d.layers[i].document );
    }
  }
  return x;
}


function validateFormFields()
{
 var curr_token, flag;
 var i, errors = '', args=validateFormFields.arguments;
 var submitFunc = '';
 var refreshFunc = false;
 
 saveOnExit = 0; 

 for (i = 0; i < ( args.length - 1 ); i += 3)
 {
  flag = args[i+1];
  if( flag != 'S' )
  {
    curr_token = findObj( args[i] );
  }

  if( flag == 'R' )
  {
    if( curr_token.value == "" || curr_token.value == "-1" )
    {
      errors += '- ' + args[i+2] + ' is required.\n';
    }
  }

  if( flag == 'S' )
  {
      submitFunc = args[i];
  }

  if( flag == 'RF' )
  {
    refreshFunc = true;
  }
  
  if( flag == 'RC' ) 
  {
    next_token = findObj( args[i+3] );
    // A password is required so check both
    if( curr_token.value != "" && next_token.value != "" )
    {
      if( curr_token.value != next_token.value )
      {
        errors += '- Passwords dont match.\n';
      }
    }
    else
    {
      errors += '- Please fill-in both password fields.\n';
    }
  }
  if( flag == 'C' )
  {
    // A password may not be required here
    if( curr_token.value != "" )
    {
      next_token = findObj( args[i+3] );
      if( curr_token.value != next_token.value )
      {
        errors += '- Passwords dont match.\n';
      }
    }
  }

  if( flag == 'C2' )
  {
    // A password may not be required here
    if( curr_token.value != "" )
    {
      next_token = findObj( args[i-3] );
      if( curr_token.value != next_token.value )
      {
        errors += '- Passwords dont match.\n';
      }
    }
  }
 }
 if( errors )
 {
  saveOnExit = 1;
  alert( 'The following error(s) occurred:\n' + errors );
 }
 else
 {
  if( submitFunc != '' )
  {
    eval( submitFunc + '()' );
  }
  if( refreshFunc == true )
  {
    window.opener.history.go(0); 

  }
 }
 document.returnValue = ( errors == '' );
}


function setSelectList( sel, val )
{
  var n = 0;

  for( n = 0; n < sel.length; n++ )
  {
    if( sel[ n ].value == val )
    {
      sel.selectedIndex = n;
    }
  }
}

var tokenArray = new Array();
var allowableClassValues = new Array(5); 
allowableClassValues[0] = "colorRed";
allowableClassValues[1] = "colorGreen";
allowableClassValues[2] = "colorBlue";

function convert( ufHTML ) {
  var fHTML = '';
  var IN_TAG = 200;
  var OUT_TAG = 201;
  var TAG_ATTRIBUTE = 202;
  var TAG_ATTRIBUTE_VALUE = 203;
  
  var plain_text = '';
  var mode = 0;
  var attributeName = '';
  var attributeValue = '';
  var classFound = 0;
  var quoteCount = 0;

  var currentTag = '';
  // parse the html string    
  for( var i = 0; i < ufHTML.length; i++ ) {
    if( ufHTML.charAt(i) == '<' ) {
      
      if( plain_text.length > 0 )
        tokenArray.push( plain_text );

      currentTag = '';
      mode = IN_TAG;

    } else if( ufHTML.charAt(i) == '>' ) {

      if( mode == IN_TAG  ) {

        checkToken( currentTag ) ;
        mode = OUT_TAG;
        plain_text = '';
      } else if( mode == TAG_ATTRIBUTE_VALUE ) {

        mode = OUT_TAG;
        plain_text = '';
      }
      fHTML = dumpTokens( fHTML );
      currentTag = '';

    } else if( ufHTML.charAt(i) == ' ' ) {
      
      if( mode == OUT_TAG ) {
        
        plain_text = plain_text + ufHTML.charAt(i);
        
      } else if( mode == IN_TAG ) {
        
        checkToken( currentTag );
        mode = TAG_ATTRIBUTE;
        
      }
    } else if( ufHTML.charAt(i) == '/' ) {

      if( mode == IN_TAG ) {
        
        currentTag = currentTag + ufHTML.charAt(i);
        
      }
      
    } else if( ufHTML.charAt(i) == '=' ) {

      if( mode == TAG_ATTRIBUTE ) {
        
        classFound = checkAttribute( attributeName );
        mode = TAG_ATTRIBUTE_VALUE;
        
      }
    } else if( ufHTML.charAt(i) == '\'' || ufHTML.charAt(i) == '"') {

      if( mode == TAG_ATTRIBUTE_VALUE ) {       
        quoteCount++;
        if( quoteCount >= 2 ) {
          if( classFound == 1 ) {
            checkAttributeValue( attributeName, attributeValue );
          }
          quoteCount = 0;
        }
      }
    } else {
      if( mode == OUT_TAG ) {
        
        plain_text = plain_text + ufHTML.charAt(i);
        
      } else if ( mode == TAG_ATTRIBUTE ) {
        
        attributeName = attributeName + ufHTML.charAt(i);
        
      } else if ( mode == TAG_ATTRIBUTE_VALUE ) {
        
        attributeValue = attributeValue + ufHTML.charAt(i);
        
      } else {
        
        currentTag = currentTag + ufHTML.charAt(i);
        
      }
    }
  } <!-- end for loop -->
  alert(fHTML);
  return fHTML;
}

function checkToken( tag ) {
  if( tag == 'div' ) {
    tokenArray.push( "<"+tag );
  } else if ( tag == '/div' ) {
    tokenArray.push( '</div' );
  } else {
  }
}

function checkAttribute( attr ) {
  if( attr == 'class' ) {
    tokenArray.push( attr+"=" );
    return 1;
  }
  return 0;
}

function checkAttributeValue( attr, attrVal ) {
  for( var i = 0; i < allowableClassValues.length; i++ ) {
    if( allowableClassValues[i] == attrVal ) {
      tokenArray.push( "\"" + attrVal + "\"");
    }
  }
}

function dumpTokens( fHTML ) {
  var html = '';

  for( var i = 0; i < tokenArray.length; i++ ) {
    html = html + tokenArray[i]+' ';  
  }
  html = trim(html);
  html = html + '>';
  fHTML = fHTML + html;
  tokenArray = new Array();
  return fHTML;
}

function trim(str)
{
  return str.replace(/^\s*|\s*$/g,"");
}
