
function WSSAPIs()
{
}

// Create constants as static class members
WSSAPIs.NONE                   = 90    // OC_REQUEST_PAGE
							 
WSSAPIs.PING                   = 5     // OC_PING
							 
WSSAPIs.CONTENT_DETAILS        = 7     // OC_ECOURSE_DETAILS
WSSAPIs.START_COURSE           = 8     // OC_START_COURSE   
WSSAPIs.PERSONADD              = 9     // OC_STC_PERSONADD
WSSAPIs.STOP_COURSE            = 11    // OC_STOP_COURSE    
WSSAPIs.SCORE                  = 12    // OC_SCORE          
WSSAPIs.CONTENT_INFO           = 13    // OC_SHOW_COURSE_DETAIL_PAGE

WSSAPIs.GETFINALIZECONTENT     = 14    // OC_LC_GETFINALIZECONTENT
WSSAPIs.DOFINALIZECONTENT      = 429   // OC_FINALIZE_CONTENT
	
WSSAPIs.GETMANAGEREMPLOYEELIST = 16    // OC_LC_GETMANAGEREMPLOYEELIST
WSSAPIs.SETEFFECTIVEUSER       = 17    // OC_LC_SETEFFECTIVEUSER
							 
WSSAPIs.REQ_CONNECT_DATA       = 35    // OC_REQUEST_CONNECT_DATA
WSSAPIs.REQ_CONNECT_DATA_SM    = 95    // OC_REQ_CONNECT_DATA_SMALL
							 
WSSAPIs.SET_VARIABLE           = 51    // OC_SET_VARIABLE
WSSAPIs.AICC_EXITAU_RECEIVED   = 69    // OC_AICC_EXITAU_RECEIVED
WSSAPIs.GOTO_QUESTION          = 88    // OC_GOTO_QUESTION

WSSAPIs.DOCHANGEPASSWORD      = 2     // OC_CHANGE_PASSWORD
WSSAPIs.DOCURRENROLL          = 61    // OC_ENROLL_IN_CURRICULUM
WSSAPIs.LISTOFCURRICULUMS     = 96    // OC_REQ_CURRICULUM
WSSAPIs.CURRICULUMCOURSES     = 97    // OC_REQ_COURSES

WSSAPIs.CHATROOMEXIT          = 55    // OC_CHATROOM_EXIT
WSSAPIs.CHATROOMREFRESH       = 56    // OC_CHATROOM_REFRESH
WSSAPIs.LISTOFCHATROOMS       = 57    // OC_REQUEST_CHATROOMS

WSSAPIs.TRANSCRIPT            = 99    // OC_GET_TRANSCRIPT
WSSAPIs.RECCOMP               = 100   // OC_GET_RCT_TRANSCRIPT
WSSAPIs.ROSTERTRANSCRIPT      = 101   // OC_GET_ROSTER_TRANSCRIPT
WSSAPIs.FINALIZECLASSES       = 102   // OC_GET_FINALIZE_TRANSCRIPT

WSSAPIs.SIGNON                = 219   // OC_SIGNON
WSSAPIs.APPLINK               = 220   // OC_APPLINK  // DIRECT URL support only
WSSAPIs.EVALUATECLASSES       = 221   // OC_EVALUATECLASSES
WSSAPIs.EVALUATECLASS         = 222   // OC_EVALUATECLASS
WSSAPIs.DOSIGNON              = 223   // OC_DOSIGNON
WSSAPIs.DOSIGNOFF             = 224   // OC_DOSIGNOFF
WSSAPIs.FINALIZECLASS         = 225   // OC_FINALIZECLASS
WSSAPIs.MAINMENU              = 226   // OC_MAINMENU
WSSAPIs.MYCAL                 = 227   // OC_MYCAL

