// global data instantiation
var io_support = new ActiveXObject("IOSupport.SDFileSupport");

// Session-Level Data Persistency Support Methods

// set value for specified context's specified name-value pair
function SetValue(context_id, name_id, value)
{
  var context_name = context_id + "/" + name_id;
  window.external.SetPersistentData(context_name, value);
}

// set values for a specified context, all values for the context is saved
// in an array (values)
function SetValues(context_id, values)
{  
  for(var name in values)
    SetValue(context_id, name, values[name]);
}

// retrieve a value for specified context's specified name
function GetValue(context_id, name_id)
{
  var context_name = context_id + "/" + name_id;
  return window.external.GetPersistentData(context_name);
}

// retrieve all name-value pairs for a specified context
function GetValues(context_id)
{
  var retStrings = GetAllPersistentData();
  values = new Array();
  
  // for each name-value pair, if it is in specified context,
  // add to the array, then return the entire array of name-value pair
  // for the context.
  for(var i = 0; i < retStrings.length; i++)
  {
	var context_name_value = GetNameValueArray(retStrings[i]);
	var context_name = context_name_value[0];

	var len = context_id.length;
	if(context_name.slice(0, len) != context_id)
	  continue;
	  
	if(context_id != "")
	  len++;	  
	var sub_context_name = context_name.slice(len);
	  
	var value = context_name_value[1];
	values[sub_context_name] = value;
  }
  
  return values;
}

// clear a specified context's specified name's value
function ResetValue(context_id, name_id)
{
  SetValue(context_id, name_id, "");
}

// clear all name-value pair for a specified context
function ResetValues(context_id)
{
  var values = GetValues(context_id);
  for(name in values)
    SetValue(context_id, name, "");
}

function DeleteValue(context_id, name_id)
{
  window.external.DeletePersistentData(context_id + "/" + name_id); 
}

function DeleteValues(context_id)
{
  var values = GetValues(context_id);
  for(name in values)
    DeleteValue(context_id, name);
}

function GetContexts(context_id)
{
  var retStrings = GetAllPersistentData();
  contexts = new Array();
  
  for(var i = 0; i < retStrings.length; i++)
  {
	var context_name_value = GetNameValueArray(retStrings[i]);
	var context_name = context_name_value[0];
		
	var len = context_id.length;
	if(context_name.slice(0, len) != context_id)
	  continue;
	
	if(context_id != "")
	  len++;
	var sub_context_name = context_name.slice(len);
	var sub_context = sub_context_name.split("/");
	  
	var name = sub_context[0];
	contexts[name] = name;	// for contexts, name is also value
  }
  
  return contexts;
}

// Application-Level Data Persistency Support Methods

function SetAppValue(context_id, name_id, value)
{
  var values = new Array(1);
  values[name_id] = value; 
  SetAppValues(context_id, values); 
}

function SetAppValues(context_id, values)
{
  var num_elements = 0;
  for(var val in values)
    num_elements++;
  	
  var vb_array = VBCreateArray(num_elements);
  var index = 0;

  for(var name in values)
  {
    var context_name = context_id + "/" + name;
	var value = context_name + ":" + values[name];
    vb_array = VBSetElement(vb_array, index++, value);
  }

  //window.external.SaveSettings(vb_array);
  io_support.SaveSettings(vb_array);
}

function GetAppValue(context_id, name_id)
{
  var values = GetAppValues(context_id);
  var value = "";
  
  for(name in values)
  {
    if(name == name_id)
	{
	  value = values[name];
	  break;
	}
  }
  return value;
}

function GetAppValues(context_id)
{
  var retStrings = GetAllAppPersistentData();
  values = new Array();
  
  // for each name-value pair, if it is in specified context,
  // add to the array, then return the entire array of name-value pair
  // for the context.
  for(var i = 0; i < retStrings.length; i++)
  {
	var context_name_value = GetNameValueArray(retStrings[i]);
	var context_name = context_name_value[0];

	var len = context_id.length;
	if(context_name.slice(0, len) != context_id)
	  continue;
	  
	if(context_id != "")
	  len++;	  
	var sub_context_name = context_name.slice(len);
	  
	var value = context_name_value[1];
	values[sub_context_name] = value;
  }
  
  return values;
}

function DeleteAppValue(context_id, name_id)
{
  var values = new Array(1);
  values[name_id] = GetAppValue(context_id, name_id); 
  DeleteAppValues(context_id, values); 
}

function DeleteAppValues(context_id)
{
  var values = GetAppValues(context_id);
  var names = new Array();
  var index = 0;
  
  for(var value in values)
    names[index++] = context_id + "/" + value;
  
  var safe_array = JsArrayToSafeArray(names); 
  window.external.DeleteSettings(safe_array);
}

function GetAppContexts(context_id)
{
  var retStrings = GetAllAppPersistentData();
  contexts = new Array();
  
  for(var i = 0; i < retStrings.length; i++)
  {
	var context_name_value = GetNameValueArray(retStrings[i]);
	var context_name = context_name_value[0];
		
	var len = context_id.length;
	if(context_name.slice(0, len) != context_id)
	  continue;
	
	if(context_id != "")
	  len++;
	var sub_context_name = context_name.slice(len);
	var sub_context = sub_context_name.split("/");
	  
	var name = sub_context[0];
	contexts[name] = name;	// for contexts, name is also value
  }
  
  return contexts;
}

