/******************************************************************

Copyright © Global Knowledge Software LLC 2007.  All Rights Reserved.

This program is protected by U.S. and International Copyright and
Patent Laws.  Unauthorized duplication and/or distribution of this
program is strictly prohibited. Distribution and duplication of this
program are limited by license. If you do not currently have a valid
license from Global Knowledge for this program, any copying or
distribution of the program is unauthorized.  If you do have a current
license from Global Knowledge to utilize this program, your use is
strictly limited by the terms of that license.

Patent Pending.

******************************************************************/

///////////////////////////////////////////////////////////////////////////////
// static variables

var systemLoading       = true;
var bLoadMain           = 0;
var bLoadBanner         = 0;
var bLoadForm           = 0;
var bLoadTree           = 0;
var bLoadLeadConc       = 0;

var systemSearchEnabled = true;
var systemContentVersion= "";
var systemApps          = new Array;
var systemFatPlayer     = "";
var systemFirstTitle    = "";
var systemCookie        = new Cookie(document,"OnDemandToc",365);
var systemMainCols      = "357";
var systemInnerRows     = "*";
var systemRoles         = new Array;
var systemCtxTracking   = false;
var systemWindowLeft    = 0;
var systemWindowTop     = 0;
var systemWindowWidth   = 600;
var systemWindowHeight  = 400;
var systemRootPath;
var systemTest          = false;

systemRootPath=decodeURI(window.location.href);
while (systemRootPath.indexOf('\\')!=-1)
	systemRootPath=systemRootPath.replace('\\','/');
systemRootPath=systemRootPath.substr(0,systemRootPath.lastIndexOf("/")+1);

///////////////////////////////////////////////////////////////////////////////
// state variables

var stateCurrentApp     = "";
var stateLastValidApp   = "";
var stateView           = "";
var stateCurrentCtxOd   = "";
var stateCurrentCtxEx   = ""; 
var stateAvailableApps  = new Array;
var stateSearchTerm     = "";
var stateExpandOutline  = false;
var stateExpandedItems  = new Array;
var stateExpandSelected = "";
var stateFirstSetContext= false;


function TreeSelection()
{
	this.type="";
	this.path="";
	this.modes="";
}

TreeSelection.prototype.Reset = function()
{
	this.type="";
	this.path="";
	this.modes="";
}

var stateSelection = new TreeSelection();

///////////////////////////////////////////////////////////////////////////////
// search: user roles to topics query
var userArrTopicsToRoles = new Array;
var stateOutlineTreeLoadable = false;
var stateObjOutlineTree = null;

function QueryTopicsToRoles(role_array)
{
   var strQuery = "r";
   for (var i in role_array)
      strQuery += ("'" + role_array[i] + "'" + "-");
   
   strQuery += ("'$'");
   
   QueryParser.Parse("URI", strQuery);
   if (QueryParser.ev)
   {
      QueryProcessor.Start(QueryParser.ev, result_QueryTopicsToRoles);
   }
}

function result_QueryTopicsToRoles(topic_array)
{
   userArrTopicsToRoles = new Array();
   if (topic_array.length > 0)
   {
      for (var i in topic_array) 
      {
         userArrTopicsToRoles[topic_array[i]] = 1;
      }
   }

   var qr=false;
   if (systemLoading==true && systemCtxTracking==true)
   {
      if (stateCurrentCtxEx)
      {
         QueryTopicsToECIDs(stateCurrentCtxEx);
         qr=true;
      }
      else if (stateView=="applicable")
      {
         if (stateCurrentCtxOd)
           QueryTopicsToUCIDs(stateCurrentCtxOd);
         else
           stateFirstSetContext=true;
         qr=true;
      }
   }
   if (qr==false)
   {  
      if (stateObjOutlineTree)
         stateObjOutlineTree.location.replace(systemRootPath+"toc/outline.html");
      stateOutlineTreeLoadable = true;
   }
  
   // Test for Attila
   if (systemTest)
   {
      stateView = "applicable";
      QueryTopicsToUCIDs(stateCurrentCtxOd);
   }
}

///////////////////////////////////////////////////////////////////////////////
// search: UCID to topics query - applicable - current context search
var userArrTopicsToUCIDs = new Array;