WSSAPIs.PLAN                  = 229   // OC_GET_PLAN_RECORDS
WSSAPIs.GETPLANNOTE           = 230   // OC_GET_PLAN_NOTE
WSSAPIs.WRITEPLANRECORD       = 231   // OC_WRITE_PLAN_RECORD
WSSAPIs.WRITEPLANNOTE         = 232   // OC_WRITE_PLAN_NOTE
WSSAPIs.BULLETINS             = 233   // OC_BULLETINS
WSSAPIs.NEWS                  = 234   // OC_NEWS
WSSAPIs.HELP                  = 235   // OC_HELP
WSSAPIs.MESSAGE               = 236   // OC_MESSAGE
WSSAPIs.REQUESTS              = 237   // OC_REQUESTS  // DIRECT URL support only
WSSAPIs.VIRTUAL               = 238   // OC_VIRTUAL_IN_PROGRESS

WSSAPIs.PERSONDATA            = 239   // OC_PERSONDATA

WSSAPIs.CLASSROSTER           = 240   // OC_CLASSROSTER
WSSAPIs.PREREQUISITES         = 241   // OC_PREREQUISITES 

WSSAPIs.DORCTSTUDENT          = 242   // OC_DORCTSTUDENT  
WSSAPIs.PERSONUPDATE          = 243   // OC_PERSONUPDATE  

WSSAPIs.DOAREQUEST            = 244   // OC_DOAREQUEST    
WSSAPIs.DOPERSONADD           = 245   // OC_DOPERSONADD   

WSSAPIs.CLASSDETAIL           = 246   // OC_CLASSDETAIL   
WSSAPIs.COURSEDETAIL          = 247   // OC_COURSEDETAIL  
WSSAPIs.DOCLASSSEARCH         = 248   // OC_DOCLASSSEARCH 
WSSAPIs.DOCOURSESEARCH        = 249   // OC_DOCOURSESEARCH
WSSAPIs.VIRTUALCANCEL         = 250   // OC_VIRTUALCANCEL
WSSAPIs.VIRTUALFINISH         = 251   // OC_VIRTUALFINISH
WSSAPIs.WRITEREG              = 254   // OC_WRITEREG       
WSSAPIs.GETINFOSECTION        = 255   // OC_GETINFOSECTION 
WSSAPIs.REGINFO               = 256   // OC_REGINFO        
WSSAPIs.ADDSELFTOGROUP        = 257   // OC_ADDSELFTOGROUP 
WSSAPIs.CLASSSCHEDULE         = 258   // OC_CLASSSCHEDULE  
WSSAPIs.DOFINALIZECLASS       = 259   // OC_DOFINALIZECLASS
WSSAPIs.CLASSATTEND           = 260   // OC_CLASSATTEND    

WSSAPIs.RCTCHECKPERSON        = 268   // OC_RCTCHECKPERSON

WSSAPIs.GET_REGDATA           = 270   // OC_GET_REGDATA
WSSAPIs.VIRTUALREGINFO        = 271   // OC_GET_VIRTUAL_REGINFO
WSSAPIs.CLASSMENU             = 272   // OC_CLASSMENU
WSSAPIs.COURSEMENU            = 273   // OC_COURSEMENU

WSSAPIs.LOAD_CHANGEPWD        = 283   // OC_CHANGEPWD_DIRECT

WSSAPIs.GOTOSE                = 292   // OC_GOTO_SE

WSSAPIs.REQSCOTRACE           = 297   // OC_REQ_SCOTRACE

