function showFindDevices( )
{
   // Local Variables
   var id = "FindDevices";
 
   if ( document.getElementById( id ) != null )
   {
      getGroups( );

      document.getElementById( id ).style.visibility = "visible";

      // Grab Focus
      setWindowFocus( id );
   }
}


function closeFindDevices( )
{
   if ( document.getElementById("FindDevices") != null )
   {
      document.getElementById("FindDevices").style.visibility = "hidden";
   }
}


function getGroups( )
{
   var request = buildRequest( );

   var callback = function( )
   {
      if ( request.readyState == 4 )
      {
         if( request.status == 200 )
         { 
            var response = parseDocument( request.responseText );
            var GroupList = document.getElementById("GroupSelect");
            var items = response.getElementsByTagName( "group" );

            // Clear the list of all existing options
            GroupList.options.length = 0;

            if( items.length > 0 )
            {                    
               for ( var i = 0; i < items.length; i++ )
               {
                   var item = items[i];
                 
                   // Get the details of this map element
                   var id = nodeValue( item, "id" );
                   var name = nodeValue( item, "name" );

                   GroupList.options[i] = new Option( name, id );
               }

               getGroupMembers( );
            }
            else
            {
                errorHandler( response );
            }
         }
      }
   }

   // Initialise the parameter list
   var param = new Parameter( "SessionID", getSessionID( ) );

   ajaxCall( request, "GetDeviceGroups", param, callback );
}


function getGroupMembers( )
{
   var request = buildRequest( );
   var select = document.getElementById( "GroupSelect" );
   var list = document.getElementById( "DeviceList" );

   var callback = function( )
   {
      if ( request.readyState == 4 )
      {
          if( request.status == 200 )
          { 
             var response = parseDocument( request.responseText );
             var items = response.getElementsByTagName( "groupmember" );

             // Remove the existing child nodes
             removeAllChildNodes( "DeviceList" );

             if ( items.length > 0 ) 
             {
                // Append the new collection of child nodes
                for ( var i = 0; i < items.length; i++ )
                {
                   var groupID = select.options[ select.selectedIndex ].value;
                   var item = items[i];

                   // Create and initialise the new html elements
                   var control = document.createElement( "DIV" );
                   var checkbox = document.createElement( "INPUT" );
                   var label = document.createElement( "SPAN" );
                   control.className = "Device";
                   checkbox.type = "Checkbox";
                   checkbox.id = "DeviceSelect" + nodeValue( item, "id" );
                   checkbox.name = "DeviceSelect";
                   checkbox.value = nodeValue( item, "id" );
                   checkbox.onclick = setShowDevice;

                   label.appendChild( document.createTextNode( nodeValue( item, "name" ) ) );

                   control.appendChild( checkbox );
                   control.appendChild( label );
                   list.appendChild( control );
                
                   // Set the checked flag (has to be done after insertion or IE resets it)
                   if ( nodeValue( item, "checked" ) == "True" ) 
                      checkbox.checked = true;

                }
             }
             else
             {
                errorHandler( response );
             }
          }
      }
   }
  
   try
   {
      var params = new Array(2);
      var groupID = select.options[ select.selectedIndex ].value;
      params[0] = new Parameter( "SessionID", getSessionID( ) );
      params[1] = new Parameter( "GroupID", groupID );
   
      ajaxCall( request, "GetDeviceGroupMembers", params, callback );
   }
   catch ( ex )
   {
      // TODO: Throw a warning
   }
}


