-- 这是聚光灯控制脚本，用lua 5.2.x语言编写。聚光灯介绍形式是枫传网络独创的软件介绍方式。通过将软件界面雾化为背景，并用聚光灯突显要介绍的部分，配合文字说明，对软件进行介绍。您可以按照提示修改此脚本。
-- 下面为文件信息，除CodePage外，其它项目请不要修改。
Application = "GTalkabout"
Version = "1.1"
ScriptType = "tutorial"
CodePage = 936	-- 简体中文，如果您将此脚本翻译为其他语种，请修改为该语种对应的代码页，否则，请不要修改。

-- 下面为介绍文字，是markdown格式文本。您可以将其翻译为其它语种或修改，请不要修改圆括号内的文字。
ProgBBS_text = [[
在极客网站讨论开源代码
===
讨论是通过在极客网站上收发普通消息，批注源代码的消息，以及带源代码补丁的消息实现的。  
这里说的**极客网站**专指可用极客讨论器做客户端，收发消息的网站，可以是博客，论坛，社区等等多种类型。  
我们用这个极客网站——[程序员记](http://www.progbbs.com)来举例，这是一个给程序员或业余编程爱好者提供的笔记类网站，它是用phpBB搭建的论坛型网站，和普通论坛的区别在于，它上面的帖子大多数是用极客讨论器创建的批注消息，既可以用浏览器阅读也可以用极客讨论器阅读，使用后者的话，这些消息可以成为源代码的注释、打开其它项目、在版本库中指出位置、或者指出修改、在函数地图中生成路标等等多种帮助您快速理解源代码的途径，以及提供查看源代码的例子、运行结果、找bug、修复bug等等功能。  

*仅开源项目才参与讨论，私有项目和商业项目因为代码不提供公共访问，不在这里提及的开放式讨论之列。*  
*为了提供良好的用户体验，程序员记上讨论的项目原则上都来自GitHub。*

请点击程序员记的Logo切换讨论平台……

[关闭向导](cancel_auto_load)
]]

GeekSite_text = [[
在极客网站讨论开源代码
===
现在选择了[程序员记](http://www.progbbs.com)作为讨论平台，这个网站为每个注册用户免费提供了一个版面，您可以以帖子的形式在您自己的版面保存您对开源代码的批注，也可以阅读别人的批注帖子，在他的版面里发帖或者回复。每个人都有自己版面的删帖权限。

在**新建配置**区域，有三种配置类型可供选择。因为在[程序员记](http://www.progbbs.com)里讨论的都是开源项目，因此请选择**第三方开源项目**……

*如果您是某开源项目的作者或者有提交权限，同样选择“第三方开源项目”，并取消版本库的“只读”设置即可。但是对于GitHub里的开源项目，并不建议您用极客讨论器作为提交代码的工具，毕竟它不是一个功能完备的git版本控制工具，建议您使用git的命令行工具，极客讨论器不会和其它任何版本控制工具相冲突。*

[关闭向导](cancel_auto_load)
]]

ServerConfig_text = [[
配置界面
===
当批注帖子发送到[程序员记](http://www.progbbs.com)网站时，它就自动包含了所批注的代码信息。您仅需知道这个帖子的ID即可下载代码。请将鼠标移到**资源ID**上查看详情。
]]

ServerResourceID1_text = [[
资源ID
===
资源由极客网站提供，用来指导极客讨论器进行配置，通俗点说就是正在讨论的项目，在哪里，和哪些人进行讨论。每一个资源都有ID，它可以是URL形式的，对应着极客网站上一个实际的页面，也可以是一种简化格式，去除了URL中不相干的部分，如协议，网站名等。  
不同类型的极客网站资源ID有不同的含义。[程序员记](http://www.progbbs.com)的资源ID有三种格式：  
f=n是第n个版面，表示某个注册用户、某个用户组或者某个项目的子论坛；  
t=n是第n个主题，一个主题下通常有若干个帖子，包括发起贴和回复贴；  
p=n是第n个帖子。  
这三种格式的资源ID在您浏览论坛版面或者帖子的时候，观察它的URL，会在里面找到。

有两种更简单的方式使用资源：  
1.用浏览器浏览[程序员记](http://www.progbbs.com)的帖子的时候，从浏览器的地址栏直接复制URL，将它粘贴到下方资源ID处，极客讨论器会自动抽取资源；  
2.[程序员记](http://www.progbbs.com)的每一个带有批注的帖子后面都有超链接，极客讨论器已经注册了网页启动的orca协议，点击可以启动极客讨论器并载入这个帖子的资源。  
![通过网页启动极客讨论器](url_open.png)

这里我们会用一个例子来说明，请输入<font color=#f00>f=3</font>，它表示[程序员记](http://www.progbbs.com)上的一个[演示项目](http://www.progbbs.com/viewforum.php?f=3)

[下一步](check_resource_id)
]]

ServerResourceID2_text = [[
资源ID
===
资源由极客网站提供，用来指导极客讨论器进行配置，通俗点说就是正在讨论的项目，在哪里，和哪些人进行讨论。每一个资源都有一个ID，它可以是URL形式的，对应着极客网站上一个实际的页面，也可以是一种简化格式，去除了URL中不相干的部分，如协议，网站名等。  
不同类型的极客网站资源ID有不同的含义。[程序员记](http://www.progbbs.com)的资源ID有三种格式：  
f=n是第n个版面，表示某个注册用户、某个用户组或者某个项目的子论坛；  
t=n是第n个主题，一个主题下通常有若干个帖子，包括发起贴和回复贴；  
p=n是第n个帖子。  
这三种格式的资源ID在您浏览论坛版面或者帖子的时候，观察它的URL，会在里面找到。

有两种更简单的方式使用资源：  
1.用浏览器浏览[程序员记](http://www.progbbs.com)的帖子的时候，从浏览器的地址栏直接复制URL，将它粘贴到下方资源ID处，极客讨论器会自动抽取资源；  
2.[程序员记](http://www.progbbs.com)的每一个带有批注的帖子后面都有超链接，[注册网页启动的orca协议](register)（需要访问注册表）之后，点击可以启动极客讨论器并载入这个帖子的资源。  
![通过网页启动极客讨论器](url_open.png)

这里我们会用一个例子来说明，请输入<font color=#f00>f=3</font>，它表示[程序员记](http://www.progbbs.com)上的一个[演示项目](http://www.progbbs.com/viewforum.php?f=3)

[下一步](check_resource_id)
]]

ServerResourceID3_text = [[
资源ID
===
资源由极客网站提供，用来指导极客讨论器进行配置，通俗点说就是正在讨论的项目，在哪里，和哪些人进行讨论。每一个资源都有一个ID，它可以是URL形式的，对应着极客网站上一个实际的页面，也可以是一种简化格式，去除了URL中不相干的部分，如协议，网站名等。  
不同类型的极客网站资源ID有不同的含义。[程序员记](http://www.progbbs.com)的资源ID有三种格式：  
f=n是第n个版面，表示某个注册用户、某个用户组或者某个项目的子论坛；  
t=n是第n个主题，一个主题下通常有若干个帖子，包括发起贴和回复贴；  
p=n是第n个帖子。  
这三种格式的资源ID在您浏览论坛版面或者帖子的时候，观察它的URL，会在里面找到。

有两种更简单的方式使用资源：  
1.用浏览器浏览[程序员记](http://www.progbbs.com)的帖子的时候，从浏览器的地址栏直接复制URL，将它粘贴到下方资源ID处，极客讨论器会自动抽取资源；  
2.[程序员记](http://www.progbbs.com)的每一个带有批注的帖子后面都有超链接，将极客讨论器所在目录下的orca.reg导入注册表（需要管理员权限）之后，点击可以启动极客讨论器并载入这个帖子的资源。  
![通过网页启动极客讨论器](url_open.png)

这里我们会用一个例子来说明，请输入<font color=#f00>f=3</font>，它表示[程序员记](http://www.progbbs.com)上的一个[演示项目](http://www.progbbs.com/viewforum.php?f=3)

[下一步](check_resource_id)
]]

ServerResourceID_Error_text = [[
资源ID
===
请输入<font color=#f00>f=3</font>。

[下一步](check_resource_id)
]]

ServerResourceID_Success_text = [[
项目信息
===
<font color=#f00>现在就可以开始讨论了！</font>资源已经为您将所需的配置都设置好了。

您可以直接点击**确定**开始讨论项目，也可以先点击**获取信息**按钮检查刚输入的资源ID是否配置有正确的版本库。

缺省配置下，极客讨论器会将版本库的最新代码下载到本地，您可以指定一个[本地目录](other_config)接收下载。如果您不指定会使用默认目录。
]]

ServerResourceInformation_Loading_text = [[
项目信息
===
正在载入项目的版本库信息，讨论版面...
]]

ServerResourceInformation_Loaded_Error_text = [[
项目信息
===
载入项目信息失败，请重试。如果多次失败，则有可能：

1.无法连接到[程序员记](http://www.progbbs.com)，请先[用浏览器打开](http://www.progbbs.com)，如果可以打开网站，请检查防火墙设置  
2.资源ID错误，输入了无效的资源ID，请[重新输入](check_resource_id)

[关闭向导](cancel_auto_load)
]]

ServerResourceInformation_Loaded_Success_text = [[
项目信息
===
<font color=#f00>成功载入项目信息！</font>

1.在项目信息面板中可以看到，**Source**后面的是项目版本库。将要讨论的源代码就存储在里面。  
2.**Type**是版本库的类型，目前支持subversion/git类型版本库。  
3.**Username**是这个版本库的只读用户名。对于开源项目来说，版本库的只读用户名和密码是公开的，您可以用这个用户名和密码读取里面的源代码。如果**Username**为空表示这个版本库的只读访问无需用户名密码。

缺省配置下，极客讨论器会将版本库的最新代码下载到本地，您可以指定一个[本地目录](other_config)接收下载。如果您不指定会使用默认目录。

配置完成，点击**确定**开始讨论，建议您先**另存为**一个配置文件，以便下次使用。
]]

OtherConfig_text = [[
本地配置
===
即将为您下载版本库内最新代码，您可以指定工作区，也就是保存代码的目录，请在配置类别中选择**本地**
]]

LocalWorkPath_text = [[
选择工作区
===
请在工作区路径中输入一个有效的本地目录，可以是不存在的目录，如果已存在必须为空目录

[下一步](check_workpath)
]]

LocalWorkPath_Error_text = [[
选择工作区
===
无法创建%s，请在工作区路径中输入一个有效的本地目录

[下一步](check_workpath)
]]

Apply_text = [[
进入讨论界面
===
配置完成，点击**确定**开始讨论，建议您先**另存为**一个配置文件，以便下次使用。
]]

GTalkabout_LogGray_text = [[
下载代码
===
正在将版本库的代码检出到本地。以便您对源代码进行编译，调试，修改等。  
如果您不需要将源代码下载到本地而直接在线讨论，可以在**本地**配置页中取消**使用工作区**的选项。
]]

GTalkabout_Ungray_text = [[
讨论面板介绍
===
右边就是[程序员记](http://www.progbbs.com)的讨论面板，它是一个帖子浏览器。  
它的上方是收帖区，可以浏览一个帖和它的所有回复。  
在![下拉输入框](phpbb_topic_combobox.bmp)中输入一个资源ID，如主题<font color=#f00>t=n</font>或者帖子<font color=#f00>p=n</font>并回车，即可显示此帖和所有回复。  
通过![惊叹号按钮](phpbb_recall_toolbutton_pushed.bmp)切换源代码文档显示模式。  
![红底白叹号](phpbb_recall_toolbutton_pushed.bmp)：回忆模式，源代码会回忆所有批注帖子，可以像看注释一样看帖子。  
![白底红叹号](phpbb_recall_toolbutton.bmp)：普通模式，可以编辑或者比较源代码。

**我们用一个例子来说明讨论帖怎么样讨论源代码：**  
请输入<font color=#f00>t=3</font>并回车，它是一个普通的[帖子](http://www.progbbs.com/viewtopic.php?t=3)，当您用浏览器打开，和其它论坛上的帖子并无不同。  
而在收帖区载入此帖和它的所有回复后，关闭此向导后，查看源代码时就增加了一组解释消息。  
同样的方式可以查看[程序员记](http://www.progbbs.com)上所有讨论帖。

帖子浏览器下方是发帖区。  
[程序员记](http://www.progbbs.com)要求注册用户才能发帖，您可以先[注册用户](http://www.progbbs.com/ucp.php?mode=register)后并返回配置界面在服务器配置页输入用户信息。  
发帖区上小的输入框可以输入帖子的标题，只能输入文字。默认会将讨论位置作为标题。  
大的输入框输入帖子的正文。可以包含文字，图片等。  
按下发帖区的![钉子按钮](phpbb_link_toolbutton.bmp)可以将帖子和选中源代码位置关联，生成一个批注帖。  
按下![胶布按钮](phpbb_patch_toolbutton.bmp)可以将源代码位置包含的修改代码加入帖子中，生成一个补丁帖。  
**记录**和**发帖**按钮，分别用于将编辑好的消息记录在本地数据库中或者作为帖子发送。  
*发帖按钮在浏览帖的时候是回复正在浏览的帖，如果需要发新帖请在收帖区的下拉输入框中选择[新帖]。*

[关闭向导](cancel_auto_load)
]]

-- 下面为聚光灯流程控制，请不要修改！
function ControlValueIterator(ControlTable)
	local iIndex = 0

	return function()
		iIndex = iIndex + 1;
		local ControlValue = ControlTable[iIndex];

		if type(ControlValue) == "string" then
			return ControlValue, "";
		elseif type(ControlValue) == "table" then
			local Control, Value = ControlValue[1], ControlValue[2];

			if type(Control) == "string" then
				if type(Value) == "string" then
					return Control, Value;
				else
					return Control, "";
				end
			else
				return nil;
			end
		else
			return nil;
		end
	end
end

function ChangeSpotlights_config(Iter, ControlTable)
	local Control, Value = Iter();

	if Control == "category_tree" and string.sub(Value, 1, 5) == "local" then
		return { {"config_tab", 0}, {"local_workpath", 0} }, LocalWorkPath_text;
	end
	for Control, Value in Iter do
		if Control == "other_config" then
			return ChangeSpotlights_other_config(Iter, ControlTable);
		end
	end
	return { {"category_tree", 0}, {"config_tab", 0}, {"server_resource_id", 0} }, ServerConfig_text;
end

function ChangeSpotlights_server_resource_information_loading(Iter, ControlTable)
	return {}, ServerResourceInformation_Loading_text;
end

function ChangeSpotlights_server_resource_information_error_loaded(Iter, ControlTable)
	return { {"server_resource", 1}, {"server_resource_info", 0} }, ServerResourceInformation_Loaded_Error_text;
end

function ChangeSpotlights_server_resource_information_success_loaded(Iter, ControlTable)
	return { {"save_as", 1}, {"apply", 1}, {"server_resource_info", 0} }, ServerResourceInformation_Loaded_Success_text;
end

function ChangeSpotlights_server_resource_id(Iter, ControlTable)
	if CheckURLProtocolInstalled() then
		return { {"server_resource_id", 2} }, ServerResourceID1_text;
	end
	return { {"server_resource_id", 2} }, ServerResourceID2_text;
end

function ChangeSpotlights_check_resource_id(Iter, ControlTable)
	local Control, Value = Iter();

	if Control == "server_resource_id" then
		if string.match(Value, "f=%d+") == Value then
			return { {"server_resource", 1}, {"apply", 1} }, ServerResourceID_Success_text;
		else
			return { {"server_resource_id", 2} }, ServerResourceID_Error_text;
		end
	end
	return { {"server_resource_id", 2} }, ServerResourceID_text;
end

function ChangeSpotlights_other_config(Iter, ControlTable)
	return { {"category_tree", 1} }, OtherConfig_text;
end

function ChangeSpotlights_local_workpath(Iter, ControlTable)
	return { {"local_workpath", 2} }, LocalWorkPath_text;
end

function ChangeSpotlights_check_workpath(Iter, ControlTable)
	local Control, Value = Iter();

	if Control == "local_workpath" then
		if CreateDirectory(Value) then
			return { {"category_tree", 0}, {"config_tab", 0}, {"save_as", 1}, {"apply", 1} }, Apply_text;
		else
			local Text = string.format(LocalWorkPath_Error_text, Value);

			return { {"local_workpath", 2} }, Text;
		end
	end
	return { {"local_workpath", 2} }, LocalWorkPath_text;
end

function ChangeSpotlights_gtalkabout_ungray(Iter, ControlTable)
	return { {"im_tab", 1} }, GTalkabout_Ungray_text;
end

function ChangeSpotlights_gtalkabout_log_gray(Iter, ControlTable)
	return { {"log_gray", 1} }, GTalkabout_LogGray_text;
end

function ChangeSpotlights(ControlTable)
	local Iter = ControlValueIterator(ControlTable);
	local Control, Value = Iter();

	if Control == "index" then
		return { {"certificate", 1} }, ProgBBS_text;
	elseif Control == "certificate" then
		if string.sub(Value, 1, 15) == "www.progbbs.com" then
			return { {"certificate", 1}, {"new_config", 0}, {"open_source", 1} }, GeekSite_text;
		else
			return { {"certificate", 1} }, ProgBBS_text;
		end
	elseif Control == "register" then
		if InstallURLProtocol() then
			return { {"server_resource_id", 2} }, ServerResourceID1_text;
		end
		return { {"server_resource_id", 2} }, ServerResourceID3_text;
	elseif Control == "config" then
		return ChangeSpotlights_config(Iter, ControlTable);
	elseif Control == "server_resource_id" then
		return ChangeSpotlights_server_resource_id(Iter, ControlTable);
	elseif Control == "check_resource_id" then
		return ChangeSpotlights_check_resource_id(Iter, ControlTable);
	elseif Control == "server_resource_info" then
		if Value == "loading" then
			return ChangeSpotlights_server_resource_information_loading(Iter, ControlTable);
		elseif string.sub(Value, 1, 7) == "Source:" then
			return ChangeSpotlights_server_resource_information_success_loaded(Iter, ControlTable);
		else
			return ChangeSpotlights_server_resource_information_error_loaded(Iter, ControlTable);
		end
	elseif Control == "other_config" then
		return ChangeSpotlights_other_config(Iter, ControlTable);
	elseif Control == "local_workpath" then
		return ChangeSpotlights_local_workpath(Iter, ControlTable);
	elseif Control == "check_workpath" then
		return ChangeSpotlights_check_workpath(Iter, ControlTable);
	elseif Control == "gray" and Value == "error" then
		return {}, "";
	elseif (Control == "gray" and Value == "false") or (Control == "return") then
		return ChangeSpotlights_gtalkabout_ungray(Iter, ControlTable);
	elseif Control == "gray" or Control == "log_gray" then
		return ChangeSpotlights_gtalkabout_log_gray(Iter, ControlTable);
	elseif Control == "close" or Control == "cancel_auto_load" then
		return {}, "";
	end
end

AutoLoad = 0