// Skills-related APIs (added in LMS 5.5)
WSSAPIs.SKILLSTRANSCRIPT      = 298   // OC_LC_SKILLSTRANSCRIPT
WSSAPIs.SKILLSPLAN            = 323   // OC_STC_SKILLSPLAN
WSSAPIs.SKILLS360ASSESSMENTS  = 324   // OC_STC_SKILLS360ASSESSMENTS
WSSAPIs.LOAD_PROFILESEARCH    = 325   // OC_STC_LOAD_PROFILESEARCH
WSSAPIs.SKILLGAPRESOURCES     = 326   // OC_RTS_FN_SKILLGAPRESOURCES
WSSAPIs.SKILLSPLANSKILLS      = 327   // OC_STC_SKILLSPLANSKILLS
WSSAPIs.WRITESKILLSPLANRECORD = 328   // OC_STC_WRITESKILLSPLANRECORD
WSSAPIs.WRITESELFASSESS       = 329   // OC_STC_WRITESELFASSESS
WSSAPIs.DOSKILLSSEARCH        = 330   // OC_STC_DOSKILLSSEARCH
WSSAPIs.GET360ASSESSMENT      = 331   // OC_STC_GET360ASSESSMENT
WSSAPIs.WRITE360ASSESSMENT    = 332   // OC_STC_WRITE360ASSESSMENT
WSSAPIs.DOASSESSORSEARCH      = 333   // OC_STC_DOASSESSORSEARCH
WSSAPIs.DOPROFILESEARCH       = 334   // OC_STC_DOPROFILESEARCH
WSSAPIs.DOPROFILECOMPARE      = 335   // OC_STC_DOPROFILECOMPARE
WSSAPIs.GETSKILLLINKS         = 336   // OC_STC_GETSKILLLINKS

WSSAPIs.GETAPPROVALS          = 376   // OC_STC_GETAPPROVALS
WSSAPIs.WRITEAPPROVEREG       = 377   // OC_STC_APPROVEREG

WSSAPIs.VALIDATEESIG          = 402   // OC_STC_VALIDATEESIG
WSSAPIs.COURSEEQUIVALENTS     = 403   // OC_STC_COURSEEQUIVALENTS

WSSAPIs.DOPROFILEADDTOPLAN    = 446   // OC_DOPROFILEADDTOPLAN


// API Security
function IsInEffectiveUserMode()
	{
	if ( (objCore.oEffectiveUser != null) && !isEmptyString(objCore.oEffectiveUser.yuk) )
		return true;

	return false;
	}

function CanDoReadOnEffectiveUser()
	{
	if ( IsInEffectiveUserMode() )
		{
		if (objCore.oEffectiveUser.isDirect == true)
			return (objCore.nManagerViewDirect == true);
		else if (objCore.oEffectiveUser.isIndirect == true)
			return (objCore.nManagerViewIndirect == true);
		}

	return false;
	}

function CanDoWriteOnEffectiveUser()
	{
	if ( IsInEffectiveUserMode() )
		{
		if (objCore.oEffectiveUser.isDirect == true)
			return (objCore.nManagerEditDirect == true);
		else if (objCore.oEffectiveUser.isIndirect == true)
			return (objCore.nManagerEditIndirect == true);
		}

	return false;
	}

function GetEffectiveString( oStringClass, sMember )
	{
	if ( IsInEffectiveUserMode() )
		return oStringClass.Manager[sMember];
	else // Student
		return oStringClass[sMember];
	}

// Feature-specific "IsEnabled" functions.

function LCIsEnabledClass()
	{
	return this;
	}
var g_IsEnabled = new LCIsEnabledClass();

LCIsEnabledClass.prototype.SignOn = function()
{
	// Check if the SignOn unique key setting is enabled.
    var bEnabled = !isEmptyString(scSignOn.sUniqueKey);
    if (bEnabled)
	{
		// Check if the OverridePassword field is set
		if ( scSignOn.bOverridePassword )
			bEnabled = !isEmptyString(scSignOn.sValidatePassword);
		else
		{
			// Not using password field, check Name...
			if (objCore.nRTSValidateName > 0)
				bEnabled = !isEmptyString(scSignOn.sValidateName);

			// and Password settings
			if (bEnabled)
			{
				if (objCore.fRTSValidatePwd)
					bEnabled = !isEmptyString(scSignOn.sValidatePassword);
			}
		}
	}

	return bEnabled;
}