function findDevices( )
{
   var request = buildRequest( );
   var elRefresh = document.getElementById( "Find_Refresh" );
   var refresh;
   var select = document.getElementById( "GroupSelect" );

   if ( ( elRefresh != null ) && ( elRefresh.checked ) )
      refresh = "True";
   else
      refresh = "False";

   var callback = function( )
   {
      if ( request.readyState != 4 )
      {
          document.getElementById("Loading").style.visibility = "visible";
      }
      else
      {
          document.getElementById("Loading").style.visibility = "hidden";

          if( request.status == 200 )
          { 
             var response = parseDocument( request.responseText );
             var warning = document.getElementById( "DeviceWarning" );
             var items = response.getElementsByTagName( "device" );

             // Check to see if we need to clear the existing devices
             var clearAll = document.getElementById( "Find_AppendResults" );            
             var centerMap = document.getElementById( "Find_CenterMap" );
             
             if ( ( clearAll != null ) && ( ! clearAll.checked ) )
             {
                devices.clear( );
                warning.style.visibility = "hidden";
             }
              
             if ( items.length > 0 )
             {                    
                for ( var i = 0; i < items.length; i++ )
                {
                   var item = items[i];
                 
                   // Get the details of this map element
                   var name = nodeValue( item, "name" );
                   var suburb = nodeValue( item, "suburb" );
                   var date = nodeValue( item, "date" );
                   var latitude = nodeValue( item, "latitude" );
                   var longitude = nodeValue( item, "longitude" );
                   var comment = nodeValue( item, "comment" );

                   // Add a push-pin to the map
                   var device = new Device( name, suburb, date, "Salesman.gif", latitude, longitude, comment );
                   devices.add( device );

                   if ( ( latitude == "" ) || ( longitude == "" ) )
                   {
                      warning.style.visibility = "visible";
                   }
                }

                if ( devices.count <= 0 )
                {
                   // Inform the user that we were unable to locate the devices
                   alert( "Unable to locate devices!" );
                }
                else
                {
                   // Display the device collection and center the map
                   devices.display( );

                   if ( ( centerMap != null ) && ( centerMap.checked ) )
                   {
                      showBestMap( );
                   }
                }
             }
             else
             {
                errorHandler( response );
             }
          } 
          else 
          { 
             alert( "Error: returned status code " + request.status + " " + request.statusText ); 
             alert( request.responseText ); 
          } 
      }
   }

   var deviceList = document.getElementById( "DeviceList" );
   var deviceCheckbox = deviceList.getElementsByTagName( "Input" );
   var count = 0;
   var proceed = true;
   
   // Count all of the checked elements
   for ( var i = 0; i < deviceCheckbox.length; i ++ )
      if ( deviceCheckbox[i].checked )
         count++;

   if ( ( count > 5 ) && ( refresh == "True" ) )
   {
      var poll = confirm( "You have requested fresh data from more than 5 field devices.  This operation will take some time to complete and will be run as a one off scheduled poll.\n\n" +
                          "Alternatively you may select less devices and run the query as normal." );
      
      // Setup the scheduled poll and close the find window
      if ( poll )
      {
         // Setup the scheduled poll
         createScheduledPoll( );
         
         // Close the find window 
         closeFindDevices( );   
      }
      
      proceed = false;
   }
   else if ( ( count > 5 ) && ( refresh != "True" ) )
   {
      proceed = confirm( "You have requested cached data from more than 5 devices; if the data is not available in the cache then fresh data will be requested from the field.\n\n" + 
                         "As such this process may take some time to complete and may time out, do you wish to continue?" );
   }

   // If the user has elected to continue
   if ( proceed )
   {
      // Build up the parameter list
      var params = new Array( 3 );
      var groupID = select.options[ select.selectedIndex ].value;
      params[0] = new Parameter( "SessionID", getSessionID( ) );
      params[1] = new Parameter( "GroupID", groupID );
      params[2] = new Parameter( "Refresh", refresh );

      ajaxCall( request, "GetDeviceData", params, callback );
      
      closeFindDevices( );
   }
}


function setShowDevice( event )
{
   // Create a request object
   var request = buildRequest( );
   var element;
   
   if ( browser.engine != "MSIE" )
   {
      element = event.target;
   }
   else
   {
      element = window.event.srcElement;
   }

   // Create the callback function
   var callback = function( )
   {
      if ( request.readyState == 4 )
      {
          if( request.status == 200 )
          { 
             var response = parseDocument( request.responseText );
             errorHandler( response );
          }
       }
   }  

   // Create the parameter objects
   var params = new Array(3);
   params[0] = new Parameter( "SessionID", getSessionID( ) );
   params[1] = new Parameter( "DeviceID", element.value );
   if ( element.checked )
   {
      params[2] = new Parameter( "Selected", "True" );
   }
   else
   {
      params[2] = new Parameter( "Selected", "False" );  
   }

   ajaxCall( request, "SetShowDevice", params, callback );
}


function setShowDeviceById( id )
{
   // Create a request object
   var request = buildRequest( );
   var element = document.getElementById( id );
   
   // Create the callback function
   var callback = function( )
   {
      if ( request.readyState == 4 )
      {
          if( request.status == 200 )
          { 
             var response = parseDocument( request.responseText );
             errorHandler( response );
          }
       }
   }  

   // Create the parameter objects
   var params = new Array(3);
   params[0] = new Parameter( "SessionID", getSessionID( ) );
   params[1] = new Parameter( "DeviceID", element.value );
   if ( element.checked )
   {
      params[2] = new Parameter( "Selected", "True" );
   }
   else
   {
      params[2] = new Parameter( "Selected", "False" );  
   }

   ajaxCall( request, "SetShowDevice", params, callback );
}


function toggleFindAll( )
{
   var findAll = document.getElementById( "Find_SelectAllDevices" );
   var deviceList = document.getElementById( "DeviceList" );
   var devices = deviceList.getElementsByTagName( "input" );
   
   for ( var i = 0; i < devices.length; i++ )
   {
      if ( devices[i].checked != findAll.checked ) 
      {
         devices[i].checked = findAll.checked;
         setShowDeviceById( devices[i].id );
      }
   }
}


function createScheduledPoll( )
{
   // Local Variables
   var request = buildRequest( );
   
   // Define the callback function
   var callback = function( )
   {
      if ( request.readyState == 4 )
      {
          if( request.status == 200 )
          {
             // TODO: Setup callback function 
          }
      }
   }
   
   // Build the parameter list
   var params = new Array( );
   var paramIndex = 1;
   params[0] = new Parameter( "SessionID", getSessionID( ) );

   // Get the list of devices
   var deviceList = document.getElementById( "DeviceList" );
   var selectedDevices = deviceList.getElementsByTagName( "Input" );

   for ( var i = 0; i < selectedDevices.length; i++ )
   {
      var dev = selectedDevices[i];
         
      if ( dev.checked == true )
      {
         params[ paramIndex ] = new Parameter( "long", dev.value, "DeviceData" );
         paramIndex++;
      }
   }
      
   // Build up the AJAX Call
   ajaxCall( request, "AddOneOffSchedule", params, callback );
}
