// create new index job object
var index_job = new ActiveXObject("Indexer.SDSearchIndexer");

// current data context for indexes
var database_root = "Index/Databases";
var active_index = "";
//var active_info_context = "";
var active_timer = null;
var OnIndexingCompleteMethod = null;

// costant values
var SPACE_CH = ' ';
var COMMA_CH = ',';
var DIR_LIST_FILE = "dir_list.dat";

// EXTERNALLY CALLABLE METHODS.
// THESE METHODS CAN BE CALLED EXTERNALLY WITHOUT COMPROMISING
// SEPARATION OF SEARCH ENGINE INDEPENDENT AND SPECIFIC CODE SEGMENTS.

// Note: all methods except CreateIndex(), DeleteIndex(), GetIndexNames(),
// GetNumOfIndexes(), and IsDuplicateIndex() must be called after establishing
// active index context.  This is done by calling SetActiveIndex() with
// passing an appropriate index name.

// this method creates index with default configuration.
function CreateIndex(index_name)
{
  var name = TrancateName(index_name);
  
  try
  {
    index_job.LoadDefaultIndexInfo();		
    index_job.IndexName = name;
	index_job.CreateIndex();	
  }
  catch(e)
  {
    alert(/*IDS_E_CREATION_INDEX_FAIL*/"Skapelse av nytt index misslyckades.");
  }
}

// this method must be used only when index'es configuration
// is set prior to the call.  Index is created with currently
// set configuration.
function CreateConfiguredIndex()
{
  if(IsIndexing())
  {
    alert(/*IDS_E_INDEXING_IN_PROGRESS*/"Eftersom indexering pgr kan\ningen ny indexdatabas skapas.\nVnta tills indexeringen fullbordats och frsk igen.");
    return false;
  }
  
  try
  {
    index_job.CreateIndex();
  }
  catch(e)
  {
    alert(/*IDS_E_CREATION_CONFIGURED_INDEX_FAIL*/"Skapelse av konfigurerat index misslyckades.");
	return false;
  }
  
  return true;
}

function BuildIndex()
{
  BuildIndexIncremental();
}

function BuildIndexIncremental()
{
  try
  {
	index_job.BuildIndex(active_index);
  }
  catch(e)
  {
    alert(/*IDS_E_INCREMENTAL_INDEX_FAIL*/"Inkrementalt indexeringsjobb misslyckades.");
  }
}

function BuildAllIndexes()
{
  try
  {
    index_job.BuildAllIndexes();
  }
  catch(e)
  {
    alert(/*IDS_E_BUILDING_INDEX_FAIL*/"Skapelse av alla index misslyckades.");
  }
}

function StopIndexing()
{
  try
  {
    index_job.StopIndexing();
  }
  catch(e)
  {
    alert(/*IDS_E_STOP_INDEX_FAIL*/"Kan inte avbryta indexering.");
  }
}

function DeleteIndex(index_name)
{
  try
  {
    index_job.DeleteIndex(index_name);
  }
  catch(e)
  {
    alert(/*IDS_E_DELETE_INDEX_FAIL*/"Kunde inte radera index.");
  }
}

function VerifyIndex(index_name)
{
  try
  {
    return index_job.VerifyIndex(index_name);
  }
  catch(e)
  {
    alert(/*IDS_E_VERIFY_INDEX_FAIL_1*/"Kunde inte kontrollera Indexdatabas '" + index_name +"'.\n" +
	  /*IDS_E_VERIFY_INDEX_FAIL_2*/"Kontrollera att den inte har flyttats eller raderats.");
  }
}

function IsIndexing()
{
  try
  {
    var indexing_state = index_job.IsIndexing;
	return indexing_state;
  }
  catch(e)
  {
    alert(/*IDS_E_INCREMENTAL_INDEX_FAIL*/"Inkrementalt indexeringsjobb misslyckades.");
  }
}

function SetActiveIndex(index_name)
{
  active_index = index_name;
  //active_info_context = database_root + "/" + active_index;
}

// Note: 2nd parameter ignored
function AttachIndexHandler(handler, index_complete_callback)
{
  handler.AttachIndex(index_job);
}

function DetachIndexHandler(handler)
{
  handler.DetachIndex();
}

// convenience support methods,
// (can be called externally)

function GetIndexNames()
{
  var safe_array = index_job.AllExistingIndexDBs;
  var js_array = SafeArrayToJsArray(safe_array);
  
  // if only one element with empty string,
  // it means 'non-value' (needed to do this way
  // because SafeArrayToJsArray() assumes safearray
  // as an input
  if(js_array.length == 1 && js_array[0] == "")
    js_array = new Array();

  return js_array;
}