function QueryTopicsToUCIDs(current_context)
{
   var arrUCID = current_context.split("+");
   var strQuery = "u";
   for (var i in arrUCID)
      strQuery += ("'" + arrUCID[i] + "'" + "-");
   
   strQuery = strQuery.substring(0,strQuery.length-1);

   QueryParser.Parse("URI", strQuery);
   if (QueryParser.ev)
   {
      QueryProcessor.Start(QueryParser.ev, result_QueryTopicsToUCIDs);
   }
   else
   {
      if (stateObjOutlineTree)
         stateObjOutlineTree.location.replace(systemRootPath+"toc/outline.html");
      stateOutlineTreeLoadable = true;
   }
}

function result_QueryTopicsToUCIDs(topic_array)
{
   userArrTopicsToUCIDs = new Array();
   stateAvailableApps = new Array;
   if (topic_array.length > 0)
   {
      for (var i in topic_array) 
      {
         userArrTopicsToUCIDs[topic_array[i]] = 1;
         var I = GetSystemAppToTopic(topic_array[i]);
         if (I==-1) continue;
         for (var g=0; g<stateAvailableApps.length; g++ )
         {
            if (systemApps[I].folder==stateAvailableApps[g].folder)
               break;
         }
         if (g==stateAvailableApps.length)
            stateAvailableApps[stateAvailableApps.length] = new objApplication(systemApps[I].folder,systemApps[I].title,systemApps[I].mappingmode,systemApps[I].first_topic_index,systemApps[I].last_topic_index);
      }
   }
   
   if (stateObjOutlineTree)
      stateObjOutlineTree.location.replace(systemRootPath+"toc/outline.html");
   stateOutlineTreeLoadable = true;
}

//////////////////////////////////////////////////////////////////////////////////////
// search: ECID to topics query - applicable - external context (given in URL) search
var userArrTopicsToECIDs = new Array;

function QueryTopicsToECIDs(current_external_context)
{
   var strQuery = "e";
   strQuery += current_external_context;
   QueryParser.Parse("URI", strQuery);
   if (QueryParser.ev)
   {
      QueryProcessor.Start(QueryParser.ev, result_QueryTopicsToECIDs);
   }
   else
   {
      if (stateObjOutlineTree)
         stateObjOutlineTree.location.replace(systemRootPath+"toc/outline.html");
      stateOutlineTreeLoadable = true;
   }   
}

function result_QueryTopicsToECIDs(modified_topic_array)
{
   userArrTopicsToECIDs = new Array();
   topic_array = new Array();
   if (modified_topic_array.length)
   {
		var b=0;
		var topic_index;
		topic_array[0] = Math.floor(modified_topic_array[0]/1000);
		for (var k in modified_topic_array)
		{
			topic_index = Math.floor(modified_topic_array[k]/1000);
			if (topic_array[b]!=topic_index)
			{
				b++;
				topic_array[b] = topic_index;
			}
		}
   }
   
   stateAvailableApps = new Array;
   if (topic_array.length > 0)
   {
      for (var i in topic_array) 
      {
         userArrTopicsToECIDs[topic_array[i]] = 1;
/*
         var I = GetSystemAppToTopic(topic_array[i]);
         if (I==-1) continue;
         for (var g=0; g<stateAvailableApps.length; g++ )
         {
            if (systemApps[I].folder==stateAvailableApps[g].folder)
               break;
         }
         if (g==stateAvailableApps.length)
            stateAvailableApps[stateAvailableApps.length] = new objApplication(systemApps[I].folder,systemApps[I].title,systemApps[I].mappingmode,systemApps[I].first_topic_index,systemApps[I].last_topic_index);
*/            
      }
      // Using the userArrTopicsToUCIDs array as a result
      userArrTopicsToUCIDs = userArrTopicsToECIDs
      ApplicableAvailableApps();
   }
   
   if (stateObjOutlineTree)
      stateObjOutlineTree.location.replace(systemRootPath+"toc/outline.html");
   stateOutlineTreeLoadable = true;
}

function ApplicableAvailableApps()
{
	for (var i in userArrTopicsToUCIDs)
	{
		var I = GetSystemAppToTopic(i);
		if (I==-1) continue;
		for (var g=0; g<stateAvailableApps.length; g++ )
		{
			if (systemApps[I].folder==stateAvailableApps[g].folder)
				break;
		}
		if (g==stateAvailableApps.length)
			stateAvailableApps[stateAvailableApps.length] = new objApplication(systemApps[I].folder,systemApps[I].title,systemApps[I].mappingmode,systemApps[I].first_topic_index,systemApps[I].last_topic_index);
	}
/*	
*/
}

