/*!
**********************************************************************
@file readyToModify.js

Copyright 2003-2006 Adobe Systems Incorporated.                     
All Rights Reserved.                                                
                                                                    
NOTICE: All information contained herein is the property of Adobe   
Systems Incorporated.                                                                                                                    

***********************************************************************
*/

/**
Implement a Wizard Page in three easy steps:

 1. Subclass WizardPage
 2. Extend with page-specific method overrides
 3. Return the WizardPage subclass name

*/

/***********************************************************************
1. Subclass WizardPage
*/
function readyToModify_wp(inController)
{
	this.SetController(inController);
}

readyToModify_wp.prototype = new WizardPage("readyToModify");

/***********************************************************************
2. Extend/override with page-specific logic
*/

readyToModify_wp.prototype.GetDisplayName = function()
{
	return this.localization.GetString("locNavTitle", "Summary");
}


readyToModify_wp.prototype.onResourcesLoaded = function()
{
	this.instructionText = new AdobeProperty();
	this.titleText = new AdobeProperty();

	var instructionElement = this.getElementById("locPageInstructions");
	if (instructionElement)
		this.instructionText.Bind(instructionElement);

	var titleElement = this.getElementById("locPageTitle");
	if (titleElement)
		this.titleText.Bind(titleElement);
	
	this.contentBox = this.getElementById("readyToModifyContainer");
}


readyToModify_wp.prototype.onShow = function()
{
	this.setWindowTitle();
	this.wizardControl.session.UISetCloseBoxEnabled(1);	
	
	// Setup the basic page titles, text and buttons.
	RemoveAllChildren(this.contentBox);
	var nextText = "";
	var nextAccessKey = "";
	switch (this.wizardControl.setupMode)
	{
		case kInstallerModeRemove:
			nextText = this.localization.GetString("locNextButtonRemove", "Uninstall");
			//this.instructionText.Set(this.localization.GetString("locPageInstructionsRemove", "", { Next: nextText }));
			this.instructionText.Set("");
			this.titleText.Set(this.localization.GetString("locPageTitleRemove", "Summary of Changes"));
			nextAccessKey = "u";
			break;
		case kInstallerModeModify:
			nextText = this.localization.GetString("locNextButtonModify", "Modify");
			//this.instructionText.Set(this.localization.GetString("locPageInstructionsModify", "", { Next: nextText }));
			this.instructionText.Set("");
			this.titleText.Set(this.localization.GetString("locPageTitleModify", "Summary of Changes"));
			nextAccessKey = "m";
			break;
		default:
			nextText = this.localization.GetString("locNextButtonInstall", "Install");
			this.instructionText.Set(this.localization.GetString("locPageInstructionsInstall", "", { Next: nextText }));
			this.titleText.Set(this.localization.GetString("locPageTitleInstall", "Installation Summary"));
			nextAccessKey = "i";
			break;
	}
	if (this.wizardControl.session.IsRecordMode())
	{
		this.wizardControl.nextButton.SetLabel("[record] " + nextText);
	}
	else
	{
		this.wizardControl.nextButton.SetLabel(nextText);
	}
	this.wizardControl.nextButton.SetAccessKey(nextAccessKey);
	
	this.wizardControl.nextButton.SetTabIndex(103);
	this.wizardControl.backButton.SetTabIndex(102);
	this.wizardControl.quitButton.SetTabIndex(101);	
	
	this.wizardControl.nextButton.button.focus();
	this.wizardControl.SetFocus(this.wizardControl.nextButton.button);
	
	// For install, show the install location and language
	if (this.wizardControl.setupMode == kInstallerModeInstall)
	{
		this.AddTitle(this.localization.GetString("locInstallLocation", "Install Location"));
		this.AppendTextElement("p", this.wizardControl.session.properties["INSTALLDIR"]);
		this.AddTitle(this.localization.GetString("locInstallLanguage", "Application Language"));
		this.AppendTextElement("p", this.wizardControl.session.localization.GetStringForLanguage("isoToLanguage", this.wizardControl.session.properties["installLanguage"]));
	}
	
	// Show the payload operations
	var allPayloads = this.GetPayloadList();
	allPayloads.install.label = this.localization.GetString("locInstallingPayloads", "The following components will be installed");
	if (this.wizardControl.setupMode == kInstallerModeInstall) // UICOMPLIANCE
	{
		allPayloads.install.label = null;
	}
	allPayloads.repair.label = this.localization.GetString("locRepairingPayloads", "The following components will be reinstalled");
	allPayloads.remove.label = this.localization.GetString("locRemovingPayloads", "The following components will be removed");

	for (var payloadSet in allPayloads)
	{
		var set = allPayloads[payloadSet];
		if (set.visibleList.length > 0 || set.hiddenList.length > 0)
		{
			if (set.label)
				this.AddTitle(set.label);
			var listElement = this.AppendTextElement("ul", "");
			listElement.className = "alertSuccess"

			for (var i = 0; i < set.visibleList.length; i++)
			{
				var li = this.AppendTextElement("li", set.visibleList[i].payloadName, listElement);
				li.className = "productName";
				if (set.visibleList[i].payloadNote)
				{
					var span = this.AppendTextElement("span", "(" + set.visibleList[i].payloadNote.Translate(this.wizardControl.session.localization) + ")", li);
					span.className = "payloadNote";
				}
			}

			// UICOMPLIANCE - doesn't show shared components
			if (set.hiddenList.length > 0)
			{
				var li = this.AppendTextElement("li", this.wizardControl.session.localization.GetString("locHiddenPayloadsUC"), listElement);
				li.className = "productName";
			}
		}
	}

	// For install, show disk space
	if (this.wizardControl.setupMode == kInstallerModeInstall)
	{
		this.AddTitle(this.localization.GetString("locInstallationDrives", "Installation Drives(s)"));
		var listElement = this.AppendTextElement("ul", "");
		listElement.className = "alertSuccess";
		var isRTL = false;
		
		var currentLang = getUserInterfaceLanguage(this.wizardControl.session);
				
		if (null != currentLang)
			isRTL = isLanguageRTL(currentLang);	

		var fixedVolumes = this.wizardControl.session.GetFixedDriveInfo();
		var sizes = _calculateRequiredSpace(this.wizardControl.session);

		for (var i = 0; i < fixedVolumes.length; i++)
		{
			var volume = fixedVolumes[i];
			if (sizes[volume.driveID])
			{
				volumeStats = this.wizardControl.session.GetVolumeStatisticsFromPath(volume.driveID);
				var li = this.AppendTextElement("li", this.localization.GetString("locSpaceUsage", "[Volume]: Space remaining after installation:", { Volume: (isRTL ? (volume.friendlyName.replace(/[(,),:]/g, '')) : volume.friendlyName) }), listElement)
				var span = this.AppendTextElement("span", bytesToText(volumeStats.freeSize - sizes[volume.driveID]), li);
				span.className = "componentSize";
			}

		}
	}
}