function GetNumOfIndexes()
{
  var indexes = GetIndexNames();
  return indexes.length;
}

function IsDuplicateIndexName(index_name)
{
  var names = GetIndexNames();
  var name = TrancateName(index_name);
  
  for(var i = 0; i < names.length; i++)
  {
    if(names[i].toUpperCase() == name.toUpperCase())
	  return true;
  }
  
  return false;
}

// set and get methods for index options

function SetIndexName(index_name)
{
  var name = TrancateName(index_name);
  
  try
  {
    index_job.IndexName = name;
  }
  catch(e)
  {
    alert(/*IDS_E_SETINDEXNAME_FAIL*/"SetIndexName: misslyckades");
  }
}

function GetIndexName()
{
  try
  {
    return index_job.IndexName;
  }
  catch(e)
  {
    alert(/*IDS_E_GETTINDEXNAME_FAIL*/"GetIndexName: misslyckades");
  }
}

function SetIndexPath(value)
{
  try
  {
	//var index_path = DisplayPathToIndexPath(value);
    //index_job.IndexPath = index_path;
	index_job.IndexPath = value;
  }
  catch(e)
  {
    alert(/*IDS_E_SETINDEXPATH_FAIL*/"SetIndexPath: misslyckades");
  }
}

function GetIndexPath()
{
  try
  {
    var index_path = index_job.IndexPath;
	//var value = IndexPathToDisplayPath(index_path);
	//return value;
	return index_path;
  }
  catch(e)
  {
    alert(/*IDS_E_GETINDEXPATH_FAIL*/"GetIndexPath: misslyckades");
  }
}

function SetIncludedExtensions(exts_array)
{
  try
  {
    var js_array = ExtensionsToPaths(exts_array);
    var safe_array = JsArrayToSafeArray(js_array);
    index_job.IncludedExtensions = safe_array;
  }
  catch(e)
  {
    alert(/*IDS_E_SETINCLUDEDEXT_FAIL*/"SetIncludedExtensions: misslyckades");
  }
}

function GetIncludedExtensions()
{
  try
  {
    var safe_array = index_job.IncludedExtensions;
	var js_array = SafeArrayToJsArray(safe_array);
	var exts_array = PathsToExtensions(js_array);
	return exts_array;
  }
  catch(e)
  {
    alert(/*IDS_E_GETINCLUDEDEXT_FAIL*/"GetIncludedExtensions: misslyckades");
  }
}

function IsIncludedExtensionSelected(ext_array)
{
  if(ext_array.length == 0)
    return false;
  return true;
}

//Func added to fix alphabetical order in in File types
//this func is input to sort() method in GetExtensions
function compare_caseinsensitive_func(a, b) {
  var anew = a.toLowerCase();
  var bnew = b.toLowerCase();
  if (anew < bnew) return -1;
  if (anew > bnew) return 1;
  return 0;
}
function GetExtensions()
{
  try
  {
    var safe_array = index_job.ExtensionList;
	var exts_array = SafeArrayToJsArray(safe_array);
	return exts_array.sort(compare_caseinsensitive_func);
  }
  catch(e)
  {
    alert(/*IDS_E_GETEXT_FAIL*/"GetExtensions: misslyckades");
  }
}

function GetDefaultExtensions()
{
  try
  {
    var safe_array = index_job.DefaultExtensionList;
	//var js_array = SafeArrayToJsArray(safe_array);
	//var exts_array = PathsToExtensions(js_array);
	var exts_array = SafeArrayToJsArray(safe_array);
	return exts_array;
  }
  catch(e)
  {
    alert(/*IDS_E_GETDEFAULTEXT_FAIL*/"GetDefaultExtensions: misslyckades");
  }
}

function SetIncludedPaths(safe_paths)
{
  try
  {
	index_job.IncludedPaths = safe_paths;
  }
  catch(e)
  {
    alert(/*IDS_E_SETINCLUDEDPATH_FAIL*/"SetIncludedPaths: misslyckades");
  }
}

function SetInitialIncludedPaths(values)
{
  // not implemented for DT search (SSE specific code)
}

function GetIncludedPaths()
{
  //var values = GetAppValues(active_info_context);
  //var file_name = values["Path"] + "\\" + DIR_LIST_FILE;
  //var paths;
  var safe_paths = null;
  
  try
  {
    //paths = io_support.ReadListFromFile(file_name, COMMA_CH);
	safe_paths = index_job.IncludedPaths;	
  }
  catch(e)
  {
    alert(/*IDS_E_GETINCLUDEDPATH_FAIL*/"GetIncludedPaths: misslyckades");
  }
  
  return safe_paths;
}