///////////////////////////////////////////////////////////////////////////////
// search: text to topics query
var userArrTopicsToText = new Array;

function QueryTopicsToText(user_search_exp)
{
   QueryParser.Parse("EXPR", user_search_exp);
   if (QueryParser.ev)
   {
      QueryProcessor.Start(QueryParser.ev, result_QueryTopicsToText);
   }
}

function result_QueryTopicsToText(topic_array)
{
   userArrTopicsToText = new Array();
   stateAvailableApps = new Array;
   if (topic_array.length > 0)
   {
      for (var i in topic_array)
      {
         userArrTopicsToText[topic_array[i]] = 1;
         var I = GetSystemAppToTopic(topic_array[i]);
         if (I==-1) continue;
         for (var g=0; g<stateAvailableApps.length; g++ )
         {
            if (systemApps[I].folder==stateAvailableApps[g].folder)
               break;
         }
         if (g==stateAvailableApps.length)
            stateAvailableApps[stateAvailableApps.length] = new objApplication(systemApps[I].folder,systemApps[I].title,systemApps[I].mappingmode,systemApps[I].first_topic_index,systemApps[I].last_topic_index);
      }
   }
   window.mainframe.outlineframe.outlinetree.location.reload();
}

// returning with systemApps index
function GetSystemAppToTopic(topic_index)
{
   var k=0;
   for (k in systemApps)
   {
      if (systemApps[k].first_topic_index<=topic_index && topic_index<=systemApps[k].last_topic_index)
         break;
   }
   if (k==systemApps.length)
      k=-1;
   return k;
}

///////////////////////////////////////////////////////////////////////////////
// System.js functions

function objApplication(app_folder, app_title, mapping_mode, first_topic_index, last_topic_index)
{
	this.folder=app_folder;
	this.title=app_title;
	this.mappingmode=mapping_mode;
	this.first_topic_index=first_topic_index;
	this.last_topic_index=last_topic_index;
}

function ondemandContentVersion(ver)
{
	systemContentVersion=ver;
}

function ondemandTitle(title_name, app_folder, mapping_mode, first_topic_index, last_topic_index)
{
	systemApps[systemApps.length]=new objApplication(app_folder,title_name,mapping_mode,first_topic_index,last_topic_index);
	if (systemFirstTitle=="")
		systemFirstTitle=app_folder;
}

function ondemandRelatedApp(app_folder)
{
	systemApps[systemApps.length]=new objApplication(app_folder,"","",false);
}

function ondemandRole(role)
{
	systemRoles[systemRoles.length]=role;
}

function GetTitleIndex(app_folder)
{
	for (var i=0; i<systemApps.length; i++)
	{
		if (systemApps[i].folder==app_folder)
			return i;
	}
	
	return -1;
}

function IsTitle(app_folder)
{
	return (GetTitleIndex(app_folder)!=-1);
}

function GetApplicationIndex(app_folder)
{
	for (var i=0; i<systemApps.length; i++)
	{
		if (systemApps[i].folder==app_folder)
			return i;
	}
	
	return -1;
}

function IsApplication(app_folder)
{
	return (GetApplicationIndex(app_folder)!=-1);
}

function Preferences()
{
	OpenPreferencesDialog(systemRootPath.substr(0,systemRootPath.length-1));
}

function Roles()
{
	OpenRolesDialog(systemRootPath.substr(0,systemRootPath.length-1));
}

function ToggleRoles()
{
	ToggleRoleFiltering(systemRootPath.substr(0,systemRootPath.length-1));
}

///////////////////////////////////////////////////////////////////////////////
// Event handlers

function SetAppListToAll()
{
	stateAvailableApps.length=0;
	for (var i=0; i<systemApps.length; i++)
	{
		stateAvailableApps[stateAvailableApps.length]=new objApplication(systemApps[i].folder,systemApps[i].title,systemApps[i].mappingmode,systemApps[i].first_topic_index,systemApps[i].last_topic_index);
	}
	if (stateCurrentApp=="")
		stateCurrentApp=(stateLastValidApp!="")?stateLastValidApp:systemFirstTitle;
	window.mainframe.outlineframe.outlineform.UpdateAppList();
}