// Internal Helper Methods for Session and Application Persistency

function GetAllPersistentData()
{
  var persist_data = VBGetAllPersistentData();
  var vb_array = new VBArray(persist_data);
  var js_array = vb_array.toArray();
  	
  return js_array;
}

function GetAllAppPersistentData()
{
  //var persist_data = VBGetAllAppPersistentData();
  var safe_array = io_support.LoadSettings();
  
  // convert Safearray retrieved to JavaScript array
  var array_size;
  var persist_data = VBGetArray(safe_array, array_size);
  var vb_array = new VBArray(persist_data);
  var js_array = vb_array.toArray();
  	
  return js_array;
}

// Create array for name-value pair delimited by ':'.
// Unlike split(), subsequent occurrence of ':' are
// are ignored (therefore allows ':' within value string).
function GetNameValueArray(name_value_str)
{
  var pos = name_value_str.indexOf(':');
  var name = name_value_str.slice(0, pos);
  var value = name_value_str.slice(pos + 1);
  
  var name_value = new Array(2);
  name_value[0] = name;
  name_value[1] = value;
  
  return name_value;
}

//Func added to fix alphabetical order in in File types
//this func is input to sort() method in GetFileTypes
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;
}

// Data Retrieval Methods

function GetFileTypes()
{
  var type_data = VBGetFileTypes();
  var vb_array = new VBArray(type_data);
  var js_array = vb_array.toArray().sort(compare_caseinsensitive_func);
  var type_array = new Array();
  
  for(var i = 0; i < js_array.length; i++)
  {
    var name_value = GetNameValueArray(js_array[i]);
	var name = name_value[0];
	var value = name_value[1];
	
	type_array[i] = name;
	SetValue("Criteria/Types", name, value);
  }
  
  return type_array;
}

function GetExtensionList()
{
  var extensions = VBGetExtensionList();
  var vb_array = new VBArray(extensions);
  var js_array = vb_array.toArray();

  return js_array;
}

function GetDefaultExtensionList()
{
  var def_exts = VBGetDefaultExtensionList();
  var vb_array = new VBArray(def_exts);
  var js_array = vb_array.toArray();

  return js_array;
}

// Session and Application States Methods

function SetSessionState(new_state)
{
  var state; 
  if(new_state == true)
    state = "true";
  else
    state = "false";
	
  window.external.SetPersistentData("SessionState", state);
}

function GetSessionState()
{
  var saved_state = window.external.GetPersistentData("SessionState");
  
  var state;
  if(saved_state == "true")
    state = true;
  else
    state = false;
	
  return state;
}

function SetApplicationState(new_state)
{
  var values = new Array();
  var state;
  
  if(new_state == true)
    state = "true";
  else
    state = "false";
  values["State"] = state;
  
  SetAppValues("Application", values);
}

function GetApplicationState()
{
  var values = GetAppValues("Application");
  var state = false;
  
  for(name in values)
  {
    if(name == "State")
	{
	  if(values[name] == "true")
	    state = true;
	  else
	    state = false;
	  break;
	}
  }
  
  return state;
}

// Object Persistency Methods
// Note: Do not use these methods.
// These are imcomplete for SLE Engine, and rework needed for DT Search

function SetServer(server)
{
  var server_id = window.external.SaveObject(server);
  SetValue("Session", "Server", server_id);
  //alert("server " + server_id + " saved...");
}

function GetServer()
{
  var server_id = GetValue("Session", "Server");
  var server;
  
  if(server_id == "")
  {
    server = new ActiveXObject("SSEClientSupport.SSEASearchServer");
	//alert("server created...");
  }
  else
  {
    server = window.external.RestoreObject(server_id);
	//alert("server " + server_id + " retrieved...");
  }
  
  return server;
}

// Application-level behavior methods

function RunApplication(file_spec)
{
  window.external.RunApplication(file_spec);
}

function RunSingleApplication(file_spec)
{
  window.external.RunSingleApplication(file_spec);
}

function OnDragStarted(file_spec)
{
  window.external.OnDragStarted(file_spec);
}

function ShowDialog(url, arguments, features)
{
  var retvalue = window.showModalDialog(url, arguments, features);
  //RefleshPage();
  return retvalue; 
}

//function RefleshPage()
//{
  //window.external.RefreshPageSearch();
//}

// Index database related methods

function CreateIndexInFolderView(index_name)
{
  // 2nd param. (path to index db) not used
  window.external.AddNewDataBase(index_name, "");
}

function DeleteIndexInFolderView(index_name)
{
  window.external.DeleteDataBase(index_name);
}

// set currently selected documents
function SetDocumentSelections(paths, state)
{
  // convert full paths to documents into safe array
  var sf_paths = JsArrayToSafeArray(paths);
  window.external.SetSelectionToThumbNailOrIcon(sf_paths, state);
}

function SetFavoriteItems(js_array)
{
  try
  {
    var safe_array = JsArrayToSafeArray(js_array);
    io_support.SaveListItems("favorites", safe_array);
  }
  catch(e)
  {
    alert("SetListItems() failed.");
  }
}

function GetFavoriteItems()
{  
  try
  {
    var safe_array = io_support.LoadListItems("favorites");
    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;
  }
  catch(e)
  {
    alert("GetListItems() failed.");
  }
}

function GetNumOfFavoriteItems()
{
  var items = GetFavoriteItems();
  return items.length;
}