// Checks if the "standard" password field is being used for Learning Center authentication.
// This is needed by features that are specifically built around the standard password field
// (such as Electronic Signatures).
LCIsEnabledClass.prototype.StandardPwdField = function()
{
	// Check if the SignOn unique key setting is enabled.
    if ( isEmptyString(scSignOn.sUniqueKey) )
		return false;
		
	// Check if the OverridePassword field is set
	if ( scSignOn.bOverridePassword )
		return false;

	// Now check that they system-wide Learning Center password setting is set, and that
	// it is set to the standard password field.
	if (objCore.fRTSValidatePwd && objCore.fRTSStandardPwd)
		return !isEmptyString(scSignOn.sValidatePassword);

	return false;
}

// Features that managers are restricted from doing for someone else

// Private utility functions for checking things that cannot be done in manager-mode.
LCIsEnabledClass.prototype.DoManagerModeCheck = function()
	{
	if ( IsInEffectiveUserMode() )
		return false;
	else // Student
		return true;
	}

// The DoManagerReadCheck is used by a number of functions below, but it is probably a bit
// of overkill.  If the manager does not have "read" privileges on a particular person,
// then they wouldn't be able to set them as the effective user.
LCIsEnabledClass.prototype.DoManagerReadCheck = function( oStringClass, bMember )
	{
	if ( IsInEffectiveUserMode() )
		{
		if ( CanDoReadOnEffectiveUser() )
			return oStringClass.Manager[bMember];
		}
	else // Student
		{
		return oStringClass[bMember]
		}

	return false;
	}

// Ultimately, I'd like to get rid of the "empty string checking" and have boolean
// member variables for all y/n settings.
LCIsEnabledClass.prototype.DoManagerReadCheckStr = function( oStringClass, sMember )
	{
	if ( IsInEffectiveUserMode() )
		{
		if ( CanDoReadOnEffectiveUser() )
			return !isEmptyString( oStringClass.Manager[sMember] );
		}
	else // Student
		{
		return !isEmptyString( oStringClass[sMember] );
		}

	return false;
	}

LCIsEnabledClass.prototype.DoManagerWriteCheck = function( oStringClass, bMember )
	{
	if ( IsInEffectiveUserMode() )
		{
		if ( CanDoWriteOnEffectiveUser() )
			return oStringClass.Manager[bMember];
		}
	else // Student
		{
		return oStringClass[bMember]
		}

	return false;
	}

// Ultimately, I'd like to get rid of the "empty string checking" and have boolean
// member variables for all y/n settings.
LCIsEnabledClass.prototype.DoManagerWriteCheckStr = function( oStringClass, sMember )
	{
	if ( IsInEffectiveUserMode() )
		{
		if ( CanDoWriteOnEffectiveUser() )
			return !isEmptyString( oStringClass.Manager[sMember] );
		}
	else // Student
		{
		return !isEmptyString( oStringClass[sMember] );
		}

	return false;
	}

LCIsEnabledClass.prototype.OnlineContentLaunch = function()
	{
	return this.DoManagerModeCheck();
	}

// Probably never need to check this client-side
LCIsEnabledClass.prototype.eCommerce = function()
	{
	return this.DoManagerModeCheck();
	}

LCIsEnabledClass.prototype.VirtualClassRoom = function()
	{
	return this.DoManagerModeCheck();
	}

LCIsEnabledClass.prototype.Chat = function()
	{
	if ( isEmptyString(scMainMenu.sMainMenuChatrooms) )
		return false;

	return this.DoManagerModeCheck();
	}

LCIsEnabledClass.prototype.CurriculumAssign = function( scCatalog )
	{
	return this.DoManagerWriteCheck( scCatalog, 'bAllowAssign' );
	}

// 360 Assessment-specific checks:
LCIsEnabledClass.prototype.S360AllowCreate = function( scSkills360 )
	{
	return this.DoManagerWriteCheck( scSkills360, 'bAllowCreate' );
	}