function SetViewAll()
{
	if (systemApps.length==0)
		return;

	if (stateView!="all")
		SetAppListToAll();
	ClearSearch();

	stateView="all";
	window.mainframe.outlineframe.outlineform.UpdateView();
	window.mainframe.outlineframe.outlinetree.location.reload();
}

function SetViewApplicable()
{
	if (systemApps.length==0)
		return;

	stateAvailableApps.length=0;
	ApplicableAvailableApps();
	stateCurrentCtxOd = "@&#";
	ClearSearch();

	stateView="applicable";
	window.mainframe.outlineframe.outlineform.UpdateView();
	window.mainframe.outlineframe.outlinetree.location.reload();
}

function DoSearch()
{
	if (stateView!="search")
		return;
			
	if (stateSearchTerm.indexOf("'")!=-1)
	{
		alert(R_search_invalid_char);
		return;
	}
			
	stateSearchResults="";
	QueryTopicsToText(stateSearchTerm);
}

function ClearSearch()
{
	stateSearchTerm="";
	window.mainframe.outlineframe.outlineform.document.viewform.searchtext.value="";
}

function SetViewSearch()
{
	if (systemApps.length==0)
		return;

	if (stateView!="all")
		SetAppListToAll();

	stateView="search";
	window.mainframe.outlineframe.outlineform.UpdateView();
	window.mainframe.outlineframe.outlineform.document.viewform.searchtext.focus();
	if (stateSearchTerm!="")
		DoSearch();
	else
	{
		window.mainframe.outlineframe.SizeOutlineForm();
		if (systemFatPlayer!="")
			FatPlayerCommand("SetCurrentView","View="+stateView);
		else
			systemCookie.LastView=stateView;
	}
}

function SearchKeyEvent(key)
{
	return window.mainframe.outlineframe.outlineform.KeyEvent(key);
}

function SetCurrentApp(new_app)
{
	if (new_app!=stateCurrentApp)
	{
		stateCurrentApp=new_app;
		window.mainframe.outlineframe.outlinetree.location.reload();
	}
}

function loading_finished()
{
	attach_event_handlers(window);
	outline_tree_loaded(false);
	window.tocbanner.Update();
	window.mainframe.outlineframe.outlineform.UpdateView();
	window.mainframe.outlineframe.outlineform.UpdateAppList();
	window.mainframe.outlineframe.SizeOutlineForm();
	systemLoading=false;
	window.mainframe.outlineframe.outlinetree.SelectTopItem();
	document.onstop=null;
	window.focus();

	if(stateSearchTerm != "")
	{
		stateView="search";
		window.mainframe.outlineframe.outlineform.viewform.searchtext.value=stateSearchTerm;
		window.mainframe.outlineframe.outlineform.OnSearchExpChange();
		window.mainframe.outlineframe.outlineform.DoSearch();
		window.mainframe.outlineframe.outlineform.document.all["All"].checked = false;
		window.mainframe.outlineframe.outlineform.document.all["Search"].checked = true;
		//stateSearchTerm="a";
	}
}

function check_all_loaded(flag_name)
{
	if (!systemLoading)
		return;

	eval("bLoad"+flag_name+"++");
	if (bLoadMain && bLoadBanner && bLoadForm && bLoadTree && bLoadLeadConc>1)
		setTimeout("loading_finished()",1000);
}

function outline_tree_loaded(reset_selection)
{
	if (!systemLoading && stateView!="all")
		window.mainframe.outlineframe.outlineform.UpdateAppList();
	if (stateCurrentApp!="")
		stateLastValidApp=stateCurrentApp;
	if (!systemLoading && reset_selection)
	{
		stateSelection.Reset();
		window.tocbanner.Update();
		window.mainframe.conceptframe.concept.location=systemRootPath+"toc/empty.html";
		window.mainframe.leadinframe.leadin.location=systemRootPath+"toc/empty.html";
		window.mainframe.outlineframe.SizeOutlineForm();
	}
	if (systemFatPlayer!="")
	{
		FatPlayerCommand("SetCurrentApp","App="+stateCurrentApp);
		FatPlayerCommand("SetCurrentView","View="+stateView);
	}
	else
	{
		var a=GetTitleIndex(stateCurrentApp);
		if (a==-1) 
			document.title=player_name;
		else
			document.title=player_name + " - " + systemApps[a].title;
		systemCookie.LastApplication=stateLastValidApp;
		systemCookie.LastView=stateView;
	}
	if (!systemLoading)
		attach_event_handlers(window.mainframe.outlineframe.outlinetree);
}

