var scheduler = new ActiveXObject("Scheduler.SDSearchScheduler");
var SCHEDULE_DAILY = 1;
var SCHEDULE_WEEKLY = 2;

// retrieve indexing schedule from Windows Task Scheduler
function GetIndexingSchedule()
{
  try
  {
    // info. in task file must be loaded to
	// populate all properties first
    var loaded = scheduler.LoadSchedule(); 
     
    var values = new Array();

    // if schedule is previously set, load from it
	// if not, retrieve default values
    if(loaded)
	{
	  values["OnOff"] = GetActivationState();
      values["Option"] = GetScheduleOption();
	  
	  if(values["Option"] == "daily")
	  {
        values["Daily/StartTime"] = GetStartTime();
        values["Daily/StartDate"] = GetStartDate();
        values["Daily/Option"] = GetDailyOption();
	  }
	  else if(values["Option"] == "weekly")
	  {  
        values["Weekly/StartTime"] = GetStartTime();
        values["Weekly/StartDate"] = GetStartDate();
        values["Weekly/Sunday"] = GetWeeklyDays(0);
        values["Weekly/Monday"] = GetWeeklyDays(1);
        values["Weekly/Tuesday"] = GetWeeklyDays(2);
        values["Weekly/Wednesday"] = GetWeeklyDays(3);
        values["Weekly/Thursday"] = GetWeeklyDays(4);
        values["Weekly/Friday"] = GetWeeklyDays(5);
        values["Weekly/Saturday"] = GetWeeklyDays(6);
	  }
	}
	else
	  values = GetAppValues("Schedule");
  
    return values;
  }
  catch(e)
  {
    alert("GetIndexingSchedule: loading indexing schedule failed.");
  }
}

// retrieve indexing schedule from Windows Task Scheduler
// only if currently daily option is selected.  Otherwise,
// retrieve default values.
function GetDailyIndexingSchedule()
{
  try
  {
    // info. in task scheduler must be loaded first
    var loaded = scheduler.LoadSchedule();      
    var values = new Array();

    // if schedule is previously set and daily option is set,
	// load from it.
	// if not, retrieve default values.
    if(loaded)
	{
	  if(GetScheduleOption() == "daily")
	  {
        values["StartTime"] = GetStartTime();
        values["StartDate"] = GetStartDate();
        values["Option"] = GetDailyOption();
	  }
	  else
	    values = GetAppValues("Schedule/Daily");
	}
	else
	  values = GetAppValues("Schedule/Daily");
  
    return values;
  }
  catch(e)
  {
    alert("GetDailyIndexingSchedule: loading daily schedule failed.");
  }
}

// save indexing schedule to Windows Task Scheduler
function SetIndexingSchedule(values)
{
  try
  {
    // populate all relevant properties of scheduler first
	SetActivationState(values["OnOff"]);
    SetScheduleOption(values["Option"]);
  
    if(values["Option"] == "daily")
    {
      SetStartDate(values["Daily/StartDate"]);
      SetStartTime(values["Daily/StartTime"]);
      SetDailyOption(values["Daily/Option"]);
    }
    else if(values["Option"] == "weekly")
    {
      SetStartDate(values["Weekly/StartDate"]);
      SetStartTime(values["Weekly/StartTime"]);
	  
      // need to reset first, then populate each bit
      ResetWeeklyDays();
      SetWeeklyDays(values["Weekly/Sunday"], 0);
      SetWeeklyDays(values["Weekly/Monday"], 1);
      SetWeeklyDays(values["Weekly/Tuesday"], 2);
      SetWeeklyDays(values["Weekly/Wednesday"], 3);
      SetWeeklyDays(values["Weekly/Thursday"], 4);
      SetWeeklyDays(values["Weekly/Friday"], 5);
      SetWeeklyDays(values["Weekly/Saturday"], 6);
    }
    else
      alert("SetIndexingSchedule: invalid schedule option.");

    // save schedule into a task file
    var saved = scheduler.SaveSchedule();
	
	// return true/false to indicate success
	return saved;
  }
  catch(e)
  {
    alert("SetIndexingSchedule: saving indexing schedule failed.");
  }
}

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