LCIsEnabledClass.prototype.S360AllowEdit = function( scSkills360 )
	{
	return this.DoManagerWriteCheck( scSkills360, 'bAllowEdit' );
	}

LCIsEnabledClass.prototype.S360AllowView = function( scSkills360 )
	{
	return this.DoManagerWriteCheck( scSkills360, 'bAllowView' );
	}

LCIsEnabledClass.prototype.S360AllowStart = function( scSkills360 )
	{
	return this.DoManagerWriteCheck( scSkills360, 'bAllowStart' );
	}

LCIsEnabledClass.prototype.S360AllowEditAssessors = function( scSkills360 )
	{
	return this.DoManagerWriteCheck( scSkills360, 'bAllowEditAssessors' );
	}

LCIsEnabledClass.prototype.S360AllowEditSkills = function( scSkills360 )
	{
	return this.DoManagerWriteCheck( scSkills360, 'bAllowEditSkills' );
	}

LCIsEnabledClass.prototype.S360AllowEdit360NameAfterStart = function( scSkills360 )
	{
	return this.DoManagerWriteCheck( scSkills360, 'bAllowEdit360NameAfterStart' );
	}

LCIsEnabledClass.prototype.S360AllowEdit360DueAfterStart = function( scSkills360 )
	{
	return this.DoManagerWriteCheck( scSkills360, 'bAllowEdit360DueAfterStart' );
	}

LCIsEnabledClass.prototype.S360AllowEdit360AssessorsAfterStart = function( scSkills360 )
	{
	return this.DoManagerWriteCheck( scSkills360, 'bAllowEdit360AssesorsAfterStart' );
	}

LCIsEnabledClass.prototype.S360AllowEdit360NameAfterDue = function( scSkills360 )
	{
	return this.DoManagerWriteCheck( scSkills360, 'bAllowEdit360NameAfterDue' );
	}

LCIsEnabledClass.prototype.S360AllowEdit360DueAfterDue = function( scSkills360 )
	{
	return this.DoManagerWriteCheck( scSkills360, 'bAllowEdit360DueAfterDue' );
	}

LCIsEnabledClass.prototype.S360AllowEdit360AssessorsAfterDue = function( scSkills360 )
	{
	return this.DoManagerWriteCheck( scSkills360, 'bAllowEdit360AssesorsAfterDue' );
	}

LCIsEnabledClass.prototype.S360ShowResponseDetail = function( scSkills360 )
	{
	return this.DoManagerReadCheck( scSkills360, 'bShowResponseDetail' );
	}

LCIsEnabledClass.prototype.S360ShowResponseNames = function( scSkills360 )
	{
	return this.DoManagerReadCheck( scSkills360, 'bShowResponseNames' );
	}

LCIsEnabledClass.prototype.S360ShowResponseProficiencies = function( scSkills360 )
	{
	return this.DoManagerReadCheck( scSkills360, 'bShowResponseProficiencies' );
	}

LCIsEnabledClass.prototype.S360ShowResponseComments = function( scSkills360 )
	{
	return this.DoManagerReadCheck( scSkills360, 'bShowResponseComments' );
	}

LCIsEnabledClass.prototype.S360AssessorSearch = function( scSkills360 )
	{
	return this.DoManagerReadCheckStr( scSkills360, 'sAssessorSearch' );
	}

LCIsEnabledClass.prototype.S360EmailAssessors = function( scSkills360 )
	{
	return this.DoManagerReadCheckStr( scSkills360, 'sEmailAssessors' );
	}


// Skills Plan
LCIsEnabledClass.prototype.SkillsPlanAddSkillToPlan = function( scSkillsPlan )
	{
	return this.DoManagerWriteCheckStr( scSkillsPlan, 'sAddSkillToPlan' );
	}