function OutlineTreeLoaded(reset_selection)
{
	if (systemLoading)
		check_all_loaded("Tree");
	else
		outline_tree_loaded(reset_selection);
}

function OutlineFormLoaded()
{
	check_all_loaded("Form");
}

function BannerLoaded()
{
	check_all_loaded("Banner");
}

function LeadConcLoaded(wnd)
{
	if (!systemLoading)
		attach_event_handlers(wnd);
	else
		check_all_loaded("LeadConc");
}

function OnTreeItemSelect(type,path,modes)
{
	stateSelection.Reset();
	stateSelection.type=type;
	stateSelection.path=path;
	var fat_param="";

	if (systemFatPlayer=="")
	{
		var n=modes.indexOf("D");
		if (n!=-1)
			modes=modes.substr(0,n)+"G"+modes.substr(n+1);
	}
	else
	{
		fat_param="#FATPLAYER="+systemFatPlayer;
	}

	stateSelection.modes=modes;
	if (type=="M")
		window.mainframe.conceptframe.concept.location=systemRootPath+stateCurrentApp+"/"+path+"/MODBASE/CONCEPT.HTML"+fat_param;
	else
		window.mainframe.conceptframe.concept.location=systemRootPath+stateCurrentApp+"/"+path+"/CONCEPT.HTML"+fat_param;
	if (type=="T")
		window.mainframe.leadinframe.leadin.location=systemRootPath+stateCurrentApp+"/"+path+"/LEADIN.HTML"+fat_param;
	else
		window.mainframe.leadinframe.leadin.location=systemRootPath+"toc/empty.html";
	window.tocbanner.Update();
}

function OnUpdatePreferences(NewUserPrefs)
{
	UserPrefs.Copy(NewUserPrefs);
}

function OnUpdateRoles(NewUserRoles)
{
	var bUpdateToc=(UserRoles.Filtering!=NewUserRoles.Filtering);
	if (!bUpdateToc && UserRoles.Filtering && UserRoles.Roles.join("+")!=NewUserRoles.Roles.join("+"))
		bUpdateToc=true;
	UserRoles.Copy(NewUserRoles);
	window.mainframe.outlineframe.outlinehead.UpdateFilterIndicator();

	if (bUpdateToc)
	{
		window.mainframe.outlineframe.outlinetree.SaveOpenElements();
		QueryTopicsToRoles(UserRoles.Roles);
	}
}

function SavePositions()
{
	systemWindowLeft   = window.screenLeft-4;
	systemWindowTop    = window.screenTop-30;
	systemWindowWidth  = document.body.clientWidth;
	systemWindowHeight = document.body.clientHeight;
}

function window_onload()
{
	if (systemFatPlayer=="")
	{
		SavePositions();
		setInterval("SavePositions()",1000);
	}
	else
	{
		FatPlayerCommand("LoadComplete");
		setTimeout("window.mainframe.outlineframe.outlineform.refresh_main()",500);
	}
	check_all_loaded("Main");
}

function window_onunload()
{
	if (systemFatPlayer=="")
	{
		systemCookie.MainCols=systemMainCols;
		systemCookie.InnerRows=systemInnerRows;
		systemCookie.TocLeft=systemWindowLeft;
		systemCookie.TocTop=systemWindowTop;
		systemCookie.TocWidth=systemWindowWidth;
		systemCookie.TocHeight=systemWindowHeight;
		systemCookie.Store();
	}
}

///////////////////////////////////////////////////////////////////////////////
// Functions called by the fat player

function SetContext(context_list)
{
	if (!systemLoading || stateFirstSetContext)
	{
		if (context_list!=stateCurrentCtxOd || stateFirstSetContext)
		{
			stateFirstSetContext=false;
			stateCurrentCtxOd=context_list;
			if (stateView=="applicable")
				QueryTopicsToUCIDs(stateCurrentCtxOd);
		}
	}
}

function JumpIn(paramstr)
{
	if (paramstr.length==1)
		window.tocbanner.StartPlay(paramstr);
	else
		window.tocbanner.StartPlay(paramstr.substr(0,1),paramstr.substr(1));
}