/**
Calculate what we need to show for the current session.
*/
readyToModify_wp.prototype.GetPayloadList = function(inAction, inVisible)
{
	var result = {
		install: {
			visibleList: [],
			hiddenList: []
		},
		repair: {
			visibleList: [],
			hiddenList: []
		},
		remove: {
			visibleList: [],
			hiddenList: []
		}
	}

	var session = this.wizardControl.session;

	// Get a proper UI sort
	var sessionPayloads = PayloadUISort(session.sessionPayloads, session);

	for (adobeCode in sessionPayloads)
	{
		var p = sessionPayloads[adobeCode];
		var uiInfo = p.GetUISelectionAction(session, this.wizardControl.setupMode);

		// Pick a list based on the action
		var list = null;
		switch (p.GetInstallerAction())
		{
			case kInstallerActionInstall:
				list = result.install;
				break;
			case kInstallerActionRemove:
				list = result.remove;
				break;
			case kInstallerActionRepair:
				list = result.repair;
		}

		if (list)
		{
			// Formulate the UI text
			var uitext = {
				payloadName: p.GetUIProductName(session),
				payloadNote: (ContainerNotEmpty(p.GetPayloadsToUpgradeFrom()) && p.GetInstallerAction() == kInstallerActionInstall) ? uiInfo.payloadNote : null
			}

			// Pick a sublist based on visibility and checked state.
			if (uiInfo.visible || p.IsDriverForSession(session))
			{
				if (uiInfo.checkedState)
				{
					list.visibleList.push(uitext);
				}
			}
			else
			{
				list.hiddenList.push(uitext);
			}
		}
	}

	return result;
}


readyToModify_wp.prototype.AddTitle = function(inTitle)
{
	return this.AppendTextElement("h4", inTitle + ":");
}


readyToModify_wp.prototype.AppendTextElement = function(inElementName, inText, inContainer)
{
	var container = this.contentBox;
	if (arguments.length == 3)
		container = inContainer

	if (container)
	{
		var e = document.createElement(inElementName);
		e.appendChild(document.createTextNode(inText));
		container.appendChild(e);
		return e;
	}
	return null;
}





/***********************************************************************
3. Last, and very important, return the name of the class.
*/
"readyToModify_wp";