LCIsEnabledClass.prototype.SkillsPlanAllowEdit = function( scSkillsPlan )
	{
	return this.DoManagerWriteCheck( scSkillsPlan, 'bAllowEdit' );
	}

LCIsEnabledClass.prototype.SkillsPlanAllowDelete = function( scSkillsPlan )
	{
	return this.DoManagerWriteCheck( scSkillsPlan, 'bAllowDelete' );
	}

LCIsEnabledClass.prototype.SkillsPlanAllowEditAdmin = function( scSkillsPlan )
	{
	// Manager needs only "Allow Edit" privileges to edit admin records
	if ( IsInEffectiveUserMode() )
		return this.DoManagerWriteCheck( scSkillsPlan, 'bAllowEdit' );
	else
		return this.DoManagerWriteCheck( scSkillsPlan, 'bAllowEditAdmin' );
	}

LCIsEnabledClass.prototype.SkillsPlanAllowDeleteAdmin = function( scSkillsPlan )
	{
	// Manager needs only "Allow Delete" privileges to delete admin records
	if ( IsInEffectiveUserMode() )
		return this.DoManagerWriteCheck( scSkillsPlan, 'bAllowDelete' );
	else
		return this.DoManagerWriteCheck( scSkillsPlan, 'bAllowDeleteAdmin' );
	}

// Training Plan
LCIsEnabledClass.prototype.TrainingPlanAddCourseToPlan = function( scPlan )
	{
	return this.DoManagerWriteCheckStr( scPlan, 'sAddCourseToPlan' );
	}

LCIsEnabledClass.prototype.TrainingPlanAllowEdit = function( scPlan )
	{
	return this.DoManagerWriteCheck( scPlan, 'bAllowEdit' );
	}

LCIsEnabledClass.prototype.TrainingPlanAllowDelete = function( scPlan )
	{
	return this.DoManagerWriteCheck( scPlan, 'bAllowDelete' );
	}

LCIsEnabledClass.prototype.TrainingPlanAllowEditAdmin = function( scPlan )
	{
	// A manager only needs "Allow Edit" privileges to edit "admin" records.
	if ( IsInEffectiveUserMode() )
		return this.DoManagerWriteCheck( scPlan, 'bAllowEdit' );
	else
		return this.DoManagerWriteCheck( scPlan, 'bAllowEditAdmin' );
	}

LCIsEnabledClass.prototype.TrainingPlanAllowDeleteAdmin = function( scPlan )
	{
	// A manager only needs "Allow Delete" privileges to delete "admin" records.
	if ( IsInEffectiveUserMode() )
		return this.DoManagerWriteCheck( scPlan, 'bAllowDelete' );
	else
		return this.DoManagerWriteCheck( scPlan, 'bAllowDeleteAdmin' );
	}

// Plan note editing - either scPlan or scSkillsPlan can be passed for planStrings
LCIsEnabledClass.prototype.PlanNoteAllowEdit = function( planStrings )
	{
	return this.DoManagerWriteCheck( planStrings, 'bAllowEdit' );
	}

LCIsEnabledClass.prototype.PlanNoteAllowDelete = function( planStrings )
	{
	return this.DoManagerWriteCheck( planStrings, 'bAllowDelete' );
	}

// Person Data process
LCIsEnabledClass.prototype.PersonDataAllowEdit = function( scPersonData )
	{
	return this.DoManagerWriteCheck( scPersonData, 'bAllowEdit' );
	}

LCIsEnabledClass.prototype.PersonDataGroupRegistration = function( scPersonData )
	{
	return this.DoManagerWriteCheckStr( scPersonData, 'sGroupRegistration' );
	}

// Profile Compare Process
LCIsEnabledClass.prototype.ProfileCompareAddProfileToPlan = function( scProfileCompare )
	{
	return this.DoManagerWriteCheckStr( scProfileCompare, 'sAddProfileToPlan' );
	}