function IsIncludedPathSelected(safe_paths)
{
  var js_paths = SafeArrayToJsArray(safe_paths);
  
  // no element in the list means no selection
  if(js_paths.length == 0)
    return false;
	
  // only one empty element means no selection as well
  if(js_paths.length == 1)
  {
    if(js_paths[0] == "")
	  return false;
  }
  
  return true;
}

function SetExcludedPaths(safe_paths)
{
  // not implemented for DT search (SSE specific code)
}

function GetExcludedPaths()
{
  // empty safearray returned for DT search
  var safe_paths = JsArrayToSafeArray(new Array()); 
  return safe_paths;
}

function LoadIndexInfo(new_database)
{
  index_job.LoadIndexInfo(new_database);
}

function SaveIndexInfo(new_database)
{
  index_job.SaveIndexInfo(new_database);
}

function LoadDefaultIndexInfo()
{
  index_job.LoadDefaultIndexInfo();
}

function GetIndexPathFromName(index_name)
{
  var index_path = index_job.IndexPathForIndex(index_name);
  return index_path;
}

function SetIndexSelections(indexes)
{
  for(index in indexes)
  {
    if(indexes[index] == "true")
	  SetIndexSelection(index, true);
	else
	  SetIndexSelection(index, false);
  }
}

function GetSelectedIndexNames()
{
  try
  {
    var safe_array = index_job.AllSelectedIndexDBs;
    var js_array = SafeArrayToJsArray(safe_array);
  }
  catch(e)
  {
    alert(/*IDS_E_GETSELECTEDINDEXNAME_FAIL*/"GetSelectedIndexNames() misslyckades");
  }
  
  // if only one element with empty string,
  // it means 'non-value' (needed to do this way
  // because SafeArrayToJsArray() assumes safearray
  // as an input
  if(js_array.length == 1 && js_array[0] == "")
    js_array = new Array();

  return js_array;
}

function GetNumOfSelectedIndexes()
{
  var indexes = GetSelectedIndexNames();
  return indexes.length;
}

function SetIndexSelection(index_name, selection)
{
  try
  {
    index_job.IsSelected(index_name) = selection;
  }
  catch(e)
  {
    alert(/*IDS_E_SETINDEXSELECTION_FAIL*/"SetIndexSelection() misslyckades");
  }
}

function GetIndexSelection(index_name)
{
  try
  {
    return index_job.IsSelected(index_name);
  }
  catch(e)
  {
    alert(/*IDS_E_GETINDEXSELECTION_FAIL*/"GetIndexSelection() misslyckades");
  }
}

// get unique Index Database Name based on
// suggested name.  If suggested name already
// exists, numeral is appended to it.
// For example, "My Database" is suggested but
// already exists, "My Database 1" is returned.
// If both of these names exists, "My Database 2"
// is returned and so on.
function GetUniqueIndexName(suggested_name)
{
  var index_names = GetIndexNames();  
  var candidate_name = suggested_name;
  var duplicate = false;
  var numeral = 2;
  
  while(true)
  {
	duplicate = false;	
    for(var i = 0; i < index_names.length; i++)
    {
      if(index_names[i] == candidate_name)
	  {
	    duplicate = true;
	    break;
	  }
    }
	
	if(!duplicate)
	  break;
	
	candidate_name = suggested_name + " " + numeral;
	numeral++;
  }
  
  return candidate_name;
}

// display index error that is severe enough to
// terminate indexing without updating corresponding
// Index Database
function DisplaySevereIndexError(index_name, error_code)
{
  var text = "";
  var severe_error = true;
  
  switch(error_code)
  {
    case 1:		// could not access index file
	  text += /*IDS_E_CODE_1_1*/"Skmotorn kunde inte n '";
	  text += index_name;
	  text += "'.\n";
	  text += /*IDS_E_CODE_1_2*/"Kontrollera att Indexdatabasen som angivits inte har flyttats/raderats.";
      break;
	case 2:		// insufficient disk space
	  text += /*IDS_E_CODE_2_1*/"Otillrckligt skivutrymme fr indexering '";
	  text += index_name;
	  text += "'.\n";
	  text += /*IDS_E_CODE_2_2*/"Radera ondiga filer fr att f mer skivutrymme,";
	  text += "\n";
	  text += /*IDS_E_CODE_2_3*/"eller redigera Indexdatabasens instllningar s att";
	  text += "\n";
	  text += "smaller set of documents will be indexed.";  
	  break;
	case 7:	// could not access indexing dir.
	  text += /*IDS_E_CODE_7_1*/"Indexeringskatalogen kunde inte ns fr '";
	  text += index_name;
	  text += "'.\n";
	  text += /*IDS_E_CODE_7_2*/"Kontrollera att katalogen fr Indexplatsen";
	  text += "\n";
	  text += /*IDS_E_CODE_7_3*/"och dess underkataloger flyttas/raderas inte.";
	  break;
	case 177:	// could not update index file
	  text += "'";
	  text += index_name;
	  text += /*IDS_E_CODE_177_1*/"' kunde inte uppdateras.";
	  text += "\n";
	  text += /*IDS_E_CODE_177_2*/"Kontrollera att skrivskyddsattributet inte har aktiverats fr";
	  text += "\n";
	  text += /*IDS_E_CODE_177_3*/"alla filer p Indexplatsen och dess underkataloger.";
	  break;
	default:
	  severe_error = false;
	  break;
  }

  if(severe_error)  
    alert(text);
}