function GetActivationState()
{
  var state = scheduler.Active;
   
  if(state)
    return "on";
  return "off";
}

function SetActivationState(state)
{
  if(state == "on")
    scheduler.Active = true;
  else if(state == "off")
    scheduler.Active = false;
  else
    alert("SetActive : invalid state specified.");
}

// schedule option must be either 'daily' or 'weekly'
function GetScheduleOption()
{
  var option = scheduler.ScheduleOption;
  
  if(option == SCHEDULE_DAILY)
    return "daily";
  else if(option == SCHEDULE_WEEKLY)
    return "weekly";
  else
    alert("GetScheduleOption: invalid schedule option.");
		
  return "";
}

// schedule option must be either 'daily' or 'weekly'
function SetScheduleOption(option)
{
  if(option == "daily")
    scheduler.ScheduleOption = SCHEDULE_DAILY;
  else if(option == "weekly")
    scheduler.ScheduleOption = SCHEDULE_WEEKLY;
  else
    alert("SetScheduleOption: invalide schedule option.");
}

// retrieve time.  Time is in HH:MM:SS format
// except that seconds are always "00" because
// this part is not saved.
function GetStartTime()
{
  var start_time =
    scheduler.StartHour + ":" +
	scheduler.StartMinute + ":" +
	"00";

  return start_time;
}

// save time.  Only hour and minute part of
// time is saved (not seconds).
function SetStartTime(time)
{
  var time_array = time.split(":");
  if(time_array.length < 3)
  {
    alert("SetStartTime: invalid format.");
	return;
  }
  
  // -0 is appended to convert string to number
  scheduler.StartHour = time_array[0] - 0;
  scheduler.StartMinute = time_array[1] - 0;
}

// retrieve start date.  Date is in
// MM/DD/YYYY format.
function GetStartDate()
{
  var start_date =
    scheduler.StartMonth + "/" +
	scheduler.StartDay + "/" +
	scheduler.StartYear;
	
  return start_date;
}

// save start date.
function SetStartDate(date)
{
  var date_array = date.split("/");
  if(date_array.length < 3)
  {
    alert("SetStartDate: invalid format.");
	return;
  }
  
  // -0 is appended to convert string to number
  scheduler.StartMonth = date_array[0] - 0;
  scheduler.StartDay = date_array[1] - 0;
  scheduler.StartYear = date_array[2] - 0;
}

// daily option is an interval of days
// task is performed (1 to 7)
function GetDailyOption()
{
  return scheduler.DailyInterval;
}

// daily option is an interval of days
// task is performed (1 to 7)
function SetDailyOption(option)
{
  // -0 needed to convert string to number
  scheduler.DailyInterval = option - 0;
}

// examines whether corresponding day of the week
// is selected. 'num' specifies number of days from
// Sunday (ex. Monday=1, Tuesday=2 ... Saturday=6).
function GetWeeklyDays(num)
{
  if(num < 0 || num > 6)
  {
    alert("GetWeeklyDays: 'day of the week' out of range.");
	return "false";
  }
  
  var days = scheduler.WeeklyDays;
  var day_mask = 1;
  
  if(days & (day_mask << num))
    return "true";
  return "false";
}

// ResetWeeklyDays() must be called prior to calling
// this method so that all bits are cleared.
// 'num' specifies number of days from Sunday
// (ex. Monday=1, Tuesday=2 ... Saturday=6).
function SetWeeklyDays(bool_str, num)
{
  if((bool_str != "true") && (bool_str != "false"))
  {
    alert("SetWeeklyDays: invalid boolean string.");
	return;
  }
  
  if(num < 0 || num > 6)
  {
    alert("SetWeeklyDays: 'day of the week' out of range.");
	return;
  }

  if(bool_str == "true")
  {
    var day_mask = 1;
    scheduler.WeeklyDays += (day_mask << num);
  }
}

// this method must be called prior to SetWeeklyDays
// to make sure that no bits are set.
function ResetWeeklyDays()
{
  scheduler.WeeklyDays = 0;
}