// DO NOT CALL METHODS BELOW THIS COMMENT FROM EXTERNAL FILES.
// CALLING THESE METHODS EXTERNALLY WILL COMPROMISE
// SEPARATION OF SEARCH ENGINE INDEPENDENT AND SPECIFIC
// CODE, RESULTING COMPROMISED MAINTENABILITY.

// internal support methods

// delim must be a single character
function ArrayToString(array_value, delim)
{
  var string_value = "";
  var length = array_value.length;
  
  for(var i = 0; i < length; i++)
  {
    string_value += array_value[i];
	if(i != length - 1)
	  string_value += delim;
  }
  
  return string_value;
}

// delim must be a single character
function StringToArray(string_value, delim)
{
  return string_value.split(delim);
}

// This method is dependent on "vb_utils.js"
function SafeArrayToJsArray(safe_array)
{
  // no element case
  if(safe_array == null)
  {
    var empty_array = new Array(0);
	return empty_array;
  }
  
  // array size not used in VBGetArray()
  var array_size;
  
  var raw_array = VBGetArray(safe_array, array_size);
  var vb_array = new VBArray(raw_array);  
  var js_array = vb_array.toArray();  
  
  return js_array;
}

function JsArrayToSafeArray(js_array)
{
  var num_elements = js_array.length;
  var safe_array = VBCreateArray(num_elements);
  
  for(var i = 0; i < num_elements; i++)
    safe_array = VBSetElement(safe_array, i, js_array[i]);

  return safe_array;
}

function GetDTExtensions(extensions)
{
  var exts_array = extensions.split(" ");
  var length = exts_array.length;
  var exts_str = "";
  
  // special case when list of extension is empty
  if(length == 1 && exts_array[0] == "")
    return exts_str;
	
  for(var i = 0; i < length; i++)
  {
    exts_str += "*" + exts_array[i];
	
	// if no the last one, add space at the end
	if(i < length - 1)
	  exts_str += " ";
  }

  return exts_str;
}

function ExtensionsToPaths(exts_array)
{
  var paths_array = new Array();
  
  if(exts_array == null)
    return null;
  
  for(var i = 0; i < exts_array.length; i++)
    paths_array[i] = "*" + exts_array[i];
	
  return paths_array;
}

function PathsToExtensions(paths_array)
{
  var exts_array = new Array();
  
  if(paths_array == null)
    return null;
	
  for(var i = 0; i < paths_array.length; i++)
    exts_array[i] = paths_array[i].substr(1);
  
  return exts_array;
}

// remove trailing space characters from
// index name
function TrancateName(name)
{
  var len = 0;  
  for(var i = name.length; i > 0; i--)
  {
    if(name.charAt(i-1) != ' ')
	{
	  len = i;
	  break;
	}
  }

  if(len == 0)	// string with just spaces
    return "";  
  return name.substring(0, len);
}

// convert index path name from displayed (no user name
// concatenated) to actual (user name concatenated)
function DisplayPathToIndexPath(display_path)
{
  var index_path = display_path;
  var user_name = GetIndexerUserName();
	
  if(user_name != "")
	index_path = display_path + "\\" + user_name;

  return index_path;
}

// convert index path name form actual (user name concatenated)
// to displayed path (no user name concatenated).
function IndexPathToDisplayPath()
{
  var index_path = index_job.IndexPath;
  var display_path = index_path;
  
  var user_name = GetIndexerUserName();
	
  if(user_name != "")
  {
	var pos = index_path.lastIndexOf("\\");
	if(pos > 0)
	{
	  if(index_path.substring(pos + 1) == user_name)
		display_path = index_path.substring(0, pos);
	}
  }

  return display_path;	
}

// retrieve user name for currently logged on user
function GetIndexerUserName()
{
  try
  {
    return index_job.GetIndexerUserName();
  }
  catch(e)
  {
    alert("GetIndexerUserName: failed.");
	return "";
  }
}
